You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
327 lines
6.5 KiB
327 lines
6.5 KiB
//======= Copyright © 1996-2006, Valve Corporation, All rights reserved. ======
|
|
//
|
|
// Maya Undo helper, use it like this
|
|
//
|
|
// class CMyCmd : MPxCommand
|
|
// {
|
|
// // ... regular stuff ... //
|
|
//
|
|
// ValveMaya::CUndo m_undo;
|
|
// };
|
|
//
|
|
// MStatus CMyCmd::doIt( const MArgList &mArgList )
|
|
// {
|
|
// m_undo.SetArgList( Syntax(), mArgList );
|
|
// }
|
|
//
|
|
// MStatus CMyCmd::redoIt( const MArgList &mArgList )
|
|
// {
|
|
// // Get at command line args
|
|
// m_undo.ArgDatabase().isFlagSet( ... );
|
|
//
|
|
// // Do operations
|
|
// m_undo.SaveCurrentSelection();
|
|
// m_undo.DagModifier().createNode( ... );
|
|
// m_undo.DagModifierDoIt();
|
|
// m_undo.SetAttr( mPlug, value );
|
|
//
|
|
// /// etc ...
|
|
// }
|
|
//
|
|
// MStatus CMyCmd::undoIt( const MArgList &mArgList )
|
|
// {
|
|
// m_undo.Undo();
|
|
// }
|
|
//
|
|
// bool CMyCmd::isUndoable()
|
|
// {
|
|
// return m_undo.IsUndoable();
|
|
// }
|
|
//
|
|
// If there's a need to get fancy, any of the CUndoOp* classes can be
|
|
// constructed via 'new' and a boost::shared_ptr< CUndoOp > constructed
|
|
// with that pointed can be passed to CUndo::Push(). Note that means
|
|
// that the pointer will be managed by boost::shared_ptr so if the
|
|
// lifetime of the data needs to be controlled by the caller (it shouldn't)
|
|
// then a shared_ptr should be kept
|
|
//
|
|
// Setting the ArgList and using ArgDatabase doesn't affect the undo/redo
|
|
// ability but it's a convnient place to keep that data
|
|
//
|
|
//=============================================================================
|
|
|
|
#ifndef VALVEMAYA_UNDO_H
|
|
#define VALVEMAYA_UNDO_H
|
|
#if defined( _WIN32 )
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
// Standard includes
|
|
|
|
|
|
// Maya includes
|
|
#include <maya/MArgDatabase.h>
|
|
#include <maya/MArgList.h>
|
|
#include <maya/MDagModifier.h>
|
|
#include <maya/MDagPath.h>
|
|
#include <maya/MObject.h>
|
|
#include <maya/MPlug.h>
|
|
#include <maya/MSelectionList.h>
|
|
#include <maya/MStatus.h>
|
|
#include <maya/MString.h>
|
|
#include <maya/MSyntax.h>
|
|
#include <maya/MTransformationMatrix.h>
|
|
|
|
|
|
// Valve includes
|
|
#include "tier1/utlstack.h"
|
|
|
|
|
|
namespace ValveMaya
|
|
{
|
|
|
|
// Forward declarations
|
|
class CUndoOp;
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
// CUndo: Undo stack manager class
|
|
//
|
|
//
|
|
//=============================================================================
|
|
|
|
class CUndo
|
|
{
|
|
public:
|
|
CUndo();
|
|
|
|
~CUndo();
|
|
|
|
void Clear();
|
|
|
|
MStatus SetArgList(
|
|
const MSyntax &mSyntax,
|
|
const MArgList &mArgList );
|
|
|
|
const MArgDatabase &ArgDatabase();
|
|
|
|
void SaveCurrentSelection();
|
|
|
|
MDagModifier &DagModifier();
|
|
|
|
MStatus DagModifierDoIt();
|
|
|
|
MStatus Connect(
|
|
const MPlug &srcP,
|
|
const MPlug &dstP,
|
|
bool force = false );
|
|
|
|
bool SetAttr(
|
|
MPlug &mPlug,
|
|
MObject &val );
|
|
|
|
bool SetAttr(
|
|
MPlug &mPlug,
|
|
double val );
|
|
|
|
bool Lock(
|
|
MPlug &mPlug,
|
|
bool lock );
|
|
|
|
void NodeCreated( MObject &nodeObject );
|
|
|
|
void Push(
|
|
CUndoOp *pUndoOp );
|
|
|
|
bool IsUndoable() const;
|
|
|
|
MStatus Undo();
|
|
|
|
protected:
|
|
MArgDatabase *m_pArgDatabase;
|
|
CUtlStack< CUndoOp * > m_undoStack;
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
// CUndoOp: Undo stack member abstract base class
|
|
//
|
|
//
|
|
//=============================================================================
|
|
class CUndoOp
|
|
{
|
|
public:
|
|
virtual ~CUndoOp()
|
|
{
|
|
}
|
|
|
|
virtual void Undo() = 0;
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
// CUndoOpDagModifier: Undo stack member Dag Modifier class
|
|
//
|
|
//
|
|
//=============================================================================
|
|
class CUndoOpDagModifier : public CUndoOp
|
|
{
|
|
public:
|
|
virtual ~CUndoOpDagModifier()
|
|
{
|
|
}
|
|
|
|
virtual void Undo()
|
|
{
|
|
m_mDagModifier.undoIt();
|
|
}
|
|
|
|
protected:
|
|
friend class CUndo;
|
|
|
|
MDagModifier m_mDagModifier;
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
// CUndoOpSetAttr: Undo stack member for setting attributes
|
|
//
|
|
//
|
|
//=============================================================================
|
|
class CUndoOpSetAttr : public CUndoOp
|
|
{
|
|
public:
|
|
CUndoOpSetAttr(
|
|
MPlug &mPlug,
|
|
MObject &mObjectVal );
|
|
|
|
CUndoOpSetAttr(
|
|
MPlug &mPlug,
|
|
double numericVal );
|
|
|
|
virtual ~CUndoOpSetAttr()
|
|
{
|
|
}
|
|
|
|
virtual void Undo();
|
|
|
|
protected:
|
|
MPlug m_mPlug;
|
|
MObject m_mObjectVal;
|
|
double m_numericVal;
|
|
const bool m_numeric;
|
|
|
|
private:
|
|
// Visual C++ is retarded - tell it there's no assignment operator
|
|
CUndoOpSetAttr &operator=( const CUndoOpSetAttr &rhs );
|
|
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
// CUndoOpSelection: Undo stack member for changing selection
|
|
//
|
|
//
|
|
//=============================================================================
|
|
class CUndoOpSelection : public CUndoOp
|
|
{
|
|
public:
|
|
CUndoOpSelection();
|
|
|
|
virtual ~CUndoOpSelection()
|
|
{
|
|
}
|
|
|
|
virtual void Undo();
|
|
|
|
protected:
|
|
MSelectionList m_mSelectionList;
|
|
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//
|
|
// CUndoOpSelection: Undo stack member for locking and unlocking attributes
|
|
//
|
|
//
|
|
//=============================================================================
|
|
class CUndoOpLock : public CUndoOp
|
|
{
|
|
public:
|
|
|
|
CUndoOpLock(
|
|
MPlug &mPlug,
|
|
bool lock );
|
|
|
|
virtual ~CUndoOpLock()
|
|
{
|
|
}
|
|
|
|
virtual void Undo();
|
|
|
|
protected:
|
|
MPlug m_mPlug;
|
|
const bool m_locked;
|
|
|
|
private:
|
|
// Visual C++ is retarded - tell it there's no assignment operator
|
|
CUndoOpLock &operator=( const CUndoOpLock &rhs );
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
//
|
|
//=============================================================================
|
|
class CUndoOpResetRestPosition : public CUndoOp
|
|
{
|
|
public:
|
|
CUndoOpResetRestPosition(
|
|
const MDagPath &mDagPath );
|
|
|
|
virtual ~CUndoOpResetRestPosition()
|
|
{
|
|
}
|
|
|
|
virtual void Undo();
|
|
|
|
protected:
|
|
const MDagPath m_mDagPath;
|
|
MTransformationMatrix m_matrix;
|
|
};
|
|
|
|
|
|
//=============================================================================
|
|
// For node creation via something like MFnMesh::create, etc..
|
|
//=============================================================================
|
|
class CUndoOpNodeCreated : public CUndoOp
|
|
{
|
|
public:
|
|
CUndoOpNodeCreated(
|
|
MObject &mObject );
|
|
|
|
virtual ~CUndoOpNodeCreated()
|
|
{
|
|
}
|
|
|
|
virtual void Undo();
|
|
|
|
protected:
|
|
MObject m_nodeObject;
|
|
};
|
|
|
|
|
|
}
|
|
#endif // VALVEMAYA_UNDO_H
|