summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/effectlib/customMaterial.glsllib13
-rw-r--r--src/runtimerender/Qt3DSRenderCustomMaterialShaderGenerator.cpp58
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 &parameter) {
+ 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) {