Scene.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #include <algorithm>
  2. #include "Exception.h"
  3. #include "Scene.h"
  4. #include "Camera.h"
  5. #include "Light.h"
  6. #include "Controller.h"
  7. #include "Material.h"
  8. #include "ParticleEmitter.h"
  9. #include "ModelNode.h"
  10. //======================================================================================================================
  11. // Constructor =
  12. //======================================================================================================================
  13. Scene::Scene()
  14. {
  15. ambientCol = Vec3(0.1, 0.05, 0.05)*4;
  16. sunPos = Vec3(0.0, 1.0, -1.0) * 50.0;
  17. physics.reset(new Physics);
  18. }
  19. //======================================================================================================================
  20. // registerNode =
  21. //======================================================================================================================
  22. void Scene::registerNode(SceneNode* node)
  23. {
  24. putBackNode(nodes, node);
  25. switch(node->type)
  26. {
  27. case SceneNode::SNT_LIGHT:
  28. putBackNode(lights, static_cast<Light*>(node));
  29. break;
  30. case SceneNode::SNT_CAMERA:
  31. putBackNode(cameras, static_cast<Camera*>(node));
  32. break;
  33. case SceneNode::SNT_PARTICLE_EMITTER:
  34. putBackNode(particleEmitters, static_cast<ParticleEmitter*>(node));
  35. break;
  36. case SceneNode::SNT_MODEL:
  37. putBackNode(modelNodes, static_cast<ModelNode*>(node));
  38. break;
  39. };
  40. }
  41. //======================================================================================================================
  42. // unregisterNode =
  43. //======================================================================================================================
  44. void Scene::unregisterNode(SceneNode* node)
  45. {
  46. eraseNode(nodes, node);
  47. switch(node->type)
  48. {
  49. case SceneNode::SNT_LIGHT:
  50. eraseNode(lights, static_cast<Light*>(node));
  51. break;
  52. case SceneNode::SNT_CAMERA:
  53. eraseNode(cameras, static_cast<Camera*>(node));
  54. break;
  55. case SceneNode::SNT_PARTICLE_EMITTER:
  56. eraseNode(particleEmitters, static_cast<ParticleEmitter*>(node));
  57. break;
  58. case SceneNode::SNT_MODEL:
  59. eraseNode(modelNodes, static_cast<ModelNode*>(node));
  60. break;
  61. };
  62. }
  63. //======================================================================================================================
  64. // Register and Unregister controllers =
  65. //======================================================================================================================
  66. void Scene::registerController(Controller* controller)
  67. {
  68. RASSERT_THROW_EXCEPTION(std::find(controllers.begin(), controllers.end(), controller) != controllers.end());
  69. controllers.push_back(controller);
  70. }
  71. void Scene::unregisterController(Controller* controller)
  72. {
  73. Vec<Controller*>::iterator it = std::find(controllers.begin(), controllers.end(), controller);
  74. RASSERT_THROW_EXCEPTION(it == controllers.end());
  75. controllers.erase(it);
  76. }
  77. //======================================================================================================================
  78. // updateAllWorldStuff =
  79. //======================================================================================================================
  80. void Scene::updateAllWorldStuff()
  81. {
  82. RASSERT_THROW_EXCEPTION(nodes.size() > 1024);
  83. SceneNode* queue [1024];
  84. uint head = 0, tail = 0;
  85. uint num = 0;
  86. // put the roots
  87. for(uint i=0; i<nodes.size(); i++)
  88. {
  89. if(nodes[i]->parent == NULL)
  90. {
  91. queue[tail++] = nodes[i]; // queue push
  92. }
  93. }
  94. // loop
  95. while(head != tail) // while queue not empty
  96. {
  97. SceneNode* obj = queue[head++]; // queue pop
  98. obj->updateWorldTransform();
  99. obj->updateTrf();
  100. obj->update();
  101. ++num;
  102. for(uint i=0; i<obj->childs.size(); i++)
  103. {
  104. queue[tail++] = obj->childs[i];
  105. }
  106. }
  107. RASSERT_THROW_EXCEPTION(num != nodes.size());
  108. }
  109. //======================================================================================================================
  110. // updateAllControllers =
  111. //======================================================================================================================
  112. void Scene::updateAllControllers()
  113. {
  114. for(Vec<Controller*>::iterator it=controllers.begin(); it!=controllers.end(); it++)
  115. {
  116. (*it)->update(0.0);
  117. }
  118. }