01 / Architecture
One world.
Clear boundaries.
The useful unit is a contract: who owns the state, who can change it, and how the next system receives it.
The game owns the game.
OmiLith's reusable libraries do not depend on a particular game or sample application. A consumer owns its rules, authored scene, content, controls, presentation document, packaging, and product identity. Drune and Glasswake are separate consumers of that foundation.
Applications select engine options before collecting dependencies, include the engine as a source dependency, then link public library targets. Offline tools and client-only systems stay outside a headless server build.
A shared language for scene data.
Entities own simple value components. OmiLith deliberately does not use a full entity-component-system framework. The RTTR registry supplies the shared field metadata for JSON scene assembly, Luau property access, serialization, and the inspector.
That shared registry keeps numeric bounds and writable properties aligned. Scene replacement validates a new scene before publication, and scripts operate through checked entity identities. The current project scripting boundary is for trusted game scripts, not a general untrusted mod sandbox.
Intent enters. A render plan leaves.
Rendering combines the scene's policy with device capabilities and the compiled shader package. Required behavior can fail clearly when unsupported; preferred effects can select an authored fallback. A simpler route should preserve the game's visual intent.
The public Renderer boundary remains consistent while Vulkan, Metal, Direct3D 12, and WebGPU own their native resources and command submission. Slang is the shared shader source; build tools generate backend shader formats ahead of time.

Publication is a lifetime boundary.
Runtime scene and asset data are validated before becoming visible to their owners. Frame extraction builds contiguous data for command recording. Uploads, resource generations, and asset leases remain alive until the GPU has completed the work that uses them.
The frame graph makes attachment and sampled-resource use explicit. Backend barriers and encoders implement that contract. This keeps a scene replacement or changed material binding from retiring a resource while an earlier frame still needs it.