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;

};