Scene.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #pragma once
  2. #include "console/engineAPI.h"
  3. #ifndef _NETOBJECT_H_
  4. #include "sim/netObject.h"
  5. #endif
  6. #ifndef _ITICKABLE_H_
  7. #include "core/iTickable.h"
  8. #endif
  9. #include "scene/sceneObject.h"
  10. /// Scene
  11. /// This object is effectively a smart container to hold and manage any relevent scene objects and data
  12. /// used to run things.
  13. class Scene : public NetObject, public virtual ITickable
  14. {
  15. typedef NetObject Parent;
  16. bool mIsSubScene;
  17. Scene* mParentScene;
  18. Vector<Scene*> mSubScenes;
  19. Vector<SceneObject*> mPermanentObjects;
  20. Vector<SceneObject*> mDynamicObjects;
  21. S32 mSceneId;
  22. bool mIsEditing;
  23. bool mIsDirty;
  24. bool mEditPostFX;
  25. StringTableEntry mGameModeName;
  26. protected:
  27. static Scene * smRootScene;
  28. DECLARE_CONOBJECT(Scene);
  29. public:
  30. Scene();
  31. ~Scene();
  32. static void initPersistFields();
  33. static bool _editPostEffects(void* object, const char* index, const char* data);
  34. bool onAdd() override;
  35. void onRemove() override;
  36. void onPostAdd() override;
  37. void interpolateTick(F32 delta) override;
  38. void processTick() override;
  39. void advanceTime(F32 timeDelta) override;
  40. void addObject(SimObject* object) override;
  41. void removeObject(SimObject* object) override;
  42. void addDynamicObject(SceneObject* object);
  43. void removeDynamicObject(SceneObject* object);
  44. void clearDynamicObjects() { mDynamicObjects.clear(); }
  45. void dumpUtilizedAssets();
  46. StringTableEntry getOriginatingFile();
  47. StringTableEntry getLevelAsset();
  48. bool saveScene(StringTableEntry fileName);
  49. //
  50. //Networking
  51. U32 packUpdate(NetConnection *conn, U32 mask, BitStream *stream) override;
  52. void unpackUpdate(NetConnection *conn, BitStream *stream) override;
  53. //
  54. Vector<SceneObject*> getObjectsByClass(String className, bool checkSubscenes);
  55. void getUtilizedAssetsFromSceneObject(SimObject* object, Vector<StringTableEntry>* usedAssetsList);
  56. template <class T>
  57. Vector<T*> getObjectsByClass(bool checkSubscenes);
  58. static Scene *getRootScene()
  59. {
  60. if (Scene::smSceneList.empty())
  61. return nullptr;
  62. return Scene::smSceneList[0];
  63. }
  64. static Vector<Scene*> smSceneList;
  65. };
  66. template <class T>
  67. Vector<T*> Scene::getObjectsByClass(bool checkSubscenes)
  68. {
  69. Vector<T*> foundObjects;
  70. T* curObject;
  71. //first, check ourself
  72. for (U32 i = 0; i < mPermanentObjects.size(); i++)
  73. {
  74. curObject = dynamic_cast<T*>(mPermanentObjects[i]);
  75. if (curObject)
  76. foundObjects.push_back(curObject);
  77. }
  78. for (U32 i = 0; i < mDynamicObjects.size(); i++)
  79. {
  80. curObject = dynamic_cast<T*>(mDynamicObjects[i]);
  81. if (curObject)
  82. foundObjects.push_back(curObject);
  83. }
  84. if (checkSubscenes)
  85. {
  86. for (U32 i = 0; i < mSubScenes.size(); i++)
  87. {
  88. Vector<T*> appendList = mSubScenes[i]->getObjectsByClass<T>(true);
  89. for (U32 a = 0; a < appendList.size(); a++)
  90. {
  91. foundObjects.push_back(appendList[a]);
  92. }
  93. }
  94. }
  95. return foundObjects;
  96. }