diff --git a/GlitchyEngine/src/Renderer/MeshComponent.bf b/GlitchyEngine/src/Renderer/MeshComponent.bf index 3a1daf0..9a33453 100644 --- a/GlitchyEngine/src/Renderer/MeshComponent.bf +++ b/GlitchyEngine/src/Renderer/MeshComponent.bf @@ -19,11 +19,9 @@ namespace GlitchyEngine.Renderer } } - public static void DisposeComponent(void* component) + public void Dispose() mut { - Self* self = (Self*)component; - - ReleaseRefAndNullify!(self._mesh); + ReleaseRefAndNullify!(_mesh); } } } diff --git a/GlitchyEngine/src/World/AnimationComponent.bf b/GlitchyEngine/src/World/AnimationComponent.bf index 51ab285..d997ed8 100644 --- a/GlitchyEngine/src/World/AnimationComponent.bf +++ b/GlitchyEngine/src/World/AnimationComponent.bf @@ -28,12 +28,10 @@ namespace GlitchyEngine.World public SkeletonPose Pose => _pose; - public static void DisposeComponent(void* component) + public void Dispose() { - Self* animationComponent = (Self*)component; - - animationComponent._animationClip?.ReleaseRef(); - delete animationComponent._pose; + _animationClip?.ReleaseRef(); + delete _pose; } } } diff --git a/GlitchyEngine/src/World/DebugNameComponent.bf b/GlitchyEngine/src/World/DebugNameComponent.bf index 3559100..f2c86bf 100644 --- a/GlitchyEngine/src/World/DebugNameComponent.bf +++ b/GlitchyEngine/src/World/DebugNameComponent.bf @@ -18,11 +18,9 @@ namespace GlitchyEngine.World _debugName = new String(name); } - public static void DisposeComponent(void* component) + public void Dispose() mut { - Self* self = (Self*)component; - - DeleteAndNullify!(self._debugName); + DeleteAndNullify!(_debugName); } } } diff --git a/GlitchyEngine/src/World/EcsWorld.bf b/GlitchyEngine/src/World/EcsWorld.bf index 2d73c56..262f630 100644 --- a/GlitchyEngine/src/World/EcsWorld.bf +++ b/GlitchyEngine/src/World/EcsWorld.bf @@ -17,7 +17,7 @@ namespace GlitchyEngine.World typealias DisposeFunction = function void(void* component); - internal typealias ComponentPoolEntry = (uint32 Id, IComponentPool Pool, DisposeFunction DisposeFunction); + internal typealias ComponentPoolEntry = (uint32 Id, IComponentPool Pool, DisposeFunction DisposeComponent); internal Dictionary _componentPools = new .(); /// A list containing all pools whose components need to be disposed before removal. @@ -60,7 +60,7 @@ namespace GlitchyEngine.World uint32 id = (uint32)_componentPools.Count; ComponentPool componentPool = new ComponentPool(MaxEntities); - DisposeFunction disposeFunction = => T.DisposeComponent; + DisposeFunction disposeFunction = => DisposeComponent; _componentPools.Add(typeof(T), (id, componentPool, disposeFunction)); @@ -68,6 +68,13 @@ namespace GlitchyEngine.World _disposingPools.Add(typeof(T)); } + /// Enables us to bind a function pointer to the components dispose function + private static void DisposeComponent(void* component) where T : IDisposableComponent + { + T* myComponent = (T*)component; + (*myComponent).Dispose(); + } + /** @brief Returns the component pool for the given component type. * @param TComponent The type of the component whose component pool will be returned. * @returns A reference to the component pool. @@ -137,7 +144,7 @@ namespace GlitchyEngine.World // Get pointer to component void* component = pool.Pool.Get(listEntity.ID.Index); // Dispose component - pool.DisposeFunction(component); + pool.DisposeComponent(component); } } } @@ -218,7 +225,7 @@ namespace GlitchyEngine.World listEntity.ComponentMask[entry.Id] = false; // Get component and call dispose - T.DisposeComponent(entry.Pool.Get(entity.Index)); + DisposeComponent(entry.Pool.Get(entity.Index)); } public T* GetComponent(Entity entity) where T : struct @@ -307,10 +314,9 @@ namespace GlitchyEngine.World { public bool IsDisposed; - public static void DisposeComponent(void* component) + public void Dispose() mut { - Self* testComponent = (Self*)component; - testComponent.IsDisposed = true; + IsDisposed = true; } } diff --git a/GlitchyEngine/src/World/IDisposableComponent.bf b/GlitchyEngine/src/World/IDisposableComponent.bf index 4340615..c9ce271 100644 --- a/GlitchyEngine/src/World/IDisposableComponent.bf +++ b/GlitchyEngine/src/World/IDisposableComponent.bf @@ -7,6 +7,6 @@ namespace GlitchyEngine.World * @Note This function will be called when the given component was removed from the entity * or when the entity itself was removed. */ - static void DisposeComponent(void* component); + void Dispose() mut; } } diff --git a/GlitchyEngine/src/World/MeshRendererComponent.bf b/GlitchyEngine/src/World/MeshRendererComponent.bf index 5510666..303eb8c 100644 --- a/GlitchyEngine/src/World/MeshRendererComponent.bf +++ b/GlitchyEngine/src/World/MeshRendererComponent.bf @@ -23,10 +23,9 @@ namespace GlitchyEngine.World } } - public static void DisposeComponent(void* component) + public void Dispose() mut { - Self* meshRenderComponent = (Self*)component; - meshRenderComponent._material?.ReleaseRef(); + _material?.ReleaseRef(); } } } diff --git a/GlitchyEngine/src/World/SkinnedMeshRendererComponent.bf b/GlitchyEngine/src/World/SkinnedMeshRendererComponent.bf index 7b45f96..e3047b3 100644 --- a/GlitchyEngine/src/World/SkinnedMeshRendererComponent.bf +++ b/GlitchyEngine/src/World/SkinnedMeshRendererComponent.bf @@ -40,12 +40,10 @@ namespace GlitchyEngine.World } } - public static void DisposeComponent(void* component) + public void Dispose() { - Self* meshRenderComponent = (Self*)component; - - meshRenderComponent._material?.ReleaseRef(); - meshRenderComponent._skeleton?.ReleaseRef(); + _material?.ReleaseRef(); + _skeleton?.ReleaseRef(); } } }