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 int64 vertexCount() = 0;
90 virtual int64 primCount() = 0;
93 virtual HOM_IterableList<HOM_Point> *iterPoints() = 0;
95 virtual std::vector<HOM_ElemPtr<HOM_Point> >
points() = 0;
101 virtual HOM_IterableList<HOM_Prim> *iterPrims() = 0;
103 virtual std::vector<HOM_ElemPtr<HOM_Prim> > prims() = 0;
108 virtual std::vector<std::string> primTypeNames() = 0;
109 virtual std::vector<std::string> primTypeLabels() = 0;
110 virtual std::vector<std::string> primTypeIcons() = 0;
111 virtual bool containsPrimType(
const char *
type_name) = 0;
115 virtual int64 countUnusedPoints() = 0;
117 virtual std::vector<HOM_ElemPtr<HOM_Prim> > primsOfType(
HOM_EnumValue &prim_type) = 0;
119 SWIGOUT(%newobject iterPrimsOfType;)
120 virtual HOM_IterableList<HOM_Prim> *iterPrimsOfType(
HOM_EnumValue &prim_type) = 0;
122 virtual int64 preferredPrecision() = 0;
123 virtual void setPreferredPrecision(
int64 prec) = 0;
125 virtual double averageMinDistance(
130 virtual double averageEdgeLength() = 0;
132 virtual std::vector<HOM_ElemPtr<HOM_Point> > globPoints(
const char *
pattern,
bool ordered =
false) = 0;
134 virtual std::vector<HOM_ElemPtr<HOM_Prim> > globPrims(
const char *
pattern) = 0;
136 virtual std::vector<HOM_ElemPtr<HOM_Vertex> > globVertices(
139 virtual std::vector<HOM_ElemPtr<HOM_Edge> > globEdges(
const char *
pattern) = 0;
142 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _pointAttribs(
146 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _primAttribs(
150 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _vertexAttribs(
154 virtual std::vector<HOM_ElemPtr<HOM_Attrib> > _globalAttribs(
158 SWIGOUT(%newobject findPointAttrib;)
162 SWIGOUT(%newobject findPrimAttrib;)
166 SWIGOUT(%newobject findVertexAttrib;)
170 SWIGOUT(%newobject findGlobalAttrib;)
178 virtual double floatAttribValue(
const char *
name) = 0;
180 virtual double floatAttribValue(
HOM_Attrib &attrib) = 0;
182 virtual std::vector<double> floatListAttribValue(
const char *
name) = 0;
184 virtual std::vector<double> floatListAttribValue(
HOM_Attrib &attrib) = 0;
186 virtual int64 intAttribValue(
const char *
name) = 0;
190 virtual std::vector<int64> intListAttribValue(
const char *
name) = 0;
192 virtual std::vector<int64> intListAttribValue(
HOM_Attrib &attrib) = 0;
194 virtual std::string stringAttribValue(
const char *
name) = 0;
196 virtual std::string stringAttribValue(
HOM_Attrib &attrib) = 0;
198 virtual std::vector<std::string> stringListAttribValue(
const char *
name) = 0;
200 virtual std::vector<std::string> stringListAttribValue(
HOM_Attrib &attrib) = 0;
201 virtual std::map<std::string,hboost::any> dictAttribValue(
const char *
name) = 0;
202 virtual std::map<std::string,hboost::any> dictAttribValue(
HOM_Attrib &
name) = 0;
203 virtual std::vector<std::map<std::string,hboost::any> > dictListAttribValue(
const char *
name) = 0;
204 virtual std::vector<std::map<std::string,hboost::any> > dictListAttribValue(
HOM_Attrib &
name) = 0;
208 virtual std::vector<double> pointFloatAttribValues(
const char *
name) = 0;
209 SWIGOUT(%kwargs pointFloatAttribValuesAsString;)
212 virtual std::vector<double> primFloatAttribValues(
const char *
name) = 0;
213 SWIGOUT(%kwargs primFloatAttribValuesAsString;)
216 virtual std::vector<double> vertexFloatAttribValues(
const char *
name) = 0;
217 SWIGOUT(%kwargs vertexFloatAttribValuesAsString;)
221 virtual std::vector<int64> pointIntAttribValues(
const char *
name) = 0;
222 SWIGOUT(%kwargs pointIntAttribValuesAsString;)
225 virtual std::vector<int64> primIntAttribValues(
const char *
name) = 0;
226 SWIGOUT(%kwargs primIntAttribValuesAsString;)
229 virtual std::vector<int64> vertexIntAttribValues(
const char *
name) = 0;
230 SWIGOUT(%kwargs vertexIntAttribValuesAsString;)
234 virtual std::vector<std::string> pointStringAttribValues(
const char *
name) = 0;
235 virtual std::vector<std::string> primStringAttribValues(
const char *
name) = 0;
236 virtual std::vector<std::string> vertexStringAttribValues(
const char *
name) = 0;
238 virtual void setPointFloatAttribValues(
239 const char *
name,
const std::vector<double> &
values) = 0;
240 virtual void setPrimFloatAttribValues(
241 const char *
name,
const std::vector<double> &
values) = 0;
242 virtual void setVertexFloatAttribValues(
243 const char *
name,
const std::vector<double> &
values) = 0;
246 virtual void opaqueSetPointFloatAttribValuesFromString(
250 virtual void opaqueSetPrimFloatAttribValuesFromString(
254 virtual void opaqueSetVertexFloatAttribValuesFromString(
261 %kwargs setPointFloatAttribValuesFromString;
262 void setPointFloatAttribValuesFromString(
266 HOM_PyBuffer
buffer(values);
267 self->opaqueSetPointFloatAttribValuesFromString(
268 name, (
const char *)
buffer.myData,
buffer.myLength, float_type);
271 %kwargs setPrimFloatAttribValuesFromString;
272 void setPrimFloatAttribValuesFromString(
273 const char *name, InterpreterObject values,
276 HOM_PyBuffer
buffer(values);
277 self->opaqueSetPrimFloatAttribValuesFromString(
278 name, (
const char *)
buffer.myData,
buffer.myLength, float_type);
281 %kwargs setVertexFloatAttribValuesFromString;
282 void setVertexFloatAttribValuesFromString(
283 const char *name, InterpreterObject values,
286 HOM_PyBuffer
buffer(values);
287 self->opaqueSetVertexFloatAttribValuesFromString(
288 name, (
const char *)
buffer.myData,
buffer.myLength, float_type);
293 virtual void setPointIntAttribValues(
294 const char *name,
const std::vector<int64> &values) = 0;
295 virtual void setPrimIntAttribValues(
296 const char *name,
const std::vector<int64> &values) = 0;
297 virtual void setVertexIntAttribValues(
298 const char *name,
const std::vector<int64> &values) = 0;
301 virtual void opaqueSetPointIntAttribValuesFromString(
302 const char *name,
const char *values,
int64 length,
305 virtual void opaqueSetPrimIntAttribValuesFromString(
306 const char *name,
const char *values,
int64 length,
309 virtual void opaqueSetVertexIntAttribValuesFromString(
310 const char *name,
const char *values,
int64 length,
316 %kwargs setPointIntAttribValuesFromString;
317 void setPointIntAttribValuesFromString(
318 const char *name, InterpreterObject values,
321 HOM_PyBuffer
buffer(values);
322 self->opaqueSetPointIntAttribValuesFromString(
323 name, (
const char *)
buffer.myData,
buffer.myLength, int_type);
326 %kwargs setPrimIntAttribValuesFromString;
327 void setPrimIntAttribValuesFromString(
328 const char *name, InterpreterObject values,
331 HOM_PyBuffer
buffer(values);
332 self->opaqueSetPrimIntAttribValuesFromString(
333 name, (
const char *)
buffer.myData,
buffer.myLength, int_type);
336 %kwargs setVertexIntAttribValuesFromString;
337 void setVertexIntAttribValuesFromString(
338 const char *name, InterpreterObject values,
341 HOM_PyBuffer
buffer(values);
342 self->opaqueSetVertexIntAttribValuesFromString(
343 name, (
const char *)
buffer.myData,
buffer.myLength, int_type);
348 virtual void setPointStringAttribValues(
349 const char *name,
const std::vector<std::string> &values) = 0;
350 virtual void setPrimStringAttribValues(
351 const char *name,
const std::vector<std::string> &values) = 0;
352 virtual void setVertexStringAttribValues(
353 const char *name,
const std::vector<std::string> &values) = 0;
355 virtual void renamePointAttrib(
const char *old_name,
const char *new_name) = 0;
356 virtual void renamePrimAttrib(
const char *old_name,
const char *new_name) = 0;
357 virtual void renameVertexAttrib(
const char *old_name,
const char *new_name) = 0;
358 virtual void renameGlobalAttrib(
const char *old_name,
const char *new_name) = 0;
360 SWIGOUT(%newobject createPoint;)
362 virtual std::vector<HOM_ElemPtr<HOM_Point> >createPoints(
363 const std::vector<std::vector<double> > &point_positions) = 0;
364 virtual std::vector<HOM_ElemPtr<HOM_Point> >createPoints(
365 const std::vector<HOM_Vector3 *> &point_positions) = 0;
367 SWIGOUT(%newobject createPolygon;)
368 virtual HOM_Polygon *createPolygon(
bool is_closed=
true) = 0;
369 virtual std::vector<HOM_ElemPtr<HOM_Polygon> >createPolygons(
370 const std::vector<std::vector<HOM_Point *> > &
points,
371 bool is_closed=
true) = 0;
372 virtual std::vector<HOM_ElemPtr<HOM_Polygon> >createPolygons(
373 const std::vector<std::vector<int> > &point_numbers,
374 bool is_closed=
true) = 0;
376 SWIGOUT(%newobject createPacked;)
378 const char *packed_type,
381 SWIGOUT(%newobject createTetrahedron;)
382 virtual HOM_Prim *createTetrahedron() = 0;
384 SWIGOUT(%newobject createTetrahedronInPlace;)
388 SWIGOUT(%newobject createHexahedron;)
389 virtual HOM_Prim *createHexahedron() = 0;
391 SWIGOUT(%newobject createHexahedronInPlace;)
398 SWIGOUT(%newobject createNURBSCurve;)
399 SWIGOUT(%kwargs createNURBSCurve;)
400 virtual HOM_Face *createNURBSCurve(
int num_points=4,
bool is_closed=
false,
403 SWIGOUT(%newobject createBezierCurve;)
404 SWIGOUT(%kwargs createBezierCurve;)
405 virtual HOM_Face *createBezierCurve(
int num_points=4,
bool is_closed=
false,
408 SWIGOUT(%newobject createNURBSSurface;)
409 SWIGOUT(%kwargs createNURBSSurface;)
412 bool is_closed_in_u=
false,
bool is_closed_in_v=
false,
413 int order_u=4,
int order_v=4) = 0;
415 SWIGOUT(%newobject createBezierSurface;)
416 SWIGOUT(%kwargs createBezierSurface;)
419 bool is_closed_in_u=
false,
bool is_closed_in_v=
false,
420 int order_u=4,
int order_v=4) = 0;
422 SWIGOUT(%newobject createMeshSurface;)
423 SWIGOUT(%kwargs createMeshSurface;)
426 bool is_closed_in_u=
false,
bool is_closed_in_v=
false) = 0;
428 SWIGOUT(%newobject createVolume;)
433 SWIGOUT(%newobject createChannelPrim;)
434 SWIGOUT(%kwargs createChannelPrim;)
440 virtual void transformPrims(
441 const std::vector<HOM_Prim *> &prims,
const HOM_Matrix4 &matrix) = 0;
442 virtual void transformPrims(
449 virtual void deletePrims(
450 const std::vector<HOM_Prim *> &prims,
bool keep_points =
false) = 0;
451 virtual void deletePrims(
454 SWIGOUT(%kwargs deletePrimsOutsideBoundingBox;)
455 virtual void deletePrimsOutsideBoundingBox(
458 virtual void deletePoints(
const std::vector<HOM_Point *> &
points) = 0;
470 bool transform_as_normal,
471 bool create_local_variable) = 0;
475 double default_value,
476 bool transform_as_normal,
477 bool create_local_variable) = 0;
481 const char *default_value,
482 bool transform_as_normal,
483 bool create_local_variable) = 0;
488 const std::vector<int64> &default_value,
489 bool transform_as_normal,
490 bool create_local_variable) = 0;
495 const std::vector<double> &default_value,
496 bool transform_as_normal,
497 bool create_local_variable) = 0;
502 const std::vector<std::string> &default_value,
503 bool transform_as_normal,
504 bool create_local_variable) = 0;
509 const std::map<std::string, hboost::any> &default_value,
510 bool transform_as_normal,
511 bool create_local_variable) = 0;
513 SWIGOUT(%kwargs addArrayAttrib;)
514 SWIGOUT(%newobject addArrayAttrib;)
518 int64 tuple_size = 1) = 0;
521 virtual void setGlobalAttribValue(
523 virtual void setGlobalAttribValue(
525 virtual void setGlobalAttribValue(
526 HOM_Attrib &attrib,
const char *attrib_value) = 0;
527 virtual void setGlobalAttribValue(
528 HOM_Attrib &attrib,
const std::vector<int64> &attrib_value) = 0;
529 virtual void setGlobalAttribValue(
530 HOM_Attrib &attrib,
const std::vector<double> &attrib_value) = 0;
531 virtual void setGlobalAttribValue(
532 HOM_Attrib &attrib,
const std::vector<std::string> &attrib_value) = 0;
533 virtual void setGlobalAttribValue(
534 HOM_Attrib &attrib,
const std::map<std::string, hboost::any> &attrib_value) = 0;
535 virtual void setGlobalAttribValue(
536 HOM_Attrib &attrib,
const std::vector<std::map<std::string,hboost::any> > &attrib_value) = 0;
538 virtual void setGlobalAttribValue(
539 const char *attrib_name,
int64 attrib_value) = 0;
540 virtual void setGlobalAttribValue(
541 const char *attrib_name,
double attrib_value) = 0;
542 virtual void setGlobalAttribValue(
543 const char *attrib_name,
const char *attrib_value) = 0;
551 virtual void setGlobalAttribValue(
552 const char *attrib_name,
const std::vector<int64> &attrib_value) = 0;
553 virtual void setGlobalAttribValue(
554 const char *attrib_name,
const std::vector<double> &attrib_value) = 0;
555 virtual void setGlobalAttribValue(
556 const char *attrib_name,
557 const std::vector<std::string> &attrib_value) = 0;
558 virtual void setGlobalAttribValue(
559 const char *attrib_name,
560 const std::map<std::string, hboost::any> &attrib_value) = 0;
561 virtual void setGlobalAttribValue(
562 const char *attrib_name,
563 const std::vector<std::map<std::string,hboost::any> > &attrib_value) = 0;
565 virtual void copyAttrib(
HOM_Attrib *attrib) = 0;
566 virtual void copyAttribs(
const std::vector<HOM_Attrib *> &attribs) = 0;
577 virtual int _copyPrimsForDrawable(
HOM_Geometry &src_geo,
const std::vector<HOM_Prim*> &prims) = 0;
578 virtual int _copyClearForDrawable(
bool keep) = 0;
580 virtual int _copyCacheTopology(
HOM_Geometry &src_geo) = 0;
582 virtual std::vector<HOM_ElemPtr<HOM_Point> > _getPointChildren(
HOM_Point *pt) = 0;
586 InterpreterObject attribValue(
const char *name)
587 {
return HOMattribValue(*
self, name); }
589 InterpreterObject attribValue(
HOM_Attrib &attrib)
590 {
return HOMattribValue(*
self, attrib); }
594 virtual std::vector<std::string> attributeCaptureRegions() = 0;
595 virtual std::vector<std::string> attributeCaptureObjectPaths() = 0;
598 virtual std::vector<std::string> intrinsicNames() = 0;
601 const char *intrinsic_name) = 0;
602 virtual size_t intrinsicSize(
const char *intrinsic_name) = 0;
603 virtual bool intrinsicReadOnly(
const char *intrinsic_name) = 0;
605 virtual void setIntrinsicValue(
const char *intrinsic_name,
double value) = 0;
606 virtual void setIntrinsicValue(
const char *intrinsic_name,
int value) = 0;
607 virtual void setIntrinsicValue(
const char *intrinsic_name,
int64 value) = 0;
608 virtual void setIntrinsicValue(
609 const char *intrinsic_name,
const char *
value) = 0;
610 virtual void setIntrinsicValue(
611 const char *intrinsic_name,
const std::vector<double> &
value) = 0;
612 virtual void setIntrinsicValue(
613 const char *intrinsic_name,
const std::vector<int> &
value) = 0;
614 virtual void setIntrinsicValue(
615 const char *intrinsic_name,
const std::vector<int64> &
value) = 0;
616 virtual void setIntrinsicValue(
617 const char *intrinsic_name,
const std::vector<std::string> &
value) = 0;
622 virtual void saveToFile(
const char *file_name) = 0;
624 virtual void loadFromFile(
const char *file_name) = 0;
634 virtual void clear() = 0;
640 const char *
pattern =
nullptr,
float min_hit=1e-2
f,
float max_hit=1e18f,
641 float tolerance=1e-2F) = 0;
643 virtual std::vector<int> _orderedPoints(
644 const char *groupname,
645 const char *corner_groupname,
648 virtual std::vector<HOM_ElemPtr<HOM_PointGroup> > pointGroups(
651 SWIGOUT(%newobject findPointGroup;)
653 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
655 SWIGOUT(%newobject createPointGroup;)
656 SWIGOUT(%kwargs createPointGroup;)
659 bool is_ordered =
false,
660 bool unique_name =
false) = 0;
662 virtual std::vector<HOM_ElemPtr<HOM_PrimGroup> > primGroups(
665 SWIGOUT(%newobject findPrimGroup;)
667 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
669 SWIGOUT(%newobject createPrimGroup;)
670 SWIGOUT(%kwargs createPrimGroup;)
673 bool is_ordered =
false,
674 bool unique_name =
false) = 0;
676 virtual std::vector<HOM_ElemPtr<HOM_EdgeGroup> > edgeGroups(
679 SWIGOUT(%newobject findEdgeGroup;)
681 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
683 SWIGOUT(%newobject createEdgeGroup;)
685 const char *name) = 0;
687 virtual std::vector<HOM_ElemPtr<HOM_VertexGroup> > vertexGroups(
690 SWIGOUT(%newobject findVertexGroup;)
692 const char *name,
HOM_EnumValue &scope = HOM_groupScope::Public) = 0;
694 SWIGOUT(%newobject createVertexGroup;)
696 const char *name,
bool is_ordered=
false) = 0;
710 nearestPrim(
const std::vector<double> &
position) = 0;
712 SWIGOUT(%newobject nearestPoint;)
715 nearestPoint(
const std::vector<double> &
position,
716 const char *ptgroup =
nullptr,
717 double max_radius = 1e+18
f) = 0;
719 SWIGOUT(%kwargs nearestPoints;)
721 nearestPoints(
const std::vector<double> &
position,
723 const char *ptgroup =
nullptr,
724 double max_radius = 1e+18
f) = 0;
728 primLoop(
const std::vector<HOM_Prim *> &prims,
729 HOM_EnumValue &loop_type = HOM_componentLoopType::Partial) = 0;
732 pointLoop(
const std::vector<HOM_Point *> &
points,
733 HOM_EnumValue &loop_type = HOM_componentLoopType::Partial) = 0;
736 edgeLoop(
const std::vector<HOM_Edge *> &edges,
738 bool full_loop_per_edge =
true,
739 bool force_ring =
false,
740 bool allow_ring =
true) = 0;
742 virtual std::vector<HOM_Vector3>
743 pointNormals(
const std::vector<HOM_Point *> &
points) = 0;
744 virtual std::vector<HOM_Vector3>
753 const char *purpose = NULL,
754 const char *traversal = NULL,
755 const char *path_attrib_name = NULL,
756 const char *name_attrib_name = NULL,
757 bool strip_layers =
false,
759 int lop_output_index = -1) = 0;
762 virtual void importUsdStageOpaque(
765 const char *purpose = NULL,
766 const char *traversal = NULL,
767 const char *path_attrib_name = NULL,
768 const char *name_attrib_name = NULL,
774 %kwargs importUsdStage;
776 InterpreterObject stage,
778 const char *purpose = NULL,
779 const char *traversal = NULL,
780 const char *path_attrib_name = NULL,
781 const char *name_attrib_name = NULL,
784 return self->importUsdStageOpaque(
785 stage, selection_rule, purpose, traversal,
786 path_attrib_name, name_attrib_name, frame);
796 SWIGOUT(%newobject _guDetailHandle;)
801 virtual HOMF_GeometryHandle& _geometryHandle() = 0;
803 virtual std::vector<int> vexAttribDataId() = 0;
805 virtual int64 modificationCounter() = 0;
806 virtual void incrementModificationCounter() = 0;
808 virtual void incrementAllDataIds() = 0;
810 SWIGOUT(%kwargs incrementDataIdsForAddOrRemove;)
811 virtual void incrementDataIdsForAddOrRemove(
812 bool for_points=
true,
bool for_prims=
true) = 0;
814 SWIGOUT(%newobject primitiveIntrinsicsDataId;)
816 virtual void incrementPrimitiveIntrinsicsDataId() = 0;
818 SWIGOUT(%newobject topologyDataId;)
820 virtual void incrementTopologyDataId() = 0;
822 SWIGOUT(%kwargs generateAttribMenu;)
823 virtual std::vector<std::string> generateAttribMenu(
828 bool array_type =
true,
829 bool scalar_type =
true,
830 bool case_sensitive =
true,
832 bool decode_tokens =
false) = 0;
835 virtual std::vector<std::string> _generateGroupMenu(
836 const std::vector<HOM_EnumValue *> &group_types,
837 bool include_selection,
838 bool include_name_attrib,
844 virtual bool isReadOnly() = 0;
846 virtual void _attribInfo(
const char *name,
int &attr_data_type,
int &attr_size,
bool &is_array_type) = 0;
848 virtual std::vector<std::string> extractPackedPaths(
const char *
pattern) = 0;
849 SWIGOUT(%newobject unpackFromFolder;)
851 SWIGOUT(%newobject unpackPropertiesFromFolder;)
852 virtual std::map<std::string, hboost::any> packedFolderProperties(
const char *
path) = 0;
854 virtual bool packToFolder(
857 bool is_folder =
false,
858 bool is_visible =
true,
859 bool pack =
true) = 0;
861 virtual bool removeFromFolder(
const char *
path) = 0;
GT_API const UT_StringHolder selection
__hostdev__ uint64_t pointCount() const
#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 GLfloat * value
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
GLint GLint GLsizei GLint GLenum GLenum type
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()