Skip to content

Commit 8a74991

Browse files
committed
More Script Engine cleanup + handling invalid state
1 parent 91791b1 commit 8a74991

File tree

3 files changed

+79
-83
lines changed

3 files changed

+79
-83
lines changed

StarEngine/src/StarEngine/Scene/SceneSerializer.cpp

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -464,44 +464,46 @@ namespace StarEngine {
464464
if (scriptFields)
465465
{
466466
Ref<ScriptClass> entityClass = ScriptEngine::GetEntityClass(sc.ClassName);
467-
SE_CORE_ASSERT(entityClass);
468-
const auto& fields = entityClass->GetFields();
469-
auto& entityFields = ScriptEngine::GetScriptFieldMap(deserializedEntity);
470-
471-
for (auto scriptField : scriptFields)
467+
if (entityClass)
472468
{
473-
std::string name = scriptField["Name"].as<std::string>();
474-
std::string typeString = scriptField["Type"].as<std::string>();
475-
ScriptFieldType type = Utils::ScriptFieldTypeFromString(typeString);
476-
477-
ScriptFieldInstance& fieldInstance = entityFields[name];
478-
479-
// TODO: turn this assert into StarEditor log warning
480-
SE_CORE_ASSERT(fields.find(name) != fields.end());
481-
482-
if (fields.find(name) == fields.end())
483-
continue;
484-
485-
fieldInstance.Field = fields.at(name);
469+
const auto& fields = entityClass->GetFields();
470+
auto& entityFields = ScriptEngine::GetScriptFieldMap(deserializedEntity);
486471

487-
switch (type)
472+
for (auto scriptField : scriptFields)
488473
{
489-
READ_SCRIPT_FIELD(Float, float);
490-
READ_SCRIPT_FIELD(Double, double);
491-
READ_SCRIPT_FIELD(Bool, bool);
492-
READ_SCRIPT_FIELD(Char, char);
493-
READ_SCRIPT_FIELD(Byte, int8_t);
494-
READ_SCRIPT_FIELD(Short, int16_t);
495-
READ_SCRIPT_FIELD(Int, int32_t);
496-
READ_SCRIPT_FIELD(Long, int64_t);
497-
READ_SCRIPT_FIELD(UByte, uint8_t);
498-
READ_SCRIPT_FIELD(UShort, uint16_t);
499-
READ_SCRIPT_FIELD(UInt, uint32_t);
500-
READ_SCRIPT_FIELD(ULong, uint64_t);
501-
READ_SCRIPT_FIELD(Vector2, glm::vec2);
502-
READ_SCRIPT_FIELD(Vector3, glm::vec3);
503-
READ_SCRIPT_FIELD(Vector4, glm::vec4);
504-
READ_SCRIPT_FIELD(Entity, UUID);
474+
std::string name = scriptField["Name"].as<std::string>();
475+
std::string typeString = scriptField["Type"].as<std::string>();
476+
ScriptFieldType type = Utils::ScriptFieldTypeFromString(typeString);
477+
478+
ScriptFieldInstance& fieldInstance = entityFields[name];
479+
480+
// TODO: turn this assert into StarEditor log warning
481+
SE_CORE_ASSERT(fields.find(name) != fields.end());
482+
483+
if (fields.find(name) == fields.end())
484+
continue;
485+
486+
fieldInstance.Field = fields.at(name);
487+
488+
switch (type)
489+
{
490+
READ_SCRIPT_FIELD(Float, float);
491+
READ_SCRIPT_FIELD(Double, double);
492+
READ_SCRIPT_FIELD(Bool, bool);
493+
READ_SCRIPT_FIELD(Char, char);
494+
READ_SCRIPT_FIELD(Byte, int8_t);
495+
READ_SCRIPT_FIELD(Short, int16_t);
496+
READ_SCRIPT_FIELD(Int, int32_t);
497+
READ_SCRIPT_FIELD(Long, int64_t);
498+
READ_SCRIPT_FIELD(UByte, uint8_t);
499+
READ_SCRIPT_FIELD(UShort, uint16_t);
500+
READ_SCRIPT_FIELD(UInt, uint32_t);
501+
READ_SCRIPT_FIELD(ULong, uint64_t);
502+
READ_SCRIPT_FIELD(Vector2, glm::vec2);
503+
READ_SCRIPT_FIELD(Vector3, glm::vec3);
504+
READ_SCRIPT_FIELD(Vector4, glm::vec4);
505+
READ_SCRIPT_FIELD(Entity, UUID);
506+
}
505507
}
506508
}
507509
}

StarEngine/src/StarEngine/Scripting/ScriptEngine.cpp

Lines changed: 40 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ namespace fmt {
2525
return formatter<std::string>::format(path.string(), ctx);
2626
}
2727
};
28+
29+
template <>
30+
struct formatter<StarEngine::UUID> : formatter<std::string> {
31+
template <typename FormatContext>
32+
auto format(const StarEngine::UUID& uuid, FormatContext& ctx) const {
33+
return formatter<std::string>::format(std::to_string(uuid), ctx);
34+
}
35+
};
2836
} // namespace fmt
2937

