//========= 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 // memdbgon must be the last include file in a .cpp file!!! #include #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; iPrepareSelection( 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; }