Open Search

    About

    The PolygonReduction class allows to reduce the polygon count of a given PolygonObject while retaining its overall shape. The class gives access to the functionality used within the "Polygon Reduction" generator. It is defined in the lib_polygonreduction.h header file.

    Allocation/Deallocation

    A PolygonReduction object can be created with the usual tools, see Entity Creation and Destruction Manual (Classic).

    // This example creates a new PolygonReduction object.
    if (polyReduction == nullptr)
    return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
    Definition: ge_autoptr.h:37
    #define MAXON_SOURCE_LOCATION
    Definition: memoryallocationbase.h:67

    Init

    A PolygonReduction object has to be initialized. It will pre-process the given PolygonObject.

    The PolygonReductionData argument has these members:

    Note
    In order to be able to abort the reduction operation and to retain the original mesh, it is advised to operate on a copy of the original PolygonObject.
    // This example configures the given PolygonReduction object and
    // reduces the given PolygonObject to 25%.
    // set polygon reduction settings
    BaseContainer settings;
    data._op = polyObject;
    data._doc = doc;
    data._settings = settings;
    data._thread = nullptr; // synchronous pre-processing and reduction
    // pre process
    if (polyReduction->PreProcess(data) == false)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION, "The function exited unexpectedly during data pre-processing."_s);
    // reduce
    polyReduction->SetReductionStrengthLevel(0.75);
    // update
    polyObject->Message(MSG_UPDATE);
    Definition: c4d_basecontainer.h:47
    void SetBool(Int32 id, Bool b)
    Definition: c4d_basecontainer.h:498
    Definition: lib_polygonreduction.h:35
    PolygonObject * _op
    The polygon object to be reduced.
    Definition: lib_polygonreduction.h:57
    BaseDocument * _doc
    The document. Must not be nullptr.
    Definition: lib_polygonreduction.h:56
    BaseThread * _thread
    The caller thread. Set to nullptr if synchronous pre-processing calculation is needed (e....
    Definition: lib_polygonreduction.h:58
    BaseContainer _settings
    The reduction constraints settings. See opolyreduxgen.h.
    Definition: lib_polygonreduction.h:59
    #define MSG_UPDATE
    Must be sent if the bounding box has to be recalculated. (Otherwise use MSG_CHANGE....
    Definition: c4d_baselist.h:341
    @ POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY
    Definition: opolyreduxgen.h:7
    @ POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY
    Definition: opolyreduxgen.h:8
    const char * doc
    Definition: pyerrors.h:226

    If the PolygonReductionData::_thread member is set the pre-process is running asynchronously in a background thread.

    Note
    This asynchronous mode may be used e.g. in a generator object.
    // This example initializes the given PolygonReduction object asynchronously.
    data._op = polyObject;
    data._doc = doc;
    data._settings = settings;
    data._thread = GeGetDummyThread(); // asynchronous pre-processing
    // pre process
    if (polyReduction->PreProcess(data) == false)
    return maxon::UnexpectedError(MAXON_SOURCE_LOCATION, "The function exited unexpectedly during data pre-processing."_s);
    Int32 count = 0;
    // wait until preprocessing has finished
    while (polyReduction->IsPreprocessing())
    {
    ApplicationOutput("Pre Process...");
    GeSleep(100);
    count++;
    if (count > 100)
    {
    ApplicationOutput("Timeout!");
    polyReduction->StopPreprocessing();
    return maxon::UnknownError(MAXON_SOURCE_LOCATION);
    }
    }
    Py_ssize_t count
    Definition: abstract.h:640
    void GeSleep(Int32 milliseconds)
    BaseThread * GeGetDummyThread()
    Definition: c4d_thread.h:201
    maxon::Int32 Int32
    Definition: ge_sys_math.h:60
    #define ApplicationOutput(formatString,...)
    Definition: debugdiagnostics.h:210

    After the pre-process the PolygonReduction object is ready:

    Reduce

    The linked PolygonObject can be reduced by defining the overall reduction strength or the target triangle, vertex or edge count.

    The desired triangle count is defined with:

    Note
    // This example reduces the PolygonObject to the given triangle count.
    // return gracefully if the specified triangle count is smaller than the minimum number of triangles after reduction pre-processing
    if (triTargetCount < polyReduction->GetMinTriangleLevel())
    return maxon::OK;
    // return gracefully if the specified triangle count is greater than the initial number of triangles
    if (triTargetCount > polyReduction->GetMaxTriangleLevel())
    return maxon::OK;
    polyReduction->SetTriangleLevel(triTargetCount);
    const Int32 realTriangleResult = polyReduction->GetTriangleLevel();
    ApplicationOutput("Triangle Result: @", realTriangleResult);
    return OK
    Definition: apibase.h:2667

    The vertex count is defined with:

    Note
    // This example reduces the PolygonObject to the given vertex count.
    // return gracefully if the specified vertex count is smaller than the minimum number of vertexes after reduction pre-processing
    if (vertexTargetCount < polyReduction->GetMinVertexLevel())
    return maxon::OK;
    // return gracefully if the specified vertex count is greater than the initial number of vertexes
    if (vertexTargetCount > polyReduction->GetMaxVertexLevel())
    return maxon::OK;
    polyReduction->SetVertexLevel(vertexTargetCount);
    const Int32 realVertexResult = polyReduction->GetVertexLevel();
    ApplicationOutput("Vertex Result: @", realVertexResult);

    Finally the edge count can be defined:

    Note
    // This example reduces the given PolygonObject to the given edge count.
    // return gracefully if the specified edges count is smaller than the remained number of edges after reduction pre-processing
    if (edgeTargetCount > polyReduction->GetMaxRemainingEdgesLevel())
    return maxon::OK;
    polyReduction->SetRemainingEdgesLevel(edgeTargetCount);
    const Int32 realEdgeResult = polyReduction->GetRemainingEdgesLevel();
    ApplicationOutput("Edge Result: @", realEdgeResult);

    Further Reading