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: "<