Skip to content

Commit caa7dd0

Browse files
authored
Update C++ Hw nodes to use syntax types (#2625)
Update C++ Hw nodes to emit * The correct type names based on syntax. * Constant values based on the syntax. This makes the C++ generated code more portable - and reduces the need to post-process the generated shader source.
1 parent 09079b2 commit caa7dd0

10 files changed

Lines changed: 74 additions & 33 deletions

source/MaterialXGenHw/HwConstants.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ const string USER_DATA_LIGHT_SHADERS = "udls";
164164
const string USER_DATA_BINDING_CONTEXT = "udbinding";
165165

166166
const TypeDesc ClosureDataType = TypeDesc("ClosureData", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_NONE, 1, 0);
167+
168+
const TypedValue<Vector2> VEC2_ZERO = TypedValue(Vector2(0.f, 0.f));
169+
const TypedValue<Vector2> VEC2_ONE = TypedValue(Vector2(1.f, 1.f));
170+
const TypedValue<Vector3> VEC3_ZERO = TypedValue(Vector3(0.f, 0.f, 0.f));
171+
const TypedValue<Vector3> VEC3_ONE = TypedValue(Vector3(1.f, 1.f, 1.f));
172+
167173
} // namespace HW
168174

169175
MATERIALX_NAMESPACE_END

source/MaterialXGenHw/HwConstants.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#include <MaterialXGenHw/Export.h>
1313

14+
#include <MaterialXCore/Value.h>
15+
1416
MATERIALX_NAMESPACE_BEGIN
1517

