X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-scene-loader%2Fpublic-api%2Fshader-definition-factory.cpp;h=6f9ab4e5c65ac6cd69d6ca524312a0a8dc1bec99;hp=f0a2ad8d8843640f8679d5b75745a9520703c892;hb=38f0ea9fcdf1dc5037144fa19c8a52316c8af763;hpb=02557f62f8d171115d885c87c138faec2a3cb923 diff --git a/dali-scene-loader/public-api/shader-definition-factory.cpp b/dali-scene-loader/public-api/shader-definition-factory.cpp index f0a2ad8..6f9ab4e 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,41 +29,40 @@ 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; } } }; -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(); } } @@ -71,71 +70,78 @@ uint64_t HashNode(const NodeDefinition& nodeDef, const MaterialDefinition& mater { Hash hash; - // note: could be per vertex / fragment component - in WatchViewer, these have the same name. - hash.Add(PBR_SHADER_NAME); - 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::EMISSIVE)) { - hash.Add("SKIN"/*NING*/); + hash.Add("EMIS" /*SIVE*/); } - if (MaskMatch(meshDef.mFlags, MeshDefinition::FLIP_UVS_VERTICAL)) + if(MaskMatch(materialDef.mFlags, MaterialDefinition::GLTF_CHANNELS)) { - hash.Add("FLIP"/*_V*/); + hash.Add("GLTF" /*_CHANNELS*/); } - if (meshDef.HasBlendShapes()) + if(meshDef.IsSkinned()) + { + hash.Add("SKIN" /*NING*/); + } + + 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,115 @@ 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.mFragmentShaderPath = PBR_SHADER_NAME + ".fsh"; - shaderDef.mRendererState = RendererState::DEPTH_TEST | RendererState::DEPTH_WRITE | RendererState::CULL_BACK; + shaderDef.mUseBuiltInShader = true; + 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(materialDef.mFlags, MaterialDefinition::OCCLUSION)) + { + shaderDef.mDefines.push_back("OCCLUSION"); + } + + if(MaskMatch(materialDef.mFlags, MaterialDefinition::EMISSIVE)) + { + shaderDef.mDefines.push_back("EMISSIVE"); + } + + if(MaskMatch(materialDef.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 +291,5 @@ Index ShaderDefinitionFactory::ProduceShader(const NodeDefinition& nodeDef) return result; } -} -} +} // namespace SceneLoader +} // namespace Dali