35 #include "SOP_CentroidDivide.proto.h"
44 using namespace UT::Literal;
45 using namespace HDK_Sample;
49 const UT_StringHolder SOP_CentroidDivide::theSOPTypeName(
"hdk_centroiddivide"_sh);
56 SOP_CentroidDivide::theSOPTypeName,
57 "HDK Centroid Divide",
58 SOP_CentroidDivide::myConstructor,
59 SOP_CentroidDivide::buildTemplates(),
87 static const char *theDsFile = R
"THEDSFILE(
89 name hdk_centroiddivide
96 parmtag { "script_action" "import soputils\nkwargs['geometrytype'] = (hou.geometryType.Primitives,)\nkwargs['inputindex'] = 0\nsoputils.selectGroupParm(kwargs)" }
97 parmtag { "script_action_help" "Select primitives from an available viewport." }
98 parmtag { "script_action_icon" "BUTTONS_reselect" }
104 SOP_CentroidDivide::buildTemplates()
122 SOP_CentroidDivide::myConstructor(
128 SOP_CentroidDivide::SOP_CentroidDivide(
151 return "Input Geometry";
153 return "Invalid Source";
178 void cook(
const CookParms &cookparms)
const override;
187 return theSOPCentroidDivideVerb.get();
193 auto &&sopparms = cookparms.
parms<SOP_CentroidDivideParms>();
217 exint num_new_prims = 0;
218 for (
GA_Offset prim_off : detail->getPrimitiveRange(group))
221 if (detail->getPrimitiveTypeId(prim_off) !=
GA_PRIMPOLY
222 || !detail->getPrimitiveClosedFlag(prim_off))
226 rm_polys.
append(prim_off);
229 num_new_prims += detail->getPrimitiveVertexCount(prim_off);
241 GA_Offset point_block_start = detail->appendPointBlock(num_new_points);
246 GA_Offset prim_block_start = detail->appendPrimitivesAndVertices(
255 GA_Offset new_prim_vtx0 = vertex_block_start;
259 int nvtx = detail->getPrimitiveVertexCount(source_prim);
262 for (
int vi = 0; vi < nvtx; ++vi)
264 int vi_next = (vi + 1) % nvtx;
266 GA_Offset source_vtx1 = detail->getPrimitiveVertexOffset(source_prim, vi);
267 GA_Offset source_vtx2 = detail->getPrimitiveVertexOffset(source_prim, vi_next);
268 GA_Offset source_pt1 = detail->vertexPoint(source_vtx1);
269 GA_Offset source_pt2 = detail->vertexPoint(source_vtx2);
273 GA_Offset new_vtx0 = new_prim_vtx0 + 3 * vi;
280 detail->setVertexPoint(new_vtx0, new_pt);
284 detail->setVertexPoint(new_vtx1, source_pt1);
285 detail->setVertexPoint(new_vtx2, source_pt2);
330 for (
int vi = 1; vi < nvtx; ++vi)
332 GA_Offset new_vtx0 = new_prim_vtx0 + 3 * vi;
340 new_prim_vtx0 += 3 * nvtx;
360 detail->destroyPrimitiveOffsets(
GA_Range(detail->getPrimitiveMap(), rm_polys),
true);
367 GA_Range prim_range(detail->getPrimitiveMap(),
369 prim_block_start+num_new_prims);
373 cookparms.
select(prim_range);
static PRM_ChoiceList primGroupMenu
void scaleAttributeValues(GA_Offset dest, fpreal scale)
~SOP_CentroidDivideVerb() override
void addAttributeValues(GA_Offset dest, GA_Offset src, fpreal scale, IncludeP add_p)
void copyAttributeValues(GA_Offset dest, GA_Offset src)
FromType append(ToType value)
Add a single entry (may grow array)
void addAttributeValues(GA_Offset dest, GA_Offset src, fpreal scale=1)
void setChoiceListPtr(const UT_StringRef &name, PRM_ChoiceList *list)
bool addOperator(OP_Operator *op, std::ostream *err=nullptr)
SOP_NodeParms * allocParms() const override
exint GA_Size
Defines the bit width for index and offset types in GA.
A range of elements in an index-map.
const char * inputLabel(OP_InputIdx idx) const overridefinal
void cook(const CookParms &cookparms) const override
Compute the output geometry.
Constructs a PRM_Template list from an embedded .ds file or an istream.
static const UT_StringHolder theSOPTypeName
PRM_Template * templates() const
const GA_PrimitiveGroup * parsePrimitiveGroups(const char *pat, const GroupCreator &creator, bool numok=true, bool ordered=false, bool strict=false, GA_Index prim_offset=GA_Index(0), ParseInfo *info=0)
CookMode cookMode(const SOP_NodeParms *parms) const override
OP_ERROR cookMyselfAsVerb(OP_Context &context)
GLuint const GLchar * name
const SOP_NodeVerb * cookVerb() const overridefinal
UT_StringHolder name() const override
void select(GA_GroupType gtype=GA_GROUP_PRIMITIVE) const
GLenum GLenum GLsizei void * table
GA_API const UT_StringHolder parms
OP_ERROR cookMySop(OP_Context &context) overridefinal
void scaleAttributeValues(GA_Offset dest, fpreal scale, IncludeP scale_p)
bool selectionEnabled() const
void newSopOperator(OP_OperatorTable *table)
void copyAttributeValues(GA_Offset dest, GA_Offset src, IncludeP copy_p)
~SOP_CentroidDivide() override
GU_DetailHandle & gdh() const
The initial state of gdh depends on the cookMode()
SYS_FORCE_INLINE bool isstring() const
SYS_FORCE_INLINE FromType entries() const
Returns the number of used elements in the list (always <= capacity())