Scene.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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. namespace Scene {
  10. /*
  11. =======================================================================================================================================
  12. DATA =
  13. =======================================================================================================================================
  14. */
  15. Skybox skybox;
  16. NodeContainer nodes;
  17. LightContainer lights;
  18. CameraContainer cameras;
  19. MeshContainer meshNodes;
  20. SkelNodeContainer skelNodes;
  21. Vec<Controller*> controllers;
  22. //=====================================================================================================================================
  23. // Static template funcs =
  24. //=====================================================================================================================================
  25. template<typename ContainerType, typename Type> static void PutBackNode( ContainerType& container, Type* x )
  26. {
  27. DEBUG_ERR( std::find( container.begin(), container.end(), x ) != container.end() );
  28. container.push_back( x );
  29. }
  30. template<typename ContainerType, typename Type> static void EraseNode( ContainerType& container, Type* x )
  31. {
  32. typename ContainerType::iterator it = std::find( container.begin(), container.end(), x );
  33. DEBUG_ERR( it == container.end() );
  34. container.erase( it );
  35. }
  36. //=====================================================================================================================================
  37. // registerNode =
  38. //=====================================================================================================================================
  39. void registerNode( Node* node )
  40. {
  41. PutBackNode( nodes, node );
  42. switch( node->type )
  43. {
  44. case Node::NT_LIGHT:
  45. PutBackNode( lights, static_cast<Light*>(node) );
  46. break;
  47. case Node::NT_CAMERA:
  48. PutBackNode( cameras, static_cast<Camera*>(node) );
  49. break;
  50. case Node::NT_MESH:
  51. PutBackNode( meshNodes, static_cast<MeshNode*>(node) );
  52. break;
  53. case Node::NT_SKELETON:
  54. PutBackNode( skelNodes, static_cast<SkelNode*>(node) );
  55. break;
  56. case Node::NT_SKEL_MODEL:
  57. // ToDo
  58. break;
  59. };
  60. }
  61. //=====================================================================================================================================
  62. // unregisterNode =
  63. //=====================================================================================================================================
  64. void unregisterNode( Node* node )
  65. {
  66. EraseNode( nodes, node );
  67. switch( node->type )
  68. {
  69. case Node::NT_LIGHT:
  70. EraseNode( lights, static_cast<Light*>(node) );
  71. break;
  72. case Node::NT_CAMERA:
  73. EraseNode( cameras, static_cast<Camera*>(node) );
  74. break;
  75. case Node::NT_MESH:
  76. EraseNode( meshNodes, static_cast<MeshNode*>(node) );
  77. break;
  78. case Node::NT_SKELETON:
  79. EraseNode( skelNodes, static_cast<SkelNode*>(node) );
  80. break;
  81. case Node::NT_SKEL_MODEL:
  82. // ToDo
  83. break;
  84. };
  85. }
  86. //=====================================================================================================================================
  87. // Register and Unregister controllers =
  88. //=====================================================================================================================================
  89. void registerController( Controller* controller )
  90. {
  91. DEBUG_ERR( std::find( controllers.begin(), controllers.end(), controller ) != controllers.end() );
  92. controllers.push_back( controller );
  93. }
  94. void unregisterController( Controller* controller )
  95. {
  96. Vec<Controller*>::iterator it = std::find( controllers.begin(), controllers.end(), controller );
  97. DEBUG_ERR( it == controllers.end() );
  98. controllers.erase( it );
  99. }
  100. //=====================================================================================================================================
  101. // updateAllWorldStuff =
  102. //=====================================================================================================================================
  103. void updateAllWorldStuff()
  104. {
  105. DEBUG_ERR( nodes.size() > 1024 );
  106. Node* queue [1024];
  107. uint head = 0, tail = 0;
  108. uint num = 0;
  109. // put the roots
  110. for( uint i=0; i<nodes.size(); i++ )
  111. if( nodes[i]->parent == NULL )
  112. queue[tail++] = nodes[i]; // queue push
  113. // loop
  114. while( head != tail ) // while queue not empty
  115. {
  116. Node* obj = queue[head++]; // queue pop
  117. obj->updateWorldStuff();
  118. ++num;
  119. for( uint i=0; i<obj->childs.size(); i++ )
  120. queue[tail++] = obj->childs[i];
  121. }
  122. DEBUG_ERR( num != nodes.size() );
  123. }
  124. //=====================================================================================================================================
  125. // updateAllControllers =
  126. //=====================================================================================================================================
  127. void updateAllControllers()
  128. {
  129. /*for( NodeContaineR::iterator it=nodes.begin(); it!=nodes.end(); it++ )
  130. {
  131. Node* node = (*it);
  132. for( Vec<Controller*>::iterator it1=node->controllers.begin(); it1!=node->controllers.end(); it1++ )
  133. (*it1)->update( 0.0 );
  134. }*/
  135. for( Vec<Controller*>::iterator it=controllers.begin(); it!=controllers.end(); it++ )
  136. {
  137. (*it)->update( 0.0 );
  138. }
  139. }
  140. } // end namespace