Add support for saving only part of the scene into a .irr file.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3531 dfc29bdd-3216-0410-991c-e03cc46cb475
master
hybrid 2011-01-03 14:38:51 +00:00
parent 2ac770878b
commit 080a2ebab3
3 changed files with 35 additions and 16 deletions

View File

@ -1433,12 +1433,15 @@ namespace scene
The scene is usually written to an .irr file, an xml based format. .irr files can
Be edited with the Irrlicht Engine Editor, irrEdit (http://irredit.irrlicht3d.org).
To load .irr files again, see ISceneManager::loadScene().
\param filename: Name of the file.
\param userDataSerializer: If you want to save some user data for every scene node into the
\param filename Name of the file.
\param userDataSerializer If you want to save some user data for every scene node into the
file, implement the ISceneUserDataSerializer interface and provide it as parameter here.
Otherwise, simply specify 0 as this parameter.
\param node Node which is taken as the top node of the scene. This node and all of its
descendants are saved into the scene file. Pass 0 or the scene manager to save the full
scene (which is also the default).
\return True if successful. */
virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0) = 0;
virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
//! Saves the current scene into a file.
/** Scene nodes with the option isDebugObject set to true are not being saved.
@ -1449,8 +1452,11 @@ namespace scene
\param userDataSerializer: If you want to save some user data for every scene node into the
file, implement the ISceneUserDataSerializer interface and provide it as parameter here.
Otherwise, simply specify 0 as this parameter.
\param node Node which is taken as the top node of the scene. This node and all of its
descendants are saved into the scene file. Pass 0 or the scene manager to save the full
scene (which is also the default).
\return True if successful. */
virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0) = 0;
virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0;
//! Loads a scene. Note that the current scene is not cleared before.
/** The scene is usually load from an .irr file, an xml based format. .irr files can

View File

@ -2038,13 +2038,13 @@ ISceneNodeAnimatorFactory* CSceneManager::getSceneNodeAnimatorFactory(u32 index)
//! Saves the current scene into a file.
//! \param filename: Name of the file .
bool CSceneManager::saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer)
bool CSceneManager::saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer, ISceneNode* node)
{
bool ret = false;
io::IWriteFile* file = FileSystem->createAndWriteFile(filename);
if (file)
{
ret = saveScene(file, userDataSerializer);
ret = saveScene(file, userDataSerializer, node);
file->drop();
}
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
@ -2053,7 +2053,7 @@ bool CSceneManager::saveScene(const io::path& filename, ISceneUserDataSerializer
//! Saves the current scene into a file.
bool CSceneManager::saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer)
bool CSceneManager::saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer, ISceneNode* node)
{
if (!file)
{
@ -2067,9 +2067,11 @@ bool CSceneManager::saveScene(io::IWriteFile* file, ISceneUserDataSerializer* us
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
return false;
}
if (!node)
node=this;
writer->writeXMLHeader();
writeSceneNode(writer, this, userDataSerializer);
writeSceneNode(writer, node, userDataSerializer, FileSystem->getFileDir(FileSystem->getAbsolutePath(file->getFileName())).c_str(), true);
writer->drop();
return true;
@ -2339,17 +2341,20 @@ void CSceneManager::readUserData(io::IXMLReader* reader, ISceneNode* node, IScen
//! writes a scene node
void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer)
void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer,
const c8* currentPath, bool init)
{
if (!writer || !node || node->isDebugObject())
return;
const wchar_t* name;
ISceneNode* tmpNode=node;
if (node == this)
if (init)
{
name = IRR_XML_FORMAT_SCENE.c_str();
writer->writeElement(name, false);
node=this;
}
else
{
@ -2358,13 +2363,18 @@ void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISc
core::stringw(getSceneNodeTypeName(node->getType())).c_str());
}
writer->writeLineBreak();
writer->writeLineBreak();
// write properties
io::IAttributes* attr = FileSystem->createEmptyAttributes(Driver);
node->serializeAttributes(attr);
io::SAttributeReadWriteOptions options;
if (currentPath)
{
options.Filename=currentPath;
options.Flags|=io::EARWF_USE_RELATIVE_PATHS;
}
node->serializeAttributes(attr, &options);
if (attr->getAttributeCount() != 0)
{
@ -2438,12 +2448,15 @@ void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISc
userData->drop();
}
}
// reset to actual root node
if (init)
node=tmpNode;
// write children
ISceneNodeList::ConstIterator it = node->getChildren().begin();
for (; it != node->getChildren().end(); ++it)
writeSceneNode(writer, (*it), userDataSerializer);
writeSceneNode(writer, (*it), userDataSerializer, currentPath);
attr->drop();

View File

@ -457,10 +457,10 @@ namespace scene
//! Saves the current scene into a file.
//! \param filename: Name of the file .
virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0);
virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0);
//! Saves the current scene into a file.
virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0);
virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0);
//! Loads a scene. Note that the current scene is not cleared before.
//! \param filename: Name of the file .
@ -502,7 +502,7 @@ namespace scene
void clearDeletionList();
//! writes a scene node
void writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer);
void writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer, const c8* currentPath=0, bool init=false);
//! reads a scene node
void readSceneNode(io::IXMLReader* reader, ISceneNode* parent, ISceneUserDataSerializer* userDataSerializer);