diff options
Diffstat (limited to 'hammer/box3d.h')
| -rw-r--r-- | hammer/box3d.h | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/hammer/box3d.h b/hammer/box3d.h new file mode 100644 index 0000000..09d9646 --- /dev/null +++ b/hammer/box3d.h @@ -0,0 +1,150 @@ +//========= Copyright 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 |