PolyInfo Struct Reference

#include <c4d_baseobject.h>

Detailed Description

Holds polygon neighboring information.

See also
Neighbor::GetPolyInfo

Example:
The following code browses through all available edges:

if (pObj->GetType() != Opolygon)
return;
PolygonObject* pPolyObj = ToPoly(pObj);
if (pPolyObj == nullptr)
return;
Neighbor neighbor;
const CPolygon* pPolyR = pPolyObj->GetPolygonR();
Int32 pointCount = pPolyObj->GetPointCount();
Int32 polyCount = pPolyObj->GetPolygonCount();
if (pPolyR == nullptr)
return;
if (!neighbor.Init(pointCount, pPolyR, polyCount, nullptr))
return;
for (Int32 polyIdx = 0; polyIdx < polyCount; polyIdx++)
{
PolyInfo* polyInfo = neighbor.GetPolyInfo(polyIdx);
for (Int32 edgeIdx = 0; edgeIdx < 4; edgeIdx++) // Test all 4 edges of a polygon
{
// Only proceed if the edge has not already been processed and edge really exists
// For triangles edge 2 from c.......d does not exist as c == d
// One can also skip the edgeIdx == 2 && pPolyR[polyIdx].c == pPolyR[polyIdx].d test as polyInfo->mark[2] is always true for triangles
if (polyInfo->mark[edgeIdx] || (edgeIdx == 2 && pPolyR[polyIdx].c == pPolyR[polyIdx].d))
continue;
Int32 edgeA = -1, edgeB = -1;
switch (edgeIdx)
{
case 0: edgeA = pPolyR[polyIdx].a; edgeB = pPolyR[polyIdx].b; break;
case 1: edgeA = pPolyR[polyIdx].b; edgeB = pPolyR[polyIdx].c; break;
case 2: edgeA = pPolyR[polyIdx].c; edgeB = pPolyR[polyIdx].d; break;
case 3: edgeA = pPolyR[polyIdx].d; edgeB = pPolyR[polyIdx].a; break;
}
GePrint("Triangle " + String::IntToString(polyIdx));
GePrint("Edge" + String::IntToString(edgeA) + " ------------ " + String::IntToString(edgeB));
// Do something with the edge a.......b
}
}

Public Attributes

Int32 face [4]
 
Int32 edge [4]
 
Char mark [4]
 

Member Data Documentation

◆ face

Int32 face[4]

The neighboring polygons.

Note
If NOTOK it then means there is no neighbor.

◆ edge

Int32 edge[4]

The edges of the polygon.

◆ mark

Char mark[4]

false if that polygon "generated" an edge.
For example think of 2 polygons that share an edge, one has set mark = false for the edge because it was the first and "built" the edge and the other(s) will set mark = true as no new edge had to be generated.

Opolygon
#define Opolygon
Polygon - PolygonObject.
Definition: ge_prepass.h:969
CPolygon::b
Int32 b
Index of the second point in the polygon.
Definition: c4d_baseobject.h:42
PointObject::GetPointCount
Int32 GetPointCount(void) const
Definition: c4d_baseobject.h:1423
PolygonObject::GetPolygonR
const CPolygon * GetPolygonR(void) const
Definition: c4d_baseobject.h:1722
Neighbor::GetPolyInfo
PolyInfo * GetPolyInfo(Int32 poly)
Definition: c4d_baseobject.h:2555
PolyInfo
Definition: c4d_baseobject.h:2407
CPolygon
Represents a polygon that can be either a triangle or a quadrangle.
Definition: c4d_baseobject.h:39
CPolygon::d
Int32 d
Index of the fourth point in the polygon.
Definition: c4d_baseobject.h:44
GePrint
void GePrint(const maxon::String &str)
ToPoly
#define ToPoly(op)
Casts a BaseObject* to a PolygonObject*.
Definition: c4d_baseobject.h:2158
String::IntToString
static String IntToString(Int32 v)
Definition: c4d_string.h:492
PolygonObject::GetPolygonCount
Int32 GetPolygonCount(void) const
Definition: c4d_baseobject.h:1736
Int32
maxon::Int32 Int32
Definition: ge_sys_math.h:45
PolygonObject
Definition: c4d_baseobject.h:1581
CPolygon::c
Int32 c
Index of the third point in the polygon.
Definition: c4d_baseobject.h:43
PolyInfo::mark
Char mark[4]
Definition: c4d_baseobject.h:2411
Neighbor::Init
virtual Bool Init(Int32 pcnt, const CPolygon *vadr, Int32 vcnt, BaseSelect *bs)
Neighbor
Definition: c4d_baseobject.h:2448
C4DAtom::GetType
Int32 GetType() const
Definition: c4d_baselist.h:1343
CPolygon::a
Int32 a
Index of the first point in the polygon.
Definition: c4d_baseobject.h:41