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

# MeshDisplace/displacer.h

    //**************************************************************************/
    // Copyright (c) 2008 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: October 2008
    //**************************************************************************/

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

    using namespace mudbox;

    // This structure holds info for a single vertex.
    struct VertexInfo
    {
        VertexInfo( void ) {};
        VertexInfo( unsigned int iGlobalVertexIndex, unsigned int iVertexIndex, const Vector &vDisp, float fMask, unsigned int iFaceIndex, unsigned int iCornerIndex )
        {
            m_iGlobalVertexIndex = iGlobalVertexIndex;
            m_iVertexIndex = iVertexIndex;
            m_vDisplacement = vDisp;
            m_fMask = fMask;
            m_iCount = 1;
            m_iFaceIndex = iFaceIndex;
            m_iCornerIndex = iCornerIndex;
        };
        int operator -( const VertexInfo &v ) const { return m_iGlobalVertexIndex-v.m_iGlobalVertexIndex; };
        void Refine( const Vector &vDisplacement, float fMask )
        {
            m_vDisplacement = (m_iCount*m_vDisplacement+vDisplacement)/(m_iCount+1);
            m_fMask = (m_iCount*m_fMask+fMask)/(m_iCount+1);
            m_iCount++;
        };

        unsigned int m_iVertexIndex;
        unsigned int m_iGlobalVertexIndex;
        unsigned int m_iFaceIndex;
        unsigned int m_iCornerIndex;
        float m_fMask;
        Vector m_vDisplacement;
        int m_iCount;
    };

    struct Tile
    {
        unsigned int m_iIndex;
        bool m_bZero;
    };

    // This is the main class for the plugin.
    class DisplaceOperation : public TreeNode
    {
        Q_DECLARE_TR_FUNCTIONS(DisplaceOperation);
        DECLARE_CLASS;

        enum Space
        {
            spaceNormal,
            spaceTangent,
            spaceAbsoluteTangent,
            spaceObject,
            spaceWorld
        };

        // This function is used to convert masked filenames to final ones, replacing the %x %y %i variables with proper values.
        QString GetFileName( const QString &sMask, unsigned int iTile, unsigned int iUPos, unsigned int iVPos ) const;
        // This function is the oposite, converts a real filename to a masked one.
        QString FilterFileName( const QString &sFileName ) const;

    public:
        DisplaceOperation( void );

        void Do( void );
        // Main function, called when the operation must be performed.
        void Execute( void );

        // Called by Mudbox when an event occurs with an attribute
        void OnNodeEvent( const Attribute &, NodeEventType eType );
        // Makes it possible to store/restore the data in this object.
        void Serialize( Stream &cStream );
        // This will be called when the plugin is loaded into memory.
        static void Initializer( void );
        // Make it possible to customize the Properties windows
        virtual QWidget* CreatePropertiesWindow( QWidget *pParent );

        // Pointer to the target object.
        aptr<Geometry> m_pObject;
        // Level of subdivision the object.
        aint m_iSubdivisionLevel;
        // True if texture coordinates should be smoothed. This helps preventing seams on the displaced model.
        abool m_bSmoothTC;
        // This is only a feedback attribute to the user.
        aint m_iFinalFaceCount;
        // Space of the displacement map.  By default the displacement map is treated as a regular scalar displacement map.
        aenum m_eMapSpace;

        // Filename mask for the displacement map.
        afilename m_sDisplacementFileMask;
        // Lower value for the displacement range.
        mutable afloat m_fMidvalue;
        // Upper value for the displacement range.
        mutable afloat m_fMultiplier;
        // Channel to be used in the displacement image.
        aenum m_iDisplacementChannel;
        // Filename mask for the mask image.
        afilename m_sMaskFileMask;
        // Channel to be used in the mask image.
        aenum m_iMaskChannel;

        // Number of tiles in a row.
        aint m_iUDim;
        // Index of the tile on the upper left corner.
        aint m_iFirstTileIndex;
        // String describes which tiles should be processed
        astring m_sTileRange;

        // Push button to execute the operation.
        aevent m_eExecute;
        // Push button to delete the operation
        aevent m_eDelete;

        astring m_sNextCommand;

        // List of tiles to be processed
        unsigned int m_iVDim;
        Store<Tile> m_aTiles;

        bool m_bFloatMap;
        int m_iBaseU, m_iBaseV;
    };