...
Code Block |
---|
class CgeometryLoaderExtension : public CbaseExtension { public: virtual bool loadMeshinitializeForRendering( Cmaxwell::Cobject& meshToLoad* pMaxwell ) = 0; virtual bool getBoundingBoxinitializePreview( Cpoint& min, Cpoint& max Cmaxwell* pMaxwell ) { return false( true ); }; virtual bool getProxyDisplayPointsloadMesh( const dwordCmaxwell::Cobject& percent,meshToLoad const) dword& maxPoints, dword& nPoints, float*& points= 0; virtual bool getBoundingBox( Cpoint& min, Cpoint& max ) { return false; }; }; virtual bool getProxyDisplayLinesgetProxyDisplayPoints( const dword& percent, const dword& maxLinesmaxPoints, dword& nPoints, float*& points, dword& nLines, dword*& pointsPerLine ) { return false; }; virtual bool getProxyDisplayFacesgetProxyDisplayLines( const dword& percent, const dword& maxFacesmaxLines, dword& nPoints, float*& points, dword& nFacesnLines, dword*& facespointsPerLine ) { return false; } }; |
The most important part of the extension functionality resides in loadMesh, which must be implemented. The rest are optional functions. getBoundingBox, if implemented, returns the maximum and minimum points of the geometry's bounding box, in local coordinates of the object. This function is called at the voxelization stage, just before starting to render.
...
virtual bool getProxyDisplayFaces( const dword& percent, const dword& maxFaces, dword& nPoints, float*& points, dword& nFaces, dword*& faces )
{
return false;
}
}; |
The most important part of the extension functionality resides in loadMesh, which must be implemented. The rest are optional functions. getBoundingBox, if implemented, returns the maximum and minimum points of the geometry's bounding box, in local coordinates of the object. This function is called at the voxelization stage, just before starting to render.
One of the other three functions getProxyDisplay* should be implemented if the extension writer wants to draw an approximate proxy of the object in the Studio viewport. For example, the MaxwellGrass extension uses getProxyDisplayLines to draw some lines representing grass strands.
The class extension constructor is used mainly to create the extension parameters (look at the example below) and, possibly, allocate data structures needed throughout the life of the extension. These data structures must be freed in the class destructor. initializeForRendering is called just before rendering starts, and the incoming pMaxwell (always check != NULL ) is useful for accessing the scene while executing loadMesh. ) is useful for accessing the scene while executing loadMesh.
initializeForRendering
virtual bool
initializeForRendering( Cmaxwell* pMaxwell ) = 0;
Called at the initial stage before rendering starts. Useful for pre-allocating everything that will be needed during the render. This is especially important for Procedural Geometry extensions.
Arguments
Cmaxwell* pMaxwell
: input, pointer to the scene.
Returns
true
on success, false
otherwise. false
aborts the render.
initializePreview
virtual bool initializePreview( Cmaxwell* pMaxwell );
Reset all the pointers allocated in getProxyDisplay* and make them ready for reuse.
Arguments
Cmaxwell* pMaxwell
: input, pointer to the scene.
Returns
true
on success, false
otherwise.
loadMesh
virtual bool loadMesh( Cmaxwell::Cobject& meshToLoad ) = 0;
Main function of the extension. It is where the actual work of filling a geometric object is done.
Arguments
Cmaxwell::Cobject& meshToLoad
: input/output, reference to the object being created.
Returns
true
on success, otherwise false
;
...
Returns the bounding box of the newly created object, in local coordinates of the object.
Arguments
Cpoint& min
: output, reference to the lower corner of the bounding box.
Cpoint& max
: output, reference to the upper corner of the bounding box.
Returns
true
on success, otherwise false
;
...
Allocates and fills the "points" array with the coordinates of points to be drawn in the Studio viewport. Also sets "nPoints" to the actual number of points filled.
Arguments
const dword& percent
: input, goes from 0 to 100, indicating the degree of desired precision to draw the proxy.
...
float*& points
: output, array with the points, x0y0z0x1y1z1x2y2z2....
Returns
true
on success, otherwise false
;
...
Allocates and fills the "points" array and "pointsPerLine" array with with the coordinates of points, and number of points per line to be drawn in the Studio viewport. Also sets "nPoints" to the actual number of points created and nLines to the actual number of lines created.
Arguments
const dword& percent
: input, goes from 0 to 100, indicating the degree of desired precision to draw the proxy.
...
dword*& pointsPerLine
: output, array with the number of points per line, n0n1n2.... If this array is NULL, then the number of points per line is constant, and is nPoints/nLines.
Returns
true
on success, otherwise false
;
...
Allocates and fills the "points" array and "faces" array with with the coordinates of points, and indexes to vertices to be drawn in the Studio viewport. Also sets "nPoints" to the actual number of points created and "nFaces" to the actual number of triangles created.
Arguments
const dword& percent
: input, goes from 0 to 100, indicating the degree of desired precision to draw the proxy.
...
dword*& faces
: output, array with the indices to vertices in the "points" array v00v01v02v10v11v12v20v21v22....
Returns
true
on success, otherwise false
.
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#include <math.h> #include "extensionmanager.h" #include "geometryextension.h" #include "maxwell.h" using namespace mx; class CubeExampleExtension : public CgeometryLoaderExtension { DECLARE_EXTENSION_METHODS( "CubeExample", CubeExampleExtension, 1 ) Cmaxwell* pMaxwellLocal; //Handy to access the scene. public: CubeExampleExtension() { getExtensionData()->createDouble( "Cube size", 1.0, 0, 1000 );//Create parameter with Default value } ~CubeExampleExtension() { } bool initializeForRendering ( Cmaxwell* pMaxwell ) { pMaxwellLocal = pMaxwell; return true; } access the scene. //Helper function to spit messages to maxwell. void printMessage( const char* text, const int code ) { if( pMaxwellLocal != NULL ) //Helper function to spit{ messages to maxwell. void printMessage( const char* text, constchar intpMessage[ code1024 )]; { sprintf if( pMaxwellLocal != NULL ) pMessage, "[Extension %s] %s", getName(), text ); { pMaxwellLocal->printMessage( pMessage, code ); char pMessage[ 1024 ]; } } public: CubeExampleExtension() sprintf ( pMessage, "[Extension %s] %s", getName(), text ); pMaxwellLocal->printMessage( pMessage, code ); } { getExtensionData()->createDouble( "Cube size", 1.0, 0, 1000 );//Create parameter with Default value } ~CubeExampleExtension() { } bool initializeForRendering ( Cmaxwell* pMaxwell ) { pMaxwellLocal = pMaxwell; return true; } bool loadMesh( Cmaxwell::Cobject &cube ) { //Get the extension parameter getExtensionData()->getDouble( "Cube size", cubeSize ); //Create the mesh cube.initializeMesh( 8, 6, 12, 1 ); //Add the vertices Cpoint point; point.assign( 0.0, 0.0, 0.0 ); cube.setVertex ( 0, 0, point ); point.assign( 0.0, 0.0, cubeSize ); cube.setVertex ( 1, 0, point ); point.assign( cubeSize, 0.0, cubeSize ); cube.setVertex ( 2, 0, point ); point.assign( cubeSize, 0.0, 0.0 ); cube.setVertex ( 3, 0, point ); point.assign( 0.0, cubeSize, 0.0 ); cube.setVertex ( 4, 0, point ); point.assign( 0.0, cubeSize, cubeSize ); cube.setVertex ( 5, 0, point ); point.assign( cubeSize, cubeSize, cubeSize ); cube.setVertex ( 6, 0, point ); point.assign( cubeSize, cubeSize, 0.0 ); cube.setVertex ( 7, 0, point ); //Set some normals Cvector normal; normal.assign( 1.0, 0.0, 0.0 ); cube.setNormal( 0, 0, normal ); normal.assign( -1.0, 0.0, 0.0 ); cube.setNormal( 1, 0, normal ); normal.assign( 0.0, 1.0, 0.0 ); cube.setNormal( 2, 0, normal ); normal.assign( 0.0, -1.0, 0.0 ); cube.setNormal( 3, 0, normal ); normal.assign( 0.0, 0.0, 1.0 ); cube.setNormal( 44, 0, normal ); normal.assign( 0.0, 0.0, -1.0 ); cube.setNormal( 5, 0, normal ); normal.assign//Add triangles cube.setTriangle ( 0., 0, 0.02, -1.01, 3, 3, 3 ); cube.setNormalsetTriangle ( 51, 0, 3, normal ); //Add triangles2, 3, 3, 3 ); cube.setTriangle ( 02, 04, 25, 16, 32, 32, 32 ); cube.setTriangle ( 13, 04, 36, 27, 32, 32, 32 ); cube.setTriangle ( 24, 42, 53, 67, 20, 20, 20 ); cube.setTriangle ( 35, 42, 67, 76, 20, 20, 20 ); cube.setTriangle ( 46, 20, 31, 75, 01, 01, 01 ); cube.setTriangle ( 57, 20, 75, 64, 01, 01, 01 ); cube.setTriangle ( 68, 01, 12, 56, 14, 14, 14 ); cube.setTriangle ( 9, 71, 06, 5, 4, 14, 1, 14 ); cube.setTriangle ( 810, 10, 24, 67, 45, 45, 45 ); cube.setTriangle ( 911, 0, 17, 63, 5, 4, 4, 4 )5, 5 ); //Generate some uvs dword cchanIdx = 0; dword daChan; cube.setTriangle addChannelUVW( 10daChan, 0, 4, 7, cchanIdx ); Cbase projBase; projBase.origin.assign( 0.5, 0.5, 0.5 ); cube.setTriangle ( 11, 0, 7, 3, 5, 5, 5 ); //Generate some uvs dword cchanIdx = 0; dword daChan; cube.addChannelUVW( daChan, cchanIdxprojBase.xAxis.assign( 1.0, 0.0, 0.0 ); projBase.yAxis.assign( 0.0, 1.0, 0.0 ); projBase.zAxis.assign( 0.0, 0.0, 1.0 ); CbaseCvector projBasescale; projBasescale.origin.assign( 0.5, 0.5, 1.0.5 ); projBase.xAxis.assign( 1.0, 0.0, 0.0 ); projBase.yAxis.assign( 0.0, 1.0, 0.0 ); byte sux = cube.generateCubicUVW( cchanIdx, projBase ); return true; } bool getBoundingBox( Cvector &bmin, Cvector& bmax) { bmin.assign( -cubeSize, -cubeSize, -cubeSize ); projBase.zAxisbmax.assign( 0.0cubeSize, 0.0cubeSize, 1.0cubeSize ); Cvector scale; scale.assign( 0.5, 0.5, 1.0 ); byte sux = cube.generateCubicUVW( cchanIdx, projBase ); return true; } bool getBoundingBox( Cvector &bmin, Cvector& bmax) { bmin.assign( -cubeSize, -cubeSize, -cubeSize ); bmax.assign( cubeSize, cubeSize, cubeSize ); return true; } }; EXPORT_GEOMETRY_LOADER_EXTENSION( CubeExampleExtension )return true; } }; extern "C" ALWAYSEXPORT int getSdkVersion() { return MAXWELL_SDK_VERSION; } extern "C" ALWAYSEXPORT int StartExtension( CextensionManager& extensionManager ) { int i = 0; if ( extensionManager.registerGeometryLoaderExtension( new CubeExampleExtension ) ) i++; return i; } |