Open Search
    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
    }
    }
    MAXON_ATTRIBUTE_FORCE_INLINE const PolygonObject * ToPoly(const T *op)
    Casts a BaseObject* to a PolygonObject*.
    Definition: c4d_baseobject.h:2389
    void GePrint(const maxon::String &str)
    Definition: c4d_baseobject.h:2715
    PolyInfo * GetPolyInfo(Int32 poly)
    Definition: c4d_baseobject.h:2821
    virtual Bool Init(Int32 pcnt, const CPolygon *vadr, Int32 vcnt, const BaseSelect *bs)
    Int32 GetPointCount() const
    Definition: c4d_baseobject.h:1613
    Definition: c4d_baseobject.h:1784
    Int32 GetPolygonCount() const
    Definition: c4d_baseobject.h:1938
    const CPolygon * GetPolygonR() const
    Definition: c4d_baseobject.h:1924
    static String IntToString(Int32 v)
    Definition: c4d_string.h:497
    maxon::Int32 Int32
    Definition: ge_sys_math.h:60
    #define Opolygon
    Polygon - PolygonObject.
    Definition: ge_prepass.h:1040
    Represents a polygon that can be either a triangle or a quadrangle.
    Definition: c4d_baseobject.h:44
    Int32 d
    Index of the fourth point in the polygon.
    Definition: c4d_baseobject.h:48
    Int32 b
    Index of the second point in the polygon.
    Definition: c4d_baseobject.h:46
    Int32 c
    Index of the third point in the polygon.
    Definition: c4d_baseobject.h:47
    Int32 a
    Index of the first point in the polygon.
    Definition: c4d_baseobject.h:45
    Definition: c4d_baseobject.h:2674
    Char mark[4]
    Definition: c4d_baseobject.h:2677

    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.