This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/MouseMgr.h

573 lines
16 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
///////////////////////////////////////////////////////////////////////////////////////
//
// MouseMgr.H
//
// Class declarations for managing different mouse modes;
//
#ifndef __MOUSEMGR_H
#define __MOUSEMGR_H
#include "refcount.h"
#include "utils.h"
#include "rendobj.h"
#include "assetmgr.h"
#include "cameramgr.h"
class WaypathNodeClass;
class ZoneInstanceClass;
class TransitionInstanceClass;
///////////////////////////////////////////////////////////////
//
// MouseModeClass
//
///////////////////////////////////////////////////////////////
class MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MouseModeClass (void)
: m_bUpdate (false) { }
virtual ~MouseModeClass (void) { }
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Dblclk (UINT flags, CPoint point) { }
virtual void Handle_LButton_Down (UINT flags, CPoint point);
virtual void Handle_LButton_Up (UINT flags, CPoint point);
virtual void Handle_RButton_Down (UINT flags, CPoint point);
virtual void Handle_RButton_Up (UINT flags, CPoint point);
virtual void Handle_Mouse_Move (UINT flags, CPoint point);
//
// Misc virtuals
//
virtual void On_Mode_Set (void) {}
virtual void On_Mode_Exit (void) {}
protected:
friend class MouseMgrClass;
///////////////////////////////////////////////////
// Protected member data
///////////////////////////////////////////////////
CPoint m_LastMousePoint;
CPoint m_MousePoint;
bool m_bUpdate;
CameraMgr::CAMERA_MODE m_LButtonMode;
CameraMgr::CAMERA_MODE m_RButtonMode;
CameraMgr::CAMERA_MODE m_BothButtonMode;
};
///////////////////////////////////////////////////////////////
//
// MMCameraDefaultClass
//
///////////////////////////////////////////////////////////////
class MMCameraDefaultClass : public MouseModeClass
{
public:
/////////////////////////////////////////////////////
// Public constructors/destructors
/////////////////////////////////////////////////////
MMCameraDefaultClass (void)
{
m_LButtonMode = CameraMgr::MODE_ROTATE_FREE;
m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_BothButtonMode = CameraMgr::MODE_MOVE_UPDOWN;
}
virtual ~MMCameraDefaultClass (void) { }
};
///////////////////////////////////////////////////////////////
//
// MMCameraWalkClass
//
///////////////////////////////////////////////////////////////
class MMCameraWalkClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMCameraWalkClass (void)
{
m_LButtonMode = CameraMgr::MODE_WALK_THROUGH;
m_RButtonMode = CameraMgr::MODE_WALK_THROUGH;
m_BothButtonMode = CameraMgr::MODE_WALK_THROUGH;
}
virtual ~MMCameraWalkClass (void) { }
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
virtual void On_Mode_Set (void) { } //::Get_Camera_Mgr ()->Set_Camera_Mode (CameraMgr::MODE_WALK_THROUGH); }
};
///////////////////////////////////////////////////////////////
//
// MMCameraFlyClass
//
//
class MMCameraFlyClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMCameraFlyClass (void)
{
m_LButtonMode = CameraMgr::MODE_FLY_THROUGH;
m_RButtonMode = CameraMgr::MODE_FLY_THROUGH;
m_BothButtonMode = CameraMgr::MODE_FLY_THROUGH;
}
virtual ~MMCameraFlyClass (void) {}
};
///////////////////////////////////////////////////////////////
//
// MMCameraOrbitClass
//
///////////////////////////////////////////////////////////////
class MMCameraOrbitClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMCameraOrbitClass (void)
{
m_LButtonMode = CameraMgr::MODE_ORBIT;
m_RButtonMode = CameraMgr::MODE_ORBIT;
m_BothButtonMode = CameraMgr::MODE_ORBIT;
}
virtual ~MMCameraOrbitClass (void) {}
};
///////////////////////////////////////////////////////////////
//
// MMHeightfieldEditClass
//
///////////////////////////////////////////////////////////////
class MMHeightfieldEditClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMHeightfieldEditClass (void)
{
m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
}
virtual ~MMHeightfieldEditClass (void) {}
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Down (UINT flags, CPoint point);
virtual void Handle_LButton_Up (UINT flags, CPoint point);
virtual void Handle_RButton_Down (UINT flags, CPoint point);
virtual void Handle_RButton_Up (UINT flags, CPoint point);
virtual void On_Mode_Set (void);
virtual void On_Mode_Exit (void);
};
///////////////////////////////////////////////////////////////
//
// MMObjectDropClass
//
/////////////////////////////////////////////////////////////////
class MMObjectDropClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMObjectDropClass (void) { }
virtual ~MMObjectDropClass (void) { }
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Down (UINT flags, CPoint point) { }
virtual void Handle_LButton_Up (UINT flags, CPoint point) { }
virtual void Handle_RButton_Down (UINT flags, CPoint point) { }
virtual void Handle_RButton_Up (UINT flags, CPoint point) { }
};
///////////////////////////////////////////////////////////////
//
// MMObjectManipulateClass
//
//
///////////////////////////////////////////////////////////////
class MMObjectManipulateClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMObjectManipulateClass (void)
: m_ObjectMode (MODE_NONE),
m_ForceDropToGround (false),
m_CurrentMovePos (0, 0, 0),
m_IntersectPoint (0, 0, 0)
{
m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
}
virtual ~MMObjectManipulateClass (void) { }
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Dblclk (UINT flags, CPoint point);
virtual void Handle_LButton_Down (UINT flags, CPoint point);
virtual void Handle_LButton_Up (UINT flags, CPoint point);
virtual void Handle_RButton_Down (UINT flags, CPoint point);
virtual void Handle_RButton_Up (UINT flags, CPoint point);
virtual void Handle_Mouse_Move (UINT flags, CPoint point);
virtual void On_Mode_Set (void);
void Set_Move_Nodes_Mode (void);
protected:
///////////////////////////////////////////////////
// Public data types
///////////////////////////////////////////////////
typedef enum
{
MODE_NONE = -1,
MODE_SELECT = 0,
MODE_LINK,
MODE_MOVE,
MODE_ROTATE,
MODE_COUNT
} OBJECT_MODE;
///////////////////////////////////////////////////
// Protected methods
///////////////////////////////////////////////////
void Move_Selection (CPoint point);
void Rotate_Selection (CPoint point);
void Link_Item_Hit_Test (CPoint point);
void On_Link_Begin (CPoint point);
void On_Link_End (CPoint point, bool cancelled = false);
void Change_Operation (OBJECT_MODE type);
private:
///////////////////////////////////////////////////
// Private member data
///////////////////////////////////////////////////
OBJECT_MODE m_ObjectMode;
Vector3 m_CurrentMovePos;
Vector3 m_IntersectPoint;
bool m_ForceDropToGround;
//class LinkLineClass ** m_pLinkLines;
//int m_iLinkLineCount;
//BOOL m_bValidLink;
};
///////////////////////////////////////////////////////////////
//
// MMObjectSelectClass
//
///////////////////////////////////////////////////////////////
class MMObjectSelectClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMObjectSelectClass (void) {}
virtual ~MMObjectSelectClass (void) {}
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Down (UINT flags, CPoint point) { }
virtual void Handle_LButton_Up (UINT flags, CPoint point) { }
virtual void Handle_RButton_Down (UINT flags, CPoint point) { }
virtual void Handle_RButton_Up (UINT flags, CPoint point) { }
};
///////////////////////////////////////////////////////////////
//
// MMWaypathEditClass
//
///////////////////////////////////////////////////////////////
class MMWaypathEditClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMWaypathEditClass (void)
: m_CurrentPoint (-1),
m_Waypath (NULL)
{
m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
}
virtual ~MMWaypathEditClass (void) { }
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Down (UINT flags, CPoint point);
virtual void Handle_LButton_Up (UINT flags, CPoint point);
virtual void Handle_RButton_Down (UINT flags, CPoint point);
virtual void Handle_RButton_Up (UINT flags, CPoint point);
virtual void Handle_Mouse_Move (UINT flags, CPoint point);
virtual void On_Mode_Set (void);
virtual void On_Mode_Exit (void);
virtual void Set_Waypath (WaypathNodeClass *waypath, int index = 0) { m_Waypath = waypath; m_CurrentPoint = index; }
protected:
///////////////////////////////////////////////////
// Protected methods
///////////////////////////////////////////////////
void Exit_Mode (void);
private:
///////////////////////////////////////////////////
// Private member data
///////////////////////////////////////////////////
WaypathNodeClass * m_Waypath;
int m_CurrentPoint;
};
///////////////////////////////////////////////////////////////
//
// MMGrabHandleDragClass
//
///////////////////////////////////////////////////////////////
class MMGrabHandleDragClass : public MouseModeClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MMGrabHandleDragClass (void)
: m_Node (NULL),
m_Vertex (0)
{
m_LButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_RButtonMode = CameraMgr::MODE_MOVE_PLANE;
m_BothButtonMode = CameraMgr::MODE_MOVE_PLANE;
}
virtual ~MMGrabHandleDragClass (void) {}
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
//
// Mouse message handlers
//
virtual void Handle_LButton_Dblclk (UINT flags, CPoint point) {}
virtual void Handle_LButton_Down (UINT flags, CPoint point) {}
virtual void Handle_LButton_Up (UINT flags, CPoint point);
virtual void Handle_RButton_Down (UINT flags, CPoint point) {}
virtual void Handle_RButton_Up (UINT flags, CPoint point) {}
virtual void Handle_Mouse_Move (UINT flags, CPoint point);
virtual void On_Mode_Set (void) { m_Node = NULL; }
//
// Specific methods
//
void Set_Node_Info (NodeClass *node, int vertex_index);
private:
///////////////////////////////////////////////////
// Private member data
///////////////////////////////////////////////////
NodeClass * m_Node;
int m_Vertex;
};
///////////////////////////////////////////////////////////////
//
// MouseMgrClass
//
///////////////////////////////////////////////////////////////
class MouseMgrClass
{
public:
///////////////////////////////////////////////////
// Public constructors/destructors
///////////////////////////////////////////////////
MouseMgrClass (void);
virtual ~MouseMgrClass (void);
///////////////////////////////////////////////////
// Public data types
///////////////////////////////////////////////////
typedef enum
{
MODE_CAMERA_DEFAULT = 0,
MODE_CAMERA_WALK,
MODE_CAMERA_FLY,
MODE_CAMERA_ORBIT,
MODE_OBJECT_DROP,
MODE_OBJECT_MANIPULATE,
MODE_OBJECT_SELECT,
MODE_GRABHANDLE_DRAG,
MODE_WAYPATH_EDIT,
MODE_HEIGHTFIELD_EDIT,
MODE_COUNT
} MOUSE_MODE;
///////////////////////////////////////////////////
// Public methods
///////////////////////////////////////////////////
MouseMgrClass::MOUSE_MODE Get_Mouse_Mode (void) const { return m_MouseMode; }
void Set_Mouse_Mode (MOUSE_MODE new_mode);
MouseModeClass * Get_Mode_Mgr (void) { return m_pModeObjects[m_MouseMode]; }
//
// Mouse message handlers
//
void Handle_LButton_Dblclk (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_LButton_Dblclk (flags, point); }
void Handle_LButton_Down (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_LButton_Down (flags, point); IsLButtonDown = true; }
void Handle_LButton_Up (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_LButton_Up (flags, point); IsLButtonDown = false; }
void Handle_RButton_Down (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_RButton_Down (flags, point); IsRButtonDown = true; }
void Handle_RButton_Up (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_RButton_Up (flags, point); IsRButtonDown = false; }
void Handle_Mouse_Move (UINT flags, CPoint point) { m_pModeObjects[m_MouseMode]->Handle_Mouse_Move (flags, point); }
//
// Mouse point methods
//
CPoint Get_Mouse_Point (void) const { return m_pModeObjects[m_MouseMode]->m_MousePoint; }
CPoint Get_Last_Mouse_Point (void) const { return m_pModeObjects[m_MouseMode]->m_LastMousePoint; }
//
// Object manipulation methods
//
void Move_Node (NodeClass *node);
//
// Button access
//
bool Is_LButton_Down (void) const { return IsLButtonDown; }
bool Is_RButton_Down (void) const { return IsRButtonDown; }
private:
///////////////////////////////////////////////////
// Private member data
///////////////////////////////////////////////////
class MouseModeClass * m_pModeObjects[MOUSE_MODE::MODE_COUNT];
MOUSE_MODE m_MouseMode;
bool IsLButtonDown;
bool IsRButtonDown;
};
#endif //__MOUSEMGR_H