This type of extensions create textures at render time. This class is defined in mx_textureextension.h
Code Block |
---|
class CtextureExtension : public CbaseExtension
{
public:
virtual bool initializeForRendering( Cmaxwell* pMaxwell, CtextureMap* map ) = 0;
virtual bool initializePreview( Cmaxwell* pMaxwell, CtextureMap* map )
{
return ( true );
}
virtual bool getRGB( Crgb& rgb, real u, real v, const IntersectionInfo* intersectionInfo = 0 ) = 0;
}; |
The actual work of this extension is done in getRGB. This is the speed critical routine. Make every effort to optimize this function. Do not allocate memory in it. Avoid any OS and/or SDK function calls in this critical routine. Most of the memory can be pre-allocated in initializeForRendering. If you want to access the global scene pointer, store it in initializeForRendering and use it later. This can save a huge amount of time.
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
#include <math.h> #include "mx_extensionmanager.h" #include "mx_textureextension.h" #include "maxwell.h" #include "maxwellversions.h" class CproceduralChecker : public CtextureExtension { DECLARE_EXTENSION_METHODS( "Checker", CproceduralChecker, 1 ) unsigned int uRepeat, vRepeat; Cmaxwell* pMaxwellLocal; public: CproceduralChecker() { getExtensionData()->createUInt( "repeatU", 10, 1, 10000 ); getExtensionData()->createUInt( "repeatV", 10, 1, 10000 ); } ~CproceduralChecker() { } bool initializeForRendering( Cmaxwell* pMaxwell, CtextureMap* map ) { pMaxwellLocal = pMaxwell; getExtensionData()->getUInt( "repeatU", uRepeat ); getExtensionData()->getUInt( "repeatV", vRepeat ); return true; } bool getRGB( Crgb& rgb, real u, real v, const IntersectionInfo* intersectionInfo ) { int pu = ( ( int )( uRepeat * fabs( u ) ) ) % 2; int pv = ( ( int )( vRepeat * fabs( v ) ) ) % 2; rgb.r *= pu ^ pv; rgb.g *= pu ^ pv; rgb.b *= pu ^ pv; return true; } }; EXPORT_TEXTURE_EXTENSION( CproceduralChecker ) //Startup code extern "C" ALWAYSEXPORT int getSdkVersion() { return MAXWELL_SDK_VERSION; } extern "C" ALWAYSEXPORT int StartExtension( CextensionManager& extensionManager ) { int i = 0; if( extensionManager.registerTextureExtension( new CproceduralChecker ) ) i++; return i; } |