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:
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
|
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
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user