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);

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);

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);
}
}

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 triangle count is defined with:

// 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);

The vertex count is defined with:

// 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:

// 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

PolygonReduction::SetTriangleLevel
Bool SetTriangleLevel(Int32 desiredLevel)
PolygonReductionData::_op
PolygonObject * _op
The polygon object to be reduced.
Definition: lib_polygonreduction.h:54
PolygonReduction::GetTriangleLevel
Int32 GetTriangleLevel() const
GeGetDummyThread
BaseThread * GeGetDummyThread()
Definition: c4d_thread.h:194
PolygonReductionData::_settings
BaseContainer _settings
The reduction constraints settings. See opolyreduxgen.h.
Definition: lib_polygonreduction.h:56
PolygonReduction::SetVertexLevel
Bool SetVertexLevel(Int32 desiredLevel)
PolygonReductionData
Definition: lib_polygonreduction.h:31
PolygonReduction::IsPreprocessing
Bool IsPreprocessing()
PolygonReduction::StopPreprocessing
void StopPreprocessing()
Aborts preprocessing if it is running in the background. Resets the interactive settings values.
PolygonReduction::GetMaxTriangleLevel
Int32 GetMaxTriangleLevel() const
maxon::OK
return OK
Definition: apibase.h:2490
MAXON_SOURCE_LOCATION
#define MAXON_SOURCE_LOCATION
Definition: memoryallocationbase.h:66
PolygonReduction::SetReductionStrengthLevel
Bool SetReductionStrengthLevel(Float strengthLevel)
BaseContainer::SetBool
void SetBool(Int32 id, Bool b)
Definition: c4d_basecontainer.h:494
POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY
@ POLYREDUXOBJECT_PRESERVE_3D_BOUNDARY
Definition: opolyreduxgen.h:7
PolygonReduction::GetRemainingEdgesLevel
Int32 GetRemainingEdgesLevel() const
PolygonReduction::GetMaxVertexLevel
Int32 GetMaxVertexLevel() const
PolygonReduction::GetVertexLevel
Int32 GetVertexLevel() const
MSG_UPDATE
#define MSG_UPDATE
Must be sent if the bounding box has to be recalculated. (Otherwise use MSG_CHANGE....
Definition: c4d_baselist.h:335
POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY
@ POLYREDUXOBJECT_PRESERVE_UV_BOUNDARY
Definition: opolyreduxgen.h:8
PolygonReduction::SetRemainingEdgesLevel
Bool SetRemainingEdgesLevel(Int32 desiredLevel)
Int32
maxon::Int32 Int32
Definition: ge_sys_math.h:45
ApplicationOutput
#define ApplicationOutput(formatString,...)
Definition: debugdiagnostics.h:209
C4DAtom::Message
Bool Message(Int32 type, void *data=nullptr)
Definition: c4d_baselist.h:1389
GeSleep
void GeSleep(Int32 milliseconds)
PolygonReductionData::_thread
BaseThread * _thread
The caller thread. Set to nullptr if synchronous pre-processing calculation is needed (e....
Definition: lib_polygonreduction.h:55
AutoAlloc
Definition: ge_autoptr.h:32
PolygonReduction::PreProcess
Bool PreProcess(const PolygonReductionData &data)
PolygonReductionData::_doc
BaseDocument * _doc
The document. Must not be nullptr.
Definition: lib_polygonreduction.h:53
BaseContainer
Definition: c4d_basecontainer.h:42
PolygonReduction::GetMaxRemainingEdgesLevel
Int32 GetMaxRemainingEdgesLevel() const