Files
FC1/Editor/PickObjectTool.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

152 lines
3.7 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001.
// -------------------------------------------------------------------------
// File name: PickObjectTool.cpp
// Version: v1.00
// Created: 18/12/2001 by Timur.
// Compilers: Visual C++ 6.0
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "PickObjectTool.h"
#include "Viewport.h"
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CPickObjectTool,CEditTool)
//////////////////////////////////////////////////////////////////////////
CPickObjectTool::CPickObjectTool( IPickObjectCallback *callback,CRuntimeClass *targetClass )
{
assert( callback != 0 );
m_callback = callback;
m_targetClass = targetClass;
m_bMultiPick = false;
}
//////////////////////////////////////////////////////////////////////////
CPickObjectTool::~CPickObjectTool()
{
GetIEditor()->GetObjectManager()->SetSelectCallback( 0 );
//m_prevSelectCallback = 0;
if (m_callback)
m_callback->OnCancelPick();
}
//////////////////////////////////////////////////////////////////////////
void CPickObjectTool::BeginEditParams( IEditor *ie,int flags )
{
CString str = "Pick object";
if (m_targetClass)
{
str.Format( "Pick %s object",m_targetClass->m_lpszClassName );
}
SetStatusText( str );
//m_prevSelectCallback =
GetIEditor()->GetObjectManager()->SetSelectCallback( this );
}
//////////////////////////////////////////////////////////////////////////
bool CPickObjectTool::MouseCallback( CViewport *view,EMouseEvent event,CPoint &point,int flags )
{
if (event == eMouseLDown)
{
Vec3d src,dir;
view->ViewToWorldRay( point,src,dir );
dir = GetNormalized(dir);
ObjectHitInfo hitInfo(view,point);
GetIEditor()->GetObjectManager()->HitTest( src,dir,0,hitInfo );
CBaseObject *obj = hitInfo.object;
if (obj)
{
if (IsRelevant(obj))
{
if (m_callback)
{
// Can pick this one.
m_callback->OnPick( obj );
}
if (!m_bMultiPick)
{
m_callback = 0;
GetIEditor()->SetEditTool(0);
}
}
}
}
else if (event == eMouseMove)
{
Vec3d src,dir;
view->ViewToWorldRay( point,src,dir );
dir = GetNormalized(dir);
ObjectHitInfo hitInfo(view,point);
GetIEditor()->GetObjectManager()->HitTest( src,dir,0,hitInfo );
CBaseObject *obj = hitInfo.object;
if (obj)
{
if (IsRelevant(obj))
{
// Set Cursors.
view->SetObjectCursor(obj);
}
}
}
return true;
}
//////////////////////////////////////////////////////////////////////////
bool CPickObjectTool::OnSelectObject( CBaseObject *obj )
{
if (IsRelevant(obj))
{
// Can pick this one.
if (m_callback)
{
m_callback->OnPick( obj );
m_callback = 0;
}
if (!m_bMultiPick)
{
GetIEditor()->SetEditTool(0);
}
}
return false;
}
//////////////////////////////////////////////////////////////////////////
bool CPickObjectTool::OnKeyDown( CViewport *view,uint nChar,uint nRepCnt,uint nFlags )
{
if (nChar == VK_ESCAPE)
{
// Cancel selection.
GetIEditor()->SetEditTool(0);
}
return false;
}
//////////////////////////////////////////////////////////////////////////
bool CPickObjectTool::IsRelevant( CBaseObject *obj )
{
assert( obj != 0 );
if (!m_callback)
return false;
if (!m_targetClass)
{
return m_callback->OnPickFilter(obj);
}
else
{
if (obj->GetRuntimeClass() == m_targetClass || obj->GetRuntimeClass()->IsDerivedFrom(m_targetClass))
{
return m_callback->OnPickFilter(obj);
}
}
return false;
}