9 #ifndef __HOM_Geometry_h__
10 #define __HOM_Geometry_h__
51 class HOMF_GeometryHandle;
80 virtual int sopNodeOutputIndex() = 0;
82 virtual bool isValid() = 0;
86 bool clone_data_ids=
false) = 0;
89 virtual HOM_IterableList<HOM_Point> *iterPoints() = 0;
91 virtual std::vector<HOM_ElemPtr<HOM_Point> >
points() = 0;
97 virtual HOM_IterableList<HOM_Prim> *iterPrims() = 0;
99 virtual std::vector<HOM_ElemPtr<HOM_Prim> > prims() = 0;
104 virtual bool containsPrimType(
const char *
type_name) = 0;
109 virtual int64 preferredPrecision() = 0;
110 virtual void setPreferredPrecision(
int64 prec) = 0;
112 virtual double averageMinDistance(
117 virtual double averageEdgeLength() = 0;
119 virtual std::vector<HOM_ElemPtr<HOM_Point> > globPoints(
const char *
pattern,
bool ordered =
false) = 0;
121 virtual std::vector<HOM_ElemPtr<HOM_Prim> > globPrims(
const char *
pattern) = 0;
123 virtual std::vector<HOM_ElemPtr<HOM_Vertex> > globVertices(
126 virtual std::vector<HOM_ElemPtr<HOM_Edge> > globEdges(
const char *
pattern) = 0;
128 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > pointAttribs(
bool include_private=
false) = 0;
130 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > primAttribs(
bool include_private=
false) = 0;
132 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > vertexAttribs(
bool include_private=
false) = 0;
134 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > globalAttribs(
bool include_private=
false) = 0;
137 SWIGOUT(%newobject findPointAttrib;)
140 SWIGOUT(%newobject findPrimAttrib;)
143 SWIGOUT(%newobject findVertexAttrib;)
146 SWIGOUT(%newobject findGlobalAttrib;)
153 virtual double floatAttribValue(
const char *
name) = 0;
155 virtual double floatAttribValue(
HOM_Attrib &attrib) = 0;
157 virtual std::vector<double> floatListAttribValue(
const char *
name) = 0;
159 virtual std::vector<double> floatListAttribValue(
HOM_Attrib &attrib) = 0;
161 virtual int64 intAttribValue(
const char *
name) = 0;
165 virtual std::vector<int64> intListAttribValue(
const char *
name) = 0;
167 virtual std::vector<int64> intListAttribValue(
HOM_Attrib &attrib) = 0;
173 virtual std::vector<std::string> stringListAttribValue(
const char *
name) = 0;
175 virtual std::vector<std::string> stringListAttribValue(
HOM_Attrib &attrib) = 0;
176 virtual std::map<std::string,hboost::any> dictAttribValue(
const char *
name) = 0;
177 virtual std::map<std::string,hboost::any> dictAttribValue(
HOM_Attrib &
name) = 0;
178 virtual std::vector<std::map<std::string,hboost::any> > dictListAttribValue(
const char *
name) = 0;
179 virtual std::vector<std::map<std::string,hboost::any> > dictListAttribValue(
HOM_Attrib &
name) = 0;
183 virtual std::vector<double> pointFloatAttribValues(
const char *
name) = 0;
184 SWIGOUT(%kwargs pointFloatAttribValuesAsString;)
187 virtual std::vector<double> primFloatAttribValues(
const char *
name) = 0;
188 SWIGOUT(%kwargs primFloatAttribValuesAsString;)
191 virtual std::vector<double> vertexFloatAttribValues(
const char *
name) = 0;
192 SWIGOUT(%kwargs vertexFloatAttribValuesAsString;)
196 virtual std::vector<int64> pointIntAttribValues(
const char *
name) = 0;
197 SWIGOUT(%kwargs pointIntAttribValuesAsString;)
200 virtual std::vector<int64> primIntAttribValues(
const char *
name) = 0;
201 SWIGOUT(%kwargs primIntAttribValuesAsString;)
204 virtual std::vector<int64> vertexIntAttribValues(
const char *
name) = 0;
205 SWIGOUT(%kwargs vertexIntAttribValuesAsString;)
209 virtual std::vector<std::string> pointStringAttribValues(
const char *
name) = 0;
210 virtual std::vector<std::string> primStringAttribValues(
const char *
name) = 0;
211 virtual std::vector<std::string> vertexStringAttribValues(
const char *
name) = 0;
213 virtual void setPointFloatAttribValues(
214 const char *
name,
const std::vector<double> &
values) = 0;
215 virtual void setPrimFloatAttribValues(
216 const char *
name,
const std::vector<double> &
values) = 0;
217 virtual void setVertexFloatAttribValues(
218 const char *
name,
const std::vector<double> &
values) = 0;
221 virtual void opaqueSetPointFloatAttribValuesFromString(
225 virtual void opaqueSetPrimFloatAttribValuesFromString(
229 virtual void opaqueSetVertexFloatAttribValuesFromString(
236 %kwargs setPointFloatAttribValuesFromString;
237 void setPointFloatAttribValuesFromString(
241 HOM_PyBuffer
buffer(values);
242 self->opaqueSetPointFloatAttribValuesFromString(
246 %kwargs setPrimFloatAttribValuesFromString;
247 void setPrimFloatAttribValuesFromString(
248 const char *name, InterpreterObject values,
251 HOM_PyBuffer
buffer(values);
252 self->opaqueSetPrimFloatAttribValuesFromString(
256 %kwargs setVertexFloatAttribValuesFromString;
257 void setVertexFloatAttribValuesFromString(
258 const char *name, InterpreterObject values,
261 HOM_PyBuffer
buffer(values);
262 self->opaqueSetVertexFloatAttribValuesFromString(
268 virtual void setPointIntAttribValues(
269 const char *name,
const std::vector<int64> &values) = 0;
270 virtual void setPrimIntAttribValues(
271 const char *name,
const std::vector<int64> &values) = 0;
272 virtual void setVertexIntAttribValues(
273 const char *name,
const std::vector<int64> &values) = 0;
276 virtual void opaqueSetPointIntAttribValuesFromString(
277 const char *name,
const char *values,
int64 length,
280 virtual void opaqueSetPrimIntAttribValuesFromString(
281 const char *name,
const char *values,
int64 length,
284 virtual void opaqueSetVertexIntAttribValuesFromString(
285 const char *name,
const char *values,
int64 length,
291 %kwargs setPointIntAttribValuesFromString;
292 void setPointIntAttribValuesFromString(
293 const char *name, InterpreterObject values,
296 HOM_PyBuffer
buffer(values);
297 self->opaqueSetPointIntAttribValuesFromString(
301 %kwargs setPrimIntAttribValuesFromString;
302 void setPrimIntAttribValuesFromString(
303 const char *name, InterpreterObject values,
306 HOM_PyBuffer
buffer(values);
307 self->opaqueSetPrimIntAttribValuesFromString(
311 %kwargs setVertexIntAttribValuesFromString;
312 void setVertexIntAttribValuesFromString(
313 const char *name, InterpreterObject values,
316 HOM_PyBuffer
buffer(values);
317 self->opaqueSetVertexIntAttribValuesFromString(
323 virtual void setPointStringAttribValues(
324 const char *name,
const std::vector<std::string> &values) = 0;
325 virtual void setPrimStringAttribValues(
326 const char *name,
const std::vector<std::string> &values) = 0;
327 virtual void setVertexStringAttribValues(
328 const char *name,
const std::vector<std::string> &values) = 0;
330 virtual void renamePointAttrib(
const char *old_name,
const char *new_name) = 0;
331 virtual void renamePrimAttrib(
const char *old_name,
const char *new_name) = 0;
332 virtual void renameVertexAttrib(
const char *old_name,
const char *new_name) = 0;
333 virtual void renameGlobalAttrib(
const char *old_name,
const char *new_name) = 0;
335 SWIGOUT(%newobject createPoint;)
337 virtual std::vector<HOM_ElemPtr<HOM_Point> >createPoints(
338 const std::vector<std::vector<double> > &point_positions) = 0;
339 virtual std::vector<HOM_ElemPtr<HOM_Point> >createPoints(
340 const std::vector<HOM_Vector3 *> &point_positions) = 0;
342 SWIGOUT(%newobject createPolygon;)
343 virtual HOM_Polygon *createPolygon(
bool is_closed=
true) = 0;
344 virtual std::vector<HOM_ElemPtr<HOM_Polygon> >createPolygons(
345 const std::vector<std::vector<HOM_Point *> > &
points,
346 bool is_closed=
true) = 0;
347 virtual std::vector<HOM_ElemPtr<HOM_Polygon> >createPolygons(
348 const std::vector<std::vector<int> > &point_numbers,
349 bool is_closed=
true) = 0;
351 SWIGOUT(%newobject createPacked;)
353 const char *packed_type,
356 SWIGOUT(%newobject createTetrahedron;)
357 virtual HOM_Prim *createTetrahedron() = 0;
359 SWIGOUT(%newobject createTetrahedronInPlace;)
363 SWIGOUT(%newobject createHexahedron;)
364 virtual HOM_Prim *createHexahedron() = 0;
366 SWIGOUT(%newobject createHexahedronInPlace;)
373 SWIGOUT(%newobject createNURBSCurve;)
374 SWIGOUT(%kwargs createNURBSCurve;)
375 virtual HOM_Face *createNURBSCurve(
int num_points=4,
bool is_closed=
false,
378 SWIGOUT(%newobject createBezierCurve;)
379 SWIGOUT(%kwargs createBezierCurve;)
380 virtual HOM_Face *createBezierCurve(
int num_points=4,
bool is_closed=
false,
383 SWIGOUT(%newobject createNURBSSurface;)
384 SWIGOUT(%kwargs createNURBSSurface;)
387 bool is_closed_in_u=
false,
bool is_closed_in_v=
false,
388 int order_u=4,
int order_v=4) = 0;
390 SWIGOUT(%newobject createBezierSurface;)
391 SWIGOUT(%kwargs createBezierSurface;)
394 bool is_closed_in_u=
false,
bool is_closed_in_v=
false,
395 int order_u=4,
int order_v=4) = 0;
397 SWIGOUT(%newobject createMeshSurface;)
398 SWIGOUT(%kwargs createMeshSurface;)
401 bool is_closed_in_u=
false,
bool is_closed_in_v=
false) = 0;
403 SWIGOUT(%newobject createVolume;)
408 SWIGOUT(%newobject createChannelPrim;)
409 SWIGOUT(%kwargs createChannelPrim;)
415 virtual void transformPrims(
416 const std::vector<HOM_Prim *> &prims,
const HOM_Matrix4 &matrix) = 0;
417 virtual void transformPrims(
424 virtual void deletePrims(
425 const std::vector<HOM_Prim *> &prims,
bool keep_points =
false) = 0;
426 virtual void deletePrims(
429 SWIGOUT(%kwargs deletePrimsOutsideBoundingBox;)
430 virtual void deletePrimsOutsideBoundingBox(
433 virtual void deletePoints(
const std::vector<HOM_Point *> &
points) = 0;
445 bool transform_as_normal,
446 bool create_local_variable) = 0;
450 double default_value,
451 bool transform_as_normal,
452 bool create_local_variable) = 0;
456 const char *default_value,
457 bool transform_as_normal,
458 bool create_local_variable) = 0;
463 const std::vector<int64> &default_value,
464 bool transform_as_normal,
465 bool create_local_variable) = 0;
470 const std::vector<double> &default_value,
471 bool transform_as_normal,
472 bool create_local_variable) = 0;
477 const std::vector<std::string> &default_value,
478 bool transform_as_normal,
479 bool create_local_variable) = 0;
484 const std::map<std::string, hboost::any> &default_value,
485 bool transform_as_normal,
486 bool create_local_variable) = 0;
488 SWIGOUT(%kwargs addArrayAttrib;)
489 SWIGOUT(%newobject addArrayAttrib;)
493 int64 tuple_size = 1) = 0;
496 virtual void setGlobalAttribValue(
498 virtual void setGlobalAttribValue(
500 virtual void setGlobalAttribValue(
501 HOM_Attrib &attrib,
const char *attrib_value) = 0;
502 virtual void setGlobalAttribValue(
503 HOM_Attrib &attrib,
const std::vector<int64> &attrib_value) = 0;
504 virtual void setGlobalAttribValue(
505 HOM_Attrib &attrib,
const std::vector<double> &attrib_value) = 0;
506 virtual void setGlobalAttribValue(
507 HOM_Attrib &attrib,
const std::vector<std::string> &attrib_value) = 0;
508 virtual void setGlobalAttribValue(
509 HOM_Attrib &attrib,
const std::map<std::string, hboost::any> &attrib_value) = 0;
510 virtual void setGlobalAttribValue(
511 HOM_Attrib &attrib,
const std::vector<std::map<std::string,hboost::any> > &attrib_value) = 0;
513 virtual void setGlobalAttribValue(
514 const char *attrib_name,
int64 attrib_value) = 0;
515 virtual void setGlobalAttribValue(
516 const char *attrib_name,
double attrib_value) = 0;
517 virtual void setGlobalAttribValue(
518 const char *attrib_name,
const char *attrib_value) = 0;
526 virtual void setGlobalAttribValue(
527 const char *attrib_name,
const std::vector<int64> &attrib_value) = 0;
528 virtual void setGlobalAttribValue(
529 const char *attrib_name,
const std::vector<double> &attrib_value) = 0;
530 virtual void setGlobalAttribValue(
531 const char *attrib_name,
532 const std::vector<std::string> &attrib_value) = 0;
533 virtual void setGlobalAttribValue(
534 const char *attrib_name,
535 const std::map<std::string, hboost::any> &attrib_value) = 0;
536 virtual void setGlobalAttribValue(
537 const char *attrib_name,
538 const std::vector<std::map<std::string,hboost::any> > &attrib_value) = 0;
540 virtual void copyAttrib(
HOM_Attrib *attrib) = 0;
541 virtual void copyAttribs(
const std::vector<HOM_Attrib *> &attribs) = 0;
547 virtual std::vector<HOM_ElemPtr<HOM_Point> > _getPointChildren(
HOM_Point *pt) = 0;
551 InterpreterObject attribValue(
const char *name)
552 {
return HOMattribValue(*
self, name); }
554 InterpreterObject attribValue(
HOM_Attrib &attrib)
555 {
return HOMattribValue(*
self, attrib); }
559 virtual std::vector<std::string> attributeCaptureRegions() = 0;
560 virtual std::vector<std::string> attributeCaptureObjectPaths() = 0;
563 virtual std::vector<std::string> intrinsicNames() = 0;
566 const char *intrinsic_name) = 0;
567 virtual size_t intrinsicSize(
const char *intrinsic_name) = 0;
568 virtual bool intrinsicReadOnly(
const char *intrinsic_name) = 0;
570 virtual void setIntrinsicValue(
const char *intrinsic_name,
double value) = 0;
571 virtual void setIntrinsicValue(
const char *intrinsic_name,
int value) = 0;
572 virtual void setIntrinsicValue(
const char *intrinsic_name,
int64 value) = 0;
573 virtual void setIntrinsicValue(
574 const char *intrinsic_name,
const char *
value) = 0;
575 virtual void setIntrinsicValue(
576 const char *intrinsic_name,
const std::vector<double> &
value) = 0;
577 virtual void setIntrinsicValue(
578 const char *intrinsic_name,
const std::vector<int> &
value) = 0;
579 virtual void setIntrinsicValue(
580 const char *intrinsic_name,
const std::vector<int64> &
value) = 0;
581 virtual void setIntrinsicValue(
582 const char *intrinsic_name,
const std::vector<std::string> &
value) = 0;
587 virtual void saveToFile(
const char *file_name) = 0;
589 virtual void loadFromFile(
const char *file_name) = 0;
592 virtual void merge(
HOM_Geometry &geometry,
bool clone_data_ids =
false,
595 virtual void clear() = 0;
601 const char *
pattern =
nullptr,
float min_hit=1e-2
f,
float max_hit=1e18f,
602 float tolerance=1e-2F) = 0;
604 virtual std::vector<int> _orderedPoints(
605 const char *groupname,
606 const char *corner_groupname,
609 virtual std::vector<HOM_ElemPtr<HOM_PointGroup> > pointGroups() = 0;
611 SWIGOUT(%newobject findPointGroup;)
614 SWIGOUT(%newobject createPointGroup;)
615 SWIGOUT(%kwargs createPointGroup;)
618 bool is_ordered =
false,
619 bool unique_name =
false) = 0;
621 virtual std::vector<HOM_ElemPtr<HOM_PrimGroup> > primGroups() = 0;
623 SWIGOUT(%newobject findPrimGroup;)
626 SWIGOUT(%newobject createPrimGroup;)
627 SWIGOUT(%kwargs createPrimGroup;)
630 bool is_ordered =
false,
631 bool unique_name =
false) = 0;
633 virtual std::vector<HOM_ElemPtr<HOM_EdgeGroup> > edgeGroups() = 0;
635 SWIGOUT(%newobject findEdgeGroup;)
638 SWIGOUT(%newobject createEdgeGroup;)
640 const char *name) = 0;
642 virtual std::vector<HOM_ElemPtr<HOM_VertexGroup> > vertexGroups() = 0;
644 SWIGOUT(%newobject findVertexGroup;)
647 SWIGOUT(%newobject createVertexGroup;)
649 const char *name,
bool is_ordered=
false) = 0;
663 nearestPrim(
const std::vector<double> &
position) = 0;
665 SWIGOUT(%newobject nearestPoint;)
668 nearestPoint(
const std::vector<double> &
position,
669 const char *ptgroup =
nullptr,
670 double max_radius = 1e+18
f) = 0;
672 SWIGOUT(%kwargs nearestPoints;)
674 nearestPoints(
const std::vector<double> &
position,
676 const char *ptgroup =
nullptr,
677 double max_radius = 1e+18
f) = 0;
681 primLoop(
const std::vector<HOM_Prim *> &prims,
682 HOM_EnumValue &loop_type = HOM_componentLoopType::Partial) = 0;
685 pointLoop(
const std::vector<HOM_Point *> &
points,
686 HOM_EnumValue &loop_type = HOM_componentLoopType::Partial) = 0;
689 edgeLoop(
const std::vector<HOM_Edge *> &edges,
691 bool full_loop_per_edge =
true,
692 bool force_ring =
false,
693 bool allow_ring =
true) = 0;
695 virtual std::vector<HOM_Vector3>
696 pointNormals(
const std::vector<HOM_Point *> &
points) = 0;
697 virtual std::vector<HOM_Vector3>
706 const char *purpose = NULL,
707 const char *traversal = NULL,
708 const char *path_attrib_name = NULL,
709 const char *name_attrib_name = NULL,
710 bool strip_layers =
false,
714 virtual void importUsdStageOpaque(
717 const char *purpose = NULL,
718 const char *traversal = NULL,
719 const char *path_attrib_name = NULL,
720 const char *name_attrib_name = NULL,
726 %kwargs importUsdStage;
728 InterpreterObject stage,
730 const char *purpose = NULL,
731 const char *traversal = NULL,
732 const char *path_attrib_name = NULL,
733 const char *name_attrib_name = NULL,
736 return self->importUsdStageOpaque(
737 stage, selection_rule, purpose, traversal,
738 path_attrib_name, name_attrib_name, frame);
748 SWIGOUT(%newobject _guDetailHandle;)
753 virtual HOMF_GeometryHandle& _geometryHandle() = 0;
755 virtual std::vector<int> vexAttribDataId() = 0;
757 virtual int64 modificationCounter() = 0;
758 virtual void incrementModificationCounter() = 0;
760 virtual void incrementAllDataIds() = 0;
762 SWIGOUT(%kwargs incrementDataIdsForAddOrRemove;)
763 virtual void incrementDataIdsForAddOrRemove(
764 bool for_points=
true,
bool for_prims=
true) = 0;
766 SWIGOUT(%newobject primitiveIntrinsicsDataId;)
768 virtual void incrementPrimitiveIntrinsicsDataId() = 0;
770 SWIGOUT(%newobject topologyDataId;)
772 virtual void incrementTopologyDataId() = 0;
774 SWIGOUT(%kwargs generateAttribMenu;)
775 virtual std::vector<std::string> generateAttribMenu(
780 bool array_type =
true,
781 bool scalar_type =
true,
782 bool case_sensitive =
true,
784 bool decode_tokens =
false) = 0;
787 virtual std::vector<std::string> _generateGroupMenu(
788 const std::vector<HOM_EnumValue *> &group_types,
789 bool include_selection,
790 bool include_name_attrib,
796 virtual bool isReadOnly() = 0;
798 virtual void _attribInfo(
const char *name,
int &attr_data_type,
int &attr_size,
bool &is_array_type) = 0;
800 virtual std::vector<std::string> extractPackedPaths(
const char *
pattern) = 0;
801 SWIGOUT(%newobject unpackFromFolder;)
803 SWIGOUT(%newobject unpackPropertiesFromFolder;)
804 virtual std::map<std::string, hboost::any> packedFolderProperties(
const char *
path) = 0;
806 virtual bool packToFolder(
809 bool is_folder =
false) = 0;
GT_API const UT_StringHolder selection
#define HOM_DESTRUCT_OBJECT(pointer)
GLdouble GLdouble GLint GLint const GLdouble * points
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
GLsizei const GLchar *const * string
GLsizei const GLchar *const * path
GLuint GLsizei GLsizei * length
string __repr__(VtArray< T > const &self)
std::tuple< Types...> UT_Tuple
virtual HOM_Geometry * newGeometry(HOM_Geometry *geo=nullptr, bool clone_data_ids=false)=0
bool any(const vbool4 &v)
HOM_Geometry(const HOM_Geometry &)
void ignore(T const &) VULKAN_HPP_NOEXCEPT
constexpr std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size(){return subtype_count< typename std::tuple_element< I, T >::type >::value+tuple_type_size< T, I+1 >);}template< typename T > struct type_count< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size< T, 0 >)};};template< typename T > struct subtype_count{static constexpr int value{is_mutable_container< T >::value?expected_max_vector_size:type_count< T >::value};};template< typename T, typename Enable=void > struct type_count_min{static const int value{0};};template< typename T >struct type_count_min< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_tuple_like< T >::value &&!is_wrapper< T >::value &&!is_complex< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{type_count< T >::value};};template< typename T > struct type_count_min< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr int value{1};};template< typename T >struct type_count_min< T, typename std::enable_if< is_wrapper< T >::value &&!is_complex< T >::value &&!is_tuple_like< T >::value >::type >{static constexpr int value{subtype_count_min< typename T::value_type >::value};};template< typename T, std::size_t I >constexpr typename std::enable_if< I==type_count_base< T >::value, int >::type tuple_type_size_min(){return 0;}template< typename T, std::size_t I > constexpr typename std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size_min(){return subtype_count_min< typename std::tuple_element< I, T >::type >::value+tuple_type_size_min< T, I+1 >);}template< typename T > struct type_count_min< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size_min< T, 0 >)};};template< typename T > struct subtype_count_min{static constexpr int value{is_mutable_container< T >::value?((type_count< T >::value< expected_max_vector_size)?type_count< T >::value:0):type_count_min< T >::value};};template< typename T, typename Enable=void > struct expected_count{static const int value{0};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_wrapper< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{1};};template< typename T > struct expected_count< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr int value{expected_max_vector_size};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&is_wrapper< T >::value >::type >{static constexpr int value{expected_count< typename T::value_type >::value};};enum class object_category:int{char_value=1, integral_value=2, unsigned_integral=4, enumeration=6, boolean_value=8, floating_point=10, number_constructible=12, double_constructible=14, integer_constructible=16, string_assignable=23, string_constructible=24, other=45, wrapper_value=50, complex_number=60, tuple_value=70, container_value=80,};template< typename T, typename Enable=void > struct classify_object{static constexpr object_category value{object_category::other};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&!std::is_same< T, char >::value &&std::is_signed< T >::value &&!is_bool< T >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::integral_value};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&std::is_unsigned< T >::value &&!std::is_same< T, char >::value &&!is_bool< T >::value >::type >{static constexpr object_category value{object_category::unsigned_integral};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_same< T, char >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::char_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_bool< T >::value >::type >{static constexpr object_category value{object_category::boolean_value};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_floating_point< T >::value >::type >{static constexpr object_category value{object_category::floating_point};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&std::is_assignable< T &, std::string >::value >::type >{static constexpr object_category value{object_category::string_assignable};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&(type_count< T >::value==1)&&std::is_constructible< T, std::string >::value >::type >{static constexpr object_category value{object_category::string_constructible};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::enumeration};};template< typename T > struct classify_object< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr object_category value{object_category::complex_number};};template< typename T > struct uncommon_type{using type=typename std::conditional<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&!std::is_constructible< T, std::string >::value &&!is_complex< T >::value &&!is_mutable_container< T >::value &&!std::is_enum< T >::value, std::true_type, std::false_type >::type;static constexpr bool value=type::value;};template< typename T >struct classify_object< T, typename std::enable_if<(!is_mutable_container< T >::value &&is_wrapper< T >::value &&!is_tuple_like< T >::value &&uncommon_type< T >::value)>::type >{static constexpr object_category value{object_category::wrapper_value};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::number_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&!is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::integer_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::double_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< is_tuple_like< T >::value &&((type_count< T >::value >=2 &&!is_wrapper< T >::value)||(uncommon_type< T >::value &&!is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value)||(uncommon_type< T >::value &&type_count< T >::value >=2))>::type >{static constexpr object_category value{object_category::tuple_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr object_category value{object_category::container_value};};template< typename T, enable_if_t< classify_object< T >::value==object_category::char_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"CHAR";}template< typename T, enable_if_t< classify_object< T >::value==object_category::integral_value||classify_object< T >::value==object_category::integer_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"INT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::unsigned_integral, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"UINT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::floating_point||classify_object< T >::value==object_category::number_constructible||classify_object< T >::value==object_category::double_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"FLOAT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::enumeration, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"ENUM";}template< typename T, enable_if_t< classify_object< T >::value==object_category::boolean_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"BOOLEAN";}template< typename T, enable_if_t< classify_object< T >::value==object_category::complex_number, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"COMPLEX";}template< typename T, enable_if_t< classify_object< T >::value >=object_category::string_assignable &&classify_object< T >::value<=object_category::other, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"TEXT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::container_value||classify_object< T >::value==object_category::wrapper_value, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value==1, detail::enabler >=detail::dummy >inline std::string type_name(){return type_name< typename std::decay< typename std::tuple_element< 0, T >::type >::type >);}template< typename T, std::size_t I >inline typename std::enable_if< I==type_count_base< T >::value, std::string >::type tuple_name(){return std::string{};}template< typename T, std::size_t I >inline typename std::enable_if<(I< type_count_base< T >::value), std::string >::type tuple_name(){auto str=std::string{type_name< typename std::decay< typename std::tuple_element< I, T >::type >::type >)}+ ','+tuple_name< T, I+1 >);if(str.back()== ',') str.pop_back();return str;}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler > > std::string type_name()
Recursively generate the tuple type name.
#define HOM_CONSTRUCT_OBJECT(pointer)
GLdouble GLdouble GLint GLint order
GLuint const GLchar * name
GA_API const UT_StringHolder transform
GLenum GLsizei GLsizei GLint * values
OIIO_UTIL_API bool rename(string_view from, string_view to, std::string &err)
SIM_API const UT_StringHolder position
IMATH_CONSTEXPR14 bool intersect(const Line3< T > &line, const Vec3< T > &v0, const Vec3< T > &v1, const Vec3< T > &v2, Vec3< T > &pt, Vec3< T > &barycentric, bool &front) IMATH_NOEXCEPT
UT_Optional< double > HOM_OptionalDouble
HOM_API HOM_Module & HOM()