MaterialX 1.38.10
Loading...
Searching...
No Matches
ShaderGraph.h
Go to the documentation of this file.
1//
2// Copyright Contributors to the MaterialX Project
3// SPDX-License-Identifier: Apache-2.0
4//
5
6#ifndef MATERIALX_SHADERGRAPH_H
7#define MATERIALX_SHADERGRAPH_H
8
11
13
19
21#include <MaterialXCore/Node.h>
22
23MATERIALX_NAMESPACE_BEGIN
24
25class Syntax;
26class ShaderGraphEdge;
28class GenOptions;
29
33
37
39using ShaderGraphPtr = shared_ptr<class ShaderGraph>;
40
43class MX_GENSHADER_API ShaderGraph : public ShaderNode
44{
45 public:
47 ShaderGraph(const ShaderGraph* parent, const string& name, ConstDocumentPtr document, const StringSet& reservedWords);
48
50 virtual ~ShaderGraph() { }
51
54 static ShaderGraphPtr create(const ShaderGraph* parent, const string& name, ElementPtr element,
55 GenContext& context);
56
58 static ShaderGraphPtr create(const ShaderGraph* parent, const NodeGraph& nodeGraph,
59 GenContext& context);
60
62 bool isAGraph() const override { return true; }
63
65 ShaderNode* getNode(const string& name);
66
68 const ShaderNode* getNode(const string& name) const;
69
71 const vector<ShaderNode*>& getNodes() const { return _nodeOrder; }
72
74 size_t numInputSockets() const { return numOutputs(); }
75
77 size_t numOutputSockets() const { return numInputs(); }
78
80 ShaderGraphInputSocket* getInputSocket(size_t index) { return getOutput(index); }
81 ShaderGraphOutputSocket* getOutputSocket(size_t index = 0) { return getInput(index); }
82 const ShaderGraphInputSocket* getInputSocket(size_t index) const { return getOutput(index); }
83 const ShaderGraphOutputSocket* getOutputSocket(size_t index = 0) const { return getInput(index); }
84
86 ShaderGraphInputSocket* getInputSocket(const string& name) { return getOutput(name); }
87 ShaderGraphOutputSocket* getOutputSocket(const string& name) { return getInput(name); }
88 const ShaderGraphInputSocket* getInputSocket(const string& name) const { return getOutput(name); }
89 const ShaderGraphOutputSocket* getOutputSocket(const string& name) const { return getInput(name); }
90
92 const vector<ShaderGraphInputSocket*>& getInputSockets() const { return _outputOrder; }
93 const vector<ShaderGraphOutputSocket*>& getOutputSockets() const { return _inputOrder; }
94
96 void applyInputTransforms(ConstNodePtr node, ShaderNodePtr shaderNode, GenContext& context);
97
99 ShaderNode* createNode(ConstNodePtr node, GenContext& context);
100
102 ShaderGraphInputSocket* addInputSocket(const string& name, const TypeDesc* type);
103 ShaderGraphOutputSocket* addOutputSocket(const string& name, const TypeDesc* type);
104
106 void addDefaultGeomNode(ShaderInput* input, const GeomPropDef& geomprop, GenContext& context);
107
109 void topologicalSort();
110
112 static ShaderGraphEdgeIterator traverseUpstream(ShaderOutput* output);
113
115 IdentifierMap& getIdentifierMap() { return _identifiers; }
116
117 protected:
123 void createConnectedNodes(const ElementPtr& downstreamElement,
124 const ElementPtr& upstreamElement,
125 ElementPtr connectingElement,
126 GenContext& context);
127
129 void addNode(ShaderNodePtr node);
130
132 void addInputSockets(const InterfaceElement& elem, GenContext& context);
133
135 void addOutputSockets(const InterfaceElement& elem);
136
140 void addUpstreamDependencies(const Element& root, GenContext& context);
141
143 void addColorTransformNode(ShaderInput* input, const ColorSpaceTransform& transform, GenContext& context);
144
146 void addColorTransformNode(ShaderOutput* output, const ColorSpaceTransform& transform, GenContext& context);
147
149 void addUnitTransformNode(ShaderInput* input, const UnitTransform& transform, GenContext& context);
150
152 void addUnitTransformNode(ShaderOutput* output, const UnitTransform& transform, GenContext& context);
153
155 void finalize(GenContext& context);
156
158 void optimize(GenContext& context);
159
163 void bypass(GenContext& context, ShaderNode* node, size_t inputIndex, size_t outputIndex = 0);
164
168 void setVariableNames(GenContext& context);
169
172 void populateColorTransformMap(ColorManagementSystemPtr colorManagementSystem, ShaderPort* shaderPort,
173 const string& sourceColorSpace, const string& targetColorSpace, bool asInput);
174
177 void populateUnitTransformMap(UnitSystemPtr unitSystem, ShaderPort* shaderPort, ValueElementPtr element, const string& targetUnitSpace, bool asInput);
178
180 void disconnect(ShaderNode* node) const;
181
182 ConstDocumentPtr _document;
183 std::unordered_map<string, ShaderNodePtr> _nodeMap;
184 std::vector<ShaderNode*> _nodeOrder;
185 IdentifierMap _identifiers;
186
187 // Temporary storage for inputs that require color transformations
188 std::unordered_map<ShaderInput*, ColorSpaceTransform> _inputColorTransformMap;
189 // Temporary storage for inputs that require unit transformations
190 std::unordered_map<ShaderInput*, UnitTransform> _inputUnitTransformMap;
191
192 // Temporary storage for outputs that require color transformations
193 std::unordered_map<ShaderOutput*, ColorSpaceTransform> _outputColorTransformMap;
194 // Temporary storage for outputs that require unit transformations
195 std::unordered_map<ShaderOutput*, UnitTransform> _outputUnitTransformMap;
196};
197
200class MX_GENSHADER_API ShaderGraphEdge
201{
202 public:
204 upstream(up),
205 downstream(down)
206 {
207 }
208 ShaderOutput* upstream;
209 ShaderInput* downstream;
210};
211
214class MX_GENSHADER_API ShaderGraphEdgeIterator
215{
216 public:
219
220 bool operator==(const ShaderGraphEdgeIterator& rhs) const
221 {
222 return _upstream == rhs._upstream &&
223 _downstream == rhs._downstream &&
224 _stack == rhs._stack;
225 }
226 bool operator!=(const ShaderGraphEdgeIterator& rhs) const
227 {
228 return !(*this == rhs);
229 }
230
233 {
234 return ShaderGraphEdge(_upstream, _downstream);
235 }
236
239 ShaderGraphEdgeIterator& operator++();
240
243 {
244 return *this;
245 }
246
248 static const ShaderGraphEdgeIterator& end();
249
250 private:
251 void extendPathUpstream(ShaderOutput* upstream, ShaderInput* downstream);
252 void returnPathDownstream(ShaderOutput* upstream);
253
254 ShaderOutput* _upstream;
255 ShaderInput* _downstream;
256 using StackFrame = std::pair<ShaderOutput*, size_t>;
257 std::vector<StackFrame> _stack;
258 std::set<ShaderOutput*> _path;
259};
260
261MATERIALX_NAMESPACE_END
262
263#endif
Color management system classes.
shared_ptr< class ColorManagementSystem > ColorManagementSystemPtr
A shared pointer to a ColorManagementSystem.
Definition: ColorManagementSystem.h:25
The top-level Document class.
shared_ptr< const Document > ConstDocumentPtr
A shared pointer to a const Document.
Definition: Document.h:24
shared_ptr< Element > ElementPtr
A shared pointer to an Element.
Definition: Element.h:31
shared_ptr< ValueElement > ValueElementPtr
A shared pointer to a ValueElement.
Definition: Element.h:41
std::set< string > StringSet
A set of strings.
Definition: Library.h:61
Macros for declaring imported and exported symbols.
Node element subclasses.
shared_ptr< const Node > ConstNodePtr
A shared pointer to a const Node.
Definition: Node.h:26
shared_ptr< class ShaderGraph > ShaderGraphPtr
A shared pointer to a shader graph.
Definition: ShaderGraph.h:39
Classes for nodes created during shader generation.
shared_ptr< class ShaderNode > ShaderNodePtr
Shared pointer to a ShaderNode.
Definition: ShaderNode.h:35
Base class for syntax handling for shader generators.
std::unordered_map< string, size_t > IdentifierMap
Map holding identifier names and a counter for creating unique names from them.
Definition: Syntax.h:34
Type descriptor for a MaterialX data type.
Unit system classes.
shared_ptr< class UnitSystem > UnitSystemPtr
A shared pointer to a UnitSystem.
Definition: UnitSystem.h:26
The base class for MaterialX elements.
Definition: Element.h:80
A context class for shader generation.
Definition: GenContext.h:31
Class holding options to configure shader generation.
Definition: GenOptions.h:76
An element representing a declaration of geometric property data.
Definition: Geom.h:352
The base class for interface elements such as Node, NodeDef, and NodeGraph.
Definition: Interface.h:318
A node graph element within a Document.
Definition: Node.h:331
An edge returned during shader graph traversal.
Definition: ShaderGraph.h:201
Iterator class for traversing edges between nodes in a shader graph.
Definition: ShaderGraph.h:215
ShaderGraphEdge operator*() const
Dereference this iterator, returning the current output in the traversal.
Definition: ShaderGraph.h:232
ShaderGraphEdgeIterator & begin()
Return a reference to this iterator to begin traversal.
Definition: ShaderGraph.h:242
Class representing a graph (DAG) for shader generation.
Definition: ShaderGraph.h:44
virtual ~ShaderGraph()
Desctructor.
Definition: ShaderGraph.h:50
bool isAGraph() const override
Return true if this node is a graph.
Definition: ShaderGraph.h:62
size_t numInputSockets() const
Get number of input sockets.
Definition: ShaderGraph.h:74
const vector< ShaderGraphInputSocket * > & getInputSockets() const
Get vector of sockets.
Definition: ShaderGraph.h:92
ShaderGraphInputSocket * getInputSocket(size_t index)
Get socket by index.
Definition: ShaderGraph.h:80
IdentifierMap & getIdentifierMap()
Return the map of unique identifiers used in the scope of this graph.
Definition: ShaderGraph.h:115
size_t numOutputSockets() const
Get number of output sockets.
Definition: ShaderGraph.h:77
const vector< ShaderNode * > & getNodes() const
Get a vector of all nodes in order.
Definition: ShaderGraph.h:71
ShaderGraphInputSocket * getInputSocket(const string &name)
Get socket by name.
Definition: ShaderGraph.h:86
An input on a ShaderNode.
Definition: ShaderNode.h:264
Class representing a node in the shader generation DAG.
Definition: ShaderNode.h:326
static ShaderNodePtr create(const ShaderGraph *parent, const string &name, const NodeDef &nodeDef, GenContext &context)
Create a new node from a nodedef.
Definition: ShaderNode.cpp:165
ShaderInput * getInput(size_t index)
Get inputs/outputs by index.
Definition: ShaderNode.h:454
size_t numInputs() const
Get number of inputs/outputs.
Definition: ShaderNode.h:450
An output on a ShaderNode.
Definition: ShaderNode.h:301
An input or output port on a ShaderNode.
Definition: ShaderNode.h:123
Base class for syntax objects used by shader generators to emit code with correct syntax for each lan...
Definition: Syntax.h:40
A type descriptor for MaterialX data types.
Definition: TypeDesc.h:28
Structure that represents color space transform information.
Definition: ColorManagementSystem.h:30
Structure that represents unit transform information.
Definition: UnitSystem.h:31