diff options
Diffstat (limited to 'hammer/ToolCordon.cpp')
| -rw-r--r-- | hammer/ToolCordon.cpp | 207 |
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; +} + |