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