MaterialX 1.39.0
Loading...
Searching...
No Matches
TypeDesc.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_TYPEDESC_H
7#define MATERIALX_TYPEDESC_H
8
11
13
14#include <string_view>
15
16MATERIALX_NAMESPACE_BEGIN
17
34class MX_GENSHADER_API TypeDesc
35{
36public:
37 enum BaseType
38 {
39 BASETYPE_NONE,
40 BASETYPE_BOOLEAN,
41 BASETYPE_INTEGER,
42 BASETYPE_FLOAT,
43 BASETYPE_STRING,
44 BASETYPE_STRUCT,
45 BASETYPE_LAST
46 };
47
48 enum Semantic
49 {
50 SEMANTIC_NONE,
51 SEMANTIC_COLOR,
52 SEMANTIC_VECTOR,
53 SEMANTIC_MATRIX,
54 SEMANTIC_FILENAME,
55 SEMANTIC_CLOSURE,
56 SEMANTIC_SHADER,
57 SEMANTIC_MATERIAL,
58 SEMANTIC_ENUM,
59 SEMANTIC_LAST
60 };
61
63 constexpr TypeDesc() noexcept : _id(0), _basetype(BASETYPE_NONE), _semantic(SEMANTIC_NONE), _size(0) {}
64
66 constexpr TypeDesc(std::string_view name, uint8_t basetype, uint8_t semantic = SEMANTIC_NONE, uint16_t size = 1) noexcept :
67 _id(constexpr_hash(name)), // Note: We only store the hash to keep the class size minimal.
68 _basetype(basetype),
69 _semantic(semantic),
70 _size(size)
71 {}
72
75 uint32_t typeId() const { return _id; }
76
78 const string& getName() const;
79
81 unsigned char getBaseType() const { return _basetype; }
82
84 unsigned char getSemantic() const { return _semantic; }
85
90 size_t getSize() const { return _size; }
91
93 bool isScalar() const { return _size == 1; }
94
96 bool isAggregate() const { return _size > 1; }
97
99 bool isArray() const { return _size == 0; }
100
102 bool isFloat2() const { return _size == 2 && (_semantic == SEMANTIC_COLOR || _semantic == SEMANTIC_VECTOR); }
103
105 bool isFloat3() const { return _size == 3 && (_semantic == SEMANTIC_COLOR || _semantic == SEMANTIC_VECTOR); }
106
108 bool isFloat4() const { return _size == 4 && (_semantic == SEMANTIC_COLOR || _semantic == SEMANTIC_VECTOR); }
109
111 bool isClosure() const { return (_semantic == SEMANTIC_CLOSURE || _semantic == SEMANTIC_SHADER || _semantic == SEMANTIC_MATERIAL); }
112
114 bool operator==(TypeDesc rhs) const
115 {
116 return _id == rhs._id;
117 }
118
120 bool operator!=(TypeDesc rhs) const
121 {
122 return _id != rhs._id;
123 }
124
126 bool operator<(TypeDesc rhs) const
127 {
128 return _id < rhs._id;
129 }
130
132 struct Hasher
133 {
134 size_t operator()(const TypeDesc& t) const
135 {
136 return t._id;
137 }
138 };
139
142 static TypeDesc get(const string& name);
143
144 static const string NONE_TYPE_NAME;
145
146private:
149 constexpr uint32_t constexpr_hash(std::string_view str, uint32_t n = 0, uint32_t h = 2166136261)
150 {
151 return n == uint32_t(str.size()) ? h : constexpr_hash(str, n + 1, (h * 16777619) ^ (str[n]));
152 }
153
154 uint32_t _id;
155 uint8_t _basetype;
156 uint8_t _semantic;
157 uint16_t _size;
158};
159
162class MX_GENSHADER_API TypeDescRegistry
163{
164public:
165 TypeDescRegistry(TypeDesc type, const string& name);
166};
167
169#define TYPEDESC_DEFINE_TYPE(T, name, basetype, semantic, size) \
170 static constexpr TypeDesc T(name, basetype, semantic, size);
171
174#define TYPEDESC_REGISTER_TYPE(T, name) \
175 TypeDescRegistry register_##T(T, name);
176
177namespace Type
178{
179
180//
182//
183TYPEDESC_DEFINE_TYPE(NONE, "none", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_NONE, 1)
184TYPEDESC_DEFINE_TYPE(BOOLEAN, "boolean", TypeDesc::BASETYPE_BOOLEAN, TypeDesc::SEMANTIC_NONE, 1)
185TYPEDESC_DEFINE_TYPE(INTEGER, "integer", TypeDesc::BASETYPE_INTEGER, TypeDesc::SEMANTIC_NONE, 1)
186TYPEDESC_DEFINE_TYPE(FLOAT, "float", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_NONE, 1)
187TYPEDESC_DEFINE_TYPE(INTEGERARRAY, "integerarray", TypeDesc::BASETYPE_INTEGER, TypeDesc::SEMANTIC_NONE, 0)
188TYPEDESC_DEFINE_TYPE(FLOATARRAY, "floatarray", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_NONE, 0)
189TYPEDESC_DEFINE_TYPE(VECTOR2, "vector2", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_VECTOR, 2)
190TYPEDESC_DEFINE_TYPE(VECTOR3, "vector3", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_VECTOR, 3)
191TYPEDESC_DEFINE_TYPE(VECTOR4, "vector4", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_VECTOR, 4)
192TYPEDESC_DEFINE_TYPE(COLOR3, "color3", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_COLOR, 3)
193TYPEDESC_DEFINE_TYPE(COLOR4, "color4", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_COLOR, 4)
194TYPEDESC_DEFINE_TYPE(MATRIX33, "matrix33", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_MATRIX, 9)
195TYPEDESC_DEFINE_TYPE(MATRIX44, "matrix44", TypeDesc::BASETYPE_FLOAT, TypeDesc::SEMANTIC_MATRIX, 16)
196TYPEDESC_DEFINE_TYPE(STRING, "string", TypeDesc::BASETYPE_STRING, TypeDesc::SEMANTIC_NONE, 1)
197TYPEDESC_DEFINE_TYPE(FILENAME, "filename", TypeDesc::BASETYPE_STRING, TypeDesc::SEMANTIC_FILENAME, 1)
198TYPEDESC_DEFINE_TYPE(BSDF, "BSDF", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_CLOSURE, 1)
199TYPEDESC_DEFINE_TYPE(EDF, "EDF", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_CLOSURE, 1)
200TYPEDESC_DEFINE_TYPE(VDF, "VDF", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_CLOSURE, 1)
201TYPEDESC_DEFINE_TYPE(SURFACESHADER, "surfaceshader", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_SHADER, 1)
202TYPEDESC_DEFINE_TYPE(VOLUMESHADER, "volumeshader", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_SHADER, 1)
203TYPEDESC_DEFINE_TYPE(DISPLACEMENTSHADER, "displacementshader", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_SHADER, 1)
204TYPEDESC_DEFINE_TYPE(LIGHTSHADER, "lightshader", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_SHADER, 1)
205TYPEDESC_DEFINE_TYPE(MATERIAL, "material", TypeDesc::BASETYPE_NONE, TypeDesc::SEMANTIC_MATERIAL, 1)
206
207} // namespace Type
208
209MATERIALX_NAMESPACE_END
210
211#endif
Macros for declaring imported and exported symbols.
#define TYPEDESC_DEFINE_TYPE(T, name, basetype, semantic, size)
Macro to define global type descriptions for commonly used types.
Definition: TypeDesc.h:169
A type descriptor for MaterialX data types.
Definition: TypeDesc.h:35
constexpr TypeDesc() noexcept
Empty constructor.
Definition: TypeDesc.h:63
bool operator!=(TypeDesc rhs) const
Inequality operator.
Definition: TypeDesc.h:120
bool operator==(TypeDesc rhs) const
Equality operator.
Definition: TypeDesc.h:114
const string & getName() const
Return the name of the type.
bool isClosure() const
Return true if the type represents a closure.
Definition: TypeDesc.h:111
bool operator<(TypeDesc rhs) const
Less-than operator.
Definition: TypeDesc.h:126
bool isScalar() const
Return true if the type is a scalar type.
Definition: TypeDesc.h:93
size_t getSize() const
Return the number of elements the type is composed of.
Definition: TypeDesc.h:90
bool isFloat3() const
Return true if the type is an aggregate of 3 floats.
Definition: TypeDesc.h:105
unsigned char getSemantic() const
Return the semantic for the type.
Definition: TypeDesc.h:84
constexpr TypeDesc(std::string_view name, uint8_t basetype, uint8_t semantic=SEMANTIC_NONE, uint16_t size=1) noexcept
Constructor.
Definition: TypeDesc.h:66
bool isAggregate() const
Return true if the type is an aggregate type.
Definition: TypeDesc.h:96
static TypeDesc get(const string &name)
Return a type description by name.
bool isFloat2() const
Return true if the type is an aggregate of 2 floats.
Definition: TypeDesc.h:102
bool isArray() const
Return true if the type is an array type.
Definition: TypeDesc.h:99
uint32_t typeId() const
Return the unique id assigned to this type.
Definition: TypeDesc.h:75
bool isFloat4() const
Return true if the type is an aggregate of 4 floats.
Definition: TypeDesc.h:108
unsigned char getBaseType() const
Return the basetype for the type.
Definition: TypeDesc.h:81
Helper class for type registration.
Definition: TypeDesc.h:163
Hash operator.
Definition: TypeDesc.h:133