#include <dali-scene3d/internal/model-components/material-modify-observer.h>
#include <dali-scene3d/public-api/loader/node-definition.h>
#include <dali-scene3d/public-api/loader/renderer-state.h>
+#include <dali-scene3d/public-api/loader/shader-option.h>
#include <dali-scene3d/public-api/loader/utils.h>
namespace Dali
DALI_TYPE_REGISTRATION_BEGIN(Scene3D::Material, Dali::BaseHandle, Create);
DALI_TYPE_REGISTRATION_END()
+static constexpr uint32_t OFFSET_FOR_SHADOW_MAP_TEXTURE = 4u;
static constexpr uint32_t OFFSET_FOR_DIFFUSE_CUBE_TEXTURE = 2u;
static constexpr uint32_t OFFSET_FOR_SPECULAR_CUBE_TEXTURE = 1u;
static constexpr uint32_t INVALID_INDEX = 0u;
mTextureInformations[SPECULAR].mSemantic = Scene3D::Loader::MaterialDefinition::SPECULAR;
mTextureInformations[SPECULAR_COLOR].mSemantic = Scene3D::Loader::MaterialDefinition::SPECULAR_COLOR;
- mTextureInformations[BASE_COLOR].mDefineKeyword = "BASECOLOR_TEX";
- mTextureInformations[METALLIC_ROUGHNESS].mDefineKeyword = "METALLIC_ROUGHNESS_TEX";
- mTextureInformations[NORMAL].mDefineKeyword = "NORMAL_TEX";
- mTextureInformations[OCCLUSION].mDefineKeyword = "OCCLUSION";
- mTextureInformations[EMISSIVE].mDefineKeyword = "EMISSIVE";
- mTextureInformations[SPECULAR].mDefineKeyword = "MATERIAL_SPECULAR_TEXTURE";
- mTextureInformations[SPECULAR_COLOR].mDefineKeyword = "MATERIAL_SPECULAR_COLOR_TEXTURE";
+ mTextureInformations[BASE_COLOR].mShaderOptionType = Loader::ShaderOption::Type::BASE_COLOR_TEXTURE;
+ mTextureInformations[METALLIC_ROUGHNESS].mShaderOptionType = Loader::ShaderOption::Type::METALLIC_ROUGHNESS_TEXTURE;
+ mTextureInformations[NORMAL].mShaderOptionType = Loader::ShaderOption::Type::NORMAL_TEXTURE;
+ mTextureInformations[OCCLUSION].mShaderOptionType = Loader::ShaderOption::Type::OCCLUSION;
+ mTextureInformations[EMISSIVE].mShaderOptionType = Loader::ShaderOption::Type::EMISSIVE;
+ mTextureInformations[SPECULAR].mShaderOptionType = Loader::ShaderOption::Type::SPECULAR;
+ mTextureInformations[SPECULAR_COLOR].mShaderOptionType = Loader::ShaderOption::Type::SPECULAR_COLOR;
mTextureInformations[TextureIndex::EMISSIVE].mFactor = Vector4::ZERO;
}
return Dali::Sampler();
}
-std::string Material::GetVertexShader()
+Scene3D::Loader::ShaderOption Material::GetShaderOption() const
{
- return mShaderData.mVertexShaderSource;
-}
-
-std::string Material::GetFragmentShader()
-{
- return mShaderData.mFragmentShaderSource;
+ return mShaderOption;
}
void Material::Apply()
materialFlag |= textureInformation.mSemantic;
}
- if(mMaterialFlag != materialFlag || mShaderData.mVertexShaderSource.empty() || mShaderData.mFragmentShaderSource.empty())
+ if(mMaterialFlag != materialFlag)
{
mModifyFlag |= MaterialModifyObserver::ModifyFlag::SHADER;
- mMaterialFlag = materialFlag;
- mShaderData.mVertexShaderSource = SHADER_DEFAULT_PHYSICALLY_BASED_SHADER_VERT.data();
- mShaderData.mFragmentShaderSource = SHADER_DEFAULT_PHYSICALLY_BASED_SHADER_FRAG.data();
+ mMaterialFlag = materialFlag;
- std::vector<std::string> defines;
- defines.push_back(THREE_TEX_KEYWORD.data());
+ mShaderOption = Loader::ShaderOption();
for(auto&& textureInformation : mTextureInformations)
{
if(!textureInformation.mTexture)
{
continue;
}
- defines.push_back(textureInformation.mDefineKeyword);
+ mShaderOption.AddOption(textureInformation.mShaderOptionType);
}
- defines.push_back(GLTF_CHANNELS_KEYWORD.data());
-
- for(const auto& define : defines)
+ mShaderOption.AddOption(Loader::ShaderOption::Type::THREE_TEXTURE);
+ mShaderOption.AddOption(Loader::ShaderOption::Type::GLTF_CHANNELS);
+ if(materialFlag & Scene3D::Loader::MaterialDefinition::TRANSPARENCY)
{
- Scene3D::Loader::ShaderDefinition::ApplyDefine(mShaderData.mFragmentShaderSource, define);
+ mShaderOption.SetTransparency();
}
}
// Finish to make all the material flag according to the gltf2-util.
- // Then make defines as fallowing shader-definition-factory.
+ // Then make defines as fallowing shader-manager.
// The renderer State below can be used in primitive to set renderer properties.
renderer.RegisterProperty(Scene3D::Loader::NodeDefinition::GetIblScaleFactorUniformName().data(), 1.0f);
renderer.RegisterProperty(Scene3D::Loader::NodeDefinition::GetIblYDirectionUniformName().data(), Vector3(1.0f, -1.0, 1.0));
- std::string lightCountPropertyName(Scene3D::Internal::Light::GetLightCountUniformName());
- renderer.RegisterProperty(lightCountPropertyName, 0);
-
- uint32_t maxLightCount = Scene3D::Internal::Light::GetMaximumEnabledLightCount();
- for(uint32_t i = 0; i < maxLightCount; ++i)
- {
- std::string lightDirectionPropertyName(Scene3D::Internal::Light::GetLightDirectionUniformName());
- lightDirectionPropertyName += "[" + std::to_string(i) + "]";
- renderer.RegisterProperty(lightDirectionPropertyName, Vector3::ZAXIS);
-
- std::string lightColorPropertyName(Scene3D::Internal::Light::GetLightColorUniformName());
- lightColorPropertyName += "[" + std::to_string(i) + "]";
- renderer.RegisterProperty(lightColorPropertyName, Vector3(Color::WHITE));
- }
-
Scene3D::Loader::RendererState::Apply(mRendererState, renderer);
}
+uint32_t Material::GetShadowMapTextureOffset()
+{
+ return OFFSET_FOR_SHADOW_MAP_TEXTURE;
+}
+
uint32_t Material::GetSpecularImageBasedLightTextureOffset()
{
return OFFSET_FOR_SPECULAR_CUBE_TEXTURE;
mObserverNotifying = false;
// Resolve observer queue during notify
- mObservers.erase(std::remove_if(mObservers.begin(), mObservers.end(), [](auto& e) { return !e.second; }), mObservers.end());
+ mObservers.erase(std::remove_if(mObservers.begin(), mObservers.end(), [](auto& e)
+ { return !e.second; }),
+ mObservers.end());
}
}