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

# 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