123
This commit is contained in:
168
Editor/TerrainMoveTool.cpp
Normal file
168
Editor/TerrainMoveTool.cpp
Normal file
@@ -0,0 +1,168 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Crytek Engine Source File.
|
||||
// Copyright (C), Crytek Studios, 2001.
|
||||
// -------------------------------------------------------------------------
|
||||
// File name: TerrainMoveTool.cpp
|
||||
// Version: v1.00
|
||||
// Created: 11/1/2002 by Timur.
|
||||
// Compilers: Visual C++ 6.0
|
||||
// Description: Terrain Modification Tool implementation.
|
||||
// -------------------------------------------------------------------------
|
||||
// History:
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "TerrainMoveTool.h"
|
||||
#include "Viewport.h"
|
||||
#include "Heightmap.h"
|
||||
#include "Objects\ObjectManager.h"
|
||||
|
||||
#include "I3DEngine.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
IMPLEMENT_DYNCREATE(CTerrainMoveTool,CEditTool)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CTerrainMoveTool::CTerrainMoveTool()
|
||||
{
|
||||
m_pointerPos(0,0,0);
|
||||
m_archive = 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CTerrainMoveTool::~CTerrainMoveTool()
|
||||
{
|
||||
m_pointerPos(0,0,0);
|
||||
if (m_archive)
|
||||
delete m_archive;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CTerrainMoveTool::BeginEditParams( IEditor *ie,int flags )
|
||||
{
|
||||
m_ie = ie;
|
||||
|
||||
if (!m_archive)
|
||||
{
|
||||
m_archive = new CXmlArchive("Root");
|
||||
// Save area to archive.
|
||||
BBox srcBox;
|
||||
GetIEditor()->GetSelectedRegion( srcBox );
|
||||
|
||||
// Move terrain heightmap block.
|
||||
CPoint hmapSrcMin,hmapSrcMax;
|
||||
hmapSrcMin = GetIEditor()->GetHeightmap()->WorldToHmap(srcBox.min);
|
||||
hmapSrcMax = GetIEditor()->GetHeightmap()->WorldToHmap(srcBox.max);
|
||||
m_srcRect.SetRect( hmapSrcMin,hmapSrcMax );
|
||||
|
||||
GetIEditor()->GetHeightmap()->ExportBlock( m_srcRect,*m_archive );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CTerrainMoveTool::EndEditParams()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CTerrainMoveTool::MouseCallback( CViewport *view,EMouseEvent event,CPoint &point,int flags )
|
||||
{
|
||||
m_pointerPos = view->ViewToWorld( point,0,true );
|
||||
|
||||
BBox box;
|
||||
GetIEditor()->GetSelectedRegion(box);
|
||||
|
||||
if (event == eMouseLDown)
|
||||
{
|
||||
// Move terrain area.
|
||||
Move();
|
||||
// Close tool.
|
||||
GetIEditor()->SetEditTool(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CTerrainMoveTool::Display( DisplayContext &dc )
|
||||
{
|
||||
BBox box;
|
||||
GetIEditor()->GetSelectedRegion(box);
|
||||
|
||||
Vec3 p1 = GetIEditor()->GetHeightmap()->HmapToWorld( CPoint(m_srcRect.left,m_srcRect.top) );
|
||||
Vec3 p2 = GetIEditor()->GetHeightmap()->HmapToWorld( CPoint(m_srcRect.right,m_srcRect.bottom) );
|
||||
|
||||
Vec3 ofs = m_pointerPos - p1;
|
||||
p1 += ofs;
|
||||
p2 += ofs;
|
||||
|
||||
dc.SetColor( RGB(0,0,255) );
|
||||
dc.DrawTerrainRect( p1.x,p1.y,p2.x,p2.y,0.2f );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CTerrainMoveTool::OnKeyDown( CViewport *view,uint nChar,uint nRepCnt,uint nFlags )
|
||||
{
|
||||
bool bProcessed = false;
|
||||
return bProcessed;
|
||||
}
|
||||
|
||||
bool CTerrainMoveTool::OnKeyUp( CViewport *view,uint nChar,uint nRepCnt,uint nFlags )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CTerrainMoveTool::Move()
|
||||
{
|
||||
// Move terrain area.
|
||||
CUndo undo( "Copy Area" );
|
||||
CWaitCursor wait;
|
||||
|
||||
CHeightmap *pHeightamp = GetIEditor()->GetHeightmap();
|
||||
assert( pHeightamp );
|
||||
|
||||
// Switch archive to loading.
|
||||
m_archive->bLoading = true;
|
||||
|
||||
// Move terrain heightmap block.
|
||||
CPoint hmapPos;
|
||||
hmapPos = pHeightamp->WorldToHmap(m_pointerPos);
|
||||
|
||||
CPoint offset = pHeightamp->ImportBlock( *m_archive,hmapPos );
|
||||
Vec3 moveOffset = pHeightamp->HmapToWorld(offset);
|
||||
|
||||
// Load selection from archive.
|
||||
XmlNodeRef objRoot = m_archive->root->findChild("Objects");
|
||||
if (objRoot)
|
||||
{
|
||||
GetIEditor()->ClearSelection();
|
||||
CObjectArchive ar( GetIEditor()->GetObjectManager(),objRoot,true );
|
||||
GetIEditor()->GetObjectManager()->LoadObjects( ar,false );
|
||||
}
|
||||
|
||||
// Move all objects.
|
||||
GetIEditor()->GetSelection()->Move( moveOffset,false,true );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CTerrainMoveTool::SetArchive( CXmlArchive *ar )
|
||||
{
|
||||
if (m_archive)
|
||||
delete m_archive;
|
||||
m_archive = ar;
|
||||
|
||||
int x1,y1,x2,y2;
|
||||
// Load rect size our of archive.
|
||||
m_archive->root->getAttr( "X1",x1 );
|
||||
m_archive->root->getAttr( "Y1",y1 );
|
||||
m_archive->root->getAttr( "X2",x2 );
|
||||
m_archive->root->getAttr( "Y2",y2 );
|
||||
|
||||
m_srcRect.SetRect( x1,y1,x2,y2 );
|
||||
}
|
||||
Reference in New Issue
Block a user