diff options
-rw-r--r-- | res/effectlib/customMaterial.glsllib | 13 | ||||
-rw-r--r-- | src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp | 58 |
2 files changed, 56 insertions, 15 deletions
diff --git a/res/effectlib/customMaterial.glsllib b/res/effectlib/customMaterial.glsllib index 9f7ae77..d6f392e 100644 --- a/res/effectlib/customMaterial.glsllib +++ b/res/effectlib/customMaterial.glsllib @@ -31,19 +31,6 @@ #ifndef CUSTOM_MATERIAL_GLSLLIB #define CUSTOM_MATERIAL_GLSLLIB 1 -#define SNAPPER_SAMPLER2D(samplerName, samplerNiceName, texFilter, texWrap, showUI ) \ - uniform sampler2D samplerName; \ - uniform vec3 samplerName##TransformU; \ - uniform vec3 samplerName##TransformV; \ - vec3 texcoordTransformed_##samplerName(vec3 coord) \ - { \ - return vec3(dot(samplerName##TransformU, coord), dot(samplerName##TransformV, coord), coord.z); \ - } \ - vec4 sampleTransformed_##samplerName(vec3 coord) \ - { \ - return texture(samplerName, texcoordTransformed_##samplerName(coord).xy); \ - } - // some useful defines #ifndef PI #define PI 3.14159265358979 diff --git a/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp index a09a896..69b357d 100644 --- a/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp +++ b/src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp @@ -497,6 +497,56 @@ struct SShaderGenerator : public ICustomMaterialShaderGenerator return pCB; } + QStringList getParameters(const QString &str, int begin, int end) + { + const QString s = str.mid(begin, end - begin + 1); + return s.split(","); + } + + void insertSnapperDirectives(QString &str) + { + int beginIndex = 0; + // Snapper macros: + // uniform sampler2D samplerName; \ + // uniform vec3 samplerName##TransformU; \ + // uniform vec3 samplerName##TransformV; \ + // vec3 texcoordTransformed_##samplerName(vec3 coord) \ + // { \ + // return vec3(dot(samplerName##TransformU, coord), dot(samplerName##TransformV, coord), coord.z); \ + // } \ + // vec4 sampleTransformed_##samplerName(vec3 coord) \ + // { \ + // return texture(samplerName, texcoordTransformed_##samplerName(coord).xy); \ + // } + QString snapperSampler = QStringLiteral("SNAPPER_SAMPLER2D("); + QString endingBracket = QStringLiteral(")"); + + const auto insertSnapperStr = [](const QString ¶meter) { + QString insertStr; + QTextStream stream(&insertStr); + stream << "uniform sampler2D " << parameter << ";\n"; + stream << "uniform vec3 " << parameter << "TransformU;\n"; + stream << "uniform vec3 " << parameter << "TransformV;\n"; + stream << "vec3 texcoordTransformed_" << parameter << "(vec3 coord) {" + << "return vec3(dot(" << parameter << "TransformU, coord), dot(" << parameter + << "TransformV, coord), coord.z); }"; + stream << "vec4 sampleTransformed_" << parameter << "(vec3 coord)" + << "{ return texture(" << parameter << ", texcoordTransformed_" << parameter + << "(coord).xy); }"; + return insertStr; + }; + + while ((beginIndex = str.indexOf(snapperSampler, beginIndex)) >= 0) { + int endIndex = str.indexOf(endingBracket, beginIndex); + const QStringList list = getParameters(str, beginIndex + snapperSampler.length(), + endIndex); + str.remove(beginIndex, endIndex - beginIndex + 1); + if (list.size() == 5) + str.insert(beginIndex, insertSnapperStr(list[0])); + } + } + + bool GenerateVertexShader(SShaderDefaultMaterialKey &, const char8_t *inShaderPathName) { qt3ds::render::IDynamicObjectSystem &theDynamicSystem( @@ -505,7 +555,9 @@ struct SShaderGenerator : public ICustomMaterialShaderGenerator theDynamicSystem.GetShaderSource( m_RenderContext.GetStringTable().RegisterStr(inShaderPathName), theShaderBuffer); - eastl::string srcString(theShaderBuffer.c_str()); + QString str = QString::fromLatin1(theShaderBuffer.c_str()); + insertSnapperDirectives(str); + eastl::string srcString(str.toLatin1().constData()); // Check if the vertex shader portion already contains a main function // The same string contains both the vertex and the fragment shader @@ -1075,7 +1127,9 @@ struct SShaderGenerator : public ICustomMaterialShaderGenerator IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator()); IShaderStageGenerator &fragmentShader(FragmentGenerator()); - eastl::string srcString(theShaderBuffer.c_str()); + QString str = QString::fromLatin1(theShaderBuffer.c_str()); + insertSnapperDirectives(str); + eastl::string srcString(str.toLatin1().constData()); if (m_RenderContext.GetRenderContext().GetRenderContextType() == NVRenderContextValues::GLES2) { |