Add Level::ScriptsReloadRegisterObject for easier scripting objects refreshing during hot-reload in code

This commit is contained in:
Wojtek Figat
2022-01-08 14:45:56 +01:00
parent a2487c02d9
commit 79200a784b
2 changed files with 57 additions and 0 deletions

View File

@@ -36,6 +36,7 @@
#include "Editor/Editor.h"
#include "Engine/Platform/MessageBox.h"
#include "Engine/Engine/CommandLine.h"
#include "Engine/Serialization/JsonSerializer.h"
#endif
bool LayersMask::HasLayer(const StringView& layerName) const
@@ -74,11 +75,25 @@ public:
}
};
#if USE_EDITOR
struct ScriptsReloadObject
{
StringAnsi TypeName;
ScriptingObject** Object;
Array<byte> Data;
};
#endif
namespace LevelImpl
{
Array<SceneAction*> _sceneActions;
CriticalSection _sceneActionsLocker;
DateTime _lastSceneLoadTime(0);
#if USE_EDITOR
Array<ScriptsReloadObject> ScriptsReloadObjects;
#endif
void CallSceneEvent(SceneEventType eventType, Scene* scene, Guid sceneId);
@@ -559,6 +574,24 @@ public:
Level::ScriptsReload();
Scripting::Reload();
// Restore objects
for (auto& e : ScriptsReloadObjects)
{
const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(e.TypeName);
*e.Object = ScriptingObject::NewObject(typeHandle);
if (!*e.Object)
{
LOG(Warning, "Failed to restore hot-reloaded object of type {0}.", String(e.TypeName));
continue;
}
auto* serializable = ScriptingObject::ToInterface<ISerializable>(*e.Object);
if (serializable && e.Data.HasItems())
{
JsonSerializer::LoadFromBytes(serializable, e.Data, FLAXENGINE_VERSION_BUILD);
}
}
ScriptsReloadObjects.Clear();
// Restore scenes (from memory)
for (int32 i = 0; i < scenesCount; i++)
{
@@ -595,6 +628,20 @@ public:
}
};
void Level::ScriptsReloadRegisterObject(ScriptingObject*& obj)
{
if (!obj)
return;
auto& e = ScriptsReloadObjects.AddOne();
e.Object = &obj;
e.TypeName = obj->GetType().Fullname;
if (auto* serializable = ScriptingObject::ToInterface<ISerializable>(obj))
e.Data = JsonSerializer::SaveToBytes(serializable);
ScriptingObject* o = obj;
obj = nullptr;
o->DeleteObjectNow();
}
#endif
class SpawnActorAction : public SceneAction