Communicating with XSI

This section contains the following topics:

• Object, Material and Shader Handle

• Graphic Sequencer States

Object, Material and Shader Handle

The shader can have access to the owner object, owner material and itself via the SOFTIMAGE|XSI C++ API.

If you need to get the object handle, the GetRequirements function should return TRUE to the RTS_REQUIRE_OBJECTHANDLE requirement.

If you need to get the material handle, your GetRequirements function should return TRUE to the RTS_REQUIRE_LIGHTHANDLE requirement.

To use the shader handle with the SOFTIMAGE|XSI C++ sdk, use the following code:

    XSI::CRef shaderCRef = *( (XSI::CRef *) in_pSysParams->m_pShaderHandle);
    XSI::Shader shader = shaderCRef;

You can use the same technique for the object and material handle.

To access the light handles with the SOFTIMAGE|XSI C++ sdk, use the following code:

    for (int i=0; i < in_pSysParams->m_SceneData->m_iNbLights; i++) {
        XSI::CRef lightRef = *(XSI::CRef*)in_pSysParams->m_SceneData->m_pLights[i].m_pchID;
        XSI::Light light = lightRef;
    }

Graphic Sequencer States

In SOFTIMAGE|XSI you can create and manipulate global states that are stored in the XSI Graphic Sequencer (XGS). These states act as “cookies”. The states can be accessed by a realtime shader, a C++ API plug-in or a graphic sequencer plug-in. This is a mechanism that is designed to:

• Share public data between shaders or plug-ins

• Store per viewport data

XGS states can store the following data:

• Integer values (siXGSStateType::siXGSStateType)

• Floating point values (siXGSStateType::siXGSFloat)

• Pointer values (siXGSStateType::siXGSHandle)

• Vector values (siXGSStateType::siXGSVector4)

• Matrix values (siXGSStateType::siXGSMatrix4)

This section contains the following topics:

• Creating States

• Getting the State Handle

• Getting the State Value

• Deleting a State

• SOFTIMAGE|XSI Factory Display Public Data

Creating States

To create an graphic sequencer state, use the CGraphicSequencer::CreateState function. For example:

    pXGS->CreateState(XSI::siXGSInteger, pInstanceData->m_XGSHandleCGcontextCountName, 0, &pInstanceData->m_XGSHandleCGcontextCount);

Getting the State Handle

Before you start manipulating states, you need to get their handle. To do so, use CGraphicSequencer::GetStateHandle. For example:

    pXGS->GetStateHandle(XSI::siXGSHandle, pInstanceData->m_XGSHandleName, &pInstanceData->m_XGSHandle);

Getting the State Value

To get the state value, you need to get the state handle with GetStateHandle. You can then use >CGraphicSequencer::GetStateValue. For example:

    pXGS->GetStateValue(XSI::siXGSHandle, pInstanceData->m_XGSHandle, &pInstanceData->m_Program);

The state value is context dependant. There is one value per viewport. So for example, if you have an integer state, it could be 0 in viewport A, 43 in viewport B, and so on. This is particularly useful if each viewport don’t share resources, such as when they run in DirectX mode.

Deleting a State

To delete a state use the CGraphicSequencer::DeleteState function.

SOFTIMAGE|XSI Factory Display Public Data

To get to the SOFTIMAGE|XSI factory public data, include the FactoryDisplayPublicData.h file.

These are all handle states.

State ID | Description | Structure
XSI_VIEWDATA | Viewport display information. |
    typedef struct tagXSI_ViewData
    {
       // colors
       float   BackgroundColor[4];
       float   ViewportColor[4];

       // sizes
       LONG  Width;
       LONG  Height;

       // viewing gizmos
       int  DrawAxis;
       int   DrawRulers;
       int  DrawGrid;
       int   DrawSafeGuide;

       // view Data
       UINT   CameraType;
       UINT   CameraIndex;
       UINT   CameraProjType;

       // View ID
       UINT  ID;
       TCHAR   ViewName[1024];

    } XSI_ViewData;
XSI_CAMERADISPLAY | Camera display playback information. |
    typedef struct tagXSI_CameraDisplay
    {
       // fast playback
       LONG   FastPlaybackMode;
       LONG   FastPlaybackWireframe;

    } XSI_CameraDisplay;
XSI_OPENGLDATA | Viewport OpenGL drawing context. |
    typedef struct tagXSI_OpenGLData
    {
       // primary context
       HDC    hdc;
    } XSI_OpenGLData;
XSI_HWRENDERINGDATA | Hardware rendering information. SOFTIMAGE|XSI is rendering when the Activate flag is TRUE. |
    typedef struct tagXSI_HWRenderingData
    {
       bool    Activate;
       int    Width;
       int    Height;
       unsigned char*  Buffer;
       unsigned char*  BigBuffer;
       wchar_t  RenderEngineName[1024];
    } XSI_HWRenderingData;