- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files
- Directories
- Examples

# PtexImporter/PtexImporter.h

    #if !defined PTEX_IMPORTER
    #define PTEX_IMPORTER
    //**************************************************************************/
    // Copyright (c) 2011, 2012 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: PTEX texture importer
    // CREATED: January 2011
    //**************************************************************************/

    #if defined(JAMBUILD)
    #include <Mudbox/mudbox.h>

    #include <UVlessPainting/UVMeshGrid.h>
    #include <UVlessPainting/UVGeneratorInterface.h>
    #include <EdgeBleeding/EdgeBleeding.h>
    #else
    #include "../../include/Mudbox/mudbox.h"
    #include "../../include/UVlessPainting/UVGeneratorInterface.h"
    #include "../../include/EdgeBleeding/EdgeBleeding.h"
    #endif

    #include "ptex/Ptexture.h"

    using namespace mudbox;

    //------------------------------------------------------------------------------
    // We will refuse to import ptex files with polys larger than MAX_EDGE_COUNT
    // Don't make this too large -- staticly sized arrays on the stack will
    // be sized based on this. It should be more than 5, definitely less than 500.
    // It is very possible that other parts of Mudbox will break when presented with
    // a 100 edge poly -- I've never tried it....

    #define MAX_EDGE_COUNT 100

    //------------------------------------------------------------------------------
    // Cross reference our face ids with the ptex face ids.
    // Each ptex face will create 1 or more Mudbox faces.
    // The map is indexed by PTex parent Face ID, and for each of those, will give the
    // start MudboxFaceID and the number of triangles the PTexFace
    // has been tessellated into. It also gives the Ptex subface index for the first
    // subface.
    // The Mudbox FaceIDs for those faces will
    // be m_MBFaceID, m_MBFaceID+1, ... m_MBFaceID+m_NumTessellatedFaces-1
    class FaceMapEntry {              // there is one of these for each PTex Face / n-gon poly.
        public:
        int    m_NumTessellatedFaces; // How many Mudbox triangles has this been tessellated into.
        int    m_NumEdges;            // how many edges in the poly.
        int    m_MBFaceID;            // Index of the first triangle in the Mudbox Mesh (or of the quad if its an all quad mesh).
        int    m_PTexSubfaceID;       // indes of the first ptex subface where the texture data can be read from the ptex file
        FaceMapEntry() : m_NumTessellatedFaces(0), m_NumEdges(0), m_MBFaceID(0), m_PTexSubfaceID(0) {};
    };

    //------------------------------------------------------------------------------
    class PtexImporter : public Importer
    {
        public:

        Q_DECLARE_TR_FUNCTIONS(PtexImporter);
        DECLARE_CLASS;

        // Make sure everything is initialized, if only to ensure determinism.
        PtexImporter() : m_allQuads(false),
                         m_iFaceCount(0),
                         m_iSubFaceCount(0),
                         m_maxFaceSize(0),
                         m_minFaceSize(0),
                         m_iTotalTesselatedFaceCount(0),
                         m_FaceMap(0),
                         m_ReverseFaceMap(0)
        {
            memset(m_hist, 0, MAX_EDGE_COUNT * sizeof(int));
        }

        // Returns the file extension and description of the supported file by the plugin.
        QVector<FileExtension> SupportedExtensions( void ) const
        {
            QVector<FileExtension> ret;
            ret.push_back(FileExtension(NTR("ptx"), tr("Ptex File"), FileExtension::flagNoTextureCoordinates));
            return ret;
        };

        // Import a file, main function of the class.
        virtual void Import( const QString &sFileName, Scene::LoadData &cData );

        // This function creates a mesh from the metadata in a ptex file. If there is no mesh
        // metadata in the ptex file, it will return NULL.
        Mesh *CreateMeshFromPtex( const QString &sFileName, bool makeMesh = true, bool silent = false );

        // If there is no mesh data in the ptex file, you can call this to build the cross reference
        // tables to go from ptex ids to mudbox and back.
        void          BuildMapsFromBaseMesh(Mesh *pMesh);

        bool          m_allQuads;                  // true if the ptex file is all quads
        int           m_iFaceCount;                // count of ptex polys (quads, tris and ngons each count as 1)
        int           m_iSubFaceCount;             // in this many quad faces (tris and ngons subdivided into quad subfaces)
        int           m_maxFaceSize;               // min and max edge count for the ptex faces
        int           m_minFaceSize;
        int           m_iTotalTesselatedFaceCount; // how many triangles are we making in total for the mudbox mesh

        FaceMapEntry *m_FaceMap;                   // map of ptex faces to mudbox faces and ptex subfaces
        int          *m_ReverseFaceMap;            // map from Mudbox faceID to ptex face (not subface) id
                                                   // to get the subface, take the result of this map and index into the FaceMap

        int           m_hist[MAX_EDGE_COUNT];      // a histogram of PTex poly edge counts
    };

    //------------------------------------------------------------------------------

    #endif