summaryrefslogtreecommitdiff
path: root/hammer/ToolCordon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/ToolCordon.cpp')
-rw-r--r--hammer/ToolCordon.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/hammer/ToolCordon.cpp b/hammer/ToolCordon.cpp
new file mode 100644
index 0000000..81e366e
--- /dev/null
+++ b/hammer/ToolCordon.cpp
@@ -0,0 +1,207 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Implements the cordon tool. The cordon tool defines a rectangular
+// volume that acts as a visibility filter. Only objects that intersect
+// the cordon are rendered in the views. When saving the MAP file while
+// the cordon tool is active, only brushes that intersect the cordon
+// bounds are saved. The cordon box is replaced by brushes in order to
+// seal the map.
+//
+//=============================================================================//
+
+#include "stdafx.h"
+#include "ChunkFile.h"
+#include "ToolCordon.h"
+#include "History.h"
+#include "GlobalFunctions.h"
+#include "MainFrm.h"
+#include "MapDoc.h"
+#include "MapDefs.h"
+#include "MapSolid.h"
+#include "MapView2D.h"
+#include "MapView3D.h"
+#include "MapWorld.h"
+#include "StatusBarIDs.h"
+#include "ToolManager.h"
+#include "Options.h"
+#include "WorldSize.h"
+#include "vgui/Cursor.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor.
+//-----------------------------------------------------------------------------
+Cordon3D::Cordon3D(void)
+{
+ SetDrawColors(RGB(0, 255, 255), RGB(255, 0, 0));
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Called when the tool is activated.
+// Input : eOldTool - The ID of the previously active tool.
+//-----------------------------------------------------------------------------
+void Cordon3D::OnActivate()
+{
+ if (!IsActiveTool())
+ {
+ Vector mins,maxs;
+ m_pDocument->GetCordon( mins, maxs );
+ SetBounds( mins,maxs );
+
+ m_bEmpty = !IsValidBox();
+ EnableHandles( true );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles left mouse button down events in the 2D view.
+// Input : Per CWnd::OnLButtonDown.
+// Output : Returns true if the message was handled, false if not.
+//-----------------------------------------------------------------------------
+bool Cordon3D::OnLMouseDown2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint)
+{
+ Tool3D::OnLMouseDown2D(pView, nFlags, vPoint);
+
+ Vector vecWorld;
+ pView->ClientToWorld(vecWorld, vPoint);
+
+ unsigned int uConstraints = GetConstraints( nFlags );
+
+ if ( HitTest(pView, vPoint, true) )
+ {
+ StartTranslation( pView, vPoint, m_LastHitTestHandle );
+ }
+ else
+ {
+ // getvisiblepoint fills in any coord that's still set to COORD_NOTINIT:
+ vecWorld[pView->axThird] = COORD_NOTINIT;
+ m_pDocument->GetBestVisiblePoint(vecWorld);
+
+ // snap starting position to grid
+ if ( uConstraints & constrainSnap )
+ m_pDocument->Snap(vecWorld,uConstraints);
+
+ StartNew( pView, vPoint, vecWorld, Vector(0,0,0) );
+ }
+
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles left mouse button up events in the 2D view.
+// Input : Per CWnd::OnLButtonUp.
+// Output : Returns true if the message was handled, false if not.
+//-----------------------------------------------------------------------------
+bool Cordon3D::OnLMouseUp2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint)
+{
+ Tool3D::OnLMouseUp2D(pView, nFlags, vPoint) ;
+
+ if ( IsTranslating() )
+ {
+ FinishTranslation( true );
+ m_pDocument->SetCordon( bmins, bmaxs );
+ }
+
+ m_pDocument->UpdateStatusbar();
+
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles mouse move events in the 2D view.
+// Input : Per CWnd::OnMouseMove.
+// Output : Returns true if the message was handled, false if not.
+//-----------------------------------------------------------------------------
+bool Cordon3D::OnMouseMove2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint)
+{
+ vgui::HCursor hCursor = vgui::dc_arrow;
+
+ Tool3D::OnMouseMove2D(pView, nFlags, vPoint) ;
+
+ unsigned int uConstraints = GetConstraints( nFlags );
+
+ // Convert to world coords.
+ Vector vecWorld;
+ pView->ClientToWorld(vecWorld, vPoint);
+
+ // Update status bar position display.
+ //
+ char szBuf[128];
+
+ m_pDocument->Snap(vecWorld,uConstraints);
+
+ sprintf(szBuf, " @%.0f, %.0f ", vecWorld[pView->axHorz], vecWorld[pView->axVert]);
+ SetStatusText(SBI_COORDS, szBuf);
+
+ if ( IsTranslating() )
+ {
+ // cursor is cross here
+ Tool3D::UpdateTranslation( pView, vPoint, uConstraints );
+
+ hCursor = vgui::dc_none;
+ }
+ else if ( HitTest(pView, vPoint, true) )
+ {
+ hCursor = UpdateCursor( pView, m_LastHitTestHandle, m_TranslateMode );
+ }
+
+ if ( hCursor != vgui::dc_none )
+ pView->SetCursor( hCursor );
+
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles the escape key in the 2D or 3D views.
+//-----------------------------------------------------------------------------
+void Cordon3D::OnEscape(void)
+{
+ if ( IsTranslating() )
+ {
+ FinishTranslation( false );
+ }
+ else
+ {
+ m_pDocument->GetTools()->SetTool(TOOL_POINTER);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output :
+//-----------------------------------------------------------------------------
+bool Cordon3D::OnKeyDown2D(CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+ if (nChar == VK_ESCAPE)
+ {
+ OnEscape();
+ return true;
+ }
+
+ return false;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output :
+//-----------------------------------------------------------------------------
+bool Cordon3D::OnKeyDown3D(CMapView3D *pView, UINT nChar, UINT nRepCnt, UINT nFlags)
+{
+ if (nChar == VK_ESCAPE)
+ {
+ OnEscape();
+ return true;
+ }
+
+ return false;
+}
+