LodObject Manual
A
LodObject
represents a LOD (level of detail) object generator. This generator creates geometry based on various parameters e.g. camera distance. The
LodObject
class provides access to the parameters of the dynamically defined levels. It is defined in the
lib_lodobject.h
header file.
LodObject objects are an instance of Olod .
A LodObject object is a BaseObject and can be accessed like any other object. See BaseObject Manual .
LodObject objects are created with the usual tools, see Entity Creation and Destruction Manual (Classic) .
The standard parameters of a
LodObject
can be obtained and changed with
C4DAtom::SetParameter()
/
C4DAtom::GetParameter()
. The parameter IDs are defined in
olod.h
.
// get current criteria GeData data; lodObject-> GetParameter ( LOD_CRITERIA , data, DESCFLAGS_GET::NONE ); const Int32 criteria = data. GetInt32 ();
// check if User LOD Level if (criteria == LOD_CRITERIA_MANUAL ) { // get max level const Int32 maxLevel = lodObject-> GetLevelCount () - 1; // set current level to max level lodObject-> SetParameter ( LOD_CURRENT_LEVEL , maxLevel, DESCFLAGS_SET::NONE ); }
A LodObject object handles multiple levels. The current level is used to define the geometry it should create.
// get current level const Int32 currentLevel = lodObject-> GetCurrentLevel ();
// hide current level DescID showControlID; if (!lodObject-> GetShowControlDescID (currentLevel, showControlID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (showControlID, false , DESCFLAGS_SET::NONE );
Each level contains multiple parameters that configure that level. The DescID for these parameters can be obtained with these functions.
In every mode a level defines various display parameters:
The IDs of the shading modes and styles are defined in
tdisplay.h
.
// enable backface culling if (!lodObject-> GetDisplayBFCDescID (level, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, true , DESCFLAGS_SET::NONE );
// use "Lines" shading if (!lodObject-> GetDisplayShModeDescID (level, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, DISPLAYTAG_SDISPLAY_NOSHADING , DESCFLAGS_SET::NONE );
// use "Wireframe" style if (!lodObject-> GetDisplayStModeDescID (level, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, DISPLAYTAG_WDISPLAY_WIREFRAME , DESCFLAGS_SET::NONE ); }
In "Manual Groups" mode a list of objects can be accessed:
// use "Manual Groups" and a manually defined number of groups lodObject-> SetParameter ( LOD_MODE , LOD_MODE_MANUAL_GROUPS , DESCFLAGS_SET::NONE ); lodObject-> SetParameter ( LOD_CRITERIA , LOD_CRITERIA_MANUAL , DESCFLAGS_SET::NONE ); lodObject-> SetParameter ( LOD_LEVEL_COUNT_DYN , objectCount, DESCFLAGS_SET::NONE );
// add objects to groups for ( Int32 level = 0; level < objectCount; ++level) { // get object C4DAtom * const atom = objects-> GetIndex (level); BaseObject * const baseObject = static_cast< BaseObject * > (atom); if (baseObject == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// make object a child object of the LOD object baseObject-> 移除 (); doc-> InsertObject (baseObject, lodObject, nullptr );
// insert into "Objects" list of the given level DescID listID; if (!lodObject-> GetManualModeObjectListDescID (level, listID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// create InEx data GeData data( CUSTOMDATATYPE_INEXCLUDE_LIST , DEFAULTVALUE ); CustomDataType * const customData = data. GetCustomDataType ( CUSTOMDATATYPE_INEXCLUDE_LIST ); InExcludeData * const inExData = static_cast< InExcludeData * > (customData); if (inExData == nullptr ) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION );
// insert object into list inExData-> InsertObject (baseObject, 1); // set parameter lodObject-> SetParameter (listID, data, DESCFLAGS_SET::NONE ); }
In "Simplify" mode these settings are available:
The null display mode setting IDs are defined in
onull.h
.
// use "Simplify" mode and a manual number of levels lodObject-> SetParameter ( LOD_MODE , LOD_MODE_SIMPLIFY , DESCFLAGS_SET::NONE ); lodObject-> SetParameter ( LOD_CRITERIA , LOD_CRITERIA_MANUAL , DESCFLAGS_SET::NONE ); lodObject-> SetParameter ( LOD_LEVEL_COUNT_DYN , 2, DESCFLAGS_SET::NONE ); DescID descID;
// first level
// set mode to "Convex Hull" if (!lodObject-> GetSimplifyModeDescID (0, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, LOD_SIMPLIFY_CONVEXHULL , DESCFLAGS_SET::NONE );
// set "Per Object" to true if (!lodObject-> GetPerObjectControlDescID (0, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, true , DESCFLAGS_SET::NONE );
// second level
// set mode to "Null" if (!lodObject-> GetSimplifyModeDescID (1, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, LOD_SIMPLIFY_NULL , DESCFLAGS_SET::NONE );
// set "Display" to "Circle" if (!lodObject-> GetNullDisplayDescID (1, descID)) return maxon::UnexpectedError( MAXON_SOURCE_LOCATION ); lodObject-> SetParameter (descID, NULLOBJECT_DISPLAY_CIRCLE , DESCFLAGS_SET::NONE );
The dirty checksum of levels and the cache can be obtained with: