- Main Page
- Related Pages
- Modules
- Classes
- Examples

# D3DViewportRendererPlugin.cpp

    //-
    // ==========================================================================
    // Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
    //
    // Use of this software is subject to the terms of the Autodesk
    // license agreement provided at the time of installation or download,
    // or which otherwise accompanies this software in either electronic
    // or hard copy form.
    // ==========================================================================
    //+

    #include <stdio.h>

    #include <D3DViewportRenderer.h>

    #include <maya/MGlobal.h>
    #include <maya/MString.h>
    #include <maya/MStringArray.h>
    #include <maya/MFnPlugin.h>
    #include <maya/MSceneMessage.h>

    #include <stdio.h>

    //
    // Plug-in functions
    //

    static D3DViewportRenderer *g_d3dRenderer = 0;

    #if defined(D3D9_SUPPORTED)

    static MCallbackId   D3DfileNewCallbackId = 0;
    static void D3DfileNewCallback( void* clientData )
    {
        if (g_d3dRenderer)
            g_d3dRenderer->clearResources(false, false); /* keep shaders */
    }

    static MCallbackId   D3DmayaExitCallbackId = 0;
    static void D3DmayaExitCallback( void* clientData )
    {
        if (g_d3dRenderer)
        {
            delete g_d3dRenderer;
            g_d3dRenderer = 0;
        }
    }
    #endif

    MStatus initializePlugin( MObject obj )
    {
        MStatus   status = MStatus::kFailure;

        MFnPlugin plugin( obj, PLUGIN_COMPANY, "8.0", "Any");

        // Register the renderer
        //
        g_d3dRenderer = new D3DViewportRenderer();
        if (g_d3dRenderer)
        {
            status = g_d3dRenderer->registerRenderer();
            if (status != MStatus::kSuccess)
            {
                status.perror("Failed to register Direct3D renderer properly.");
            }

    #if defined(D3D9_SUPPORTED)
            // Must add in these callbacks as on exit Maya never calls uninitializePlugin() !!
            //
            if (D3DfileNewCallbackId == 0)
                D3DfileNewCallbackId = MSceneMessage::addCallback( MSceneMessage::kBeforeNew, D3DfileNewCallback );
            if (D3DmayaExitCallbackId == 0)
                D3DmayaExitCallbackId = MSceneMessage::addCallback( MSceneMessage::kMayaExiting, D3DmayaExitCallback );
    #endif
        }
        return status;
    }

    MStatus uninitializePlugin( MObject obj )
    {
        MStatus   status = MStatus::kSuccess;

    #if defined(D3D9_SUPPORTED)
        // Remove callbacks when plugin is unloaded.
        //
        if (D3DfileNewCallbackId)
        {
            MMessage::removeCallback( D3DfileNewCallbackId );
            D3DfileNewCallbackId = 0;
        }
        if (D3DmayaExitCallbackId)
        {
            MMessage::removeCallback( D3DmayaExitCallbackId );
            D3DmayaExitCallbackId = 0;
        }
    #endif

        // Deregister the renderer
        //
        if (g_d3dRenderer)
        {
            status = g_d3dRenderer->deregisterRenderer();
            if (status != MStatus::kSuccess)
            {
                status.perror("Failed to deregister Direct3D renderer properly.");
            }
            delete g_d3dRenderer;
            g_d3dRenderer = 0;
        }
        return status;
    }