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.
164 lines
4.4 KiB
164 lines
4.4 KiB
5 years ago
|
//========= 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);
|
||
|
}
|
||
|
|