Scene.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #include "Base.h"
  2. #include "AudioListener.h"
  3. #include "Scene.h"
  4. #include "SceneLoader.h"
  5. namespace gameplay
  6. {
  7. Scene::Scene() : _activeCamera(NULL), _firstNode(NULL), _lastNode(NULL), _nodeCount(0), _bindAudioListenerToCamera(true)
  8. {
  9. }
  10. Scene::Scene(const Scene& copy)
  11. {
  12. }
  13. Scene::~Scene()
  14. {
  15. // Unbind our active camera from the audio listener
  16. if (_activeCamera)
  17. {
  18. AudioListener* audioListener = AudioListener::getInstance();
  19. if (audioListener && (audioListener->getCamera() == _activeCamera))
  20. {
  21. audioListener->setCamera(NULL);
  22. }
  23. SAFE_RELEASE(_activeCamera);
  24. }
  25. // Remove all nodes from the scene
  26. removeAllNodes();
  27. }
  28. Scene* Scene::createScene()
  29. {
  30. return new Scene();
  31. }
  32. Scene* Scene::load(const char* filePath)
  33. {
  34. return SceneLoader::load(filePath);
  35. }
  36. const char* Scene::getId() const
  37. {
  38. return _id.c_str();
  39. }
  40. void Scene::setId(const char* id)
  41. {
  42. if (id)
  43. {
  44. _id = id;
  45. }
  46. }
  47. Node* Scene::findNode(const char* id, bool recursive, bool exactMatch) const
  48. {
  49. assert(id);
  50. // Search immediate children first.
  51. for (Node* child = getFirstNode(); child != NULL; child = child->getNextSibling())
  52. {
  53. // Does this child's ID match?
  54. if ((exactMatch && child->_id == id) || (!exactMatch && child->_id.find(id) == 0))
  55. {
  56. return child;
  57. }
  58. }
  59. // Recurse.
  60. if (recursive)
  61. {
  62. for (Node* child = getFirstNode(); child != NULL; child = child->getNextSibling())
  63. {
  64. Node* match = child->findNode(id, true, exactMatch);
  65. if (match)
  66. {
  67. return match;
  68. }
  69. }
  70. }
  71. return NULL;
  72. }
  73. unsigned int Scene::findNodes(const char* id, std::vector<Node*>& nodes, bool recursive, bool exactMatch) const
  74. {
  75. assert(id);
  76. unsigned int count = 0;
  77. // Search immediate children first.
  78. for (Node* child = getFirstNode(); child != NULL; child = child->getNextSibling())
  79. {
  80. // Does this child's ID match?
  81. if ((exactMatch && child->_id == id) || (!exactMatch && child->_id.find(id) == 0))
  82. {
  83. nodes.push_back(child);
  84. ++count;
  85. }
  86. }
  87. // Recurse.
  88. if (recursive)
  89. {
  90. for (Node* child = getFirstNode(); child != NULL; child = child->getNextSibling())
  91. {
  92. count += child->findNodes(id, nodes, true, exactMatch);
  93. }
  94. }
  95. return count;
  96. }
  97. Node* Scene::addNode(const char* id)
  98. {
  99. Node* node = Node::create(id);
  100. addNode(node);
  101. // Call release to decrement the ref count to 1 before returning.
  102. node->release();
  103. return node;
  104. }
  105. void Scene::addNode(Node* node)
  106. {
  107. assert(node);
  108. if (node->_scene == this)
  109. {
  110. // The node is already a member of this scene.
  111. return;
  112. }
  113. node->addRef();
  114. // If the node is part of another scene, remove it.
  115. if (node->_scene && node->_scene != this)
  116. {
  117. node->_scene->removeNode(node);
  118. }
  119. // If the node is part of another node hierarchy, remove it.
  120. if (node->getParent())
  121. {
  122. node->getParent()->removeChild(node);
  123. }
  124. // Link the new node into our list.
  125. if (_lastNode)
  126. {
  127. _lastNode->_nextSibling = node;
  128. node->_prevSibling = _lastNode;
  129. _lastNode = node;
  130. }
  131. else
  132. {
  133. _firstNode = _lastNode = node;
  134. }
  135. node->_scene = this;
  136. ++_nodeCount;
  137. // If we don't have an active camera set, then check for one and set it.
  138. if (_activeCamera == NULL)
  139. {
  140. Camera* camera = node->getCamera();
  141. if (camera)
  142. {
  143. setActiveCamera(camera);
  144. }
  145. }
  146. }
  147. void Scene::removeNode(Node* node)
  148. {
  149. assert(node);
  150. if (node->_scene != this)
  151. return;
  152. if (node == _firstNode)
  153. {
  154. _firstNode = node->_nextSibling;
  155. }
  156. if (node == _lastNode)
  157. {
  158. _lastNode = node->_prevSibling;
  159. }
  160. node->remove();
  161. node->_scene = NULL;
  162. SAFE_RELEASE(node);
  163. --_nodeCount;
  164. }
  165. void Scene::removeAllNodes()
  166. {
  167. while (_lastNode)
  168. {
  169. removeNode(_lastNode);
  170. }
  171. }
  172. unsigned int Scene::getNodeCount() const
  173. {
  174. return _nodeCount;
  175. }
  176. Node* Scene::getFirstNode() const
  177. {
  178. return _firstNode;
  179. }
  180. Camera* Scene::getActiveCamera() const
  181. {
  182. return _activeCamera;
  183. }
  184. void Scene::setActiveCamera(Camera* camera)
  185. {
  186. // Make sure we don't release the camera if the same camera is set twice.
  187. if (_activeCamera != camera)
  188. {
  189. AudioListener* audioListener = AudioListener::getInstance();
  190. if (_activeCamera)
  191. {
  192. // Unbind the active camera from the audio listener
  193. if (audioListener && (audioListener->getCamera() == _activeCamera))
  194. {
  195. AudioListener::getInstance()->setCamera(NULL);
  196. }
  197. SAFE_RELEASE(_activeCamera);
  198. }
  199. _activeCamera = camera;
  200. if (_activeCamera)
  201. {
  202. _activeCamera->addRef();
  203. if (audioListener && _bindAudioListenerToCamera)
  204. {
  205. AudioListener::getInstance()->setCamera(_activeCamera);
  206. }
  207. }
  208. }
  209. }
  210. void Scene::bindAudioListenerToCamera(bool bind)
  211. {
  212. if (_bindAudioListenerToCamera != bind)
  213. {
  214. _bindAudioListenerToCamera = bind;
  215. if (AudioListener::getInstance())
  216. {
  217. AudioListener::getInstance()->setCamera(bind ? _activeCamera : NULL);
  218. }
  219. }
  220. }
  221. const Viewport& Scene::getViewport() const
  222. {
  223. return _viewport;
  224. }
  225. void Scene::setViewport(const Viewport& viewport)
  226. {
  227. _viewport = viewport;
  228. }
  229. const Vector3& Scene::getAmbientColor() const
  230. {
  231. return _ambientColor;
  232. }
  233. void Scene::setAmbientColor(float red, float green, float blue)
  234. {
  235. _ambientColor.set(red, green, blue);
  236. }
  237. }