2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 // Enable debug log for test coverage
19 #define DEBUG_ENABLED 1
21 #include <dali-scene3d/public-api/loader/gltf2-loader.h>
22 #include <dali-scene3d/public-api/loader/load-result.h>
23 #include <dali-scene3d/public-api/loader/resource-bundle.h>
24 #include <dali-scene3d/public-api/loader/scene-definition.h>
25 #include <dali-scene3d/public-api/loader/shader-definition-factory.h>
26 #include <dali-test-suite-utils.h>
27 #include <string_view>
30 using namespace Dali::Scene3D::Loader;
32 #define DALI_TEST_THROW(expression, exception, predicate) \
34 bool daliTestThrowSuccess__ = false; \
41 printf("No exception was thrown.\n"); \
43 catch(std::decay<exception>::type & ex) \
45 daliTestThrowSuccess__ = predicate(ex); \
49 printf("Wrong type of exception thrown.\n"); \
51 DALI_TEST_CHECK(daliTestThrowSuccess__); \
58 ResourceBundle::PathProvider pathProvider = [](ResourceType::Value type)
60 return TEST_RESOURCE_DIR "/";
63 ResourceBundle resources;
64 SceneDefinition scene;
65 SceneMetadata metaData;
67 std::vector<AnimationDefinition> animations;
68 std::vector<AnimationGroupDefinition> animationGroups;
69 std::vector<CameraParameters> cameras;
70 std::vector<LightParameters> lights;
72 LoadResult loadResult{
82 struct ExceptionMessageStartsWith
84 const std::string_view expected;
86 bool operator()(const std::runtime_error& e)
88 const bool success = (0 == strncmp(e.what(), expected.data(), expected.size()));
91 printf("Expected: %s, got: %s.\n", expected.data(), e.what());
99 int UtcDaliGltfLoaderFailedToLoad(void)
103 ShaderDefinitionFactory sdf;
104 sdf.SetResources(ctx.resources);
106 InitializeGltfLoader();
107 DALI_TEST_THROW(LoadGltfScene("non-existent.gltf", sdf, ctx.loadResult),
109 ExceptionMessageStartsWith{"Failed to load"});
111 DALI_TEST_EQUAL(0, ctx.scene.GetRoots().size());
112 DALI_TEST_EQUAL(0, ctx.scene.GetNodeCount());
114 DALI_TEST_EQUAL(0, ctx.resources.mEnvironmentMaps.size());
115 DALI_TEST_EQUAL(0, ctx.resources.mMaterials.size());
116 DALI_TEST_EQUAL(0, ctx.resources.mMeshes.size());
117 DALI_TEST_EQUAL(0, ctx.resources.mShaders.size());
118 DALI_TEST_EQUAL(0, ctx.resources.mSkeletons.size());
120 DALI_TEST_EQUAL(0, ctx.cameras.size());
121 DALI_TEST_EQUAL(0, ctx.lights.size());
122 DALI_TEST_EQUAL(0, ctx.animations.size());
123 DALI_TEST_EQUAL(0, ctx.animationGroups.size());
128 int UtcDaliGltfLoaderFailedToParse(void)
132 ShaderDefinitionFactory sdf;
133 sdf.SetResources(ctx.resources);
135 InitializeGltfLoader();
136 DALI_TEST_THROW(LoadGltfScene(TEST_RESOURCE_DIR "/invalid.gltf", sdf, ctx.loadResult),
138 ExceptionMessageStartsWith{"Failed to parse"});
140 DALI_TEST_EQUAL(0, ctx.scene.GetRoots().size());
141 DALI_TEST_EQUAL(0, ctx.scene.GetNodeCount());
143 DALI_TEST_EQUAL(0, ctx.resources.mEnvironmentMaps.size());
144 DALI_TEST_EQUAL(0, ctx.resources.mMaterials.size());
145 DALI_TEST_EQUAL(0, ctx.resources.mMeshes.size());
146 DALI_TEST_EQUAL(0, ctx.resources.mShaders.size());
147 DALI_TEST_EQUAL(0, ctx.resources.mSkeletons.size());
149 DALI_TEST_EQUAL(0, ctx.cameras.size());
150 DALI_TEST_EQUAL(0, ctx.lights.size());
151 DALI_TEST_EQUAL(0, ctx.animations.size());
152 DALI_TEST_EQUAL(0, ctx.animationGroups.size());
157 int UtcDaliGltfLoaderSuccess1(void)
161 LoadSceneMetadata(TEST_RESOURCE_DIR "/AnimatedCube.metadata", ctx.metaData);
163 std::unordered_map<std::string, ImageMetadata> imageMetadataGroundTruth;
164 imageMetadataGroundTruth["AnimatedCube_BaseColor.png"] = ImageMetadata{ImageDimensions(256, 256), Dali::SamplingMode::BOX_THEN_NEAREST};
165 imageMetadataGroundTruth["AnimatedCube_MetallicRoughness.png"] = ImageMetadata{ImageDimensions(256, 256), Dali::SamplingMode::NEAREST};
167 auto metaData = ctx.metaData.mImageMetadata.begin();
168 for(auto& groundTruth : imageMetadataGroundTruth)
170 DALI_TEST_EQUAL(groundTruth.first, metaData->first);
171 DALI_TEST_EQUAL(groundTruth.second.mMinSize, metaData->second.mMinSize);
172 DALI_TEST_EQUAL(groundTruth.second.mSamplingMode, metaData->second.mSamplingMode);
176 ShaderDefinitionFactory sdf;
177 sdf.SetResources(ctx.resources);
179 InitializeGltfLoader();
180 LoadGltfScene(TEST_RESOURCE_DIR "/AnimatedCube.gltf", sdf, ctx.loadResult);
182 DALI_TEST_EQUAL(1u, ctx.scene.GetRoots().size());
183 DALI_TEST_EQUAL(6u, ctx.scene.GetNodeCount());
185 // Default envmap is used
186 DALI_TEST_EQUAL(1u, ctx.resources.mEnvironmentMaps.size());
190 Customization::Choices choices;
191 for(auto iRoot : ctx.scene.GetRoots())
193 auto resourceRefs = ctx.resources.CreateRefCounter();
194 ctx.scene.CountResourceRefs(iRoot, choices, resourceRefs);
195 ctx.resources.CountEnvironmentReferences(resourceRefs);
196 ctx.resources.LoadResources(resourceRefs, ctx.pathProvider);
199 auto& materials = ctx.resources.mMaterials;
200 DALI_TEST_EQUAL(2u, materials.size());
201 const MaterialDefinition materialGroundTruth[]{
204 MaterialDefinition::ALBEDO | MaterialDefinition::EMISSIVE | MaterialDefinition::OCCLUSION |
205 MaterialDefinition::NORMAL | MaterialDefinition::SPECULAR | MaterialDefinition::SPECULAR_COLOR |
206 (0x80 << MaterialDefinition::ALPHA_CUTOFF_SHIFT),
211 Vector4(1.000, 0.766, 0.336, 1.0),
214 Vector3(0.2, 0.1, 0.0),
226 MaterialDefinition::ALBEDO,
228 "AnimatedCube_BaseColor.png",
229 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
230 ImageDimensions(256, 256),
231 SamplingMode::BOX_THEN_NEAREST,
235 MaterialDefinition::NORMAL,
237 "AnimatedCube_BaseColor.png",
238 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
239 ImageDimensions(256, 256),
240 SamplingMode::BOX_THEN_NEAREST,
244 MaterialDefinition::OCCLUSION,
246 "AnimatedCube_BaseColor.png",
247 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
248 ImageDimensions(256, 256),
249 SamplingMode::BOX_THEN_NEAREST,
253 MaterialDefinition::EMISSIVE,
255 "AnimatedCube_BaseColor.png",
256 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
257 ImageDimensions(256, 256),
258 SamplingMode::BOX_THEN_NEAREST,
262 MaterialDefinition::SPECULAR,
264 "AnimatedCube_BaseColor.png",
265 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
266 ImageDimensions(256, 256),
267 SamplingMode::BOX_THEN_NEAREST,
271 MaterialDefinition::SPECULAR_COLOR,
273 "AnimatedCube_BaseColor.png",
274 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
275 ImageDimensions(256, 256),
276 SamplingMode::BOX_THEN_NEAREST,
283 MaterialDefinition::ALBEDO | MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS |
284 MaterialDefinition::EMISSIVE | MaterialDefinition::OCCLUSION | MaterialDefinition::NORMAL |
285 MaterialDefinition::GLTF_CHANNELS,
290 Vector4(1.000, 0.766, 0.336, 1.0),
293 Vector3(0.2, 0.1, 0.0),
305 MaterialDefinition::ALBEDO,
307 "AnimatedCube_BaseColor.png",
308 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
309 ImageDimensions(256, 256),
310 SamplingMode::BOX_THEN_NEAREST,
314 MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | MaterialDefinition::GLTF_CHANNELS,
316 "AnimatedCube_MetallicRoughness.png",
317 SamplerFlags::Encode(FilterMode::NEAREST_MIPMAP_LINEAR, FilterMode::NEAREST, WrapMode::CLAMP_TO_EDGE, WrapMode::MIRRORED_REPEAT),
318 ImageDimensions(256, 256),
319 SamplingMode::NEAREST,
323 MaterialDefinition::NORMAL,
325 "AnimatedCube_BaseColor.png",
326 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
327 ImageDimensions(256, 256),
328 SamplingMode::BOX_THEN_NEAREST,
332 MaterialDefinition::OCCLUSION,
334 "AnimatedCube_BaseColor.png",
335 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
336 ImageDimensions(256, 256),
337 SamplingMode::BOX_THEN_NEAREST,
341 MaterialDefinition::EMISSIVE,
343 "AnimatedCube_BaseColor.png",
344 SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT),
345 ImageDimensions(256, 256),
346 SamplingMode::BOX_THEN_NEAREST,
353 auto iMaterial = materials.begin();
354 auto iMetadata = ctx.metaData.mImageMetadata.begin();
355 for(auto& m : materialGroundTruth)
357 printf("material %ld\n", iMaterial - materials.begin());
358 auto& md = iMaterial->first;
359 DALI_TEST_EQUAL(md.mFlags, m.mFlags);
360 DALI_TEST_EQUAL(md.mEnvironmentIdx, m.mEnvironmentIdx);
361 DALI_TEST_EQUAL(md.mColor, m.mColor);
362 DALI_TEST_EQUAL(md.mMetallic, m.mMetallic);
363 DALI_TEST_EQUAL(md.mRoughness, m.mRoughness);
364 DALI_TEST_EQUAL(md.mBaseColorFactor, m.mBaseColorFactor);
365 DALI_TEST_EQUAL(md.mNormalScale, m.mNormalScale);
366 DALI_TEST_EQUAL(md.mOcclusionStrength, m.mOcclusionStrength);
367 DALI_TEST_EQUAL(md.mEmissiveFactor, m.mEmissiveFactor);
368 DALI_TEST_EQUAL(md.mDielectricSpecular, m.mDielectricSpecular);
369 DALI_TEST_EQUAL(md.mSpecularFactor, m.mSpecularFactor);
370 DALI_TEST_EQUAL(md.mSpecularColorFactor, m.mSpecularColorFactor);
371 DALI_TEST_EQUAL(md.mNeedAlbedoTexture, m.mNeedAlbedoTexture);
372 DALI_TEST_EQUAL(md.mNeedMetallicRoughnessTexture, m.mNeedMetallicRoughnessTexture);
373 DALI_TEST_EQUAL(md.mNeedNormalTexture, m.mNeedNormalTexture);
374 DALI_TEST_EQUAL(md.mIsOpaque, m.mIsOpaque);
375 DALI_TEST_EQUAL(md.mIsMask, m.mIsMask);
377 DALI_TEST_EQUAL(md.mTextureStages.size(), m.mTextureStages.size());
378 auto iTexture = md.mTextureStages.begin();
379 for(auto& ts : m.mTextureStages)
381 printf("texture %ld\n", iTexture - md.mTextureStages.begin());
382 DALI_TEST_EQUAL(iTexture->mSemantic, ts.mSemantic);
383 DALI_TEST_EQUAL(iTexture->mTexture.mImageUri, ts.mTexture.mImageUri);
384 DALI_TEST_EQUAL(uint32_t(iTexture->mTexture.mSamplerFlags), uint32_t(ts.mTexture.mSamplerFlags)); // don't interpret it as a character
385 DALI_TEST_EQUAL(iTexture->mTexture.mMinImageDimensions, ts.mTexture.mMinImageDimensions);
386 DALI_TEST_EQUAL(iTexture->mTexture.mSamplingMode, ts.mTexture.mSamplingMode);
394 auto& meshes = ctx.resources.mMeshes;
395 DALI_TEST_EQUAL(2u, meshes.size());
397 using Blob = MeshDefinition::Blob;
398 using Accessor = MeshDefinition::Accessor;
399 const MeshDefinition meshGroundTruth[]{
405 Accessor{Blob{0, 0}, {}},
406 Accessor{Blob{0, 0}, {}},
407 Accessor{Blob{0, 0}, {}},
408 Accessor{Blob{0, 0}, {}},
409 Accessor{Blob{0, 0}, {}},
410 Accessor{Blob{0, 0}, {}},
417 Accessor{Blob{0, 0}, {}},
418 Accessor{Blob{0, 0}, {}},
419 Accessor{Blob{0, 0}, {}},
420 Accessor{Blob{0, 0}, {}},
421 Accessor{Blob{0, 0}, {}},
422 Accessor{Blob{0, 0}, {}},
426 auto iMesh = meshes.begin();
427 for(auto& m : meshGroundTruth)
429 printf("mesh %ld\n", iMesh - meshes.begin());
431 auto& md = iMesh->first;
432 DALI_TEST_EQUAL(md.mFlags, m.mFlags);
433 DALI_TEST_EQUAL(md.mPrimitiveType, m.mPrimitiveType);
435 &MeshDefinition::mIndices,
436 &MeshDefinition::mPositions,
437 &MeshDefinition::mNormals,
438 &MeshDefinition::mTexCoords,
439 &MeshDefinition::mColors,
440 &MeshDefinition::mTangents,
441 &MeshDefinition::mJoints0,
442 &MeshDefinition::mWeights0})
444 DALI_TEST_EQUAL((md.*mp).IsDefined(), (m.*mp).IsDefined());
445 DALI_TEST_EQUAL((md.*mp).mBlob.IsDefined(), (m.*mp).mBlob.IsDefined());
448 DALI_TEST_EQUAL(md.mBlendShapeHeader.IsDefined(), m.mBlendShapeHeader.IsDefined());
453 DALI_TEST_EQUAL(2u, ctx.resources.mShaders.size());
454 DALI_TEST_EQUAL(0u, ctx.resources.mSkeletons.size());
456 DALI_TEST_EQUAL(3u, ctx.cameras.size());
457 DALI_TEST_EQUAL(0u, ctx.lights.size());
458 DALI_TEST_EQUAL(1u, ctx.animations.size());
459 DALI_TEST_EQUAL(0u, ctx.animationGroups.size());
464 int UtcDaliGltfLoaderSuccess2(void)
467 ShaderDefinitionFactory sdf;
468 sdf.SetResources(ctx.resources);
470 InitializeGltfLoader();
471 LoadGltfScene(TEST_RESOURCE_DIR "/AnimatedCubeStride.gltf", sdf, ctx.loadResult);
473 DALI_TEST_EQUAL(1u, ctx.scene.GetRoots().size());
474 DALI_TEST_EQUAL(1u, ctx.scene.GetNodeCount());
478 Customization::Choices choices;
479 for(auto iRoot : ctx.scene.GetRoots())
481 auto resourceRefs = ctx.resources.CreateRefCounter();
482 ctx.scene.CountResourceRefs(iRoot, choices, resourceRefs);
483 ctx.resources.LoadResources(resourceRefs, ctx.pathProvider);
486 DALI_TEST_EQUAL(true, ctx.resources.mMeshes[0u].first.mPositions.IsDefined());
487 DALI_TEST_EQUAL(432, ctx.resources.mMeshes[0u].first.mPositions.mBlob.mLength);
492 int UtcDaliGltfLoaderSuccessShort(void)
496 const std::string resourcePath = TEST_RESOURCE_DIR "/";
497 auto pathProvider = [resourcePath](ResourceType::Value)
502 Customization::Choices choices;
503 for(auto modelName : {
506 "AnimatedMorphSphere",
513 "MorphPrimitivesTest",
515 "SimpleSparseAccessor",
521 ShaderDefinitionFactory sdf;
523 auto& resources = ctx.resources;
524 resources.mEnvironmentMaps.push_back({});
526 sdf.SetResources(resources);
528 printf("%s\n", modelName);
529 InitializeGltfLoader();
530 LoadGltfScene(resourcePath + modelName + ".gltf", sdf, ctx.loadResult);
531 DALI_TEST_CHECK(ctx.scene.GetNodeCount() > 0);
533 auto& scene = ctx.scene;
534 for(auto iRoot : scene.GetRoots())
536 struct Visitor : NodeDefinition::IVisitor
538 struct ResourceReceiver : IResourceReceiver
540 std::vector<bool> mCounts;
542 void Register(ResourceType::Value type, Index id) override
544 if(type == ResourceType::Mesh)
551 void Start(NodeDefinition& n) override
553 for(auto& renderable : n.mRenderables)
555 renderable->RegisterResources(receiver);
559 void Finish(NodeDefinition& n) override
563 visitor.receiver.mCounts.resize(resources.mMeshes.size(), false);
565 scene.Visit(iRoot, choices, visitor);
566 for(uint32_t i0 = 0, i1 = resources.mMeshes.size(); i0 < i1; ++i0)
568 if(visitor.receiver.mCounts[i0])
570 auto raw = resources.mMeshes[i0].first.LoadRaw(resourcePath);
571 DALI_TEST_CHECK(!raw.mAttribs.empty());
573 resources.mMeshes[i0].second = resources.mMeshes[i0].first.Load(std::move(raw));
574 DALI_TEST_CHECK(resources.mMeshes[i0].second.geometry);
583 int UtcDaliGltfLoaderMRendererTest(void)
587 ShaderDefinitionFactory sdf;
588 sdf.SetResources(ctx.resources);
589 auto& resources = ctx.resources;
591 InitializeGltfLoader();
592 LoadGltfScene(TEST_RESOURCE_DIR "/MRendererTest.gltf", sdf, ctx.loadResult);
594 auto& scene = ctx.scene;
595 auto& roots = scene.GetRoots();
596 DALI_TEST_EQUAL(roots.size(), 1u);
597 DALI_TEST_EQUAL(scene.GetNode(roots[0])->mName, "RootNode");
598 DALI_TEST_EQUAL(scene.GetNode(roots[0])->mScale, Vector3(1.0f, 1.0f, 1.0f));
600 DALI_TEST_EQUAL(scene.GetNodeCount(), 1u);
602 ViewProjection viewProjection;
606 NodeDefinition::CreateParams nodeParams{
611 Customization::Choices choices;
615 Actor root = Actor::New();
616 SetActorCentered(root);
617 for(auto iRoot : roots)
619 auto resourceRefs = resources.CreateRefCounter();
620 scene.CountResourceRefs(iRoot, choices, resourceRefs);
621 resources.CountEnvironmentReferences(resourceRefs);
622 resources.LoadResources(resourceRefs, ctx.pathProvider);
623 if(auto actor = scene.CreateNodes(iRoot, choices, nodeParams))
625 scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor);
626 scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables));
627 scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables));
632 DALI_TEST_EQUAL(root.GetChildCount(), 1u);
633 Actor child = root.GetChildAt(0);
635 DALI_TEST_EQUAL(child.GetProperty(Actor::Property::NAME).Get<std::string>(), "RootNode");
636 DALI_TEST_EQUAL(child.GetProperty(Actor::Property::SCALE).Get<Vector3>(), Vector3(1.0f, 1.0f, 1.0f));
637 DALI_TEST_EQUAL(child.GetRendererCount(), 1u);
638 DALI_TEST_EQUAL(child.GetRendererAt(0).GetTextures().GetTextureCount(), 4u);
640 DALI_TEST_EQUAL(child.GetRendererCount(), 1u);
641 DALI_TEST_EQUAL(child.GetRendererAt(0u).GetProperty<decltype(BlendMode::ON)>(Renderer::Property::BLEND_MODE), BlendMode::ON);
646 int UtcDaliGltfLoaderAnimationLoadingTest(void)
650 ShaderDefinitionFactory sdf;
651 sdf.SetResources(ctx.resources);
652 auto& resources = ctx.resources;
654 InitializeGltfLoader();
655 LoadGltfScene(TEST_RESOURCE_DIR "/BoxAnimated.gltf", sdf, ctx.loadResult);
657 auto& scene = ctx.scene;
658 auto& roots = scene.GetRoots();
659 DALI_TEST_EQUAL(roots.size(), 1u);
661 ViewProjection viewProjection;
665 NodeDefinition::CreateParams nodeParams{
670 Customization::Choices choices;
674 Actor root = Actor::New();
675 SetActorCentered(root);
676 for(auto iRoot : roots)
678 auto resourceRefs = resources.CreateRefCounter();
679 scene.CountResourceRefs(iRoot, choices, resourceRefs);
680 resources.CountEnvironmentReferences(resourceRefs);
681 resources.LoadResources(resourceRefs, ctx.pathProvider);
682 if(auto actor = scene.CreateNodes(iRoot, choices, nodeParams))
684 scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor);
685 scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables));
686 scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables));
691 DALI_TEST_EQUAL(ctx.loadResult.mAnimationDefinitions.size(), 1u);
692 DALI_TEST_EQUAL(ctx.loadResult.mAnimationDefinitions[0].mProperties.size(), 2u);
694 uint32_t id = ctx.loadResult.mScene.GetNode(ctx.loadResult.mAnimationDefinitions[0].mProperties[0].mNodeIndex)->mNodeId;
695 DALI_TEST_EQUAL(id, root.FindChildByName("node2").GetProperty<int32_t>(Dali::Actor::Property::ID));
696 uint32_t id2 = ctx.loadResult.mScene.GetNode(ctx.loadResult.mAnimationDefinitions[0].mProperties[1].mNodeIndex)->mNodeId;
697 DALI_TEST_EQUAL(id2, root.FindChildByName("node0").GetProperty<int32_t>(Dali::Actor::Property::ID));