Skip to content

Commit 30d1211

Browse files
authored
Merge pull request #1757 from CesiumGS/detect-instanced-features
Make `GetPrimitiveFeatures` work for instanced meshes
2 parents f39b9b8 + 13a96ad commit 30d1211

File tree

4 files changed

+76
-8
lines changed

4 files changed

+76
-8
lines changed

CHANGES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Change Log {#changes}
22

3+
### ? - ?
4+
5+
##### Fixes :wrench:
6+
7+
- Fixed a bug that prevented `UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures` from retrieving the features of instanced meshes.
8+
39
### v2.21.0 Preview for Unreal Engine 5.7 - 2025-11-17
410

511
##### Additions :tada:

Source/CesiumRuntime/Private/CesiumPrimitiveFeatures.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,19 @@ FCesiumPrimitiveFeatures::FCesiumPrimitiveFeatures(
4444
const FCesiumPrimitiveFeatures&
4545
UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures(
4646
const UPrimitiveComponent* component) {
47+
const UCesiumGltfInstancedComponent* pGltfInstancedComponent =
48+
Cast<UCesiumGltfInstancedComponent>(component);
49+
if (IsValid(pGltfInstancedComponent)) {
50+
return pGltfInstancedComponent->getPrimitiveData().Features;
51+
}
52+
4753
const UCesiumGltfPrimitiveComponent* pGltfComponent =
4854
Cast<UCesiumGltfPrimitiveComponent>(component);
49-
if (!IsValid(pGltfComponent)) {
50-
return EmptyPrimitiveFeatures;
55+
if (IsValid(pGltfComponent)) {
56+
return pGltfComponent->getPrimitiveData().Features;
5157
}
5258

53-
return pGltfComponent->getPrimitiveData().Features;
59+
return EmptyPrimitiveFeatures;
5460
}
5561

5662
const TArray<FCesiumFeatureIdSet>&

Source/CesiumRuntime/Private/Tests/CesiumPrimitiveFeatures.spec.cpp

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
// Copyright 2020-2024 CesiumGS, Inc. and Contributors
22

33
#include "CesiumPrimitiveFeatures.h"
4-
#include "CesiumGltf/ExtensionExtMeshFeatures.h"
4+
#include "CesiumGltfPrimitiveComponent.h"
55
#include "CesiumGltfSpecUtility.h"
66
#include "Misc/AutomationTest.h"
77

8+
#include <CesiumGltf/ExtensionExtInstanceFeatures.h>
9+
#include <CesiumGltf/ExtensionExtMeshFeatures.h>
10+
811
BEGIN_DEFINE_SPEC(
912
FCesiumPrimitiveFeaturesSpec,
1013
"Cesium.Unit.PrimitiveFeatures",
@@ -116,6 +119,59 @@ void FCesiumPrimitiveFeaturesSpec::Define() {
116119
});
117120
});
118121

122+
Describe("GetPrimitiveFeatures", [this]() {
123+
It("returns for instanced glTF component", [this]() {
124+
model = CesiumGltf::Model();
125+
model.meshes.emplace_back();
126+
CesiumGltf::Node& node = model.nodes.emplace_back();
127+
node.mesh = 0;
128+
129+
CesiumGltf::ExtensionExtInstanceFeatures& instanceFeatures =
130+
node.addExtension<CesiumGltf::ExtensionExtInstanceFeatures>();
131+
CesiumGltf::ExtensionExtInstanceFeaturesFeatureId& featureId =
132+
instanceFeatures.featureIds.emplace_back();
133+
featureId.featureCount = 10;
134+
135+
UCesiumGltfInstancedComponent* pComponent =
136+
NewObject<UCesiumGltfInstancedComponent>();
137+
pComponent->getPrimitiveData().Features =
138+
FCesiumPrimitiveFeatures(model, node, instanceFeatures);
139+
140+
const FCesiumPrimitiveFeatures& primitiveFeatures =
141+
UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures(
142+
pComponent);
143+
144+
const TArray<FCesiumFeatureIdSet> featureIDSets =
145+
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSets(
146+
primitiveFeatures);
147+
TestEqual("Number of FeatureIDSets", featureIDSets.Num(), 1);
148+
});
149+
150+
It("gets implicit feature ID", [this]() {
151+
model = CesiumGltf::Model();
152+
CesiumGltf::Mesh& mesh = model.meshes.emplace_back();
153+
pPrimitive = &mesh.primitives.emplace_back();
154+
pExtension =
155+
&pPrimitive->addExtension<CesiumGltf::ExtensionExtMeshFeatures>();
156+
CesiumGltf::FeatureId& featureId = pExtension->featureIds.emplace_back();
157+
featureId.featureCount = 10;
158+
159+
UCesiumGltfPrimitiveComponent* pComponent =
160+
NewObject<UCesiumGltfPrimitiveComponent>();
161+
pComponent->getPrimitiveData().Features =
162+
FCesiumPrimitiveFeatures(model, *pPrimitive, *pExtension);
163+
164+
const FCesiumPrimitiveFeatures& primitiveFeatures =
165+
UCesiumPrimitiveFeaturesBlueprintLibrary::GetPrimitiveFeatures(
166+
pComponent);
167+
168+
const TArray<FCesiumFeatureIdSet> featureIDSets =
169+
UCesiumPrimitiveFeaturesBlueprintLibrary::GetFeatureIDSets(
170+
primitiveFeatures);
171+
TestEqual("Number of FeatureIDSets", featureIDSets.Num(), 1);
172+
});
173+
});
174+
119175
Describe("GetFeatureIDSetsOfType", [this]() {
120176
BeforeEach([this]() {
121177
model = CesiumGltf::Model();

Source/CesiumRuntime/Public/CesiumPrimitiveFeatures.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ struct CESIUMRUNTIME_API FCesiumPrimitiveFeatures {
3434
/**
3535
* Constructs a primitive features instance.
3636
*
37-
* @param Model The model that contains the EXT_mesh_features extension
38-
* @param Primitive The mesh primitive that stores EXT_mesh_features
37+
* @param Model The model that contains the EXT_mesh_features extension.
38+
* @param Primitive The mesh primitive that stores the EXT_mesh_features
3939
* extension
4040
* @param Features The EXT_mesh_features of the glTF mesh primitive
4141
*/
@@ -48,9 +48,9 @@ struct CESIUMRUNTIME_API FCesiumPrimitiveFeatures {
4848
* Constructs an instance feature object.
4949
*
5050
* @param Model The model that contains the EXT_instance_features extension
51-
* @param Node The node that stores EXT_instance_features
51+
* @param Node The node that stores the EXT_instance_features
5252
* extension
53-
* @param InstanceFeatures The EXT_Instance_features of the glTF mesh
53+
* @param InstanceFeatures The EXT_instance_features of the glTF mesh
5454
* primitive
5555
*/
5656
FCesiumPrimitiveFeatures(

0 commit comments

Comments
 (0)