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.
203 lines
5.4 KiB
203 lines
5.4 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef MORPH3D_H
|
||
|
#define MORPH3D_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "MapClass.h" // dvs: For CMapObjectList
|
||
|
#include "Box3D.h"
|
||
|
#include "SSolid.h"
|
||
|
#include "Resource.h"
|
||
|
#include "ScaleVerticesDlg.h"
|
||
|
#include "ToolInterface.h"
|
||
|
#include "mathlib/vector.h"
|
||
|
|
||
|
|
||
|
class IMesh;
|
||
|
class Morph3D;
|
||
|
class CRender2D;
|
||
|
class CRender3D;
|
||
|
|
||
|
|
||
|
const SSHANDLE SSH_SCALEORIGIN = 0xffff0L;
|
||
|
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
CMapSolid *pMapSolid;
|
||
|
CSSolid *pStrucSolid;
|
||
|
SSHANDLE ssh;
|
||
|
} MORPHHANDLE;
|
||
|
|
||
|
|
||
|
class Morph3D : public Box3D
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
Morph3D();
|
||
|
virtual ~Morph3D();
|
||
|
|
||
|
BOOL IsMorphing(CMapSolid *pSolid, CSSolid **pStrucSolidRvl = NULL);
|
||
|
|
||
|
bool SplitFace();
|
||
|
bool CanSplitFace();
|
||
|
|
||
|
void SelectHandle(MORPHHANDLE *pInfo, UINT cmd = scSelect);
|
||
|
void SelectHandle2D( CMapView2D *pView, MORPHHANDLE *pInfo, UINT cmd = scSelect);
|
||
|
void DeselectHandle(MORPHHANDLE *pInfo);
|
||
|
|
||
|
void MoveSelectedHandles(const Vector &Delta);
|
||
|
int GetSelectedHandleCount(void) { return m_SelectedHandles.Count(); }
|
||
|
void GetSelectedCenter(Vector& pt);
|
||
|
SSHANDLETYPE GetSelectedType() { return m_SelectedType; }
|
||
|
bool IsSelected(MORPHHANDLE &mh);
|
||
|
|
||
|
void SelectObject(CMapSolid *pSolid, UINT cmd = scSelect);
|
||
|
bool SelectAt( CMapView *pView, UINT nFlags, const Vector2D &vPoint );
|
||
|
|
||
|
void GetMorphBounds(Vector &mins, Vector &maxs, bool bReset);
|
||
|
|
||
|
void SnapSelectedToGrid( int nGridSpacing );
|
||
|
|
||
|
// Toggle mode - vertex & edge, vertex, edge.
|
||
|
void ToggleMode();
|
||
|
|
||
|
void OnScaleCmd(BOOL bReInit = FALSE);
|
||
|
void UpdateScale();
|
||
|
BOOL IsScaling() { return m_bScaling; }
|
||
|
|
||
|
void GetMorphingObjects(CUtlVector<CMapClass *> &List);
|
||
|
|
||
|
inline int GetObjectCount(void);
|
||
|
inline CSSolid *GetObject(int pos);
|
||
|
|
||
|
//
|
||
|
// Tool3D implementation.
|
||
|
//
|
||
|
virtual bool IsEmpty() { return !m_StrucSolids.Count() && !m_bBoxSelecting; }
|
||
|
virtual void SetEmpty();
|
||
|
virtual void FinishTranslation(bool bSave);
|
||
|
virtual unsigned int GetConstraints(unsigned int nKeyFlags);
|
||
|
|
||
|
//
|
||
|
// CBaseTool implementation.
|
||
|
//
|
||
|
virtual void OnActivate();
|
||
|
virtual void OnDeactivate();
|
||
|
virtual ToolID_t GetToolID(void) { return TOOL_MORPH; }
|
||
|
|
||
|
virtual bool CanDeactivate( void );
|
||
|
|
||
|
virtual bool OnKeyDown2D(CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags);
|
||
|
virtual bool OnChar2D(CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags);
|
||
|
virtual bool OnLMouseDown2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint);
|
||
|
virtual bool OnLMouseUp2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint);
|
||
|
virtual bool OnMouseMove2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint);
|
||
|
|
||
|
virtual bool OnLMouseDown3D(CMapView3D *pView, UINT nFlags, const Vector2D &vPoint);
|
||
|
virtual bool OnLMouseUp3D(CMapView3D *pView, UINT nFlags, const Vector2D &vPoint);
|
||
|
virtual bool OnKeyDown3D(CMapView3D *pView, UINT nChar, UINT nRepCnt, UINT nFlags);
|
||
|
virtual bool OnMouseMove3D(CMapView3D *pView, UINT nFlags, const Vector2D &vPoint);
|
||
|
|
||
|
virtual void RenderTool2D(CRender2D *pRender);
|
||
|
virtual void RenderTool3D(CRender3D *pRender);
|
||
|
|
||
|
private:
|
||
|
|
||
|
void OnEscape(void);
|
||
|
bool NudgeHandles(CMapView *pView, UINT nChar, bool bSnap);
|
||
|
|
||
|
bool MorphHitTest(CMapView *pView, const Vector2D &vPoint, MORPHHANDLE *pInfo);
|
||
|
|
||
|
void GetHandlePos(MORPHHANDLE *pInfo, Vector& pt);
|
||
|
|
||
|
SSHANDLE Get2DMatches(CMapView2D *pView, CSSolid *pStrucSolid, SSHANDLEINFO &hi, CUtlVector<SSHANDLE>*pSimilarList = NULL);
|
||
|
|
||
|
void StartTranslation(CMapView *pView, const Vector2D &vPoint, MORPHHANDLE *pInfo );
|
||
|
|
||
|
void RenderSolid3D(CRender3D *pRender, CSSolid *pSolid);
|
||
|
|
||
|
//
|
||
|
// Tool3D implementations.
|
||
|
//
|
||
|
int HitTest(CMapView *pView, const Vector2D &ptClient, bool bTestHandles = false);
|
||
|
|
||
|
virtual bool UpdateTranslation( const Vector &pos, UINT uFlags );
|
||
|
|
||
|
bool StartBoxSelection( CMapView *pView, const Vector2D &vPoint, const Vector &vStart);
|
||
|
void SelectInBox();
|
||
|
void EndBoxSelection();
|
||
|
bool IsBoxSelecting() { return m_bBoxSelecting; }
|
||
|
|
||
|
bool CanDeselectList( void );
|
||
|
|
||
|
// list of active Structured Solids:
|
||
|
CUtlVector<CSSolid*> m_StrucSolids;
|
||
|
|
||
|
// list of selected nodes:
|
||
|
CUtlVector<MORPHHANDLE> m_SelectedHandles;
|
||
|
|
||
|
// type of selected handles:
|
||
|
SSHANDLETYPE m_SelectedType;
|
||
|
|
||
|
// main morph handle:
|
||
|
MORPHHANDLE m_MorphHandle;
|
||
|
Vector m_OrigHandlePos;
|
||
|
|
||
|
// morph bounds:
|
||
|
BoundBox m_MorphBounds;
|
||
|
|
||
|
// handle mode:
|
||
|
enum
|
||
|
{
|
||
|
hmBoth = 0x01 | 0x02,
|
||
|
hmVertex = 0x01,
|
||
|
hmEdge = 0x02
|
||
|
};
|
||
|
|
||
|
bool m_bLButtonDownControlState;
|
||
|
Vector2D m_vLastMouseMovement;
|
||
|
|
||
|
bool m_bHit;
|
||
|
|
||
|
MORPHHANDLE m_DragHandle; // The morph handle that we are dragging.
|
||
|
|
||
|
bool m_bMorphing;
|
||
|
bool m_bMovingSelected; // not moving them yet - might just select this
|
||
|
|
||
|
int m_HandleMode;
|
||
|
bool m_bBoxSelecting;
|
||
|
bool m_bScaling;
|
||
|
bool m_bUpdateOrg;
|
||
|
CScaleVerticesDlg m_ScaleDlg;
|
||
|
Vector *m_pOrigPosList;
|
||
|
Vector m_ScaleOrg;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Returns the number of solids selected for morphing.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
inline int Morph3D::GetObjectCount(void)
|
||
|
{
|
||
|
return(m_StrucSolids.Count());
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Iterates the selected solids.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
inline CSSolid *Morph3D::GetObject(int pos)
|
||
|
{
|
||
|
return(m_StrucSolids.Element(pos));
|
||
|
}
|
||
|
|
||
|
#endif // MORPH3D_H
|