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-e03cc46cb475master
parent
2ac770878b
commit
080a2ebab3
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue