customImagePlane.cpp
#include <maya/MPxImagePlane.h>
#include <maya/MFnPlugin.h>
#include <maya/MImage.h>
#include <maya/MString.h>
#include <maya/MFnNumericAttribute.h> 
#include <maya/MFnNumericData.h> 
#include <maya/MDataHandle.h> 
#include <maya/MPlug.h> 
class customImagePlane : public MPxImagePlane
{
public:
                                                customImagePlane();
        virtual MStatus         loadImageMap( const MString &fileName, int frame, MImage &image );
        virtual bool            getInternalValueInContext( 
                const MPlug&, MDataHandle&,  MDGContext&);
    virtual bool                setInternalValueInContext( 
                const MPlug&, const MDataHandle&, MDGContext&);
        static  void*           creator();
        static  MStatus         initialize();
        static  MTypeId         id;                             
        static  MObject         aTransparency; 
private: 
        double                          fTransparency; 
};
MObject customImagePlane::aTransparency; 
customImagePlane::customImagePlane() : 
        fTransparency( 0.0 )
{
}
bool            
customImagePlane::getInternalValueInContext( 
        const MPlug &plug, MDataHandle &handle,  MDGContext& context )
{
        if ( plug == aTransparency ) { 
                handle.set( fTransparency ); 
                return true; 
        }
                
        return MPxImagePlane::getInternalValueInContext( plug, handle, context ); 
}
bool            
customImagePlane::setInternalValueInContext( 
        const MPlug &plug, const MDataHandle &handle, MDGContext &context)
{
        if ( plug == aTransparency ) { 
                fTransparency = handle.asDouble();
                setImageDirty();
                return true; 
        }
        
        return MPxImagePlane::setInternalValueInContext( plug, handle, context );
}
MStatus 
customImagePlane::loadImageMap( 
        const MString &fileName, int frame, MImage &image )
{
        image.readFromFile(fileName);
        
        unsigned int width, height;
        image.getSize(width, height);
        unsigned int size = width * height; 
        
        unsigned char *pixels = image.pixels(); 
        unsigned int i; 
        for ( i = 0; i < size; i ++, pixels += 4 ) { 
                pixels[3] = (unsigned char)(pixels[3] * (1.0 - fTransparency));
        }
        MPlug depthMap( thisMObject(), useDepthMap ); 
        bool value; 
        depthMap.getValue( value ); 
        
        if ( value ) {
                float *buffer = new float[width*height];
                unsigned int c, j; 
                for ( c = i = 0; i < height; i ++ ) { 
                        for ( j = 0; j < width; j ++, c++ ) { 
                                if ( i > height/2 ) { 
                                        buffer[c] = -1.0f;
                                } else { 
                                        buffer[c] = 0.0f;
                                }
                        }
                }
                image.setDepthMap( buffer, width, height ); 
                delete [] buffer;
        }
        return MStatus::kSuccess;
}
MTypeId customImagePlane::id( 0x1A19 );
void*
customImagePlane::creator()
{
        return new customImagePlane;
}
MStatus
customImagePlane::initialize()
{
        MFnNumericAttribute nAttr; 
        
        aTransparency = nAttr.create( "transparency", "tp", 
                                                                  MFnNumericData::kDouble, 0 );
        nAttr.setStorable(true); 
        nAttr.setInternal(true); 
        nAttr.setMin(0.0); 
        nAttr.setMax(1.0); 
        nAttr.setDefault(0.0);
        nAttr.setKeyable(true); 
        addAttribute( aTransparency ); 
        
        return MStatus::kSuccess;
}
MStatus initializePlugin( MObject obj )
{ 
        MStatus   status;
        MFnPlugin plugin( obj, PLUGIN_COMPANY, "7.0", "Any");
        status = plugin.registerNode( "customImagePlane", customImagePlane::id, 
                                                                  customImagePlane::creator,
                                                                  customImagePlane::initialize, 
                                                                  MPxNode::kImagePlaneNode );
        if (!status) {
                status.perror("registerNode");
                return( status );
        }
        return( status );
}
MStatus uninitializePlugin( MObject obj)
{
        MStatus   status;
        MFnPlugin plugin( obj );
        status = plugin.deregisterNode( customImagePlane::id );
        if (!status) {
                status.perror("deregisterNode");
                return( status );
        }
        return( status );
}