From b9141fd62f58c0e50b614ddc4154f19d04c61d8c Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Mon, 10 Nov 2025 13:52:48 -0500 Subject: [PATCH 1/3] Check for instanced features + various typo fixes --- CHANGES.md | 6 ++ .../Private/CesiumPrimitiveFeatures.cpp | 12 +++- .../Tests/CesiumPrimitiveFeatures.spec.cpp | 55 +++++++++++++++++++ .../Public/CesiumPrimitiveFeatures.h | 8 +-- 4 files changed, 74 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d8b65db4c..181ae14ac 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # Change Log {#changes} +### ? - ? + +##### Fixes :wrench: + +- Fixed a bug that prevented `UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures` from retrieving the features of instanced meshes. + ### v2.21.0 - 2025-11-03 ##### Additions :tada: diff --git a/Source/CesiumRuntime/Private/CesiumPrimitiveFeatures.cpp b/Source/CesiumRuntime/Private/CesiumPrimitiveFeatures.cpp index 0abb7a933..c65f5d97e 100644 --- a/Source/CesiumRuntime/Private/CesiumPrimitiveFeatures.cpp +++ b/Source/CesiumRuntime/Private/CesiumPrimitiveFeatures.cpp @@ -44,13 +44,19 @@ FCesiumPrimitiveFeatures::FCesiumPrimitiveFeatures( const FCesiumPrimitiveFeatures& UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures( const UPrimitiveComponent* component) { + const UCesiumGltfInstancedComponent* pGltfInstancedComponent = + Cast(component); + if (IsValid(pGltfInstancedComponent)) { + return pGltfInstancedComponent->getPrimitiveData().Features; + } + const UCesiumGltfPrimitiveComponent* pGltfComponent = Cast(component); - if (!IsValid(pGltfComponent)) { - return EmptyPrimitiveFeatures; + if (IsValid(pGltfComponent)) { + return pGltfComponent->getPrimitiveData().Features; } - return pGltfComponent->getPrimitiveData().Features; + return EmptyPrimitiveFeatures; } const TArray& diff --git a/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp b/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp index 7dd21d9f1..0cdf2e944 100644 --- a/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp +++ b/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp @@ -1,7 +1,9 @@ // Copyright 2020-2024 CesiumGS, Inc. and Contributors #include "CesiumPrimitiveFeatures.h" +#include "CesiumGltf/ExtensionExtInstanceFeatures.h" #include "CesiumGltf/ExtensionExtMeshFeatures.h" +#include "CesiumGltfPrimitiveComponent.h" #include "CesiumGltfSpecUtility.h" #include "Misc/AutomationTest.h" @@ -116,6 +118,59 @@ void FCesiumPrimitiveFeaturesSpec::Define() { }); }); + Describe("GetPrimitiveFeatures", [this]() { + It("returns for instanced glTF component", [this]() { + model = CesiumGltf::Model(); + model.meshes.emplace_back(); + CesiumGltf::Node& node = model.nodes.emplace_back(); + node.mesh = 0; + + CesiumGltf::ExtensionExtInstanceFeatures& instanceFeatures = + node.addExtension(); + CesiumGltf::ExtensionExtInstanceFeaturesFeatureId& featureId = + instanceFeatures.featureIds.emplace_back(); + featureId.featureCount = 10; + + UCesiumGltfInstancedComponent* pComponent = + NewObject(); + pComponent->getPrimitiveData().Features = + FCesiumPrimitiveFeatures(model, node, instanceFeatures); + + const FCesiumPrimitiveFeatures& primitiveFeatures = + UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures( + pComponent); + + const TArray featureIDSets = + UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSets( + primitiveFeatures); + TestEqual("Number of FeatureIDSets", featureIDSets.Num(), 1); + }); + + It("gets implicit feature ID", [this]() { + model = CesiumGltf::Model(); + CesiumGltf::Mesh& mesh = model.meshes.emplace_back(); + pPrimitive = &mesh.primitives.emplace_back(); + pExtension = + &pPrimitive->addExtension(); + CesiumGltf::FeatureId& featureId = pExtension->featureIds.emplace_back(); + featureId.featureCount = 10; + + UCesiumGltfPrimitiveComponent* pComponent = + NewObject(); + pComponent->getPrimitiveData().Features = + FCesiumPrimitiveFeatures(model, *pPrimitive, *pExtension); + + const FCesiumPrimitiveFeatures& primitiveFeatures = + UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures( + pComponent); + + const TArray featureIDSets = + UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSets( + primitiveFeatures); + TestEqual("Number of FeatureIDSets", featureIDSets.Num(), 1); + }); + }); + Describe("GetFeatureIDSetsOfType", [this]() { BeforeEach([this]() { model = CesiumGltf::Model(); diff --git a/Source/CesiumRuntime/Public/CesiumPrimitiveFeatures.h b/Source/CesiumRuntime/Public/CesiumPrimitiveFeatures.h index 9b079cf3f..24fa9726d 100644 --- a/Source/CesiumRuntime/Public/CesiumPrimitiveFeatures.h +++ b/Source/CesiumRuntime/Public/CesiumPrimitiveFeatures.h @@ -34,8 +34,8 @@ struct CESIUMRUNTIME_API FCesiumPrimitiveFeatures { /** * Constructs a primitive features instance. * - * @param Model The model that contains the EXT_mesh_features extension - * @param Primitive The mesh primitive that stores EXT_mesh_features + * @param Model The model that contains the EXT_mesh_features extension. + * @param Primitive The mesh primitive that stores the EXT_mesh_features * extension * @param Features The EXT_mesh_features of the glTF mesh primitive */ @@ -48,9 +48,9 @@ struct CESIUMRUNTIME_API FCesiumPrimitiveFeatures { * Constructs an instance feature object. * * @param Model The model that contains the EXT_instance_features extension - * @param Node The node that stores EXT_instance_features + * @param Node The node that stores the EXT_instance_features * extension - * @param InstanceFeatures The EXT_Instance_features of the glTF mesh + * @param InstanceFeatures The EXT_instance_features of the glTF mesh * primitive */ FCesiumPrimitiveFeatures( From 0a2541f35fb7cabc17f6e3b8dcbf068e13806680 Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Mon, 10 Nov 2025 13:57:42 -0500 Subject: [PATCH 2/3] Fix style of third-party includes --- .../Private/Tests/CesiumPrimitiveFeatures.spec.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp b/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp index 0cdf2e944..10a6fb54e 100644 --- a/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp +++ b/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp @@ -1,12 +1,13 @@ // Copyright 2020-2024 CesiumGS, Inc. and Contributors #include "CesiumPrimitiveFeatures.h" -#include "CesiumGltf/ExtensionExtInstanceFeatures.h" -#include "CesiumGltf/ExtensionExtMeshFeatures.h" #include "CesiumGltfPrimitiveComponent.h" #include "CesiumGltfSpecUtility.h" #include "Misc/AutomationTest.h" +#include +#include + BEGIN_DEFINE_SPEC( FCesiumPrimitiveFeaturesSpec, "Cesium.Unit.PrimitiveFeatures", From 4d97fe83d94f8762255eea2b066e5d380290acab Mon Sep 17 00:00:00 2001 From: Janine Liu Date: Wed, 12 Nov 2025 11:02:46 -0500 Subject: [PATCH 3/3] Fix bad typo --- .../Private/Tests/CesiumPrimitiveFeatures.spec.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp b/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp index 10a6fb54e..41b1264c5 100644 --- a/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp +++ b/Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp @@ -6,7 +6,7 @@ #include "Misc/AutomationTest.h" #include -#include +#include BEGIN_DEFINE_SPEC( FCesiumPrimitiveFeaturesSpec,