Scene.cpp 4.8 KB

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