Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This kind of extensions load geometry just before the render starts. They´re useful to decrease the size of the scene file and even to create loaders for new file formats. This class is defined in geometryextension.h. The most important part of the extension functionality is done in loadMesh 

Code Block
class CgeometryLoaderExtension : public CbaseExtension
{
public:
    virtual bool loadMesh( Cmaxwell::Cobject& meshToLoad ) = 0;
    
    virtual bool getBoundingBox( Cpoint& min, Cpoint& max ) 
    {
        return false;
    };
    
    virtual bool getProxyDisplayPoints( const dword& percent, const dword& maxPoints, dword& nPoints, float*& points )
    {
        return false;    
    };
    virtual bool getProxyDisplayLines( const dword& percent, const dword& maxLines, dword& nPoints, float*& points, dword& nLines, dword*& pointsPerLine )
    {
        return false;
    }
    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.

 

 

Code Block
languagecpp
titleCube creator
firstline1
linenumberstrue
#include <math.h>
#include "extensionmanager.h"
#include "geometryextension.h"
#include "maxwell.h"
class CubeExampleExtension : public CgeometryLoaderExtension
{
	DECLARE_EXTENSION_METHODS( "CubeExample", CubeExampleExtension, 1 )
    Cmaxwell* pMaxwellLocal; //Handy to access the scene. If you want to use it, fill it in initializeForRendering

public:
 
	CubeExampleExtension()
	{
		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( 4, 0, normal );
		normal.assign( 0.0, 0.0, -1.0 );
		cube.setNormal( 5, 0, normal );
//Add triangles
		cube.setTriangle ( 0, 0, 2, 1, 3, 3, 3 );
		cube.setTriangle ( 1, 0, 3, 2, 3, 3, 3 );
		cube.setTriangle ( 2, 4, 5, 6, 2, 2, 2 );
		cube.setTriangle ( 3, 4, 6, 7, 2, 2, 2 );
		cube.setTriangle ( 4, 2, 3, 7, 0, 0, 0 );
		cube.setTriangle ( 5, 2, 7, 6, 0, 0, 0 );
		cube.setTriangle ( 6, 0, 1, 5, 1, 1, 1 );
		cube.setTriangle ( 7, 0, 5, 4, 1, 1, 1 );
		cube.setTriangle ( 8, 1, 2, 6, 4, 4, 4 );
		cube.setTriangle ( 9, 1, 6, 5, 4, 4, 4 );
		cube.setTriangle ( 10, 0, 4, 7, 5, 5, 5 );
		cube.setTriangle ( 11, 0, 7, 3, 5, 5, 5 );

//Generate some uvs
		dword cchanIdx = 0;
		dword daChan;
		cube.addChannelUVW( daChan, cchanIdx );
		Cbase projBase;
		projBase.origin.assign( 0.5, 0.5, 0.5 );
		projBase.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 );
		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 )