From 346779060e07035436dbe5dd6a6c5d052b96cd5e Mon Sep 17 00:00:00 2001 From: Timerix Date: Fri, 9 Jan 2026 11:57:24 +0500 Subject: [PATCH] something something --- src-csharp/ExampleComponent.cs | 8 ++++++++ src-csharp/GameObject.cs | 19 ++++++++++++++----- src-csharp/NativeFunctions.cs | 7 +++---- src/Engine.cpp | 2 +- src/modules/MonoGameObjectSystem.cpp | 11 ++++++++--- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src-csharp/ExampleComponent.cs b/src-csharp/ExampleComponent.cs index 335a2ad..7781137 100644 --- a/src-csharp/ExampleComponent.cs +++ b/src-csharp/ExampleComponent.cs @@ -14,6 +14,14 @@ public class ExampleComponent : Component Console.WriteLine($"C# deltaTime {deltaTime} object id {Owner.Id}"); ImGui.Begin("C# WINDOW"); ImGui.Text("Hello from ExampleComponent!"); + if (ImGui.Button("create GameObject")) + { + GameObject.Create(); + } + if (ImGui.Button("GC Collect")) + { + GC.Collect(); + } ImGui.End(); } } \ No newline at end of file diff --git a/src-csharp/GameObject.cs b/src-csharp/GameObject.cs index 15a334b..bd77b4c 100644 --- a/src-csharp/GameObject.cs +++ b/src-csharp/GameObject.cs @@ -41,6 +41,7 @@ public class GameObject { NativeFunctions.createGameObject(out ulong id, out uint index); var o = new GameObject(id, index); + Console.WriteLine($"C# created object with id {id}, index {index}"); return o; } @@ -54,18 +55,24 @@ public class GameObject throw new Exception($"Can't destroy GameObject({_id})"); } + ~GameObject() + { + // destroys object native part when managed part is garbage-collected + Destroy(); + } + /// type derived from Component /// true if new component instance was created, false if component of the same tipe is already added to GameObject /// public bool TryCreateComponent(Type t) { - if(!t.IsSubclassOf(typeof(Component))) + if (!t.IsSubclassOf(typeof(Component))) throw new Exception($"type {t.FullName} is not a derived class of {typeof(Component).FullName}"); - if(Components.ContainsKey(t)) + if (Components.ContainsKey(t)) return false; - - Component component = (Component?)Activator.CreateInstance(t, this) + + Component component = (Component?)Activator.CreateInstance(t, this) ?? throw new Exception($"can't create instance of class {t.FullName}"); Components.Add(t, component); return true; @@ -78,7 +85,9 @@ public class GameObject private void InvokeUpdate(double deltaTime) { - foreach(var p in Components) + Console.WriteLine("C# InvokeUpdate"); + Console.WriteLine($"id {_id}, index {_index}, destroyed {_isDestroyed}"); + foreach (var p in Components) { p.Value.Update(deltaTime); } diff --git a/src-csharp/NativeFunctions.cs b/src-csharp/NativeFunctions.cs index 77849b5..416d848 100644 --- a/src-csharp/NativeFunctions.cs +++ b/src-csharp/NativeFunctions.cs @@ -1,13 +1,12 @@ -using System; -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; namespace Ougge; internal static class NativeFunctions { - [DllImport("__Internal")] + [MethodImpl(MethodImplOptions.InternalCall)] internal extern static void createGameObject(out ulong id, out uint index); - [DllImport("__Internal")] + [MethodImpl(MethodImplOptions.InternalCall)] internal extern static bool freeGameObject(uint index); } \ No newline at end of file diff --git a/src/Engine.cpp b/src/Engine.cpp index 81ef37e..5cfc768 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -48,7 +48,7 @@ void Engine::stopLoop(){ void Engine::handleModuleError(IEngineModule& module, const char* type, const char* method, const char* error){ std::string error_message = ougge_format( "Catched %s at %s.%s(): %s", - type, module.getName(), method, error); + type, module.getName().c_str(), method, error); std::cerr< ( [](u64* id_out, u32* index_out) -> void { + std::cout<<"createGameObject_callback"<createGameObjectInPool(id_out, index_out); } ); - mono_add_internal_call("createGameObject", (void*)createGameObject_callback); + mono_add_internal_call("Ougge.NativeFunctions::createGameObject", (void*)createGameObject_callback); auto freeGameObject_callback = static_cast( [](u32 index) -> bool { + std::cout<<"freeGameObject_callback"<gameObjectPool.erase(index); } ); - mono_add_internal_call("freeGameObject", (void*)freeGameObject_callback); + mono_add_internal_call("Ougge.NativeFunctions::freeGameObject", (void*)freeGameObject_callback); } void MonoGameObjectSystem::beginFrame(){ for(auto pair : gameObjectPool){ - gameObjectInvokeUpdate(pair.second.getObjectHandle().getObject(), engine.deltaTime); + + auto obj = pair.second.getObjectHandle().getObject(); + std::cout<<"updating obj: "<