feat(engine)!: refactor graphics, ECS, and logging APIs

Major refactor of graphics and ECS infrastructure:
- Removed IResourceManager, IRenderSystem, IFenceSynchronizer interfaces; ResourceManager and RenderSystem are now concrete classes.
- Updated all render graph, pipeline, and context code to use concrete ResourceManager.
- Refactored camera/frustum math and render extraction for clarity and correctness; frustum now uses inline arrays.
- RenderingLayerMask is now an immutable struct with bitwise operators.
- Meshlet and meshlet group data structures improved; meshlet build callback signature updated.
- Logging system overhauled: LogMessage is now a class, LogCollection supports change events, and Logger is used directly in the debug console.
- ECS query API: ChunkView.Count renamed to EntityCount; query builder/iterators use VirtualStack.Scope.
- Updated render pipeline and passes for new resource manager and render list APIs.
- Cleaned up obsolete files, improved code style, and updated documentation.
- HLSL meshlet shader updated for new struct layout.
- Debug console now uses new logger and log collection.

BREAKING CHANGE: Public APIs for resource management, rendering, ECS queries, and logging have changed. Interfaces removed; use new concrete types and updated method signatures.
This commit is contained in:
2026-03-21 22:10:28 +09:00
parent 793df1af4f
commit 37f4795b4f
45 changed files with 1007 additions and 840 deletions

View File

@@ -96,7 +96,7 @@ public readonly unsafe ref struct ChunkView
private readonly int _structuralVersion;
private readonly int _currentVersion;
public readonly int Count => _entityCount;
public readonly int EntityCount => _entityCount;
internal ChunkView(ref readonly Archetype archetype, ref readonly Chunk chunk)
{
@@ -478,7 +478,7 @@ public unsafe partial struct EntityQuery : IDisposable
public ref partial struct QueryBuilder : IDisposable
{
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<Identifier<IComponent>> _all;
private UnsafeList<Identifier<IComponent>> _any;
@@ -666,6 +666,10 @@ public ref partial struct QueryBuilder : IDisposable
{
Dispose();
}
else
{
Clear();
}
return queryID;
}

View File

@@ -338,9 +338,9 @@ public abstract class SystemGroup : ISystem
}
}
public class DefaultSystemGroup : SystemGroup;
public sealed class DefaultSystemGroup : SystemGroup;
public class SystemManager
public sealed class SystemManager
{
private readonly World _world;

View File

@@ -21,7 +21,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -216,7 +216,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -423,7 +423,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -640,7 +640,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -867,7 +867,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -1104,7 +1104,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -1351,7 +1351,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -1608,7 +1608,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;

View File

@@ -56,7 +56,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;

View File

@@ -41,7 +41,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -245,7 +245,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -459,7 +459,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -683,7 +683,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -917,7 +917,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -1161,7 +1161,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -1415,7 +1415,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;
@@ -1679,7 +1679,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;

View File

@@ -60,7 +60,7 @@ public unsafe partial struct EntityQuery
private readonly EntityQueryMask _mask;
private readonly World _world;
private readonly Stack.Scope _scope;
private readonly VirtualStack.Scope _scope;
private UnsafeList<int> _changedComponentIDs;
private ref Archetype _currentArchetype;

View File

@@ -1,6 +1,7 @@
using Ghost.Core;
using Misaki.HighPerformance.Jobs;
using System.Runtime.CompilerServices;
using TerraFX.Interop.Windows;
namespace Ghost.Entities;
@@ -85,6 +86,8 @@ public partial class World : IDisposable, IEquatable<World>
private readonly ComponentManager _componentManager;
private readonly SystemManager _systemManager;
private readonly Dictionary<Type, object> _globalResource;
private int _version;
private bool _disposed = false;
@@ -137,6 +140,8 @@ public partial class World : IDisposable, IEquatable<World>
_componentManager = new ComponentManager(this);
_systemManager = new SystemManager(this);
_globalResource = new Dictionary<Type, object>();
if (jobScheduler != null)
{
_threadLocalECBs = new EntityCommandBuffer[jobScheduler.WorkerCount];
@@ -186,6 +191,41 @@ public partial class World : IDisposable, IEquatable<World>
return _threadLocalECBs[threadIndex];
}
/// <summary>
/// Registers or overwrites a global resource in the world.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetResource<T>(T resource)
where T : class
{
_globalResource[typeof(T)] = resource;
}
/// <summary>
/// Retrieves a global resource from the world.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public T GetResource<T>()
where T : class
{
if (_globalResource.TryGetValue(typeof(T), out var resource))
{
return (T)resource;
}
throw new InvalidOperationException($"Resource of type {typeof(T).FullName} has not been registered in the World.");
}
/// <summary>
/// Checks if a global resource exists.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool HasResource<T>()
where T : class
{
return _globalResource.ContainsKey(typeof(T));
}
public bool Equals(World? other)
{
return other is not null && _id == other._id;