#ifndef _MPxImagePlane
#define _MPxImagePlane
//-
// ==========================================================================
// Copyright (C) 1995 - 2006 Autodesk, Inc., and/or its licensors.  All
// rights reserved.
//
// The coded instructions, statements, computer programs, and/or related
// material (collectively the "Data") in these files contain unpublished
// information proprietary to Autodesk, Inc. ("Autodesk") and/or its
// licensors,  which is protected by U.S. and Canadian federal copyright law
// and by international treaties.
//
// The Data may not be disclosed or distributed to third parties or be
// copied or duplicated, in whole or in part, without the prior written
// consent of Autodesk.
//
// The copyright notices in the Software and this entire statement,
// including the above license grant, this restriction and the following
// disclaimer, must be included in all copies of the Software, in whole
// or in part, and all derivative works of the Software, unless such copies
// or derivative works are solely in the form of machine-executable object
// code generated by a source language processor.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
// AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED
// WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF
// NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE,
// OR ARISING FROM A COURSE OF DEALING, USAGE, OR TRADE PRACTICE. IN NO
// EVENT WILL AUTODESK AND/OR ITS LICENSORS BE LIABLE FOR ANY LOST
// REVENUES, DATA, OR PROFITS, OR SPECIAL, DIRECT, INDIRECT, OR
// CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK AND/OR ITS LICENSORS HAS
// BEEN ADVISED OF THE POSSIBILITY OR PROBABILITY OF SUCH DAMAGES.
// ==========================================================================
//+
//
// CLASS:    MPxImagePlane
//
// ****************************************************************************

#if defined __cplusplus

// ****************************************************************************
// INCLUDED HEADER FILES

#include <maya/MPxNode.h>

// ****************************************************************************
// DECLARATIONS

class MImage;

// ****************************************************************************
// CLASS DECLARATION (MPxImagePlane)

//! \ingroup OpenMaya MPx
//! \brief Base class for user defined imagePlane nodes. 
/*!
   MPxImagePlane provides you with the ability to write your own image
   plane classes. This allows you to support non-standard image data
   in an image plane or change the standard behaviour of the image
   plane.

   Note, once you have created a custom image plane and created the
   node in a scene. You must attach the image plane to a camera using
   the 'imagePlane' attribute on the
   'cameraShape'.
*/
class OPENMAYA_EXPORT MPxImagePlane : public MPxNode
{
public:
			MPxImagePlane();
	virtual	~MPxImagePlane();

	virtual MPxNode::Type type() const;

	virtual MStatus loadImageMap( const MString &fileName, int frame, MImage &image );

BEGIN_NO_SCRIPT_SUPPORT:

	bool getExactImageFile( const MString &refFileName, MString &actualName );

END_NO_SCRIPT_SUPPORT:

	MString exactImageFile( const MString &refFileName );

	void refreshImage( );

	void setImageDirty();

	//
    // Inherited attributes
	//

	//! controls the source of the image on the Image plane.
	static MObject imageType;

	//! The file name of the image to be used
	//! in the image plane. Only used if Type is set to Image File.
	static MObject imageName;

	//!	When this is on, the system will substitute the frame number
	//! in the Image Name with the number from the Frame Extension attribute (see below).
	static MObject useFrameExtension;

	//! The frame extension in Image Name is replaced by the number here.
	static MObject frameExtension;

	static MObject frameOffset;

	//! Controls the amount of the image that will be used in the image plane.
	static MObject coverage;

	//! The width in pixels of the area on the source image to be used.
	static MObject coverageX;

	//! The height in pixels of the area on the source image to be used.
	static MObject coverageY;

	//! Controls the lower-left-corner of the area of the input image
	//! that will be used on the image plane.
	static MObject coverageOrigin;

	//! The pixel position of the left edge of the area of the source image to be used.
	static MObject coverageOriginX;

	//! The pixel position of the bottom edge of the area of the source image to be used.
	static MObject coverageOriginY;

	//! If the Type attribute is set to Texture, then this attribute is connected to
	//! the texture node used by the image plane.
	static MObject sourceTexture;

	//! Controls how the image file will be fit into the image plane.
	static MObject fit;

	//! Controls how the image plane will be displayed both in the 3d view,
	//! and when rendered.
	static MObject displayMode;

	//! If enabled, you will only see the image plane when you are looking
	//! through the camera that the plane is attached to.
	static MObject displayOnlyIfCurrent;

	//! A multiplier applied to the colors in the image plane.
	static MObject colorGain;

	//! The red component of Color Gain
	static MObject colorGainR;

	//! The green component of Color Gain
	static MObject colorGainG;

	//! The blue component of Color Gain
	static MObject colorGainB;

	//! An additive value applied to the colors in the image plane.
	static MObject colorOffset;

	//! The red component of Color Offset
	static MObject colorOffsetR;

	//! The green component of Color Offset
	static MObject colorOffsetG;

	//! The blue component of Color Offset
	static MObject colorOffsetB;

	//! A multiplier that is applied to the alpha value.
	static MObject alphaGain;

	//! The flag to control if this surface should override global shading sample settings.
	static MObject shadingSamplesOverride;

	//! Specifies the minimum number of shading samples should be taken for this surface during rendering.
	static MObject shadingSamples;

	//! Specifies the max number of shading samples can be taken for this surface during rendering.
	static MObject maxShadingSamples;

	//! If enabled, the image plane is locked to the camera's position.
	static MObject lockedToCamera;

	//! Controls the distance of the plane from the camera.
	static MObject depth;

	//! Applies a horizontal scaling to an image.
	static MObject squeezeCorrection;

	//! Controls the width and height of the image plane.
	static MObject size;

	//! Image plane width
	static MObject sizeX;

	//! Image plane height.
	static MObject sizeY;

	//! Controls how much the center of the image plane is offset
	//! from the centre of the viewing frustum of the camera.
	static MObject offset;

	//! Horizontal component of Offset
	static MObject offsetX;

	//! Vertical component of Offset
	static MObject offsetY;

	//! Controls the world-space position of the center
	//! of the image plane.
	static MObject center;

	//! X component of Center
	static MObject centerX;

	//! Y component of Center
	static MObject centerY;

	//! Z component of Center
	static MObject centerZ;

	//! Controls the width of the image plane in world space.
	static MObject width;

	//! Controls the height of the image plane in world space.
	static MObject height;

	//! When ray tracing, controls whether the image plane
	//! will sppear in reflected surfaces.
	static MObject visibleInReflections;

	//! When ray tracing, controls whether the image plane will
	//! appear when seen through a transparent, refractive surface.
	static MObject visibleInRefractions;

	//! Rotation of the image plane around the view vector.
	static MObject rotate;

	//! Indicates if the image plane has already been pre-multiplied by its
	//! alpha.
	static MObject alreadyPremult;

	//! Indicates that the image plane has depth information.
	static MObject useDepthMap;

	//!	Indicates whether or not the image plane's color should be
	//!	composited into the final image.
	static MObject composite;

	//! Indicates if the depth information is at a higher resolution
	//! than the image resolution.
	static MObject depthOversample;

	//! Users can specify a depth buffer that is larger than the
	//! image buffer using the 'depthFile' attribute.
	static MObject separateDepth;

	//! Separate file that contains depth information.
	static MObject depthFile;

	//! Depth offset value -- centered at the center of the view frustum.
	static MObject depthBias;

	//! Scale the depth -- centered at the center of the view frustum.
	static MObject depthScale;

	static const char*	    className();

private:
	static void				initialSetup();


};

#endif /* __cplusplus */
#endif /* _MPxImagePlane */
