@@ -2890,34 +2890,59 @@ PRAGMA_ENABLE_DEPRECATION_WARNINGS
2890
2890
#pragma endregion
2891
2891
2892
2892
namespace {
2893
- void addInstanceFeatureIds (UCesiumGltfInstancedComponent* pInstancedComponent) {
2893
+ void addInstanceFeatureIds (
2894
+ UCesiumGltfInstancedComponent* pInstancedComponent,
2895
+ const FCesiumFeaturesMetadataDescription& featuresDescription) {
2894
2896
const TSharedPtr<FCesiumPrimitiveFeatures>& pInstanceFeatures =
2895
2897
pInstancedComponent->pInstanceFeatures ;
2896
2898
if (!pInstanceFeatures) {
2897
2899
return ;
2898
2900
}
2899
- const TArray<FCesiumFeatureIdSet>& featureIdSets =
2901
+ const TArray<FCesiumFeatureIdSet>& allFeatureIdSets =
2900
2902
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSets (
2901
2903
*pInstanceFeatures);
2902
- int32 featureSetCount = featureIdSets.Num ();
2904
+
2905
+ const TArray<FCesiumFeatureIdSetDescription>& featureIDSetDescriptions =
2906
+ featuresDescription.Features .FeatureIdSets ;
2907
+
2908
+ int32_t featureIdTextureCounter = 0 ;
2909
+
2910
+ TArray<int32> activeFeatureIdSets;
2911
+
2912
+ for (int32 i = 0 ; i < allFeatureIdSets.Num (); ++i) {
2913
+ FString name = CesiumEncodedFeaturesMetadata::getNameForFeatureIDSet (
2914
+ allFeatureIdSets[i],
2915
+ featureIdTextureCounter);
2916
+
2917
+ const FCesiumFeatureIdSetDescription* pDescription =
2918
+ featureIDSetDescriptions.FindByPredicate (
2919
+ [&name](
2920
+ const FCesiumFeatureIdSetDescription& existingFeatureIDSet) {
2921
+ return existingFeatureIDSet.Name == name;
2922
+ });
2923
+
2924
+ if (pDescription) {
2925
+ activeFeatureIdSets.Emplace (i);
2926
+ }
2927
+ }
2928
+
2929
+ int32 featureSetCount = activeFeatureIdSets.Num ();
2903
2930
if (featureSetCount == 0 ) {
2904
2931
return ;
2905
2932
}
2906
- #if ENGINE_VERSION_5_3_OR_HIGHER
2907
2933
pInstancedComponent->SetNumCustomDataFloats (featureSetCount);
2908
- #else
2909
- pInstancedComponent->NumCustomDataFloats = featureSetCount;
2910
- #endif
2911
2934
int32 numInstances = pInstancedComponent->GetInstanceCount ();
2912
2935
pInstancedComponent->PerInstanceSMCustomData .SetNum (
2913
2936
featureSetCount * numInstances);
2914
2937
for (int32 j = 0 ; j < featureSetCount; ++j) {
2938
+ int64_t setIndex = activeFeatureIdSets[j];
2939
+
2915
2940
for (int32 i = 0 ; i < numInstances; ++i) {
2916
2941
int64 featureId =
2917
2942
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDFromInstance (
2918
2943
*pInstanceFeatures,
2919
2944
i,
2920
- j );
2945
+ setIndex );
2921
2946
pInstancedComponent
2922
2947
->SetCustomDataValue (i, j, static_cast <float >(featureId), true );
2923
2948
}
@@ -2968,7 +2993,14 @@ static void loadPrimitiveGameThreadPart(
2968
2993
pInstancedComponent->AddInstance (transform, false );
2969
2994
}
2970
2995
pInstancedComponent->pInstanceFeatures = pInstanceFeatures;
2971
- addInstanceFeatureIds (pInstancedComponent);
2996
+
2997
+ const std::optional<FCesiumFeaturesMetadataDescription>&
2998
+ maybeFeaturesDescription =
2999
+ pTilesetActor->getFeaturesMetadataDescription ();
3000
+ if (maybeFeaturesDescription) {
3001
+ addInstanceFeatureIds (pInstancedComponent, *maybeFeaturesDescription);
3002
+ }
3003
+
2972
3004
pCesiumPrimitive = pInstancedComponent;
2973
3005
} else {
2974
3006
auto * pComponent =
0 commit comments