6#ifndef MATERIALX_GENCONTEXT_H
7#define MATERIALX_GENCONTEXT_H
20MATERIALX_NAMESPACE_BEGIN
58 _sourceCodeSearchPath.append(path);
65 _sourceCodeSearchPath.append(path);
84 _reservedWords.insert(names.begin(), names.end());
91 return _reservedWords;
110 _closureContexts.push_back(cct);
116 if (_closureContexts.size())
118 _closureContexts.pop_back();
125 return _closureContexts.size() ? _closureContexts.back() :
nullptr;
131 _parentNodes.push_back(node);
137 _parentNodes.pop_back();
150 auto it = _userData.find(name);
151 if (it != _userData.end())
153 it->second.push_back(data);
157 _userData[name] = { data };
164 auto it = _userData.find(name);
165 if (it != _userData.end())
167 it->second.pop_back();
179 auto it = _userData.find(name);
180 return it != _userData.end() && !it->second.empty() ? it->second.back()->asA<T>() :
nullptr;
214 _applicationVariableHandler = handler;
220 return _applicationVariableHandler;
231 std::unordered_map<string, ShaderNodeImplPtr> _nodeImpls;
232 std::unordered_map<string, vector<GenUserDataPtr>> _userData;
233 std::unordered_map<const ShaderInput*, string> _inputSuffix;
234 std::unordered_map<const ShaderOutput*, string> _outputSuffix;
236 vector<ClosureContext*> _closureContexts;
237 vector<ConstNodePtr> _parentNodes;
270 _arguments[nodeType].push_back(arg);
272 [[deprecated]]
void addArgument(
const TypeDesc* nodeType,
const Argument& arg) { addArgument(*nodeType, arg); }
277 auto it = _arguments.find(nodeType);
278 return it != _arguments.end() ? it->second : EMPTY_ARGUMENTS;
280 [[deprecated]]
const Arguments& getArguments(
const TypeDesc* nodeType)
const {
return getArguments(*nodeType); }
285 _suffix[nodeType] = suffix;
287 [[deprecated]]
void setSuffix(
const TypeDesc* nodeType,
const string& suffix) { setSuffix(*nodeType, suffix); }
292 auto it = _suffix.find(nodeType);
293 return it != _suffix.end() ? it->second : EMPTY_STRING;
295 [[deprecated]]
const string& getSuffix(
const TypeDesc* nodeType)
const {
return getSuffix(*nodeType); }
302 _params[closure] = params;
306 _params.erase(closure);
314 auto it = _params.find(closure);
315 return it != _params.end() ? it->second :
nullptr;
320 std::unordered_map<TypeDesc, Arguments, TypeDesc::Hasher> _arguments;
321 std::unordered_map<TypeDesc, string, TypeDesc::Hasher> _suffix;
322 std::unordered_map<const ShaderNode*, const ClosureParams*> _params;
324 static const Arguments EMPTY_ARGUMENTS;
362MATERIALX_NAMESPACE_END
Cross-platform support for file and search paths.
std::function< void(ShaderNode *, GenContext &)> ApplicationVariableHandler
A standard function to allow for handling of application variables for a given node.
Definition: GenContext.h:25
Shader generation options class.
User data base class for shader generation.
std::shared_ptr< GenUserData > GenUserDataPtr
Shared pointer to a GenUserData.
Definition: GenUserData.h:19
std::set< string > StringSet
A set of strings.
Definition: Library.h:59
Macros for declaring imported and exported symbols.
shared_ptr< ShaderNodeImpl > ShaderNodeImplPtr
Shared pointer to a ShaderNodeImpl.
Definition: Library.h:40
shared_ptr< ShaderGenerator > ShaderGeneratorPtr
Shared pointer to a ShaderGenerator.
Definition: Library.h:38
shared_ptr< const Node > ConstNodePtr
A shared pointer to a const Node.
Definition: Node.h:26
Classes for nodes created during shader generation.
Class representing a context for closure evaluation.
Definition: GenContext.h:248
void setClosureParams(const ShaderNode *closure, const ClosureParams *params)
Set extra parameters to use for evaluating a closure.
Definition: GenContext.h:298
vector< Argument > Arguments
An array of arguments.
Definition: GenContext.h:255
const string & getSuffix(TypeDesc nodeType) const
Return the function name suffix to be used for the given node in this context.
Definition: GenContext.h:290
ClosureContext(int type=0)
Constructor.
Definition: GenContext.h:261
void addArgument(TypeDesc nodeType, const Argument &arg)
For the given node type add an extra argument to be used for the function in this context.
Definition: GenContext.h:268
void setSuffix(TypeDesc nodeType, const string &suffix)
For the given node type set a function name suffix to be used for the function in this context.
Definition: GenContext.h:283
const Arguments & getArguments(TypeDesc nodeType) const
Return a list of extra argument to be used for the given node in this context.
Definition: GenContext.h:275
std::unordered_map< string, const ShaderInput * > ClosureParams
Extra parameters for closure evaluation.
Definition: GenContext.h:258
int getType() const
Return the identifier for this context.
Definition: GenContext.h:265
std::pair< TypeDesc, string > Argument
An extra argument for closure functions.
Definition: GenContext.h:253
const ClosureParams * getClosureParams(const ShaderNode *closure) const
Return extra parameters to use for evaluating a closure.
Definition: GenContext.h:312
A generic file path, supporting both syntactic and file system operations.
Definition: File.h:27
bool isEmpty() const
Return true if the given path is empty.
Definition: File.h:92
FilePath getNormalized() const
Return a normalized version of the given path, collapsing current path and parent path references so ...
A sequence of file paths, which may be queried to find the first instance of a given filename on the ...
Definition: File.h:219
void prepend(const FilePath &path)
Prepend the given path to the sequence.
Definition: File.h:274
FilePath find(const FilePath &filename) const
Given an input filename, iterate through each path in this sequence, returning the first combined pat...
Definition: File.h:313
A context class for shader generation.
Definition: GenContext.h:31
void registerSourceCodeSearchPath(const FilePath &path)
Register a user search path for finding source code during code generation.
Definition: GenContext.h:56
void popParentNode()
Pop the current parent node from the stack.
Definition: GenContext.h:135
GenOptions & getOptions()
Return shader generation options.
Definition: GenContext.h:43
const vector< ConstNodePtr > & getParentNodes()
Return the current stack of parent nodes.
Definition: GenContext.h:141
void setApplicationVariableHandler(ApplicationVariableHandler handler)
Set handler for application variables.
Definition: GenContext.h:212
ShaderGenerator & getShaderGenerator()
Return shader generatior.
Definition: GenContext.h:37
void getInputSuffix(const ShaderInput *input, string &suffix) const
Get an input suffix to be used for the input in this context.
void clearUserData()
Clear all user data from the context.
void clearNodeImplementations()
Clear all cached shader node implementation.
void popUserData(const string &name)
Remove user data from the context.
Definition: GenContext.h:162
ShaderNodeImplPtr findNodeImplementation(const string &name) const
Find and return a cached shader node implementation, or return nullptr if no implementation is found.
void removeInputSuffix(const ShaderInput *input)
Remove an input suffix to be used for the input in this context.
void getNodeImplementationNames(StringSet &names)
Get the names of all cached node implementations.
void addInputSuffix(const ShaderInput *input, const string &suffix)
Add an input suffix to be used for the input in this context.
void addOutputSuffix(const ShaderOutput *output, const string &suffix)
Add an output suffix to be used for the output in this context.
void removeOutputSuffix(const ShaderOutput *output)
Remove an output suffix to be used for the output in this context.
void pushClosureContext(ClosureContext *cct)
Push a new closure context to use for closure evaluation.
Definition: GenContext.h:108
void addNodeImplementation(const string &name, ShaderNodeImplPtr impl)
Cache a shader node implementation.
void popClosureContext()
Pop the current closure context.
Definition: GenContext.h:114
void addReservedWords(const StringSet &names)
Add reserved words that should not be used as identifiers during code generation.
Definition: GenContext.h:82
void pushUserData(const string &name, GenUserDataPtr data)
Add user data to the context to make it available during shader generator.
Definition: GenContext.h:148
GenContext(ShaderGeneratorPtr sg)
Constructor.
void registerSourceCodeSearchPath(const FileSearchPath &path)
Register a user search path for finding source code during code generation.
Definition: GenContext.h:63
FilePath resolveSourceFile(const FilePath &filename, const FilePath &localPath) const
Resolve a source code filename, first checking the given local path then checking any file paths regi...
Definition: GenContext.h:70
ApplicationVariableHandler getApplicationVariableHandler() const
Get handler for application variables.
Definition: GenContext.h:218
void pushParentNode(ConstNodePtr node)
Push a parent node onto the stack.
Definition: GenContext.h:129
ClosureContext * getClosureContext()
Return the current closure context.
Definition: GenContext.h:123
const GenOptions & getOptions() const
Return shader generation options.
Definition: GenContext.h:49
void getOutputSuffix(const ShaderOutput *output, string &suffix) const
Get an output suffix to be used for the output in this context.
std::shared_ptr< T > getUserData(const string &name)
Return user data with given name, or nullptr if no data is found.
Definition: GenContext.h:177
const StringSet & getReservedWords() const
Return the set of reserved words that should not be used as identifiers during code generation.
Definition: GenContext.h:89
Class holding options to configure shader generation.
Definition: GenOptions.h:76
A RAII class for setting extra parameters for closure evaluation, stored in the closure context.
Definition: GenContext.h:330
ScopedSetClosureParams(const ClosureContext::ClosureParams *params, const ShaderNode *node, ClosureContext *cct)
Constructor for setting explicit parameters for a closure node.
~ScopedSetClosureParams()
Destructor restoring the closure parameter state.
ScopedSetClosureParams(const ShaderNode *fromNode, const ShaderNode *toNode, ClosureContext *cct)
Constructor for setting parameters from one closure node to another.
A RAII class for overriding port variable names.
Definition: GenContext.h:349
~ScopedSetVariableName()
Destructor restoring the original variable name.
ScopedSetVariableName(const string &name, ShaderPort *port)
Constructor for setting a new variable name for a port.
Base class for shader generators All third-party shader generators should derive from this class.
Definition: ShaderGenerator.h:31
Class representing a node in the shader generation DAG.
Definition: ShaderNode.h:320
An output on a ShaderNode.
Definition: ShaderNode.h:295
An input or output port on a ShaderNode.
Definition: ShaderNode.h:123
A type descriptor for MaterialX data types.
Definition: TypeDesc.h:35