Commit 080a2eba authored by hybrid's avatar hybrid

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
parent 2ac77087
...@@ -1433,12 +1433,15 @@ namespace scene ...@@ -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 ...@@ -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
......
...@@ -2038,13 +2038,13 @@ ISceneNodeAnimatorFactory* CSceneManager::getSceneNodeAnimatorFactory(u32 index) ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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();
......
...@@ -457,10 +457,10 @@ namespace scene ...@@ -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 ...@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment