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
This commit is contained in:
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 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). Be edited with the Irrlicht Engine Editor, irrEdit (http://irredit.irrlicht3d.org).
To load .irr files again, see ISceneManager::loadScene(). To load .irr files again, see ISceneManager::loadScene().
\param filename: Name of the file. \param filename Name of the file.
\param userDataSerializer: If you want to save some user data for every scene node into the \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. file, implement the ISceneUserDataSerializer interface and provide it as parameter here.
Otherwise, simply specify 0 as this parameter. 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. */ \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. //! Saves the current scene into a file.
/** Scene nodes with the option isDebugObject set to true are not being saved. /** 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 \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. file, implement the ISceneUserDataSerializer interface and provide it as parameter here.
Otherwise, simply specify 0 as this parameter. 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. */ \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. //! 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 /** 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. //! Saves the current scene into a file.
//! \param filename: Name of the 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; bool ret = false;
io::IWriteFile* file = FileSystem->createAndWriteFile(filename); io::IWriteFile* file = FileSystem->createAndWriteFile(filename);
if (file) if (file)
{ {
ret = saveScene(file, userDataSerializer); ret = saveScene(file, userDataSerializer, node);
file->drop(); file->drop();
} }
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
@ -2053,7 +2053,7 @@ bool CSceneManager::saveScene(const io::path& filename, ISceneUserDataSerializer
//! Saves the current scene into a file. //! 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) if (!file)
{ {
@ -2067,9 +2067,11 @@ bool CSceneManager::saveScene(io::IWriteFile* file, ISceneUserDataSerializer* us
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
return false; return false;
} }
if (!node)
node=this;
writer->writeXMLHeader(); writer->writeXMLHeader();
writeSceneNode(writer, this, userDataSerializer); writeSceneNode(writer, node, userDataSerializer, FileSystem->getFileDir(FileSystem->getAbsolutePath(file->getFileName())).c_str(), true);
writer->drop(); writer->drop();
return true; return true;
@ -2339,17 +2341,20 @@ void CSceneManager::readUserData(io::IXMLReader* reader, ISceneNode* node, IScen
//! writes a scene node //! 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()) if (!writer || !node || node->isDebugObject())
return; return;
const wchar_t* name; const wchar_t* name;
ISceneNode* tmpNode=node;
if (node == this) if (init)
{ {
name = IRR_XML_FORMAT_SCENE.c_str(); name = IRR_XML_FORMAT_SCENE.c_str();
writer->writeElement(name, false); writer->writeElement(name, false);
node=this;
} }
else else
{ {
@ -2358,13 +2363,18 @@ void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISc
core::stringw(getSceneNodeTypeName(node->getType())).c_str()); core::stringw(getSceneNodeTypeName(node->getType())).c_str());
} }
writer->writeLineBreak();
writer->writeLineBreak(); writer->writeLineBreak();
// write properties // write properties
io::IAttributes* attr = FileSystem->createEmptyAttributes(Driver); 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) if (attr->getAttributeCount() != 0)
{ {
@ -2438,12 +2448,15 @@ void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISc
userData->drop(); userData->drop();
} }
} }
// reset to actual root node
if (init)
node=tmpNode;
// write children // write children
ISceneNodeList::ConstIterator it = node->getChildren().begin(); ISceneNodeList::ConstIterator it = node->getChildren().begin();
for (; it != node->getChildren().end(); ++it) for (; it != node->getChildren().end(); ++it)
writeSceneNode(writer, (*it), userDataSerializer); writeSceneNode(writer, (*it), userDataSerializer, currentPath);
attr->drop(); attr->drop();

View File

@ -457,10 +457,10 @@ namespace scene
//! Saves the current scene into a file. //! Saves the current scene into a file.
//! \param filename: Name of the 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. //! 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. //! Loads a scene. Note that the current scene is not cleared before.
//! \param filename: Name of the file . //! \param filename: Name of the file .
@ -502,7 +502,7 @@ namespace scene
void clearDeletionList(); void clearDeletionList();
//! writes a scene node //! 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 //! reads a scene node
void readSceneNode(io::IXMLReader* reader, ISceneNode* parent, ISceneUserDataSerializer* userDataSerializer); void readSceneNode(io::IXMLReader* reader, ISceneNode* parent, ISceneUserDataSerializer* userDataSerializer);