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 std::vector<std::string> primTypeNames() = 0;
105 virtual std::vector<std::string> primTypeLabels() = 0;
106 virtual std::vector<std::string> primTypeIcons() = 0;
107 virtual bool containsPrimType(
const char *
type_name) = 0;
111 virtual int64 countUnusedPoints() = 0;
113 virtual std::vector<HOM_ElemPtr<HOM_Prim> > primsOfType(
HOM_EnumValue &prim_type) = 0;
115 SWIGOUT(%newobject iterPrimsOfType;)
116 virtual HOM_IterableList<HOM_Prim> *iterPrimsOfType(
HOM_EnumValue &prim_type) = 0;
118 virtual int64 preferredPrecision() = 0;
119 virtual void setPreferredPrecision(
int64 prec) = 0;
121 virtual double averageMinDistance(
126 virtual double averageEdgeLength() = 0;
128 virtual std::vector<HOM_ElemPtr<HOM_Point> > globPoints(
const char *
pattern,
bool ordered =
false) = 0;
130 virtual std::vector<HOM_ElemPtr<HOM_Prim> > globPrims(
const char *
pattern) = 0;
132 virtual std::vector<HOM_ElemPtr<HOM_Vertex> > globVertices(
135 virtual std::vector<HOM_ElemPtr<HOM_Edge> > globEdges(
const char *
pattern) = 0;
138 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _pointAttribs(
142 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _primAttribs(
146 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _vertexAttribs(
150 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _globalAttribs(
154 SWIGOUT(%newobject findPointAttrib;)
158 SWIGOUT(%newobject findPrimAttrib;)
162 SWIGOUT(%newobject findVertexAttrib;)
166 SWIGOUT(%newobject findGlobalAttrib;)
174 virtual double floatAttribValue(
const char *
name) = 0;
176 virtual double floatAttribValue(
HOM_Attrib &attrib) = 0;
178 virtual std::vector<double> floatListAttribValue(
const char *
name) = 0;
180 virtual std::vector<double> floatListAttribValue(
HOM_Attrib &attrib) = 0;
182 virtual int64 intAttribValue(
const char *
name) = 0;
186 virtual std::vector<int64> intListAttribValue(
const char *
name) = 0;
188 virtual std::vector<int64> intListAttribValue(
HOM_Attrib &attrib) = 0;
194 virtual std::vector<std::string> stringListAttribValue(
const char *
name) = 0;
196 virtual std::vector<std::string> stringListAttribValue(
HOM_Attrib &attrib) = 0;
197 virtual std::map<std::string,hboost::any> dictAttribValue(
const char *
name) = 0;
198 virtual std::map<std::string,hboost::any> dictAttribValue(
HOM_Attrib &
name) = 0;
199 virtual std::vector<std::map<std::string,hboost::any> > dictListAttribValue(
const char *
name) = 0;
200 virtual std::vector<std::map<std::string,hboost::any> > dictListAttribValue(
HOM_Attrib &
name) = 0;
204 virtual std::vector<double> pointFloatAttribValues(
const char *
name) = 0;
205 SWIGOUT(%kwargs pointFloatAttribValuesAsString;)
208 virtual std::vector<double> primFloatAttribValues(
const char *
name) = 0;
209 SWIGOUT(%kwargs primFloatAttribValuesAsString;)
212 virtual std::vector<double> vertexFloatAttribValues(
const char *
name) = 0;
213 SWIGOUT(%kwargs vertexFloatAttribValuesAsString;)
217 virtual std::vector<int64> pointIntAttribValues(
const char *
name) = 0;
218 SWIGOUT(%kwargs pointIntAttribValuesAsString;)
221 virtual std::vector<int64> primIntAttribValues(
const char *
name) = 0;
222 SWIGOUT(%kwargs primIntAttribValuesAsString;)
225 virtual std::vector<int64> vertexIntAttribValues(
const char *
name) = 0;
226 SWIGOUT(%kwargs vertexIntAttribValuesAsString;)
230 virtual std::vector<std::string> pointStringAttribValues(
const char *
name) = 0;
231 virtual std::vector<std::string> primStringAttribValues(
const char *
name) = 0;
232 virtual std::vector<std::string> vertexStringAttribValues(
const char *
name) = 0;
234 virtual void setPointFloatAttribValues(
235 const char *
name,
const std::vector<double> &
values) = 0;
236 virtual void setPrimFloatAttribValues(
237 const char *
name,
const std::vector<double> &
values) = 0;
238 virtual void setVertexFloatAttribValues(
239 const char *
name,
const std::vector<double> &
values) = 0;
242 virtual void opaqueSetPointFloatAttribValuesFromString(
246 virtual void opaqueSetPrimFloatAttribValuesFromString(
250 virtual void opaqueSetVertexFloatAttribValuesFromString(
257 %kwargs setPointFloatAttribValuesFromString;
258 void setPointFloatAttribValuesFromString(
262 HOM_PyBuffer
buffer(values);
263 self->opaqueSetPointFloatAttribValuesFromString(
267 %kwargs setPrimFloatAttribValuesFromString;
268 void setPrimFloatAttribValuesFromString(
269 const char *name, InterpreterObject values,
272 HOM_PyBuffer
buffer(values);
273 self->opaqueSetPrimFloatAttribValuesFromString(
277 %kwargs setVertexFloatAttribValuesFromString;
278 void setVertexFloatAttribValuesFromString(
279 const char *name, InterpreterObject values,
282 HOM_PyBuffer
buffer(values);
283 self->opaqueSetVertexFloatAttribValuesFromString(
289 virtual void setPointIntAttribValues(
290 const char *name,
const std::vector<int64> &values) = 0;
291 virtual void setPrimIntAttribValues(
292 const char *name,
const std::vector<int64> &values) = 0;
293 virtual void setVertexIntAttribValues(
294 const char *name,
const std::vector<int64> &values) = 0;
297 virtual void opaqueSetPointIntAttribValuesFromString(
298 const char *name,
const char *values,
int64 length,
301 virtual void opaqueSetPrimIntAttribValuesFromString(
302 const char *name,
const char *values,
int64 length,
305 virtual void opaqueSetVertexIntAttribValuesFromString(
306 const char *name,
const char *values,
int64 length,
312 %kwargs setPointIntAttribValuesFromString;
313 void setPointIntAttribValuesFromString(
314 const char *name, InterpreterObject values,
317 HOM_PyBuffer
buffer(values);
318 self->opaqueSetPointIntAttribValuesFromString(
322 %kwargs setPrimIntAttribValuesFromString;
323 void setPrimIntAttribValuesFromString(
324 const char *name, InterpreterObject values,
327 HOM_PyBuffer
buffer(values);
328 self->opaqueSetPrimIntAttribValuesFromString(
332 %kwargs setVertexIntAttribValuesFromString;
333 void setVertexIntAttribValuesFromString(
334 const char *name, InterpreterObject values,
337 HOM_PyBuffer
buffer(values);
338 self->opaqueSetVertexIntAttribValuesFromString(
344 virtual void setPointStringAttribValues(
345 const char *name,
const std::vector<std::string> &values) = 0;
346 virtual void setPrimStringAttribValues(
347 const char *name,
const std::vector<std::string> &values) = 0;
348 virtual void setVertexStringAttribValues(
349 const char *name,
const std::vector<std::string> &values) = 0;
351 virtual void renamePointAttrib(
const char *old_name,
const char *new_name) = 0;
352 virtual void renamePrimAttrib(
const char *old_name,
const char *new_name) = 0;
353 virtual void renameVertexAttrib(
const char *old_name,
const char *new_name) = 0;
354 virtual void renameGlobalAttrib(
const char *old_name,
const char *new_name) = 0;
356 SWIGOUT(%newobject createPoint;)
358 virtual std::vector<HOM_ElemPtr<HOM_Point> >createPoints(
359 const std::vector<std::vector<double> > &point_positions) = 0;
360 virtual std::vector<HOM_ElemPtr<HOM_Point> >createPoints(
361 const std::vector<HOM_Vector3 *> &point_positions) = 0;
363 SWIGOUT(%newobject createPolygon;)
364 virtual HOM_Polygon *createPolygon(
bool is_closed=
true) = 0;
365 virtual std::vector<HOM_ElemPtr<HOM_Polygon> >createPolygons(
366 const std::vector<std::vector<HOM_Point *> > &
points,
367 bool is_closed=
true) = 0;
368 virtual std::vector<HOM_ElemPtr<HOM_Polygon> >createPolygons(
369 const std::vector<std::vector<int> > &point_numbers,
370 bool is_closed=
true) = 0;
372 SWIGOUT(%newobject createPacked;)
374 const char *packed_type,
377 SWIGOUT(%newobject createTetrahedron;)
378 virtual HOM_Prim *createTetrahedron() = 0;
380 SWIGOUT(%newobject createTetrahedronInPlace;)
384 SWIGOUT(%newobject createHexahedron;)
385 virtual HOM_Prim *createHexahedron() = 0;
387 SWIGOUT(%newobject createHexahedronInPlace;)
394 SWIGOUT(%newobject createNURBSCurve;)
395 SWIGOUT(%kwargs createNURBSCurve;)
396 virtual HOM_Face *createNURBSCurve(
int num_points=4,
bool is_closed=
false,
399 SWIGOUT(%newobject createBezierCurve;)
400 SWIGOUT(%kwargs createBezierCurve;)
401 virtual HOM_Face *createBezierCurve(
int num_points=4,
bool is_closed=
false,
404 SWIGOUT(%newobject createNURBSSurface;)
405 SWIGOUT(%kwargs createNURBSSurface;)
408 bool is_closed_in_u=
false,
bool is_closed_in_v=
false,
409 int order_u=4,
int order_v=4) = 0;
411 SWIGOUT(%newobject createBezierSurface;)
412 SWIGOUT(%kwargs createBezierSurface;)
415 bool is_closed_in_u=
false,
bool is_closed_in_v=
false,
416 int order_u=4,
int order_v=4) = 0;
418 SWIGOUT(%newobject createMeshSurface;)
419 SWIGOUT(%kwargs createMeshSurface;)
422 bool is_closed_in_u=
false,
bool is_closed_in_v=
false) = 0;
424 SWIGOUT(%newobject createVolume;)
429 SWIGOUT(%newobject createChannelPrim;)
430 SWIGOUT(%kwargs createChannelPrim;)
436 virtual void transformPrims(
437 const std::vector<HOM_Prim *> &prims,
const HOM_Matrix4 &matrix) = 0;
438 virtual void transformPrims(
445 virtual void deletePrims(
446 const std::vector<HOM_Prim *> &prims,
bool keep_points =
false) = 0;
447 virtual void deletePrims(
450 SWIGOUT(%kwargs deletePrimsOutsideBoundingBox;)
451 virtual void deletePrimsOutsideBoundingBox(
454 virtual void deletePoints(
const std::vector<HOM_Point *> &
points) = 0;
466 bool transform_as_normal,
467 bool create_local_variable) = 0;
471 double default_value,
472 bool transform_as_normal,
473 bool create_local_variable) = 0;
477 const char *default_value,
478 bool transform_as_normal,
479 bool create_local_variable) = 0;
484 const std::vector<int64> &default_value,
485 bool transform_as_normal,
486 bool create_local_variable) = 0;
491 const std::vector<double> &default_value,
492 bool transform_as_normal,
493 bool create_local_variable) = 0;
498 const std::vector<std::string> &default_value,
499 bool transform_as_normal,
500 bool create_local_variable) = 0;
505 const std::map<std::string, hboost::any> &default_value,
506 bool transform_as_normal,
507 bool create_local_variable) = 0;
509 SWIGOUT(%kwargs addArrayAttrib;)
510 SWIGOUT(%newobject addArrayAttrib;)
514 int64 tuple_size = 1) = 0;
517 virtual void setGlobalAttribValue(
519 virtual void setGlobalAttribValue(
521 virtual void setGlobalAttribValue(
522 HOM_Attrib &attrib,
const char *attrib_value) = 0;
523 virtual void setGlobalAttribValue(
524 HOM_Attrib &attrib,
const std::vector<int64> &attrib_value) = 0;
525 virtual void setGlobalAttribValue(
526 HOM_Attrib &attrib,
const std::vector<double> &attrib_value) = 0;
527 virtual void setGlobalAttribValue(
528 HOM_Attrib &attrib,
const std::vector<std::string> &attrib_value) = 0;
529 virtual void setGlobalAttribValue(
530 HOM_Attrib &attrib,
const std::map<std::string, hboost::any> &attrib_value) = 0;
531 virtual void setGlobalAttribValue(
532 HOM_Attrib &attrib,
const std::vector<std::map<std::string,hboost::any> > &attrib_value) = 0;
534 virtual void setGlobalAttribValue(
535 const char *attrib_name,
int64 attrib_value) = 0;
536 virtual void setGlobalAttribValue(
537 const char *attrib_name,
double attrib_value) = 0;
538 virtual void setGlobalAttribValue(
539 const char *attrib_name,
const char *attrib_value) = 0;
547 virtual void setGlobalAttribValue(
548 const char *attrib_name,
const std::vector<int64> &attrib_value) = 0;
549 virtual void setGlobalAttribValue(
550 const char *attrib_name,
const std::vector<double> &attrib_value) = 0;
551 virtual void setGlobalAttribValue(
552 const char *attrib_name,
553 const std::vector<std::string> &attrib_value) = 0;
554 virtual void setGlobalAttribValue(
555 const char *attrib_name,
556 const std::map<std::string, hboost::any> &attrib_value) = 0;
557 virtual void setGlobalAttribValue(
558 const char *attrib_name,
559 const std::vector<std::map<std::string,hboost::any> > &attrib_value) = 0;
561 virtual void copyAttrib(
HOM_Attrib *attrib) = 0;
562 virtual void copyAttribs(
const std::vector<HOM_Attrib *> &attribs) = 0;
573 virtual int _copyPrimsForDrawable(
HOM_Geometry &src_geo,
const std::vector<HOM_Prim*> &prims) = 0;
574 virtual int _copyClearForDrawable(
bool keep) = 0;
576 virtual int _copyCacheTopology(
HOM_Geometry &src_geo) = 0;
578 virtual std::vector<HOM_ElemPtr<HOM_Point> > _getPointChildren(
HOM_Point *pt) = 0;
582 InterpreterObject attribValue(
const char *name)
583 {
return HOMattribValue(*
self, name); }
585 InterpreterObject attribValue(
HOM_Attrib &attrib)
586 {
return HOMattribValue(*
self, attrib); }
590 virtual std::vector<std::string> attributeCaptureRegions() = 0;
591 virtual std::vector<std::string> attributeCaptureObjectPaths() = 0;
594 virtual std::vector<std::string> intrinsicNames() = 0;
597 const char *intrinsic_name) = 0;
598 virtual size_t intrinsicSize(
const char *intrinsic_name) = 0;
599 virtual bool intrinsicReadOnly(
const char *intrinsic_name) = 0;
601 virtual void setIntrinsicValue(
const char *intrinsic_name,
double value) = 0;
602 virtual void setIntrinsicValue(
const char *intrinsic_name,
int value) = 0;
603 virtual void setIntrinsicValue(
const char *intrinsic_name,
int64 value) = 0;
604 virtual void setIntrinsicValue(
605 const char *intrinsic_name,
const char *
value) = 0;
606 virtual void setIntrinsicValue(
607 const char *intrinsic_name,
const std::vector<double> &
value) = 0;
608 virtual void setIntrinsicValue(
609 const char *intrinsic_name,
const std::vector<int> &
value) = 0;
610 virtual void setIntrinsicValue(
611 const char *intrinsic_name,
const std::vector<int64> &
value) = 0;
612 virtual void setIntrinsicValue(
613 const char *intrinsic_name,
const std::vector<std::string> &
value) = 0;
618 virtual void saveToFile(
const char *file_name) = 0;
620 virtual void loadFromFile(
const char *file_name) = 0;
623 virtual void merge(
HOM_Geometry &geometry,
bool clone_data_ids =
false,
630 virtual void clear() = 0;
636 const char *
pattern =
nullptr,
float min_hit=1e-2
f,
float max_hit=1e18f,
637 float tolerance=1e-2F) = 0;
639 virtual std::vector<int> _orderedPoints(
640 const char *groupname,
641 const char *corner_groupname,
644 virtual std::vector<HOM_ElemPtr<HOM_PointGroup> > pointGroups(
647 SWIGOUT(%newobject findPointGroup;)
649 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
651 SWIGOUT(%newobject createPointGroup;)
652 SWIGOUT(%kwargs createPointGroup;)
655 bool is_ordered =
false,
656 bool unique_name =
false) = 0;
658 virtual std::vector<HOM_ElemPtr<HOM_PrimGroup> > primGroups(
661 SWIGOUT(%newobject findPrimGroup;)
663 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
665 SWIGOUT(%newobject createPrimGroup;)
666 SWIGOUT(%kwargs createPrimGroup;)
669 bool is_ordered =
false,
670 bool unique_name =
false) = 0;
672 virtual std::vector<HOM_ElemPtr<HOM_EdgeGroup> > edgeGroups(
675 SWIGOUT(%newobject findEdgeGroup;)
677 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
679 SWIGOUT(%newobject createEdgeGroup;)
681 const char *name) = 0;
683 virtual std::vector<HOM_ElemPtr<HOM_VertexGroup> > vertexGroups(
686 SWIGOUT(%newobject findVertexGroup;)
688 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
690 SWIGOUT(%newobject createVertexGroup;)
692 const char *name,
bool is_ordered=
false) = 0;
706 nearestPrim(
const std::vector<double> &
position) = 0;
708 SWIGOUT(%newobject nearestPoint;)
711 nearestPoint(
const std::vector<double> &
position,
712 const char *ptgroup =
nullptr,
713 double max_radius = 1e+18
f) = 0;
715 SWIGOUT(%kwargs nearestPoints;)
717 nearestPoints(
const std::vector<double> &
position,
719 const char *ptgroup =
nullptr,
720 double max_radius = 1e+18
f) = 0;
724 primLoop(
const std::vector<HOM_Prim *> &prims,
725 HOM_EnumValue &loop_type = HOM_componentLoopType::Partial) = 0;
728 pointLoop(
const std::vector<HOM_Point *> &
points,
729 HOM_EnumValue &loop_type = HOM_componentLoopType::Partial) = 0;
732 edgeLoop(
const std::vector<HOM_Edge *> &edges,
734 bool full_loop_per_edge =
true,
735 bool force_ring =
false,
736 bool allow_ring =
true) = 0;
738 virtual std::vector<HOM_Vector3>
739 pointNormals(
const std::vector<HOM_Point *> &
points) = 0;
740 virtual std::vector<HOM_Vector3>
749 const char *purpose = NULL,
750 const char *traversal = NULL,
751 const char *path_attrib_name = NULL,
752 const char *name_attrib_name = NULL,
753 bool strip_layers =
false,
757 virtual void importUsdStageOpaque(
760 const char *purpose = NULL,
761 const char *traversal = NULL,
762 const char *path_attrib_name = NULL,
763 const char *name_attrib_name = NULL,
769 %kwargs importUsdStage;
771 InterpreterObject stage,
773 const char *purpose = NULL,
774 const char *traversal = NULL,
775 const char *path_attrib_name = NULL,
776 const char *name_attrib_name = NULL,
779 return self->importUsdStageOpaque(
780 stage, selection_rule, purpose, traversal,
781 path_attrib_name, name_attrib_name, frame);
791 SWIGOUT(%newobject _guDetailHandle;)
796 virtual HOMF_GeometryHandle& _geometryHandle() = 0;
798 virtual std::vector<int> vexAttribDataId() = 0;
800 virtual int64 modificationCounter() = 0;
801 virtual void incrementModificationCounter() = 0;
803 virtual void incrementAllDataIds() = 0;
805 SWIGOUT(%kwargs incrementDataIdsForAddOrRemove;)
806 virtual void incrementDataIdsForAddOrRemove(
807 bool for_points=
true,
bool for_prims=
true) = 0;
809 SWIGOUT(%newobject primitiveIntrinsicsDataId;)
811 virtual void incrementPrimitiveIntrinsicsDataId() = 0;
813 SWIGOUT(%newobject topologyDataId;)
815 virtual void incrementTopologyDataId() = 0;
817 SWIGOUT(%kwargs generateAttribMenu;)
818 virtual std::vector<std::string> generateAttribMenu(
823 bool array_type =
true,
824 bool scalar_type =
true,
825 bool case_sensitive =
true,
827 bool decode_tokens =
false) = 0;
830 virtual std::vector<std::string> _generateGroupMenu(
831 const std::vector<HOM_EnumValue *> &group_types,
832 bool include_selection,
833 bool include_name_attrib,
839 virtual bool isReadOnly() = 0;
841 virtual void _attribInfo(
const char *name,
int &attr_data_type,
int &attr_size,
bool &is_array_type) = 0;
843 virtual std::vector<std::string> extractPackedPaths(
const char *
pattern) = 0;
844 SWIGOUT(%newobject unpackFromFolder;)
846 SWIGOUT(%newobject unpackPropertiesFromFolder;)
847 virtual std::map<std::string, hboost::any> packedFolderProperties(
const char *
path) = 0;
849 virtual bool packToFolder(
852 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()