64 #define QUADS_AS_BILINEAR_PATCHES 1
66 using namespace HDK_Sample;
78 sopAccumulateTriangles(
85 sopAccumulateSegments(
92 using namespace SOP_WindingNumberEnums;
99 #define GA_INVALID_DATAID GA_DataId(-1)
108 , mySubtendedAngleTree()
117 , myMetaCacheCount(-1)
126 const bool has_group = (prim_group !=
nullptr);
127 if (mySubtendedAngleTree.isClear() &&
128 topology_data_id == myTopologyDataID &&
129 primitive_list_data_id == myPrimitiveListDataID &&
130 P_data_id == myPDataID &&
131 approx_order == myApproxOrder &&
132 has_group == myHadGroup &&
134 group_string == myGroupString &&
140 mySubtendedAngleTree.clear();
141 myPositions2D.clear();
145 myTopologyDataID = topology_data_id;
146 myPrimitiveListDataID = primitive_list_data_id;
147 myPDataID = P_data_id;
148 myApproxOrder = approx_order;
149 myHadGroup = has_group;
150 myGroupString = group_string;
155 myTrianglePoints.setSize(0);
156 myTrianglePoints.setCapacity(3*nprimitives);
157 myPositions3D.setSize(0);
158 myPositions3D.setCapacity(0);
169 mesh_ptgroup.
combine(prim_group);
170 myPositions3D.setSizeNoInit(mesh_ptgroup.
entries());
175 ptmap[ptoff] = ptnum;
176 myPositions3D[ptnum] = mesh_geo.
getPos3(ptoff);
185 for (
GA_Offset primoff = start; primoff <
end; ++primoff)
187 sopAccumulateTriangles(&mesh_geo, primoff, ptmap, myTrianglePoints);
191 mySolidAngleTree.init(myTrianglePoints.size()/3, myTrianglePoints.array(), myPositions3D.size(), myPositions3D.array(), approx_order);
198 const int approx_order,
199 const int axis0,
const int axis1)
204 const bool has_group = (prim_group !=
nullptr);
205 if (mySolidAngleTree.isClear() &&
206 topology_data_id == myTopologyDataID &&
207 primitive_list_data_id == myPrimitiveListDataID &&
208 P_data_id == myPDataID &&
209 approx_order == myApproxOrder &&
211 has_group == myHadGroup &&
213 group_string == myGroupString &&
219 mySolidAngleTree.clear();
220 myPositions3D.clear();
224 myTopologyDataID = topology_data_id;
225 myPrimitiveListDataID = primitive_list_data_id;
226 myPDataID = P_data_id;
227 myApproxOrder = approx_order;
229 myHadGroup = has_group;
230 myGroupString = group_string;
236 myTrianglePoints.setSize(0);
237 myTrianglePoints.setCapacity(2*nprimitives);
238 myPositions2D.setSize(0);
239 myPositions2D.setCapacity(0);
249 myPositions2D[ptnum] =
UT_Vector2(pos[axis0],pos[axis1]);
257 mesh_ptgroup.
combine(prim_group);
258 myPositions2D.setSizeNoInit(mesh_ptgroup.
entries());
261 mesh_geo.
forEachPoint(&mesh_ptgroup, [&mesh_geo,
this,&ptmap,&ptnum,axis0,axis1](
const GA_Offset ptoff)
263 ptmap[ptoff] = ptnum;
265 myPositions2D[ptnum] =
UT_Vector2(pos[axis0],pos[axis1]);
274 for (
GA_Offset primoff = start; primoff <
end; ++primoff)
276 sopAccumulateSegments(&mesh_geo, primoff, ptmap, myTrianglePoints);
280 mySubtendedAngleTree.init(myTrianglePoints.size()/2, myTrianglePoints.array(), myPositions2D.size(), myPositions2D.array(), approx_order);
285 mySolidAngleTree.clear();
286 mySubtendedAngleTree.clear();
287 myTrianglePoints.setCapacity(0);
288 myPositions2D.setCapacity(0);
289 myPositions3D.setCapacity(0);
295 myGroupString.clear();
297 myMetaCacheCount = -1;
334 virtual void cook(
const CookParms &cookparms)
const;
395 cppname "QueryPoints"
399 parmtag { "script_action" "import soputils\nkwargs['geometrytype'] = (hou.geometryType.Points,)\nkwargs['inputindex'] = 0\nsoputils.selectGroupParm(kwargs)" }
400 parmtag { "script_action_help" "Select geometry from an available viewport.\nShift-click to turn on Select Groups." }
401 parmtag { "script_action_icon" "BUTTONS_reselect" }
406 label "Mesh Primitives"
409 parmtag { "script_action" "import soputils\nkwargs['geometrytype'] = (hou.geometryType.Primitives,)\nkwargs['inputindex'] = 1\nsoputils.selectGroupParm(kwargs)" }
410 parmtag { "script_action_help" "Select geometry from an available viewport.\nShift-click to turn on Select Groups." }
411 parmtag { "script_action_icon" "BUTTONS_reselect" }
412 parmtag { "sop_input" "1" }
416 label "Winding Number Type"
421 "xy" "2D in XY Plane"
422 "yz" "2D in YZ Plane"
423 "zx" "2D in ZX Plane"
428 label "Attribute Name"
430 default { "winding_number" }
434 cppname "AsSolidAngle"
435 label "Scale to Solid Angle"
443 label "Negate Value (Reverse)"
449 cppname "FullAccuracy"
450 label "Full Accuracy (Slow)"
456 cppname "AccuracyScale"
457 label "Accuracy Scale"
461 disablewhen "{ fullaccuracy == 1 }"
471 sopSumContributions3D(
478 if (end-start > 1024)
484 sopSumContributions3D(&sum0, query_point, mesh_geo, primoffs, start, mid);
486 sopSumContributions3D(&sum1, query_point, mesh_geo, primoffs, mid, end);
492 double local_sum = 0;
493 for (
exint arrayi = start; arrayi <
end; ++arrayi)
502 if (n < 3 || !closed)
514 local_sum += poly_sum;
529 #if QUADS_AS_BILINEAR_PATCHES
532 const double poly_sum =
536 local_sum += poly_sum;
552 local_sum += poly_sum;
560 for (
int i = 0; i < 4; ++i)
563 if (tet.isFaceShared(i))
576 local_sum += tet_sum;
594 local_sum += poly_sum;
605 #if QUADS_AS_BILINEAR_PATCHES
608 const double poly_sum =
612 local_sum += poly_sum;
628 soup_sum += poly_sum;
630 local_sum += soup_sum;
638 for (
int row = 0;
row < nquadrows; ++
row)
640 for (
int col = 0; col < nquadcols; ++col)
647 #if QUADS_AS_BILINEAR_PATCHES
650 const double poly_sum =
654 mesh_sum += poly_sum;
657 local_sum += mesh_sum;
664 if (nquadcols <= 0 || nquadrows <= 0)
680 for (
int row = 0;
row < nquadrows; ++
row)
682 for (
int col = 0; col < nquadcols; ++col)
696 #if QUADS_AS_BILINEAR_PATCHES
699 const double poly_sum =
703 surf_sum += poly_sum;
706 local_sum += surf_sum;
720 double determinant = transform.determinant();
721 if (determinant == 0)
724 int failed = transform.invert();
728 query_minus_centre.rowVecMult(transform);
729 float length2 = query_minus_centre.length2();
731 double sphere_sum = 0;
734 else if (length2 == 1)
738 sphere_sum = -sphere_sum;
740 local_sum += sphere_sum;
747 sopSumContributions2D(
753 const int axis0,
const int axis1)
755 if (end-start > 1024)
761 sopSumContributions2D(&sum0, query_point, mesh_geo, primoffs, start, mid, axis0, axis1);
763 sopSumContributions2D(&sum1, query_point, mesh_geo, primoffs, mid, end, axis0, axis1);
769 double local_sum = 0;
770 for (
exint arrayi = start; arrayi <
end; ++arrayi)
779 if (n < 2+
int(closed))
796 local_sum += poly_sum;
819 pos = poly.getPos3(i);
825 soup_sum += poly_sum;
827 local_sum += soup_sum;
835 for (
int row = 0;
row < nquadrows; ++
row)
837 for (
int col = 0; col < nquadcols; ++col)
844 for (
GA_Size i = 1; i < 4; ++i)
846 pos = poly.getPos3(i);
852 mesh_sum += poly_sum;
855 local_sum += mesh_sum;
862 if (nquadcols <= 0 || nquadrows <= 0)
878 for (
int row = 0;
row < nquadrows; ++
row)
880 for (
int col = 0; col < nquadcols; ++col)
899 surf_sum += poly_sum;
902 local_sum += surf_sum;
913 double curve_sum = 0;
918 grevilles.
append(grevilles[0]);
920 UT_Vector2D prev(grevilles[0].getCVImage()[axis0], grevilles[0].getCVImage()[axis1]);
921 for (
int i = 0; i < nedges; ++i)
923 const UT_Vector2D next(grevilles[i].getCVImage()[axis0], grevilles[i].getCVImage()[axis1]);
926 local_sum += curve_sum;
933 sopAccumulateTriangles(
939 const bool has_ptmap = !ptmap.
isEmpty();
946 if (n < 3 || !closed)
954 const int p0i = has_ptmap ? ptmap[p0] :
int(mesh_geo->
pointIndex(p0));
956 int previ = has_ptmap ? ptmap[prev] :
int(mesh_geo->
pointIndex(prev));
960 const int nexti = has_ptmap ? ptmap[next] :
int(mesh_geo->
pointIndex(next));
961 triangle_points.
append(p0i);
962 triangle_points.
append(previ);
963 triangle_points.
append(nexti);
972 for (
int i = 0; i < 4; ++i)
975 if (tet.isFaceShared(i))
982 const int ai = has_ptmap ? ptmap[
a] :
int(mesh_geo->
pointIndex(a));
983 const int bi = has_ptmap ? ptmap[
b] :
int(mesh_geo->
pointIndex(b));
984 const int ci = has_ptmap ? ptmap[
c] :
int(mesh_geo->
pointIndex(c));
985 triangle_points.
append(ai);
986 triangle_points.
append(bi);
987 triangle_points.
append(ci);
1004 const int p0i = has_ptmap ? ptmap[p0] :
int(mesh_geo->
pointIndex(p0));
1005 GA_Offset prev = poly.getPointOffset(1);
1006 int previ = has_ptmap ? ptmap[prev] :
int(mesh_geo->
pointIndex(prev));
1009 const GA_Offset next = poly.getPointOffset(i);
1010 const int nexti = has_ptmap ? ptmap[next] :
int(mesh_geo->
pointIndex(next));
1011 triangle_points.
append(p0i);
1012 triangle_points.
append(previ);
1013 triangle_points.
append(nexti);
1024 for (
int row = 0;
row < nquadrows; ++
row)
1026 for (
int col = 0; col < nquadcols; ++col)
1029 const GA_Offset a = poly.getPointOffset(0);
1030 const GA_Offset b = poly.getPointOffset(1);
1031 const GA_Offset c = poly.getPointOffset(2);
1032 const GA_Offset d = poly.getPointOffset(3);
1033 const int ai = has_ptmap ? ptmap[
a] :
int(mesh_geo->
pointIndex(a));
1034 const int bi = has_ptmap ? ptmap[
b] :
int(mesh_geo->
pointIndex(b));
1035 const int ci = has_ptmap ? ptmap[
c] :
int(mesh_geo->
pointIndex(c));
1036 const int di = has_ptmap ? ptmap[d] :
int(mesh_geo->
pointIndex(d));
1037 triangle_points.
append(ai);
1038 triangle_points.
append(bi);
1039 triangle_points.
append(ci);
1040 triangle_points.
append(ai);
1041 triangle_points.
append(ci);
1042 triangle_points.
append(di);
1049 sopAccumulateSegments(
1055 const bool has_ptmap = !ptmap.
isEmpty();
1062 if (n < 2+
int(closed))
1066 int previ = has_ptmap ? ptmap[prev] :
int(mesh_geo->
pointIndex(prev));
1067 const int pt0i = previ;
1071 const int nexti = has_ptmap ? ptmap[next] :
int(mesh_geo->
pointIndex(next));
1072 segment_points.
append(previ);
1073 segment_points.
append(nexti);
1078 segment_points.
append(previ);
1079 segment_points.
append(pt0i);
1097 int previ = has_ptmap ? ptmap[prev] :
int(mesh_geo->
pointIndex(prev));
1098 const int pt0i = previ;
1101 const GA_Offset next = poly.getPointOffset(i);
1102 const int nexti = has_ptmap ? ptmap[next] :
int(mesh_geo->
pointIndex(next));
1103 segment_points.
append(previ);
1104 segment_points.
append(nexti);
1107 segment_points.
append(previ);
1108 segment_points.
append(pt0i);
1117 for (
int row = 0;
row < nquadrows; ++
row)
1119 for (
int col = 0; col < nquadcols; ++col)
1122 const GA_Offset a = poly.getPointOffset(0);
1123 const GA_Offset b = poly.getPointOffset(1);
1124 const GA_Offset c = poly.getPointOffset(2);
1125 const GA_Offset d = poly.getPointOffset(3);
1126 const int ai = has_ptmap ? ptmap[
a] :
int(mesh_geo->
pointIndex(a));
1127 const int bi = has_ptmap ? ptmap[
b] :
int(mesh_geo->
pointIndex(b));
1128 const int ci = has_ptmap ? ptmap[
c] :
int(mesh_geo->
pointIndex(c));
1129 const int di = has_ptmap ? ptmap[d] :
int(mesh_geo->
pointIndex(d));
1130 segment_points.
append(ai);
1131 segment_points.
append(bi);
1132 segment_points.
append(bi);
1133 segment_points.
append(ci);
1134 segment_points.
append(ci);
1135 segment_points.
append(di);
1136 segment_points.
append(di);
1137 segment_points.
append(ai);
1150 const bool as_solid_angle,
1179 if (boss.wasInterrupted())
1192 sopSumContributions3D(&sum, query_point, mesh_geo, primoffs, 0, primoffs.
size());
1194 if (!as_solid_angle)
1199 winding_number_attrib.
set(ptoff, sum);
1212 const bool as_solid_angle,
1235 UTparallelFor(point_range, [query_points,mesh_geo,winding_number_attrib,&primoffs,as_solid_angle,negate,&boss,axis0,axis1](
const GA_SplittableRange &r)
1243 if (boss.wasInterrupted())
1247 const UT_Vector2D query_point(query_point_3d[axis0], query_point_3d[axis1]);
1257 sopSumContributions2D(&sum, query_point, mesh_geo, primoffs, 0, primoffs.
size(), axis0, axis1);
1259 if (!as_solid_angle)
1264 winding_number_attrib.
set(ptoff, sum);
1275 const double accuracy_scale,
1277 const bool as_solid_angle,
1282 UTparallelFor(point_range, [query_points,&winding_number_attrib,&solid_angle_tree,as_solid_angle,negate,accuracy_scale,&boss](
const GA_SplittableRange &r)
1288 if (boss.wasInterrupted())
1297 if (!as_solid_angle)
1302 winding_number_attrib.
set(ptoff, sum);
1313 const double accuracy_scale,
1315 const bool as_angle,
1322 UTparallelFor(point_range, [query_points,&winding_number_attrib,&subtended_angle_tree,as_angle,negate,accuracy_scale,&boss,axis0,axis1](
const GA_SplittableRange &r)
1328 if (boss.wasInterrupted())
1334 const UT_Vector2D query_point(query_point_3d[axis0], query_point_3d[axis1]);
1336 double sum = subtended_angle_tree.
computeAngle(query_point, accuracy_scale);
1343 winding_number_attrib.
set(ptoff, sum);
1362 if (!winding_number_attrib.
isValid())
1365 if (!winding_number_attrib.
isValid())
1378 const UT_StringHolder &mesh_prim_group_string = sopparms.getMeshPrims();
1380 if (mesh_prim_group_string.
isstring())
1384 mesh_prim_group_string.
c_str(),
1385 mesh_geo,
true, success);
1389 const UT_StringHolder &query_point_group_string = sopparms.getQueryPoints();
1391 if (query_point_group_string.
isstring())
1395 query_point_group_string.
c_str(),
1396 query_points,
true, success);
1401 const bool full_accuracy = sopparms.getFullAccuracy();
1402 const bool as_solid_angle = sopparms.getAsSolidAngle();
1404 Type winding_number_type = sopparms.getType();
1406 if (winding_number_type == Type::XYZ)
1411 const bool negate = !sopparms.getNegate();
1417 query_points, point_range,
1418 mesh_geo, mesh_prim_group,
1419 winding_number_attrib,
1420 as_solid_angle, negate);
1424 sopcache->update3D(*mesh_geo, mesh_prim_group, mesh_prim_group_string, 2);
1430 query_points, point_range,
1431 solid_angle_tree, accuracy_scale,
1432 winding_number_attrib,
1433 as_solid_angle, negate);
1438 int axis0 =
int(winding_number_type)-1;
1439 int axis1 = (axis0 == 2) ? 0 : (axis0+1);
1441 const bool negate = sopparms.getNegate();
1447 query_points, point_range,
1448 mesh_geo, mesh_prim_group,
1449 winding_number_attrib,
1450 as_solid_angle, negate,
1455 sopcache->update2D(*mesh_geo, mesh_prim_group, mesh_prim_group_string, 2, axis0, axis1);
1461 query_points, point_range,
1462 subtended_angle_tree, accuracy_scale,
1463 winding_number_attrib,
1464 as_solid_angle, negate,
static PRM_ChoiceList primGroupMenu
void getUGrevilles(UT_FloatArray &ugrevilles) const
GA_DataId myPrimitiveListDataID
SYS_FORCE_INLINE void bumpDataId()
virtual void cook(const CookParms &cookparms) const
This is the function that does the actual work.
GLboolean GLboolean GLboolean b
UT_Array< UT_Vector3 > myPositions3D
SYS_FORCE_INLINE GA_Offset getPointOffset(GA_Size i) const
SYS_FORCE_INLINE GA_Primitive * getPrimitive(GA_Offset prim_off)
fpreal64 getAccuracyScale() const
virtual UT_StringHolder name() const
UT_StringHolder myGroupString
const GA_IndexMap & getPrimitiveMap() const
SYS_FORCE_INLINE GA_Size getVertexCount() const
Return the number of vertices used by this primitive.
virtual CookMode cookMode(const SOP_NodeParms *parms) const
static OP_Node * myConstructor(OP_Network *net, const char *name, OP_Operator *op)
GA_DataId getDataId() const
Iteration over a range of elements.
void setChoiceListPtr(const UT_StringRef &name, PRM_ChoiceList *list)
SYS_FORCE_INLINE int getPrimitiveTypeId(GA_Offset primoff) const
UT_Vector2T< float > UT_Vector2
GA_Attribute * addFloatTuple(GA_AttributeOwner owner, GA_AttributeScope scope, const UT_StringHolder &name, int tuple_size, const GA_Defaults &defaults=GA_Defaults(0.0), const UT_Options *creation_args=0, const GA_AttributeOptions *attribute_options=0, GA_Storage storage=GA_STORE_REAL32, const GA_ReuseStrategy &reuse=GA_ReuseStrategy())
void update3D(const GA_Detail &mesh_geo, const GA_PrimitiveGroup *prim_group, const UT_StringHolder &group_string, const int approx_order)
#define GA_INVALID_DATAID
bool blockAdvance(GA_Offset &start, GA_Offset &end)
GA_Size entries() const overridefinal
Will return the number of primary elements.
void setSizeNoInit(exint newsize)
bool getAttributeAsArray(const GA_Attribute *atr, const GA_Range &range, UT_Array< T > &result) const
Get/set all the point attribute data from/to a contiguous array.
bool evaluateInteriorPoint(GA_Offset result_vtx, GA_AttributeRefMap &map, fpreal u, fpreal v, fpreal w=0) const
SYS_FORCE_INLINE T * SYSconst_cast(const T *foo)
SYS_FORCE_INLINE bool getExtraFlag() const
Synonym for isClosed()
GA_DataId getDataId() const
Return the data ID for the topology attributes.
GA_Attribute * getP()
Convenience method to access the P attribute.
void setTrivial(ToType startvalue, GA_Size size)
Makes the list a trivial list with the specified start value and size.
void getVGrevilles(UT_FloatArray &vgrevilles) const
void setTrivialRange(FromType startindex, ToType startvalue, GA_Size nelements)
static const SOP_NodeVerb::Register< SOP_WindingNumberVerb > theVerb
SYS_FORCE_INLINE TO_T UTverify_cast(FROM_T from)
bool addOperator(OP_Operator *op, std::ostream *err=nullptr)
SYS_FORCE_INLINE UT_Vector3 getPos3(GA_Offset ptoff) const
The ptoff passed is the point offset.
static const UT_StringHolder theSOPTypeName
void UTparallelFor(const Range &range, const Body &body, const int subscribe_ratio=2, const int min_grain_size=1, const bool force_use_task_scope=false)
SYS_FORCE_INLINE bool isClosed() const
static PRM_ChoiceList pointGroupMenu
exint GA_Size
Defines the bit width for index and offset types in GA.
UT_ErrorSeverity sopAddError(int code, const char *msg=0, const UT_SourceLocation *loc=0) const
bool combine(const GA_Group *src) overridefinal
GLuint GLenum GLenum transform
UT_SolidAngle< float, float > mySolidAngleTree
void getLocalTransform(UT_Matrix3D &x) const override
void setCapacity(exint newcapacity)
T UTsignedSolidAngleQuad(const UT_Vector3T< T > &a, const UT_Vector3T< T > &b, const UT_Vector3T< T > &c, const UT_Vector3T< T > &d, const UT_Vector3T< T > &query)
GA_Range getPointRange(const GA_PointGroup *group=0) const
Get a range of all points in the detail.
const SOP_NodeVerb * cookVerb() const override
Constructs a PRM_Template list from an embedded .ds file or an istream.
virtual SOP_NodeParms * allocParms() const
SYS_FORCE_INLINE void forEachPoint(FUNCTOR &&functor) const
PRM_Template * templates() const
SYS_FORCE_INLINE GA_OffsetListRef getPrimitiveVertexList(GA_Offset primoff) const
SYS_FORCE_INLINE int getNumRows() const
GLboolean GLboolean GLboolean GLboolean a
T computeSolidAngle(const UT_Vector3T< T > &query_point, const T accuracy_scale=T(2.0)) const
SYS_FORCE_INLINE GA_Offset getNumPointOffsets() const
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
virtual SOP_NodeCache * allocCache() const
SYS_FORCE_INLINE const char * c_str() const
UT_Vector3T< fpreal64 > UT_Vector3D
SYS_FORCE_INLINE GA_Offset vertexPoint(GA_Offset vertex) const
Given a vertex, return the point it references.
SYS_FORCE_INLINE GA_DataId getDataId() const
SYS_FORCE_INLINE bool atEnd() const
exint getUniqueId() const
GA_Topology & getTopology()
SYS_FORCE_INLINE UT_Vector3 getPos3() const
The fast point position accessor.
T computeAngle(const UT_Vector2T< T > &query_point, const T accuracy_scale=T(2.0)) const
SYS_FORCE_INLINE bool isValid() const
SYS_FORCE_INLINE GA_Index pointIndex(GA_Offset offset) const
Given a point's data offset, return its index.
SYS_FORCE_INLINE bool isTrivialMap() const
T UTsignedAngleSegment(const UT_Vector2T< T > &a, const UT_Vector2T< T > &b, const UT_Vector2T< T > &query)
const GA_Attribute * findFloatTuple(GA_AttributeOwner owner, GA_AttributeScope scope, const UT_StringRef &name, int min_size=1, int max_size=-1) const
const GA_PointGroup * parsePointDetached(const char *pat, const GEO_Detail *pgdp, bool forceexistence, bool &success)
virtual ~SOP_WindingNumberCache()
UT_Array< UT_Vector2 > myPositions2D
void newSopOperator(OP_OperatorTable *table)
void UTparallelInvoke(bool parallel, F1 &&f1, F2 &&f2)
bool buildGrevilles(UT_Array< GEO_Greville > &dest) const
SYS_FORCE_INLINE void set(GA_Offset off, const T &val) const
SYS_FORCE_INLINE GA_Size getNumPrimitives() const
Return the number of primitives.
int64 getMetaCacheCount() const
GA_DataId myTopologyDataID
void update2D(const GA_Detail &mesh_geo, const GA_PrimitiveGroup *prim_group, const UT_StringHolder &group_string, const int approx_order, const int axis0, const int axis1)
const GU_Detail * inputGeo(exint idx) const
const GA_PrimitiveList & getPrimitiveList() const
const GA_PrimitiveGroup * parsePrimitiveDetached(const char *pat, const GEO_Detail *pgdp, bool forceexistence, bool &success)
SOP_NodeCache * cache() const
Container class for all geometry.
static const char *const theDsFile
This is the parameter interface string, below.
SYS_FORCE_INLINE int getNumCols() const
void bind(GA_Detail *gdp, GA_AttributeOwner owner, const UT_StringRef &name, int minsize=1)
UT_SubtendedAngle< float, float > mySubtendedAngleTree
GA_Range getPrimitiveRange(const GA_PrimitiveGroup *group=0) const
Get a range of all primitives in the detail.
static PRM_Template * buildTemplates()
T UTsignedSolidAngleTri(const UT_Vector3T< T > &a, const UT_Vector3T< T > &b, const UT_Vector3T< T > &c, const UT_Vector3T< T > &query)
GLenum GLsizei GLenum GLenum const void * table
GU_DetailHandle & gdh() const
The initial state of gdh depends on the cookMode()
bool fullBlockAdvance(GA_Offset &start, GA_Offset &end)
SYS_FORCE_INLINE bool isstring() const
UT_Array< int > myTrianglePoints
SYS_FORCE_INLINE FromType size() const
Returns the number of used elements in the list (always <= capacity())
static SYS_FORCE_INLINE const int * fastFaceIndices(GA_Size faceno)
SYS_FORCE_INLINE GA_Size getNumPoints() const
Return the number of points.
bool isEmpty() const
Returns true iff there are no occupied elements in the array.