Skip to content
Snippets Groups Projects

Fixed MeshShaderBuilder for flat types

Merged Aaron Grabowy requested to merge feature/fix-shaderBuilder-flat-types into develop
2 files
+ 34
28
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -90,6 +90,12 @@ MeshShaderBuilder::Variable const* MeshShaderBuilder::findMatchingAttrOrUniform(
@@ -90,6 +90,12 @@ MeshShaderBuilder::Variable const* MeshShaderBuilder::findMatchingAttrOrUniform(
glow::SharedProgram MeshShaderBuilder::createProgram()
glow::SharedProgram MeshShaderBuilder::createProgram()
{
{
 
// Returns true, iff the given type is an int, unit, bool, or vector of these
 
auto isFlatType = [](std::string type) {
 
const auto fistLetter = type[0];
 
return fistLetter == 'i' || fistLetter == 'u' || fistLetter == 'b';
 
};
 
// Passthroughs
// Passthroughs
std::string vsPassthroughCode;
std::string vsPassthroughCode;
std::string gsPassthroughFunc = "#define PASSTHROUGH(vInIndex) "; // Function to call to pass the data for the vertex with the given index through
std::string gsPassthroughFunc = "#define PASSTHROUGH(vInIndex) "; // Function to call to pass the data for the vertex with the given index through
@@ -99,7 +105,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -99,7 +105,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
for (auto const& v : mInterfaceBlockVars)
for (auto const& v : mInterfaceBlockVars)
{
{
// Add declaration to interface block of all shaders
// Add declaration to interface block of all shaders
interfaceBlockContent += " " + v.type + " " + v.name + ";\n";
interfaceBlockContent += " " + std::string(isFlatType(v.type) ? "flat " : "") + v.type + " " + v.name + ";\n";
// Pass value from attribute if present
// Pass value from attribute if present
auto matching = findMatchingAttrOrUniform(v);
auto matching = findMatchingAttrOrUniform(v);
@@ -108,7 +114,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -108,7 +114,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
// Prefill the output with the value of the given vertex, not emitted yet
// Prefill the output with the value of the given vertex, not emitted yet
if (mGeometryShaderUsed) gsPassthroughFunc += "\\\n vOut." + v.name + " = vIn[vInIndex]." + v.name + ";";
if (mGeometryShaderUsed) gsPassthroughFunc += "\\\n vOut." + v.name + " = vIn[vInIndex]." + v.name + ";";
if (mGeometryShaderUsed) gsPassthroughMixFunc += " vOut." + v.name + " = mix(vIn[0]." + v.name + ", vIn[1]." + v.name + ", alpha);\n";
if (mGeometryShaderUsed && !isFlatType(v.type)) gsPassthroughMixFunc += " vOut." + v.name + " = mix(vIn[0]." + v.name + ", vIn[1]." + v.name + ", alpha);\n";
// Copy interface block to local variables so that they can be overridden by modular components
// Copy interface block to local variables so that they can be overridden by modular components
fsPassthroughCode += " " + v.type + " v" + v.name + " = vIn." + v.name + ";\n";
fsPassthroughCode += " " + v.type + " v" + v.name + " = vIn." + v.name + ";\n";
@@ -119,7 +125,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -119,7 +125,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
{
{
mGeometryShaderDecl = "in " + interfaceBlockContent + "} vIn[];\n"
mGeometryShaderDecl = "in " + interfaceBlockContent + "} vIn[];\n"
+ "out " + interfaceBlockContent + "} vOut;\n\n"
+ "out " + interfaceBlockContent + "} vOut;\n\n"
+ gsPassthroughFunc + "\n"
+ gsPassthroughFunc + "\n\n"
+ gsPassthroughMixFunc + "}\n\n"
+ gsPassthroughMixFunc + "}\n\n"
+ mGeometryShaderDecl;
+ mGeometryShaderDecl;
}
}
@@ -143,7 +149,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -143,7 +149,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
{
{
vsCode += uniformCode + "\n";
vsCode += uniformCode + "\n";
vsCode += attrCode + "\n";
vsCode += attrCode + "\n";
vsCode += mVertexShaderDecl + "\n";
vsCode += mVertexShaderDecl + "\n\n";
vsCode += "void main() {\n";
vsCode += "void main() {\n";
vsCode += vsPassthroughCode;
vsCode += vsPassthroughCode;
vsCode += mVertexShaderBody;
vsCode += mVertexShaderBody;
@@ -155,7 +161,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -155,7 +161,7 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
if (mGeometryShaderUsed)
if (mGeometryShaderUsed)
{
{
gsCode += uniformCode + "\n";
gsCode += uniformCode + "\n";
gsCode += mGeometryShaderDecl + "\n";
gsCode += mGeometryShaderDecl + "\n\n";
gsCode += "void main() {\n";
gsCode += "void main() {\n";
gsCode += mGeometryShaderBody;
gsCode += mGeometryShaderBody;
gsCode += "}\n";
gsCode += "}\n";
@@ -168,26 +174,25 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -168,26 +174,25 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
fsCode += mFragmentLocations + "\n";
fsCode += mFragmentLocations + "\n";
fsCode += mFragmentShaderDecl + "\n";
fsCode += mFragmentShaderDecl + "\n";
fsCode += R"(
fsCode += R"(
uint hash_combine(uint seed, uint h)
uint hash_combine(uint seed, uint h) {
{
return seed ^ h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
return seed ^ h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
}
uint wang_hash(uint seed) {
uint wang_hash(uint seed)
seed = (seed ^ 61) ^ (seed >> 16);
{
seed *= 9;
seed = (seed ^ 61) ^ (seed >> 16);
seed = seed ^ (seed >> 4);
seed *= 9;
seed *= 0x27d4eb2d;
seed = seed ^ (seed >> 4);
seed = seed ^ (seed >> 15);
seed *= 0x27d4eb2d;
return seed;
seed = seed ^ (seed >> 15);
}
return seed;
}
float wang_float(uint hash) {
return hash / float(0x7FFFFFFF) / 2.0;
float wang_float(uint hash)
}
{
return hash / float(0x7FFFFFFF) / 2.0;
}
)";
)";
fsCode += "void main() {\n";
fsCode += "void main() {\n";
fsCode += fsPassthroughCode;
fsCode += fsPassthroughCode;
fsCode += mFragmentShaderBody;
fsCode += mFragmentShaderBody;
@@ -195,7 +200,8 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
@@ -195,7 +200,8 @@ glow::SharedProgram MeshShaderBuilder::createProgram()
}
}
// glow::info() << "Vertex Shader:\n" << vsCode;
// glow::info() << "Vertex Shader:\n" << vsCode;
// glow::info() << "Geometry Shader:\n" << gsCode;
// if (mGeometryShaderUsed)
 
// glow::info() << "Geometry Shader:\n" << gsCode;
// glow::info() << "Fragment Shader:\n" << fsCode;
// glow::info() << "Fragment Shader:\n" << fsCode;
auto vs = Shader::createFromSource(GL_VERTEX_SHADER, vsCode);
auto vs = Shader::createFromSource(GL_VERTEX_SHADER, vsCode);
Loading