X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-scene3d%2Futc-Dali-Gltf2Loader.cpp;h=a485f0fd486851fc6f34b9483ad28c4a52b710db;hb=229b6c3c9c782b92c820b186da244bf2dc50dc32;hp=3ebf5dec4cb08088be873dcb9e1178c3bf74290b;hpb=89641815d206e3bf569f0140ea534146ba8d99c7;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-scene3d/utc-Dali-Gltf2Loader.cpp b/automated-tests/src/dali-scene3d/utc-Dali-Gltf2Loader.cpp index 3ebf5de..a485f0f 100644 --- a/automated-tests/src/dali-scene3d/utc-Dali-Gltf2Loader.cpp +++ b/automated-tests/src/dali-scene3d/utc-Dali-Gltf2Loader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -102,6 +102,7 @@ int UtcDaliGltfLoaderFailedToLoad(void) ShaderDefinitionFactory sdf; sdf.SetResources(ctx.resources); + InitializeGltfLoader(); DALI_TEST_THROW(LoadGltfScene("non-existent.gltf", sdf, ctx.loadResult), std::runtime_error, ExceptionMessageStartsWith{"Failed to load"}); @@ -130,6 +131,7 @@ int UtcDaliGltfLoaderFailedToParse(void) ShaderDefinitionFactory sdf; sdf.SetResources(ctx.resources); + InitializeGltfLoader(); DALI_TEST_THROW(LoadGltfScene(TEST_RESOURCE_DIR "/invalid.gltf", sdf, ctx.loadResult), std::runtime_error, ExceptionMessageStartsWith{"Failed to parse"}); @@ -173,6 +175,7 @@ int UtcDaliGltfLoaderSuccess1(void) ShaderDefinitionFactory sdf; sdf.SetResources(ctx.resources); + InitializeGltfLoader(); LoadGltfScene(TEST_RESOURCE_DIR "/AnimatedCube.gltf", sdf, ctx.loadResult); DALI_TEST_EQUAL(1u, ctx.scene.GetRoots().size()); @@ -195,105 +198,155 @@ int UtcDaliGltfLoaderSuccess1(void) auto& materials = ctx.resources.mMaterials; DALI_TEST_EQUAL(2u, materials.size()); const MaterialDefinition materialGroundTruth[]{ - {MaterialDefinition::ALBEDO | MaterialDefinition::EMISSIVE | MaterialDefinition::OCCLUSION | - MaterialDefinition::NORMAL | MaterialDefinition::SPECULAR | MaterialDefinition::SPECULAR_COLOR | - (0x80 << MaterialDefinition::ALPHA_CUTOFF_SHIFT), - 0, - Color::WHITE, - 1.f, - 0.f, - Vector4(1.000, 0.766, 0.336, 1.0), - 1.f, - 1.f, - Vector3(0.2, 0.1, 0.0), - 0.0f, - 0.5f, - Vector3(0, 0, 1), - true, - false, - true, - false, - true, - true, - { - {MaterialDefinition::ALBEDO, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::NORMAL, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::OCCLUSION, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::EMISSIVE, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::SPECULAR, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::SPECULAR_COLOR, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - }}, - {MaterialDefinition::ALBEDO | MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | - MaterialDefinition::EMISSIVE | MaterialDefinition::OCCLUSION | - MaterialDefinition::NORMAL | MaterialDefinition::GLTF_CHANNELS, - 0, - Color::WHITE, - 1.f, - 0.f, - Vector4(1.000, 0.766, 0.336, 1.0), - 1.f, - 1.f, - Vector3(0.2, 0.1, 0.0), - 0.04f, - 1.0f, - Vector3::ONE, - true, - true, - true, - false, - true, - false, - { - {MaterialDefinition::ALBEDO, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | MaterialDefinition::GLTF_CHANNELS, - {"AnimatedCube_MetallicRoughness.png", - SamplerFlags::Encode(FilterMode::NEAREST_MIPMAP_LINEAR, FilterMode::NEAREST, WrapMode::CLAMP_TO_EDGE, WrapMode::MIRRORED_REPEAT), - ImageDimensions(256, 256), - SamplingMode::NEAREST}}, - {MaterialDefinition::NORMAL, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::OCCLUSION, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - {MaterialDefinition::EMISSIVE, - {"AnimatedCube_BaseColor.png", - SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), - ImageDimensions(256, 256), - SamplingMode::BOX_THEN_NEAREST}}, - }}, + { + nullptr, + MaterialDefinition::ALBEDO | MaterialDefinition::EMISSIVE | MaterialDefinition::OCCLUSION | + MaterialDefinition::NORMAL | MaterialDefinition::SPECULAR | MaterialDefinition::SPECULAR_COLOR | + (0x80 << MaterialDefinition::ALPHA_CUTOFF_SHIFT), + 0, + Color::WHITE, + 1.f, + 0.f, + Vector4(1.000, 0.766, 0.336, 1.0), + 1.f, + 1.f, + Vector3(0.2, 0.1, 0.0), + 0.0f, + 0.5f, + Vector3(0, 0, 1), + true, + false, + true, + false, + true, + true, + { + { + MaterialDefinition::ALBEDO, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::NORMAL, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::OCCLUSION, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::EMISSIVE, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::SPECULAR, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::SPECULAR_COLOR, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + }, + }, + { + nullptr, + MaterialDefinition::ALBEDO | MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | + MaterialDefinition::EMISSIVE | MaterialDefinition::OCCLUSION | MaterialDefinition::NORMAL | + MaterialDefinition::GLTF_CHANNELS, + 0, + Color::WHITE, + 1.f, + 0.f, + Vector4(1.000, 0.766, 0.336, 1.0), + 1.f, + 1.f, + Vector3(0.2, 0.1, 0.0), + 0.04f, + 1.0f, + Vector3::ONE, + true, + true, + true, + false, + true, + false, + { + { + MaterialDefinition::ALBEDO, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS | MaterialDefinition::GLTF_CHANNELS, + { + "AnimatedCube_MetallicRoughness.png", + SamplerFlags::Encode(FilterMode::NEAREST_MIPMAP_LINEAR, FilterMode::NEAREST, WrapMode::CLAMP_TO_EDGE, WrapMode::MIRRORED_REPEAT), + ImageDimensions(256, 256), + SamplingMode::NEAREST, + }, + }, + { + MaterialDefinition::NORMAL, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::OCCLUSION, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + { + MaterialDefinition::EMISSIVE, + { + "AnimatedCube_BaseColor.png", + SamplerFlags::Encode(FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR, WrapMode::CLAMP_TO_EDGE, WrapMode::REPEAT), + ImageDimensions(256, 256), + SamplingMode::BOX_THEN_NEAREST, + }, + }, + }, + }, }; auto iMaterial = materials.begin(); @@ -344,6 +397,7 @@ int UtcDaliGltfLoaderSuccess1(void) using Accessor = MeshDefinition::Accessor; const MeshDefinition meshGroundTruth[]{ { + nullptr, 0, Geometry::TRIANGLES, "AnimatedCube.bin", @@ -355,6 +409,7 @@ int UtcDaliGltfLoaderSuccess1(void) Accessor{Blob{0, 0}, {}}, }, { + nullptr, 0, Geometry::TRIANGLES, "AnimatedCube.bin", @@ -407,10 +462,11 @@ int UtcDaliGltfLoaderSuccess1(void) int UtcDaliGltfLoaderSuccess2(void) { - Context ctx; + Context ctx; ShaderDefinitionFactory sdf; sdf.SetResources(ctx.resources); + InitializeGltfLoader(); LoadGltfScene(TEST_RESOURCE_DIR "/AnimatedCubeStride.gltf", sdf, ctx.loadResult); DALI_TEST_EQUAL(1u, ctx.scene.GetRoots().size()); @@ -445,6 +501,7 @@ int UtcDaliGltfLoaderSuccessShort(void) for(auto modelName : { "2CylinderEngine", "AnimatedMorphCube", + "AnimatedMorphCubeAnimateNonZeroFrame", "AnimatedMorphSphere", "AnimatedTriangle", "BoxAnimated", @@ -468,6 +525,7 @@ int UtcDaliGltfLoaderSuccessShort(void) sdf.SetResources(resources); printf("%s\n", modelName); + InitializeGltfLoader(); LoadGltfScene(resourcePath + modelName + ".gltf", sdf, ctx.loadResult); DALI_TEST_CHECK(ctx.scene.GetNodeCount() > 0); @@ -508,7 +566,7 @@ int UtcDaliGltfLoaderSuccessShort(void) { if(visitor.receiver.mCounts[i0]) { - auto raw = resources.mMeshes[i0].first.LoadRaw(resourcePath); + auto raw = resources.mMeshes[i0].first.LoadRaw(resourcePath, resources.mBuffers); DALI_TEST_CHECK(!raw.mAttribs.empty()); resources.mMeshes[i0].second = resources.mMeshes[i0].first.Load(std::move(raw)); @@ -529,6 +587,7 @@ int UtcDaliGltfLoaderMRendererTest(void) sdf.SetResources(ctx.resources); auto& resources = ctx.resources; + InitializeGltfLoader(); LoadGltfScene(TEST_RESOURCE_DIR "/MRendererTest.gltf", sdf, ctx.loadResult); auto& scene = ctx.scene; @@ -577,10 +636,12 @@ int UtcDaliGltfLoaderMRendererTest(void) DALI_TEST_EQUAL(child.GetRendererCount(), 1u); DALI_TEST_EQUAL(child.GetRendererAt(0).GetTextures().GetTextureCount(), 4u); + DALI_TEST_EQUAL(child.GetRendererCount(), 1u); + DALI_TEST_EQUAL(child.GetRendererAt(0u).GetProperty(Renderer::Property::BLEND_MODE), BlendMode::ON); + END_TEST; } - int UtcDaliGltfLoaderAnimationLoadingTest(void) { Context ctx; @@ -589,7 +650,8 @@ int UtcDaliGltfLoaderAnimationLoadingTest(void) sdf.SetResources(ctx.resources); auto& resources = ctx.resources; - LoadGltfScene(TEST_RESOURCE_DIR "/BoxAnimated.gltf", sdf, ctx.loadResult); + InitializeGltfLoader(); + LoadGltfScene(TEST_RESOURCE_DIR "/CesiumMan_e.gltf", sdf, ctx.loadResult); auto& scene = ctx.scene; auto& roots = scene.GetRoots(); @@ -626,12 +688,114 @@ int UtcDaliGltfLoaderAnimationLoadingTest(void) } DALI_TEST_EQUAL(ctx.loadResult.mAnimationDefinitions.size(), 1u); - DALI_TEST_EQUAL(ctx.loadResult.mAnimationDefinitions[0].mProperties.size(), 2u); + DALI_TEST_EQUAL(ctx.loadResult.mAnimationDefinitions[0].mProperties.size(), 57u); uint32_t id = ctx.loadResult.mScene.GetNode(ctx.loadResult.mAnimationDefinitions[0].mProperties[0].mNodeIndex)->mNodeId; - DALI_TEST_EQUAL(id, root.FindChildByName("node2").GetProperty(Dali::Actor::Property::ID)); - uint32_t id2 = ctx.loadResult.mScene.GetNode(ctx.loadResult.mAnimationDefinitions[0].mProperties[1].mNodeIndex)->mNodeId; - DALI_TEST_EQUAL(id2, root.FindChildByName("node0").GetProperty(Dali::Actor::Property::ID)); + DALI_TEST_EQUAL(id, root.FindChildByName("Skeleton_torso_joint_1").GetProperty(Dali::Actor::Property::ID)); + + END_TEST; +} + +int UtcDaliGltfLoaderImageFromBufferView(void) +{ + Context ctx; + + ShaderDefinitionFactory sdf; + sdf.SetResources(ctx.resources); + auto& resources = ctx.resources; + + InitializeGltfLoader(); + LoadGltfScene(TEST_RESOURCE_DIR "/EnvironmentTest_b.gltf", sdf, ctx.loadResult); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + + ViewProjection viewProjection; + Transforms xforms{ + MatrixStack{}, + viewProjection}; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + + Actor root = Actor::New(); + SetActorCentered(root); + for(auto iRoot : roots) + { + auto resourceRefs = resources.CreateRefCounter(); + scene.CountResourceRefs(iRoot, choices, resourceRefs); + resources.CountEnvironmentReferences(resourceRefs); + resources.LoadResources(resourceRefs, ctx.pathProvider); + if(auto actor = scene.CreateNodes(iRoot, choices, nodeParams)) + { + scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor); + scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables)); + scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables)); + root.Add(actor); + } + } + + DALI_TEST_CHECK(resources.mMaterials[0].second.GetTextureCount() > 1); + DALI_TEST_EQUAL(resources.mMaterials[0].second.GetTexture(0).GetWidth(), 256); + DALI_TEST_EQUAL(resources.mMaterials[0].second.GetTexture(0).GetHeight(), 256); + + END_TEST; +} + +int UtcDaliGltfLoaderUint8Indices(void) +{ + Context ctx; + + ShaderDefinitionFactory sdf; + sdf.SetResources(ctx.resources); + auto& resources = ctx.resources; + + InitializeGltfLoader(); + LoadGltfScene(TEST_RESOURCE_DIR "/AlphaBlendModeTest.gltf", sdf, ctx.loadResult); + + auto& scene = ctx.scene; + auto& roots = scene.GetRoots(); + DALI_TEST_EQUAL(roots.size(), 1u); + + ViewProjection viewProjection; + Transforms xforms{ + MatrixStack{}, + viewProjection}; + NodeDefinition::CreateParams nodeParams{ + resources, + xforms, + }; + + Customization::Choices choices; + + TestApplication app; + + Actor root = Actor::New(); + SetActorCentered(root); + for(auto iRoot : roots) + { + auto resourceRefs = resources.CreateRefCounter(); + scene.CountResourceRefs(iRoot, choices, resourceRefs); + resources.CountEnvironmentReferences(resourceRefs); + resources.LoadResources(resourceRefs, ctx.pathProvider); + if(auto actor = scene.CreateNodes(iRoot, choices, nodeParams)) + { + scene.ConfigureSkeletonJoints(iRoot, resources.mSkeletons, actor); + scene.ConfigureSkinningShaders(resources, actor, std::move(nodeParams.mSkinnables)); + scene.ApplyConstraints(actor, std::move(nodeParams.mConstrainables)); + root.Add(actor); + } + } + + DALI_TEST_CHECK(root.FindChildByName("Bed")); + DALI_TEST_CHECK(root.FindChildByName("DecalBlend")); + DALI_TEST_CHECK(root.FindChildByName("DecalOpaque")); END_TEST; }