You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.4 KiB
163 lines
4.4 KiB
//========= Copyright 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 <tier0/memdbgon.h> |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// 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 <CMapSolid *> (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); |
|
} |
|
|
|
|