hlslShader.h
#ifndef _hlslShader_h_
#define _hlslShader_h_
#include <maya/MPxHardwareShader.h>
#include <maya/MTypeId.h> 
#include <maya/MStringArray.h> 
#include <maya/MVaryingParameter.h>
#include <maya/MUniformParameter.h>
#include <maya/MUniformParameterList.h>
#include <maya/MRenderProfile.h>
#include <maya/MHwrCallback.h>
#include <d3d9.h>
#include <d3dx9.h>
class hlslShader;
class hlslDeviceManager : public MHwrCallback 
{
public:
        typedef enum
        {
                kInvalid,
                kReset,
                kValid
        } hlslDeviceState;
        inline hlslDeviceManager( hlslShader& shader) : fShader( shader), fState( kValid) { addCallback( this); }
        ~hlslDeviceManager() { removeCallback( this); }
        virtual void deviceNew();       
        virtual void deviceLost();
        virtual void deviceReset();
        virtual void deviceDeleted();
        inline hlslDeviceState  deviceState() { return fState; }
        void resetShader();
private:
        
        void operator=( const hlslDeviceManager&) {};
protected:
        hlslDeviceState fState;
        hlslShader&     fShader;
};
class hlslShader : public MPxHardwareShader
{
public:
        friend class hlslDeviceManager;
        
                                                hlslShader();
        virtual void        postConstructor();
        virtual                         ~hlslShader(); 
        static  void*           creator();
        static  MStatus         initialize();
        static  void        initializeNodeAttrs();
        
        virtual void            copyInternalData( MPxNode* pSrc );
        virtual bool            getInternalValueInContext( const MPlug&,
                                                                                          MDataHandle&,
                                                                                          MDGContext&);
    virtual bool                setInternalValueInContext( const MPlug&,
                                                                                          const MDataHandle&,
                                                                                          MDGContext&);
        
        virtual MStatus         render( MGeometryList& iterator);
        
        virtual unsigned int    transparencyOptions();
        
        
        virtual const MRenderProfile& profile();
        
        virtual MStatus renderSwatchImage( MImage & image );
public:
        
        void                            release();
        
        
        
        
        
        static  MTypeId sId;
        
        
        static MRenderProfile sProfile;
        
        
        
        
        
        
        static  MObject sShader;
        static  MObject sTechnique;
        static  MObject sTechniques;
        static  MObject sDescription;
        static  MObject sDiagnostics;
        
protected:
        
        MStatus                 setShader( const MString& shader);
        MStatus                 setTechnique( const MString& technique);
        bool                    passHasTranparency( D3DXHANDLE passHandle ); 
        
        hlslDeviceManager       fDeviceManager;
        void                    releaseVertexDeclaration();
        
        MString                 fShader;
        MString                 fTechnique;
        MStringArray    fTechniques;
        
        MString                 fDescription;
        MString                 fDiagnostics;
        
        LPD3DXEFFECT    fD3DEffect;
        D3DXHANDLE              fD3DTechnique;
        D3DXEFFECT_DESC fD3DEffectDesc;
        D3DXTECHNIQUE_DESC fD3DTechniqueDesc;
        
        MVaryingParameter fVertexStructure;
        IDirect3DVertexDeclaration9** fD3DVertexDeclaration;
        MUniformParameterList fUniformParameters;
        bool                              fTechniqueHasBlending;
        
        void                    setupUniform( D3DXHANDLE d3dParameter, const MString& prefix);
        bool                    GetAnnotation( D3DXHANDLE parameter, const char* name, LPCSTR& value);
        bool                    GetAnnotation( D3DXHANDLE parameter, const char* name, BOOL& value);
        MUniformParameter::DataSemantic ConvertSemantic( D3DXHANDLE parameter, D3DXPARAMETER_DESC& description);
        MUniformParameter::DataType             ConvertType( D3DXHANDLE parameter, D3DXPARAMETER_DESC& description);
        MUniformParameter::DataSemantic ConvertSpace( D3DXHANDLE parameter, D3DXPARAMETER_DESC& description, MUniformParameter::DataSemantic defaultSpace);
        
        inline hlslShader& me() { return *this; }
        
        int                             fErrorCount;
        void                    reportInternalError( const char* function, size_t errcode );
};
#endif