Skip to content

Commit dfd16e8

Browse files
Radient: preserve GLTF node visibility in imported scene
1 parent e2760e3 commit dfd16e8

3 files changed

Lines changed: 68 additions & 0 deletions

File tree

‎Radient/include/Import/RadientImportedScene.hpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ struct ImportedNode
5757

5858
RadientTransform Transform{};
5959

60+
/// Node-local visibility. Effective visibility also depends on every
61+
/// ancestor in the instantiated scene hierarchy.
62+
Bool Visible = True;
63+
6064
RefCntAutoPtr<IRadientMeshAsset> pMesh;
6165

6266
/// Optional node-specific morph weights. An empty array uses the mesh

‎Radient/src/Import/RadientGLTFConverter.cpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,7 @@ RADIENT_STATUS CreateNode(IRadientSceneWriter& Writ
895895
RadientEntityDesc NodeDesc{};
896896
NodeDesc.Name = !Node.Name.empty() ? Node.Name.c_str() : FallbackName.c_str();
897897
NodeDesc.Parent = Parent;
898+
NodeDesc.Flags = Node.Visible ? RADIENT_ENTITY_FLAG_VISIBLE : RADIENT_ENTITY_FLAG_NONE;
898899
NodeDesc.Transform = Node.Transform;
899900

900901
RadientEntityID NodeEntity = InvalidRadientEntityID;
@@ -1491,6 +1492,7 @@ RADIENT_STATUS ExtractSceneGraph(const GLTF::Model& GLTFModel,
14911492
RadientImport::ImportedNode& DstNode = Scene.Nodes[static_cast<size_t>(SrcNode.Index)];
14921493
DstNode.Name = SrcNode.Name;
14931494
DstNode.Transform = ToRadientTransform(SrcNode);
1495+
DstNode.Visible = SrcNode.Visible ? True : False;
14941496

14951497
if (SrcNode.pMesh != nullptr)
14961498
{

‎Tests/RadientTest/src/Import/RadientGLTFConverterTest.cpp‎

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,7 @@ TEST(RadientGLTFConverterTest, ExtractSceneGraphCopiesScenesNodesMeshesAndTransf
12471247
Model.Nodes[1].Name = "ChildA";
12481248
Model.Nodes[1].Parent = &Model.Nodes[0];
12491249
Model.Nodes[1].Translation = {4.f, 5.f, 6.f};
1250+
Model.Nodes[1].Visible = false;
12501251

12511252
Model.Nodes[2].Name = "ChildB";
12521253
Model.Nodes[2].Parent = &Model.Nodes[0];
@@ -1273,6 +1274,7 @@ TEST(RadientGLTFConverterTest, ExtractSceneGraphCopiesScenesNodesMeshesAndTransf
12731274

12741275
ASSERT_EQ(Scene.Nodes.size(), 3u);
12751276
EXPECT_EQ(Scene.Nodes[0].Name, "Root");
1277+
EXPECT_EQ(Scene.Nodes[0].Visible, True);
12761278
EXPECT_EQ(Scene.Nodes[0].pMesh, pMesh);
12771279
ASSERT_EQ(Scene.Nodes[0].Children.size(), 2u);
12781280
EXPECT_EQ(Scene.Nodes[0].Children[0], 1u);
@@ -1283,14 +1285,74 @@ TEST(RadientGLTFConverterTest, ExtractSceneGraphCopiesScenesNodesMeshesAndTransf
12831285
ExpectFloat3Near(Scene.Nodes[0].Transform.Scale, {2.f, 3.f, 4.f});
12841286

12851287
EXPECT_EQ(Scene.Nodes[1].Name, "ChildA");
1288+
EXPECT_EQ(Scene.Nodes[1].Visible, False);
12861289
EXPECT_EQ(Scene.Nodes[1].pMesh, nullptr);
12871290
EXPECT_TRUE(Scene.Nodes[1].Children.empty());
12881291
ExpectFloat3Near(Scene.Nodes[1].Transform.Position, {4.f, 5.f, 6.f});
12891292

12901293
EXPECT_EQ(Scene.Nodes[2].Name, "ChildB");
1294+
EXPECT_EQ(Scene.Nodes[2].Visible, True);
12911295
ExpectFloat3Near(Scene.Nodes[2].Transform.Scale, {0.5f, 0.25f, 0.125f});
12921296
}
12931297

1298+
TEST(RadientGLTFConverterTest, InstantiateSceneGraphPreservesNodeVisibility)
1299+
{
1300+
RadientImport::ImportedDocument ImportedScene;
1301+
ImportedScene.Nodes.resize(3);
1302+
ImportedScene.Nodes[0].Name = "Hidden parent";
1303+
ImportedScene.Nodes[0].Visible = False;
1304+
ImportedScene.Nodes[0].Children = {1};
1305+
ImportedScene.Nodes[1].Name = "Visible child";
1306+
ImportedScene.Nodes[2].Name = "Visible root";
1307+
ImportedScene.Scenes.emplace_back().RootNodes = {0, 2};
1308+
1309+
RefCntAutoPtr<IRadientEngine> pEngine;
1310+
ASSERT_EQ(CreateRadientEngine({}, pEngine.GetAddressOfEmpty()), RADIENT_STATUS_OK);
1311+
1312+
RefCntAutoPtr<IRadientScene> pScene;
1313+
ASSERT_EQ(pEngine->CreateScene({}, pScene.GetAddressOfEmpty()), RADIENT_STATUS_OK);
1314+
1315+
RefCntAutoPtr<IRadientSceneWriter> pWriter;
1316+
ASSERT_EQ(pEngine->CreateSceneWriter(pScene, pWriter.GetAddressOfEmpty()), RADIENT_STATUS_OK);
1317+
1318+
RadientEntityID RootEntity = InvalidRadientEntityID;
1319+
ASSERT_EQ(pWriter->CreateEntity({}, RootEntity), RADIENT_STATUS_OK);
1320+
ASSERT_EQ(RadientGLTFConverter::InstantiateSceneGraph(ImportedScene, 0, *pWriter, RootEntity),
1321+
RADIENT_STATUS_OK);
1322+
ASSERT_EQ(pWriter->CommitChanges(), RADIENT_STATUS_OK);
1323+
1324+
std::array<RadientEntityID, 2> RootChildren{};
1325+
Uint32 ChildrenRetrieved = 0;
1326+
ASSERT_EQ(pScene->GetChildren(RootEntity, 0, static_cast<Uint32>(RootChildren.size()),
1327+
RootChildren.data(), ChildrenRetrieved),
1328+
RADIENT_STATUS_OK);
1329+
ASSERT_EQ(ChildrenRetrieved, RootChildren.size());
1330+
1331+
const RadientEntityID HiddenParent = RootChildren[0];
1332+
const RadientEntityID VisibleRoot = RootChildren[1];
1333+
1334+
RadientEntityID VisibleChild = InvalidRadientEntityID;
1335+
ASSERT_EQ(pScene->GetChildren(HiddenParent, 0, 1, &VisibleChild, ChildrenRetrieved),
1336+
RADIENT_STATUS_OK);
1337+
ASSERT_EQ(ChildrenRetrieved, 1u);
1338+
1339+
Bool Visible = True;
1340+
ASSERT_EQ(pScene->GetEntityOwnVisibility(HiddenParent, Visible), RADIENT_STATUS_OK);
1341+
EXPECT_EQ(Visible, False);
1342+
ASSERT_EQ(pScene->GetEntityEffectiveVisibility(HiddenParent, Visible), RADIENT_STATUS_OK);
1343+
EXPECT_EQ(Visible, False);
1344+
1345+
ASSERT_EQ(pScene->GetEntityOwnVisibility(VisibleChild, Visible), RADIENT_STATUS_OK);
1346+
EXPECT_EQ(Visible, True);
1347+
ASSERT_EQ(pScene->GetEntityEffectiveVisibility(VisibleChild, Visible), RADIENT_STATUS_OK);
1348+
EXPECT_EQ(Visible, False);
1349+
1350+
ASSERT_EQ(pScene->GetEntityOwnVisibility(VisibleRoot, Visible), RADIENT_STATUS_OK);
1351+
EXPECT_EQ(Visible, True);
1352+
ASSERT_EQ(pScene->GetEntityEffectiveVisibility(VisibleRoot, Visible), RADIENT_STATUS_OK);
1353+
EXPECT_EQ(Visible, True);
1354+
}
1355+
12941356
TEST(RadientGLTFConverterTest, ExtractSceneGraphConvertsCameras)
12951357
{
12961358
GLTF::Model Model;

0 commit comments

Comments
 (0)