#include <xsi_polygonmesh.h>
Class Description
A PolygonMesh is a kind of
Geometry.
We can navigate the PolygonMesh using the
generic terms such as
Facet,
Segment or
Point or we can choose to navigate using terms that are
specific to the PolygonMesh such
as
PolygonFace,
Edge and
Vertex. There are some functions that do not fit with the
generic terms such as
PolygonNode, which are specific to PolygonMesh, this is why
there are specific terms as well as generic terms.
- See also:
- Primitive::GetGeometry,
X3DObject::AddPolygonMesh
- Example:
List of all
members.
Public Member Functions
|
|
PolygonMesh
() |
|
~PolygonMesh
() |
|
PolygonMesh
(const CRef
&in_ref) |
|
PolygonMesh
(const PolygonMesh &in_obj) |
|
PolygonMesh
(const Geometry
&in_obj) |
bool |
IsA
(siClassID
in_ClassID) const |
siClassID |
GetClassID
() const |
PolygonMesh
& |
operator=
(const PolygonMesh &in_obj) |
PolygonMesh
& |
operator=
(const Geometry
&in_geom) |
PolygonMesh
& |
operator=
(const CRef
&in_ref) |
CVertexRefArray |
GetVertices
() const |
CEdgeRefArray |
GetEdges
() const |
CPolygonFaceRefArray |
GetPolygons
() const |
CPolygonNodeRefArray |
GetNodes
() const |
CStatus |
Set
(const MATH::CVector3Array
&in_vertices, const CLongArray
&in_polygonDescr) |
CStatus |
Get
(MATH::CVector3Array
&io_vertices, CLongArray &io_polygonDescr)
const |
CStatus |
PutCurrentVertexColor
(const ClusterProperty
&=ClusterProperty()) |
ClusterProperty |
GetCurrentVertexColor
(void) const |
ClusterProperty |
AddVertexColor
(const CString
&name=CString()) |
CRefArray |
GetVertexColors
(void) const |
CGeometryAccessor |
GetGeometryAccessor
(siConstructionMode
in_mode=siConstructionModeModeling, siSubdivisionRuleType
in_type=siCatmullClark, LONG in_subdLevel=0, bool
in_bUseLoopForTriangles=false, bool in_bUseDiscontinuity=true,
double in_discontinuityAngle=60.0) const |
CMeshBuilder |
GetMeshBuilder
() const |
CClusterPropertyBuilder |
GetClusterPropertyBuilder
() const |
CStatus |
GetPolygonIndexArray
(const PointLocatorData
&in_ptLocators, LONG in_nbPointLocatorsIndices, const LONG
*in_pPointLocatorsIndices, LONG *out_pIndices) const |
CStatus |
GetTriangleVertexIndexArray
(const PointLocatorData
&in_ptLocators, LONG in_nbPointLocatorsIndices, const LONG
*in_pPointLocatorsIndices, LONG *out_pIndices) const |
CStatus |
GetTriangleNodeIndexArray
(const PointLocatorData
&in_ptLocators, LONG in_nbPointLocatorsIndices, const LONG
*in_pPointLocatorsIndices, LONG *out_pIndices) const |
CStatus |
GetTriangleWeightArray
(const PointLocatorData
&in_ptLocators, LONG in_nbPointLocatorsIndices, const LONG
*in_pPointLocatorsIndices, float *out_pWeights) const |
PointLocatorData |
ConstructPointLocators
(LONG in_nbPointLocators, const LONG *in_pPolygonIndices, const
LONG *in_pSubTriangleVertexIndices, const float
*in_pSubTriangleWeights) const |
Constructor & Destructor Documentation
Constructor.
- Parameters:
-
in_ref |
constant reference object. |
Copy constructor.
- Parameters:
-
in_obj |
constant class object. |
Copy constructor.
- Parameters:
-
Member Function Documentation
bool IsA |
( |
siClassID |
in_ClassID |
) |
const [virtual] |
Returns true if a given class type is compatible with this API
class.
- Parameters:
-
- Returns:
- true if the class is compatible, false otherwise.
Reimplemented from Geometry.
Returns the type of the API class.
- Returns:
- The class type.
Reimplemented from Geometry.
Creates an object from another object. The newly created object
is set to empty if the input object is not compatible.
- Parameters:
-
in_obj |
constant class object. |
- Returns:
- The new PolygonMesh
object.
Creates a Polygon object from a
Geometry object. The newly created object is set to empty if
the input
Geometry object is not compatible.
- Parameters:
-
in_geom |
constant class object. |
- Returns:
- The new PolygonMesh
object.
Reimplemented from Geometry.
Creates an object from a reference object. The newly created
object is set to empty if the input reference object is not
compatible.
- Parameters:
-
in_ref |
constant class object. |
- Returns:
- The new PolygonMesh
object.
Reimplemented from Geometry.
Returns an array of all
Edge objects on this PolygonMesh object.
- Returns:
- Array of
Edge objects.
Sets the PolygonMesh from a
raw data set. If this function is used on a polygon mesh with some
clusters and a topology change is performed, the caller is
responsible for updating the clusters.
- Parameters:
-
in_vertices |
Array representing the polygon vertices. Each vertex is
expressed with a CVector3 structure. |
in_polygonDescr |
An ordered array of polygon definitions, each polygon is
defined by a list of elements, the first element of a polygon
definition must be set with the number of indices for that polygon.
The ordering of vertices must respect a ccw ordering to get out
going normals (right-hand rule). For instance, an array of polygons
with 4 indices each is formatted as {4,0,1,4,3,4,1,2,5,4...} |
- Returns:
-
CStatus::OK success
-
CStatus::AccessDenied function used outside of a plug-in
operator context.
- Example:
using namespace XSI;
using namespace MATH;
Application app;
Model root = app.GetActiveSceneRoot();
X3DObject myCube;
root.AddGeometry( L"Cube", L"MeshSurface", L"", myCube );
X3DObject myCone;
root.AddGeometry( L"Cone", L"MeshSurface", L"", myCone );
PolygonMesh meshCube( myCube.GetActivePrimitive().GetGeometry() );
CVector3Array vertices;
CLongArray polygonData;
meshCube.Get(vertices,polygonData);
CValueArray args(3);
CValue outArg;
args[0] = myCone.GetRef();
app.ExecuteCommand(L"FreezeObj",args, outArg);
PolygonMesh meshCone( myCone.GetActivePrimitive().GetGeometry() );
meshCone.Set(vertices,polygonData);
Returns a complete data set description of a polygon mesh.
- Parameters:
-
io_vertices |
Array representing the polygon vertices. Each vertex is
expressed with a CVector3 structure. |
io_polygonDescr |
An ordered array of polygon definitions, each polygon is
defined by a list of elements, the first element of a polygon
definition must be set with the number of indices for that polygon.
The ordering of vertices must respect a ccw ordering to get out
going normals (right-hand rule). For instance, an array of polygons
with 4 indices each is formatted as {4,0,1,4,3,4,1,2,5,4...} |
- Returns:
-
CStatus::OK success
-
CStatus::Fail failure
Sets the current color at vertices property used by the polygon
mesh's material. Using the default argument clears the current
vertex color property.
- Returns:
-
CStatus::OK success
-
CStatus::Fail failure
Returns the current vertex color property used by the polygon
mesh's material. When you first create a polygon mesh it inherits a
material but doesn't automatically have a vertex color. You need to
explicitly set the vertex color to be used by the material (this
then becomes the current vertex color). The current color at
vertices property may not be set, in which case the first vertex
color property found will be returned. If the polygon mesh has no
vertex color properties then an empty ClusterProperty API class
will be returned. Use the IsValid()
method to check if the cluster property is valid.
- Returns:
- ClusterProperty
Adds a new vertex color property to this polygon mesh
object.
- Parameters:
-
name |
name of new vertex color. |
- Returns:
- The vertex color property as a ClusterProperty.
Returns an array of the vertex color properties installed on
this polygon mesh object.
- Returns:
- Array of vertex color properties.
CGeometryAccessor
GetGeometryAccessor |
( |
siConstructionMode |
in_mode =
siConstructionModeModeling , |
|
|
siSubdivisionRuleType |
in_type =
siCatmullClark , |
|
|
LONG |
in_subdLevel = 0 , |
|
|
bool |
in_bUseLoopForTriangles =
false , |
|
|
bool |
in_bUseDiscontinuity =
true , |
|
|
double |
in_discontinuityAngle =
60.0 |
|
) |
|
const |
Returns a geometry accessor object which gives access to the
mesh and subdivided geometry data.
Note: The
CGeometryAccessor object can be accessed in a custom operator.
However, the in_mode argument is ignored if GetGeometryAccessor is
called on a primitive connected on the operator.
- Parameters:
-
in_mode |
The construction mode is used to access a version of the
geometry with specific deforms. The geometry positions you get
depends on the mode you pass in, for instance, when in_mode is set
to
siConstructionModeModeling, you get the original geometry
positions. This mode is typically used in export applications where
geometry, shape and envelope positions are exported separately.
Other modes of interest (see siConstructionMode)
include: |
siConstructionModePrimaryShape:
Combines the
geometry positions with the shape deformation.
siConstructionModeAnimation:
Combines the geometry
positions with the shape and envelope deformation altogether.
siConstructionModeSecondaryShape:
Combines the
geometry positions with the shape and envelope deformation and the
deforms installed above the envelope such as the move point
operators. This mode is typically used for plotting the final
results of shape and envelope deformation.
siConstructionModeDefault:
Uses the current
construction mode set in Softimage.
- Parameters:
-
in_type |
The algorithm used for subdividing the geometry. |
in_subdLevel |
The level of subdivision of the geometry. Defaults to 0. |
in_bUseLoopForTriangles |
This argument is specific to the subdivision and provides a
more precise subdivision when set to true. The argument is ignored
when in_subdLevel is 0. Defaults to false. |
in_bUseDiscontinuity |
Allows computing the discontinuity of normals when accessing
the normal values of the geometry. If this flag is false the
resulting normals are smoothed. Defaults to true. |
in_discontinuityAngle |
Specifies the angle of discontinuity when accessing the normal
values on the geometry. This argument is ignored if
in_bUseDiscontinuity is false. Defaults to 60.0. |
- Returns:
-
CGeometryAccessor object.
- Since:
- 5.0
Returns a mesh builder object.
- Returns:
-
CMeshBuilder object.
- Since:
- 5.0
CStatus GetPolygonIndexArray |
( |
const PointLocatorData
& |
in_ptLocators, |
|
|
LONG |
in_nbPointLocatorsIndices, |
|
|
const LONG * |
in_pPointLocatorsIndices, |
|
|
LONG * |
out_pIndices |
|
) |
|
const |
Returns the polygon indices on which point locators are
defined.
The position within the polygon can be queried with PolygonMesh::GetTriangleVertexIndexArray,
PolygonMesh::GetTriangleNodeIndexArray
and PolygonMesh::GetTriangleWeightArray.
Notice that this information is part of polygon mesh point
locator's definition, and depends on the topology only (won't
change if the geometry is deformed).
- Parameters:
-
in_ptLocators |
Contains the point locations to be queried. |
in_nbPointLocatorsIndices |
Number of point locators to be queried (-1 if all) |
in_pPointLocatorsIndices |
Point locator indices to be queried (not used if
in_nbPointLocatorIndices is -1) |
- Return values:
-
out_pIndices |
Returned polygon indices. Size must be in_ptLocators.GetCount()
if in_nbPointLocatorIndices is -1, in_nbPointLocatorIndices
otherwise. |
- Returns:
-
CStatus::OK success
-
CStatus::Fail failure
- See also:
- PolygonMesh::GetTriangleVertexIndexArray,
PolygonMesh::GetTriangleNodeIndexArray,
PolygonMesh::GetTriangleWeightArray,
PolygonMesh::ConstructPointLocators
- Since:
- 5.0
- Example:
- This example topologically describes the point locators
resulting from the shrink-wrapping of a cube onto a mesh
sphere.
using namespace XSI;
Application app;
Model root = app.GetActiveSceneRoot();
X3DObject meshCubeObj;
root.AddGeometry( L"Cube", L"MeshSurface", L"", meshCubeObj );
PolygonMesh meshCubeGeom( meshCubeObj.GetActivePrimitive().GetGeometry() );
X3DObject meshSphereObj;
root.AddGeometry( L"Sphere", L"MeshSurface", L"", meshSphereObj );
PolygonMesh meshSphereGeom( meshSphereObj.GetActivePrimitive().GetGeometry() );
MATH::CVector3Array posArray = meshCubeGeom.GetPoints().GetPositionArray();
PointLocatorData cubeOnSpherePointLocators = meshSphereGeom.GetClosestLocations(posArray.GetCount(), (double*)&posArray[0]);
LONG i;
for(i = 0; i < cubeOnSpherePointLocators.GetCount(); i++)
{
LONG polygon;
meshSphereGeom.GetPolygonIndexArray(
cubeOnSpherePointLocators,
1, &i, &polygon);
LONG nodes[3];
meshSphereGeom.GetTriangleNodeIndexArray(
cubeOnSpherePointLocators,
1, &i, nodes);
LONG vertices[3];
meshSphereGeom.GetTriangleVertexIndexArray(
cubeOnSpherePointLocators,
1, &i, vertices);
float weights[3];
meshSphereGeom.GetTriangleWeightArray(
cubeOnSpherePointLocators,
1, &i, weights);
app.LogMessage(L"Point locator " + CString(CValue(i)) + L" is on polygon " + CString(CValue(polygon)) + L",");
app.LogMessage(L"on a subtriangle described by nodes ("
+ CString(CValue(nodes[0])) + L", " + CString(CValue(nodes[1])) + L", " + CString(CValue(nodes[2])) + L")" +
L" or by vertices ("
+ CString(CValue(vertices[0])) + L", " + CString(CValue(vertices[1])) + L", " + CString(CValue(vertices[2])) + L")");
app.LogMessage(L"and having barycentric coordinates ("
+ CString(CValue(weights[0])) + L", " + CString(CValue(weights[1])) + L", " + CString(CValue(weights[2])) + L")");
app.LogMessage(L"");
}
CStatus
GetTriangleVertexIndexArray |
( |
const PointLocatorData
& |
in_ptLocators, |
|
|
LONG |
in_nbPointLocatorsIndices, |
|
|
const LONG * |
in_pPointLocatorsIndices, |
|
|
LONG * |
out_pIndices |
|
) |
|
const |
Returns the vertex indices of the polygon subtriangle on which
the point locators are defined.
Each vertex index triplet is guaranteed to correspond to one
polygon (the one returned by PolygonMesh::GetPolygonIndexArray).
The barycentric position within the triangle can be queried with
PolygonMesh::GetTriangleWeightArray.
- Warning:
- This information may in some cases vary between geometry
instances having the same topology but different deformations.
Since the point locators are defining a precise position on the
surface, and since deformations can dynamically change the
triangulation within a polygon, it can happen that a point locator
is remapped to a different subtriangle (both barycentric weights
and subtriangle indices can vary).
- Parameters:
-
in_ptLocators |
Contains the point locations to be queried. |
in_nbPointLocatorsIndices |
Number of point locators to be queried (-1 if all) |
in_pPointLocatorsIndices |
Point locator indices to be queried (not used if
in_nbPointLocatorIndices is -1) |
- Return values:
-
out_pIndices |
Returned triangle vertex triplets. Size must be
3*in_ptLocators.GetCount() if in_nbPointLocatorIndices is -1,
3*in_nbPointLocatorIndices otherwise. |
- Returns:
-
CStatus::OK success
-
CStatus::Fail failure
- See also:
- PolygonMesh::GetPolygonIndexArray,
PolygonMesh::GetTriangleNodeIndexArray,
PolygonMesh::GetTriangleWeightArray,
PolygonMesh::ConstructPointLocators
- Since:
- 5.0
- Example:
- An example using this method can be found in
PolygonMesh::GetPolygonIndexArray and Geometry::GetClosestLocations
methods' description.
CStatus
GetTriangleNodeIndexArray |
( |
const PointLocatorData
& |
in_ptLocators, |
|
|
LONG |
in_nbPointLocatorsIndices, |
|
|
const LONG * |
in_pPointLocatorsIndices, |
|
|
LONG * |
out_pIndices |
|
) |
|
const |
Returns the node indices of the polygon subtriangle on which the
point locators are defined.
Each node index triplet is guaranteed to correspond to one
polygon (the one returned by PolygonMesh::GetPolygonIndexArray).
The barycentric position within the triangle can be queried with
PolygonMesh::GetTriangleWeightArray.
- Warning:
- This information may in some cases vary between geometry
instances having the same topology but different deformations.
Since the point locators are defining a precise position on the
surface, and since deformations can dynamically change the
triangulation within a polygon, it can happen that a point locator
is remapped to a different subtriangle (both barycentric weights
and subtriangle indices can vary).
- Parameters:
-
in_ptLocators |
Contains the point locations to be queried. |
in_nbPointLocatorsIndices |
Number of point locators to be queried (-1 if all) |
in_pPointLocatorsIndices |
Point locator indices to be queried (not used if
in_nbPointLocatorIndices is -1) |
- Return values:
-
out_pIndices |
Returned triangle node triplets. Size must be
3*in_ptLocators.GetCount() if in_nbPointLocatorIndices is -1,
3*in_nbPointLocatorIndices otherwise. |
- Returns:
-
CStatus::OK success
-
CStatus::Fail failure
- See also:
- PolygonMesh::GetPolygonIndexArray,
PolygonMesh::GetTriangleNodeIndexArray,
PolygonMesh::GetTriangleWeightArray,
PolygonMesh::ConstructPointLocators
- Since:
- 5.0
- Example:
- An example using this method can be found in
PolygonMesh::GetPolygonIndexArray and Geometry::GetClosestLocations
methods' description.
CStatus GetTriangleWeightArray |
( |
const PointLocatorData
& |
in_ptLocators, |
|
|
LONG |
in_nbPointLocatorsIndices, |
|
|
const LONG * |
in_pPointLocatorsIndices, |
|
|
float * |
out_pWeights |
|
) |
|
const |
PointLocatorData
ConstructPointLocators |
( |
LONG |
in_nbPointLocators, |
|
|
const LONG * |
in_pPolygonIndices, |
|
|
const LONG * |
in_pSubTriangleVertexIndices, |
|
|
const float * |
in_pSubTriangleWeights |
|
) |
|
const |
Creates a
PointLocatorData from PolygonMesh specific topological
information. Polygon indices, vertex indices and subtriangle
barycentric weights (normalized and positive) are required in order
to define each point locator. The vertex indices of a subtriangle
must all be part of the corresponding input polygon.
In order to have more predictable results, it is recommended to
specify the subtriangles of vertices corresponding to the actual
triangulation of the polygons. Actual polygon triangulation can be
retrieved with PolygonFace::TriangleSubIndexArray.
Notice that the returned point locators can be evaluated on any
PolygonMesh instance having the same topology.
- Parameters:
-
in_nbPointLocators |
Number of points locators to be constructed |
in_pPolygonIndices |
Polygon indices (size must be in_nbPoints) |
in_pSubTriangleVertexIndices |
Vertex indices on the polygon (size must be in_nbPoints*3) |
in_pSubTriangleWeights |
Triangle
barycentric weights (size must be in_nbPoints*3) |
- Returns:
- A new
PointLocatorData object
- IsValid()
== false if failed
- See also:
- PolygonMesh::GetPolygonIndexArray,
PolygonMesh::GetTriangleVertexIndexArray,
PolygonMesh::GetTriangleNodeIndexArray,
PolygonMesh::GetTriangleWeightArray,
Geometry::GetSurfacePointLocatorsFromPoints,
NurbsSurfaceMesh::ConstructPointLocators
- Since:
- 5.0
- Example:
- This example creates point locators at random surface
locations, and positions a
Null at each of these point locators.
using namespace XSI;
void CreateNullsAtPointLocations( X3DObject& inObj, const PointLocatorData& inPointLocators )
{
Geometry geom( inObj.GetActivePrimitive().GetGeometry() );
std::vector<double> posData, normData;
posData.resize(inPointLocators.GetCount()*3);
normData.resize(inPointLocators.GetCount()*3);
geom.EvaluatePositions(inPointLocators, -1, 0, &posData.front());
geom.EvaluateNormals(inPointLocators, siInterpolatedVertexGeometricNormals, -1, 0, &normData.front());
MATH::CVector3 trans;
MATH::CRotation rot;
LONG i;
for (i = 0; i < (LONG)posData.size(); i+=3)
{
Null nullObj;
inObj.AddNull(L"",nullObj);
trans.Set(posData[i], posData[i+1], posData[i+2]);
nullObj.PutLocalTranslation(trans);
trans.Set(normData[i], normData[i+1], normData[i+2]);
rot.SetFromXYZAxes( trans, trans, trans );
nullObj.PutLocalRotation(rot);
}
}
float GetNormalizedRandom(){return float(rand())/RAND_MAX;}
LONG RandInRange(LONG in_bound)
{
float fRand = GetNormalizedRandom()*0.99999f;
return (LONG)(in_bound*fRand);
}
void main()
{
Application app;
Model root = app.GetActiveSceneRoot();
X3DObject meshSphereObj;
root.AddGeometry( L"Sphere", L"MeshSurface", L"", meshSphereObj );
PolygonMesh meshSphereGeom( meshSphereObj.GetActivePrimitive().GetGeometry() );
LONG nbPtLocators = 50;
std::vector<LONG> polygonIndexArray;
std::vector<LONG> subTriangleVertexArray;
std::vector<float> subTriangleWeightArray;
polygonIndexArray.resize(nbPtLocators);
subTriangleVertexArray.resize(nbPtLocators*3);
subTriangleWeightArray.resize(nbPtLocators*3);
CPolygonFaceRefArray polygons = meshSphereGeom.GetPolygons();
LONG i;
for(i = 0; i < nbPtLocators; i++)
{
polygonIndexArray[i] = RandInRange(polygons.GetCount());
PolygonFace polygon = polygons[polygonIndexArray[i]];
LONG subTri = RandInRange(polygon.GetNbPoints()-2);
CLongArray polygonNeiVtxIndices = polygon.GetVertices().GetIndexArray();
CLongArray triangleSubIndices = polygon.GetTriangleSubIndexArray();
subTriangleVertexArray[i*3] = polygonNeiVtxIndices[triangleSubIndices[subTri*3]];
subTriangleVertexArray[i*3+1] = polygonNeiVtxIndices[triangleSubIndices[subTri*3+1]];
subTriangleVertexArray[i*3+2] = polygonNeiVtxIndices[triangleSubIndices[subTri*3+2]];
float weights[3] = {GetNormalizedRandom(), GetNormalizedRandom(), GetNormalizedRandom()};
float wsum = weights[0]+weights[1]+weights[2];
subTriangleWeightArray[i*3] = weights[0]/wsum;
subTriangleWeightArray[i*3+1] = weights[0]/wsum;
subTriangleWeightArray[i*3+2] = weights[0]/wsum;
}
PointLocatorData randomPointLocators = meshSphereGeom.ConstructPointLocators(nbPtLocators, &polygonIndexArray.front(), &subTriangleVertexArray.front(), &subTriangleWeightArray.front());
CreateNullsAtPointLocations(meshSphereObj, randomPointLocators);
}
The documentation for this class was generated from the following
file: