PtexExtractor/PtexLayout.h


//**************************************************************************/

// Copyright (c) 2010 Autodesk, Inc.

// All rights reserved.

//

// Use of this software is subject to the terms of the Autodesk license

// agreement provided at the time of installation or download, or which

// otherwise accompanies this software in either electronic or hard copy form.

//

//**************************************************************************/

// DESCRIPTION:

// CREATED: August 2010

//**************************************************************************/



#if defined(JAMBUILD)

#include <Mudbox/mudbox.h>

#include <MapExtractor/MapExtractorInterface.h>

#else

#include "../../include/Mudbox/mudbox.h"

#include "../../include/MapExtractor/MapExtractorInterface.h"

#endif



using namespace mudbox;



// This class is responsible to specify the location and order of the reference points on the target mesh which needs a value to be extracter. In case of a ptex extraction

// process this class will specify points on each base level face in a grid pattern.

class PtexLayout : public Layout

{

    DECLARE_CLASS;

    // These are the additional data which will be added to each reference point. Based on these data the PtexUtilizer class (which is responsible to process the result

    // of the extraction) will know where to put the data in the ptex file.

    enum

    {

        dataURes,   // coordinate of the reference point in the grid in horizontal direction

        dataVRes,   // coordinate of the reference point in the grid in horizontal direction

        dataFaceID  // ID of the ptex face

    };

    PtexLayout( void );

    // This function creates the user interface widgets which belong to this type of layout.

    virtual QWidget *UserInterface( void );

    // Main function of the class. This is only called once for a map extraction operation. This function collects the reference points on the target surface(s).

    virtual void ProcessSurfaces( QVector<SubdivisionLevel *> aSurfaces );

    // Prepares the instance for the extraction, returns the expected number of reference points (for progress indicator)

    virtual unsigned int Prepare( void );

    // When the map extraction node is saved into a mud file, this function must serialize the data members of the object.

    virtual void Serialize( Stream &s );

    // This function returns the resolution for a given target mesh.

    int TargetResolution( int iTargetIndex ) const;

    

    // This is the only one parameter of the object, it controls the resolution of the grid for each base level face.

    aenum m_eQuality;

    // This member variable controls directly the resolution of the ptex file. If the value stored in this variable is zero, then m_eQuality and the level

    // difference between the target and source surfaces are used.

    int m_iDirectResolution;



    // The remaining functions and variables are needed to caculate the adjacency information for nsided meshes. For full quad meshes

    // there is a one-to-one relationship between mudbox quads and ptex faces, so in that case the adjacency calculation is easy.

    // For more information on how ptex expects the adjacency info, see http://http://ptex.us/adjdata.html



    // This function precalculates some adjacency related data for the mesh.

    void PrepareAdjacency( const Mesh *m_pMesh );

    // This function calculates the adjacency info for an edge of a triagle mudbox face.

    unsigned int AdjacentFaceForTriangle( unsigned int iFaceIndex, unsigned int iSide, unsigned int iSegment, unsigned int &iEdge ) const;

    // This function calculates the adjacency info for a ptex face edge.

    unsigned int AdjacentFace( unsigned int iFaceID, unsigned int iSide, unsigned int &iEdge ) const;



    // Pointer to the mesh which adjacency is currently being calculated.

    const Mesh *m_pMesh;

    // The following array tells the ptex face id for a given mudbox triangle. Contains valid values only for real triangles.

    QVector<unsigned int> m_aFaceID;

    // The following array tells the mudbox triangle index for a given ptex face ID. This array is the opposite of the m_aFaceID array.

    QVector<unsigned int> m_aTriangle;

};