HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GU_Insetter Class Reference

#include <GU_Insetter.h>

Public Types

enum  OffsetConversion { IDENTITY = 0, VERTEX_TO_POINT, VERTEX_TO_PRIMITIVE }
 

Public Member Functions

 GU_Insetter (const GU_Detail *gdp, int num_chains, int *chian_lengths, GA_Offset *joint_offsets, bool *closed_flags, const UT_Vector3 *edge_vel, GA_ROHandleV3 pos, const UT_Vector3 *joint_vel=nullptr, bool two_sided=true, OffsetConversion off_conv=IDENTITY, fpreal coplanar_tol=INSET_COPLANARITY_TOL, bool merge_branches=true, bool common_limit=false)
 
 ~GU_Insetter ()
 
UT_Vector3 getSrcInsetVector (int idx, fpreal inset, int *is_limit=nullptr)
 
UT_Vector3 getDstInsetVector (int idx, fpreal inset, int *is_limit=nullptr)
 
fpreal getLimit (bool positive=true)
 

Static Public Member Functions

static UT_Vector3 edgeVelocity (UT_Vector3 edge_vect, UT_Vector3 prim_nml)
 Helper methods for setting up an insetter: More...
 
static UT_Vector3 jointVelocity (UT_Vector3 v0, UT_Vector3 v1, UT_Vector3 b0, UT_Vector3 b1, fpreal min_coplanar_nml_diff_cos=INSET_COPLANARITY_TOL, bool *is_folded_joint=nullptr)
 
static bool isFoldedJoint (UT_Vector3 v0, UT_Vector3 v1, UT_Vector3 b0, UT_Vector3 b1, fpreal min_coplanar_nml_diff_cos, UT_Vector3 *n0=nullptr, UT_Vector3 *n1=nullptr)
 

Detailed Description

Definition at line 87 of file GU_Insetter.h.

Member Enumeration Documentation

OffsetConversion tells the insetter to optionally convert a joint given using a vertex offset into its wired primitive or point offset before evaluating the position attribute handle on it.

Enumerator
IDENTITY 
VERTEX_TO_POINT 
VERTEX_TO_PRIMITIVE 

Definition at line 95 of file GU_Insetter.h.

Constructor & Destructor Documentation

GU_Insetter::GU_Insetter ( const GU_Detail gdp,
int  num_chains,
int chian_lengths,
GA_Offset joint_offsets,
bool *  closed_flags,
const UT_Vector3 edge_vel,
GA_ROHandleV3  pos,
const UT_Vector3 joint_vel = nullptr,
bool  two_sided = true,
OffsetConversion  off_conv = IDENTITY,
fpreal  coplanar_tol = INSET_COPLANARITY_TOL,
bool  merge_branches = true,
bool  common_limit = false 
)

GU_Insetter works on one or more sequences of (point/primitive/vertex) offsets on a detail. Each sequence of offsets, along with a position attribute defines a chain of edges. The end-points of the edges, which we call the joints of the chain, can be repeated along the chain (an offset may appear multiple times in the same chain). Each edge of the chain is supplied with a velocity vector along which it will be slid. It is also possible to override the otherwise calculated joint velocities.

The number of chains is specified by 'num_chains'. The 'chain_lengths' array should have at least num_chains elements and specifies the number of joints in each chain. The 'joint_offsets' array must present the joint offsets for all chains back to back and therefore should have length (at least) equal to the sum of the elements in 'chain_lengths'.

Each chain can be "closed" or "open", respectively meaning an edge is or is not interpreted to exist between the last joint of the chain and its first. Setting 'closed_flags' to NULL indicates that all the chains are "closed". Otherwise the array to which it points must have least num_chains elements.

The 'edge_vel' array must always be supplied with exactly the same length as joint_offsets to indicate the velocity vector for the edge between the joint at a corresponding position and its successor. The velocity vector paired with the last joint of an open chain is ignored.

The 'joint_vel' array, provides overrides for the joint velocities that are automatically calculated based on edge velocities. Joints with override velocity set to (0, 0, 0) still get a calculated velocity. However, joints with preset velocities are ensured to always move in the given direction even after merging with other trajectories. If two joints with preset velocities collide, the insetting limit is reached.

Two sided insetters can evaluate both positive and negative inset amounts. If 'two-sided' is set to false, evaluation of inset position for negative isnet amounts will only use the initial joint velocity vectors.

'collinearity_tol' is the cosine of the largest angle between the normals of the planes scanned by two edge velocity vectors below which the planes are considered parallel.

GU_Insetter::~GU_Insetter ( )

Member Function Documentation

UT_Vector3 GU_Insetter::edgeVelocity ( UT_Vector3  edge_vect,
UT_Vector3  prim_nml 
)
inlinestatic

Helper methods for setting up an insetter:

Return the velocity vector for sliding an edge of a polygon with direction edge_vect, inward on the polygon parallel to itself. prim_nml must be a unit vector but edge_vect need not be.

Definition at line 657 of file GU_Insetter.h.

UT_Vector3 GU_Insetter::getDstInsetVector ( int  idx,
fpreal  inset,
int is_limit = nullptr 
)
fpreal GU_Insetter::getLimit ( bool  positive = true)

Returns the inset value beyond which insetting freezes, ie, the outcome stays the same for larger values. If no limit exists, -1 is returned. If the insetter is two-sided, the returned limit is the the limit of the positive side if 'positive' is set true or that of the negative side otherwise. If single-sided, the parameter is ignored. Note that the limit of the negative side is returned as a positive number if such a limit exists (and as -1 otherwise) and the actual limit value would be the negative of the returned amount.

UT_Vector3 GU_Insetter::getSrcInsetVector ( int  idx,
fpreal  inset,
int is_limit = nullptr 
)
bool GU_Insetter::isFoldedJoint ( UT_Vector3  v0,
UT_Vector3  v1,
UT_Vector3  b0,
UT_Vector3  b1,
fpreal  min_coplanar_nml_diff_cos,
UT_Vector3 n0 = nullptr,
UT_Vector3 n1 = nullptr 
)
inlinestatic

Test used to determine if a joint defined by velocity vectors b0 and b1 should be treated as a fold. In contrast to a flat joint where the joint moves along the bisector of the joint edges during insetting, a folded joint moves along the line of intersection of the two planes defined by the two velocity vectors. If n0 or n1 are non-NULL, the respective plane normals of the joint are returned.

Definition at line 569 of file GU_Insetter.h.

UT_Vector3 GU_Insetter::jointVelocity ( UT_Vector3  v0,
UT_Vector3  v1,
UT_Vector3  b0,
UT_Vector3  b1,
fpreal  min_coplanar_nml_diff_cos = INSET_COPLANARITY_TOL,
bool *  is_folded_joint = nullptr 
)
inlinestatic

Vectors v0 and v1 are oriented consecutive edge vectors whose common end-point's insetting direction is determined by this method. b0 and b1 are the directions along which the edges are shifted during insetting.

If b0 is 0, then the inset direction will be along -v0 and if b1 is 0, then the inset direction will be along v1.

min_coplanar_nml_diff_cos is cosine of the smallest angle between normals of the planes respectively defined by v0, b0 and v1, b1, beyond which the two planes are taken as distinct and the line shared between them treated as a fold, causing the inset vector to move along this fold line. The velocity of the movement is then determined by the edge that makes a smaller angle with the fold.

Definition at line 590 of file GU_Insetter.h.


The documentation for this class was generated from the following file: