RioEngine  0.1
My first attempt to create a 3D WYSIWYG Game Engine
clscene.cpp
Go to the documentation of this file.
1 //--------------------------------------------------------------- @License begins
2 // RioEngine: The late night Coke -without whores- debugging sessions
3 // 2012-2015 Leopoldo Lomas Flores. Torreon, Coahuila. MEXICO
4 // leopoldolomas [at] gmail
5 // www.rioengine.com
6 // www.leopoldolomas.info
7 // "You have a problem, you face it like a man."
8 //
9 // This is free and unencumbered software released into the public domain.
10 //
11 // Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
12 // software, either in source code form or as a compiled binary, for any purpose,
13 // commercial or non-commercial, and by any means.
14 //
15 // In jurisdictions that recognize copyright laws, the author or authors of this
16 // software dedicate any and all copyright interest in the software to the public
17 // domain. We make this dedication for the benefit of the public at large and to
18 // the detriment of our heirs and successors. We intend this dedication to be
19 // an overt act of relinquishment in perpetuity of all present and future
20 // rights to this software under copyright law.
21 //
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS
24 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
26 // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //--------------------------------------------------------------- @License ends
29 
30 #include <QtOpenGL>
31 #include "macro.h"
32 #include "constants.h"
33 #include "transform_common.h"
35 #include "misc/color.h"
36 #include "misc/transform.h"
37 #include "misc/md5.h"
38 #include "misc/stringhelper.hpp"
39 #include "misc/genericshelper.hpp"
40 #include "misc/directoryhelper.hpp"
41 #include "clengine/clmesh.h"
45 #include "clengine/cltriangles.h"
46 #include "clengine/clscene.h"
47 
48 //-----------------------------------------------------------------------------
49 
50 #define ADDMD5PREFIX(x) StringHelper::addPrefix(m_md5, x)
51 
52 //-----------------------------------------------------------------------------
53 
55  m_geometries = new GeometriesMapType();
56  m_images = new ImagesMapType();
57  m_materials = new MaterialsMapType();
58  m_effects = new EffectsMapType();
59  m_nodes = new NodesMapType();
60  m_nodesId = new std::vector<std::string>();
61 }
62 
63 //-----------------------------------------------------------------------------
64 
65 CLScene::CLScene(char* filename) : CObject() {
66  m_geometries = NULL;
67  m_images = NULL;
68  m_materials = NULL;
69  m_effects = NULL;
70  m_nodes = NULL;
71  m_nodesId = NULL;
72 
73  m_doc = new TiXmlDocument(filename);
74  RE_ASSERT(m_doc->LoadFile());
75  RE_ASSERT(m_doc->FirstChildElement("COLLADA"));
76 
77  std::string relative_path = StringHelper::removeOccurrencesOfString(
78  std::string((const char*)filename),
80  m_md5 = md5(relative_path);
81  unsigned int size = m_md5.size();
82  unsigned int index = size - k_CLScene_MD5MaxCharactersCount;
83  m_md5 = m_md5.substr(index, k_CLScene_MD5MaxCharactersCount).append("_");
84 
85  reloadImages();
86  reloadNodes();
88  reloadEffects();
90 
91  m_doc->Clear();
92  SAFE_RELEASE(m_doc);
93 }
94 
95 //-----------------------------------------------------------------------------
96 
97 std::vector<std::string> CLScene::getNodeIdList() {
98  std::vector<std::string> nodes_list;
99 
100  auto it = m_nodes->begin();
101 
102  for (; it != m_nodes->end(); it++) {
103  nodes_list.push_back(it->first);
104  }
105 
106  return nodes_list;
107 }
108 
109 //-----------------------------------------------------------------------------
110 
111 CLNode* CLScene::getNodeHavingId(const std::string& node_id) {
112  return (m_nodes->count(node_id) == 0 ? NULL : m_nodes->at(node_id));
113 }
114 
115 //-----------------------------------------------------------------------------
116 
117 CLMaterial* CLScene::getMaterialHavingId(const std::string& material_id) {
118  return (m_materials->count(material_id) == 0 ? NULL : m_materials->at(material_id));
119 }
120 
121 //-----------------------------------------------------------------------------
122 
123 CLEffect* CLScene::getEffectHavingId(const std::string& effect_id) {
124  return (m_effects->count(effect_id) == 0 ? NULL : m_effects->at(effect_id));
125 }
126 
127 //-----------------------------------------------------------------------------
128 
129 CLImageDetails* CLScene::getImageDetailsHavingId(const std::string& image_id) {
130  return (m_images->count(image_id) == 0 ? NULL : m_images->at(image_id));
131 }
132 
133 //-----------------------------------------------------------------------------
134 
135 CLGeometry* CLScene::getGeometryObjHavingId(const std::string& geometry_obj_id) {
136  return (m_geometries->count(geometry_obj_id) == 0 ? NULL : m_geometries->at(geometry_obj_id));
137 }
138 
139 //-----------------------------------------------------------------------------
140 
141 void CLScene::insertImagePair(const std::string& image_id, CLImageDetails* image_details) {
142  m_images->insert(ImagePairType(image_id, image_details));
143 }
144 
145 //-----------------------------------------------------------------------------
146 
147 void CLScene::insertMaterialPair(const std::string& material_id, CLMaterial* material) {
148  m_materials->insert(MaterialPairType(material_id, material));
149 }
150 
151 //-----------------------------------------------------------------------------
152 
153 void CLScene::insertEffectPair(const std::string& effect_id, CLEffect* effect) {
154  m_effects->insert(EffectPairType(effect_id, effect));
155 }
156 
157 //-----------------------------------------------------------------------------
158 
159 void CLScene::insertGeometryPair(const std::string& geometry_id, CLGeometry* geometry) {
160  m_geometries->insert(GeometryPairType(geometry_id, geometry));
161 }
162 
163 //-----------------------------------------------------------------------------
164 
165 void CLScene::insertNodesPair(const std::string& node_id, CLNode* node) {
166  m_nodes->insert(NodePairType(node_id, node));
167 }
168 
169 //-----------------------------------------------------------------------------
170 
171 bool CLScene::loadImage(TiXmlElement* image_node) {
172  std::string image_id = image_node->Attribute("id");
173 
174  LOG("Loading image with id: %s", image_id.c_str());
175 
176  std::string image_name = image_node->Attribute("name");
177  std::string image_filename = image_node->FirstChildElement("init_from")->GetText();
178 
179  CLImageDetails *image_detail = new CLImageDetails;
180  image_detail->name = ADDMD5PREFIX(image_name);
181  image_detail->filename = image_filename;
182  image_detail->texture = 0;
183 
184  insertImagePair(ADDMD5PREFIX(image_id), image_detail);
185 
186  return true;
187 }
188 
189 //-----------------------------------------------------------------------------
190 
191 bool CLScene::loadMaterial(TiXmlElement* material_node) {
192  std::string material_id = material_node->Attribute("id");
193  LOG("Loading material with id: %s", material_id.c_str());
194 
195  std::string material_name = "";
196 
197  if (material_node->Attribute("id")) {
198  material_id = material_node->Attribute("id");
199  }
200 
201  if (material_node->Attribute("name")) {
202  material_name = material_node->Attribute("name");
203  }
204 
205  std::string instance_effect_url = material_node->FirstChildElement("instance_effect")->Attribute("url");
206  CLMaterial* material = new CLMaterial(ADDMD5PREFIX(material_id), ADDMD5PREFIX(material_name), ADDMD5PREFIX(instance_effect_url));
207  insertMaterialPair(ADDMD5PREFIX(material_id), material);
208 
209  return true;
210 }
211 
212 //-----------------------------------------------------------------------------
213 
215  std::string node_id = node->Attribute("id");
216 
217  LOG("Loading node: %s", node_id.c_str());
218 
219  CLNode* cl_node = new CLNode();
220  TiXmlElement *instance_geometry_node = node->FirstChildElement("instance_geometry");
221  std::vector<CLInstanceGeometry>* instance_geometries_vector = new std::vector<CLInstanceGeometry>();
222 
223  CLInstanceGeometry instance_geometry;
224  while (instance_geometry_node) {
225  instance_geometry = getInstanceGeometryFromNode(instance_geometry_node);
226  instance_geometries_vector->push_back(instance_geometry);
227  instance_geometry_node = instance_geometry_node->NextSiblingElement("instance_geometry");
228  }
229  cl_node->setInstanceGeometries(CArray<CLInstanceGeometry>::fromStdVector(instance_geometries_vector));
230  SAFE_RELEASE(instance_geometries_vector);
231 
232  TiXmlElement* scale_node = node->FirstChildElement("scale");
233  std::string scale = (scale_node ? scale_node->GetText() : "1 1 1");
234 
235  std::vector<float>* scale_array = (std::vector<float>*)TinyXMLHelper::getVectorFromString(scale.c_str(), TinyXMLHelper::Float);
236  cl_node->transform().setLocalScale(btVector3(scale_array->at(0), scale_array->at(1), scale_array->at(2)));
237  scale_array->clear();
238  SAFE_RELEASE(scale_array);
239 
240  TiXmlElement* location_node = node->FirstChildElement("translate");
241  std::string location = (location_node ? location_node->GetText() : "0 0 0");
242  std::vector<float>* location_array = (std::vector<float>*)TinyXMLHelper::getVectorFromString(location.c_str(), TinyXMLHelper::Float);
243  cl_node->transform().setLocalPosition(btVector3(location_array->at(0), location_array->at(1), location_array->at(2)));
244  SAFE_RELEASE(location_array);
245 
246  cl_node->transform().setLocalRotation(btQuaternion(0, 0, 0));
247  cl_node->setId(node_id);
248  insertNodesPair(node_id, cl_node);
249 
250  if (!m_nodesId) {
251  m_nodesId = new std::vector<std::string>();
252  }
253 
254  m_nodesId->push_back(node_id);
255 
256  return true;
257 }
258 
259 //-----------------------------------------------------------------------------
260 
261 bool CLScene::loadScene(TiXmlElement* scene_node) {
262  TiXmlElement *current_node = scene_node->FirstChildElement("node");
263 
264  while (current_node) {
265  if (current_node->FirstChildElement("instance_geometry") != NULL) {
266  loadNode(current_node);
267  }
268  current_node = current_node->NextSiblingElement("node");
269  }
270  return true;
271 }
272 
273 //-----------------------------------------------------------------------------
274 
275 bool CLScene::loadEffect(TiXmlElement* effect_node) {
276  TiXmlElement* pc_node = effect_node->FirstChildElement("profile_COMMON");
277  CLEffect* effect = new CLEffect();
278  CLPhong* phong = NULL;
279 
280  if (pc_node) {
281  TiXmlElement* tc_node = pc_node->FirstChildElement("technique");
282  const char* sid = tc_node->Attribute("sid");
283  if (strcmp(sid, "common") == 0) {
284  phong = new CLPhong();
285  TiXmlElement* phong_node = tc_node->FirstChildElement("phong");
286 
287  if (!phong_node) {
288  phong_node = tc_node->FirstChildElement("blinn");
289  }
290 
291  TiXmlElement* emission_node = phong_node->FirstChildElement("emission");
292  CLPhongChild* emission_child = getPhongChildFromNode(emission_node);
293  phong->setEmission(emission_child);
294 
295  TiXmlElement* ambient_node = phong_node->FirstChildElement("ambient");
296  CLPhongChild* ambient_child = getPhongChildFromNode(ambient_node);
297  phong->setAmbient(ambient_child);
298 
299  TiXmlElement* diffuse_node = phong_node->FirstChildElement("diffuse");
300  CLPhongChild* diffuse_child = getPhongChildFromNode(diffuse_node);
301  phong->setDiffuse(diffuse_child);
302 
303  TiXmlElement* specular_node = phong_node->FirstChildElement("specular");
304  CLPhongChild* specular_child = getPhongChildFromNode(specular_node);
305  phong->setSpecular(specular_child);
306 
307  TiXmlElement* shininess_node = phong_node->FirstChildElement("shininess");
308  CLPhongChild* shininess_child = getPhongChildFromNode(shininess_node);
309  phong->setShininess(shininess_child);
310 
311  TiXmlElement* index_refraction_node = phong_node->FirstChildElement("index_of_refraction");
312  CLPhongChild* index_refraction_child = getPhongChildFromNode(index_refraction_node);
313  phong->setIndexOfRefraction(index_refraction_child);
314 
316  const char* sampler_str = (const char*)phong->getDiffuse()->getValue();
317 
318  TiXmlElement* newparam_node = pc_node->FirstChildElement("newparam");
319  while (newparam_node) {
320  std::string alternative = sampler_str;
321  alternative = alternative.append("-sampler");
322  if (strcmp(newparam_node->Attribute("sid"), sampler_str) == 0 ||
323  strcmp(newparam_node->Attribute("sid"), alternative.c_str()) == 0) {
324  const char* source_str = newparam_node->FirstChildElement("sampler2D")->FirstChildElement("source")->GetText();
325 
326  TiXmlElement* inner_newparam_node = pc_node->FirstChildElement("newparam");
327  while (inner_newparam_node) {
328  if (strcmp(inner_newparam_node->Attribute("sid"), source_str) == 0) {
329  std::string image_id = ADDMD5PREFIX(
330  inner_newparam_node->FirstChildElement("surface")->FirstChildElement("init_from")->GetText());
331  effect->setImageId(image_id);
332  break;
333  }
334  inner_newparam_node = inner_newparam_node->NextSiblingElement("newparam");
335  }
336  }
337 
338  if (effect->hasImage()) {
339  break;
340  }
341  newparam_node = newparam_node->NextSiblingElement("newparam");
342  }
343  }
344  }
345  effect->setPhong(phong);
346  }
347  insertEffectPair(ADDMD5PREFIX(effect_node->Attribute("id")), effect);
348 
349  return true;
350 }
351 
352 //-----------------------------------------------------------------------------
353 
354 const NodesMapType* CLScene::nodes() const {
355  return m_nodes;
356 }
357 
358 //-----------------------------------------------------------------------------
359 
361  return m_images;
362 }
363 
364 //-----------------------------------------------------------------------------
365 
367  return m_materials;
368 }
369 
370 //-----------------------------------------------------------------------------
371 
373  return m_effects;
374 }
375 
376 //-----------------------------------------------------------------------------
377 
379  return m_geometries;
380 }
381 
382 //-----------------------------------------------------------------------------
383 
385  return NULL;
386 }
387 
388 //-----------------------------------------------------------------------------
389 
391  if (m_materials) {
392  GenericsHelper::deleteMap(m_materials); // unload current materials
393  }
394 
395  m_materials = new MaterialsMapType();
396 
397  TiXmlNode *root = m_doc->FirstChildElement("COLLADA");
398  TiXmlNode *materials_node = root->FirstChild("library_materials");
399 
400  if (!materials_node) {
401  return false;
402  }
403 
404  TiXmlElement *current_material = materials_node->FirstChildElement("material");
405 
406  while (current_material) {
407  loadMaterial(current_material);
408  current_material = current_material->NextSiblingElement();
409  }
410  return true;
411 }
412 
413 //-----------------------------------------------------------------------------
414 
416  if (m_images) {
417  GenericsHelper::deleteMap(m_images); // unload current images
418  }
419 
420  m_images = new ImagesMapType();
421 
422  TiXmlNode *root = m_doc->FirstChildElement("COLLADA");
423  TiXmlNode *images_node = root->FirstChild("library_images");
424 
425  if (!images_node) {
426  return false;
427  }
428 
429  TiXmlElement *current_image = images_node->FirstChildElement("image");
430 
431  while (current_image) {
432  loadImage(current_image);
433  current_image = current_image->NextSiblingElement();
434  }
435  return true;
436 }
437 
438 //-----------------------------------------------------------------------------
439 
441  if (m_nodes) {
442  GenericsHelper::deleteMap(m_nodes); // unload the current nodes
443  }
444 
445  m_nodes = new NodesMapType();
446 
447  TiXmlNode *root = m_doc->FirstChildElement("COLLADA");
448  TiXmlNode *materials_node = root->FirstChild("library_visual_scenes");
449  TiXmlElement *current_node = materials_node->FirstChildElement("visual_scene");
450 
451  while (current_node) {
452  loadScene(current_node);
453  current_node = current_node->NextSiblingElement();
454  }
455  return true;
456 }
457 
458 //-----------------------------------------------------------------------------
459 
461  if (m_effects) {
462  GenericsHelper::deleteMap(m_effects); // unload current effects
463  }
464 
465  m_effects = new EffectsMapType();
466 
467  TiXmlNode *root = m_doc->FirstChildElement("COLLADA");
468  TiXmlNode *effects_node = root->FirstChild("library_effects");
469 
470  if (!effects_node) {
471  return false;
472  }
473 
474  TiXmlElement *effect_node = effects_node->FirstChildElement("effect");
475 
476  while (effect_node) {
477  loadEffect(effect_node);
478  effect_node = effect_node->NextSiblingElement("effect");
479  }
480  return true;
481 }
482 
483 //-----------------------------------------------------------------------------
484 
486  if (m_geometries) {
487  GenericsHelper::deleteMap(m_geometries); // unload current geometries
488  }
489 
490  m_geometries = new GeometriesMapType();
491 
492  TiXmlNode *root = m_doc->FirstChildElement("COLLADA");
493  TiXmlNode *geometry_node = root->FirstChild("library_geometries");
494  TiXmlElement *current_geometry = geometry_node->FirstChildElement("geometry");
495 
496  while (current_geometry) {
497  loadGeometry(current_geometry);
498  current_geometry = current_geometry->NextSiblingElement();
499  }
500  return true;
501 }
502 
503 //-----------------------------------------------------------------------------
504 
505 CLMaterial* CLScene::getMaterialHavingName(const std::string& material_name) {
506  MaterialsMapType::const_iterator it = m_materials->begin();
507 
508  for (; it != m_materials->end(); it++) {
509  CLMaterial* material_obj = it->second;
510  if (material_obj->name() == material_name ||
511  material_obj->id() == material_name) {
512  return material_obj;
513  }
514  }
515  return NULL;
516 }
517 
518 //-----------------------------------------------------------------------------
519 
520 bool CLScene::loadGeometry(TiXmlElement* geometry_node) {
521  const char *geometry_id = geometry_node->Attribute("id");
522 
523  CLGeometry* geometry_object = new CLGeometry();
524  TiXmlElement *mesh_node = geometry_node->FirstChildElement("mesh");
525  TiXmlElement *source_node = mesh_node->FirstChildElement("source");
526  std::string str_positions = geometry_id;
527  std::string str_normals = geometry_id;
528  std::string str_map_array = geometry_id;
529  std::string str_map_array_alt1 = geometry_id;
530 
531  str_positions += "-positions";
532  str_normals += "-normals";
533  str_map_array += "-map-0"; // blender looks for "-x" suffix...
534  str_map_array_alt1 += "-map"; // mesh lab doesn't
535 
536  const char* obj_id = NULL;
537 
538  while (source_node) {
539  obj_id = source_node->Attribute("id");
540 
541  if (obj_id) {
542  if (strcmp(obj_id, str_positions.c_str()) == 0) {
543  geometry_object->getMesh()->setPositions(getFloatCArrayFromSourceNode(source_node));
544  }
545  else if (strcmp(obj_id, str_normals.c_str()) == 0) {
546  geometry_object->getMesh()->setNormals(getFloatCArrayFromSourceNode(source_node));
547  }
548  else if (strcmp(obj_id, str_map_array.c_str()) == 0 ||
549  strcmp(obj_id, str_map_array_alt1.c_str()) == 0) {
550  geometry_object->getMesh()->setMapArray(getMapArrayFromSourceNode(source_node));
551  }
552  }
553  source_node = source_node->NextSiblingElement();
554  }
555  SAFE_RELEASE(obj_id);
556 
557  TiXmlElement *triangles_node = mesh_node->FirstChildElement("triangles");
558  std::vector<CLTriangles>* triangles_vector = new std::vector<CLTriangles>();
559  std::vector<int> vertices_indices;
560  std::vector<int> normals_indices;
561  std::vector<int> textcoords_indices;
562 
563  while (triangles_node) {
564  vertices_indices = std::vector<int>();
565  normals_indices = std::vector<int>();
566  textcoords_indices = std::vector<int>();
567 
568  int input_nodes_count = 0, vertices_offset = 0, normals_offset = 0, texture_coords_offset = 0;
569 
570  TiXmlElement* input_node = triangles_node->FirstChildElement("input");
571  while (input_node) {
572  if (strcmp(input_node->Attribute("semantic"), "VERTEX") == 0) {
573  vertices_offset = atoi(input_node->Attribute("offset"));
574  } else if (strcmp(input_node->Attribute("semantic"), "NORMAL") == 0) {
575  normals_offset = atoi(input_node->Attribute("offset"));
576  } else if (strcmp(input_node->Attribute("semantic"), "TEXCOORD") == 0) {
577  texture_coords_offset = atoi(input_node->Attribute("offset"));
578  }
579 
580  input_nodes_count++;
581  input_node = input_node->NextSiblingElement("input");
582  }
583 
584  CLTriangles triangles_obj = CLTriangles();
585 
586  const char* p_value_as_str = triangles_node->FirstChildElement("p")->GetText();
587  std::vector<int>* indices = static_cast<std::vector<int>*>(TinyXMLHelper::getVectorFromString(p_value_as_str, TinyXMLHelper::Integer));
588 
589  for (unsigned int i = vertices_offset; i < indices->size(); i += input_nodes_count) {
590  vertices_indices.push_back(indices->at(i));
591  }
592 
593  for (unsigned int i = normals_offset; i < indices->size(); i += input_nodes_count) {
594  normals_indices.push_back(indices->at(i));
595  }
596 
597  for (unsigned int i = texture_coords_offset; i < indices->size(); i += input_nodes_count) {
598  textcoords_indices.push_back(indices->at(i));
599  }
600 
601  const char* material_id_cstr = triangles_node->Attribute("material");
602  std::string material_id = (material_id_cstr ? material_id_cstr : "");
603  triangles_obj.setMaterialId(ADDMD5PREFIX(material_id));
604  triangles_obj.setVerticesIndices(CArray<int>::fromStdVector(&vertices_indices));
605  triangles_obj.setNormalsIndices(CArray<int>::fromStdVector(&normals_indices));
606  triangles_obj.setTextureCoordsIndices(CArray<int>::fromStdVector(&textcoords_indices));
607 
608  indices->clear();
609  SAFE_RELEASE(indices);
610 
611  triangles_vector->push_back(triangles_obj);
612  triangles_node = triangles_node->NextSiblingElement();
613  }
614 
615  geometry_object->getMesh()->setTriangles(CArray<CLTriangles>::fromStdVector(triangles_vector));
616  triangles_vector->clear();
617  SAFE_RELEASE(triangles_vector);
618 
619  geometry_object->setPolygons(geometry_object->getMesh()->getPolygonsArray());
620 
621  int len = strlen(geometry_id) + 1;
622  char *tmp = new char[len];
623  strncpy_s(tmp, len, geometry_id, len);
624  insertGeometryPair(ADDMD5PREFIX(tmp), geometry_object);
625  SAFE_RELEASE_ARRAY(tmp);
626 
627  return true;
628 }
629 
630 //-----------------------------------------------------------------------------
631 
632 void CLScene::getFloatStdVecFromSourceNode(TiXmlElement* source_node, std::vector<btVector3*>* vector_dest) {
633  const char* float_array_as_string = source_node->FirstChildElement("float_array")->GetText();
634 
635  std::vector<GLfloat>* position_array = new std::vector<GLfloat>();
636 
637  char *tmp = new char[strlen(float_array_as_string)];
638  strcpy_s(tmp, strlen(float_array_as_string)+1, float_array_as_string);
639 
640  char* pch;
641  char* context = NULL;
642 
643  pch = strtok_s (tmp," ", &context);
644 
645  while (pch != NULL) {
646  position_array->push_back((float)atof(pch));
647 
648  if (position_array->size() == 3) {
649  btVector3* new_point = new btVector3(position_array->at(0), position_array->at(1), position_array->at(2));
650  vector_dest->push_back(new_point);
651 
652  SAFE_RELEASE(position_array);
653  position_array = new std::vector<GLfloat>();
654  }
655  pch = strtok_s (NULL, " ", &context);
656  }
657  SAFE_RELEASE(position_array);
658  SAFE_RELEASE(pch);
659 }
660 
661 //-----------------------------------------------------------------------------
662 
663 CArray<btVector3>* CLScene::getFloatCArrayFromSourceNode(TiXmlElement* source_node) {
664  const char* float_array_as_string = source_node->FirstChildElement("float_array")->GetText();
665 
666  std::vector<GLfloat> position_array;
667 
668  int len = strlen(float_array_as_string) + 1;
669  char *tmp = new char[len];
670  strncpy_s(tmp, len, float_array_as_string, len);
671 
672  char* pch;
673  char* context = NULL;
674 
675  pch = strtok_s (tmp," ", &context);
676 
677  btAlignedObjectArray<btVector3>* vector_dest = new btAlignedObjectArray<btVector3>();
678 
679  while (pch != NULL) {
680  position_array.push_back((float)atof(pch));
681 
682  if (position_array.size() == 3) {
683  btVector3 new_point = btVector3(position_array.at(0), position_array.at(1), position_array.at(2));
684  vector_dest->push_back(new_point);
685  position_array = std::vector<GLfloat>();
686  }
687  pch = strtok_s (NULL, " ", &context);
688  }
689  SAFE_RELEASE(pch);
690  SAFE_RELEASE_ARRAY(tmp);
691 
693  vector_dest->clear();
694  SAFE_RELEASE(vector_dest);
695 
696  return array;
697 }
698 
699 //-----------------------------------------------------------------------------
700 
701 CArray<TextureCoord>* CLScene::getMapArrayFromSourceNode(TiXmlElement* source_node) {
702  const char* float_array_as_string = source_node->FirstChildElement("float_array")->GetText();
703  std::vector<GLfloat> position_array;
704 
705  int len = strlen(float_array_as_string) + 1;
706  char* tmp = new char[len];
707  strncpy_s(tmp, len, float_array_as_string, len);
708 
709  char* pch;
710  char* context = NULL;
711 
712  pch = strtok_s (tmp," ", &context);
713 
714  std::vector<TextureCoord>* vector_dest = new std::vector<TextureCoord>();
715 
716  while (pch != NULL) {
717  position_array.push_back((float)atof(pch));
718 
719  if (position_array.size() == 2) {
720  TextureCoord new_texcoord = TextureCoord();
721  new_texcoord.s = position_array.at(0);
722  new_texcoord.t = 1.0f - position_array.at(1);
723  vector_dest->push_back(new_texcoord);
724 
725  position_array = std::vector<GLfloat>();
726  }
727  pch = strtok_s (NULL, " ", &context);
728  }
729  SAFE_RELEASE_ARRAY(tmp);
730  SAFE_RELEASE(pch);
731 
733  SAFE_RELEASE(vector_dest);
734  return array;
735 }
736 
737 //-----------------------------------------------------------------------------
738 
740  CLInstanceGeometry instance_geometry = CLInstanceGeometry();
741  instance_geometry.setMeshURL(ADDMD5PREFIX(instance_geometry_node->Attribute("url")));
742  TiXmlElement *bind_material_node = instance_geometry_node->FirstChildElement("bind_material");
743  std::vector<CLInstanceMaterial> instance_materials_vec = std::vector<CLInstanceMaterial>();
744 
745  if (bind_material_node) {
746  TiXmlElement *material_node = bind_material_node->FirstChildElement("technique_common")->FirstChildElement("instance_material");
747 
748  std::vector<CLBindVertexInput>* bindvertexinput_array = NULL;
749 
750  while (material_node) {
751  std::string symbol = ADDMD5PREFIX(material_node->Attribute("symbol"));
752  std::string target = ADDMD5PREFIX(material_node->Attribute("target"));
753 
754  CLInstanceMaterial material_instance = CLInstanceMaterial(symbol, target);
755 
756  TiXmlElement *bind_vertex_node = material_node->FirstChildElement("bind_vertex_input");
757 
758  bindvertexinput_array = new std::vector<CLBindVertexInput>();
759 
760  while (bind_vertex_node) {
761  std::string semantic = bind_vertex_node->Attribute("semantic");
762  std::string input_semantic = bind_vertex_node->Attribute("input_semantic");
763  std::string input_set_as_string = "0";
764 
765  if (bind_vertex_node->Attribute("input_set")) {
766  input_set_as_string = bind_vertex_node->Attribute("input_set");
767  }
768 
769  int input_set = atoi(input_set_as_string.c_str());
770 
771  CLBindVertexInput bind_vertex = CLBindVertexInput(semantic, input_semantic, input_set);
772  bindvertexinput_array->push_back(bind_vertex);
773  bind_vertex_node = bind_vertex_node->NextSiblingElement("bind_vertex_input");
774  }
775 
776  if (bindvertexinput_array->size() > 0) {
777  material_instance.setBindVertexInputList(CArray<CLBindVertexInput>::fromStdVector(bindvertexinput_array));
778  } else {
779  material_instance.setBindVertexInputList(NULL);
780  }
781 
782  SAFE_RELEASE(bindvertexinput_array);
783  instance_materials_vec.push_back(material_instance);
784  material_node = material_node->NextSiblingElement("instance_material");
785  }
786  }
787  instance_geometry.setInstanceMaterials(CArray<CLInstanceMaterial>::fromStdVector(&instance_materials_vec));
788  instance_materials_vec.clear();
789 
790  return instance_geometry;
791 }
792 
793 //-----------------------------------------------------------------------------
794 
796  CLPhongChild* child = new CLPhongChild();
797  TiXmlElement* color_node = node->FirstChildElement("color");
798  TiXmlElement* texture_node = node->FirstChildElement("texture");
799  TiXmlElement* float_node = node->FirstChildElement("float");
800 
801  if (color_node) {
802  std::vector<float>* colorArray = (std::vector<float>*)TinyXMLHelper::getVectorFromString(color_node->GetText(), TinyXMLHelper::Float);
803  Color* color = new Color(colorArray->at(0), colorArray->at(1), colorArray->at(2));
804  SAFE_RELEASE(colorArray);
805 
806  child->setValue(color, CLPhongChild::COLOR_TYPE);
807  } else if (texture_node) {
808  child->setValue((void*)texture_node->Attribute("texture"), CLPhongChild::TEXTURE_TYPE);
809  } else if (float_node) {
810  float val = (float)atof(float_node->GetText());
811  child->setValue(&val, CLPhongChild::FLOAT_TYPE);
812  }
813 
814  child->autorelease();
815  return child;
816 }
817 
818 //-----------------------------------------------------------------------------
819 
821  GenericsHelper::deleteMap(m_images);
822  GenericsHelper::deleteMap(m_materials);
823  GenericsHelper::deleteMap(m_effects);
824  GenericsHelper::deleteMap(m_geometries);
825  GenericsHelper::deleteMap(m_nodes);
826  SAFE_RELEASE(m_nodesId);
827 }
const CLImageDetails * imageDetails() const
Definition: clscene.cpp:384
const GeometriesMapType * geometries() const
Definition: clscene.cpp:378
#define LOG
Definition: macro.h:43
float t
Definition: typedefs.h:46
bool reloadImages()
Definition: clscene.cpp:415
bool hasImage()
Definition: cleffect.cpp:92
static void deleteMap(std::map< TKey, TVal * > *map)
void setMeshURL(const std::string &url)
void setMaterialId(const std::string &material_id)
Definition: cltriangles.cpp:71
static std::string & removeOccurrencesOfString(std::string &original_str, std::string &str_to_remove)
const EffectsMapType * effects() const
Definition: clscene.cpp:372
std::pair< std::string, CLGeometry * > GeometryPairType
Definition: typedefs.h:69
void setValue(void *value, PhongChildType value_type)
bool loadEffect(TiXmlElement *effect_node)
Definition: clscene.cpp:275
CLPhongChild * getPhongChildFromNode(TiXmlElement *node)
Definition: clscene.cpp:795
const ImagesMapType * images() const
Definition: clscene.cpp:360
bool loadScene(TiXmlElement *scene_node)
Definition: clscene.cpp:261
void setShininess(CLPhongChild *shininess)
Definition: clphong.cpp:135
std::string filename
Definition: typedefs.h:52
static CArray * fromBtAlignedObjectArray(btAlignedObjectArray< T > *vec)
Definition: carray.h:150
bool loadNode(TiXmlElement *node)
Definition: clscene.cpp:214
std::pair< std::string, CLNode * > NodePairType
Definition: typedefs.h:78
std::map< std::string, CLEffect * > EffectsMapType
Definition: typedefs.h:71
Definition: color.h:29
void insertImagePair(const std::string &image_id, CLImageDetails *image_details)
Definition: clscene.cpp:141
Definition: clnode.h:37
void setDiffuse(CLPhongChild *diffuse)
Definition: clphong.cpp:105
void insertMaterialPair(const std::string &material_id, CLMaterial *material)
Definition: clscene.cpp:147
void setTriangles(CArray< CLTriangles > *triangles_array)
Definition: clmesh.cpp:77
void setAmbient(CLPhongChild *ambient)
Definition: clphong.cpp:90
bool reloadEffects()
Definition: clscene.cpp:460
std::map< std::string, CLImageDetails * > ImagesMapType
Definition: typedefs.h:62
PhongChildType getValueType() const
void setNormals(CArray< btVector3 > *normals)
Definition: clmesh.cpp:107
CLMaterial * getMaterialHavingName(const std::string &material_name)
Definition: clscene.cpp:505
void insertNodesPair(const std::string &node_id, CLNode *node)
Definition: clscene.cpp:165
void setSpecular(CLPhongChild *specular)
Definition: clphong.cpp:120
bool reloadNodes()
Definition: clscene.cpp:440
const MaterialsMapType * materials() const
Definition: clscene.cpp:366
std::string name
Definition: typedefs.h:51
CLScene()
Definition: clscene.cpp:54
void setMapArray(CArray< TextureCoord > *map_array)
Definition: clmesh.cpp:122
void setVerticesIndices(CArray< int > *indices)
~CLScene(void)
Definition: clscene.cpp:820
std::map< std::string, CLGeometry * > GeometriesMapType
Definition: typedefs.h:68
std::pair< std::string, CLMaterial * > MaterialPairType
Definition: typedefs.h:75
unsigned int texture
Definition: typedefs.h:54
void Clear()
Delete all the children of this node. Does not affect 'this'.
Definition: tinyxml.cpp:168
bool loadImage(TiXmlElement *image_node)
Definition: clscene.cpp:171
void setPositions(CArray< btVector3 > *positions)
Definition: clmesh.cpp:92
Definition: carray.h:43
void setEmission(CLPhongChild *emission)
Definition: clphong.cpp:75
const TiXmlElement * NextSiblingElement() const
Definition: tinyxml.cpp:481
#define ADDMD5PREFIX(x)
Definition: clscene.cpp:50
std::pair< std::string, CLImageDetails * > ImagePairType
Definition: typedefs.h:66
bool loadMaterial(TiXmlElement *material_node)
Definition: clscene.cpp:191
const std::string & id() const
Definition: clmaterial.cpp:50
CArray< CLPolygon > * getPolygonsArray()
Definition: clmesh.cpp:162
std::map< std::string, CLMaterial * > MaterialsMapType
Definition: typedefs.h:74
const char * Attribute(const char *name) const
Definition: tinyxml.cpp:576
float s
Definition: typedefs.h:45
CLGeometry * getGeometryObjHavingId(const std::string &geometry_obj_id)
Definition: clscene.cpp:135
CLNode * getNodeHavingId(const std::string &node_id)
Definition: clscene.cpp:111
#define SAFE_RELEASE(x)
Definition: cobject.h:36
CObject * autorelease()
Definition: cobject.cpp:87
CLEffect * getEffectHavingId(const std::string &effect_id)
Definition: clscene.cpp:123
void setImageId(const std::string &image_id)
Definition: cleffect.cpp:66
CLMaterial * getMaterialHavingId(const std::string &material_id)
Definition: clscene.cpp:117
CLMesh * getMesh() const
Definition: clgeometry.cpp:86
static void * getVectorFromString(const char *p_as_str, VectorType type)
static std::string getProjectDirectory()
CLPhongChild * getDiffuse() const
Definition: clphong.cpp:114
void * getValue() const
#define RE_ASSERT
Definition: macro.h:57
std::vector< std::string > getNodeIdList()
Definition: clscene.cpp:97
const char * GetText() const
Definition: tinyxml.cpp:899
std::pair< std::string, CLEffect * > EffectPairType
Definition: typedefs.h:72
#define SAFE_RELEASE_ARRAY(x)
Definition: cobject.h:37
void setIndexOfRefraction(CLPhongChild *index_of_refraction)
Definition: clphong.cpp:150
void setNormalsIndices(CArray< int > *indices)
std::string md5(const std::string str)
Definition: md5.cpp:357
bool LoadFile(TiXmlEncoding encoding=TIXML_DEFAULT_ENCODING)
Definition: tinyxml.cpp:953
std::map< std::string, CLNode * > NodesMapType
Definition: typedefs.h:77
void insertGeometryPair(const std::string &geometry_id, CLGeometry *geometry)
Definition: clscene.cpp:159
void setInstanceMaterials(CArray< CLInstanceMaterial > *instance_materials)
void insertEffectPair(const std::string &effect_id, CLEffect *effect)
Definition: clscene.cpp:153
void setPolygons(CArray< CLPolygon > *)
Definition: clgeometry.cpp:71
bool reloadMaterials()
Definition: clscene.cpp:390
static CArray * fromStdVector(std::vector< T > *vec)
Definition: carray.h:129
const std::string & name() const
Definition: clmaterial.cpp:56
CLInstanceGeometry getInstanceGeometryFromNode(TiXmlElement *instance_geometry_node)
Definition: clscene.cpp:739
const TiXmlNode * FirstChild() const
The first child of this node. Will be null if there are no children.
Definition: tinyxml.h:522
const NodesMapType * nodes() const
Definition: clscene.cpp:354
CLImageDetails * getImageDetailsHavingId(const std::string &image_id)
Definition: clscene.cpp:129
const TiXmlElement * FirstChildElement() const
Convenience function to get through elements.
Definition: tinyxml.cpp:451
bool reloadGeometries()
Definition: clscene.cpp:485
void setTextureCoordsIndices(CArray< int > *indices)
void setPhong(CLPhong *phong)
Definition: cleffect.cpp:78