csgo-2018-source/hammer/box3d.h

151 lines
3.8 KiB
C
Raw Permalink Normal View History

2021-07-25 12:11:47 +08:00
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef BOX3D_H
#define BOX3D_H
#pragma once
#include "Tool3D.h"
#include "BoundBox.h"
class CMapView2D;
class CRender3D;
//
// Formats for displaying world units.
//
enum WorldUnits_t
{
Units_None,
Units_Inches,
Units_Feet_Inches,
};
class Box3D : public Tool3D, public BoundBox
{
public:
Box3D(void);
static inline void SetWorldUnits(WorldUnits_t eWorldUnits);
static inline WorldUnits_t GetWorldUnits(void);
//
// CBaseTool implementation.
//
virtual void SetEmpty();
virtual void RenderTool2D(CRender2D *pRender);
virtual void RenderTool3D(CRender3D *pRender);
virtual void UpdateStatusBar();
protected:
enum
{
expandbox = 0x01,
thicklines = 0x04,
boundstext = 0x08,
};
enum TransformMode_t
{
modeNone = 0,
modeMove,
modeScale,
modeRotate,
modeShear,
modeLast,
};
void StartNew( CMapView *pView, const Vector2D &vPoint, const Vector &vecStart, const Vector &vecSize);
inline int GetTranslateMode() { return m_TranslateMode; }
virtual void ToggleTranslateMode(void);
void EnableHandles(bool bEnable);
void SetDrawFlags(DWORD dwFlags);
DWORD GetDrawFlags() { return m_dwDrawFlags; }
void SetDrawColors(COLORREF dwHandleColor, COLORREF dwBoxColor);
virtual void GetStatusString(char *pszBuf);
unsigned long UpdateCursor(CMapView *pView, const Vector &vHandleHit, TransformMode_t eTransformMode);
void HandleToWorld( Vector &vWorld, const Vector &vHandle, const Vector *pCustomHandleBox = NULL);
const Vector NearestCorner(const Vector2D &vPoint, CMapView *pView, const Vector *pCustomHandleBox = NULL);
int GetVisibleHandles( Vector *handles, CMapView *, int nMode );
void RenderHandles2D(CRender2D *pRender, const Vector &mins, const Vector &maxs );
void RenderHandles3D(CRender3D *pRender, const Vector &mins, const Vector &maxs);
//
// Tool3D implementation.
//
public:
virtual int HitTest(CMapView *pView, const Vector2D &ptClient, bool bTestHandles = false);
// If pCustomHandleBox is non-null, it points at an array 2 vectors (min and max), and
// it will use those bounds to figure out the corners that it will align to the grid.
virtual void StartTranslation( CMapView *pView, const Vector2D &vPoint, const Vector &vHandleOrigin, const Vector *pRefPoint = NULL, const Vector *pCustomHandleBox = NULL );
virtual bool UpdateTranslation(const Vector &vUpdate, UINT uConstraints);
virtual void FinishTranslation(bool bSave);
virtual void TranslatePoint(Vector& pt);
void TranslateBox(Vector& mins, Vector& maxs);
virtual const VMatrix& GetTransformMatrix();
protected:
void UpdateTransformMatrix();
static WorldUnits_t m_eWorldUnits;
COLORREF m_clrHandle;
COLORREF m_clrBox;
TransformMode_t m_TranslateMode; // current translation mode
Vector m_TranslateHandle; // current translation handle/corner
Vector m_vTranslationFixPoint; // fix point, meaning it remains unchanged by translation, eg rotation center etc.
VMatrix m_TransformMatrix;
bool m_bEnableHandles; // check/show handles yes/no
Vector m_LastHitTestHandle; // handle hit by last HitTest call
TransformMode_t m_LastTranslateMode; // last translate mode
bool m_bPreventOverlap;
DWORD m_dwDrawFlags;
};
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
WorldUnits_t Box3D::GetWorldUnits(void)
{
return(m_eWorldUnits);
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void Box3D::SetWorldUnits(WorldUnits_t eWorldUnits)
{
m_eWorldUnits = eWorldUnits;
}
#endif // BOX3D_H