3038
namespace StarEngine {
@@ -177,46 +185,25 @@ namespace StarEngine {
177185
InitMono();
178186
ScriptGlue::RegisterFunctions();
179187

180-
LoadAssembly("Resources/Scripts/StarEngine-ScriptCore.dll");
181-
LoadAppAssembly("SandboxProject/Assets/Scripts/Binaries/Sandbox.dll");
188+
bool status = LoadAssembly("Resources/Scripts/StarEngine-ScriptCore.dll");
189+
if (!status)
190+
{
191+
SE_CORE_ERROR("[ScriptEngine] Could not load StarEngine-ScriptCore assembly.");
192+
return;
193+
}
194+
status = LoadAppAssembly("SandboxProject/Assets/Scripts/Binaries/Sandbox.dll");
195+
if (!status)
196+
{
197+
SE_CORE_ERROR("[ScriptEngine] Could not load app assembly.");
198+
return;
199+
}
200+
182201
LoadAssemblyClasses();
183202

184203
ScriptGlue::RegisterComponents();
185204

186205
// Retrieve and instantiate class
187206
s_Data->EntityClass = ScriptClass("StarEngine", "Entity", true);
188-
#if 0
189-
190-
MonoObject* instance = s_Data->EntityClass.Instantiate();
191-
192-
// Call method
193-
MonoMethod* printMessageFunc = s_Data->EntityClass.GetMethod("PrintMessage", 0);
194-
s_Data->EntityClass.InvokeMethod(instance, printMessageFunc);
195-
196-
// Call method with param
197-
MonoMethod* printIntFunc = s_Data->EntityClass.GetMethod("PrintInt", 1);
198-
199-
int value = 5;
200-
void* param = &value;
201-
202-
s_Data->EntityClass.InvokeMethod(instance, printIntFunc, &param);
203-
204-
MonoMethod* printIntsFunc = s_Data->EntityClass.GetMethod("PrintInts", 2);
205-
int value2 = 508;
206-
void* params[2] =
207-
{
208-
&value,
209-
&value2
210-
};
211-
s_Data->EntityClass.InvokeMethod(instance, printIntsFunc, params);
212-
213-
MonoString* monoString = mono_string_new(s_Data->AppDomain, "Hello World from C++!");
214-
MonoMethod* printCustomMessageFunc = s_Data->EntityClass.GetMethod("PrintCustomMessage", 1);
215-
void* stringParam = monoString;
216-
s_Data->EntityClass.InvokeMethod(instance, printCustomMessageFunc, &stringParam);
217-
218-
SE_CORE_ASSERT(false);
219-
#endif
220207
}
221208

222209
void ScriptEngine::Shutdown()
@@ -265,32 +252,34 @@ namespace StarEngine {
265252
s_Data->RootDomain = nullptr;
266253
}
267254

268-
void ScriptEngine::LoadAssembly(const std::filesystem::path& filepath)
255+
bool ScriptEngine::LoadAssembly(const std::filesystem::path& filepath)
269256
{
270257
// Create an App Domain
271258
s_Data->AppDomain = mono_domain_create_appdomain("StarEngineScriptRuntime", nullptr);
272259
mono_domain_set(s_Data->AppDomain, true);
273260

274-
// Move this maybe
275261
s_Data->CoreAssemblyFilepath = filepath;
276262
s_Data->CoreAssembly = Utils::LoadMonoAssembly(filepath, s_Data->EnableDebugging);
263+
if (s_Data->CoreAssembly == nullptr)
264+
return false;
265+
277266
s_Data->CoreAssemblyImage = mono_assembly_get_image(s_Data->CoreAssembly);
278-
// Utils::PrintAssemblyTypes(s_Data->CoreAssembly);
267+
return true;
279268
}
280269

281270

282-
void ScriptEngine::LoadAppAssembly(const std::filesystem::path& filepath)
271+
bool ScriptEngine::LoadAppAssembly(const std::filesystem::path& filepath)
283272
{
284-
// Move this maybe
285273
s_Data->AppAssemblyFilepath = filepath;
286274
s_Data->AppAssembly = Utils::LoadMonoAssembly(filepath, s_Data->EnableDebugging);
287-
auto assemb = s_Data->AppAssembly;
275+
if (s_Data->AppAssembly == nullptr)
276+
return false;
288277
s_Data->AppAssemblyImage = mono_assembly_get_image(s_Data->AppAssembly);
289-
auto assembi = s_Data->AppAssemblyImage;
290-
// Utils::PrintAssemblyTypes(s_Data->AppAssembly);
291278

292279
s_Data->AppAssemblyFileWatcher = CreateScope<filewatch::FileWatch<std::string>>(filepath.string(), OnAppAssemblyFileSystemEvent);
293280
s_Data->AssemblyReloadPending = false;
281+
282+
return true;
294283
}
295284

296285
void ScriptEngine::ReloadAssembly()
@@ -343,10 +332,15 @@ namespace StarEngine {
343332
void ScriptEngine::OnUpdateEntity(Entity entity, Timestep ts)
344333
{
345334
UUID entityUUID = entity.GetUUID();
346-
SE_CORE_ASSERT(s_Data->EntityInstances.find(entityUUID) != s_Data->EntityInstances.end());
347-
348-
Ref<ScriptInstance> instance = s_Data->EntityInstances[entityUUID];
349-
instance->InvokeOnUpdate((float)ts);
335+
if (s_Data->EntityInstances.find(entityUUID) != s_Data->EntityInstances.end())
336+
{
337+
Ref<ScriptInstance> instance = s_Data->EntityInstances[entityUUID];
338+
instance->InvokeOnUpdate((float)ts);
339+
}
340+
else
341+
{
342+
SE_CORE_ERROR("Could not find ScriptInstance for entity {0}", entityUUID);
343+
}
350344
}
351345

352346
Scene* ScriptEngine::GetSceneContext()

StarEngine/src/StarEngine/Scripting/ScriptEngine.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,8 @@ namespace StarEngine {
144144
static void Init();
145145
static void Shutdown();
146146

147-
static void LoadAssembly(const std::filesystem::path& filepath);
148-
static void LoadAppAssembly(const std::filesystem::path& filepath);
147+
static bool LoadAssembly(const std::filesystem::path& filepath);
148+
static bool LoadAppAssembly(const std::filesystem::path& filepath);
149149

150150
static void ReloadAssembly();
151151

0 commit comments

Comments
 (0)