Custom Display Callbacks

Display callbacks can be inserted and any stage of the rendering loop. This allows you, for example to set up a p-buffer in the pre-begin frame slot, clear the buffers in the begin frame, render the scene to your p-buffer, etc.

 

Display callback and display pass plug-ins share the OpenGL state machine with Softimage. If a plug-in needs to change the OpenGL state, the plug-in should restore the original state when it is finished.

The example in the following sections shows how a pass can clear the screen to a specific color.

Identifying the display callback to Softimages Plug-in Registrar

Custom display callbacks take advantage of Softimage’s self-installing plug-in manager, so the first thing to do is tell the plug-in registrar about what’s contained in the .dll or .so. This is done in the XSILoadPlugin function, as shown below.

XSI::CStatus XSILoadPlugin( XSI::PluginRegistrar& in_reg )
{
   in_reg.PutAuthor( L"My Very Awesome Company inc." );
   in_reg.PutName( L"Example Display Callbacks" );
   in_reg.PutVersion( 1, 0 );

   // Here we tell the Plugin Registrar that this DLL exports
   // a display callback Called MyClearScreenBuffer
   in_reg.RegisterDisplayCallback( L"MyClearScreenBuffer" );

}

Injecting Display Callbacks into the Rendering Loop

After specifying the callback’s name, the plug-in manager will then look for five exported functions in.dll or .so.

void   MyClearScreenBuffer_Init ( XSI::CRef, LPVOID * );
void   MyClearScreenBuffer_Execute ( XSI::CRef, LPVOID * );
void   MyClearScreenBuffer_Term ( XSI::CRef, LPVOID * );
void   MyClearScreenBuffer_InitInstance ( XSI::CRef, LPVOID * );
void   MyClearScreenBuffer_TermInstance ( XSI::CRef, LPVOID * );

Pay special attention to the _Init function, which tells Softimage all about your displays callbacks, such as where they fit into the sequence and which display mode it affects.

_InitInstance and _TermInstance get called each time a new viewport is created or destroyed.

Here’s an example of a callback that gets called after each BeginFrame event for each display mode (wireframe, Hidden line, etc.):

void MyClearScreenBuffer_Init ( XSI::CRef in_pSequencerContext, LPVOID *in_pUserData )
{
   // Softimage's plug-in registrar calls this to initialize the display callback.
   // Now, we must register the display callback with the Graphic Sequencer
   // This simple example clears the frame buffer to custom color.
   // The parameter XSI::siAll means that this callback affects all display
   // modes, even custom ones

   // Cast the CRef into a GraphicSequencerContext SDK object
   XSI::GraphicSequencerContext l_vGraphicSequencerContext = in_pSequencerContext;

   // Get the sequencer from the context object
   XSI::CGraphicSequencer in_pSequencer = l_vGraphicSequencerContext.GetGraphicSequencer ();

   // Use the sequencer to register the callback
   in_pSequencer.RegisterDisplayCallback ( L"MyClearScreenBuffer", 0, XSI::siPostBeginFrame, XSI::siAll, NULL );

}


Autodesk Softimage v7.5