X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-scene-loader%2Fpublic-api%2Fgltf2-loader.cpp;h=be7e53882dc1f37e956d220d29f45a46346531a0;hb=1bc53ac578137a8f0f0ecedb30a6d76dc9d743c2;hp=18923cf2a0e3d84e56dd3d534ea07e09aa102990;hpb=2ca1c3856ce848a94f54444f1014a820e91ee207;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-scene-loader/public-api/gltf2-loader.cpp b/dali-scene-loader/public-api/gltf2-loader.cpp index 18923cf..be7e538 100644 --- a/dali-scene-loader/public-api/gltf2-loader.cpp +++ b/dali-scene-loader/public-api/gltf2-loader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -43,6 +43,11 @@ const std::string ORIENTATION_PROPERTY("orientation"); const std::string SCALE_PROPERTY("scale"); const std::string BLEND_SHAPE_WEIGHTS_UNIFORM("uBlendShapeWeight"); +const std::string MRENDERER_MODEL_IDENTIFICATION("M-Renderer"); + +const std::string ROOT_NODE_NAME("RootNode"); +const Vector3 SCALE_TO_ADJUST(100.0f, 100.0f, 100.0f); + const Geometry::Type GLTF2_TO_DALI_PRIMITIVES[]{ Geometry::POINTS, Geometry::LINES, @@ -152,7 +157,8 @@ const auto TEXURE_READER = std::move(js::Reader() const auto TEXURE_INFO_READER = std::move(js::Reader() .Register(*js::MakeProperty("index", gt::RefReader::Read, >::TextureInfo::mTexture)) .Register(*js::MakeProperty("texCoord", js::Read::Number, >::TextureInfo::mTexCoord)) - .Register(*js::MakeProperty("scale", js::Read::Number, >::TextureInfo::mScale))); + .Register(*js::MakeProperty("scale", js::Read::Number, >::TextureInfo::mScale)) + .Register(*js::MakeProperty("strength", js::Read::Number, >::TextureInfo::mStrength))); const auto MATERIAL_PBR_READER = std::move(js::Reader() .Register(*js::MakeProperty("baseColorFactor", gt::ReadDaliVector, >::Material::Pbr::mBaseColorFactor)) @@ -435,7 +441,7 @@ void ConvertMaterial(const gt::Material& m, decltype(ResourceBundle::mMaterials) matDef.mColor = pbr.mBaseColorFactor; - matDef.mTextureStages.reserve(!!pbr.mBaseColorTexture + !!pbr.mMetallicRoughnessTexture + !!m.mNormalTexture); + matDef.mTextureStages.reserve(!!pbr.mBaseColorTexture + !!pbr.mMetallicRoughnessTexture + !!m.mNormalTexture + !!m.mOcclusionTexture + !!m.mEmissiveTexture); if(pbr.mBaseColorTexture) { const auto semantic = MaterialDefinition::ALBEDO; @@ -465,6 +471,23 @@ void ConvertMaterial(const gt::Material& m, decltype(ResourceBundle::mMaterials) } // TODO: handle doubleSided + if(m.mOcclusionTexture) + { + const auto semantic = MaterialDefinition::OCCLUSION; + matDef.mTextureStages.push_back({semantic, ConvertTextureInfo(m.mOcclusionTexture)}); + // TODO: and there had better be one + matDef.mFlags |= semantic; + matDef.mOcclusionStrength = m.mOcclusionTexture.mStrength; + } + + if(m.mEmissiveTexture) + { + const auto semantic = MaterialDefinition::EMISSIVE; + matDef.mTextureStages.push_back({semantic, ConvertTextureInfo(m.mEmissiveTexture)}); + // TODO: and there had better be one + matDef.mFlags |= semantic; + matDef.mEmissiveFactor = m.mEmissiveFactor; + } outMaterials.emplace_back(std::move(matDef), TextureSet()); } @@ -692,7 +715,7 @@ void ConvertCamera(const gt::Camera& camera, CameraParameters& camParams) } } -void ConvertNode(gt::Node const& node, const Index gltfIdx, Index parentIdx, ConversionContext& cctx) +void ConvertNode(gt::Node const& node, const Index gltfIdx, Index parentIdx, ConversionContext& cctx, bool isMRendererModel) { auto& output = cctx.mOutput; auto& scene = output.mScene; @@ -715,6 +738,11 @@ void ConvertNode(gt::Node const& node, const Index gltfIdx, Index parentIdx, Con nodeDef->mPosition = node.mTranslation; nodeDef->mOrientation = node.mRotation; nodeDef->mScale = node.mScale; + + if(isMRendererModel && node.mName == ROOT_NODE_NAME && node.mScale == SCALE_TO_ADJUST) + { + nodeDef->mScale *= 0.01f; + } } return nodeDef; @@ -774,11 +802,11 @@ void ConvertNode(gt::Node const& node, const Index gltfIdx, Index parentIdx, Con for(auto& n : node.mChildren) { - ConvertNode(*n, n.GetIndex(), idx, cctx); + ConvertNode(*n, n.GetIndex(), idx, cctx, isMRendererModel); } } -void ConvertSceneNodes(const gt::Scene& scene, ConversionContext& cctx) +void ConvertSceneNodes(const gt::Scene& scene, ConversionContext& cctx, bool isMRendererModel) { auto& outScene = cctx.mOutput.mScene; Index rootIdx = outScene.GetNodeCount(); @@ -788,7 +816,7 @@ void ConvertSceneNodes(const gt::Scene& scene, ConversionContext& cctx) break; case 1: - ConvertNode(*scene.mNodes[0], scene.mNodes[0].GetIndex(), INVALID_INDEX, cctx); + ConvertNode(*scene.mNodes[0], scene.mNodes[0].GetIndex(), INVALID_INDEX, cctx, isMRendererModel); outScene.AddRootNode(rootIdx); break; @@ -802,25 +830,25 @@ void ConvertSceneNodes(const gt::Scene& scene, ConversionContext& cctx) for(auto& n : scene.mNodes) { - ConvertNode(*n, n.GetIndex(), rootIdx, cctx); + ConvertNode(*n, n.GetIndex(), rootIdx, cctx, isMRendererModel); } break; } } } -void ConvertNodes(const gt::Document& doc, ConversionContext& cctx) +void ConvertNodes(const gt::Document& doc, ConversionContext& cctx, bool isMRendererModel) { - ConvertSceneNodes(*doc.mScene, cctx); + ConvertSceneNodes(*doc.mScene, cctx, isMRendererModel); for(uint32_t i = 0, i1 = doc.mScene.GetIndex(); i < i1; ++i) { - ConvertSceneNodes(doc.mScenes[i], cctx); + ConvertSceneNodes(doc.mScenes[i], cctx, isMRendererModel); } for(uint32_t i = doc.mScene.GetIndex() + 1; i < doc.mScenes.size(); ++i) { - ConvertSceneNodes(doc.mScenes[i], cctx); + ConvertSceneNodes(doc.mScenes[i], cctx, isMRendererModel); } } @@ -1155,10 +1183,23 @@ void LoadGltfScene(const std::string& url, ShaderDefinitionFactory& shaderFactor gt::Document doc; - auto& rootObj = js::Cast(*root); - auto jsAsset = js::FindObjectChild("asset", rootObj); - auto jsAssetVersion = js::FindObjectChild("version", js::Cast(*jsAsset)); - doc.mAsset.mVersion = js::Read::StringView(*jsAssetVersion); + auto& rootObj = js::Cast(*root); + auto jsAsset = js::FindObjectChild("asset", rootObj); + + auto jsAssetVersion = js::FindObjectChild("version", js::Cast(*jsAsset)); + if(jsAssetVersion) + { + doc.mAsset.mVersion = js::Read::StringView(*jsAssetVersion); + } + + bool isMRendererModel(false); + auto jsAssetGenerator = js::FindObjectChild("generator", js::Cast(*jsAsset)); + if(jsAssetGenerator) + { + doc.mAsset.mGenerator = js::Read::StringView(*jsAssetGenerator); + isMRendererModel = (doc.mAsset.mGenerator.find(MRENDERER_MODEL_IDENTIFICATION) != std::string_view::npos); + } + gt::SetRefReaderObject(doc); DOCUMENT_READER.Read(rootObj, doc); @@ -1168,7 +1209,7 @@ void LoadGltfScene(const std::string& url, ShaderDefinitionFactory& shaderFactor ConvertMaterials(doc, cctx); ConvertMeshes(doc, cctx); - ConvertNodes(doc, cctx); + ConvertNodes(doc, cctx, isMRendererModel); ConvertAnimations(doc, cctx); ProcessSkins(doc, cctx);