Skip to content

Commit d63f692

Browse files
committed
Only add instance custom data for feature IDs that are used.
1 parent c314291 commit d63f692

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

Source/CesiumRuntime/Private/CesiumGltfComponent.cpp

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2890,34 +2890,59 @@ PRAGMA_ENABLE_DEPRECATION_WARNINGS
28902890
#pragma endregion
28912891

28922892
namespace {
2893-
void addInstanceFeatureIds(UCesiumGltfInstancedComponent* pInstancedComponent) {
2893+
void addInstanceFeatureIds(
2894+
UCesiumGltfInstancedComponent* pInstancedComponent,
2895+
const FCesiumFeaturesMetadataDescription& featuresDescription) {
28942896
const TSharedPtr<FCesiumPrimitiveFeatures>& pInstanceFeatures =
28952897
pInstancedComponent->pInstanceFeatures;
28962898
if (!pInstanceFeatures) {
28972899
return;
28982900
}
2899-
const TArray<FCesiumFeatureIdSet>& featureIdSets =
2901+
const TArray<FCesiumFeatureIdSet>& allFeatureIdSets =
29002902
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSets(
29012903
*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();
29032930
if (featureSetCount == 0) {
29042931
return;
29052932
}
2906-
#if ENGINE_VERSION_5_3_OR_HIGHER
29072933
pInstancedComponent->SetNumCustomDataFloats(featureSetCount);
2908-
#else
2909-
pInstancedComponent->NumCustomDataFloats = featureSetCount;
2910-
#endif
29112934
int32 numInstances = pInstancedComponent->GetInstanceCount();
29122935
pInstancedComponent->PerInstanceSMCustomData.SetNum(
29132936
featureSetCount * numInstances);
29142937
for (int32 j = 0; j < featureSetCount; ++j) {
2938+
int64_t setIndex = activeFeatureIdSets[j];
2939+
29152940
for (int32 i = 0; i < numInstances; ++i) {
29162941
int64 featureId =
29172942
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDFromInstance(
29182943
*pInstanceFeatures,
29192944
i,
2920-
j);
2945+
setIndex);
29212946
pInstancedComponent
29222947
->SetCustomDataValue(i, j, static_cast<float>(featureId), true);
29232948
}
@@ -2968,7 +2993,14 @@ static void loadPrimitiveGameThreadPart(
29682993
pInstancedComponent->AddInstance(transform, false);
29692994
}
29702995
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+
29723004
pCesiumPrimitive = pInstancedComponent;
29733005
} else {
29743006
auto* pComponent =

Source/CesiumRuntime/Public/Cesium3DTileset.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,6 +1114,11 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {
11141114
return this->_pTileset.Get();
11151115
}
11161116

1117+
const std::optional<FCesiumFeaturesMetadataDescription>&
1118+
getFeaturesMetadataDescription() const {
1119+
return this->_featuresMetadataDescription;
1120+
}
1121+
11171122
// AActor overrides (some or most of them should be protected)
11181123
virtual bool ShouldTickIfViewportsOnly() const override;
11191124
virtual void Tick(float DeltaTime) override;

0 commit comments

Comments
 (0)