summaryrefslogtreecommitdiff
path: root/hammer/mapview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/mapview.cpp')
-rw-r--r--hammer/mapview.cpp203
1 files changed, 203 insertions, 0 deletions
diff --git a/hammer/mapview.cpp b/hammer/mapview.cpp
new file mode 100644
index 0000000..dc29913
--- /dev/null
+++ b/hammer/mapview.cpp
@@ -0,0 +1,203 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Default implementation for interface common to 2D and 3D views.
+//
+// $Workfile: $
+// $Date: $
+//
+//-----------------------------------------------------------------------------
+// $Log: $
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "stdafx.h"
+#include "MapDoc.h"
+#include "MapView.h"
+#include "History.h"
+#include "mapsolid.h"
+#include "camera.h"
+
+#define MMNOMIXER
+#include <mmsystem.h>
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+
+#pragma warning(disable:4244 4305)
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor, sets to inactive.
+//-----------------------------------------------------------------------------
+CMapView::CMapView(void)
+{
+ m_bActive = false;
+ m_bUpdateView = false;
+ m_eDrawType = VIEW_INVALID;
+ m_pCamera = NULL;
+ m_dwTimeLastRender = 0;
+ m_nRenderedFrames = 0;
+ m_pToolManager = NULL;
+}
+
+bool CMapView::IsOrthographic()
+{
+ return m_pCamera->IsOrthographic();
+}
+
+void CMapView::UpdateView( int nFlags )
+{
+ m_bUpdateView = true;
+
+ if ( nFlags & MAPVIEW_RENDER_NOW )
+ {
+ RenderView();
+ }
+}
+
+
+
+void CMapView::ActivateView(bool bActivate)
+{
+ if ( bActivate != m_bActive )
+ {
+ m_bActive = bActivate;
+ m_bUpdateView = true;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Recalculates framerate since the last call to this function and
+// determines whether or not we are exceeding the framerate limit.
+// Output : Returns true if we are beyond the framerate limit, false if not.
+//-----------------------------------------------------------------------------
+bool CMapView::ShouldRender()
+{
+ DWORD dwTimeNow = timeGetTime();
+
+ if (m_dwTimeLastRender != 0)
+ {
+ DWORD dwTimeElapsed = dwTimeNow - m_dwTimeLastRender;
+
+ if ( dwTimeElapsed <= 0 )
+ return false;
+
+ float flFrameRate = (1000.0f / dwTimeElapsed);
+
+ if (flFrameRate > 100.0f)
+ {
+ // never update view faster then 100Hz
+ return false;
+ }
+ }
+
+ // update view if needed
+ if ( m_bUpdateView )
+ {
+ m_dwTimeLastRender = dwTimeNow;
+ m_nRenderedFrames++;
+ return true;
+ }
+
+ return false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : point - Point in client coordinates.
+// bMakeFirst -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CMapView::SelectAt(const Vector2D &ptClient, bool bMakeFirst, bool bFace)
+{
+ CMapDoc *pDoc = GetMapDoc();
+ CSelection *pSelection = pDoc->GetSelection();
+ const CMapObjectList *pSelList = pSelection->GetList();
+
+ pSelection->ClearHitList();
+
+ GetHistory()->MarkUndoPosition(pSelList, "Selection");
+
+ //
+ // Check all the objects in the world for a hit at this point.
+ //
+
+ HitInfo_t HitData[MAX_PICK_HITS];
+ int nHits = ObjectsAt(ptClient, HitData, MAX_PICK_HITS);
+
+ //
+ // If there were no hits at the given point, clear selection.
+ //
+ if ( nHits == 0 )
+ {
+ if (bMakeFirst)
+ {
+ pDoc->SelectFace(NULL, 0, scClear|scSaveChanges );
+ pDoc->SelectObject(NULL, scClear|scSaveChanges );
+ }
+
+ return false;
+ }
+
+ SelectMode_t eSelectMode = pSelection->GetMode();
+
+ for ( int i=0; i<nHits; i++ )
+ {
+ if ( HitData[i].pObject )
+ {
+ CMapClass *pSelObject = HitData[i].pObject->PrepareSelection( eSelectMode );
+ if (pSelObject)
+ {
+ pSelection->AddHit(pSelObject);
+ }
+ }
+ }
+
+ //
+ // If we're selecting faces, mark all faces on the first solid we hit.
+ //
+ if ( bFace )
+ {
+ const CMapObjectList *pList = pSelection->GetHitList();
+ FOR_EACH_OBJ( *pList, pos )
+ {
+ CMapClass *pObject = pList->Element(pos);
+ if (pObject->IsMapClass(MAPCLASS_TYPE(CMapSolid)))
+ {
+ pDoc->SelectFace((CMapSolid*)pObject, -1, scSelect | (bMakeFirst ? scClear : 0));
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ //
+ // Select a single object.
+ //
+ if ( bMakeFirst )
+ {
+ pDoc->SelectFace(NULL, 0, scClear|scSaveChanges);
+ pDoc->SelectObject(NULL, scClear|scSaveChanges);
+ }
+
+ pSelection->SetCurrentHit(hitFirst);
+
+ return true;
+}
+
+void CMapView::BuildRay( const Vector2D &vView, Vector& vStart, Vector& vEnd )
+{
+ m_pCamera->BuildRay( vView, vStart, vEnd );
+}
+
+const Vector &CMapView::GetViewAxis()
+{
+ static Vector vForward;
+ m_pCamera->GetViewForward(vForward);
+ return vForward;
+}
+
+