From 00dc3faa194f2957152251798cdcc43ea26a05ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 28 Jul 2023 11:48:01 +0200 Subject: [PATCH] Failed to show and edit script sctruct + SizeInBytes for MonoFields --- .../src/EditWindows/ComponentEditWindow.bf | 94 +++++++++++++++++++ GlitchyEngine/src/Scripting/ScriptClass.bf | 19 +++- GlitchyEngine/src/Scripting/ScriptEngine.bf | 18 +++- GlitchyEngineHelper/src/Mono/Mono.bf | 4 + 4 files changed, 131 insertions(+), 4 deletions(-) diff --git a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf index 9a03817..43ab701 100644 --- a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf +++ b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf @@ -514,11 +514,89 @@ namespace GlitchyEditor.EditWindows scriptInstance.SetFieldValue(scriptField, value); } + T GetData(void* instance, ScriptField scriptField) + { + T data = default; + Mono.mono_field_get_value((.)instance, scriptField.[Friend]_monoField, &data); + + return data; + } + + void GetData(void* instance, ScriptField scriptField, T* data) + { + Mono.mono_field_get_value((.)instance, scriptField.[Friend]_monoField, data); + } + + void SetData(void* instance, ScriptField scriptField, in T value) + { + Mono.mono_field_set_value((.)instance, scriptField.[Friend]_monoField, &value); + } + + void SetData(void* instance, ScriptField scriptField, T* data) + { + Mono.mono_field_set_value((.)instance, scriptField.[Friend]_monoField, data); + } + if (scriptComponent.Instance?.IsInitialized == true) { SharpClass sharpClass = scriptComponent.Instance.ScriptClass; ScriptInstance scriptInstance = scriptComponent.Instance; + /*void DoFunnyStuff(void* instance, SharpType sharpType) + { + for (let (fieldName, scriptField) in sharpType.Fields) + { + var monoField = scriptField.[Friend]_monoField; + + switch (scriptField.FieldType) + { + case .Float: + var value = GetData(instance, scriptField); + if (ImGui.DragScalar(fieldName.ToScopeCStr!(), .Float, &value)) + SetData(instance, scriptField, value); + + case .Struct: + { + var v = Mono.mono_field_get_value_object(ScriptEngine.[Friend]s_AppDomain, scriptField.[Friend]_monoField, (.)instance); + + void* dataPtr = Mono.mono_object_unbox(v); + + Span data = .((.)dataPtr, scriptField.SizeInBytes); + + if (ImGui.CollapsingHeader(fieldName.Ptr)) + { + DoFunnyStuff(dataPtr, scriptField.SharpType); + } + + SetData(instance, scriptField, v); + + //Mono.mono_field_set_value_object(ScriptEngine.[Friend]s_AppDomain, scriptField.[Friend]_monoField, (.)instance); + //uint8* data = ; + + /*uint8[] data = scope .[scriptField.SizeInBytes]; + + GetData(instance, scriptField, data.Ptr); + + if (ImGui.CollapsingHeader(fieldName.Ptr)) + { + DoFunnyStuff(data.Ptr, scriptField.SharpType); + } + + MonoObject* boxed = Mono.mono_value_box(ScriptEngine.[Friend]s_AppDomain, ((SharpClass)scriptField.SharpType).[Friend]_monoClass, data.Ptr); + + SetData(instance, scriptField, boxed);*/ + + //Mono.mono_field_get_value(instance, scriptField.[Friend]_monoField, data.Ptr); + + } + default: + //Log.EngineLogger.Error($"Unhandled field type {scriptField.FieldType}"); + } + } + } + + DoFunnyStuff(scriptInstance.[Friend]_instance, sharpClass);*/ + for (let (fieldName, scriptField) in sharpClass.Fields) { var monoField = scriptField.[Friend]_monoField; @@ -594,6 +672,22 @@ namespace GlitchyEditor.EditWindows // TODO! case .Struct: // TODO! + /*{ + uint8[] data = scope .[scriptField.SizeInBytes]; + + Mono.mono_field_get_value(scriptInstance.[Friend]_instance, scriptField.[Friend]_monoField, data.Ptr); + + //scriptField. + + //scriptInstance.GetFieldValue(); + + //scriptInstance.ScriptClass.Fields[] + /* + var value = GetFieldValue(scriptInstance, scriptField); + if (ImGui.DragScalar(fieldName.ToScopeCStr!(), .Double, &value)) + SetFieldValue(scriptInstance, scriptField, value); + */ + }*/ default: Log.EngineLogger.Error($"Unhandled field type {scriptField.FieldType}"); } diff --git a/GlitchyEngine/src/Scripting/ScriptClass.bf b/GlitchyEngine/src/Scripting/ScriptClass.bf index 20ef6ae..64ab7aa 100644 --- a/GlitchyEngine/src/Scripting/ScriptClass.bf +++ b/GlitchyEngine/src/Scripting/ScriptClass.bf @@ -14,14 +14,16 @@ public struct ScriptField public bool IsStatic; public ScriptFieldType FieldType; public SharpType SharpType; + public int SizeInBytes; - internal this(StringView name, MonoClassField* monoField, bool isStatic, ScriptFieldType fieldType, SharpType sharpType) + internal this(StringView name, MonoClassField* monoField, bool isStatic, ScriptFieldType fieldType, int sizeInBytes, SharpType sharpType) { Name = name; _monoField = monoField; IsStatic = isStatic; FieldType = fieldType; SharpType = sharpType; + SizeInBytes = sizeInBytes; } public bool IsType(SharpClass otherClass, bool checkIfSubtype) @@ -173,7 +175,20 @@ class SharpClass : SharpType (attributes != null && Mono.mono_custom_attrs_has_attr(attributes, ScriptEngine.Attributes.s_ShowInEditorAttribute))) { - _monoFields[name] = .(name, currentField, flags.HasFlag(.Static), fieldType, sharpType); + MonoClass* fieldClass = Mono.mono_type_get_class(type); + + int sizeInBytes = 8; + + if (fieldClass != null) + { + sizeInBytes = Mono.mono_class_instance_size(fieldClass); + } + else + { + + } + + _monoFields[name] = .(name, currentField, flags.HasFlag(.Static), fieldType, sizeInBytes, sharpType); } } } diff --git a/GlitchyEngine/src/Scripting/ScriptEngine.bf b/GlitchyEngine/src/Scripting/ScriptEngine.bf index 1e088cb..22c545a 100644 --- a/GlitchyEngine/src/Scripting/ScriptEngine.bf +++ b/GlitchyEngine/src/Scripting/ScriptEngine.bf @@ -514,10 +514,24 @@ static class ScriptEngine Log.EngineLogger.AssertDebug(scriptClass != null); - for (let (fieldName, field) in scriptClass.Fields) + void AddFieldsToMap(Dictionary classFields, StringView baseName) { - entityFields.Add(new String(fieldName), ScriptFieldInstance(field.FieldType)); + for (let (fieldName, field) in classFields) + { + /*if (field.FieldType == .Struct && field.SharpType != null) + { + AddFieldsToMap(field.SharpType.Fields, scope $"{baseName}{fieldName}."); + } + else + { + entityFields.Add(new $"{baseName}{fieldName}", ScriptFieldInstance(field.FieldType)); + }*/ + + entityFields.Add(new String(fieldName), ScriptFieldInstance(field.FieldType)); + } } + + AddFieldsToMap(scriptClass.Fields, ""); } public static ScriptFieldMap GetScriptFieldMap(Entity entity) diff --git a/GlitchyEngineHelper/src/Mono/Mono.bf b/GlitchyEngineHelper/src/Mono/Mono.bf index 03fd712..3b0b161 100644 --- a/GlitchyEngineHelper/src/Mono/Mono.bf +++ b/GlitchyEngineHelper/src/Mono/Mono.bf @@ -265,6 +265,10 @@ static class Mono [LinkName(.C)] public static extern MonoVTable* mono_class_vtable(MonoDomain* domain, MonoClass* @class); + + + [LinkName(.C)] + public static extern MonoObject* mono_value_box(MonoDomain* domain, MonoClass* klass, gpointer value); } struct MonoDomain;