123
This commit is contained in:
132
Editor/Prefabs/PrefabItem.cpp
Normal file
132
Editor/Prefabs/PrefabItem.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Crytek Engine Source File.
|
||||
// Copyright (C), Crytek Studios, 2001-2004.
|
||||
// -------------------------------------------------------------------------
|
||||
// File name: PrefabItem.cpp
|
||||
// Version: v1.00
|
||||
// Created: 10/11/2003 by Timur.
|
||||
// Compilers: Visual Studio.NET 2003
|
||||
// Description:
|
||||
// -------------------------------------------------------------------------
|
||||
// History:
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "StdAfx.h"
|
||||
#include "PrefabItem.h"
|
||||
|
||||
#include "PrefabLibrary.h"
|
||||
#include "BaseLibraryManager.h"
|
||||
|
||||
#include "Settings.h"
|
||||
#include "Grid.h"
|
||||
|
||||
#include "Objects\ObjectManager.h"
|
||||
#include "Objects\PrefabObject.h"
|
||||
#include "Objects\SelectionGroup.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CPrefabItem::CPrefabItem()
|
||||
{
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
CPrefabItem::~CPrefabItem()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabItem::Serialize( SerializeContext &ctx )
|
||||
{
|
||||
CBaseLibraryItem::Serialize( ctx );
|
||||
XmlNodeRef node = ctx.node;
|
||||
if (ctx.bLoading)
|
||||
{
|
||||
XmlNodeRef objects = node->findChild( "Objects" );
|
||||
if (objects)
|
||||
{
|
||||
m_objectsNode = objects;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_objectsNode)
|
||||
node->addChild( m_objectsNode );
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabItem::Update()
|
||||
{
|
||||
// Mark library as modified.
|
||||
GetLibrary()->SetModified();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void CPrefabItem::MakeFromSelection( CSelectionGroup &fromSelection )
|
||||
{
|
||||
IObjectManager *pObjMan = GetIEditor()->GetObjectManager();
|
||||
CSelectionGroup selection;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Clone selected objects, without changes thier names.
|
||||
bool bPrevGenUniqNames = pObjMan->EnableUniqObjectNames( false );
|
||||
fromSelection.Clone( selection );
|
||||
pObjMan->EnableUniqObjectNames( bPrevGenUniqNames );
|
||||
|
||||
// Snap center to grid.
|
||||
Vec3 vCenter = gSettings.pGrid->Snap( selection.GetBounds().min );
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Transform all objects in selection into local space of prefab.
|
||||
Matrix44 invParentTM;
|
||||
invParentTM.SetIdentity();
|
||||
invParentTM.SetTranslationOLD( vCenter );
|
||||
invParentTM.Invert44();
|
||||
|
||||
int i;
|
||||
for (i = 0; i < selection.GetCount(); i++)
|
||||
{
|
||||
CBaseObject *pObj = selection.GetObject(i);
|
||||
Matrix44 localTM = pObj->GetWorldTM() * invParentTM;
|
||||
pObj->SetLocalTM( localTM );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Save all objects in flat selection to XML.
|
||||
CSelectionGroup flatSelection;
|
||||
selection.FlattenHierarchy( flatSelection );
|
||||
|
||||
m_objectsNode = new CXmlNode("Objects");
|
||||
CObjectArchive ar( pObjMan,m_objectsNode,false );
|
||||
for (i = 0; i < flatSelection.GetCount(); i++)
|
||||
{
|
||||
ar.SaveObject( flatSelection.GetObject(i) );
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Delete all objects in cloned flat selection.
|
||||
for (i = 0; i < flatSelection.GetCount(); i++)
|
||||
{
|
||||
pObjMan->DeleteObject( flatSelection.GetObject(i) );
|
||||
}
|
||||
|
||||
CUndo undo( "Make Prefab" );
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Create prefab object.
|
||||
CBaseObject *pObj = pObjMan->NewObject( PREFAB_OBJECT_CLASS_NAME );
|
||||
if (pObj && pObj->IsKindOf(RUNTIME_CLASS(CPrefabObject)))
|
||||
{
|
||||
CPrefabObject *pPrefabObj = (CPrefabObject*)pObj;
|
||||
|
||||
pPrefabObj->SetUniqName( GetName() );
|
||||
pPrefabObj->SetPos( vCenter );
|
||||
pPrefabObj->SetPrefab( this,false );
|
||||
}
|
||||
else if (pObj)
|
||||
pObjMan->DeleteObject( pObj );
|
||||
|
||||
GetLibrary()->SetModified();
|
||||
}
|
||||
Reference in New Issue
Block a user