...
bool forceHalfTime
: input, type of subvolume box for evaluation. If forceHalfTime is true, the subvolume box to comapre is at time 0.5. If true, it is the smallest box that encloses the swept space of the object in the subvolume from time 0.0 to time 1.0.
getProxyDisplayPoints
virtual bool getProxyDisplayPoints( const dword& percent, const dword& maxPoints, dword& nPoints,
float*& points );
Allocates and fills the "points" array with the coordinates of points to be drawn in Studio viewports. 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.
const dword& maxPoint
s : input, the maximum number of points allowed.
dword& nPoints
: output, the actual number of points allocated. Must be <= maxPoints.
float*& points
: output, array with the points, x0y0z0x1y1z1x2y2z2....
Returns
true
on success, otherwise false
;
getProxyDisplayLines
virtual bool getProxyDisplayLines( const dword& percent, const dword& maxPoints, const dword& maxLines,
dword& nPoints, float*& points, dword& nLines, dword*& pointsPerLine );
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 Studio. 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.
const dword& maxPoints
: input, the maximum number of points allowed.
const dword& maxLines
: input, the maximum number of lines allowed.
dword& nPoints
: output, the actual number of points allocated. Must be <= maxPoints.
float*& points
: output, array with the points, x0y0z0x1y1z1x2y2z2....
dword& nLines
: output, the actual number of lines created. Must be <= maxLines.
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
;
getProxyDisplayFaces
virtual bool getProxyDisplayFaces( const dword& percent, const dword& maxFaces, dword& nPoints,
float*& points, dword& nFaces, dword*& faces );
Allocates and fills the "points" array and "faces" array with with the coordinates of points, and indexes to vertices to be drawn in Studio. 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.
const dword& maxPoints
: input, the maximum number of points allowed.
const dword& maxFaces
: input, the maximum number of faces allowed.
dword& nPoints
: output, the actual number of points allocated. Must be <= maxPoints.
float*& points
: output, array with the points, x0y0z0x1y1z1x2y2z2....
dword& nFaces
: output, the actual number of faces created. Must be <= maxLines.
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" #ifndef DEG2RAD #define DEG2RAD(d) ((d) * 3.14159265358979323846 / 180.0) #endif class SphereRenderExtension : public CgeometryProceduralExtension { DECLARE_EXTENSION_METHODS( "SphereRenderExample", SphereRenderExtension, 1 ) Cmaxwell* pMaxwellLocal; double radius; public: SphereRenderExtension() { getExtensionData()->createDouble( "Radius", 1.00, 0, 1000000 ); } ~SphereRenderExtension() { } bool initializeForRendering ( Cmaxwell* pMaxwell ) { pMaxwellLocal = pMaxwell; getExtensionData()->getDouble( "Radius", radius ); return true; } //Helper function to spit messages to maxwell. void printMessage( const char* text, const int code ) { if( pMaxwellLocal != NULL ) { char pMessage[ 1024 ]; sprintf ( pMessage, "[Extension %s] %s", getName(), text ); pMaxwellLocal->printMessage( pMessage, code ); } } dword getNumSubVolumes( void ) { return 1;//We just have one region surrounding the whole sphere }; bool intersect( Cmaxwell::Cobject* object, const Cpoint& origin, const Cvector& dir, real time, const dword subVolumeIndex, Cvector* pNormal, Cvector* pLocalImpact, CfVector &data, Cvector& parametricUVW, Cvector& tangentU, Cvector& tangentV ) { real dist, a, b, disc, t0, t1, sqr; dist = -1.0; //Assume sphere centered in ( 0, 0, 0 ) in local coordinates a = 2*( dir.x*origin.x + dir.y*origin.y + dir.z*origin.z ); b = origin.x*origin.x + origin.y*origin.y + origin.z*origin.z - radius*radius; disc = a*a - 4*b; if ( disc < 0.0 ) { return false; } sqr = sqrt ( disc ); t0 = ( -a - sqr ) * 0.5; t1 = ( -a + sqr ) * 0.5; if ( t0 <= 0.0 ) { if ( t1 > 0.0 ) { dist = t1; } else { return false; } } else { if ( t0 < t1 ) dist = t0; else dist = t1; } Cvector p; p.assign( origin + dir * dist );//Point of intersection in local coordinates pLocalImpact->assign( p ); Cvector normal; normal.assign( p ); pNormal->assign( normal );//No need to normalize. Done later on demand. return true; } void getBoundingBox( Cvector& bmin, Cvector& bmax, float time ) { bmin.assign( -radius, -radius, -radius ); bmax.assign( radius, radius, radius ); } }; EXPORT_GEOMETRY_PROCEDURAL_EXTENSION( SphereRenderExtension ) |