Scaffold the .sln and M0 project structure
Buildable skeleton matching docs/kernel-contract.md: - src/Engine.Kernel — the frozen kernel. Interfaces and data types only (World, Component, GameObject, Transform, ISchedule, IServiceRegistry, IEventBus, ILogger, IPlugin/IPluginContext, plugin.json and project.json manifest models). No PluginHost/Scheduler/World implementation yet — that's M0's actual work, not scaffolding. - src/Engine.Host — the CLI runtime entry point, placeholder for now. - plugins/sandbox.echo — a minimal two-assembly plugin (Contracts in Default ALC, implementation in collectible ALC) that exists only to exercise the reload loop end to end once PluginHost exists. - tests/Engine.Kernel.Tests, tests/Engine.ConformanceHarness — wired up with one Skip-marked placeholder test each, naming what M0 needs to make them real (including the 200-cycle ALC leak test from §4). The harness references the sandbox plugin with ReferenceOutputAssembly="false" so it loads it dynamically by path instead of linking its types into its own Default ALC. - samples/EmptyProject — a starter project.json. - Directory.Build.props centralizes shared settings across every project, including AllowUnsafeBlocks=false to enforce the §7 rule at the build level rather than by convention. Solution builds clean and `dotnet test` runs both placeholders as Skipped (not failing) — confirms the wiring, not the engine. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N1qPfzq8TDCUMFMV3UwV5N
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
namespace Engine.Kernel.World;
|
||||
|
||||
/// <summary>
|
||||
/// Base class for all component data. Plain fields, no methods, no
|
||||
/// lifecycle hooks — behavior lives in systems, never on the component
|
||||
/// itself. See docs/kernel-contract.md §1 and §7.
|
||||
/// </summary>
|
||||
public abstract class Component
|
||||
{
|
||||
// Intentionally empty. A subclass adds fields only.
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
namespace Engine.Kernel.World;
|
||||
|
||||
/// <summary>
|
||||
/// The entity type: identity, hierarchy, and a list of components. See
|
||||
/// docs/kernel-contract.md §2.
|
||||
/// </summary>
|
||||
public sealed class GameObject
|
||||
{
|
||||
public required string Name { get; set; }
|
||||
|
||||
public Transform Transform;
|
||||
|
||||
public GameObject? Parent { get; internal set; }
|
||||
|
||||
// TODO(M0): backing storage for children, tags, and the component list
|
||||
// + type index that makes World.Query<T>() O(matches), not O(all).
|
||||
|
||||
public IReadOnlyList<GameObject> Children => throw new NotImplementedException();
|
||||
|
||||
public T? GetComponent<T>() where T : Component
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public T AddComponent<T>() where T : Component, new()
|
||||
=> throw new NotImplementedException();
|
||||
|
||||
public void RemoveComponent<T>() where T : Component
|
||||
=> throw new NotImplementedException();
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
namespace Engine.Kernel.World;
|
||||
|
||||
/// <summary>
|
||||
/// Kernel-owned storage for every <see cref="GameObject"/> in a scene.
|
||||
/// Shape sketched from its usage throughout docs/kernel-contract.md — not a
|
||||
/// final API; M0's job is to actually implement this.
|
||||
/// </summary>
|
||||
public interface IWorld
|
||||
{
|
||||
GameObject CreateGameObject(string name);
|
||||
|
||||
void Destroy(GameObject go);
|
||||
|
||||
/// <summary>Type-indexed lookup — O(matches), not O(all). See §2.</summary>
|
||||
IEnumerable<GameObject> Query<T>() where T : Component;
|
||||
|
||||
// TODO(§5): Snapshot()/Restore() for Play mode — a deep clone of the
|
||||
// GameObject graph, taken on EnterPlay and discarded on ExitPlay.
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
using System.Numerics;
|
||||
|
||||
namespace Engine.Kernel.World;
|
||||
|
||||
/// <summary>
|
||||
/// Embedded directly on <see cref="GameObject"/> rather than modeled as a
|
||||
/// <see cref="Component"/> subclass, because nearly every system touches it
|
||||
/// every frame — see the kernel scope table in docs/kernel-contract.md §2.
|
||||
/// </summary>
|
||||
public struct Transform
|
||||
{
|
||||
public Vector3 LocalPosition;
|
||||
public Quaternion LocalRotation;
|
||||
public Vector3 LocalScale;
|
||||
|
||||
// TODO(M0): derive from the GameObject hierarchy once World can walk it.
|
||||
public readonly Matrix4x4 WorldMatrix => throw new NotImplementedException();
|
||||
}
|
||||
Reference in New Issue
Block a user