mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
Shifted to utilizing SimGroupInterator and persistenceManager to fix saving issues with SubScenes Shifted to utilizing SimGroupIterator for Scene saving to standardize and minimize object misses Changed prefab load file logic to add loaded child simgroup to rootscene for consistent tracking and avoiding conflicts with subScene's hijacking the ImmediateGroup var Reduced duplication of build<type>field callback for inspectors Added more standard field type lookups to inspector group when creating a field to avoid misses for types like 'F32' or similar. Folded the added-on MinSize/MaxSize/SimgroupSelect fields for SimGroup editing into a single compound field and fixed bugs with it's behavior so it works as expected now
137 lines
2.9 KiB
C++
137 lines
2.9 KiB
C++
#pragma once
|
|
#ifndef SCENE_H
|
|
#include "console/engineAPI.h"
|
|
|
|
#ifndef _NETOBJECT_H_
|
|
#include "sim/netObject.h"
|
|
#endif
|
|
|
|
#ifndef _ITICKABLE_H_
|
|
#include "core/iTickable.h"
|
|
#endif
|
|
#ifndef _SCENEOBJECT_H_
|
|
#include "scene/sceneObject.h"
|
|
#endif
|
|
|
|
#ifndef GAME_MODE_H
|
|
#include "gameMode.h"
|
|
#endif
|
|
#ifndef SUB_SCENE_H
|
|
#include "SubScene.h"
|
|
#endif
|
|
|
|
/// Scene
|
|
/// This object is effectively a smart container to hold and manage any relevent scene objects and data
|
|
/// used to run things.
|
|
class Scene : public NetObject, public virtual ITickable
|
|
{
|
|
typedef NetObject Parent;
|
|
|
|
Scene* mParentScene;
|
|
|
|
Vector<SubScene*> mSubScenes;
|
|
|
|
Vector<SimObject*> mPermanentObjects;
|
|
Vector<SimObject*> mDynamicObjects;
|
|
|
|
S32 mSceneId;
|
|
|
|
bool mIsEditing;
|
|
|
|
bool mIsDirty;
|
|
|
|
bool mEditPostFX;
|
|
|
|
StringTableEntry mGameModesNames;
|
|
Vector<GameMode*> mGameModesList;
|
|
|
|
protected:
|
|
static Scene * smRootScene;
|
|
|
|
DECLARE_CONOBJECT(Scene);
|
|
|
|
public:
|
|
Scene();
|
|
~Scene();
|
|
|
|
static void initPersistFields();
|
|
|
|
static bool _editPostEffects(void* object, const char* index, const char* data);
|
|
|
|
bool onAdd() override;
|
|
void onRemove() override;
|
|
void onPostAdd() override;
|
|
|
|
void interpolateTick(F32 delta) override;
|
|
void processTick() override;
|
|
void advanceTime(F32 timeDelta) override;
|
|
|
|
void addObject(SimObject* object) override;
|
|
void removeObject(SimObject* object) override;
|
|
|
|
void addDynamicObject(SimObject* object);
|
|
void removeDynamicObject(SimObject* object);
|
|
void clearDynamicObjects() { mDynamicObjects.clear(); }
|
|
|
|
void dumpUtilizedAssets();
|
|
|
|
StringTableEntry getOriginatingFile();
|
|
StringTableEntry getLevelAsset();
|
|
|
|
bool saveScene(StringTableEntry fileName);
|
|
|
|
//
|
|
//Networking
|
|
U32 packUpdate(NetConnection *conn, U32 mask, BitStream *stream) override;
|
|
void unpackUpdate(NetConnection *conn, BitStream *stream) override;
|
|
|
|
//
|
|
Vector<SceneObject*> getObjectsByClass(String className);
|
|
|
|
void getUtilizedAssetsFromSceneObject(SimObject* object, Vector<StringTableEntry>* usedAssetsList);
|
|
|
|
template <class T>
|
|
Vector<T*> getObjectsByClass();
|
|
|
|
void loadAtPosition(const Point3F& position);
|
|
|
|
static Scene *getRootScene()
|
|
{
|
|
if (Scene::smSceneList.empty())
|
|
return nullptr;
|
|
|
|
return Scene::smSceneList[0];
|
|
}
|
|
|
|
static Vector<Scene*> smSceneList;
|
|
|
|
DECLARE_CALLBACK(void, onSaving, (const char* fileName));
|
|
};
|
|
|
|
|
|
template <class T>
|
|
Vector<T*> Scene::getObjectsByClass()
|
|
{
|
|
Vector<T*> foundObjects;
|
|
|
|
T* curObject;
|
|
|
|
//first, check ourself
|
|
for (U32 i = 0; i < mPermanentObjects.size(); i++)
|
|
{
|
|
curObject = dynamic_cast<T*>(mPermanentObjects[i]);
|
|
if (curObject)
|
|
foundObjects.push_back(curObject);
|
|
}
|
|
|
|
for (U32 i = 0; i < mDynamicObjects.size(); i++)
|
|
{
|
|
curObject = dynamic_cast<T*>(mDynamicObjects[i]);
|
|
if (curObject)
|
|
foundObjects.push_back(curObject);
|
|
}
|
|
|
|
return foundObjects;
|
|
}
|
|
#endif
|