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

189 lines
4.8 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001.
// -------------------------------------------------------------------------
// File name: vegetationbrush.cpp
// Version: v1.00
// Created: 20/2/2002 by Timur.
// Compilers: Visual C++.NET
// Description: Vegetation Brush Implementation.
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "Heightmap.h"
#include "VegetationBrush.h"
#include "VegetationMap.h"
//////////////////////////////////////////////////////////////////////////
CVegetationBrush::CVegetationBrush()
{
m_elevationMin = 0;
m_elevationMax = 0;
m_slopeMin = 0;
m_slopeMax = 100;
m_density = 10;
m_bSelected = false;
m_bHidden = false;
}
CVegetationBrush::~CVegetationBrush()
{
}
void CVegetationBrush::Serialize( XmlNodeRef &node,bool bLoading )
{
if (bLoading)
{
// Loading.
node->getAttr( "Name",m_name );
node->getAttr( "ElevationnMin",m_elevationMin );
node->getAttr( "ElevationnMax",m_elevationMax );
node->getAttr( "SlopeMin",m_slopeMin );
node->getAttr( "SlopeMax",m_slopeMax );
node->getAttr( "Density",m_density );
CVegetationMap *vegetationMap = GetIEditor()->GetHeightmap()->GetVegetationMap();
assert( vegetationMap != 0 );
m_objects.clear();
XmlNodeRef objectsNode = node->findChild("Objects");
if (objectsNode)
{
for (int i = 0; i < objectsNode->getChildCount(); i++)
{
CVegetationObject *obj = vegetationMap->CreateObject();
if (!obj)
continue;
obj->Serialize( objectsNode->getChild(i),bLoading );
obj->SetElevation( m_elevationMin,m_elevationMax );
obj->SetSlope( m_slopeMin,m_slopeMax );
obj->SetCategory( m_name );
//m_objects.push_back(obj);
}
}
}
else
{
/*
// Saving.
node->setAttr( "Name",m_name );
node->setAttr( "ElevationnMin",m_elevationMin );
node->setAttr( "ElevationnMax",m_elevationMax );
node->setAttr( "SlopeMin",m_slopeMin );
node->setAttr( "SlopeMax",m_slopeMax );
node->setAttr( "Density",m_density );
XmlNodeRef objectsNode = node->newChild("Objects");
for (int i = 0; i < GetObjectCount(); i++)
{
XmlNodeRef objNode = objectsNode->newChild("Object");
GetObject(i)->Serialize( objNode,bLoading );
}
*/
}
}
//////////////////////////////////////////////////////////////////////////
void CVegetationBrush::AddObject( CVegetationObject *obj )
{
m_objects.push_back( obj );
}
//////////////////////////////////////////////////////////////////////////
void CVegetationBrush::RemoveObject( CVegetationObject *obj )
{
m_objects.erase( std::find(m_objects.begin(),m_objects.end(),obj) );
}
//////////////////////////////////////////////////////////////////////////
void CVegetationBrush::CopyFrom( CVegetationBrush *brush )
{
m_name = brush->m_name;
m_elevationMin = brush->m_elevationMin;
m_elevationMax = brush->m_elevationMax;
m_slopeMin = brush->m_slopeMin;
m_slopeMax = brush->m_slopeMax;
m_density = brush->m_density;
}
/*
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//! Undo object for Vegetation brush.
class CUndoVegetationBrush : public IUndoObject
{
public:
CUndoVegetationBrush( XmlNodeRef &node,const CString &undoValue )
{
assert( node != 0 );
m_node = node;
m_undoValue = undoValue;
}
protected:
virtual void Release() { delete this; };
virtual int GetSize() { return sizeof(*this); };
virtual const char* GetDescription() { return "Brush Modify"; };
virtual void Undo( bool bUndo )
{
if (bUndo)
{
m_node->getAttr( VALUE_ATTR,m_redoValue );
}
//OverrideNode( m_node,m_undo );
m_node->setAttr( VALUE_ATTR,m_undoValue );
if (m_sCurrentPropertyWindow)
m_sCurrentPropertyWindow->ReloadValues();
}
virtual void Redo()
{
m_node->setAttr( VALUE_ATTR,m_redoValue );
if (m_sCurrentPropertyWindow)
m_sCurrentPropertyWindow->ReloadValues();
}
//! Recursivelly override target Xml Node attributes with values from source Xml node.
void OverrideNode( XmlNodeRef &trg,const XmlNodeRef &src )
{
trg->setAttributes( src->getAttributes() );
for (int i = 0; i < trg->getChildCount(); i++)
{
if (i < src->getChildCount())
{
OverrideNode( trg->getChild(i),src->getChild(i) );
}
}
}
private:
TSmartPtr<CVegetationBrush> brush;
XmlNodeRef m_undo;
XmlNodeRef m_redo;
};
*/
//////////////////////////////////////////////////////////////////////////
void CVegetationBrush::SetHidden( bool bHidden )
{
m_bHidden = bHidden;
for (int i = 0; i < GetObjectCount(); i++)
{
CVegetationObject *obj = GetObject(i);
obj->SetInUse( !bHidden );
}
}