pnTriangles/pnTrianglesNode.h

pnTriangles/pnTrianglesNode.h
#ifndef _pnTrianglesNode
#define _pnTrianglesNode
//-
// ==========================================================================
// 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 is provided for use exclusively by You. You have the right
// to use, modify, and incorporate this Data into other products for
// purposes authorized by the Autodesk software license agreement,
// without fee.
//
// 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.
//
// ==========================================================================
//+
// File: pnTrianglesNode.h
//
// Dependency Graph Node: pnTriangles
//
// Description:
//
// Hardware shader plugin to perform ATI PN triangle
// tessellation on geometry. If the ATI extension
// is not available, the extension will be emulated
// in software.
//
#include <maya/MPxHwShaderNode.h>
#include <maya/MFnNumericAttribute.h>
#include <maya/MTypeId.h>
// ATI extension definitions
#if defined(OSMac_MachO_)
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif
#include "ATIext.h"
class pnTriangles : public MPxHwShaderNode
{
// Class node methods
public:
pnTriangles();
virtual ~pnTriangles();
virtual bool getInternalValue( const MPlug&, MDataHandle&);
virtual bool setInternalValue( const MPlug&, const MDataHandle&);
// Shader node overrides
virtual MStatus bind(const MDrawRequest& request,
M3dView& view);
virtual MStatus unbind(const MDrawRequest& request,
M3dView& view);
virtual MStatus geometry( const MDrawRequest& request,
M3dView& view,
int prim,
unsigned int writable,
int indexCount,
const unsigned int * indexArray,
int vertexCount,
const int * vertexIDs,
const float * vertexArray,
int normalCount,
const float ** normalArrays,
int colorCount,
const float ** colorArrays,
int texCoordCount,
const float ** texCoordArrays);
virtual int normalsPerVertex();
virtual int texCoordsPerVertex();
virtual int colorsPerVertex();
static void* creator();
static MStatus initialize();
public:
typedef enum {
kPointLinear,
kPointCubic
} ePointMode;
typedef enum {
kNormalLinear,
kNormalQuadratic
} eNormalMode;
typedef enum
{
kPNTriangesEXT = 0,
kVertexShaderEXT = 1,
kFragmentShaderEXT = 2
} eExtension;
// Data access methods
int maxTessellationLevel() const { return fMaxTessellationLevel; }
ePointMode pointMode() const { return fPointMode; }
eNormalMode normalMode() const { return fNormalMode; }
unsigned int subdivisions() const { return fSubdivisions; }
GLboolean extensionSupported( eExtension e ) const
{ return fExtensionSupported[e] ; }
// Node attributes for PN-triangles
static MObject attrSubdivisions; // Number of subdivisions
static MObject attrNormalMode; // Normal evaluation mode
static MObject attrPointMode; // Point evaluation mode
// Node attributes for programmable shading
static MObject attrEnableVertexProgram; // Enable vertex program
static MObject attrEnablePixelProgram; // Enable pixel program
// General node attributes for display
static MObject attrColored; // Display colored
static MObject attrWireframe; // Display wireframe
static MObject attrTextured; // Display textured
// Node ID
static MTypeId id;
protected:
MStatus getFloat3(MObject attr, float value[3]);
unsigned int computePNTriangles(const float * vertexArray,
const float * normalArray,
const float * texCoordArray,
float * pnVertexArray,
float * pnNormalArray,
float * pnTexCoordArray,
float * pnColorArray);
void bindVertexProgram(const MColor diffuse,
const MColor specular,
const MColor emission,
const MColor ambient);
void bindFragmentProgram();
unsigned int fSubdivisions; // Cached subdivision value
GLboolean fExtensionSupported[3]; // Is PN-triangles extension supported ?
ePointMode fPointMode; // Point mode
eNormalMode fNormalMode; // Normal mode
unsigned int fMaxTessellationLevel; // Maximum tessellation level
// Attribute requirements for geometry. Set
// depending on display mode
int fNumTextureCoords; // textured
int fNumNormals; // shaded
int fNumColors; // coloured
bool fWireframe; // wireframe
bool fInTexturedMode;
bool fTestVertexProgram;
bool fTestFragmentProgram;
int fVertexShaderId;
int fFragmentShaderId;
};
#endif