Scene.cpp 5.1 KB

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