123
This commit is contained in:
214
Editor/Objects/ObjectLayer.cpp
Normal file
214
Editor/Objects/ObjectLayer.cpp
Normal file
@@ -0,0 +1,214 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Crytek Engine Source File.
|
||||
// Copyright (C), Crytek Studios, 2001.
|
||||
// -------------------------------------------------------------------------
|
||||
// File name: objectlayer.cpp
|
||||
// Version: v1.00
|
||||
// Created: 9/4/2002 by Timur.
|
||||
// Compilers: Visual C++ 7.0
|
||||
// Description:
|
||||
// -------------------------------------------------------------------------
|
||||
// History:
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "ObjectLayer.h"
|
||||
|
||||
#include "ObjectManager.h"
|
||||
#include "ObjectLayerManager.h"
|
||||
|
||||
#define LAYER_ID(x) ((x)>>16)
|
||||
#define OBJECT_ID(x) ((x)&0xFFFF)
|
||||
#define MAKE_ID(layerId,objectId) (((layerId)<<16)|(objectId))
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CObjectLayer::CObjectLayer( CObjectLayerManager *pLayerManager )
|
||||
{
|
||||
assert( pLayerManager != 0 );
|
||||
m_pLayerManager = pLayerManager;
|
||||
m_pObjectManager = pLayerManager->GetObjectManager();
|
||||
m_hidden = false;
|
||||
m_frozen = false;
|
||||
m_removable = true;
|
||||
m_parent = NULL;
|
||||
m_external = false;
|
||||
m_exportable = true;
|
||||
m_expanded = false;
|
||||
ZeroStruct(m_parentGUID);
|
||||
|
||||
CoCreateGuid( &m_guid );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::Serialize( XmlNodeRef &node,bool bLoading )
|
||||
{
|
||||
if (bLoading)
|
||||
{
|
||||
bool bHidden = m_hidden;
|
||||
bool bFrozen = m_frozen;
|
||||
bool bExternal = false;
|
||||
// Loading.
|
||||
node->getAttr( "Name",m_name );
|
||||
node->getAttr( "GUID",m_guid );
|
||||
node->getAttr( "Hidden",bHidden );
|
||||
node->getAttr( "Frozen",bFrozen );
|
||||
node->getAttr( "External",bExternal );
|
||||
node->getAttr( "Exportable",m_exportable );
|
||||
|
||||
ZeroStruct(m_parentGUID);
|
||||
node->getAttr( "ParentGUID",m_parentGUID );
|
||||
|
||||
SetExternal( bExternal );
|
||||
SetVisible( !bHidden );
|
||||
SetFrozen( bFrozen );
|
||||
m_pObjectManager->InvalidateVisibleList();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Saving.
|
||||
node->setAttr( "Name",m_name );
|
||||
node->setAttr( "GUID",m_guid );
|
||||
node->setAttr( "Hidden",m_hidden );
|
||||
node->setAttr( "Frozen",m_frozen );
|
||||
node->setAttr( "External",m_external );
|
||||
node->setAttr( "Exportable",m_exportable );
|
||||
|
||||
GUID parentGUID = m_parentGUID;
|
||||
if (m_parent == m_pLayerManager->GetMainLayer())
|
||||
ZeroStruct(parentGUID);
|
||||
if (!GuidUtil::IsEmpty(parentGUID))
|
||||
node->setAttr( "ParentGUID",parentGUID );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::SetName( const CString &name )
|
||||
{
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::AddChild( CObjectLayer *pLayer )
|
||||
{
|
||||
assert( pLayer );
|
||||
if (IsChildOf(pLayer))
|
||||
return;
|
||||
if (pLayer->GetParent())
|
||||
pLayer->GetParent()->RemoveChild(pLayer);
|
||||
stl::push_back_unique( m_childLayers,pLayer );
|
||||
pLayer->m_parent = this;
|
||||
pLayer->m_parentGUID = GetGUID();
|
||||
m_pObjectManager->InvalidateVisibleList();
|
||||
|
||||
// Notify layer manager on layer modification.
|
||||
m_pLayerManager->NotifyLayerChange(this);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::RemoveChild( CObjectLayer *pLayer )
|
||||
{
|
||||
assert( pLayer );
|
||||
pLayer->m_parent = 0;
|
||||
ZeroStruct(pLayer->m_parentGUID);
|
||||
stl::find_and_erase( m_childLayers,pLayer );
|
||||
m_pObjectManager->InvalidateVisibleList();
|
||||
|
||||
// Notify layer manager on layer modification.
|
||||
m_pLayerManager->NotifyLayerChange(this);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CObjectLayer* CObjectLayer::GetChild( int index ) const
|
||||
{
|
||||
assert( index >= 0 && index < m_childLayers.size() );
|
||||
return m_childLayers[index];
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CObjectLayer* CObjectLayer::FindChildLayer( REFGUID guid )
|
||||
{
|
||||
if (m_guid == guid)
|
||||
return this;
|
||||
|
||||
for (int i = 0; i < GetChildCount(); i++)
|
||||
{
|
||||
CObjectLayer *pLayer = GetChild(i)->FindChildLayer(guid);
|
||||
if (pLayer)
|
||||
return pLayer;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CObjectLayer::IsChildOf( CObjectLayer *pParent )
|
||||
{
|
||||
if (m_parent == pParent)
|
||||
return true;
|
||||
if (m_parent)
|
||||
{
|
||||
return m_parent->IsChildOf(pParent);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::SetVisible( bool b,bool bRecursive )
|
||||
{
|
||||
bool bChange = m_hidden != !b;
|
||||
m_hidden = !b;
|
||||
|
||||
if (bChange)
|
||||
{
|
||||
// Notify layer manager on layer modification.
|
||||
m_pLayerManager->NotifyLayerChange(this);
|
||||
m_pObjectManager->InvalidateVisibleList();
|
||||
}
|
||||
if (bRecursive)
|
||||
{
|
||||
for (int i = 0; i < GetChildCount(); i++)
|
||||
{
|
||||
GetChild(i)->SetVisible( b,bRecursive );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::SetFrozen( bool b,bool bRecursive )
|
||||
{
|
||||
bool bChange = m_frozen != b;
|
||||
m_frozen = b;
|
||||
|
||||
if (bChange)
|
||||
{
|
||||
// Notify layer manager on layer modification.
|
||||
m_pLayerManager->NotifyLayerChange(this);
|
||||
m_pObjectManager->InvalidateVisibleList();
|
||||
}
|
||||
if (bRecursive)
|
||||
{
|
||||
for (int i = 0; i < GetChildCount(); i++)
|
||||
{
|
||||
GetChild(i)->SetFrozen( b,bRecursive );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CObjectLayer::Expand( bool bExpand )
|
||||
{
|
||||
m_expanded = bExpand;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
bool CObjectLayer::IsParentExternal() const
|
||||
{
|
||||
if (m_parent)
|
||||
{
|
||||
if (m_parent->IsExternal())
|
||||
return true;
|
||||
return m_parent->IsParentExternal();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user