1
#include "CSceneLoaderIrr.h"
2
#include "ISceneNodeAnimatorFactory.h"
3
#include "ISceneUserDataSerializer.h"
4
#include "ISceneManager.h"
5
#include "IVideoDriver.h"
6
#include "IFileSystem.h"
15
CSceneLoaderIrr::CSceneLoaderIrr(ISceneManager *smgr, io::IFileSystem* fs)
16
: SceneManager(smgr), FileSystem(fs),
17
IRR_XML_FORMAT_SCENE(L"irr_scene"), IRR_XML_FORMAT_NODE(L"node"), IRR_XML_FORMAT_NODE_ATTR_TYPE(L"type"),
18
IRR_XML_FORMAT_ATTRIBUTES(L"attributes"), IRR_XML_FORMAT_MATERIALS(L"materials"),
19
IRR_XML_FORMAT_ANIMATORS(L"animators"), IRR_XML_FORMAT_USERDATA(L"userData")
25
CSceneLoaderIrr::~CSceneLoaderIrr()
30
//! Returns true if the class might be able to load this file.
31
bool CSceneLoaderIrr::isALoadableFileExtension(const io::path& filename) const
33
return core::hasFileExtension(filename, "irr");
36
//! Returns true if the class might be able to load this file.
37
bool CSceneLoaderIrr::isALoadableFileFormat(io::IReadFile *file) const
39
// todo: check inside the file
43
//! Loads the scene into the scene manager.
44
bool CSceneLoaderIrr::loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer,
49
os::Printer::log("Unable to open scene file", ELL_ERROR);
53
io::IXMLReader* reader = FileSystem->createXMLReader(file);
56
os::Printer::log("Scene is not a valid XML file", file->getFileName().c_str(), ELL_ERROR);
60
// TODO: COLLADA_CREATE_SCENE_INSTANCES can be removed when the COLLADA loader is a scene loader
61
bool oldColladaSingleMesh = SceneManager->getParameters()->getAttributeAsBool(COLLADA_CREATE_SCENE_INSTANCES);
62
SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, false);
65
while (reader->read())
67
readSceneNode(reader, rootNode, userDataSerializer);
70
// restore old collada parameters
71
SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, oldColladaSingleMesh);
79
//! Reads the next node
80
void CSceneLoaderIrr::readSceneNode(io::IXMLReader* reader, ISceneNode* parent,
81
ISceneUserDataSerializer* userDataSerializer)
86
scene::ISceneNode* node = 0;
88
if (!parent && IRR_XML_FORMAT_SCENE==reader->getNodeName())
89
node = SceneManager->getRootSceneNode();
90
else if (parent && IRR_XML_FORMAT_NODE==reader->getNodeName())
92
// find node type and create it
93
core::stringc attrName = reader->getAttributeValue(IRR_XML_FORMAT_NODE_ATTR_TYPE.c_str());
95
node = SceneManager->addSceneNode(attrName.c_str(), parent);
98
os::Printer::log("Could not create scene node of unknown type", attrName.c_str());
104
while(reader->read())
106
bool endreached = false;
108
const wchar_t* name = reader->getNodeName();
110
switch (reader->getNodeType())
112
case io::EXN_ELEMENT_END:
113
if ((IRR_XML_FORMAT_NODE == name) ||
114
(IRR_XML_FORMAT_SCENE == name))
119
case io::EXN_ELEMENT:
120
if (IRR_XML_FORMAT_ATTRIBUTES == name)
123
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
124
attr->read(reader, true);
127
node->deserializeAttributes(attr);
132
if (IRR_XML_FORMAT_MATERIALS == name)
133
readMaterials(reader, node);
135
if (IRR_XML_FORMAT_ANIMATORS == name)
136
readAnimators(reader, node);
138
if (IRR_XML_FORMAT_USERDATA == name)
139
readUserData(reader, node, userDataSerializer);
141
if ((IRR_XML_FORMAT_NODE == name) ||
142
(IRR_XML_FORMAT_SCENE == name))
144
readSceneNode(reader, node, userDataSerializer);
148
os::Printer::log("Found unknown element in irrlicht scene file",
149
core::stringc(name).c_str());
159
if (node && userDataSerializer)
160
userDataSerializer->OnCreateNode(node);
163
//! reads materials of a node
164
void CSceneLoaderIrr::readMaterials(io::IXMLReader* reader, ISceneNode* node)
168
while(reader->read())
170
const wchar_t* name = reader->getNodeName();
172
switch(reader->getNodeType())
174
case io::EXN_ELEMENT_END:
175
if (IRR_XML_FORMAT_MATERIALS == name)
178
case io::EXN_ELEMENT:
179
if (IRR_XML_FORMAT_ATTRIBUTES == name)
181
// read materials from attribute list
182
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
185
if (node && node->getMaterialCount() > nr)
187
SceneManager->getVideoDriver()->fillMaterialStructureFromAttributes(
188
node->getMaterial(nr), attr);
202
//! reads animators of a node
203
void CSceneLoaderIrr::readAnimators(io::IXMLReader* reader, ISceneNode* node)
205
while(reader->read())
207
const wchar_t* name = reader->getNodeName();
209
switch(reader->getNodeType())
211
case io::EXN_ELEMENT_END:
212
if (IRR_XML_FORMAT_ANIMATORS == name)
215
case io::EXN_ELEMENT:
216
if (IRR_XML_FORMAT_ATTRIBUTES == name)
218
// read animator data from attribute list
219
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
224
core::stringc typeName = attr->getAttributeAsString("Type");
225
ISceneNodeAnimator* anim = SceneManager->createSceneNodeAnimator(typeName.c_str(), node);
229
anim->deserializeAttributes(attr);
244
//! reads user data of a node
245
void CSceneLoaderIrr::readUserData(io::IXMLReader* reader, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer)
247
while(reader->read())
249
const wchar_t* name = reader->getNodeName();
251
switch(reader->getNodeType())
253
case io::EXN_ELEMENT_END:
254
if (IRR_XML_FORMAT_USERDATA == name)
257
case io::EXN_ELEMENT:
258
if (IRR_XML_FORMAT_ATTRIBUTES == name)
260
// read user data from attribute list
261
io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver());
264
if (node && userDataSerializer)
266
userDataSerializer->OnReadUserData(node, attr);