//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "stdafx.h" #include "GlobalFunctions.h" #include "History.h" #include "MapDoc.h" #include "MapDecal.h" #include "MapSolid.h" #include "MapView3D.h" #include "resource.h" #include "ToolManager.h" #include "ToolDecal.h" // memdbgon must be the last include file in a .cpp file!!! #include //----------------------------------------------------------------------------- // Purpose: Handles key down events in the 2D view. // Input : Per CWnd::OnKeyDown. // Output : Returns true on success, false on failure. //----------------------------------------------------------------------------- bool CToolDecal::OnKeyDown2D(CMapView2D *pView, UINT nChar, UINT nRepCnt, UINT nFlags) { switch (nChar) { case VK_ESCAPE: { ToolManager()->SetTool(TOOL_POINTER); return true; } } return false; } //----------------------------------------------------------------------------- // 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 CToolDecal::OnMouseMove2D(CMapView2D *pView, UINT nFlags, const Vector2D &vPoint) { SetDecalCursor(); return true; } //----------------------------------------------------------------------------- // Purpose: Handles key down events in the 3D view. // Input : Per CWnd::OnKeyDown. // Output : Returns true if the message was handled, false if not. //----------------------------------------------------------------------------- bool CToolDecal::OnKeyDown3D(CMapView3D *pView, UINT nChar, UINT nRepCnt, UINT nFlags) { switch (nChar) { case VK_ESCAPE: { ToolManager()->SetTool(TOOL_POINTER); } } return false; } //----------------------------------------------------------------------------- // Purpose: Handles left button down events in the 3D view. // Input : Per CWnd::OnLButtonDown. // Output : Returns true if the message was handled, false if not. //----------------------------------------------------------------------------- bool CToolDecal::OnLMouseDown3D(CMapView3D *pView, UINT nFlags, const Vector2D &vPoint) { // // See if they clicked on a brush face. If so, apply a decal where they clicked. // CMapDoc *pDoc = pView->GetMapDoc(); ULONG ulFace; CMapClass *pObject; if ((pObject = pView->NearestObjectAt( vPoint, ulFace)) != NULL) { CMapSolid *pSolid = dynamic_cast (pObject); if (pSolid == NULL) { return true; } // // Build a ray to trace against the face that they clicked on to // find the point of intersection. // Vector Start,End; pView->GetCamera()->BuildRay( vPoint, Start, End); Vector HitPos, HitNormal; CMapFace *pFace = pSolid->GetFace(ulFace); if (pFace->TraceLine(HitPos, HitNormal, Start, End)) { GetHistory()->MarkUndoPosition(NULL, "Create decal"); CMapEntity *pEntity = new CMapEntity; pEntity->SetKeyValue("texture", GetDefaultTextureName()); pEntity->SetPlaceholder(TRUE); pEntity->SetOrigin(HitPos); pEntity->SetClass("infodecal"); CMapWorld *pWorld = pDoc->GetMapWorld(); CMapDecal *pDecal = pEntity->GetChildOfType((CMapDecal *)NULL); if (pDecal != NULL) { pDecal->DecalAllSolids(pWorld); } pEntity->CalcBounds(TRUE); pDoc->AddObjectToWorld(pEntity); GetHistory()->KeepNew(pEntity); pDoc->SetModifiedFlag(); } } return true; } //----------------------------------------------------------------------------- // Purpose: Handles mouse move events in the 3D view. // Input : Per CWnd::OnMouseMove. // Output : Returns true if the message was handled, false if not. //----------------------------------------------------------------------------- bool CToolDecal::OnMouseMove3D(CMapView3D *pView, UINT nFlags, const Vector2D &vPoint) { SetDecalCursor(); return true; } //----------------------------------------------------------------------------- // Purpose: Sets the cursor to the decal application cursor. //----------------------------------------------------------------------------- void CToolDecal::SetDecalCursor(void) { static HCURSOR hcurDecal; if (!hcurDecal) { hcurDecal = LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_DECAL)); } SetCursor(hcurDecal); }