HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HUSD_Utils.h
Go to the documentation of this file.
1 /*
2  * Copyright 2019 Side Effects Software Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 
18 #ifndef __HUSD_Utils_h__
19 #define __HUSD_Utils_h__
20 
21 #include "HUSD_API.h"
22 #include "HUSD_DataHandle.h"
23 #include "HUSD_Path.h"
24 #include <UT/UT_Function.h>
25 #include <UT/UT_IntArray.h>
26 #include <UT/UT_Lock.h>
27 #include <UT/UT_Map.h>
28 #include <UT/UT_StringHolder.h>
29 #include <SYS/SYS_Hash.h>
30 
31 class HUSD_PathSet;
32 class HUSD_TimeCode;
33 class UT_Options;
34 class UT_String;
36 class PRM_Parm;
37 class OP_Node;
38 
45 
46  // This value is only used to create the scene graph tree through
47  // HUSD_PrimHandle. It should never be used to find prims to edit.
49 
50  // This places no limitations on which prims to return, but will not
51  // return instance proxies or prototype prims.
53 
54  // By default, place no demands on the traversal. This will even return
55  // pure "over" primitives, which may have incomplete definitions.
57  // A combination of the default demands and support for instance proxies.
58  // This is a very common combination.
60 };
61 
62 // This enum specifies how a reference or sublayer or payload file reference
63 // is stored in the referring layer. The AUTO method stores paths specified
64 // as relative paths as relative paths, and paths specified as absolute paths
65 // as absolute paths. Paths specified as Search Paths (neither relative nor
66 // absolute) are always saved as-is.
68 {
72 };
73 
74 // This is the order of the viewport overrides layers. Note that they are
75 // ordered strongest to weakest, so the "solo" layers override the base layer,
76 // and the "custom" layer overrides the "solo" layers.
86 };
87 #define HUSD_OVERRIDES_NUM_LAYERS 8
88 
89 // Enum values that correspond to the SdfVariability values in the USD library.
93 };
94 
95 // Enum describing possible behaviors when layers are stripped off because of
96 // a layer break operation.
101 };
102 
103 // Enum describing the possible time sampling levels.
104 enum class HUSD_TimeSampling {
105  NONE, // no time samples; just the default value (not time varying)
106  SINGLE, // single time sample exists (value is not really time varying)
107  MULTIPLE // more than one time sample exists (value may be time varying)
108 };
109 
110 // Enum describing possible aspect ratio conformance policies.
112 {
113  INVALID = -1,
120 };
121 
122 // Describes the different ways of dealing with custom RenderProduct types:
123 // IGNORE: Do nothing, even if all products are custom types.
124 // ADD_AOVS: Request AOVs associated with custom products from the
125 // renderer. This is used for viewport renders.
126 // CREATE_DUMMY_RASTER: If all products are custom, create a dummy raster
127 // product to at least output a beauty image.
132 };
133 
134 // A "render key" which consists of the int values from the pickid and instid
135 // buffers generated by a render delegate.
137 {
138 public:
139  HUSD_RenderKey(int pick_id = -1, int inst_id = -1)
140  : myPickId(pick_id),
141  myInstId(inst_id)
142  { }
143 
144  bool operator==(const HUSD_RenderKey &other) const
145  {
146  return myPickId == other.myPickId &&
147  myInstId == other.myInstId;
148  }
149 
150  int myPickId;
151  int myInstId;
152 };
153 
154 // Hashing function for render keys.
155 inline size_t hash_value(const HUSD_RenderKey &key)
156 {
157  SYS_HashType hash = SYShash(key.myPickId);
158  SYShashCombine(hash, key.myInstId);
159 
160  return hash;
161 }
162 
163 // Map of render key to the scene graph path it corresponds to.
165 
166 // Callback function to be defined in the LOP library that returns a locked
167 // stage pointer for a LOP node given an "op:" prefixed path.
169 
170 // A list of path strings that contain instance id numbers (possibly nested).
171 // Expressed with a typedef in case we decide to make this a more efficient
172 // data structure in the future.
174 
175 // Configures the USD library for use within Houdini. The primary purpose is to
176 // set the prefered ArResolver to be the Houdini resolver. This should be
177 // called as soon as possible after loading the HUSD library.
178 HUSD_API void
180 
181 // Set the callback function that is used by the HUSD library to resolve a
182 // LOP node path into an HUSD_LockedStagePtr. This callback is used to help
183 // populate the GusdStageCache for a USD packed primitive with a "file" path
184 // that points to a LOP node using an "op:" style path.
185 HUSD_API void
187 
188 // Calls the GusdStageCache::SplitLopStageIdentifier method, without having to
189 // inclde the stageCache.h header, which is not allowed in the LOP library.
190 HUSD_API bool
191 HUSDsplitLopStageIdentifier(const UT_StringRef &identifier,
192  OP_Node *&lop,
193  int &output_index,
194  bool &split_layers,
195  fpreal &t,
196  UT_Options &opts);
197 
198 // Returns true if name is a valid identifier (ie, valid component of a path).
199 HUSD_API bool
201 
202 // Modifies the passed in string to make sure it conforms to USD primitive
203 // naming restrictions. Illegal characters are replaced by underscores.
204 HUSD_API bool
205 HUSDmakeValidUsdName(UT_String &name, bool addwarnings);
206 
207 // Returns the name of the node passed through the HUSDmakeValidUsdName method.
208 // This saves several lines of code every time we use this pattern.
211 
212 // Returns true if the given path is a syntactibally valid USD path.
213 HUSD_API bool
215 
216 // Modifies the passed in string to make sure it conforms to USD primitive
217 // naming restrictions. Illegal characters are replaced by underscores. Each
218 // path component is validated separately. The returned path will always be
219 // an absolute path, prefixing "/" to any passed in relative path.
220 HUSD_API bool
221 HUSDmakeValidUsdPath(UT_String &path, bool addwarnings);
222 
223 // As the above function, except it has the option of allowing the passed in
224 // and returned path to be a relative path.
225 HUSD_API bool
226 HUSDmakeValidUsdPath(UT_String &path, bool addwarnings, bool allow_relative);
227 
228 // Like the above method, but accepts "defaultPrim" as well.
229 HUSD_API bool
231 
232 // Ensures the given primitive path is unique and does not conflict
233 // with any existing primitives on the stage given by the lock.
234 // If suffix is given, if the given path is colliding, the new path
235 // will use it along with a digit to disambiguate it.
236 // Returns true if given path had to be changed; false otherwise.
237 HUSD_API bool
239  const UT_StringRef &suffix = UT_StringRef());
240 
241 // Returns the path of the node passed through the HUSDmakeValidUsdPath method.
242 // This saves several lines of code every time we use this pattern.
245 
246 // Modifies the passed in string to make sure it conforms to USD property
247 // naming restrictions. This includes allowing multiple nested namespaces
248 // in the name. Illegal characters are replaced by underscores.
249 HUSD_API bool
250 HUSDmakeValidUsdPropertyName(UT_String &name, bool addwarnings);
251 
252 // Modifies the passed in string to make sure it conforms to USD variant
253 // naming restrictions. Note that these are different from normal primitive
254 // naming conventions, as defined in SdfSchemaBase::IsValidVariantIdentifier:
255 // One or more letter, number, '_', '|', or '-', with an optional leading '.'
256 // Illegal characters are replaced by underscores.
257 HUSD_API bool
258 HUSDmakeValidVariantName(UT_String &name, bool allowexprs, bool addwarnings);
259 
260 // Modifies the passed in string to make sure it conforms to USD primitive
261 // naming restrictions. Leading slashes are thrown away. Illegal characters
262 // are replaced with underscores. Returns true (and adds a warning if
263 // addwarnings is true) if the string was modified.
264 HUSD_API bool
265 HUSDmakeValidDefaultPrim(UT_String &default_prim, bool addwarnings);
266 
267 // Returns primitive name, given the primitive path.
269 HUSDgetUsdName(const UT_StringRef &primpath);
270 
271 // Returns primitive's parent path, given the primitive path.
273 HUSDgetUsdParentPath(const UT_StringRef &primpath);
274 
275 // Returns the provided selection path with any instance id portion stripped
276 // off (e.g. /foo[6] -> /foo, but also /foo -> /foo).
278 HUSDremoveInstanceId(const UT_StringHolder &selectionpath);
279 
280 // Splits a selection path into separate primitive path and instance id
281 // components. Ignores any ":prototype" suffix on the instance id.
282 // Return true if an instance id was found, otherwise return false and
283 // set primpath = selectionpath (and instanceid = -1). This is just like
284 // the loputils.splitInstanceIdAndPath python function.
285 HUSD_API bool
286 HUSDsplitInstanceIdAndPath(const UT_StringHolder &selectionpath,
287  UT_StringHolder &primpath,
288  int64 &instanceid);
289 
290 // Fully decomposes a nested-instance selection path of the form
291 // /root[id1:/proto1][id2:/proto2]...[idN:/protoN] into its leading
292 // primitive path and the parallel arrays of instance ids and ":/proto"
293 // suffixes (outer to inner). The proto suffix on each bracket is optional;
294 // when absent, the corresponding entry in proto_paths is an empty string.
295 // For outer (non-innermost) brackets the proto suffix names the next
296 // instancer in the chain, and is required to resolve the nested level.
297 HUSD_API void
299  UT_StringHolder &primpath,
300  UT_Array<int64> &instance_ids,
301  UT_StringArray &proto_paths);
302 
303 // Gives us a chance to fix problems in path expressions before passing them
304 // to USD. Many errors we can't fix, but simple ones like using spaces instead
305 // of \n or \t characters can be.
308 
309 // Modifies the provided path set so that if all the children of a prim are
310 // in the set, the children are removed, and the parent prim is put in the
311 // set instead. This procedure is applied recursively. This converts some
312 // parameters to USD types then calls the XUSD_Utils version of this method.
313 HUSD_API void
315  bool skip_point_instancers,
316  const HUSD_AutoAnyLock &lock,
317  HUSD_PathSet &paths);
318 
319 // Return the primary alias for the specified USD primitive type.
321 HUSDgetPrimTypeAlias(const UT_StringRef &primtype);
322 
323 // If layers are stripped during a flatten operation, this function handles
324 // the error creation based on the requested response. Returns true of the
325 // requested response is to generate an error, which usually means we should
326 // also stop processing.
327 HUSD_API bool
329 
330 /// Enum of USD transform operation types.
331 /// Note, they need to correspond to UsdGeomXformOp::Type enum.
332 enum class HUSD_XformType {
333  Invalid,
334  Translate,
335  Scale,
338  Orient,
339  Transform
340 };
341 
342 /// Enum of rotation axis.
343 enum class HUSD_XformAxis { X, Y, Z };
344 
345 /// Enum of rotation order.
346 enum class HUSD_XformAxisOrder { XYZ, XZY, YXZ, YZX, ZXY, ZYX };
347 
348 /// @{ Functions for obtaining transform name, suffix, and type.
350  UT_StringHolder &xform_namesuffix,
351  const UT_StringRef& xform_fullname);
355  const UT_StringRef &xform_namesuffix);
357  UT_StringHolder *xform_type = nullptr,
358  UT_StringHolder *xform_name = nullptr);
359 /// @}
360 
361 /// @{ Manipulate collection paths and components. The individual components
362 /// must be validated (see HUSDmakeValidName and HUSDmakeValidPath) before
363 /// calling these methods.
365  const UT_StringRef &collection_name);
367  UT_StringHolder &collection_name,
368  const UT_StringRef &collection_path);
370 /// @}
371 
372 /// @{ Create property paths from their components. The individual components
373 /// must be validated (see HUSDmakeValidName and HUSDmakeValidPath) before
374 /// calling these methods.
376  const UT_StringRef &property_name);
378  const UT_StringRef &attribute_name);
380  const UT_StringRef &relationship_name);
381 /// @}
382 
383 /// Returns the prim path and the property name, given the property path.
384 HUSD_API std::pair<UT_StringHolder, UT_StringHolder>
385 HUSDsplitPropertyPath(const UT_StringRef &property_path);
386 
387 /// Returns the attribute name of the given primvar
389 
390 /// Returns the string name of the Usd Sdf type best suited for the parameter.
392 
393 /// Returns the time code at which to author an attribute value.
395  const HUSD_TimeCode &timecode,
396  HUSD_TimeSampling time_sampling);
397 
398 /// Returns true if there are more than one time samples.
399 HUSD_API bool HUSDisTimeVarying(HUSD_TimeSampling time_sampling);
400 
401 /// Returns true if there is at least one time sample.
402 HUSD_API bool HUSDisTimeSampled(HUSD_TimeSampling time_sampling);
403 
404 /// Set a parameter value from the value of a USD property.
406  const UT_StringRef &primpath,
407  const UT_StringRef &attribname,
408  const HUSD_TimeCode &tc,
409  PRM_Parm &parm,
410  HUSD_TimeSampling &timesampling);
411 
412 /// Split the found prims into shade and geo prims.
413 /// The parms control whether materials bound to geo prims are included
414 /// in the shade prims, and if so, whether to include material's surface
415 /// shader rather than material itself, if the material has no interface
416 /// input attributes (ie, is not particularly editable).
418  const HUSD_AutoAnyLock &anylock,
419  const HUSD_PathSet &primpaths,
420  UT_StringArray &shadeprimpaths,
421  UT_StringArray &geoprimpaths,
422  bool include_bound_materials = true,
423  bool use_shader_for_mat_with_no_inputs = true);
424 
425 /// Gets a list of primitives that are siblings or ancestors (or siblings
426 /// of ancestors) of any of the provided prims, and are also have any
427 /// of these prims as direct or indirect sources (via UsdConnectableAPI).
428 /// This method will work for materials, light filters, or any other
429 /// connectable prim type.
431  const HUSD_AutoAnyLock &anylock,
432  const UT_StringArray &modified_primpaths);
433 /// Bump metadata on a USD primitive to force a hydra update.
435  const HUSD_AutoWriteLock &writelock,
436  const UT_StringArray &bump_primpaths);
437 
438 /// Return a lock object that should be obtained by any code that is going
439 /// to call a USD method that reloads a layer, and by any code that needs to
440 /// be protected against layers being reloaded on another thread. This exists
441 /// primarily to protect background render delegate update threads from
442 /// reload calls happening while reading from the viewport stage.
444 
445 /// Takes the root layer of the USD file at path and searches for all
446 /// referenced asset paths in that layer, replacing them with the
447 /// return value of modifyFn. The resulting layer is saved at the path
448 /// specified by dest. If path and dest are the same, it overwrites
449 /// the file at path.
450 HUSD_API void
452  const UT_Function<UT_StringHolder(UT_StringHolder)> &modifyFn,
453  const UT_StringHolder &dest);
454 
455 /// Return an array of layer ids that excludes the "expansion" layer. Most
456 /// layer operations should, by default, ignore the expansion layer as it is
457 /// controlled by the scene graph expansion state, not through direct user
458 /// interaction. The viewport state layer is excluded from this list because
459 /// we don't want those edits to show modifications in the scene graph tree.
462 
463 HUSD_API bool
464 HUSDareLayersEqual(const UT_StringHolder &layerIdentifierA,
465  const UT_StringHolder &layerIdentifierB);
466 
467 // Returns an array of paths that conflict with existing relocates
469  const HUSD_AutoAnyLock &lock,
470  const HUSD_PathSet &paths);
471 
472 #endif
HUSD_API bool HUSDmakeValidVariantName(UT_String &name, bool allowexprs, bool addwarnings)
HUSD_API void HUSDgetMinimalPathsForInheritableProperty(bool skip_point_instancers, const HUSD_AutoAnyLock &lock, HUSD_PathSet &paths)
HUSD_API bool HUSDmakeValidDefaultPrim(UT_String &default_prim, bool addwarnings)
HUSD_API UT_StringHolder HUSDmakePropertyPath(const UT_StringRef &prim_path, const UT_StringRef &property_name)
constexpr size_t SYShash(const SYS_Flicks f)
Definition: SYS_Flicks.h:46
HUSD_API void HUSDsplitInstanceSelectionPath(const UT_StringHolder &selectionpath, UT_StringHolder &primpath, UT_Array< int64 > &instance_ids, UT_StringArray &proto_paths)
HUSD_RenderKey(int pick_id=-1, int inst_id=-1)
Definition: HUSD_Utils.h:139
HUSD_LockedStagePtr(* HUSD_LopStageResolver)(const UT_StringRef &path)
Definition: HUSD_Utils.h:168
HUSD_API void HUSDinitialize()
HUSD_API UT_StringHolder HUSDgetValidUsdPath(OP_Node &node)
HUSD_API bool HUSDisValidUsdName(const UT_StringRef &name)
GLsizei const GLchar *const * path
Definition: glcorearb.h:3341
HUSD_API void HUSDsetLopStageResolver(HUSD_LopStageResolver resolver)
#define HUSD_API
Definition: HUSD_API.h:31
std::size_t SYS_HashType
Define the type for hash values.
Definition: SYS_Hash.h:19
HUSD_API bool HUSDmakeValidUsdPropertyName(UT_String &name, bool addwarnings)
HUSD_API bool HUSDmakeValidUsdPath(UT_String &path, bool addwarnings)
HUSD_API UT_StringHolder HUSDgetUsdName(const UT_StringRef &primpath)
HUSD_PrimTraversalDemands
Definition: HUSD_Utils.h:39
HUSD_XformAxis
Enum of rotation axis.
Definition: HUSD_Utils.h:343
HUSD_OverridesLayerId
Definition: HUSD_Utils.h:77
HUSD_Variability
Definition: HUSD_Utils.h:90
UT_StringSet HUSD_InstanceSelection
Definition: HUSD_Utils.h:173
HUSD_API UT_Lock & HUSDgetLayerReloadLock()
HUSD_API UT_StringHolder HUSDmakeCollectionPath(const UT_StringRef &prim_path, const UT_StringRef &collection_name)
HUSD_API UT_StringHolder HUSDgetUsdParentPath(const UT_StringRef &primpath)
HUSD_API bool HUSDsplitInstanceIdAndPath(const UT_StringHolder &selectionpath, UT_StringHolder &primpath, int64 &instanceid)
HUSD_XformType
Definition: HUSD_Utils.h:332
HUSD_API bool HUSDmakeValidUsdName(UT_String &name, bool addwarnings)
HUSD_TimeSampling
Definition: HUSD_Utils.h:104
HUSD_API UT_StringArray HUSDgetConnectedPrimsToBumpForHydra(const HUSD_AutoAnyLock &anylock, const UT_StringArray &modified_primpaths)
bool operator==(const HUSD_RenderKey &other) const
Definition: HUSD_Utils.h:144
HUSD_API bool HUSDisValidCollectionPath(const UT_StringRef &path)
HUSD_API bool HUSDisXformAttribute(const UT_StringRef &attr, UT_StringHolder *xform_type=nullptr, UT_StringHolder *xform_name=nullptr)
Functions for obtaining transform name, suffix, and type.
HUSD_API UT_StringHolder HUSDmakeRelationshipPath(const UT_StringRef &prim_path, const UT_StringRef &relationship_name)
HUSD_API UT_StringHolder HUSDgetXformSuffix(const UT_StringRef &xform_fullname)
Functions for obtaining transform name, suffix, and type.
HUSD_API bool HUSDgetXformTypeAndSuffix(HUSD_XformType &xform_type, UT_StringHolder &xform_namesuffix, const UT_StringRef &xform_fullname)
Functions for obtaining transform name, suffix, and type.
size_t hash_value(const HUSD_RenderKey &key)
Definition: HUSD_Utils.h:155
long long int64
Definition: SYS_Types.h:116
HUSD_API bool HUSDsplitCollectionPath(UT_StringHolder &prim_path, UT_StringHolder &collection_name, const UT_StringRef &collection_path)
HUSD_StripLayerResponse
Definition: HUSD_Utils.h:97
HUSD_API HUSD_TimeCode HUSDgetEffectiveTimeCode(const HUSD_TimeCode &timecode, HUSD_TimeSampling time_sampling)
Returns the time code at which to author an attribute value.
HUSD_API bool HUSDisTimeVarying(HUSD_TimeSampling time_sampling)
Returns true if there are more than one time samples.
GLuint const GLchar * name
Definition: glcorearb.h:786
HUSD_API std::pair< UT_StringHolder, UT_StringHolder > HUSDsplitPropertyPath(const UT_StringRef &property_path)
Returns the prim path and the property name, given the property path.
HUSD_API UT_StringHolder HUSDmakeValidPathExpression(const UT_StringHolder &path_expr)
std::function< T > UT_Function
Definition: UT_Function.h:37
HUSD_API bool HUSDmakeValidUsdPathOrDefaultPrim(UT_String &path, bool addwarnings)
HUSD_API bool HUSDisValidUsdPath(const UT_StringRef &path)
HUSD_API bool HUSDpartitionShadePrims(const HUSD_AutoAnyLock &anylock, const HUSD_PathSet &primpaths, UT_StringArray &shadeprimpaths, UT_StringArray &geoprimpaths, bool include_bound_materials=true, bool use_shader_for_mat_with_no_inputs=true)
GLdouble t
Definition: glad.h:2397
HUSD_API bool HUSDareLayersEqual(const UT_StringHolder &layerIdentifierA, const UT_StringHolder &layerIdentifierB)
A map of string to various well defined value types.
Definition: UT_Options.h:87
HUSD_API UT_StringHolder HUSDremoveInstanceId(const UT_StringHolder &selectionpath)
HUSD_API bool HUSDsplitLopStageIdentifier(const UT_StringRef &identifier, OP_Node *&lop, int &output_index, bool &split_layers, fpreal &t, UT_Options &opts)
HUSD_API UT_StringHolder HUSDmakeAttributePath(const UT_StringRef &prim_path, const UT_StringRef &attribute_name)
fpreal64 fpreal
Definition: SYS_Types.h:283
UT_SharedPtr< HUSD_LockedStage > HUSD_LockedStagePtr
HUSD_API UT_StringHolder HUSDgetXformName(HUSD_XformType xform_type, const UT_StringRef &xform_namesuffix)
Functions for obtaining transform name, suffix, and type.
HUSD_AspectConformPolicy
Definition: HUSD_Utils.h:111
HUSD_XformAxisOrder
Enum of rotation order.
Definition: HUSD_Utils.h:346
HUSD_API void HUSDmodifyAssetPaths(const UT_StringHolder &path, const UT_Function< UT_StringHolder(UT_StringHolder)> &modifyFn, const UT_StringHolder &dest)
HUSD_PathSaveStyle
Definition: HUSD_Utils.h:67
HUSD_API UT_StringHolder HUSDgetPrimvarAttribName(const UT_StringRef &primvar)
Returns the attribute name of the given primvar.
HUSD_API bool HUSDapplyStripLayerResponse(HUSD_StripLayerResponse response)
HUSD_API bool HUSDsetParmFromProperty(const HUSD_DataHandle &data, const UT_StringRef &primpath, const UT_StringRef &attribname, const HUSD_TimeCode &tc, PRM_Parm &parm, HUSD_TimeSampling &timesampling)
Set a parameter value from the value of a USD property.
HUSD_API HUSD_XformType HUSDgetXformType(const UT_StringRef &xform_fullname)
Functions for obtaining transform name, suffix, and type.
UT_Map< HUSD_RenderKey, UT_StringHolder > HUSD_RenderKeyPathMap
Definition: HUSD_Utils.h:164
HUSD_API UT_StringArray HUSDgetConflictingRelocates(const HUSD_AutoAnyLock &lock, const HUSD_PathSet &paths)
HUSD_API const UT_Array< HUSD_OverridesLayerId > & HUSDgetUserEditableOverrideLayerIds()
HUSD_API bool HUSDisTimeSampled(HUSD_TimeSampling time_sampling)
Returns true if there is at least one time sample.
HUSD_API UT_StringHolder HUSDgetPrimTypeAlias(const UT_StringRef &primtype)
HUSD_API bool HUSDmakeUniqueUsdPath(UT_String &path, const HUSD_AutoAnyLock &lock, const UT_StringRef &suffix=UT_StringRef())
HUSD_API bool HUSDbumpPrimsForHydra(const HUSD_AutoWriteLock &writelock, const UT_StringArray &bump_primpaths)
Bump metadata on a USD primitive to force a hydra update.
Definition: format.h:1821
HUSD_API UT_StringHolder HUSDgetValidUsdName(OP_Node &node)
HUSD_API UT_StringHolder HUSDgetAttribTypeName(const PI_EditScriptedParm &p)
Returns the string name of the Usd Sdf type best suited for the parameter.
HUSD_CustomProductAction
Definition: HUSD_Utils.h:128