1618
/*
@@ -247,6 +249,13 @@ extern MX_GENHW_API const string USER_DATA_BINDING_CONTEXT;
247249

248250
/// Type Descriptor for closure context data.
249251
extern MX_GENHW_API const TypeDesc ClosureDataType;
252+
253+
/// Constant Values
254+
extern MX_GENHW_API const TypedValue<Vector2> VEC2_ZERO;
255+
extern MX_GENHW_API const TypedValue<Vector2> VEC2_ONE;
256+
extern MX_GENHW_API const TypedValue<Vector3> VEC3_ZERO;
257+
extern MX_GENHW_API const TypedValue<Vector3> VEC3_ONE;
258+
250259
} // namespace HW
251260

252261
MATERIALX_NAMESPACE_END

source/MaterialXGenHw/Nodes/HwBitangentNode.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ void HwBitangentNode::emitFunctionCall(const ShaderNode& node, GenContext& conte
5858
{
5959
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
6060
const GenOptions& options = context.getOptions();
61+
const Syntax& syntax = shadergen.getSyntax();
62+
63+
const string& vec4 = syntax.getTypeName(Type::VECTOR4);
6164

6265
const ShaderInput* spaceInput = node.getInput(SPACE);
6366
const int space = spaceInput ? spaceInput->getValue()->asA<int>() : OBJECT_SPACE;
@@ -80,19 +83,19 @@ void HwBitangentNode::emitFunctionCall(const ShaderNode& node, GenContext& conte
8083
if (!normal->isEmitted())
8184
{
8285
normal->setEmitted();
83-
shadergen.emitLine(prefix + normal->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", vec4(" + HW::T_IN_NORMAL + ", 0.0)).xyz)", stage);
86+
shadergen.emitLine(prefix + normal->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", "+vec4+"(" + HW::T_IN_NORMAL + ", 0.0)).xyz)", stage);
8487
}
8588
ShaderPort* tangent = vertexData[HW::T_TANGENT_WORLD];
8689
if (!tangent->isEmitted())
8790
{
8891
tangent->setEmitted();
89-
shadergen.emitLine(prefix + tangent->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_MATRIX + ", vec4(" + HW::T_IN_TANGENT + ", 0.0)).xyz)", stage);
92+
shadergen.emitLine(prefix + tangent->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_MATRIX + ", "+vec4+"(" + HW::T_IN_TANGENT + ", 0.0)).xyz)", stage);
9093
}
9194
shadergen.emitLine(prefix + bitangent->getVariable() + " = cross(" + prefix + normal->getVariable() + ", " + prefix + tangent->getVariable() + ")", stage);
9295
}
9396
else
9497
{
95-
shadergen.emitLine(prefix + bitangent->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_MATRIX + ", vec4(" + HW::T_IN_BITANGENT + ", 0.0)).xyz)", stage);
98+
shadergen.emitLine(prefix + bitangent->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_MATRIX + ", "+vec4+"(" + HW::T_IN_BITANGENT + ", 0.0)).xyz)", stage);
9699
}
97100
}
98101
}

source/MaterialXGenHw/Nodes/HwLightCompoundNode.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,24 @@ void HwLightCompoundNode::emitFunctionDefinition(const ShaderNode& /*node*/, Gen
6161
DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
6262
{
6363
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
64+
const Syntax& syntax = shadergen.getSyntax();
65+
66+
const string& vec3 = syntax.getTypeName(Type::VECTOR3);
67+
const string& out_lightshader = syntax.getOutputTypeName(Type::LIGHTSHADER);
68+
const string vec3_zero = syntax.getValue(Type::VECTOR3, HW::VEC3_ZERO);
6469

6570
// Emit functions for all child nodes
6671
shadergen.emitFunctionDefinitions(*_rootGraph, context, stage);
6772

68-
shadergen.emitLine("void " + _functionName + "(LightData light, vec3 position, out lightshader result)", stage, false);
73+
shadergen.emitLine("void " + _functionName + "(LightData light, "+vec3+" position, "+out_lightshader+" result)", stage, false);
6974

7075
shadergen.emitFunctionBodyBegin(*_rootGraph, context, stage);
7176

7277
// Emit all texturing nodes. These are inputs to any
7378
// closure/shader nodes and need to be emitted first.
7479
shadergen.emitFunctionCalls(*_rootGraph, context, stage, ShaderNode::Classification::TEXTURE);
7580

76-
shadergen.emitLine("ClosureData closureData = makeClosureData(CLOSURE_TYPE_EMISSION, vec3(0), -L, light.direction, vec3(0), 0)", stage);
81+
shadergen.emitLine("ClosureData closureData = makeClosureData(CLOSURE_TYPE_EMISSION, "+vec3_zero+", -L, light.direction, "+vec3_zero+", 0)", stage);
7782
shadergen.emitFunctionCalls(*_rootGraph, context, stage, ShaderNode::Classification::SHADER | ShaderNode::Classification::LIGHT);
7883

7984
shadergen.emitFunctionBodyEnd(*_rootGraph, context, stage);

source/MaterialXGenHw/Nodes/HwLightNode.cpp

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,6 @@
1212

1313
MATERIALX_NAMESPACE_BEGIN
1414

15-
namespace
16-
{
17-
18-
const string LIGHT_DIRECTION_CALCULATION =
19-
"vec3 L = light.position - position;\n"
20-
"float distance = length(L);\n"
21-
"L /= distance;\n"
22-
"result.direction = L;\n";
23-
24-
} // anonymous namespace
25-
2615
HwLightNode::HwLightNode()
2716
{
2817
}
@@ -51,8 +40,15 @@ void HwLightNode::emitFunctionCall(const ShaderNode& node, GenContext& context,
5140
DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
5241
{
5342
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
43+
const Syntax& syntax = shadergen.getSyntax();
44+
45+
const string& vec3 = syntax.getTypeName(Type::VECTOR3);
46+
const string vec3_zero = syntax.getValue(Type::VECTOR3, HW::VEC3_ZERO);
5447

55-
shadergen.emitBlock(LIGHT_DIRECTION_CALCULATION, FilePath(), context, stage);
48+
shadergen.emitLine(vec3+" L = light.position - position", stage);
49+
shadergen.emitLine("float distance = length(L)", stage);
50+
shadergen.emitLine("L /= distance", stage);
51+
shadergen.emitLine("result.direction = L", stage);
5652
shadergen.emitLineBreak(stage);
5753

5854
const ShaderInput* edfInput = node.getInput("edf");
@@ -61,7 +57,7 @@ void HwLightNode::emitFunctionCall(const ShaderNode& node, GenContext& context,
6157
{
6258

6359
shadergen.emitScopeBegin(stage);
64-
shadergen.emitLine("ClosureData closureData = makeClosureData(CLOSURE_TYPE_EMISSION, vec3(0), -L, light.direction, vec3(0), 0)", stage);
60+
shadergen.emitLine("ClosureData closureData = makeClosureData(CLOSURE_TYPE_EMISSION, "+vec3_zero+", -L, light.direction, "+vec3_zero+", 0)", stage);
6561
shadergen.emitFunctionCall(*edf, context, stage);
6662
shadergen.emitScopeEnd(stage);
6763
shadergen.emitLineBreak(stage);
@@ -89,7 +85,7 @@ void HwLightNode::emitFunctionCall(const ShaderNode& node, GenContext& context,
8985
}
9086
else
9187
{
92-
shadergen.emitLine("result.intensity = vec3(0.0)", stage);
88+
shadergen.emitLine("result.intensity = "+vec3_zero, stage);
9389
}
9490
}
9591
}

source/MaterialXGenHw/Nodes/HwLightSamplerNode.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,17 @@ void HwLightSamplerNode::emitFunctionDefinition(const ShaderNode& node, GenConte
3333
DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
3434
{
3535
const ShaderGenerator& shadergen = context.getShaderGenerator();
36+
const Syntax& syntax = shadergen.getSyntax();
37+
38+
const string& vec3 = syntax.getTypeName(Type::VECTOR3);
39+
const string& out_lightshader = syntax.getOutputTypeName(Type::LIGHTSHADER);
40+
const string vec3_zero = syntax.getValue(Type::VECTOR3, HW::VEC3_ZERO);
3641

3742
// Emit light sampler function with all bound light types
38-
shadergen.emitLine(SAMPLE_LIGHTS_FUNC_SIGNATURE, stage, false);
43+
shadergen.emitLine("void sampleLightSource(LightData light, "+vec3+" position, "+out_lightshader+" result)", stage, false);
3944
shadergen.emitFunctionBodyBegin(node, context, stage);
40-
shadergen.emitLine("result.intensity = vec3(0.0)", stage);
41-
shadergen.emitLine("result.direction = vec3(0.0)", stage);
45+
shadergen.emitLine("result.intensity = "+vec3_zero, stage);
46+
shadergen.emitLine("result.direction = "+vec3_zero, stage);
4247

4348
HwLightShadersPtr lightShaders = context.getUserData<HwLightShaders>(HW::USER_DATA_LIGHT_SHADERS);
4449
if (lightShaders)

source/MaterialXGenHw/Nodes/HwNormalNode.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ void HwNormalNode::createVariables(const ShaderNode& node, GenContext&, Shader&
4040
void HwNormalNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
4141
{
4242
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
43+
const Syntax& syntax = shadergen.getSyntax();
44+
45+
const string& vec4 = syntax.getTypeName(Type::VECTOR4);
4346

4447
const ShaderInput* spaceInput = node.getInput(SPACE);
4548
const int space = spaceInput ? spaceInput->getValue()->asA<int>() : OBJECT_SPACE;
@@ -54,7 +57,7 @@ void HwNormalNode::emitFunctionCall(const ShaderNode& node, GenContext& context,
5457
if (!normal->isEmitted())
5558
{
5659
normal->setEmitted();
57-
shadergen.emitLine(prefix + normal->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", vec4(" + HW::T_IN_NORMAL + ", 0.0)).xyz)", stage);
60+
shadergen.emitLine(prefix + normal->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", "+vec4+"(" + HW::T_IN_NORMAL + ", 0.0)).xyz)", stage);
5861
}
5962
}
6063
else

source/MaterialXGenHw/Nodes/HwSurfaceNode.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ void HwSurfaceNode::createVariables(const ShaderNode&, GenContext& context, Shad
4848
void HwSurfaceNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
4949
{
5050
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
51+
const Syntax& syntax = shadergen.getSyntax();
52+
53+
const string& vec2 = syntax.getTypeName(Type::VECTOR2);
54+
const string& vec3 = syntax.getTypeName(Type::VECTOR3);
55+
const string vec2_zero = syntax.getValue(Type::VECTOR2, HW::VEC3_ZERO);
56+
const string vec2_one = syntax.getValue(Type::VECTOR2, HW::VEC3_ONE);
57+
const string vec3_zero = syntax.getValue(Type::VECTOR3, HW::VEC3_ZERO);
58+
const string vec3_one = syntax.getValue(Type::VECTOR3, HW::VEC3_ONE);
5159

5260
DEFINE_SHADER_STAGE(stage, Stage::VERTEX)
5361
{
@@ -63,7 +71,7 @@ void HwSurfaceNode::emitFunctionCall(const ShaderNode& node, GenContext& context
6371
if (!normal->isEmitted())
6472
{
6573
normal->setEmitted();
66-
shadergen.emitLine(prefix + normal->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", vec4(" + HW::T_IN_NORMAL + ", 0)).xyz)", stage);
74+
shadergen.emitLine(prefix + normal->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", "+syntax.getTypeName(Type::VECTOR4)+"(" + HW::T_IN_NORMAL + ", 0)).xyz)", stage);
6775
}
6876
if (context.getOptions().hwAmbientOcclusion)
6977
{
@@ -89,10 +97,10 @@ void HwSurfaceNode::emitFunctionCall(const ShaderNode& node, GenContext& context
8997

9098
shadergen.emitScopeBegin(stage);
9199

92-
shadergen.emitLine("vec3 N = normalize(" + prefix + HW::T_NORMAL_WORLD + ")", stage);
93-
shadergen.emitLine("vec3 V = normalize(" + HW::T_VIEW_POSITION + " - " + prefix + HW::T_POSITION_WORLD + ")", stage);
94-
shadergen.emitLine("vec3 P = " + prefix + HW::T_POSITION_WORLD, stage);
95-
shadergen.emitLine("vec3 L = vec3(0,0,0);", stage);
100+
shadergen.emitLine(vec3+" N = normalize(" + prefix + HW::T_NORMAL_WORLD + ")", stage);
101+
shadergen.emitLine(vec3+" V = normalize(" + HW::T_VIEW_POSITION + " - " + prefix + HW::T_POSITION_WORLD + ")", stage);
102+
shadergen.emitLine(vec3+" P = " + prefix + HW::T_POSITION_WORLD, stage);
103+
shadergen.emitLine(vec3+" L = "+vec3_zero, stage);
96104
shadergen.emitLine("float occlusion = 1.0", stage);
97105
shadergen.emitLineBreak(stage);
98106

@@ -127,10 +135,10 @@ void HwSurfaceNode::emitFunctionCall(const ShaderNode& node, GenContext& context
127135
if (context.getOptions().hwAmbientOcclusion)
128136
{
129137
ShaderPort* texcoord = vertexData[HW::T_TEXCOORD + "_0"];
130-
shadergen.emitLine("vec2 ambOccUv = " + prefix + texcoord->getVariable(), stage);
138+
shadergen.emitLine(vec2+" ambOccUv = " + prefix + texcoord->getVariable(), stage);
131139
if (context.getOptions().fileTextureVerticalFlip)
132140
{
133-
shadergen.emitLine("ambOccUv = vec2(ambOccUv.x, 1.0 - ambOccUv.y)", stage);
141+
shadergen.emitLine("ambOccUv = "+vec2+"(ambOccUv.x, 1.0 - ambOccUv.y)", stage);
134142
}
135143
shadergen.emitLine("occlusion = mix(1.0, texture(" + HW::T_AMB_OCC_MAP + ", ambOccUv).x, " + HW::T_AMB_OCC_GAIN + ")", stage);
136144
}
@@ -219,7 +227,7 @@ void HwSurfaceNode::emitFunctionCall(const ShaderNode& node, GenContext& context
219227
shadergen.emitComment("Compute and apply surface opacity", stage);
220228
shadergen.emitScopeBegin(stage);
221229
shadergen.emitLine(outColor + " *= surfaceOpacity", stage);
222-
shadergen.emitLine(outTransparency + " = mix(vec3(1.0), " + outTransparency + ", surfaceOpacity)", stage);
230+
shadergen.emitLine(outTransparency + " = mix("+vec3_one+", " + outTransparency + ", surfaceOpacity)", stage);
223231
shadergen.emitScopeEnd(stage);
224232
}
225233

source/MaterialXGenHw/Nodes/HwTangentNode.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ void HwTangentNode::createVariables(const ShaderNode& node, GenContext&, Shader&
4040
void HwTangentNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
4141
{
4242
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
43+
const Syntax& syntax = shadergen.getSyntax();
44+
45+
const string& vec4 = syntax.getTypeName(Type::VECTOR4);
4346

4447
const ShaderInput* spaceInput = node.getInput(SPACE);
4548
const int space = spaceInput ? spaceInput->getValue()->asA<int>() : OBJECT_SPACE;
@@ -54,7 +57,7 @@ void HwTangentNode::emitFunctionCall(const ShaderNode& node, GenContext& context
5457
if (!tangent->isEmitted())
5558
{
5659
tangent->setEmitted();
57-
shadergen.emitLine(prefix + tangent->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_MATRIX + ", vec4(" + HW::T_IN_TANGENT + ", 0.0)).xyz)", stage);
60+
shadergen.emitLine(prefix + tangent->getVariable() + " = normalize(mx_matrix_mul(" + HW::T_WORLD_MATRIX + ", "+vec4+"(" + HW::T_IN_TANGENT + ", 0.0)).xyz)", stage);
5861
}
5962
}
6063
else

source/MaterialXGenHw/Nodes/HwViewDirectionNode.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ void HwViewDirectionNode::createVariables(const ShaderNode& node, GenContext&, S
3838
void HwViewDirectionNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
3939
{
4040
const HwShaderGenerator& shadergen = static_cast<const HwShaderGenerator&>(context.getShaderGenerator());
41+
const Syntax& syntax = shadergen.getSyntax();
42+
43+
const string& vec4 = syntax.getTypeName(Type::VECTOR4);
4144

4245
const ShaderInput* spaceInput = node.getInput(SPACE);
4346
const int space = spaceInput ? spaceInput->getValue()->asA<int>() : OBJECT_SPACE;
@@ -67,7 +70,7 @@ void HwViewDirectionNode::emitFunctionCall(const ShaderNode& node, GenContext& c
6770
}
6871
else
6972
{
70-
shadergen.emitString(" = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", vec4(" + prefix + position->getVariable() + " - " + HW::T_VIEW_POSITION + ", 0.0)).xyz)", stage);
73+
shadergen.emitString(" = normalize(mx_matrix_mul(" + HW::T_WORLD_INVERSE_TRANSPOSE_MATRIX + ", "+vec4+"(" + prefix + position->getVariable() + " - " + HW::T_VIEW_POSITION + ", 0.0)).xyz)", stage);
7174
}
7275
shadergen.emitLineEnd(stage);
7376
}

0 commit comments

Comments
 (0)