X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-scene-loader%2Fpublic-api%2Fshader-definition-factory.cpp;h=bd6b168d71822713cbe9348afe9f36f49ed4eb66;hb=4bc73f2e78812b262f09830bb2b1d87034f34496;hp=f0a2ad8d8843640f8679d5b75745a9520703c892;hpb=ec1db95268e1cf8e8bd893027d45a19c64b32848;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-scene-loader/public-api/shader-definition-factory.cpp b/dali-scene-loader/public-api/shader-definition-factory.cpp index f0a2ad8..bd6b168 100644 --- a/dali-scene-loader/public-api/shader-definition-factory.cpp +++ b/dali-scene-loader/public-api/shader-definition-factory.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 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. @@ -14,12 +14,12 @@ * limitations under the License. * */ -#include "dali-scene-loader/internal/hash.h" #include "dali-scene-loader/public-api/shader-definition-factory.h" -#include "dali-scene-loader/public-api/node-definition.h" +#include +#include "dali-scene-loader/internal/hash.h" #include "dali-scene-loader/public-api/blend-shape-details.h" +#include "dali-scene-loader/public-api/node-definition.h" #include "dali/devel-api/common/map-wrapper.h" -#include namespace Dali { @@ -29,28 +29,29 @@ namespace { struct ResourceReceiver : IResourceReceiver { - const ResourceBundle& mResources; - const MeshDefinition* mMeshDef = nullptr; + const ResourceBundle& mResources; + const MeshDefinition* mMeshDef = nullptr; const MaterialDefinition* mMaterialDef = nullptr; ResourceReceiver(const ResourceBundle& resources) : mResources(resources) - {} + { + } void Register(ResourceType::Value type, Index id) override { - switch (type) + switch(type) { - case ResourceType::Mesh: - mMeshDef = &mResources.mMeshes[id].first; - break; + case ResourceType::Mesh: + mMeshDef = &mResources.mMeshes[id].first; + break; - case ResourceType::Material: - mMaterialDef = &mResources.mMaterials[id].first; - break; + case ResourceType::Material: + mMaterialDef = &mResources.mMaterials[id].first; + break; - default: - break; + default: + break; } } }; @@ -59,11 +60,11 @@ const std::string PBR_SHADER_NAME = "dli_pbr"; void RetrieveBlendShapeComponents(const std::vector& blendShapes, bool& hasPositions, bool& hasNormals, bool& hasTangents) { - for (const auto& blendShape : blendShapes) + for(const auto& blendShape : blendShapes) { hasPositions = hasPositions || blendShape.deltas.IsDefined(); - hasNormals = hasNormals || blendShape.normals.IsDefined(); - hasTangents = hasTangents || blendShape.tangents.IsDefined(); + hasNormals = hasNormals || blendShape.normals.IsDefined(); + hasTangents = hasTangents || blendShape.tangents.IsDefined(); } } @@ -77,65 +78,70 @@ uint64_t HashNode(const NodeDefinition& nodeDef, const MaterialDefinition& mater const bool hasTransparency = MaskMatch(materialDef.mFlags, MaterialDefinition::TRANSPARENCY); hash.Add(hasTransparency); - if (hasTransparency || - materialDef.CheckTextures(MaterialDefinition::ALBEDO) || - materialDef.CheckTextures(MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS) || - materialDef.CheckTextures(MaterialDefinition::NORMAL)) + if(hasTransparency || + materialDef.CheckTextures(MaterialDefinition::ALBEDO) || + materialDef.CheckTextures(MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS) || + materialDef.CheckTextures(MaterialDefinition::NORMAL)) { hash.Add("3TEX"); } - if (materialDef.GetAlphaCutoff() > 0.f) + if(materialDef.GetAlphaCutoff() > 0.f) { - hash.Add("ALPH"/*A_TEST*/); + hash.Add("ALPH" /*A_TEST*/); } - if (MaskMatch(materialDef.mFlags, MaterialDefinition::SUBSURFACE)) + if(MaskMatch(materialDef.mFlags, MaterialDefinition::SUBSURFACE)) { hash.Add("SSS"); } - if (MaskMatch(materialDef.mFlags, MaterialDefinition::GLTF_CHANNELS)) + if(MaskMatch(materialDef.mFlags, MaterialDefinition::OCCLUSION)) { - hash.Add("GLTF"/*_CHANNELS*/); + hash.Add("OCCL" /*USION*/); } - if (meshDef.IsSkinned()) + if(MaskMatch(materialDef.mFlags, MaterialDefinition::GLTF_CHANNELS)) { - hash.Add("SKIN"/*NING*/); + hash.Add("GLTF" /*_CHANNELS*/); } - if (MaskMatch(meshDef.mFlags, MeshDefinition::FLIP_UVS_VERTICAL)) + if(meshDef.IsSkinned()) { - hash.Add("FLIP"/*_V*/); + hash.Add("SKIN" /*NING*/); } - if (meshDef.HasBlendShapes()) + if(MaskMatch(meshDef.mFlags, MeshDefinition::FLIP_UVS_VERTICAL)) + { + hash.Add("FLIP" /*_V*/); + } + + if(meshDef.HasBlendShapes()) { bool hasPositions = false; - bool hasNormals = false; - bool hasTangents = false; + bool hasNormals = false; + bool hasTangents = false; RetrieveBlendShapeComponents(meshDef.mBlendShapes, hasPositions, hasNormals, hasTangents); - if (hasPositions) + if(hasPositions) { hash.Add("MORPHPOS"); } - if (hasNormals) + if(hasNormals) { hash.Add("MORPHNOR"); } - if (hasTangents) + if(hasTangents) { hash.Add("MORPHTAN"); } - if (hasPositions || hasNormals || hasTangents) + if(hasPositions || hasNormals || hasTangents) { hash.Add("MORPH"); - if (BlendShapes::Version::VERSION_2_0 == meshDef.mBlendShapeVersion) + if(BlendShapes::Version::VERSION_2_0 == meshDef.mBlendShapeVersion) { hash.Add("MORPHV2"); } @@ -144,17 +150,18 @@ uint64_t HashNode(const NodeDefinition& nodeDef, const MaterialDefinition& mater return hash; } -} +} // namespace struct ShaderDefinitionFactory::Impl { - ResourceBundle* mResources; // no ownership + ResourceBundle* mResources; // no ownership std::map mShaderMap; }; ShaderDefinitionFactory::ShaderDefinitionFactory() -: mImpl{ new Impl() } -{} +: mImpl{new Impl()} +{ +} ShaderDefinitionFactory::~ShaderDefinitionFactory() = default; @@ -168,106 +175,111 @@ Index ShaderDefinitionFactory::ProduceShader(const NodeDefinition& nodeDef) { DALI_ASSERT_DEBUG(nodeDef.mRenderable); - auto& resources = *mImpl->mResources; - ResourceReceiver receiver{ resources }; + auto& resources = *mImpl->mResources; + ResourceReceiver receiver{resources}; nodeDef.mRenderable->RegisterResources(receiver); - if (!(receiver.mMeshDef && receiver.mMaterialDef)) + if(!(receiver.mMeshDef && receiver.mMaterialDef)) { return INVALID_INDEX; } - auto& shaderMap = mImpl->mShaderMap; - uint64_t hash = HashNode(nodeDef, *receiver.mMaterialDef, *receiver.mMeshDef); - auto iFind = shaderMap.find(hash); - if (iFind != shaderMap.end()) + auto& shaderMap = mImpl->mShaderMap; + uint64_t hash = HashNode(nodeDef, *receiver.mMaterialDef, *receiver.mMeshDef); + auto iFind = shaderMap.find(hash); + if(iFind != shaderMap.end()) { return iFind->second; } ShaderDefinition shaderDef; - shaderDef.mVertexShaderPath = PBR_SHADER_NAME + ".vsh"; + shaderDef.mVertexShaderPath = PBR_SHADER_NAME + ".vsh"; shaderDef.mFragmentShaderPath = PBR_SHADER_NAME + ".fsh"; - shaderDef.mRendererState = RendererState::DEPTH_TEST | RendererState::DEPTH_WRITE | RendererState::CULL_BACK; + shaderDef.mRendererState = RendererState::DEPTH_TEST | RendererState::DEPTH_WRITE | RendererState::CULL_BACK; - auto& materialDef = *receiver.mMaterialDef; + auto& materialDef = *receiver.mMaterialDef; const bool hasTransparency = MaskMatch(materialDef.mFlags, MaterialDefinition::TRANSPARENCY); - if (hasTransparency) + if(hasTransparency) { // TODO: this requires more granularity shaderDef.mRendererState = (shaderDef.mRendererState | RendererState::ALPHA_BLEND) & ~RendererState::DEPTH_WRITE; } - if (hasTransparency || - materialDef.CheckTextures(MaterialDefinition::ALBEDO) || - materialDef.CheckTextures(MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS) || - materialDef.CheckTextures(MaterialDefinition::NORMAL)) + if(hasTransparency || + materialDef.CheckTextures(MaterialDefinition::ALBEDO) || + materialDef.CheckTextures(MaterialDefinition::METALLIC | MaterialDefinition::ROUGHNESS) || + materialDef.CheckTextures(MaterialDefinition::NORMAL)) { shaderDef.mDefines.push_back("THREE_TEX"); } - if (materialDef.GetAlphaCutoff() > 0.f) + if(materialDef.GetAlphaCutoff() > 0.f) { shaderDef.mDefines.push_back("ALPHA_TEST"); } - if (MaskMatch(materialDef.mFlags, MaterialDefinition::SUBSURFACE)) + if(MaskMatch(materialDef.mFlags, MaterialDefinition::SUBSURFACE)) { shaderDef.mDefines.push_back("SSS"); } - if (MaskMatch(receiver.mMaterialDef->mFlags, MaterialDefinition::GLTF_CHANNELS)) + if(MaskMatch(receiver.mMaterialDef->mFlags, MaterialDefinition::OCCLUSION)) + { + shaderDef.mDefines.push_back("OCCLUSION"); + } + + if(MaskMatch(receiver.mMaterialDef->mFlags, MaterialDefinition::GLTF_CHANNELS)) { shaderDef.mDefines.push_back("GLTF_CHANNELS"); } const auto& meshDef = *receiver.mMeshDef; - if (meshDef.IsSkinned()) + if(meshDef.IsSkinned()) { shaderDef.mDefines.push_back("SKINNING"); } - if (MaskMatch(meshDef.mFlags, MeshDefinition::FLIP_UVS_VERTICAL)) + if(MaskMatch(meshDef.mFlags, MeshDefinition::FLIP_UVS_VERTICAL)) { shaderDef.mDefines.push_back("FLIP_V"); } - if (meshDef.HasBlendShapes()) + if(meshDef.HasBlendShapes()) { bool hasPositions = false; - bool hasNormals = false; - bool hasTangents = false; + bool hasNormals = false; + bool hasTangents = false; RetrieveBlendShapeComponents(meshDef.mBlendShapes, hasPositions, hasNormals, hasTangents); - if (hasPositions) + if(hasPositions) { shaderDef.mDefines.push_back("MORPH_POSITION"); } - if (hasNormals) + if(hasNormals) { shaderDef.mDefines.push_back("MORPH_NORMAL"); } - if (hasTangents) + if(hasTangents) { shaderDef.mDefines.push_back("MORPH_TANGENT"); } - if (hasPositions || hasNormals || hasTangents) + if(hasPositions || hasNormals || hasTangents) { shaderDef.mDefines.push_back("MORPH"); - if (BlendShapes::Version::VERSION_2_0 == meshDef.mBlendShapeVersion) + if(BlendShapes::Version::VERSION_2_0 == meshDef.mBlendShapeVersion) { shaderDef.mDefines.push_back("MORPH_VERSION_2_0"); } } } - shaderDef.mUniforms["uMaxLOD"] = 6.f; + shaderDef.mUniforms["uMaxLOD"] = 6.f; shaderDef.mUniforms["uCubeMatrix"] = Matrix::IDENTITY; - Index result = resources.mShaders.size(); + Index result = resources.mShaders.size(); shaderMap[hash] = result; resources.mShaders.emplace_back(std::move(shaderDef), Shader()); @@ -275,5 +287,5 @@ Index ShaderDefinitionFactory::ProduceShader(const NodeDefinition& nodeDef) return result; } -} -} +} // namespace SceneLoader +} // namespace Dali