summaryrefslogtreecommitdiff
path: root/hammer/box3d.h
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/box3d.h')
-rw-r--r--hammer/box3d.h150
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