diff options
Diffstat (limited to 'libraries/irrlicht-1.8/source/Irrlicht/CSceneLoaderIrr.cpp')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/CSceneLoaderIrr.cpp | 568 |
1 files changed, 284 insertions, 284 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CSceneLoaderIrr.cpp b/libraries/irrlicht-1.8/source/Irrlicht/CSceneLoaderIrr.cpp index 7705436..c274c16 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/CSceneLoaderIrr.cpp +++ b/libraries/irrlicht-1.8/source/Irrlicht/CSceneLoaderIrr.cpp | |||
@@ -1,284 +1,284 @@ | |||
1 | // Copyright (C) 2010-2012 Nikolaus Gebhardt | 1 | // Copyright (C) 2010-2012 Nikolaus Gebhardt |
2 | // This file is part of the "Irrlicht Engine". | 2 | // This file is part of the "Irrlicht Engine". |
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h |
4 | 4 | ||
5 | #include "CSceneLoaderIrr.h" | 5 | #include "CSceneLoaderIrr.h" |
6 | #include "ISceneNodeAnimatorFactory.h" | 6 | #include "ISceneNodeAnimatorFactory.h" |
7 | #include "ISceneUserDataSerializer.h" | 7 | #include "ISceneUserDataSerializer.h" |
8 | #include "ISceneManager.h" | 8 | #include "ISceneManager.h" |
9 | #include "IVideoDriver.h" | 9 | #include "IVideoDriver.h" |
10 | #include "IFileSystem.h" | 10 | #include "IFileSystem.h" |
11 | #include "os.h" | 11 | #include "os.h" |
12 | 12 | ||
13 | namespace irr | 13 | namespace irr |
14 | { | 14 | { |
15 | namespace scene | 15 | namespace scene |
16 | { | 16 | { |
17 | 17 | ||
18 | //! Constructor | 18 | //! Constructor |
19 | CSceneLoaderIrr::CSceneLoaderIrr(ISceneManager *smgr, io::IFileSystem* fs) | 19 | CSceneLoaderIrr::CSceneLoaderIrr(ISceneManager *smgr, io::IFileSystem* fs) |
20 | : SceneManager(smgr), FileSystem(fs), | 20 | : SceneManager(smgr), FileSystem(fs), |
21 | IRR_XML_FORMAT_SCENE(L"irr_scene"), IRR_XML_FORMAT_NODE(L"node"), IRR_XML_FORMAT_NODE_ATTR_TYPE(L"type"), | 21 | IRR_XML_FORMAT_SCENE(L"irr_scene"), IRR_XML_FORMAT_NODE(L"node"), IRR_XML_FORMAT_NODE_ATTR_TYPE(L"type"), |
22 | IRR_XML_FORMAT_ATTRIBUTES(L"attributes"), IRR_XML_FORMAT_MATERIALS(L"materials"), | 22 | IRR_XML_FORMAT_ATTRIBUTES(L"attributes"), IRR_XML_FORMAT_MATERIALS(L"materials"), |
23 | IRR_XML_FORMAT_ANIMATORS(L"animators"), IRR_XML_FORMAT_USERDATA(L"userData") | 23 | IRR_XML_FORMAT_ANIMATORS(L"animators"), IRR_XML_FORMAT_USERDATA(L"userData") |
24 | { | 24 | { |
25 | 25 | ||
26 | } | 26 | } |
27 | 27 | ||
28 | //! Destructor | 28 | //! Destructor |
29 | CSceneLoaderIrr::~CSceneLoaderIrr() | 29 | CSceneLoaderIrr::~CSceneLoaderIrr() |
30 | { | 30 | { |
31 | 31 | ||
32 | } | 32 | } |
33 | 33 | ||
34 | //! Returns true if the class might be able to load this file. | 34 | //! Returns true if the class might be able to load this file. |
35 | bool CSceneLoaderIrr::isALoadableFileExtension(const io::path& filename) const | 35 | bool CSceneLoaderIrr::isALoadableFileExtension(const io::path& filename) const |
36 | { | 36 | { |
37 | return core::hasFileExtension(filename, "irr"); | 37 | return core::hasFileExtension(filename, "irr"); |
38 | } | 38 | } |
39 | 39 | ||
40 | //! Returns true if the class might be able to load this file. | 40 | //! Returns true if the class might be able to load this file. |
41 | bool CSceneLoaderIrr::isALoadableFileFormat(io::IReadFile *file) const | 41 | bool CSceneLoaderIrr::isALoadableFileFormat(io::IReadFile *file) const |
42 | { | 42 | { |
43 | // todo: check inside the file | 43 | // todo: check inside the file |
44 | return true; | 44 | return true; |
45 | } | 45 | } |
46 | 46 | ||
47 | //! Loads the scene into the scene manager. | 47 | //! Loads the scene into the scene manager. |
48 | bool CSceneLoaderIrr::loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer, | 48 | bool CSceneLoaderIrr::loadScene(io::IReadFile* file, ISceneUserDataSerializer* userDataSerializer, |
49 | ISceneNode* rootNode) | 49 | ISceneNode* rootNode) |
50 | { | 50 | { |
51 | if (!file) | 51 | if (!file) |
52 | { | 52 | { |
53 | os::Printer::log("Unable to open scene file", ELL_ERROR); | 53 | os::Printer::log("Unable to open scene file", ELL_ERROR); |
54 | return false; | 54 | return false; |
55 | } | 55 | } |
56 | 56 | ||
57 | io::IXMLReader* reader = FileSystem->createXMLReader(file); | 57 | io::IXMLReader* reader = FileSystem->createXMLReader(file); |
58 | if (!reader) | 58 | if (!reader) |
59 | { | 59 | { |
60 | os::Printer::log("Scene is not a valid XML file", file->getFileName().c_str(), ELL_ERROR); | 60 | os::Printer::log("Scene is not a valid XML file", file->getFileName().c_str(), ELL_ERROR); |
61 | return false; | 61 | return false; |
62 | } | 62 | } |
63 | 63 | ||
64 | // TODO: COLLADA_CREATE_SCENE_INSTANCES can be removed when the COLLADA loader is a scene loader | 64 | // TODO: COLLADA_CREATE_SCENE_INSTANCES can be removed when the COLLADA loader is a scene loader |
65 | bool oldColladaSingleMesh = SceneManager->getParameters()->getAttributeAsBool(COLLADA_CREATE_SCENE_INSTANCES); | 65 | bool oldColladaSingleMesh = SceneManager->getParameters()->getAttributeAsBool(COLLADA_CREATE_SCENE_INSTANCES); |
66 | SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, false); | 66 | SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, false); |
67 | 67 | ||
68 | // read file | 68 | // read file |
69 | while (reader->read()) | 69 | while (reader->read()) |
70 | { | 70 | { |
71 | readSceneNode(reader, rootNode, userDataSerializer); | 71 | readSceneNode(reader, rootNode, userDataSerializer); |
72 | } | 72 | } |
73 | 73 | ||
74 | // restore old collada parameters | 74 | // restore old collada parameters |
75 | SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, oldColladaSingleMesh); | 75 | SceneManager->getParameters()->setAttribute(COLLADA_CREATE_SCENE_INSTANCES, oldColladaSingleMesh); |
76 | 76 | ||
77 | // clean up | 77 | // clean up |
78 | reader->drop(); | 78 | reader->drop(); |
79 | return true; | 79 | return true; |
80 | } | 80 | } |
81 | 81 | ||
82 | 82 | ||
83 | //! Reads the next node | 83 | //! Reads the next node |
84 | void CSceneLoaderIrr::readSceneNode(io::IXMLReader* reader, ISceneNode* parent, | 84 | void CSceneLoaderIrr::readSceneNode(io::IXMLReader* reader, ISceneNode* parent, |
85 | ISceneUserDataSerializer* userDataSerializer) | 85 | ISceneUserDataSerializer* userDataSerializer) |
86 | { | 86 | { |
87 | if (!reader) | 87 | if (!reader) |
88 | return; | 88 | return; |
89 | 89 | ||
90 | scene::ISceneNode* node = 0; | 90 | scene::ISceneNode* node = 0; |
91 | 91 | ||
92 | if (!parent && IRR_XML_FORMAT_SCENE==reader->getNodeName()) | 92 | if (!parent && IRR_XML_FORMAT_SCENE==reader->getNodeName()) |
93 | node = SceneManager->getRootSceneNode(); | 93 | node = SceneManager->getRootSceneNode(); |
94 | else if (parent && IRR_XML_FORMAT_NODE==reader->getNodeName()) | 94 | else if (parent && IRR_XML_FORMAT_NODE==reader->getNodeName()) |
95 | { | 95 | { |
96 | // find node type and create it | 96 | // find node type and create it |
97 | core::stringc attrName = reader->getAttributeValue(IRR_XML_FORMAT_NODE_ATTR_TYPE.c_str()); | 97 | core::stringc attrName = reader->getAttributeValue(IRR_XML_FORMAT_NODE_ATTR_TYPE.c_str()); |
98 | 98 | ||
99 | node = SceneManager->addSceneNode(attrName.c_str(), parent); | 99 | node = SceneManager->addSceneNode(attrName.c_str(), parent); |
100 | 100 | ||
101 | if (!node) | 101 | if (!node) |
102 | os::Printer::log("Could not create scene node of unknown type", attrName.c_str()); | 102 | os::Printer::log("Could not create scene node of unknown type", attrName.c_str()); |
103 | } | 103 | } |
104 | else | 104 | else |
105 | node=parent; | 105 | node=parent; |
106 | 106 | ||
107 | // read attributes | 107 | // read attributes |
108 | while(reader->read()) | 108 | while(reader->read()) |
109 | { | 109 | { |
110 | bool endreached = false; | 110 | bool endreached = false; |
111 | 111 | ||
112 | const wchar_t* name = reader->getNodeName(); | 112 | const wchar_t* name = reader->getNodeName(); |
113 | 113 | ||
114 | switch (reader->getNodeType()) | 114 | switch (reader->getNodeType()) |
115 | { | 115 | { |
116 | case io::EXN_ELEMENT_END: | 116 | case io::EXN_ELEMENT_END: |
117 | if ((IRR_XML_FORMAT_NODE == name) || | 117 | if ((IRR_XML_FORMAT_NODE == name) || |
118 | (IRR_XML_FORMAT_SCENE == name)) | 118 | (IRR_XML_FORMAT_SCENE == name)) |
119 | { | 119 | { |
120 | endreached = true; | 120 | endreached = true; |
121 | } | 121 | } |
122 | break; | 122 | break; |
123 | case io::EXN_ELEMENT: | 123 | case io::EXN_ELEMENT: |
124 | if (IRR_XML_FORMAT_ATTRIBUTES == name) | 124 | if (IRR_XML_FORMAT_ATTRIBUTES == name) |
125 | { | 125 | { |
126 | // read attributes | 126 | // read attributes |
127 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); | 127 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); |
128 | attr->read(reader, true); | 128 | attr->read(reader, true); |
129 | 129 | ||
130 | if (node) | 130 | if (node) |
131 | node->deserializeAttributes(attr); | 131 | node->deserializeAttributes(attr); |
132 | 132 | ||
133 | attr->drop(); | 133 | attr->drop(); |
134 | } | 134 | } |
135 | else | 135 | else |
136 | if (IRR_XML_FORMAT_MATERIALS == name) | 136 | if (IRR_XML_FORMAT_MATERIALS == name) |
137 | readMaterials(reader, node); | 137 | readMaterials(reader, node); |
138 | else | 138 | else |
139 | if (IRR_XML_FORMAT_ANIMATORS == name) | 139 | if (IRR_XML_FORMAT_ANIMATORS == name) |
140 | readAnimators(reader, node); | 140 | readAnimators(reader, node); |
141 | else | 141 | else |
142 | if (IRR_XML_FORMAT_USERDATA == name) | 142 | if (IRR_XML_FORMAT_USERDATA == name) |
143 | readUserData(reader, node, userDataSerializer); | 143 | readUserData(reader, node, userDataSerializer); |
144 | else | 144 | else |
145 | if ((IRR_XML_FORMAT_NODE == name) || | 145 | if ((IRR_XML_FORMAT_NODE == name) || |
146 | (IRR_XML_FORMAT_SCENE == name)) | 146 | (IRR_XML_FORMAT_SCENE == name)) |
147 | { | 147 | { |
148 | readSceneNode(reader, node, userDataSerializer); | 148 | readSceneNode(reader, node, userDataSerializer); |
149 | } | 149 | } |
150 | else | 150 | else |
151 | { | 151 | { |
152 | os::Printer::log("Found unknown element in irrlicht scene file", | 152 | os::Printer::log("Found unknown element in irrlicht scene file", |
153 | core::stringc(name).c_str()); | 153 | core::stringc(name).c_str()); |
154 | } | 154 | } |
155 | break; | 155 | break; |
156 | default: | 156 | default: |
157 | break; | 157 | break; |
158 | } | 158 | } |
159 | 159 | ||
160 | if (endreached) | 160 | if (endreached) |
161 | break; | 161 | break; |
162 | } | 162 | } |
163 | if (node && userDataSerializer) | 163 | if (node && userDataSerializer) |
164 | userDataSerializer->OnCreateNode(node); | 164 | userDataSerializer->OnCreateNode(node); |
165 | } | 165 | } |
166 | 166 | ||
167 | //! reads materials of a node | 167 | //! reads materials of a node |
168 | void CSceneLoaderIrr::readMaterials(io::IXMLReader* reader, ISceneNode* node) | 168 | void CSceneLoaderIrr::readMaterials(io::IXMLReader* reader, ISceneNode* node) |
169 | { | 169 | { |
170 | u32 nr = 0; | 170 | u32 nr = 0; |
171 | 171 | ||
172 | while(reader->read()) | 172 | while(reader->read()) |
173 | { | 173 | { |
174 | const wchar_t* name = reader->getNodeName(); | 174 | const wchar_t* name = reader->getNodeName(); |
175 | 175 | ||
176 | switch(reader->getNodeType()) | 176 | switch(reader->getNodeType()) |
177 | { | 177 | { |
178 | case io::EXN_ELEMENT_END: | 178 | case io::EXN_ELEMENT_END: |
179 | if (IRR_XML_FORMAT_MATERIALS == name) | 179 | if (IRR_XML_FORMAT_MATERIALS == name) |
180 | return; | 180 | return; |
181 | break; | 181 | break; |
182 | case io::EXN_ELEMENT: | 182 | case io::EXN_ELEMENT: |
183 | if (IRR_XML_FORMAT_ATTRIBUTES == name) | 183 | if (IRR_XML_FORMAT_ATTRIBUTES == name) |
184 | { | 184 | { |
185 | // read materials from attribute list | 185 | // read materials from attribute list |
186 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); | 186 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); |
187 | attr->read(reader); | 187 | attr->read(reader); |
188 | 188 | ||
189 | if (node && node->getMaterialCount() > nr) | 189 | if (node && node->getMaterialCount() > nr) |
190 | { | 190 | { |
191 | SceneManager->getVideoDriver()->fillMaterialStructureFromAttributes( | 191 | SceneManager->getVideoDriver()->fillMaterialStructureFromAttributes( |
192 | node->getMaterial(nr), attr); | 192 | node->getMaterial(nr), attr); |
193 | } | 193 | } |
194 | 194 | ||
195 | attr->drop(); | 195 | attr->drop(); |
196 | ++nr; | 196 | ++nr; |
197 | } | 197 | } |
198 | break; | 198 | break; |
199 | default: | 199 | default: |
200 | break; | 200 | break; |
201 | } | 201 | } |
202 | } | 202 | } |
203 | } | 203 | } |
204 | 204 | ||
205 | 205 | ||
206 | //! reads animators of a node | 206 | //! reads animators of a node |
207 | void CSceneLoaderIrr::readAnimators(io::IXMLReader* reader, ISceneNode* node) | 207 | void CSceneLoaderIrr::readAnimators(io::IXMLReader* reader, ISceneNode* node) |
208 | { | 208 | { |
209 | while(reader->read()) | 209 | while(reader->read()) |
210 | { | 210 | { |
211 | const wchar_t* name = reader->getNodeName(); | 211 | const wchar_t* name = reader->getNodeName(); |
212 | 212 | ||
213 | switch(reader->getNodeType()) | 213 | switch(reader->getNodeType()) |
214 | { | 214 | { |
215 | case io::EXN_ELEMENT_END: | 215 | case io::EXN_ELEMENT_END: |
216 | if (IRR_XML_FORMAT_ANIMATORS == name) | 216 | if (IRR_XML_FORMAT_ANIMATORS == name) |
217 | return; | 217 | return; |
218 | break; | 218 | break; |
219 | case io::EXN_ELEMENT: | 219 | case io::EXN_ELEMENT: |
220 | if (IRR_XML_FORMAT_ATTRIBUTES == name) | 220 | if (IRR_XML_FORMAT_ATTRIBUTES == name) |
221 | { | 221 | { |
222 | // read animator data from attribute list | 222 | // read animator data from attribute list |
223 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); | 223 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); |
224 | attr->read(reader); | 224 | attr->read(reader); |
225 | 225 | ||
226 | if (node) | 226 | if (node) |
227 | { | 227 | { |
228 | core::stringc typeName = attr->getAttributeAsString("Type"); | 228 | core::stringc typeName = attr->getAttributeAsString("Type"); |
229 | ISceneNodeAnimator* anim = SceneManager->createSceneNodeAnimator(typeName.c_str(), node); | 229 | ISceneNodeAnimator* anim = SceneManager->createSceneNodeAnimator(typeName.c_str(), node); |
230 | 230 | ||
231 | if (anim) | 231 | if (anim) |
232 | { | 232 | { |
233 | anim->deserializeAttributes(attr); | 233 | anim->deserializeAttributes(attr); |
234 | anim->drop(); | 234 | anim->drop(); |
235 | } | 235 | } |
236 | } | 236 | } |
237 | 237 | ||
238 | attr->drop(); | 238 | attr->drop(); |
239 | } | 239 | } |
240 | break; | 240 | break; |
241 | default: | 241 | default: |
242 | break; | 242 | break; |
243 | } | 243 | } |
244 | } | 244 | } |
245 | } | 245 | } |
246 | 246 | ||
247 | 247 | ||
248 | //! reads user data of a node | 248 | //! reads user data of a node |
249 | void CSceneLoaderIrr::readUserData(io::IXMLReader* reader, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer) | 249 | void CSceneLoaderIrr::readUserData(io::IXMLReader* reader, ISceneNode* node, ISceneUserDataSerializer* userDataSerializer) |
250 | { | 250 | { |
251 | while(reader->read()) | 251 | while(reader->read()) |
252 | { | 252 | { |
253 | const wchar_t* name = reader->getNodeName(); | 253 | const wchar_t* name = reader->getNodeName(); |
254 | 254 | ||
255 | switch(reader->getNodeType()) | 255 | switch(reader->getNodeType()) |
256 | { | 256 | { |
257 | case io::EXN_ELEMENT_END: | 257 | case io::EXN_ELEMENT_END: |
258 | if (IRR_XML_FORMAT_USERDATA == name) | 258 | if (IRR_XML_FORMAT_USERDATA == name) |
259 | return; | 259 | return; |
260 | break; | 260 | break; |
261 | case io::EXN_ELEMENT: | 261 | case io::EXN_ELEMENT: |
262 | if (IRR_XML_FORMAT_ATTRIBUTES == name) | 262 | if (IRR_XML_FORMAT_ATTRIBUTES == name) |
263 | { | 263 | { |
264 | // read user data from attribute list | 264 | // read user data from attribute list |
265 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); | 265 | io::IAttributes* attr = FileSystem->createEmptyAttributes(SceneManager->getVideoDriver()); |
266 | attr->read(reader); | 266 | attr->read(reader); |
267 | 267 | ||
268 | if (node && userDataSerializer) | 268 | if (node && userDataSerializer) |
269 | { | 269 | { |
270 | userDataSerializer->OnReadUserData(node, attr); | 270 | userDataSerializer->OnReadUserData(node, attr); |
271 | } | 271 | } |
272 | 272 | ||
273 | attr->drop(); | 273 | attr->drop(); |
274 | } | 274 | } |
275 | break; | 275 | break; |
276 | default: | 276 | default: |
277 | break; | 277 | break; |
278 | } | 278 | } |
279 | } | 279 | } |
280 | } | 280 | } |
281 | 281 | ||
282 | } // scene | 282 | } // scene |
283 | } // irr | 283 | } // irr |
284 | 284 | ||