diff --git a/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf b/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf
new file mode 100644
index 0000000..6d28ae0
--- /dev/null
+++ b/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf
@@ -0,0 +1,37 @@
+using System;
+using Mono;
+using GlitchyEngine.Core;
+
+namespace GlitchyEngine.Scripting;
+
+using internal GlitchyEngine.Scripting;
+
+class EntityEditorWrapper : ScriptClass
+{
+ function void ShowEntityEditorFunc(MonoObject* scriptInstance, MonoException** exception);
+
+ private ShowEntityEditorFunc _showEntityEditorFunc;
+
+ [AllowAppend]
+ public this(StringView classNamespace, StringView className, MonoImage* image) : base(classNamespace, className, image)
+ {
+ _showEntityEditorFunc = (ShowEntityEditorFunc)GetMethodThunk("ShowEntityEditor", 1);
+
+ if (_showEntityEditorFunc == null)
+ {
+ Log.EngineLogger.Error("Entity editor has no show entity editor func.");
+ }
+ }
+
+ public void ShowEntityEditor(ScriptInstance instance, UUID entityId)
+ {
+ MonoException* exception = null;
+
+ _showEntityEditorFunc(instance.MonoInstance, &exception);
+
+ if (exception != null)
+ {
+ ScriptEngine.HandleMonoException(exception, entityId);
+ }
+ }
+}
diff --git a/GlitchyEngine/src/Scripting/ScriptClass.bf b/GlitchyEngine/src/Scripting/ScriptClass.bf
index 464f0f7..bacc290 100644
--- a/GlitchyEngine/src/Scripting/ScriptClass.bf
+++ b/GlitchyEngine/src/Scripting/ScriptClass.bf
@@ -8,40 +8,29 @@ namespace GlitchyEngine.Scripting;
using internal GlitchyEngine.Scripting;
-abstract class SharpType : RefCounter
+class SharpClass : RefCounter
{
- protected String _namespace ~ delete _;
- protected String _className ~ delete _;
- protected String _fullName ~ delete _;
+ protected String _fullName ~ delete:append _;
+
+ protected StringView _namespace;
+ protected StringView _className;
+
+ protected internal MonoClass* _monoClass;
public StringView Namespace => _namespace;
public StringView ClassName => _className;
public StringView FullName => _fullName;
-
- public this(StringView classNamespace, StringView className)
- {
- _namespace = new String(classNamespace);
- _className = new String(className);
- _fullName = new $"{_namespace}.{_className}";
- }
-}
-class SharpClass : SharpType
-{
- protected internal MonoClass* _monoClass;
-
- public this(StringView classNamespace, StringView className, MonoImage* image) :
- base(classNamespace, className)
+ [AllowAppend]
+ public this(StringView classNamespace, StringView className, MonoImage* image)
{
- _monoClass = Mono.mono_class_from_name(image, _namespace, _className);
+ String fullName = append $"{classNamespace}.{className}";
- Log.EngineLogger.AssertDebug(_monoClass != null);
- }
-
- internal this(MonoClass* monoClass) :
- base(StringView(Mono.mono_class_get_namespace(monoClass)), StringView(Mono.mono_class_get_name(monoClass)))
- {
- _monoClass = monoClass;
+ _fullName = fullName;
+ _namespace = _fullName.Substring(0, classNamespace.Length);
+ _className = _fullName.Substring(classNamespace.Length + 1);
+
+ _monoClass = Mono.mono_class_from_name(image, _namespace.ToScopeCStr!(), _className.ToScopeCStr!());
Log.EngineLogger.AssertDebug(_monoClass != null);
}
diff --git a/GlitchyEngine/src/Scripting/ScriptEngine.bf b/GlitchyEngine/src/Scripting/ScriptEngine.bf
index da376b9..f14f28a 100644
--- a/GlitchyEngine/src/Scripting/ScriptEngine.bf
+++ b/GlitchyEngine/src/Scripting/ScriptEngine.bf
@@ -20,7 +20,7 @@ class EngineClasses
private ScriptClass s_EntityRoot ~ _?.ReleaseRef();
private ScriptClass s_EngineObject ~ _?.ReleaseRef();
- private ScriptClass s_EntityEditor ~ _?.ReleaseRef();
+ private EntityEditorWrapper s_EntityEditor ~ _?.ReleaseRef();
private ScriptClass s_EntitySerializer ~ _?.ReleaseRef();
private ScriptClass s_SerializationContext ~ _?.ReleaseRef();
@@ -33,7 +33,7 @@ class EngineClasses
public ScriptClass EntityRoot => s_EntityRoot;
public ScriptClass EngineObject => s_EngineObject;
- public ScriptClass EntityEditor => s_EntityEditor;
+ public EntityEditorWrapper EntityEditor => s_EntityEditor;
public ScriptClass EntitySerializer => s_EntitySerializer;
@@ -61,19 +61,19 @@ class EngineClasses
{
ReleaseAndNullify();
- s_EngineObject = new ScriptClass("GlitchyEngine.Core", "EngineObject", image, .Class);
- s_EntityRoot = new ScriptClass("GlitchyEngine", "Entity", image, .Entity);
- s_ComponentRoot = new ScriptClass("GlitchyEngine.Core", "Component", image, .Component);
+ s_EngineObject = new ScriptClass("GlitchyEngine.Core", "EngineObject", image);
+ s_EntityRoot = new ScriptClass("GlitchyEngine", "Entity", image);
+ s_ComponentRoot = new ScriptClass("GlitchyEngine.Core", "Component", image);
// Editor classes
- s_EntityEditor = new ScriptClass("GlitchyEngine.Editor", "EntityEditor", image, .Class);
+ s_EntityEditor = new EntityEditorWrapper("GlitchyEngine.Editor", "EntityEditor", image);
- s_EntitySerializer = new ScriptClass("GlitchyEngine.Serialization", "EntitySerializer", image, .Class);
+ s_EntitySerializer = new ScriptClass("GlitchyEngine.Serialization", "EntitySerializer", image);
- s_Collision2D = new ScriptClass("GlitchyEngine.Physics", "Collision2D", image, .Struct);
+ s_Collision2D = new ScriptClass("GlitchyEngine.Physics", "Collision2D", image);
// Attributes
- s_RunInEditModeAttribute = new ScriptClass("GlitchyEngine.Editor", "RunInEditModeAttribute", image, .Struct);
+ s_RunInEditModeAttribute = new ScriptClass("GlitchyEngine.Editor", "RunInEditModeAttribute", image);
}
}
@@ -116,7 +116,7 @@ static class ScriptEngine
private static FileSystemWatcher _userAssemblyWatcher ~ delete _;
// TODO: This should be a global setting somewhere
- private static bool _debuggingEnabled = true;
+ private static bool _debuggingEnabled = false;
private static String _appAssemblyPath = new .() ~ delete _;
@@ -471,7 +471,7 @@ static class ScriptEngine
// Check if it is an entity
if (monoClass != null && Mono.mono_class_is_subclass_of(monoClass, Classes.EntityRoot.[Friend]_monoClass, false))
{
- ScriptClass entityScript = new ScriptClass(StringView(nameSpace), StringView(name), s_AppAssemblyImage, .Entity);
+ ScriptClass entityScript = new ScriptClass(StringView(nameSpace), StringView(name), s_AppAssemblyImage);
_entityScripts.Add(entityScript.FullName, entityScript);
Log.EngineLogger.Info($"Added entity \"{entityScript.FullName}\"");
@@ -579,20 +579,8 @@ static class ScriptEngine
{
if (scriptComponent.Instance == null)
return;
-
- ScriptClass scriptClass = ScriptEngine.GetScriptClass(scriptComponent.ScriptClassName);
-
- if (scriptClass == null)
- return;
-
- let entityId = entity.UUID;
-
-#unwarn
- void*[1] args = .(&entityId);
-
- let method = Classes.EntityEditor.GetMethod("ShowDefaultEntityEditor", 1);
-
- Classes.EntityEditor.Invoke(method, null, &args);
+
+ Classes.EntityEditor.ShowEntityEditor(scriptComponent.Instance, entity.UUID);
}
/// Serializes all script instances
diff --git a/ScriptCore/Editor/EntityEditor.cs b/ScriptCore/Editor/EntityEditor.cs
index 97ad5aa..255cbd8 100644
--- a/ScriptCore/Editor/EntityEditor.cs
+++ b/ScriptCore/Editor/EntityEditor.cs
@@ -146,16 +146,17 @@ internal class EntityEditor
return false;
}
- public static void ShowDefaultEntityEditor(UUID entityId)
+ ///
+ /// Entry point for the engine to show the editor for the given script instance.
+ ///
+ /// The script instance to show the editor for.
+ internal static void ShowEntityEditor(Entity? scriptInstance)
{
+ if (scriptInstance == null)
+ return;
+
// TODO: Call custom editors here!
-
- ScriptGlue.Entity_GetScriptInstance(entityId, out object? instance);
-
- if (instance != null)
- {
- ShowEditor(instance.GetType(), instance);
- }
+ ShowEditor(scriptInstance.GetType(), scriptInstance);
}
private static T? GetAttribute(IEnumerable? attributes) where T : Attribute