Commit 901dac35 authored by bitplane's avatar bitplane

Added scene loader interface and moved the .irr loading code out to...

Added scene loader interface and moved the .irr loading code out to CSceneLoaderIrr. In future can support scene formats properly rather than loading them as meshes.



git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3566 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 6eaddbf1
Changes in 1.8 (??.??.2011) Changes in 1.8 (??.??.2011)
- Added ISceneLoader interface and .irr loader. Users can now add their own scene loaders to the scene manager and use them by calling loadScene.
- Renamed IGUIElement::bringToBack to sendToBack, like in Windows - Renamed IGUIElement::bringToBack to sendToBack, like in Windows
- Send EGET_ELEMENT_CLOSED event when context menues should be closed (thx @ Mloren for reporting). - Send EGET_ELEMENT_CLOSED event when context menues should be closed (thx @ Mloren for reporting).
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<Project filename="12.TerrainRendering/TerrainRendering.cbp" /> <Project filename="12.TerrainRendering/TerrainRendering.cbp" />
<Project filename="13.RenderToTexture/RenderToTexture.cbp" /> <Project filename="13.RenderToTexture/RenderToTexture.cbp" />
<Project filename="14.Win32Window/Win32Window.cbp" /> <Project filename="14.Win32Window/Win32Window.cbp" />
<Project filename="15.LoadIrrFile/LoadIrrFile.cbp" /> <Project filename="15.LoadIrrFile/LoadIrrFile.cbp" active="1" />
<Project filename="16.Quake3MapShader/Quake3MapShader.cbp" /> <Project filename="16.Quake3MapShader/Quake3MapShader.cbp" />
<Project filename="18.SplitScreen/SplitScreen.cbp" /> <Project filename="18.SplitScreen/SplitScreen.cbp" />
<Project filename="19.MouseAndJoystick/MouseAndJoystick.cbp" /> <Project filename="19.MouseAndJoystick/MouseAndJoystick.cbp" />
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<Project filename="21.Quake3Explorer/Quake3Explorer.cbp" /> <Project filename="21.Quake3Explorer/Quake3Explorer.cbp" />
<Project filename="22.MaterialViewer/MaterialViewer.cbp" /> <Project filename="22.MaterialViewer/MaterialViewer.cbp" />
<Project filename="Demo/demo.cbp" /> <Project filename="Demo/demo.cbp" />
<Project filename="../tools/GUIEditor/GUIEditor_gcc.cbp" active="1" /> <Project filename="../tools/GUIEditor/GUIEditor_gcc.cbp" />
<Project filename="../tools/MeshConverter/MeshConverter.cbp" /> <Project filename="../tools/MeshConverter/MeshConverter.cbp" />
<Project filename="../source/Irrlicht/Irrlicht-gcc.cbp" /> <Project filename="../source/Irrlicht/Irrlicht-gcc.cbp" />
</Workspace> </Workspace>
......
#ifndef __I_SCENE_LOADER_H_INCLUDED__
#define __I_SCENE_LOADER_H_INCLUDED__
#include "IReferenceCounted.h"
#include "path.h"
namespace irr
{
namespace io
{
class IReadFile;
} // end namespace io
namespace scene
{
class ISceneNode;
class ISceneUserDataSerializer;
//! Class which can load a scene into the scene manager.
/** If you want Irrlicht to be able to load currently unsupported
scene file formats (e.g. .vrml), then implement this and add your
new Sceneloader to the engine with ISceneManager::addExternalSceneLoader(). */
class ISceneLoader : public virtual IReferenceCounted
{
public:
//! Returns true if the class might be able to load this file.
/** This decision should be based on the file extension (e.g. ".vrml")
only.
\param fileName Name of the file to test.
\return True if the extension is a recognised type. */
virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
//! Returns true if the class might be able to load this file.
/** This decision will be based on a quick look at the contents of the file.
\param file The file to test.
\return True if the extension is a recognised type. */
virtual bool isALoadableFileType(io::IReadFile* file) const = 0;
//! Loads the scene into the scene manager.
/** \param file File which contains the scene.
\param userDataSerializer: If you want to load user data which may be attached
to some some scene nodes in the file, implement the ISceneUserDataSerializer
interface and provide it as parameter here. Otherwise, simply specify 0 as this
parameter.
\param rootNode The node to load the scene into, if none is provided then the
scene will be loaded into the root node.
\return Returns true on success, false on failure. Returns 0 if loading failed. */
virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0,
ISceneNode* rootNode=0) = 0;
};
} // end namespace scene
} // end namespace irr
#endif
...@@ -49,8 +49,6 @@ namespace video ...@@ -49,8 +49,6 @@ namespace video
namespace scene namespace scene
{ {
class IMeshWriter;
//! Enumeration for render passes. //! Enumeration for render passes.
/** A parameter passed to the registerNodeForRendering() method of the ISceneManager, /** A parameter passed to the registerNodeForRendering() method of the ISceneManager,
specifying when the node wants to be drawn in relation to the other nodes. */ specifying when the node wants to be drawn in relation to the other nodes. */
...@@ -96,33 +94,35 @@ namespace scene ...@@ -96,33 +94,35 @@ namespace scene
ESNRP_SHADOW =64 ESNRP_SHADOW =64
}; };
class IAnimatedMesh;
class IAnimatedMeshSceneNode;
class IBillboardSceneNode;
class IBillboardTextSceneNode;
class ICameraSceneNode;
class IDummyTransformationSceneNode;
class ILightManager;
class ILightSceneNode;
class IMesh; class IMesh;
class IMeshBuffer; class IMeshBuffer;
class IAnimatedMesh;
class IMeshCache; class IMeshCache;
class IMeshLoader;
class IMeshManipulator;
class IMeshSceneNode;
class IMeshWriter;
class IMetaTriangleSelector;
class IParticleSystemSceneNode;
class ISceneCollisionManager;
class ISceneLoader;
class ISceneNode; class ISceneNode;
class ICameraSceneNode;
class IAnimatedMeshSceneNode;
class ISceneNodeAnimator; class ISceneNodeAnimator;
class ISceneNodeAnimatorCollisionResponse; class ISceneNodeAnimatorCollisionResponse;
class ILightSceneNode; class ISceneNodeAnimatorFactory;
class IBillboardSceneNode; class ISceneNodeFactory;
class ISceneUserDataSerializer;
class ITerrainSceneNode; class ITerrainSceneNode;
class IMeshSceneNode;
class IMeshLoader;
class ISceneCollisionManager;
class IParticleSystemSceneNode;
class IDummyTransformationSceneNode;
class ITriangleSelector;
class IMetaTriangleSelector;
class IMeshManipulator;
class ITextSceneNode; class ITextSceneNode;
class IBillboardTextSceneNode; class ITriangleSelector;
class IVolumeLightSceneNode; class IVolumeLightSceneNode;
class ISceneNodeFactory;
class ISceneNodeAnimatorFactory;
class ISceneUserDataSerializer;
class ILightManager;
namespace quake3 namespace quake3
{ {
...@@ -1356,10 +1356,19 @@ namespace scene ...@@ -1356,10 +1356,19 @@ namespace scene
file formats it currently is not able to load (e.g. .cob), just implement file formats it currently is not able to load (e.g. .cob), just implement
the IMeshLoader interface in your loading class and add it with this method. the IMeshLoader interface in your loading class and add it with this method.
Using this method it is also possible to override built-in mesh loaders with Using this method it is also possible to override built-in mesh loaders with
newer or updated versions without the need of recompiling the engine. newer or updated versions without the need to recompile the engine.
\param externalLoader: Implementation of a new mesh loader. */ \param externalLoader: Implementation of a new mesh loader. */
virtual void addExternalMeshLoader(IMeshLoader* externalLoader) = 0; virtual void addExternalMeshLoader(IMeshLoader* externalLoader) = 0;
//! Adds an external scene loader for extending the engine with new file formats.
/** If you want the engine to be extended with
file formats it currently is not able to load (e.g. .vrml), just implement
the ISceneLoader interface in your loading class and add it with this method.
Using this method it is also possible to override the built-in scene loaders
with newer or updated versions without the need to recompile the engine.
\param externalLoader: Implementation of a new mesh loader. */
virtual void addExternalSceneLoader(ISceneLoader* externalLoader) = 0;
//! Get pointer to the scene collision manager. //! Get pointer to the scene collision manager.
/** \return Pointer to the collision manager /** \return Pointer to the collision manager
This pointer should not be dropped. See IReferenceCounted::drop() for more information. */ This pointer should not be dropped. See IReferenceCounted::drop() for more information. */
...@@ -1506,7 +1515,8 @@ namespace scene ...@@ -1506,7 +1515,8 @@ namespace scene
virtual bool saveScene(io::IWriteFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=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 loaded from an .irr file, an xml based format, but other scene formats
can be added to the engine via ISceneManager::addExternalSceneLoader. .irr files can
Be edited with the Irrlicht Engine Editor, irrEdit (http://irredit.irrlicht3d.org) or Be edited with the Irrlicht Engine Editor, irrEdit (http://irredit.irrlicht3d.org) or
saved directly by the engine using ISceneManager::saveScene(). saved directly by the engine using ISceneManager::saveScene().
\param filename: Name of the file. \param filename: Name of the file.
...@@ -1515,13 +1525,14 @@ namespace scene ...@@ -1515,13 +1525,14 @@ namespace scene
implement the ISceneUserDataSerializer interface and provide it implement the ISceneUserDataSerializer interface and provide it
as parameter here. Otherwise, simply specify 0 as this as parameter here. Otherwise, simply specify 0 as this
parameter. parameter.
\param node Node which is taken as the root node of the scene. Pass 0 to add the scene \param rootNode Node which is taken as the root node of the scene. Pass 0 to add the scene
directly to the scene manager (which is also the default). directly to the scene manager (which is also the default).
\return True if successful. */ \return True if successful. */
virtual bool loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0; virtual bool loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=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 loaded from an .irr file, an xml based format, but other scene formats
can be added to the engine via ISceneManager::addExternalSceneLoader. .irr files can
Be edited with the Irrlicht Engine Editor, irrEdit (http://irredit.irrlicht3d.org) or Be edited with the Irrlicht Engine Editor, irrEdit (http://irredit.irrlicht3d.org) or
saved directly by the engine using ISceneManager::saveScene(). saved directly by the engine using ISceneManager::saveScene().
\param file: File where the scene is going to be saved into. \param file: File where the scene is going to be saved into.
...@@ -1530,10 +1541,10 @@ namespace scene ...@@ -1530,10 +1541,10 @@ namespace scene
implement the ISceneUserDataSerializer interface and provide it implement the ISceneUserDataSerializer interface and provide it
as parameter here. Otherwise, simply specify 0 as this as parameter here. Otherwise, simply specify 0 as this
parameter. parameter.
\param node Node which is taken as the root node of the scene. Pass 0 to add the scene \param rootNode Node which is taken as the root node of the scene. Pass 0 to add the scene
directly to the scene manager (which is also the default). directly to the scene manager (which is also the default).
\return True if successful. */ \return True if successful. */
virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0) = 0; virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0) = 0;
//! Get a mesh writer implementation if available //! Get a mesh writer implementation if available
/** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop() /** Note: You need to drop() the pointer after use again, see IReferenceCounted::drop()
......
...@@ -313,6 +313,13 @@ tool <http://developer.nvidia.com/object/nvperfhud_home.html>. */ ...@@ -313,6 +313,13 @@ tool <http://developer.nvidia.com/object/nvperfhud_home.html>. */
//! Uncomment the following line if you want to ignore the deprecated warnings //! Uncomment the following line if you want to ignore the deprecated warnings
//#define IGNORE_DEPRECATED_WARNING //#define IGNORE_DEPRECATED_WARNING
//! Define _IRR_COMPILE_WITH_IRR_SCENE_LOADER_ if you want to be able to load
/** .irr scenes using ISceneManager::loadScene */
#define _IRR_COMPILE_WITH_IRR_SCENE_LOADER_
#ifdef NO_IRR_COMPILE_WITH_IRR_SCENE_LOADER_
#undef _IRR_COMPILE_WITH_IRR_SCENE_LOADER_
#endif
//! Define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ if you want to use bone based //! Define _IRR_COMPILE_WITH_SKINNED_MESH_SUPPORT_ if you want to use bone based
/** animated meshes. If you compile without this, you will be unable to load /** animated meshes. If you compile without this, you will be unable to load
B3D, MS3D or X meshes */ B3D, MS3D or X meshes */
......
#include "CSceneLoaderIrr.h"
#include "ISceneNodeAnimatorFactory.h"
#include "ISceneUserDataSerializer.h"
#include "ISceneManager.h"
#include "IVideoDriver.h"
#include "IFileSystem.h"
#include "os.h"
namespace irr
{
namespace scene
{
//! Constructor
CSceneLoaderIrr::CSceneLoaderIrr(ISceneManager *smgr, io::IFileSystem* fs)
: SceneManager(smgr), FileSystem(fs),
IRR_XML_FORMAT_SCENE(L"irr_scene"), IRR_XML_FORMAT_NODE(L"node"), IRR_XML_FORMAT_NODE_ATTR_TYPE(L"type"),
IRR_XML_FORMAT_ATTRIBUTES(L"attributes"), IRR_XML_FORMAT_MATERIALS(L"materials"),
IRR_XML_FORMAT_ANIMATORS(L"animators"), IRR_XML_FORMAT_USERDATA(L"userData")
{
}
//! Destructor
CSceneLoaderIrr::~CSceneLoaderIrr()
{
}
//! Returns true if the class might be able to load this file.
bool CSceneLoaderIrr::isALoadableFileExtension(const io::path& filename) const
{
return core::hasFileExtension(filename, "irr");
}
//! Returns true if the class might be able to load this file.
bool CSceneLoaderIrr::isALoadableFileType(io::IReadFile *file) const
{
// todo: check inside the file
return true;
}
//! Loads the scene into the scene manager.
bool CSceneLoaderIrr::loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer,
ISceneNode* rootNode)
{
if (!file)
{
os::Printer::log("Unable to open scene file", ELL_ERROR);
return false;
}
io::IXMLReader* reader = FileSystem->createXMLReader(file);
if (!reader)
{
os::Printer::log("Scene is not a valid XML file", file->getFileName().c_str(), ELL_ERROR);
return false;
}
// TODO: COLLADA_CREATE_SCENE_INSTANCES can be removed when the COLLADA loader is a scene loader
bool oldColladaSingleMesh = SceneManager->getParameters()->getAttributeAsBool(COLLADA_CREATE_SCENE_INSTANCES);
SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, false);
// read file
while (reader->read())
{
readSceneNode(reader, rootNode, userDataSerializer);
}
// restore old collada parameters
SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, oldColladaSingleMesh);
// clean up
reader->drop();
return true;
}
//! Reads the next node
void CSceneLoaderIrr::readSceneNode(io::IXMLReader* reader, ISceneNode* parent,
ISceneUserDataSerializer* userDataSerializer)
{
if (!reader)
return;
scene::ISceneNode* node = 0;
if (!parent && IRR_XML_FORMAT_SCENE==reader->getNodeName())
node = SceneManager->getRootSceneNode();
else if (parent && IRR_XML_FORMAT_NODE==reader->getNodeName())
{
// find node type and create it
core::stringc attrName = reader->getAttributeValue(IRR_XML_FORMAT_NODE_ATTR_TYPE.c_str());
node = SceneManager->addSceneNode(attrName.c_str(), parent);
if (!node)
os::Printer::log("Could not create scene node of unknown type", attrName.c_str());
}
// read attributes
while(reader->read())
{
bool endreached = false;
const wchar_t* name = reader->getNodeName();
switch (reader->getNodeType())
{
case io::EXN_ELEMENT_END:
if ((IRR_XML_FORMAT_NODE == name) ||
(IRR_XML_FORMAT_SCENE == name))
{
endreached = true;
}
break;
case io::EXN_ELEMENT:
if (IRR_XML_FORMAT_ATTRIBUTES == name)
{
// read attributes
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
attr->read(reader, true);
if (node)
node->deserializeAttributes(attr);
attr->drop();
}
else
if (IRR_XML_FORMAT_MATERIALS == name)
readMaterials(reader, node);
else
if (IRR_XML_FORMAT_ANIMATORS == name)
readAnimators(reader, node);
else
if (IRR_XML_FORMAT_USERDATA == name)
readUserData(reader, node, userDataSerializer);
else
if ((IRR_XML_FORMAT_NODE == name) ||
(IRR_XML_FORMAT_SCENE == name))
{
readSceneNode(reader, node, userDataSerializer);
}
else
{
os::Printer::log("Found unknown element in irrlicht scene file",
core::stringc(name).c_str());
}
break;
default:
break;
}
if (endreached)
break;
}
if (node && userDataSerializer)
userDataSerializer->OnCreateNode(node);
}
//! reads materials of a node
void CSceneLoaderIrr::readMaterials(io::IXMLReader* reader, ISceneNode* node)
{
u32 nr = 0;
while(reader->read())
{
const wchar_t* name = reader->getNodeName();
switch(reader->getNodeType())
{
case io::EXN_ELEMENT_END:
if (IRR_XML_FORMAT_MATERIALS == name)
return;
break;
case io::EXN_ELEMENT:
if (IRR_XML_FORMAT_ATTRIBUTES == name)
{
// read materials from attribute list
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
attr->read(reader);
if (node && node->getMaterialCount() > nr)
{
SceneManager->getVideoDriver()->fillMaterialStructureFromAttributes(
node->getMaterial(nr), attr);
}
attr->drop();
++nr;
}
break;
default:
break;
}
}
}
//! reads animators of a node
void CSceneLoaderIrr::readAnimators(io::IXMLReader* reader, ISceneNode* node)
{
while(reader->read())
{
const wchar_t* name = reader->getNodeName();
switch(reader->getNodeType())
{
case io::EXN_ELEMENT_END:
if (IRR_XML_FORMAT_ANIMATORS == name)
return;
break;
case io::EXN_ELEMENT:
if (IRR_XML_FORMAT_ATTRIBUTES == name)
{
// read animator data from attribute list
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
attr->read(reader);
if (node)
{
core::stringc typeName = attr->getAttributeAsString("Type");
ISceneNodeAnimator* anim = 0;
for (u32 i=0; i < SceneManager->getRegisteredSceneNodeAnimatorFactoryCount() && !anim; ++i)
anim = SceneManager->getSceneNodeAnimatorFactory(i)->createSceneNodeAnimator(typeName.c_str(), node);
if (anim)
{
anim->deserializeAttributes(attr);
anim->drop();
}
}
attr->drop();
}
break;
default:
break;
}
}
}
//! reads user data of a node
void CSceneLoaderIrr::readUserData(io::IXMLReader* reader, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer)
{
while(reader->read())
{
const wchar_t* name = reader->getNodeName();
switch(reader->getNodeType())
{
case io::EXN_ELEMENT_END:
if (IRR_XML_FORMAT_USERDATA == name)
return;
break;
case io::EXN_ELEMENT:
if (IRR_XML_FORMAT_ATTRIBUTES == name)
{
// read user data from attribute list
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
attr->read(reader);
if (node && userDataSerializer)
{
userDataSerializer->OnReadUserData(node, attr);
}
attr->drop();
}
break;
default:
break;
}
}
}
} // scene
} // irr
#ifndef __C_SCENE_LOADER_IRR_H_INCLUDED__
#define __C_SCENE_LOADER_IRR_H_INCLUDED__
#include "ISceneLoader.h"
#include "IXMLReader.h"
namespace irr
{
namespace io
{
class IFileSystem;
}
namespace scene
{
class ISceneManager;
//! Class which can load a scene into the scene manager.
class CSceneLoaderIrr : public virtual ISceneLoader
{
public:
//! Constructor
CSceneLoaderIrr(ISceneManager *smgr, io::IFileSystem* fs);
//! Destructor
virtual ~CSceneLoaderIrr();
//! Returns true if the class might be able to load this file.
virtual bool isALoadableFileExtension(const io::path& filename) const;
//! Returns true if the class might be able to load this file.
virtual bool isALoadableFileType(io::IReadFile *file) const;
//! Loads the scene into the scene manager.
virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0,
ISceneNode* rootNode=0);
private:
//! Recursively reads nodes from the xml file
void readSceneNode(io::IXMLReader* reader, ISceneNode* parent,
ISceneUserDataSerializer* userDataSerializer);
//! read a node's materials
void readMaterials(io::IXMLReader* reader, ISceneNode* node);
//! read a node's animators
void readAnimators(io::IXMLReader* reader, ISceneNode* node);
//! read any other data into the user serializer
void readUserData(io::IXMLReader* reader, ISceneNode* node,
ISceneUserDataSerializer* userDataSerializer);
ISceneManager *SceneManager;
io::IFileSystem *FileSystem;
//! constants for reading and writing XML.
//! Not made static due to portability problems.
// TODO: move to own header
const core::stringw IRR_XML_FORMAT_SCENE;
const core::stringw IRR_XML_FORMAT_NODE;
const core::stringw IRR_XML_FORMAT_NODE_ATTR_TYPE;
const core::stringw IRR_XML_FORMAT_ATTRIBUTES;
const core::stringw IRR_XML_FORMAT_MATERIALS;
const core::stringw IRR_XML_FORMAT_ANIMATORS;
const core::stringw IRR_XML_FORMAT_USERDATA;
};
} // end namespace scene
} // end namespace irr
#endif
...@@ -8,12 +8,13 @@ ...@@ -8,12 +8,13 @@
#include "IFileSystem.h" #include "IFileSystem.h"
#include "SAnimatedMesh.h" #include "SAnimatedMesh.h"
#include "CMeshCache.h" #include "CMeshCache.h"
#include "IWriteFile.h"
#include "IXMLWriter.h" #include "IXMLWriter.h"
#include "ISceneUserDataSerializer.h" #include "ISceneUserDataSerializer.h"
#include "IGUIEnvironment.h" #include "IGUIEnvironment.h"
#include "IMaterialRenderer.h" #include "IMaterialRenderer.h"
#include "IReadFile.h" #include "IReadFile.h"
#include "IWriteFile.h"
#include "ISceneLoader.h"
#include "os.h" #include "os.h"
...@@ -97,6 +98,10 @@ ...@@ -97,6 +98,10 @@
#include "CPLYMeshFileLoader.h" #include "CPLYMeshFileLoader.h"
#endif #endif
#ifdef _IRR_COMPILE_WITH_IRR_SCENE_LOADER_
#include "CSceneLoaderIrr.h"
#endif
#ifdef _IRR_COMPILE_WITH_COLLADA_WRITER_ #ifdef _IRR_COMPILE_WITH_COLLADA_WRITER_
#include "CColladaMeshWriter.h" #include "CColladaMeshWriter.h"
#endif #endif
...@@ -122,7 +127,6 @@ ...@@ -122,7 +127,6 @@
#include "CAnimatedMeshSceneNode.h" #include "CAnimatedMeshSceneNode.h"
#include "COctreeSceneNode.h" #include "COctreeSceneNode.h"
#include "CCameraSceneNode.h" #include "CCameraSceneNode.h"
#include "CLightSceneNode.h" #include "CLightSceneNode.h"
#include "CBillboardSceneNode.h" #include "CBillboardSceneNode.h"
#include "CMeshSceneNode.h" #include "CMeshSceneNode.h"
...@@ -134,6 +138,9 @@ ...@@ -134,6 +138,9 @@
#include "CTerrainSceneNode.h" #include "CTerrainSceneNode.h"
#include "CEmptySceneNode.h" #include "CEmptySceneNode.h"
#include "CTextSceneNode.h" #include "CTextSceneNode.h"
#include "CQuake3ShaderSceneNode.h"
#include "CVolumeLightSceneNode.h"
#include "CDefaultSceneNodeFactory.h" #include "CDefaultSceneNodeFactory.h"
#include "CSceneCollisionManager.h" #include "CSceneCollisionManager.h"
...@@ -154,8 +161,6 @@ ...@@ -154,8 +161,6 @@
#include "CSceneNodeAnimatorCameraMaya.h" #include "CSceneNodeAnimatorCameraMaya.h"
#include "CDefaultSceneNodeAnimatorFactory.h" #include "CDefaultSceneNodeAnimatorFactory.h"
#include "CQuake3ShaderSceneNode.h"
#include "CVolumeLightSceneNode.h"
#include "CGeometryCreator.h" #include "CGeometryCreator.h"
//! Enable debug features //! Enable debug features
...@@ -215,6 +220,9 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, ...@@ -215,6 +220,9 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
// add file format loaders. add the least commonly used ones first, // add file format loaders. add the least commonly used ones first,
// as these are checked last // as these are checked last
// TODO: now that we have multiple scene managers, these should be
// shallow copies from the previous manager if there is one.
#ifdef _IRR_COMPILE_WITH_STL_LOADER_ #ifdef _IRR_COMPILE_WITH_STL_LOADER_
MeshLoaderList.push_back(new CSTLMeshFileLoader()); MeshLoaderList.push_back(new CSTLMeshFileLoader());
#endif #endif
...@@ -276,6 +284,12 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs, ...@@ -276,6 +284,12 @@ CSceneManager::CSceneManager(video::IVideoDriver* driver, io::IFileSystem* fs,
MeshLoaderList.push_back(new CB3DMeshFileLoader(this)); MeshLoaderList.push_back(new CB3DMeshFileLoader(this));
#endif #endif
// scene loaders
#ifdef _IRR_COMPILE_WITH_IRR_SCENE_LOADER_
SceneLoaderList.push_back(new CSceneLoaderIrr(this, FileSystem));
#endif
// factories // factories
ISceneNodeFactory* factory = new CDefaultSceneNodeFactory(this); ISceneNodeFactory* factory = new CDefaultSceneNodeFactory(this);
registerSceneNodeFactory(factory); registerSceneNodeFactory(factory);
...@@ -296,7 +310,7 @@ CSceneManager::~CSceneManager() ...@@ -296,7 +310,7 @@ CSceneManager::~CSceneManager()
//! because Scenes may hold internally data bounded to sceneNodes //! because Scenes may hold internally data bounded to sceneNodes
//! which may be destroyed twice //! which may be destroyed twice
if (Driver) if (Driver)
Driver->removeAllHardwareBuffers (); Driver->removeAllHardwareBuffers();
if (FileSystem) if (FileSystem)
FileSystem->drop(); FileSystem->drop();
...@@ -314,10 +328,12 @@ CSceneManager::~CSceneManager() ...@@ -314,10 +328,12 @@ CSceneManager::~CSceneManager()
GUIEnvironment->drop(); GUIEnvironment->drop();
u32 i; u32 i;
for (i=0; i<MeshLoaderList.size(); ++i) for (i=0; i<MeshLoaderList.size(); ++i)
MeshLoaderList[i]->drop(); MeshLoaderList[i]->drop();
for (i=0; i<SceneLoaderList.size(); ++i)
SceneLoaderList[i]->drop();
if (ActiveCamera) if (ActiveCamera)
ActiveCamera->drop(); ActiveCamera->drop();
ActiveCamera = 0; ActiveCamera = 0;
...@@ -331,7 +347,7 @@ CSceneManager::~CSceneManager() ...@@ -331,7 +347,7 @@ CSceneManager::~CSceneManager()
for (i=0; i<SceneNodeAnimatorFactoryList.size(); ++i) for (i=0; i<SceneNodeAnimatorFactoryList.size(); ++i)
SceneNodeAnimatorFactoryList[i]->drop(); SceneNodeAnimatorFactoryList[i]->drop();
if(LightManager) if (LightManager)
LightManager->drop(); LightManager->drop();
// remove all nodes and animators before dropping the driver // remove all nodes and animators before dropping the driver
...@@ -447,8 +463,6 @@ io::IFileSystem* CSceneManager::getFileSystem() ...@@ -447,8 +463,6 @@ io::IFileSystem* CSceneManager::getFileSystem()
return FileSystem; return FileSystem;
} }
//! Adds a text scene node, which is able to display //! Adds a text scene node, which is able to display
//! 2d text at a position in three dimensional space //! 2d text at a position in three dimensional space
ITextSceneNode* CSceneManager::addTextSceneNode(gui::IGUIFont* font, ITextSceneNode* CSceneManager::addTextSceneNode(gui::IGUIFont* font,
...@@ -479,7 +493,7 @@ IBillboardTextSceneNode* CSceneManager::addBillboardTextSceneNode(gui::IGUIFont* ...@@ -479,7 +493,7 @@ IBillboardTextSceneNode* CSceneManager::addBillboardTextSceneNode(gui::IGUIFont*
if (!font && GUIEnvironment) if (!font && GUIEnvironment)
font = GUIEnvironment->getBuiltInFont(); font = GUIEnvironment->getBuiltInFont();
if(!font) if (!font)
return 0; return 0;
if (!parent) if (!parent)
...@@ -500,7 +514,7 @@ IMeshSceneNode* CSceneManager::addQuake3SceneNode(const IMeshBuffer* meshBuffer, ...@@ -500,7 +514,7 @@ IMeshSceneNode* CSceneManager::addQuake3SceneNode(const IMeshBuffer* meshBuffer,
ISceneNode* parent, s32 id ) ISceneNode* parent, s32 id )
{ {
#ifdef _IRR_COMPILE_WITH_BSP_LOADER_ #ifdef _IRR_COMPILE_WITH_BSP_LOADER_
if ( 0 == shader ) if (!shader)
return 0; return 0;
if (!parent) if (!parent)
...@@ -830,7 +844,7 @@ ITerrainSceneNode* CSceneManager::addTerrainSceneNode( ...@@ -830,7 +844,7 @@ ITerrainSceneNode* CSceneManager::addTerrainSceneNode(
{ {
io::IReadFile* file = FileSystem->createAndOpenFile(heightMapFileName); io::IReadFile* file = FileSystem->createAndOpenFile(heightMapFileName);
if(!file && !addAlsoIfHeightmapEmpty) if (!file && !addAlsoIfHeightmapEmpty)
{ {
os::Printer::log("Could not load terrain, because file could not be opened.", os::Printer::log("Could not load terrain, because file could not be opened.",
heightMapFileName, ELL_ERROR); heightMapFileName, ELL_ERROR);
...@@ -1209,15 +1223,15 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE ...@@ -1209,15 +1223,15 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
case ESNRP_CAMERA: case ESNRP_CAMERA:
{ {
taken = 1; taken = 1;
for ( u32 i = 0; i != CameraList.size(); ++i ) for (u32 i = 0; i != CameraList.size(); ++i)
{ {
if ( CameraList[i] == node ) if (CameraList[i] == node)
{ {
taken = 0; taken = 0;
break; break;
} }
} }
if ( taken ) if (taken)
{ {
CameraList.push_back(node); CameraList.push_back(node);
} }
...@@ -1280,7 +1294,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE ...@@ -1280,7 +1294,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
} }
// not transparent, register as solid // not transparent, register as solid
if ( 0 == taken ) if (!taken)
{ {
SolidNodeList.push_back(node); SolidNodeList.push_back(node);
taken = 1; taken = 1;
...@@ -1303,7 +1317,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE ...@@ -1303,7 +1317,7 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode* node, E_SCENE_NODE_RENDE
s32 index = Parameters.findAttribute ( "calls" ); s32 index = Parameters.findAttribute ( "calls" );
Parameters.setAttribute ( index, Parameters.getAttributeAsInt ( index ) + 1 ); Parameters.setAttribute ( index, Parameters.getAttributeAsInt ( index ) + 1 );
if ( 0 == taken ) if (!taken)
{ {
index = Parameters.findAttribute ( "culled" ); index = Parameters.findAttribute ( "culled" );
Parameters.setAttribute ( index, Parameters.getAttributeAsInt ( index ) + 1 ); Parameters.setAttribute ( index, Parameters.getAttributeAsInt ( index ) + 1 );
...@@ -1332,7 +1346,7 @@ void CSceneManager::drawAll() ...@@ -1332,7 +1346,7 @@ void CSceneManager::drawAll()
// reset all transforms // reset all transforms
video::IVideoDriver* driver = getVideoDriver(); video::IVideoDriver* driver = getVideoDriver();
if ( driver ) if (driver)
{ {
driver->setMaterial(video::SMaterial()); driver->setMaterial(video::SMaterial());
driver->setTransform ( video::ETS_PROJECTION, core::IdentityMatrix ); driver->setTransform ( video::ETS_PROJECTION, core::IdentityMatrix );
...@@ -1352,7 +1366,7 @@ void CSceneManager::drawAll() ...@@ -1352,7 +1366,7 @@ void CSceneManager::drawAll()
consistent Camera is needed for culling consistent Camera is needed for culling
*/ */
camWorldPos.set(0,0,0); camWorldPos.set(0,0,0);
if ( ActiveCamera ) if (ActiveCamera)
{ {
ActiveCamera->render(); ActiveCamera->render();
camWorldPos = ActiveCamera->getAbsolutePosition(); camWorldPos = ActiveCamera->getAbsolutePosition();
...@@ -1361,7 +1375,7 @@ void CSceneManager::drawAll() ...@@ -1361,7 +1375,7 @@ void CSceneManager::drawAll()
// let all nodes register themselves // let all nodes register themselves
OnRegisterSceneNode(); OnRegisterSceneNode();
if(LightManager) if (LightManager)
LightManager->OnPreRender(LightList); LightManager->OnPreRender(LightList);
//render camera scenes //render camera scenes
...@@ -1369,7 +1383,7 @@ void CSceneManager::drawAll() ...@@ -1369,7 +1383,7 @@ void CSceneManager::drawAll()
CurrentRendertime = ESNRP_CAMERA; CurrentRendertime = ESNRP_CAMERA;
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
if(LightManager) if (LightManager)
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
for (i=0; i<CameraList.size(); ++i) for (i=0; i<CameraList.size(); ++i)
...@@ -1377,7 +1391,7 @@ void CSceneManager::drawAll() ...@@ -1377,7 +1391,7 @@ void CSceneManager::drawAll()
CameraList.set_used(0); CameraList.set_used(0);
if(LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
...@@ -1386,7 +1400,7 @@ void CSceneManager::drawAll() ...@@ -1386,7 +1400,7 @@ void CSceneManager::drawAll()
CurrentRendertime = ESNRP_LIGHT; CurrentRendertime = ESNRP_LIGHT;
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
if(LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
} }
...@@ -1394,12 +1408,12 @@ void CSceneManager::drawAll() ...@@ -1394,12 +1408,12 @@ void CSceneManager::drawAll()
{ {
// Sort the lights by distance from the camera // Sort the lights by distance from the camera
core::vector3df camWorldPos(0, 0, 0); core::vector3df camWorldPos(0, 0, 0);
if(ActiveCamera) if (ActiveCamera)
camWorldPos = ActiveCamera->getAbsolutePosition(); camWorldPos = ActiveCamera->getAbsolutePosition();
core::array<DistanceNodeEntry> SortedLights; core::array<DistanceNodeEntry> SortedLights;
SortedLights.set_used(LightList.size()); SortedLights.set_used(LightList.size());
for(s32 light = (s32)LightList.size() - 1; light >= 0; --light) for (s32 light = (s32)LightList.size() - 1; light >= 0; --light)
SortedLights[light].setNodeAndDistanceFromPosition(LightList[light], camWorldPos); SortedLights[light].setNodeAndDistanceFromPosition(LightList[light], camWorldPos);
SortedLights.set_sorted(false); SortedLights.set_sorted(false);
...@@ -1415,13 +1429,13 @@ void CSceneManager::drawAll() ...@@ -1415,13 +1429,13 @@ void CSceneManager::drawAll()
u32 maxLights = LightList.size(); u32 maxLights = LightList.size();
if(!LightManager) if (!LightManager)
maxLights = core::min_ ( Driver->getMaximalDynamicLightAmount(), maxLights); maxLights = core::min_ ( Driver->getMaximalDynamicLightAmount(), maxLights);
for (i=0; i< maxLights; ++i) for (i=0; i< maxLights; ++i)
LightList[i]->render(); LightList[i]->render();
if(LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
...@@ -1430,7 +1444,7 @@ void CSceneManager::drawAll() ...@@ -1430,7 +1444,7 @@ void CSceneManager::drawAll()
CurrentRendertime = ESNRP_SKY_BOX; CurrentRendertime = ESNRP_SKY_BOX;
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
if(LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
for (i=0; i<SkyBoxList.size(); ++i) for (i=0; i<SkyBoxList.size(); ++i)
...@@ -1449,7 +1463,7 @@ void CSceneManager::drawAll() ...@@ -1449,7 +1463,7 @@ void CSceneManager::drawAll()
SkyBoxList.set_used(0); SkyBoxList.set_used(0);
if(LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
...@@ -1461,7 +1475,7 @@ void CSceneManager::drawAll() ...@@ -1461,7 +1475,7 @@ void CSceneManager::drawAll()
SolidNodeList.sort(); // sort by textures SolidNodeList.sort(); // sort by textures
if(LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
for (i=0; i<SolidNodeList.size(); ++i) for (i=0; i<SolidNodeList.size(); ++i)
...@@ -1478,10 +1492,10 @@ void CSceneManager::drawAll() ...@@ -1478,10 +1492,10 @@ void CSceneManager::drawAll()
SolidNodeList[i].Node->render(); SolidNodeList[i].Node->render();
} }
Parameters.setAttribute ( "drawn_solid", (s32) SolidNodeList.size() ); Parameters.setAttribute("drawn_solid", (s32) SolidNodeList.size() );
SolidNodeList.set_used(0); SolidNodeList.set_used(0);
if(LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
...@@ -1490,7 +1504,7 @@ void CSceneManager::drawAll() ...@@ -1490,7 +1504,7 @@ void CSceneManager::drawAll()
CurrentRendertime = ESNRP_SHADOW; CurrentRendertime = ESNRP_SHADOW;
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
if(LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
for (i=0; i<ShadowNodeList.size(); ++i) for (i=0; i<ShadowNodeList.size(); ++i)
...@@ -1513,7 +1527,7 @@ void CSceneManager::drawAll() ...@@ -1513,7 +1527,7 @@ void CSceneManager::drawAll()
ShadowNodeList.set_used(0); ShadowNodeList.set_used(0);
if(LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
...@@ -1523,7 +1537,7 @@ void CSceneManager::drawAll() ...@@ -1523,7 +1537,7 @@ void CSceneManager::drawAll()
Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0); Driver->getOverrideMaterial().Enabled = ((Driver->getOverrideMaterial().EnablePasses & CurrentRendertime) != 0);
TransparentNodeList.sort(); // sort by distance from camera TransparentNodeList.sort(); // sort by distance from camera
if(LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
...@@ -1544,7 +1558,7 @@ void CSceneManager::drawAll() ...@@ -1544,7 +1558,7 @@ void CSceneManager::drawAll()
Parameters.setAttribute ( "drawn_transparent", (s32) TransparentNodeList.size() ); Parameters.setAttribute ( "drawn_transparent", (s32) TransparentNodeList.size() );
TransparentNodeList.set_used(0); TransparentNodeList.set_used(0);
if(LightManager) if (LightManager)
LightManager->OnRenderPassPostRender(CurrentRendertime); LightManager->OnRenderPassPostRender(CurrentRendertime);
} }
...@@ -1555,7 +1569,7 @@ void CSceneManager::drawAll() ...@@ -1555,7 +1569,7 @@ void CSceneManager::drawAll()
TransparentEffectNodeList.sort(); // sort by distance from camera TransparentEffectNodeList.sort(); // sort by distance from camera
if(LightManager) if (LightManager)
{ {
LightManager->OnRenderPassPreRender(CurrentRendertime); LightManager->OnRenderPassPreRender(CurrentRendertime);
...@@ -1577,7 +1591,7 @@ void CSceneManager::drawAll() ...@@ -1577,7 +1591,7 @@ void CSceneManager::drawAll()
TransparentEffectNodeList.set_used(0); TransparentEffectNodeList.set_used(0);
} }
if(LightManager) if (LightManager)
LightManager->OnPostRender(); LightManager->OnPostRender();
LightList.set_used(0); LightList.set_used(0);
...@@ -1588,9 +1602,9 @@ void CSceneManager::drawAll() ...@@ -1588,9 +1602,9 @@ void CSceneManager::drawAll()
void CSceneManager::setLightManager(ILightManager* lightManager) void CSceneManager::setLightManager(ILightManager* lightManager)
{ {
if ( lightManager ) if (lightManager)
lightManager->grab(); lightManager->grab();
if(LightManager) if (LightManager)
LightManager->drop(); LightManager->drop();
LightManager = lightManager; LightManager = lightManager;
...@@ -1712,6 +1726,15 @@ void CSceneManager::addExternalMeshLoader(IMeshLoader* externalLoader) ...@@ -1712,6 +1726,15 @@ void CSceneManager::addExternalMeshLoader(IMeshLoader* externalLoader)
MeshLoaderList.push_back(externalLoader); MeshLoaderList.push_back(externalLoader);
} }
//! Adds an external scene loader.
void CSceneManager::addExternalSceneLoader(ISceneLoader* externalLoader)
{
if (!externalLoader)
return;
externalLoader->grab();
SceneLoaderList.push_back(externalLoader);
}
//! Returns a pointer to the scene collision manager. //! Returns a pointer to the scene collision manager.
ISceneCollisionManager* CSceneManager::getSceneCollisionManager() ISceneCollisionManager* CSceneManager::getSceneCollisionManager()
...@@ -1741,7 +1764,7 @@ ITriangleSelector* CSceneManager::createTriangleSelector(IMesh* mesh, ISceneNode ...@@ -1741,7 +1764,7 @@ ITriangleSelector* CSceneManager::createTriangleSelector(IMesh* mesh, ISceneNode
//! animated scene node //! animated scene node
ITriangleSelector* CSceneManager::createTriangleSelector(IAnimatedMeshSceneNode* node) ITriangleSelector* CSceneManager::createTriangleSelector(IAnimatedMeshSceneNode* node)
{ {
if(!node || !node->getMesh()) if (!node || !node->getMesh())
return 0; return 0;
return new CTriangleSelector(node); return new CTriangleSelector(node);
...@@ -2032,7 +2055,7 @@ u32 CSceneManager::getRegisteredSceneNodeAnimatorFactoryCount() const ...@@ -2032,7 +2055,7 @@ u32 CSceneManager::getRegisteredSceneNodeAnimatorFactoryCount() const
//! Returns a scene node animator factory by index //! Returns a scene node animator factory by index
ISceneNodeAnimatorFactory* CSceneManager::getSceneNodeAnimatorFactory(u32 index) ISceneNodeAnimatorFactory* CSceneManager::getSceneNodeAnimatorFactory(u32 index)
{ {
if (index<SceneNodeAnimatorFactoryList.size()) if (index < SceneNodeAnimatorFactoryList.size())
return SceneNodeAnimatorFactoryList[index]; return SceneNodeAnimatorFactoryList[index];
return 0; return 0;
...@@ -2081,284 +2104,60 @@ bool CSceneManager::saveScene(io::IWriteFile* file, ISceneUserDataSerializer* us ...@@ -2081,284 +2104,60 @@ bool CSceneManager::saveScene(io::IWriteFile* file, ISceneUserDataSerializer* us
} }
//! Loads a scene. Note that the current scene is not cleared before. //! Loads a scene.
//! \param filename: Name of the file . bool CSceneManager::loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer, ISceneNode* rootNode)
bool CSceneManager::loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer, ISceneNode* node)
{ {
bool ret = false; bool ret = false;
io::IReadFile* read = FileSystem->createAndOpenFile(filename);
if (!read)
{
os::Printer::log("Unable to open scene file", filename, ELL_ERROR);
}
else
{
ret = loadScene(read, userDataSerializer, node);
read->drop();
}
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
return ret;
}
io::IReadFile* file = FileSystem->createAndOpenFile(filename);
//! Loads a scene. Note that the current scene is not cleared before.
bool CSceneManager::loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer, ISceneNode* node)
{
if (!file) if (!file)
{ {
os::Printer::log("Unable to open scene file", ELL_ERROR); os::Printer::log("Unable to open scene file", filename.c_str(), ELL_ERROR);
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
return false; return false;
} }
io::IXMLReader* reader = FileSystem->createXMLReader(file); // try scene loaders in reverse order
if (!reader) s32 i = SceneLoaderList.size()-1;
{ for (; i >= 0 && !ret; --i)
os::Printer::log("Scene is not a valid XML file", file->getFileName(), ELL_ERROR); if (SceneLoaderList[i]->isALoadableFileExtension(filename))
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX; ret = SceneLoaderList[i]->loadScene(file, userDataSerializer, rootNode);
return false;
}
// for mesh loading, set collada loading attributes
bool oldColladaSingleMesh = getParameters()->getAttributeAsBool(COLLADA_CREATE_SCENE_INSTANCES);
getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, false);
// read file
while(reader->read())
{
readSceneNode(reader, node, userDataSerializer);
}
// restore old collada parameters
getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, oldColladaSingleMesh);
// finish up
reader->drop();
return true;
}
//! reads a scene node
void CSceneManager::readSceneNode(io::IXMLReader* reader, ISceneNode* parent, ISceneUserDataSerializer* userDataSerializer)
{
if (!reader)
return;
scene::ISceneNode* node = 0;
bool readAttributes=true;
if (IRR_XML_FORMAT_SCENE==reader->getNodeName())
{
// node==parent on start, which can be scene manager or distinct parent node
if (!parent)
node = this; // root
else
node = parent;
readAttributes = (node==this);
}
else if (parent && IRR_XML_FORMAT_NODE==reader->getNodeName())
{
// find node type and create it
core::stringc attrName = reader->getAttributeValue(IRR_XML_FORMAT_NODE_ATTR_TYPE.c_str());
for (s32 i=(s32)SceneNodeFactoryList.size()-1; i>=0 && !node; --i)
node = SceneNodeFactoryList[i]->addSceneNode(attrName.c_str(), parent);
if (!node)
{
os::Printer::log("Could not create scene node of unknown type", attrName.c_str());
node=addEmptySceneNode(parent);
}
}
// read attributes
while(reader->read())
{
bool endreached = false;
switch (reader->getNodeType()) if (!ret)
{ os::Printer::log("Could not load scene file, perhaps the format is unsupported: ", filename.c_str(), ELL_ERROR);
case io::EXN_ELEMENT_END:
if ((IRR_XML_FORMAT_NODE==reader->getNodeName()) ||
(IRR_XML_FORMAT_SCENE==reader->getNodeName()))
{
endreached = true;
}
break;
case io::EXN_ELEMENT:
if ((core::stringw(L"attributes")==reader->getNodeName()) && readAttributes)
{
// read attributes
io::IAttributes* attr = FileSystem->createEmptyAttributes(Driver);
attr->read(reader, true);
if (node)
node->deserializeAttributes(attr);
attr->drop(); _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
} return ret;
else
if ((core::stringw(L"materials")==reader->getNodeName()) && readAttributes)
readMaterials(reader, node);
else
if ((core::stringw(L"animators")==reader->getNodeName()) && readAttributes)
readAnimators(reader, node);
else
if ((core::stringw(L"userData")==reader->getNodeName()) && readAttributes)
readUserData(reader, node, userDataSerializer);
else
if (IRR_XML_FORMAT_NODE==reader->getNodeName())
{
readSceneNode(reader, node, userDataSerializer);
}
else
if (IRR_XML_FORMAT_SCENE==reader->getNodeName())
{
// pass on parent value
readSceneNode(reader, parent, userDataSerializer);
}
else
{
os::Printer::log("Found unknown element in irrlicht scene file",
core::stringc(reader->getNodeName()).c_str());
}
break;
default:
break;
}
if (endreached)
break;
}
if ( node && userDataSerializer )
userDataSerializer->OnCreateNode(node);
}
//! reads materials of a node
void CSceneManager::readMaterials(io::IXMLReader* reader, ISceneNode* node)
{
u32 nr = 0;
while(reader->read())
{
const wchar_t* name = reader->getNodeName();
switch(reader->getNodeType())
{
case io::EXN_ELEMENT_END:
if (core::stringw(L"materials")==name)
return;
break;
case io::EXN_ELEMENT:
if (core::stringw(L"attributes")==name)
{
// read materials from attribute list
io::IAttributes* attr = FileSystem->createEmptyAttributes(Driver);
attr->read(reader);
if (node && node->getMaterialCount() > nr)
{
getVideoDriver()->fillMaterialStructureFromAttributes(
node->getMaterial(nr), attr);
}
attr->drop();
++nr;
}
break;
default:
break;
}
}
} }
//! reads animators of a node //! Loads a scene. Note that the current scene is not cleared before.
void CSceneManager::readAnimators(io::IXMLReader* reader, ISceneNode* node) bool CSceneManager::loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer, ISceneNode* rootNode)
{ {
while(reader->read()) if (!file)
{ {
const wchar_t* name = reader->getNodeName(); os::Printer::log("Unable to open scene file", ELL_ERROR);
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
switch(reader->getNodeType()) return false;
{
case io::EXN_ELEMENT_END:
if (core::stringw(L"animators")==name)
return;
break;
case io::EXN_ELEMENT:
if (core::stringw(L"attributes")==name)
{
// read animator data from attribute list
io::IAttributes* attr = FileSystem->createEmptyAttributes(Driver);
attr->read(reader);
if (node)
{
core::stringc typeName = attr->getAttributeAsString("Type");
ISceneNodeAnimator* anim = 0;
for (int i=0; i<(int)SceneNodeAnimatorFactoryList.size() && !anim; ++i)
anim = SceneNodeAnimatorFactoryList[i]->createSceneNodeAnimator(typeName.c_str(), node);
if (anim)
{
anim->deserializeAttributes(attr);
anim->drop();
}
}
attr->drop();
}
break;
default:
break;
}
} }
}
bool ret = false;
//! reads user data of a node // try scene loaders in reverse order
void CSceneManager::readUserData(io::IXMLReader* reader, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer) s32 i = SceneLoaderList.size()-1;
{ for (; i >= 0 && !ret; --i)
while(reader->read()) if (SceneLoaderList[i]->isALoadableFileType(file))
{ ret = SceneLoaderList[i]->loadScene(file, userDataSerializer, rootNode);
const wchar_t* name = reader->getNodeName();
switch(reader->getNodeType()) if (!ret)
{ os::Printer::log("Could not load scene file, perhaps the format is unsupported: ", file->getFileName().c_str(), ELL_ERROR);
case io::EXN_ELEMENT_END:
if (core::stringw(L"userData")==name)
return;
break;
case io::EXN_ELEMENT:
if (core::stringw(L"attributes")==name)
{
// read user data from attribute list
io::IAttributes* attr = FileSystem->createEmptyAttributes(Driver);
attr->read(reader);
if (node && userDataSerializer) _IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
{ return ret;
userDataSerializer->OnReadUserData(node, attr);
}
attr->drop();
}
break;
default:
break;
}
}
} }
//! 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) const c8* currentPath, bool init)
...@@ -2447,7 +2246,7 @@ void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISc ...@@ -2447,7 +2246,7 @@ void CSceneManager::writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISc
// write possible user data // write possible user data
if ( userDataSerializer ) if (userDataSerializer)
{ {
io::IAttributes* userData = userDataSerializer->createUserData(node); io::IAttributes* userData = userDataSerializer->createUserData(node);
if (userData) if (userData)
......
...@@ -371,6 +371,9 @@ namespace scene ...@@ -371,6 +371,9 @@ namespace scene
//! Adds an external mesh loader. //! Adds an external mesh loader.
virtual void addExternalMeshLoader(IMeshLoader* externalLoader); virtual void addExternalMeshLoader(IMeshLoader* externalLoader);
//! Adds an external scene loader.
virtual void addExternalSceneLoader(ISceneLoader* externalLoader);
//! Returns a pointer to the scene collision manager. //! Returns a pointer to the scene collision manager.
virtual ISceneCollisionManager* getSceneCollisionManager(); virtual ISceneCollisionManager* getSceneCollisionManager();
...@@ -456,18 +459,16 @@ namespace scene ...@@ -456,18 +459,16 @@ namespace scene
virtual ISceneNodeAnimatorFactory* getSceneNodeAnimatorFactory(u32 index); virtual ISceneNodeAnimatorFactory* getSceneNodeAnimatorFactory(u32 index);
//! Saves the current scene into a file. //! Saves the current scene into a file.
//! \param filename: Name of the file .
virtual bool saveScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=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, ISceneNode* node=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 . virtual bool loadScene(const io::path& filename, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0);
virtual bool loadScene(const io::path& filename, 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.
virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* node=0); virtual bool loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer=0, ISceneNode* rootNode=0);
//! Writes attributes of the scene node. //! Writes attributes of the scene node.
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const; virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const;
...@@ -504,18 +505,6 @@ namespace scene ...@@ -504,18 +505,6 @@ namespace scene
//! writes a scene node //! writes a scene node
void writeSceneNode(io::IXMLWriter* writer, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer, const c8* currentPath=0, bool init=false); 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);
//! read materials
void readMaterials(io::IXMLReader* reader, ISceneNode* node);
//! reads animators of a node
void readAnimators(io::IXMLReader* reader, ISceneNode* node);
//! reads user data of a node
void readUserData(io::IXMLReader* reader, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer);
struct DefaultNodeEntry struct DefaultNodeEntry
{ {
DefaultNodeEntry(ISceneNode* n) : DefaultNodeEntry(ISceneNode* n) :
...@@ -605,6 +594,7 @@ namespace scene ...@@ -605,6 +594,7 @@ namespace scene
core::array<TransparentNodeEntry> TransparentEffectNodeList; core::array<TransparentNodeEntry> TransparentEffectNodeList;
core::array<IMeshLoader*> MeshLoaderList; core::array<IMeshLoader*> MeshLoaderList;
core::array<ISceneLoader*> SceneLoaderList;
core::array<ISceneNode*> DeletionList; core::array<ISceneNode*> DeletionList;
core::array<ISceneNodeFactory*> SceneNodeFactoryList; core::array<ISceneNodeFactory*> SceneNodeFactoryList;
core::array<ISceneNodeAnimatorFactory*> SceneNodeAnimatorFactoryList; core::array<ISceneNodeAnimatorFactory*> SceneNodeAnimatorFactoryList;
......
...@@ -527,6 +527,7 @@ ...@@ -527,6 +527,7 @@
<Unit filename="../../include/IReadFile.h" /> <Unit filename="../../include/IReadFile.h" />
<Unit filename="../../include/IReferenceCounted.h" /> <Unit filename="../../include/IReferenceCounted.h" />
<Unit filename="../../include/ISceneCollisionManager.h" /> <Unit filename="../../include/ISceneCollisionManager.h" />
<Unit filename="../../include/ISceneLoader.h" />
<Unit filename="../../include/ISceneManager.h" /> <Unit filename="../../include/ISceneManager.h" />
<Unit filename="../../include/ISceneNode.h" /> <Unit filename="../../include/ISceneNode.h" />
<Unit filename="../../include/ISceneNodeAnimator.h" /> <Unit filename="../../include/ISceneNodeAnimator.h" />
...@@ -895,6 +896,8 @@ ...@@ -895,6 +896,8 @@
<Unit filename="CSTLMeshWriter.h" /> <Unit filename="CSTLMeshWriter.h" />
<Unit filename="CSceneCollisionManager.cpp" /> <Unit filename="CSceneCollisionManager.cpp" />
<Unit filename="CSceneCollisionManager.h" /> <Unit filename="CSceneCollisionManager.h" />
<Unit filename="CSceneLoaderIrr.cpp" />
<Unit filename="CSceneLoaderIrr.h" />
<Unit filename="CSceneManager.cpp" /> <Unit filename="CSceneManager.cpp" />
<Unit filename="CSceneManager.h" /> <Unit filename="CSceneManager.h" />
<Unit filename="CSceneNodeAnimatorCameraFPS.cpp" /> <Unit filename="CSceneNodeAnimatorCameraFPS.cpp" />
......
...@@ -915,6 +915,7 @@ ...@@ -915,6 +915,7 @@
<ClInclude Include="..\..\include\IQ3Shader.h" /> <ClInclude Include="..\..\include\IQ3Shader.h" />
<ClInclude Include="..\..\include\ISceneCollisionManager.h" /> <ClInclude Include="..\..\include\ISceneCollisionManager.h" />
<ClInclude Include="..\..\include\ISceneManager.h" /> <ClInclude Include="..\..\include\ISceneManager.h" />
<ClInclude Include="..\..\include\ISceneLoader.h" />
<ClInclude Include="..\..\include\ISceneNode.h" /> <ClInclude Include="..\..\include\ISceneNode.h" />
<ClInclude Include="..\..\include\ISceneNodeAnimator.h" /> <ClInclude Include="..\..\include\ISceneNodeAnimator.h" />
<ClInclude Include="..\..\include\ISceneNodeAnimatorCameraFPS.h" /> <ClInclude Include="..\..\include\ISceneNodeAnimatorCameraFPS.h" />
...@@ -1036,6 +1037,7 @@ ...@@ -1036,6 +1037,7 @@
<ClInclude Include="CTerrainTriangleSelector.h" /> <ClInclude Include="CTerrainTriangleSelector.h" />
<ClInclude Include="CTriangleBBSelector.h" /> <ClInclude Include="CTriangleBBSelector.h" />
<ClInclude Include="CTriangleSelector.h" /> <ClInclude Include="CTriangleSelector.h" />
<ClInclude Include="CSceneLoaderIrr.h" />
<ClInclude Include="CSceneNodeAnimatorCameraFPS.h" /> <ClInclude Include="CSceneNodeAnimatorCameraFPS.h" />
<ClInclude Include="CSceneNodeAnimatorCameraMaya.h" /> <ClInclude Include="CSceneNodeAnimatorCameraMaya.h" />
<ClInclude Include="CSceneNodeAnimatorCollisionResponse.h" /> <ClInclude Include="CSceneNodeAnimatorCollisionResponse.h" />
...@@ -1278,6 +1280,7 @@ ...@@ -1278,6 +1280,7 @@
<ClCompile Include="CTerrainTriangleSelector.cpp" /> <ClCompile Include="CTerrainTriangleSelector.cpp" />
<ClCompile Include="CTriangleBBSelector.cpp" /> <ClCompile Include="CTriangleBBSelector.cpp" />
<ClCompile Include="CTriangleSelector.cpp" /> <ClCompile Include="CTriangleSelector.cpp" />
<ClInclude Include="CSceneLoaderIrr.cpp" />
<ClCompile Include="CSceneNodeAnimatorCameraFPS.cpp" /> <ClCompile Include="CSceneNodeAnimatorCameraFPS.cpp" />
<ClCompile Include="CSceneNodeAnimatorCameraMaya.cpp" /> <ClCompile Include="CSceneNodeAnimatorCameraMaya.cpp" />
<ClCompile Include="CSceneNodeAnimatorCollisionResponse.cpp" /> <ClCompile Include="CSceneNodeAnimatorCollisionResponse.cpp" />
...@@ -1520,4 +1523,4 @@ ...@@ -1520,4 +1523,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>
\ No newline at end of file
...@@ -674,6 +674,9 @@ ...@@ -674,6 +674,9 @@
<File <File
RelativePath=".\..\..\include\ISceneCollisionManager.h"> RelativePath=".\..\..\include\ISceneCollisionManager.h">
</File> </File>
<File
RelativePath=".\..\..\include\ISceneLoader.h">
</File>
<File <File
RelativePath=".\..\..\include\ISceneManager.h"> RelativePath=".\..\..\include\ISceneManager.h">
</File> </File>
...@@ -1470,6 +1473,12 @@ ...@@ -1470,6 +1473,12 @@
<File <File
RelativePath="CMeshManipulator.h"> RelativePath="CMeshManipulator.h">
</File> </File>
<File
RelativePath="CSceneLoaderIrr.cpp">
</File>
<File
RelativePath="CSceneLoaderIrr.h">
</File>
<File <File
RelativePath="CSceneManager.cpp"> RelativePath="CSceneManager.cpp">
</File> </File>
......
...@@ -945,6 +945,11 @@ ...@@ -945,6 +945,11 @@
RelativePath=".\..\..\include\ISceneManager.h" RelativePath=".\..\..\include\ISceneManager.h"
> >
</File> </File>
<File
RelativePath=".\..\..\include\ISceneLoader.h"
>
</File>
<File <File
RelativePath=".\..\..\include\ISceneNode.h" RelativePath=".\..\..\include\ISceneNode.h"
> >
...@@ -2091,11 +2096,19 @@ ...@@ -2091,11 +2096,19 @@
> >
</File> </File>
<File <File
RelativePath=".\CSceneManager.cpp" RelativePath="CSceneLoaderIrr.cpp"
>
</File>
<File
RelativePath="CSceneLoaderIrr.h"
>
</File>
<File
RelativePath="CSceneManager.cpp"
> >
</File> </File>
<File <File
RelativePath=".\CSceneManager.h" RelativePath="CSceneManager.h"
> >
</File> </File>
<Filter <Filter
......
...@@ -1108,6 +1108,10 @@ ...@@ -1108,6 +1108,10 @@
RelativePath="..\..\include\ISceneCollisionManager.h" RelativePath="..\..\include\ISceneCollisionManager.h"
> >
</File> </File>
<File
RelativePath="..\..\include\ISceneLoader.h"
>
</File>
<File <File
RelativePath="..\..\include\ISceneManager.h" RelativePath="..\..\include\ISceneManager.h"
> >
...@@ -1376,6 +1380,14 @@ ...@@ -1376,6 +1380,14 @@
RelativePath="CMeshManipulator.h" RelativePath="CMeshManipulator.h"
> >
</File> </File>
<File
RelativePath="CSceneLoaderIrr.cpp"
>
</File>
<File
RelativePath="CSceneLoaderIrr.h"
>
</File>
<File <File
RelativePath="CSceneManager.cpp" RelativePath="CSceneManager.cpp"
> >
......
...@@ -28,7 +28,7 @@ IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \ ...@@ -28,7 +28,7 @@ IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) \
CSkinnedMesh.o CBoneSceneNode.o CMeshSceneNode.o \ CSkinnedMesh.o CBoneSceneNode.o CMeshSceneNode.o \
CAnimatedMeshSceneNode.o CAnimatedMeshMD2.o CAnimatedMeshMD3.o \ CAnimatedMeshSceneNode.o CAnimatedMeshMD2.o CAnimatedMeshMD3.o \
CQ3LevelMesh.o CQuake3ShaderSceneNode.o CAnimatedMeshHalfLife.o CQ3LevelMesh.o CQuake3ShaderSceneNode.o CAnimatedMeshHalfLife.o
IRROBJ = CBillboardSceneNode.o CCameraSceneNode.o CDummyTransformationSceneNode.o CEmptySceneNode.o CGeometryCreator.o CLightSceneNode.o CMeshManipulator.o CMetaTriangleSelector.o COctreeSceneNode.o COctreeTriangleSelector.o CSceneCollisionManager.o CSceneManager.o CShadowVolumeSceneNode.o CSkyBoxSceneNode.o CSkyDomeSceneNode.o CTerrainSceneNode.o CTerrainTriangleSelector.o CVolumeLightSceneNode.o CCubeSceneNode.o CSphereSceneNode.o CTextSceneNode.o CTriangleBBSelector.o CTriangleSelector.o CWaterSurfaceSceneNode.o CMeshCache.o CDefaultSceneNodeAnimatorFactory.o CDefaultSceneNodeFactory.o IRROBJ = CBillboardSceneNode.o CCameraSceneNode.o CDummyTransformationSceneNode.o CEmptySceneNode.o CGeometryCreator.o CLightSceneNode.o CMeshManipulator.o CMetaTriangleSelector.o COctreeSceneNode.o COctreeTriangleSelector.o CSceneCollisionManager.o CSceneManager.o CShadowVolumeSceneNode.o CSkyBoxSceneNode.o CSkyDomeSceneNode.o CTerrainSceneNode.o CTerrainTriangleSelector.o CVolumeLightSceneNode.o CCubeSceneNode.o CSphereSceneNode.o CTextSceneNode.o CTriangleBBSelector.o CTriangleSelector.o CWaterSurfaceSceneNode.o CMeshCache.o CDefaultSceneNodeAnimatorFactory.o CDefaultSceneNodeFactory.o CSceneLoaderIrr.o
IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.o CParticleBoxEmitter.o CParticleCylinderEmitter.o CParticleMeshEmitter.o CParticlePointEmitter.o CParticleRingEmitter.o CParticleSphereEmitter.o CParticleAttractionAffector.o CParticleFadeOutAffector.o CParticleGravityAffector.o CParticleRotationAffector.o CParticleSystemSceneNode.o CParticleScaleAffector.o IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.o CParticleBoxEmitter.o CParticleCylinderEmitter.o CParticleMeshEmitter.o CParticlePointEmitter.o CParticleRingEmitter.o CParticleSphereEmitter.o CParticleAttractionAffector.o CParticleFadeOutAffector.o CParticleGravityAffector.o CParticleRotationAffector.o CParticleSystemSceneNode.o CParticleScaleAffector.o
IRRANIMOBJ = CSceneNodeAnimatorCameraFPS.o CSceneNodeAnimatorCameraMaya.o CSceneNodeAnimatorCollisionResponse.o CSceneNodeAnimatorDelete.o CSceneNodeAnimatorFlyCircle.o CSceneNodeAnimatorFlyStraight.o CSceneNodeAnimatorFollowSpline.o CSceneNodeAnimatorRotation.o CSceneNodeAnimatorTexture.o IRRANIMOBJ = CSceneNodeAnimatorCameraFPS.o CSceneNodeAnimatorCameraMaya.o CSceneNodeAnimatorCollisionResponse.o CSceneNodeAnimatorDelete.o CSceneNodeAnimatorFlyCircle.o CSceneNodeAnimatorFlyStraight.o CSceneNodeAnimatorFollowSpline.o CSceneNodeAnimatorRotation.o CSceneNodeAnimatorTexture.o
IRRDRVROBJ = CNullDriver.o COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D8Driver.o CD3D8NormalMapRenderer.o CD3D8ParallaxMapRenderer.o CD3D8ShaderMaterialRenderer.o CD3D8Texture.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o IRRDRVROBJ = CNullDriver.o COpenGLDriver.o COpenGLNormalMapRenderer.o COpenGLParallaxMapRenderer.o COpenGLShaderMaterialRenderer.o COpenGLTexture.o COpenGLSLMaterialRenderer.o COpenGLExtensionHandler.o CD3D8Driver.o CD3D8NormalMapRenderer.o CD3D8ParallaxMapRenderer.o CD3D8ShaderMaterialRenderer.o CD3D8Texture.o CD3D9Driver.o CD3D9HLSLMaterialRenderer.o CD3D9NormalMapRenderer.o CD3D9ParallaxMapRenderer.o CD3D9ShaderMaterialRenderer.o CD3D9Texture.o
......
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