All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
shaderNode.h
Go to the documentation of this file.
1 //
2 // Copyright 2018 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 
25 #ifndef PXR_USD_SDR_SHADER_NODE_H
26 #define PXR_USD_SDR_SHADER_NODE_H
27 
29 
30 #include "pxr/pxr.h"
31 #include "pxr/usd/sdr/api.h"
33 #include "pxr/usd/ndr/node.h"
34 #include "pxr/usd/sdr/declare.h"
35 
36 PXR_NAMESPACE_OPEN_SCOPE
37 
38 // Note: Metadata keys that are generated by parsers should start with
39 // "__SDR__" to reduce the risk of collision with metadata actually in the
40 // shader.
41 #define SDR_NODE_METADATA_TOKENS \
42  ((Category, "category")) \
43  ((Role, "role")) \
44  ((Departments, "departments")) \
45  ((Help, "help")) \
46  ((Label, "label")) \
47  ((Pages, "pages")) \
48  ((Primvars, "primvars")) \
49  ((ImplementationName, "__SDR__implementationName"))\
50  ((Target, "__SDR__target"))
51 
52 // Note: The concept of context is defined on NdrNode and can be queried with
53 // the GetContext() method. Sdr categorizes shaders by the context in which they
54 // are used inside of a renderer. For instance during 'pattern' evaluation to
55 // feed into a surface or volume shader. For BXDFs used in 'surface' and
56 // 'volume' rendering situations.
57 #define SDR_NODE_CONTEXT_TOKENS \
58  ((Pattern, "pattern")) \
59  ((Surface, "surface")) \
60  ((Volume, "volume")) \
61  ((Displacement, "displacement")) \
62  ((Light, "light")) \
63  ((LightFilter, "lightFilter")) \
64  ((SampleFilter, "sampleFilter")) \
65  ((PixelFilter, "pixelFilter"))
66 
67 #define SDR_NODE_ROLE_TOKENS \
68  ((Primvar, "primvar")) \
69  ((Texture, "texture")) \
70  ((Field, "field")) \
71  ((Math, "math")) \
72 
73 TF_DECLARE_PUBLIC_TOKENS(SdrNodeMetadata, SDR_API, SDR_NODE_METADATA_TOKENS);
74 TF_DECLARE_PUBLIC_TOKENS(SdrNodeContext, SDR_API, SDR_NODE_CONTEXT_TOKENS);
75 TF_DECLARE_PUBLIC_TOKENS(SdrNodeRole, SDR_API, SDR_NODE_ROLE_TOKENS);
76 
81 class SdrShaderNode : public NdrNode
82 {
83 public:
85  SDR_API
86  SdrShaderNode(const NdrIdentifier& identifier,
87  const NdrVersion& version,
88  const std::string& name,
89  const TfToken& family,
90  const TfToken& context,
91  const TfToken& sourceType,
92  const std::string& definitionURI,
93  const std::string& implementationURI,
94  NdrPropertyUniquePtrVec&& properties,
95  const NdrTokenMap& metadata = NdrTokenMap(),
96  const std::string &sourceCode = std::string());
97 
101 
104  SDR_API
105  SdrShaderPropertyConstPtr GetShaderInput(const TfToken& inputName) const;
106 
109  SDR_API
110  SdrShaderPropertyConstPtr GetShaderOutput(const TfToken& outputName) const;
111 
114  SDR_API
115  NdrTokenVec GetAssetIdentifierInputNames() const;
116 
121  SDR_API
122  SdrShaderPropertyConstPtr GetDefaultInput() const;
123 
125 
126 
133 
137  SDR_API
138  const TfToken& GetLabel() const { return _label; }
139 
142  SDR_API
143  const TfToken& GetCategory() const { return _category; }
144 
151  SDR_API
152  std::string GetRole() const;
153 
155  SDR_API
156  std::string GetHelp() const;
157 
159  SDR_API
160  const NdrTokenVec& GetDepartments() const { return _departments; }
161 
167  SDR_API
168  const NdrTokenVec& GetPages() const { return _pages; };
169 
176  SDR_API
177  const NdrTokenVec& GetPrimvars() const { return _primvars; }
178 
185  SDR_API
186  const NdrTokenVec& GetAdditionalPrimvarProperties() const {
187  return _primvarNamingProperties;
188  }
189 
197  SDR_API
198  std::string GetImplementationName() const;
199 
201 
202 
205 
209  SDR_API
210  NdrTokenVec GetPropertyNamesForPage(const std::string& pageName) const;
211 
213  SDR_API
214  NdrTokenVec GetAllVstructNames() const;
215 
217 
218 
221 
222  // Performs a post-process on properties to determine information that can
223  // only be determined after parsing or in aggregate. Clients SHOULD NOT
224  // need to call this.
225  void _PostProcessProperties();
226 
228 
229 protected:
230  // Processed primvar metadata. `_primvars` contains the names of primvars
231  // consumed by this node, whereas `_primvarNamingProperties` contains the
232  // names of string input properties whose values provide the names of
233  // additional primvars consumed by this node.
234  NdrTokenVec _primvars;
235  NdrTokenVec _primvarNamingProperties;
236 
237  // Tokenized metadata
238  TfToken _label;
239  TfToken _category;
240  NdrTokenVec _departments;
241  NdrTokenVec _pages;
242 
243  SdrPropertyMap _shaderInputs;
244  SdrPropertyMap _shaderOutputs;
245 
246 private:
247  // Initializes `_primvars` and `_primvarNamingProperties`
248  void _InitializePrimvars();
249 
250  // Determines which pages are present on the node's properties
251  NdrTokenVec _ComputePages() const;
252 };
253 
254 PXR_NAMESPACE_CLOSE_SCOPE
255 
256 #endif // PXR_USD_SDR_SHADER_NODE_H
SDR_API SdrShaderNode(const NdrIdentifier &identifier, const NdrVersion &version, const std::string &name, const TfToken &family, const TfToken &context, const TfToken &sourceType, const std::string &definitionURI, const std::string &implementationURI, NdrPropertyUniquePtrVec &&properties, const NdrTokenMap &metadata=NdrTokenMap(), const std::string &sourceCode=std::string())
Constructor.
SDR_API NdrTokenVec GetAssetIdentifierInputNames() const
Returns the list of all inputs that are tagged as asset identifier inputs.
SDR_API const NdrTokenVec & GetDepartments() const
The departments this node is associated with, if any.
Definition: shaderNode.h:160
SDR_API std::string GetHelp() const
The help message assigned to this node, if any.
SDR_API const NdrTokenVec & GetPages() const
Gets the pages on which the node's properties reside (an aggregate of the unique SdrShaderProperty::G...
Definition: shaderNode.h:168
SDR_API const NdrTokenVec & GetPrimvars() const
The list of primvars this node knows it requires / uses.
Definition: shaderNode.h:177
SDR_API const TfToken & GetCategory() const
The category assigned to this node, if any.
Definition: shaderNode.h:143
Token for efficient comparison, assignment, and hashing of known strings.
Definition: token.h:87
Represents an abstract node.
Definition: node.h:48
SDR_API NdrTokenVec GetAllVstructNames() const
Gets all vstructs that are present in the shader.
SDR_API const NdrTokenVec & GetAdditionalPrimvarProperties() const
The list of string input properties whose values provide the names of additional primvars consumed by...
Definition: shaderNode.h:186
#define TF_DECLARE_PUBLIC_TOKENS(...)
Macro to define public tokens.
Definition: staticTokens.h:118
SDR_API std::string GetImplementationName() const
Returns the implementation name of this node.
SDR_API std::string GetRole() const
Returns the role of this node.
SDR_API SdrShaderPropertyConstPtr GetShaderOutput(const TfToken &outputName) const
Get a shader output property by name.
A specialized version of NdrNode which holds shading information.
Definition: shaderNode.h:81
SDR_API SdrShaderPropertyConstPtr GetShaderInput(const TfToken &inputName) const
Get a shader input property by name.
SDR_API SdrShaderPropertyConstPtr GetDefaultInput() const
Returns the first shader input that is tagged as the default input.
This file defines some macros that are useful for declaring and using static TfTokens.
SDR_API NdrTokenVec GetPropertyNamesForPage(const std::string &pageName) const
Gets the names of the properties on a certain page (one that was returned by GetPages()).
SDR_API const TfToken & GetLabel() const
The label assigned to this node, if any.
Definition: shaderNode.h:138