diff --git a/GlitchyEngine/src/Scripting/CoreClrHelper.bf b/GlitchyEngine/src/Scripting/CoreClrHelper.bf index 3d1d6cd..a879077 100644 --- a/GlitchyEngine/src/Scripting/CoreClrHelper.bf +++ b/GlitchyEngine/src/Scripting/CoreClrHelper.bf @@ -7,9 +7,9 @@ namespace GlitchyEngine.Scripting; public struct ScriptFunctionPointers { - public function void() OnCreate; - public function void(float) OnUpdate; - public function void() OnDestroy; + public function void(UUID entityId) OnCreate; + public function void(UUID entityId, float deltaTime) OnUpdate; + public function void(UUID entityId, bool callEntity) OnDestroy; } static class CoreClrHelper @@ -39,7 +39,7 @@ static class CoreClrHelper private function void ThrowExceptionFunc(char8* message); static ThrowExceptionFunc _throwException; - private function void RegisterComponentTypeFunc(StringView fullComponentTypeName, function void(UUID entityId) addComponent, function bool(UUID entityId) hasComponent, function void(UUID entityId) removeComponent); + private function void RegisterComponentTypeFunc(char8* fullComponentTypeName, function void(UUID entityId) addComponent, function bool(UUID entityId) hasComponent, function void(UUID entityId) removeComponent); static RegisterComponentTypeFunc _registerComponentType; public static ScriptFunctionPointers _entityScriptFunctions; @@ -180,7 +180,8 @@ static class CoreClrHelper return rc; } - public static int GetFunctionPointerUnmanagedCallersOnly(StringView typeName, StringView methodName, out T outDelegate) where T: operator explicit void* + + public static Result GetFunctionPointerUnmanagedCallersOnly(StringView typeName, StringView methodName, out T outDelegate) where T: operator explicit void* { void* funPtr = null; @@ -189,7 +190,10 @@ static class CoreClrHelper outDelegate = (T)funPtr; - return rc; + if (rc == 0) + return .Ok; + + return .Err(rc); } public static void ThrowException(StringView message) @@ -199,6 +203,6 @@ static class CoreClrHelper public static void RegisterComponent(StringView fullComponentTypeName, function void(UUID entityId) addComponent, function bool(UUID entityId) hasComponent, function void(UUID entityId) removeComponent) { - _registerComponentType(fullComponentTypeName, addComponent, hasComponent, removeComponent); + _registerComponentType(fullComponentTypeName.Ptr, addComponent, hasComponent, removeComponent); } } \ No newline at end of file diff --git a/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf b/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf index 88aaf42..e134c0e 100644 --- a/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf +++ b/GlitchyEngine/src/Scripting/EntityEditorWrapper.bf @@ -14,7 +14,7 @@ class EntityEditorWrapper : NewScriptClass private ShowEntityEditorFunc _showEntityEditorFunc; [AllowAppend] - public this() : base(FullName, .Empty, .None, false) + public this() : base("GlitchyEngine.ScriptGlue.ShowEntityEditor", .Empty, .None, false) { CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "ShowEntityEditor", out _showEntityEditorFunc); diff --git a/GlitchyEngine/src/Scripting/EntitySerializerWrapper.bf b/GlitchyEngine/src/Scripting/EntitySerializerWrapper.bf index 5478886..3bd64e0 100644 --- a/GlitchyEngine/src/Scripting/EntitySerializerWrapper.bf +++ b/GlitchyEngine/src/Scripting/EntitySerializerWrapper.bf @@ -1,5 +1,4 @@ using System; -using Mono; using GlitchyEngine.Core; using GlitchyEngine.Serialization; @@ -7,19 +6,19 @@ namespace GlitchyEngine.Scripting; using internal GlitchyEngine.Scripting; -class EntitySerializerWrapper : ScriptClass +class EntitySerializerWrapper : NewScriptClass { - function void CreateSerializationContextMethod(void* serializerPtr, MonoException** exception); - function void ClearSerializationContextMethod(void* serializerPtr, MonoException** exception); - function void DestroySerializationContextMethod(void* serializerPtr, MonoException** exception); + function void CreateSerializationContextMethod(void* serializerPtr); + //function void ClearSerializationContextMethod(void* serializerPtr); + function void DestroySerializationContextMethod(void* serializerPtr); - function void SerializeMethod(MonoObject* entity, void* serializedObjPtr, void* serializerPtr, MonoException** exception); - function void DeserializeMethod(MonoObject* entity, void* serializedObjPtr, void* serializerPtr, MonoException** exception); - function void SerializeStaticMethod(MonoReflectionType* type, void* serializedObjPtr, void* serializerPtr, MonoException** exception); - function void DeserializeStaticMethod(MonoReflectionType* type, void* serializedObjPtr, void* serializerPtr, MonoException** exception); + function void SerializeMethod(UUID entityId, void* serializedObjPtr, void* serializerPtr); + function void DeserializeMethod(UUID entityId, void* serializedObjPtr, void* serializerPtr); + function void SerializeStaticMethod(char8* fullTypeName, void* serializedObjPtr, void* serializerPtr); + function void DeserializeStaticMethod(char8* fullTypeName, void* serializedObjPtr, void* serializerPtr); private CreateSerializationContextMethod _createSerializationContextMethod; - private ClearSerializationContextMethod _clearSerializationContextMethod; + //private ClearSerializationContextMethod _clearSerializationContextMethod; private DestroySerializationContextMethod _destroySerializationContextMethod; private SerializeMethod _serializeMethod; @@ -28,70 +27,24 @@ class EntitySerializerWrapper : ScriptClass private DeserializeStaticMethod _deserializeStaticMethod; [AllowAppend] - public this(StringView classNamespace, StringView className, MonoImage* image) : base(classNamespace, className, image) + public this() : base("GlitchyEngine.Serialization.EntitySerializer", .Empty, .None, false) { - _serializeMethod = (SerializeMethod)GetMethodThunk("Serialize", 3); - - if (_serializeMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"Serialize\" method."); - } - - _deserializeMethod = (DeserializeMethod)GetMethodThunk("Deserialize", 3); - - if (_serializeMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"Deserialize\" method."); - } - - _serializeStaticMethod = (SerializeStaticMethod)GetMethodThunk("SerializeStaticFields", 3); - - if (_serializeStaticMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"SerializeStaticStatic\" method."); - } - - _deserializeStaticMethod = (SerializeStaticMethod)GetMethodThunk("DeserializeStaticFields", 3); - - if (_deserializeStaticMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"DeserializeStaticStatic\" method."); - } - - _createSerializationContextMethod = (CreateSerializationContextMethod)GetMethodThunk("CreateSerializationContext", 1); - - if (_createSerializationContextMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"CreateSerializationContext\" method."); - } - - _clearSerializationContextMethod = (ClearSerializationContextMethod)GetMethodThunk("ClearSerializationContext", 1); - - if (_clearSerializationContextMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"ClearSerializationContext\" method."); - } - - _destroySerializationContextMethod = (DestroySerializationContextMethod)GetMethodThunk("DestroySerializationContext", 1); - - if (_destroySerializationContextMethod == null) - { - Log.EngineLogger.Error("EntitySerializer has no \"DestroySerializationContext\" method."); - } + CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "CreateSerializationContext", out _createSerializationContextMethod); + CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "DestroySerializationContext", out _destroySerializationContextMethod); + CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "EntitySerializer_Serialize", out _serializeMethod); + CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "EntitySerializer_Deserialize", out _deserializeMethod); + CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "EntitySerializer_SerializeStaticFields", out _serializeStaticMethod); + CoreClrHelper.GetFunctionPointerUnmanagedCallersOnly("GlitchyEngine.ScriptGlue, ScriptCore", "EntitySerializer_DeserializeStaticFields", out _deserializeStaticMethod); } public void CreateSerializationContext(ScriptInstanceSerializer serializer) { void* serializerPtr = Internal.UnsafeCastToPtr(serializer); - MonoException* exception = null; - _createSerializationContextMethod(serializerPtr, &exception); - - if (exception != null) - ScriptEngine.[Friend]HandleMonoException(exception, null); + _createSerializationContextMethod(serializerPtr); } - public void ClearSerializationContext(ScriptInstanceSerializer serializer) + /*public void ClearSerializationContext(ScriptInstanceSerializer serializer) { void* serializerPtr = Internal.UnsafeCastToPtr(serializer); @@ -100,70 +53,44 @@ class EntitySerializerWrapper : ScriptClass if (exception != null) ScriptEngine.[Friend]HandleMonoException(exception, null); - } + }*/ public void DestroySerializationContext(ScriptInstanceSerializer serializer) { void* serializerPtr = Internal.UnsafeCastToPtr(serializer); - MonoException* exception = null; - _destroySerializationContextMethod(serializerPtr, &exception); - - if (exception != null) - ScriptEngine.[Friend]HandleMonoException(exception, null); + _destroySerializationContextMethod(serializerPtr); } - public void Serialize(ScriptInstance instance, SerializedObject serializedObject) + public void Serialize(NewScriptInstance instance, SerializedObject serializedObject) { void* serializedObjectPtr = Internal.UnsafeCastToPtr(serializedObject); void* serializerPtr = Internal.UnsafeCastToPtr(serializedObject.Serializer); - MonoException* exception = null; - _serializeMethod(instance.[Friend]_instance, serializedObjectPtr, serializerPtr, &exception); - - if (exception != null) - ScriptEngine.[Friend]HandleMonoException(exception, instance); + _serializeMethod(instance.EntityId, serializedObjectPtr, serializerPtr); } - public void SerializeStatic(ScriptClass @class, SerializedObject serializedObject) + public void SerializeStatic(NewScriptClass @class, SerializedObject serializedObject) { void* serializedObjectPtr = Internal.UnsafeCastToPtr(serializedObject); void* serializerPtr = Internal.UnsafeCastToPtr(serializedObject.Serializer); - MonoType* type = Mono.mono_class_get_type(@class.[Friend]_monoClass); - MonoReflectionType* reflectionType = Mono.mono_type_get_object(ScriptEngine.[Friend]s_AppDomain, type); - - MonoException* exception = null; - _serializeStaticMethod(reflectionType, serializedObjectPtr, serializerPtr, &exception); - - if (exception != null) - ScriptEngine.[Friend]HandleMonoException(exception, null); + _serializeStaticMethod(@class.FullName.CStr(), serializedObjectPtr, serializerPtr); } - public void Deserialize(ScriptInstance instance, SerializedObject serializedObject) + public void Deserialize(NewScriptInstance instance, SerializedObject serializedObject) { void* serializedObjectPtr = Internal.UnsafeCastToPtr(serializedObject); void* serializerPtr = Internal.UnsafeCastToPtr(serializedObject.Serializer); - MonoException* exception = null; - _deserializeMethod(instance.[Friend]_instance, serializedObjectPtr, serializerPtr, &exception); - - if (exception != null) - ScriptEngine.[Friend]HandleMonoException(exception, instance); + _deserializeMethod(instance.EntityId, serializedObjectPtr, serializerPtr); } - public void DeserializeStatic(ScriptClass @class, SerializedObject serializedObject) + public void DeserializeStatic(NewScriptClass @class, SerializedObject serializedObject) { void* serializedObjectPtr = Internal.UnsafeCastToPtr(serializedObject); void* serializerPtr = Internal.UnsafeCastToPtr(serializedObject.Serializer); - MonoType* type = Mono.mono_class_get_type(@class.[Friend]_monoClass); - MonoReflectionType* reflectionType = Mono.mono_type_get_object(ScriptEngine.[Friend]s_AppDomain, type); - - MonoException* exception = null; - _deserializeStaticMethod(reflectionType, serializedObjectPtr, serializerPtr, &exception); - - if (exception != null) - ScriptEngine.[Friend]HandleMonoException(exception, null); + _deserializeStaticMethod(@class.FullName.CStr(), serializedObjectPtr, serializerPtr); } } diff --git a/GlitchyEngine/src/Scripting/NewScriptClass.bf b/GlitchyEngine/src/Scripting/NewScriptClass.bf index 3e31fe1..8510665 100644 --- a/GlitchyEngine/src/Scripting/NewScriptClass.bf +++ b/GlitchyEngine/src/Scripting/NewScriptClass.bf @@ -72,13 +72,13 @@ class NewScriptInstance : RefCounter public void InvokeOnCreate() { if (_scriptClass.Methods.HasFlag(.OnCreate)) - CoreClrHelper._entityScriptFunctions.OnCreate(); + CoreClrHelper._entityScriptFunctions.OnCreate(_entityId); } public void InvokeOnUpdate(float deltaTime) { if (_scriptClass.Methods.HasFlag(.OnUpdate)) - CoreClrHelper._entityScriptFunctions.OnUpdate(deltaTime); + CoreClrHelper._entityScriptFunctions.OnUpdate(_entityId, deltaTime); } public void Destroy() @@ -86,10 +86,11 @@ class NewScriptInstance : RefCounter if (!IsInitialized) return; - if (_scriptClass.Methods.HasFlag(.OnDestroy) && (ScriptEngine.ApplicationInfo.IsInPlayMode || ScriptClass.RunInEditMode)) + /*if (_scriptClass.Methods.HasFlag(.OnDestroy) && (ScriptEngine.ApplicationInfo.IsInPlayMode || ScriptClass.RunInEditMode)) { CoreClrHelper._entityScriptFunctions.OnDestroy(); - } + }*/ + CoreClrHelper._entityScriptFunctions.OnDestroy(_entityId, (ScriptEngine.ApplicationInfo.IsInPlayMode || ScriptClass.RunInEditMode)); IsInitialized = false; diff --git a/GlitchyEngine/src/Scripting/ScriptClass.bf b/GlitchyEngine/src/Scripting/ScriptClass.bf deleted file mode 100644 index f77acc3..0000000 --- a/GlitchyEngine/src/Scripting/ScriptClass.bf +++ /dev/null @@ -1,245 +0,0 @@ -using Mono; -using System; -using GlitchyEngine.Core; -using System.Collections; -using GlitchyEngine.Scripting.Classes; - -namespace GlitchyEngine.Scripting; - -using internal GlitchyEngine.Scripting; - -class SharpClass : RefCounter -{ - protected String _fullName ~ delete _; // TODO APPEND - - protected StringView _namespace; - protected StringView _className; - - protected internal MonoClass* _monoClass; - - public StringView Namespace => _namespace; - public StringView ClassName => _className; - public StringView FullName => _fullName; - - [AllowAppend] - public this(StringView classNamespace, StringView className, MonoImage* image) - { - // TODO APPEND - String fullName = new String(classNamespace.Length + 1 + className.Length); - //append $"{classNamespace}.{className}"; - fullName.AppendF($"{classNamespace}.{className}"); - - _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); - } -} - -class ScriptClass : SharpClass -{ - typealias OnCreateMethod = function MonoObject*(MonoObject* instance, MonoException** exception); - typealias OnUpdateMethod = function MonoObject*(MonoObject* instance, float deltaTime, MonoException** exception); - typealias OnDestroyMethod = function MonoObject*(MonoObject* instance, MonoException** exception); - - private bool _runInEditMode; - - private MonoMethod* _constructor; - - private OnCreateMethod _onCreate; - private OnUpdateMethod _onUpdate; - private OnDestroyMethod _onDestroy; - - private function [CallingConvention(.Cdecl)] MonoObject*(MonoObject* instance, MonoObject* collision2d, MonoException** exception) _onCollisionEnter2D; - private function [CallingConvention(.Cdecl)] MonoObject*(MonoObject* instance, MonoObject* collision2d, MonoException** exception) _onCollisionLeave2D; - - public bool HasCollisionEnter2D => _onCollisionEnter2D != null; - public bool HasCollisionLeave2D => _onCollisionLeave2D != null; - - public bool RunInEditMode => _runInEditMode; - - [AllowAppend] - public this(StringView classNamespace, StringView className, MonoImage* image) : - base(classNamespace, className, image) - { - _constructor = FindConstructor(); - _onCreate = (OnCreateMethod)GetMethodThunk("OnCreate"); - _onUpdate = (OnUpdateMethod)GetMethodThunk("OnUpdate", 1); - _onDestroy = (OnDestroyMethod)GetMethodThunk("OnDestroy"); - _onCollisionEnter2D = (.)GetMethodThunk("OnCollisionEnter2D", 1); - _onCollisionLeave2D = (.)GetMethodThunk("OnCollisionLeave2D", 1); - - DetermineRunInEditMode(); - } - - /// Determines whether or not scripts of this class will be executed in edit mode. - private void DetermineRunInEditMode() - { - // TODO: This is only relevant for the editor! - MonoCustomAttrInfo* attributes = Mono.mono_custom_attrs_from_class(_monoClass); - - //if (attributes != null && ScriptEngine.Classes.RunInEditModeAttribute != null) - // _runInEditMode = Mono.mono_custom_attrs_has_attr(attributes, ScriptEngine.Classes.RunInEditModeAttribute._monoClass); - } - - private MonoMethod* FindConstructor() - { - MonoMethod* constructor = null; - - MonoMethodDesc* constructorDesc = Mono.mono_method_desc_new(":.ctor(GlitchyEngine.Core.UUID)", true); - - // Entities usually don't have a constructor that takes the UUID, so we have to look for it in the parents. - for (MonoClass* @class = _monoClass; @class != null; @class = Mono.mono_class_get_parent(@class)) - { - constructor = Mono.mono_method_desc_search_in_class(constructorDesc, @class); - - if (constructor != null) - break; - } - - Mono.mono_method_desc_free(constructorDesc); - - return constructor; - } - - private void CallConstructorChain(MonoObject* instance, UUID uuid, out MonoException* exception) - { - exception = null; - - if (_constructor == null) - return; - -#unwarn - void*[1] args = void*[](&uuid); - - Mono.mono_runtime_invoke(_constructor, instance, &args, (.)&exception); - } - - public void OnCreate(MonoObject* instance, out MonoException* exception) - { - exception = null; - - if (_onCreate != null) - _onCreate(instance, &exception); - } - - public void OnUpdate(MonoObject* instance, float deltaTime, out MonoException* exception) - { - exception = null; - - if (_onUpdate != null) - _onUpdate(instance, deltaTime, &exception); - } - - public void OnDestroy(MonoObject* instance, out MonoException* exception) - { - exception = null; - - if (_onDestroy != null) - _onDestroy(instance, &exception); - } - - public void OnCollisionEnter2D(MonoObject* instance, Collision2D collision, out MonoException* exception) - { - exception = null; - - if (_onCollisionEnter2D != null) - { - //MonoObject* monoObject = ScriptEngine.Classes.Collision2D.BoxValue(collision); - //_onCollisionEnter2D(instance, monoObject, &exception); - } - } - - public void OnCollisionLeave2D(MonoObject* instance, Collision2D collision, out MonoException* exception) - { - exception = null; - - if (_onCollisionEnter2D != null) - { - //MonoObject* monoObject = ScriptEngine.Classes.Collision2D.BoxValue(collision); - //_onCollisionLeave2D(instance, monoObject, &exception); - } - } - - public MonoObject* CreateInstance(UUID uuid, out MonoException* exception) - { - MonoObject* instance = Mono.mono_object_new(ScriptEngine.[Friend]s_AppDomain, _monoClass); - - // Invoke empty constructor to initialize fields with default values specified in the script itself - Mono.mono_runtime_object_init(instance); - - // Invoke UUID Constructors: - CallConstructorChain(instance, uuid, out exception); - - // Invoke constructor with UUID -//#unwarn - //ScriptEngine.[Friend]s_EngineObject.Invoke(ScriptEngine.[Friend]s_EngineObject._constructor, instance, out exception, &uuid); - - return instance; - } - - public MonoObject* CreateInstance() - { - MonoObject* instance = Mono.mono_object_new(ScriptEngine.[Friend]s_AppDomain, _monoClass); - - // Invoke empty constructor to fill fields - Mono.mono_runtime_object_init(instance); - - return instance; - } - - public MonoMethod* GetMethod(StringView name, int argCount = 0) - { - return Mono.mono_class_get_method_from_name(_monoClass, name.ToScopeCStr!(), argCount); - } - - public void* GetMethodThunk(StringView name, int argCount = 0) - { - MonoMethod* method = GetMethod(name, argCount); - - if (method == null) - return null; - - return Mono.mono_method_get_unmanaged_thunk(method); - } - - public MonoObject* Invoke(MonoMethod* method, MonoObject* instance, void** args = null) - { - MonoObject* exception = null; - - MonoObject* result = Mono.mono_runtime_invoke(method, instance, args, &exception); - - if (exception != null) - ScriptEngine.HandleMonoException((MonoException*)exception); - - return result; - } - - public MonoObject* Invoke(MonoMethod* method, MonoObject* instance, out MonoException* exception, params void*[] args) - { - exception = null; - - MonoObject* result = Mono.mono_runtime_invoke(method, instance, args.Ptr, (.)&exception); - - return result; - } - - public T Invoke(MonoMethod* method, MonoObject* instance, params void*[] args) - { - MonoObject* object = Invoke(method, instance, args.Ptr); - return *(T*)Mono.mono_object_unbox(object); - } - - public MonoObject* BoxValue(in T value) - { - return Mono.mono_value_box(ScriptEngine.[Friend]s_AppDomain, _monoClass, &value); - } - - public MonoObject* BoxValue(void* value) - { - return Mono.mono_value_box(ScriptEngine.[Friend]s_AppDomain, _monoClass, value); - } -} diff --git a/GlitchyEngine/src/Scripting/ScriptEngine.bf b/GlitchyEngine/src/Scripting/ScriptEngine.bf index 5215cd8..32d3699 100644 --- a/GlitchyEngine/src/Scripting/ScriptEngine.bf +++ b/GlitchyEngine/src/Scripting/ScriptEngine.bf @@ -1,4 +1,3 @@ -using Mono; using System; using System.IO; using System.Collections; @@ -54,7 +53,7 @@ class EngineClasses DeleteAndNullify!(s_EntityEditor); - ReleaseRefAndNullify!(s_EntitySerializer); + DeleteAndNullify!(s_EntitySerializer); //ReleaseRefAndNullify!(s_SerializationContext); DeleteAndNullify!(s_Collision2D); @@ -73,7 +72,7 @@ class EngineClasses // Editor classes s_EntityEditor = new EntityEditorWrapper(); - //s_EntitySerializer = new EntitySerializerWrapper("GlitchyEngine.Serialization", "EntitySerializer"); + s_EntitySerializer = new EntitySerializerWrapper(); s_Collision2D = new NewScriptClass("GlitchyEngine.Physics.Collision2D", .Empty, .None); @@ -84,15 +83,6 @@ class EngineClasses static class ScriptEngine { - private static MonoDomain* s_RootDomain; - private static MonoDomain* s_AppDomain; - - private static MonoAssembly* s_CoreAssembly; - private static MonoImage* s_CoreAssemblyImage; - - private static MonoAssembly* s_AppAssembly; - private static MonoImage* s_AppAssemblyImage; - private static Scene s_Context ~ _?.ReleaseRef(); private static EngineClasses _classes = new .() ~ delete _; @@ -286,9 +276,12 @@ static class ScriptEngine static void LoadScriptAssemblies() { Debug.Profiler.ProfileFunction!(); + + // TODO: We should probably verify, that all required types actually exist. + Classes.LoadClasses(); ScriptGlue.Init(); - + // TODO: Check if files exist if (File.Exists(_appAssemblyPath)) { @@ -415,9 +408,6 @@ static class ScriptEngine { Debug.Profiler.ProfileFunction!(); - // TODO: We should probably verify, that all required types actually exist. - Classes.LoadClasses(); - CoreClrHelper.GetScriptClasses(let data, let entryCount); Span scriptClasses = .((.)data, entryCount); @@ -459,8 +449,7 @@ static class ScriptEngine { Debug.Profiler.ProfileScope!("Initialize Instances"); - Log.EngineLogger.Error("Recreating and copying instances (ReloadAssemblies) not updated yet."); - /*// We need to create a new instance for every entity + // We need to create a new instance for every entity for (let (id, scriptInstance) in _entityScriptInstances) { if (Context.GetEntityByID(id) case .Ok(let entity)) @@ -472,7 +461,7 @@ static class ScriptEngine { Log.EngineLogger.AssertDebug(false, "Entities script was just serialized but the entity doesn't exist anymore."); } - }*/ + } } contextSerializer.DeserializeScriptInstances(); @@ -491,8 +480,9 @@ static class ScriptEngine s_RootDomain = null;*/ } + // TODO: Do we still need this? It was only called by ScriptGlue /// Returns the script instance or null. - public static MonoObject* GetManagedInstance(UUID entityId) + public static void* GetManagedInstance(UUID entityId) { //if (_entityScriptInstances.TryGetValue(entityId, let scriptInstance)) // return scriptInstance.MonoInstance; @@ -507,11 +497,6 @@ static class ScriptEngine return scriptClass; } - internal static void HandleException() - { - - } - internal static void LogScriptException(ScriptException exception, UUID entityId) { String entityInfo = scope .(); @@ -530,13 +515,8 @@ static class ScriptEngine Log.ClientLogger.Error($"Mono Exception \"{exception.FullName}\": \"{exception.Message}\"{entityInfo}\nStackTrace:\n{exception.StackTrace}", exception); } - - // TODO: This can go soon? - internal static void HandleMonoException(MonoException* exception, ScriptInstance sourceInstance = null) - { - //LogScriptException(exception, sourceInstance?.EntityId ?? .Zero); - } + // TODO: Wrap like the other classes public static void ShowScriptEditor(Entity entity, ScriptComponent* scriptComponent) { if (scriptComponent.Instance == null) diff --git a/GlitchyEngine/src/Scripting/ScriptGlue.bf b/GlitchyEngine/src/Scripting/ScriptGlue.bf index a0477da..aabf082 100644 --- a/GlitchyEngine/src/Scripting/ScriptGlue.bf +++ b/GlitchyEngine/src/Scripting/ScriptGlue.bf @@ -372,10 +372,6 @@ struct EngineFunctions static class ScriptGlue { - /*private static Dictionary s_AddComponentMethods = new .() ~ delete _; - private static Dictionary s_HasComponentMethods = new .() ~ delete _; - private static Dictionary s_RemoveComponentMethods = new .() ~ delete _;*/ - /* Adding this attribute to a method will log method entry and returned Result errors */ [AttributeUsage(.Method)] struct RegisterMethodAttribute : Attribute, IOnMethodInit @@ -408,9 +404,6 @@ static class ScriptGlue public static Event OnRegisterNativeCalls ~ _.Dispose(); - /*private function void SetEngineFunctions(EngineFunctions* engineFunctions); - private static SetEngineFunctions _setEngineFunctions;*/ - private function void SetEngineFunctions(EngineFunctions* engineFunctions); private static SetEngineFunctions _setEngineFunctions; @@ -423,17 +416,13 @@ static class ScriptGlue RegisterCalls(); - //RegisterMathFunctions(); + RegisterManagedComponents(); } public static void RegisterManagedComponents() { Debug.Profiler.ProfileFunction!(); - /*s_AddComponentMethods.Clear(); - s_HasComponentMethods.Clear(); - s_RemoveComponentMethods.Clear();*/ - RegisterComponent(); RegisterComponent(); RegisterComponent(); @@ -459,12 +448,10 @@ static class ScriptGlue private static void RegisterComponent() where T : struct, new { - Log.EngineLogger.Error("ScriptGlue::RegisterComponent not updated yet."); - String fullComponentTypeName = scope String(); typeof(T).GetFullName(fullComponentTypeName); - CoreClrHelper.RegisterComponent(fullComponentTypeName, + CoreClrHelper.RegisterComponent(fullComponentTypeName..EnsureNullTerminator(), addComponent: (entityId) => { Entity entity = GetEntitySafe(entityId); entity.AddComponent(); @@ -1550,6 +1537,8 @@ static class ScriptGlue Log.EngineLogger.AssertDebug(context != null); + Log.EngineLogger.Trace(StringView(fieldName)); + context.AddField(StringView(fieldName), type, valueObject, StringView(fullTypeName)); } diff --git a/GlitchyEngine/src/Scripting/ScriptInstance.bf b/GlitchyEngine/src/Scripting/ScriptInstance.bf deleted file mode 100644 index 4dabab6..0000000 --- a/GlitchyEngine/src/Scripting/ScriptInstance.bf +++ /dev/null @@ -1,136 +0,0 @@ -using Mono; -using GlitchyEngine.Core; -using System; -using GlitchyEngine.Scripting.Classes; - -namespace GlitchyEngine.Scripting; - -using internal GlitchyEngine.Scripting; - -class ScriptInstance : RefCounter -{ - private ScriptClass _scriptClass; - - private MonoObject* _instance; - private uint32 _gcHandle; - - private UUID _entityId; - - public ScriptClass ScriptClass => _scriptClass; - - /// Gets whether or not the instance has ben initialized. - public bool IsInitialized => _instance != null; - - /// Gets whether or not the Create-Method of this instance has been called before. - public bool IsCreated => _isCreated; - - private bool _isCreated = false; - - internal MonoObject* MonoInstance => _instance; - - public UUID EntityId => _entityId; - - public this(UUID entityId, ScriptClass scriptClass) - { - Log.EngineLogger.AssertDebug(scriptClass != null); - - _entityId = entityId; - _scriptClass = scriptClass..AddRef(); - } - - private ~this() - { - Destroy(); - _scriptClass?.ReleaseRef(); - } - - public void Destroy() - { - if (_instance != null) - { - if (ScriptEngine.ApplicationInfo.IsInPlayMode || ScriptClass.RunInEditMode) - { - InvokeOnDestroy(); - } - - Mono.mono_gchandle_free(_gcHandle); - _instance = null; - - ScriptEngine.UnregisterScriptInstance(_entityId); - } - } - - public void Instantiate(UUID uuid) - { - _instance = _scriptClass.CreateInstance(uuid, let exception); - _gcHandle = Mono.mono_gchandle_new(_instance, true); - - if (exception != null) - ScriptEngine.HandleMonoException(exception, this); - } - - public void InvokeOnCreate() - { - _scriptClass.OnCreate(_instance, let exception); - _isCreated = true; - - if (exception != null) - ScriptEngine.HandleMonoException(exception, this); - } - - public void InvokeOnUpdate(float deltaTime) - { - _scriptClass.OnUpdate(_instance, deltaTime, let exception); - - if (exception != null) - ScriptEngine.HandleMonoException(exception, this); - } - - public void InvokeOnDestroy() - { - _scriptClass.OnDestroy(_instance, let exception); - - if (exception != null) - ScriptEngine.HandleMonoException(exception, this); - } - - public void InvokeOnCollisionEnter2D(Collision2D collision) - { - if (!_scriptClass.HasCollisionEnter2D) - return; - - _scriptClass.OnCollisionEnter2D(_instance, collision, let exception); - - if (exception != null) - ScriptEngine.HandleMonoException(exception, this); - } - - public void InvokeOnCollisionLeave2D(Collision2D collision) - { - if (!_scriptClass.HasCollisionLeave2D) - return; - - _scriptClass.OnCollisionLeave2D(_instance, collision, let exception); - - if (exception != null) - ScriptEngine.HandleMonoException(exception, this); - } - - /// Creates a new instance of the given component class and initializes it for the current entity. - public MonoObject* CreateComponentInstance(ScriptClass componentClassType) - { - MonoObject* componentInstance = componentClassType.CreateInstance(); - - // TODO: We could cache the property, but this might be fine - MonoProperty* entityProperty = Mono.mono_class_get_property_from_name(componentClassType.[Friend]_monoClass, "Entity"); - - MonoObject* exception = null; - - Mono.mono_property_set_value(entityProperty, componentInstance, (void**)&_instance, &exception); - - if (exception != null) - ScriptEngine.HandleMonoException((MonoException*)exception, this); - - return componentInstance; - } -} \ No newline at end of file diff --git a/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf b/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf index 0272cb4..590ba2a 100644 --- a/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf +++ b/GlitchyEngine/src/Scripting/ScriptInstanceSerializer.bf @@ -23,12 +23,12 @@ public class ScriptInstanceSerializer public void Clear() { ClearDictionaryAndDeleteValues!(_serializedData); - //ScriptEngine.Classes.EntitySerializer.DestroySerializationContext(this); + ScriptEngine.Classes.EntitySerializer.DestroySerializationContext(this); } public void Init() { - //ScriptEngine.Classes.EntitySerializer.CreateSerializationContext(this); + ScriptEngine.Classes.EntitySerializer.CreateSerializationContext(this); } /// Serializes all script instances that are currently managed by the ScriptEngine. @@ -36,11 +36,7 @@ public class ScriptInstanceSerializer { Debug.Profiler.ProfileFunction!(); - Log.EngineLogger.Error("SerializeScriptInstances not implemented."); - - return; - - /*Init(); + Init(); for (let (id, scriptInstance) in ScriptEngine._entityScriptInstances) { @@ -50,18 +46,18 @@ public class ScriptInstanceSerializer for (let (name, scriptClass) in ScriptEngine.EntityClasses) { SerializeStaticScriptClassFields(scriptClass); - }*/ + } } /// Serializes the given script instance. - public void SerializeScriptInstance(ScriptInstance script) + public void SerializeScriptInstance(NewScriptInstance script) { SerializedObject object = new SerializedObject(this, false, script.ScriptClass.FullName, script.EntityId); object.Serialize(script); } /// Serializes the given script instance. - public void SerializeStaticScriptClassFields(ScriptClass scriptClass) + public void SerializeStaticScriptClassFields(NewScriptClass scriptClass) { SerializedObject object = new SerializedObject(this, true, scriptClass.FullName, null); object.SerializeStaticFields(scriptClass); @@ -71,12 +67,8 @@ public class ScriptInstanceSerializer public void DeserializeScriptInstances() { Debug.Profiler.ProfileFunction!(); - - Log.EngineLogger.Error("SerializeScriptInstances not implemented."); - return; - - /*Init(); + Init(); for (let (id, script) in ScriptEngine._entityScriptInstances) { @@ -86,12 +78,12 @@ public class ScriptInstanceSerializer for (let (name, scriptClass) in ScriptEngine.EntityClasses) { DeserializeStaticScriptClassFields(scriptClass); - }*/ + } } /// Deserializes the data into the given script instance, if there is data available. /// @returns true if the script had serialized data; false otherwise. - public bool DeserializeScriptInstance(UUID id, ScriptInstance script) + public bool DeserializeScriptInstance(UUID id, NewScriptInstance script) { if (_serializedData.TryGetValue(id, let object)) { @@ -103,7 +95,7 @@ public class ScriptInstanceSerializer return false; } - public bool DeserializeStaticScriptClassFields(ScriptClass scriptClass) + public bool DeserializeStaticScriptClassFields(NewScriptClass scriptClass) { for (let object in _serializedData.Values) { diff --git a/GlitchyEngine/src/Serialization/SerializedObject.bf b/GlitchyEngine/src/Serialization/SerializedObject.bf index f7fe34a..401e8ab 100644 --- a/GlitchyEngine/src/Serialization/SerializedObject.bf +++ b/GlitchyEngine/src/Serialization/SerializedObject.bf @@ -192,22 +192,22 @@ class SerializedObject } } - public void Serialize(ScriptInstance scriptInstance) + public void Serialize(NewScriptInstance scriptInstance) { ScriptEngine.Classes.EntitySerializer.Serialize(scriptInstance, this); } - public void Deserialize(ScriptInstance scriptInstance) + public void Deserialize(NewScriptInstance scriptInstance) { ScriptEngine.Classes.EntitySerializer.Deserialize(scriptInstance, this); } - public void SerializeStaticFields(ScriptClass scriptClass) + public void SerializeStaticFields(NewScriptClass scriptClass) { ScriptEngine.Classes.EntitySerializer.SerializeStatic(scriptClass, this); } - public void DeserializeStaticFields(ScriptClass scriptClass) + public void DeserializeStaticFields(NewScriptClass scriptClass) { ScriptEngine.Classes.EntitySerializer.DeserializeStatic(scriptClass, this); } diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index 2a16643..76f0ab7 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -956,7 +956,7 @@ namespace GlitchyEngine.World Dictionary sourceToTargetEntity = scope .(); Dictionary sourceIdToTargetId = scope .(); Dictionary targetIdToSourceEntity = scope .(); - List<(UUID oldId, ScriptInstance scriptInstance)> newScripts = scope .(); + List<(UUID oldId, NewScriptInstance scriptInstance)> newScripts = scope .(); Entity CopyEntityAndChildren(Entity original, Entity? copyParent) { diff --git a/ScriptCore/Core/Camera.cs b/ScriptCore/Core/Camera.cs index 1348f3e..c34e547 100644 --- a/ScriptCore/Core/Camera.cs +++ b/ScriptCore/Core/Camera.cs @@ -25,6 +25,7 @@ public enum ProjectionType : byte /// /// A component representing a camera that is attached to the entity. /// +[EngineClass("GlitchyEngine.World.CameraComponent")] public class Camera : Component { /// diff --git a/ScriptCore/Core/Transform.cs b/ScriptCore/Core/Transform.cs index 4d2e46e..e97a867 100644 --- a/ScriptCore/Core/Transform.cs +++ b/ScriptCore/Core/Transform.cs @@ -8,6 +8,7 @@ namespace GlitchyEngine.Core; ///

/// Every entity has a transform component. ///
+[EngineClass("GlitchyEngine.World.TransformComponent")] public class Transform : Component { public Entity? Parent diff --git a/ScriptCore/Graphics/CircleRenderer.cs b/ScriptCore/Graphics/CircleRenderer.cs index 94b0847..e3ecffa 100644 --- a/ScriptCore/Graphics/CircleRenderer.cs +++ b/ScriptCore/Graphics/CircleRenderer.cs @@ -6,6 +6,7 @@ namespace GlitchyEngine.Graphics; /// /// Component that renders a circle. /// +[EngineClass("GlitchyEngine.World.CircleRendererComponent")] public class CircleRenderer : Component { // TODO: Texture2D Sprite diff --git a/ScriptCore/Graphics/Mesh.cs b/ScriptCore/Graphics/Mesh.cs index 08f94d4..84af43f 100644 --- a/ScriptCore/Graphics/Mesh.cs +++ b/ScriptCore/Graphics/Mesh.cs @@ -6,6 +6,7 @@ namespace GlitchyEngine.Graphics; /// Holds a reference to a Mesh. /// Can be used in combination with a on the same to render the mesh. /// +[EngineClass("GlitchyEngine.Renderer.MeshComponent")] public class Mesh : Component { diff --git a/ScriptCore/Graphics/MeshRenderer.cs b/ScriptCore/Graphics/MeshRenderer.cs index 468db51..8dcea6f 100644 --- a/ScriptCore/Graphics/MeshRenderer.cs +++ b/ScriptCore/Graphics/MeshRenderer.cs @@ -5,6 +5,7 @@ namespace GlitchyEngine.Graphics; /// /// Renders a Mesh. The Mesh can be specified by adding a component to the same . /// +[EngineClass("GlitchyEngine.World.MeshRendererComponent")] public class MeshRenderer : Component { /// diff --git a/ScriptCore/Graphics/SpriteRenderer.cs b/ScriptCore/Graphics/SpriteRenderer.cs index fbde34d..21b5575 100644 --- a/ScriptCore/Graphics/SpriteRenderer.cs +++ b/ScriptCore/Graphics/SpriteRenderer.cs @@ -6,6 +6,7 @@ namespace GlitchyEngine.Graphics; /// /// Component that renders a sprite. /// +[EngineClass("GlitchyEngine.World.SpriteRendererComponent")] public class SpriteRenderer : Component { // TODO: Texture2D/Sprite diff --git a/ScriptCore/Graphics/Text/TextRenderer.cs b/ScriptCore/Graphics/Text/TextRenderer.cs index ec9aebb..ff839ee 100644 --- a/ScriptCore/Graphics/Text/TextRenderer.cs +++ b/ScriptCore/Graphics/Text/TextRenderer.cs @@ -7,6 +7,7 @@ namespace GlitchyEngine.Graphics.Text; /// /// Renders text. /// +[EngineClass("GlitchyEngine.World.Components.TextRendererComponent")] public class TextRenderer : Component { /// diff --git a/ScriptCore/Physics/Rigidbody2D.cs b/ScriptCore/Physics/Rigidbody2D.cs index 08a9bc3..bda53ab 100644 --- a/ScriptCore/Physics/Rigidbody2D.cs +++ b/ScriptCore/Physics/Rigidbody2D.cs @@ -6,6 +6,7 @@ namespace GlitchyEngine.Physics; /// /// Rigid body component for 2D physics. /// +[EngineClass("GlitchyEngine.World.Rigidbody2DComponent")] public class Rigidbody2D : Component { /// diff --git a/ScriptCore/ScriptGlue.cs b/ScriptCore/ScriptGlue.cs index 5bdbf4e..dbdd065 100644 --- a/ScriptCore/ScriptGlue.cs +++ b/ScriptCore/ScriptGlue.cs @@ -1,25 +1,15 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Linq.Expressions; -using System.Numerics; -using System.Reflection; -using System.Reflection.Emit; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Runtime.Loader; using GlitchyEngine.Core; using GlitchyEngine.Editor; using GlitchyEngine.Extensions; -using GlitchyEngine.Graphics; -using GlitchyEngine.Graphics.Text; -using GlitchyEngine.Math; -using GlitchyEngine.Physics; using GlitchyEngine.Serialization; using ImGuiNET; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Loader; namespace GlitchyEngine; @@ -262,39 +252,62 @@ internal static unsafe partial class ScriptGlue } catch (Exception e) { - Console.WriteLine(e); - // TODO: Log exceptions to console + Log.Exception(e); } } [UnmanagedCallersOnly] public static void InvokeEntityOnUpdate(UUID entityId, float deltaTime) { - // using var _ = AssemblyLoadContext.EnterContextualReflection(_appAssembly); // TODO: Check if reflection works correctly in entities - - (Entity entity, Type type) = EntityScriptInstances[entityId]; - entity.OnUpdate(deltaTime); + try + { + (Entity entity, Type type) = EntityScriptInstances[entityId]; + entity.OnUpdate(deltaTime); + } + catch (Exception e) + { + Log.Exception(e); + } } [UnmanagedCallersOnly] - public static void InvokeEntityOnDestroy(UUID entityId, float deltaTime) + public static void InvokeEntityOnDestroy(UUID entityId, byte callDestroy) { - (Entity entity, Type type) = EntityScriptInstances[entityId]; - entity.OnDestroy(); + try + { + if (EntityScriptInstances.Remove(entityId, out var match) && callDestroy > 0) + { + match.Entity.OnDestroy(); + } + } + catch (Exception e) + { + Log.Exception(e); + } + } + + internal static Type? GetTypeFromNativeString(byte* fullTypeName) + { + if (fullTypeName == null) + return null; + + using var _ = AssemblyLoadContext.EnterContextualReflection(_appAssembly); + + Debug.Assert(_appAssembly != null); + + string? typeName = Marshal.PtrToStringUTF8((IntPtr)fullTypeName); + + Debug.Assert(typeName != null); + + return _appAssembly.GetType(typeName); } [UnmanagedCallersOnly] public static void CreateScriptInstance(UUID entityId, byte* scriptClassName) { - using var _ = AssemblyLoadContext.EnterContextualReflection(_appAssembly); + Log.Info("Exception"); - Debug.Assert(_appAssembly != null); - - string? typeName = Marshal.PtrToStringUTF8((IntPtr)scriptClassName); - - Debug.Assert(typeName != null); - - Type? scriptType = _appAssembly.GetType(typeName); + Type? scriptType = GetTypeFromNativeString(scriptClassName); Debug.Assert(scriptType != null, "Script class Type not found."); @@ -337,12 +350,72 @@ internal static unsafe partial class ScriptGlue RemoveComponent = removeComponent }; - break; + return; } + + Log.Error($"Failed to register component type \"{beefComponentTypeName}\": No matching component class found."); + } + + [UnmanagedCallersOnly] + internal static void ThrowException(IntPtr message) + { + throw new Exception(Marshal.PtrToStringUTF8(message)); } -#endregion + #region EntitySerializer + + [UnmanagedCallersOnly] + public static void CreateSerializationContext(IntPtr engineSerializer) + { + EntitySerializer.CreateSerializationContext(engineSerializer); + } + + [UnmanagedCallersOnly] + public static void DestroySerializationContext(IntPtr engineSerializer) + { + EntitySerializer.DestroySerializationContext(engineSerializer); + } + [UnmanagedCallersOnly] + public static void EntitySerializer_Serialize(UUID entityId, IntPtr engineObject, IntPtr engineSerializer) + { + if (!EntityScriptInstances.TryGetValue(entityId, out var match)) + return; + + EntitySerializer.Serialize(match.Entity, engineObject, engineSerializer); + } + + [UnmanagedCallersOnly] + public static void EntitySerializer_Deserialize(UUID entityId, IntPtr engineObject, IntPtr engineSerializer) + { + if (!EntityScriptInstances.TryGetValue(entityId, out var match)) + return; + + EntitySerializer.Deserialize(match.Entity, engineObject, engineSerializer); + } + + [UnmanagedCallersOnly] + public static void EntitySerializer_SerializeStaticFields(byte* fullTypeName, IntPtr engineObject, IntPtr engineSerializer) + { + Type? type = GetTypeFromNativeString(fullTypeName); + Debug.Assert(type != null); + + EntitySerializer.SerializeStaticFields(type, engineObject, engineSerializer); + } + + [UnmanagedCallersOnly] + public static void EntitySerializer_DeserializeStaticFields(byte* fullTypeName, IntPtr engineObject, IntPtr engineSerializer) + { + Type? type = GetTypeFromNativeString(fullTypeName); + Debug.Assert(type != null); + + EntitySerializer.DeserializeStaticFields(type, engineObject, engineSerializer); + } + + #endregion EntitySerializer + + #endregion + public static void Entity_AddComponent(UUID entityId, Type componentType) { ComponentTypeFunctions[componentType].AddComponent(entityId); @@ -386,7 +459,12 @@ internal static unsafe partial class ScriptGlue break; default: if (valueObject is not null) - valueObjectConverted = Unsafe.AsPointer(ref Unsafe.Unbox(valueObject)); + { + void* p = &valueObject; + // Skip Object Header (IntPtr) + Method Table (IntPtr) + valueObjectConverted = (byte*)*(IntPtr*)p + sizeof(IntPtr); + float i = *(float*)valueObjectConverted; + } break; } @@ -398,430 +476,4 @@ internal static unsafe partial class ScriptGlue if (deleteValueObject) Marshal.FreeCoTaskMem((IntPtr)valueObjectConverted); } - -//#region Log - -// //public unsafe static void Log_LogMessage(GlitchyEngine.Log.LogLevel logLevel, string messagePtr, string fileNamePtr, int lineNumber) -// //{ -// // fixed (char* messagePtrConverted = messagePtr) { -// // fixed (char* fileNamePtrConverted = fileNamePtr) { -// // _engineFunctions.Log_LogMessage(logLevel, messagePtrConverted, fileNamePtrConverted, lineNumber); -// // } -// // } -// // -// // -// //} -// //internal static unsafe void Log_LogMessage(Log.LogLevel logLevel, string message, string filePath, int line) -// //{ -// // // unsafe -// // // { -// // // byte* mess = (byte*)Marshal.StringToCoTaskMemUTF8(message); -// // // -// // // fixed (char* messagePtr = message) -// // // fixed (char* filePathPtr = filePath) -// // // { -// // // _engineFunctions.Log_LogMessage(logLevel, messagePtr, filePathPtr, line); -// // // } -// // // -// // // Marshal.FreeCoTaskMem((IntPtr)mess); -// // // } -// //} - - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern void Log_LogException(Exception exception); - -//#endregion - -//#region Entity - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_Create(object scriptInstance, string? entityName, Type[]? componentTypes, out UUID entityId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_Destroy(UUID entityId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_CreateInstance(UUID entityId, out UUID newEntityId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_AddComponent(UUID entityId, Type componentType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_AddComponents(UUID entityId, Type[] componentTypes); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Entity_HasComponent(UUID entityId, Type componentType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_RemoveComponent(UUID entityId, Type componentType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_FindEntityWithName(string name, out UUID uuid); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_GetScriptInstance(UUID entityId, out object? instance); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern object Entity_SetScript(UUID entityId, Type scriptType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Entity_RemoveScript(UUID entityId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern string Entity_GetName(UUID entityId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern string Entity_SetName(UUID entityId, string name); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern void Entity_GetEditorFlags(UUID uuid, out EditorFlags flags); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern void Entity_SetEditorFlags(UUID uuid, EditorFlags editorFlags); - -//#endregion Entity - -//#region TransformComponent - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetParent(UUID entityId, out UUID parentId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetParent(UUID entityId, in UUID parentId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetTranslation(UUID entityId, out float3 translation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetTranslation(UUID entityId, in float3 translation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetWorldTranslation(UUID entityId, out float3 translation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetWorldTranslation(UUID entityId, in float3 translation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetRotation(UUID entityId, out Quaternion rotation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetRotation(UUID entityId, in Quaternion rotation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetRotationEuler(UUID entityId, out float3 rotationEuler); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetRotationEuler(UUID entityId, in float3 rotationEuler); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetRotationAxisAngle(UUID entityId, out RotationAxisAngle translation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetRotationAxisAngle(UUID entityId, RotationAxisAngle translation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_GetScale(UUID entityId, out float3 scale); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Transform_SetScale(UUID entityId, in float3 scale); - -//#endregion TransformComponent - -//#region RigidBody2D - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_ApplyForce(UUID entityId, in float2 force, float2 point, bool wakeUp); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_ApplyForceToCenter(UUID entityId, in float2 force, bool wakeUp); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetPosition(UUID entityId, in float2 position); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_GetPosition(UUID entityId, out float2 position); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetRotation(UUID entityId, in float rotation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_GetRotation(UUID entityId, out float rotation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetLinearVelocity(UUID entityId, in float2 velocity); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_GetLinearVelocity(UUID entityId, out float2 velocity); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetAngularVelocity(UUID entityId, in float velocity); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_GetAngularVelocity(UUID entityId, out float velocity); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_GetBodyType(UUID entityId, out BodyType bodyType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetBodyType(UUID entityId, in BodyType bodyType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_IsFixedRotation(UUID entityId, out bool isFixedRotation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetFixedRotation(UUID entityId, in bool isFixedRotation); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_GetGravityScale(UUID entityId, out float gravityScale); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Rigidbody2D_SetGravityScale(UUID entityId, in float gravityScale); - -//#endregion RigidBody2D - -//#region Camera - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetProjectionType(UUID entityId, out ProjectionType projectionType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetProjectionType(UUID entityId, in ProjectionType projectionType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetPerspectiveFovY(UUID entityId, out float fovY); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetPerspectiveFovY(UUID entityId, float fovY); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetPerspectiveNearPlane(UUID entityId, out float nearPlane); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetPerspectiveNearPlane(UUID entityId, float nearPlane); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetPerspectiveFarPlane(UUID entityId, out float farPlane); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetPerspectiveFarPlane(UUID entityId, float farPlane); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetOrthographicHeight(UUID entityId, out float height); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetOrthographicHeight(UUID entityId, float height); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetOrthographicNearPlane(UUID entityId, out float nearPlane); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetOrthographicNearPlane(UUID entityId, float nearPlane); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetOrthographicFarPlane(UUID entityId, out float farPlane); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetOrthographicFarPlane(UUID entityId, float farPlane); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetAspectRatio(UUID entityId, out float aspectRatio); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetAspectRatio(UUID entityId, float aspectRatio); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_GetFixedAspectRatio(UUID entityId, out bool fixedAspectRatio); -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Camera_SetFixedAspectRatio(UUID entityId, bool fixedAspectRatio); - - -//#endregion - -//#region Physics2D - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Physics2D_GetGravity(out float2 gravity); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Physics2D_SetGravity(in float2 gravity); - -//#endregion Physics2D - -//#region CircleRenderer - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void CircleRenderer_GetColor(UUID entityId, out ColorRGBA color); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void CircleRenderer_SetColor(UUID entityId, ColorRGBA color); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void CircleRenderer_GetUvTransform(UUID entityId, out float4 uvTransform); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void CircleRenderer_SetUvTransform(UUID entityId, float4 uvTransform); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void CircleRenderer_GetInnerRadius(UUID entityId, out float innerRadius); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void CircleRenderer_SetInnerRadius(UUID entityId, float innerRadius); - -//#endregion - -//#region SpriteRenderer - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void SpriteRenderer_GetColor(UUID entityId, out ColorRGBA color); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void SpriteRenderer_SetColor(UUID entityId, ColorRGBA color); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void SpriteRenderer_GetUvTransform(UUID entityId, out UVTransform uvTransform); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void SpriteRenderer_SetUvTransform(UUID entityId, UVTransform uvTransform); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void SpriteRenderer_GetMaterial(UUID entityId, out UUID materialId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void SpriteRenderer_SetMaterial(UUID entityId, UUID materialId); - -//#endregion - -//#region TextRenderer - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool TextRenderer_GetIsRichText(UUID entityId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_SetIsRichText(UUID entityId, bool isRichText); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_GetText(UUID entityId, out string text); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_SetText(UUID entityId, string text); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_GetColor(UUID entityId, out ColorRGBA color); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_SetColor(UUID entityId, ColorRGBA color); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_GetHorizontalAlignment(UUID entityId, out HorizontalTextAlignment horizontalAlignment); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_SetHorizontalAlignment(UUID entityId, HorizontalTextAlignment horizontalAlignment); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_GetFontSize(UUID uuid, out float fontSize); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void TextRenderer_SetFontSize(UUID uuid, float fontSize); - -//#endregion - -//#region MeshRenderer - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void MeshRenderer_GetMaterial(UUID entityId, out UUID materialId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void MeshRenderer_SetMaterial(UUID entityId, UUID materialId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void MeshRenderer_GetSharedMaterial(UUID entityId, out UUID materialId); - -//#endregion - -//#region Math - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern float modf_float(float x, out float integerPart); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern float2 modf_float2(float2 x, out float2 integerPart); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern float3 modf_float3(float3 x, out float3 integerPart); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern float4 modf_float4(float4 x, out float4 integerPart); - -//#endregion - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void UUID_CreateNew(out UUID uuid); - -//#region Application - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Application_IsEditor(); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Application_IsPlayer(); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Application_IsInEditMode(); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Application_IsInPlayMode(); - -//#endregion - -//#region Serialization - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Serialization_SerializeField(IntPtr serializationContext, SerializationType type, string name, object? value, string? fullTypeName = null); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Serialization_CreateObject(IntPtr currentContext, bool isStatic, string fullTypeName, out IntPtr context, out UUID id); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern unsafe void Serialization_DeserializeField(IntPtr internalContext, SerializationType expectedType, string fieldName, byte* value, out SerializationType actualType); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern void Serialization_GetObject(IntPtr internalContext, UUID id, out IntPtr objectContext); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// public static extern void Serialization_GetObjectTypeName(IntPtr internalContext, out string fullTypeName); - -//#endregion - -//#region Asset - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Asset_GetIdentifier(UUID assetId, out string text); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void Asset_SetIdentifier(UUID assetId, string text); - -//#endregion - -//#region Material - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern unsafe bool Material_SetVariable(UUID assetId, string variableName, Material.ShaderVariableType elementType, int rows, int columns, int arrayLength, void* rawData, int dataLength); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Material_ResetVariable(UUID assetId, string variableName); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Material_SetTexture(UUID materialId, string textureName, UUID textureId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Material_GetTexture(UUID materialId, string textureName, out UUID textureId); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool Material_ResetTexture(UUID materialId, string textureName); - -//#endregion - -//#region ImGui - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern void ImGuiExtension_ListElementGrabber(); - -// [MethodImpl(MethodImplOptions.InternalCall)] -// internal static extern bool ImGuiExtension_ShowAssetDropTarget(ref UUID assetId); - -//#endregion } diff --git a/ScriptCore/Serialization/DeserializationObject.cs b/ScriptCore/Serialization/DeserializationObject.cs index 86613f2..d19725e 100644 --- a/ScriptCore/Serialization/DeserializationObject.cs +++ b/ScriptCore/Serialization/DeserializationObject.cs @@ -562,9 +562,9 @@ public class DeserializationObject if (id == UUID.Zero) return null; - string fullTypeName = Encoding.UTF8.GetString(data.FullTypeName, (int)data.FullTypeNameLength); + string? fullTypeName = data.FullTypeName != null ? Encoding.UTF8.GetString(data.FullTypeName, (int)data.FullTypeNameLength) : null; - Type? type = GetTypeFromName(fullTypeName); + Type? type = fullTypeName is not null ? GetTypeFromName(fullTypeName) : null; if (type == null) return NoValueDeserialized; diff --git a/ScriptCore/Serialization/EntitySerializer.cs b/ScriptCore/Serialization/EntitySerializer.cs index df98025..e134432 100644 --- a/ScriptCore/Serialization/EntitySerializer.cs +++ b/ScriptCore/Serialization/EntitySerializer.cs @@ -1,9 +1,10 @@ -using GlitchyEngine.Editor; +using GlitchyEngine.Core; +using GlitchyEngine.Editor; +using GlitchyEngine.Extensions; using System; using System.Collections.Generic; using System.Reflection; -using GlitchyEngine.Core; -using GlitchyEngine.Extensions; +using System.Runtime.InteropServices; namespace GlitchyEngine.Serialization;