X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-scene3d%2Fpublic-api%2Floader%2Fshader-definition.cpp;h=5aba19e7613a7f0196793f6537469ddb35ebde9c;hb=1434ecb57e5f91a5d5dddb4493963db58837d0a3;hp=49ff8853e686048d5af292e9d08b0a97e902958f;hpb=33dd6767e0655e39cffbb14f22da356cef20687d;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-scene3d/public-api/loader/shader-definition.cpp b/dali-scene3d/public-api/loader/shader-definition.cpp index 49ff885..5aba19e 100644 --- a/dali-scene3d/public-api/loader/shader-definition.cpp +++ b/dali-scene3d/public-api/loader/shader-definition.cpp @@ -20,11 +20,21 @@ // EXTERNAL INCLUDES #include +#include // INTERNAL INCLUDES #include #include +#include + +namespace +{ +#if defined(DEBUG_ENABLED) +Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_MODEL_SHADER_DEFINITION"); +#endif +} // namespace + namespace Dali::Scene3D::Loader { namespace @@ -44,7 +54,7 @@ ShaderDefinition::ShaderDefinition(const ShaderDefinition& other) { } -void ShaderDefinition::ApplyDefine(std::string& shaderCode, const std::string& definevar) +void ApplyDefine(std::string& shaderCode, const std::string& definevar) { const std::string IF_1 = "#if 1"; @@ -79,6 +89,39 @@ void ShaderDefinition::ApplyDefine(std::string& shaderCode, const std::string& d } } +void RedefineMacro(std::string& shaderCode, const std::string& macro, const std::string& value) +{ + if(!value.empty()) + { + std::string definition = "#define " + macro; + std::size_t found = shaderCode.find(definition); + if(found != std::string::npos) + { + std::size_t insertionPoint = found + definition.length(); + + // Automatically insert line-continuation character into value + std::regex re("\n"); + std::sregex_token_iterator first{value.begin(), value.end(), re, -1}, last; + for(auto i = first; i != last; ++i) + { + std::string line = std::string(" \\\n") + (*i).str(); + shaderCode.insert(insertionPoint, line); + insertionPoint += line.length(); + } + } + } + else + { + std::size_t invocation = shaderCode.rfind(macro); + if(invocation != std::string::npos) + { + std::size_t start = shaderCode.rfind("\n", invocation); + std::size_t end = shaderCode.find("\n", invocation); + shaderCode.erase(start, end - start); + } + } +} + ShaderDefinition::RawData ShaderDefinition::LoadRaw(const std::string& shadersPath) const { @@ -117,6 +160,12 @@ ShaderDefinition::LoadRaw(const std::string& shadersPath) const ApplyDefine(raw.mFragmentShaderSource, definevar); ApplyDefine(raw.mShadowVertexShaderSource, definevar); } + for(const auto& macroDef : mMacros) + { + RedefineMacro(raw.mVertexShaderSource, macroDef.macro, macroDef.definition); + RedefineMacro(raw.mFragmentShaderSource, macroDef.macro, macroDef.definition); + RedefineMacro(raw.mShadowVertexShaderSource, macroDef.macro, macroDef.definition); + } } return raw; @@ -151,6 +200,7 @@ Shader ShaderDefinition::Load(RawData&& raw) const array.PushBack(map[0]); array.PushBack(map[1]); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Vert Shader src: \n%s\n", raw.mVertexShaderSource.c_str()); Shader shader = Shader::New(array); for(Property::Map::SizeType i0 = 0, i1 = mUniforms.Count(); i0 != i1; ++i0) {