This commit is contained in:
romkazvo
2023-08-07 19:29:24 +08:00
commit 34d6c5d489
4832 changed files with 1389451 additions and 0 deletions

168
Editor/TerrainMoveTool.cpp Normal file
View 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 );
}