Full project snapshot migrated to new Gitea remote without history: engine, editor, physics, script, examples, tests, docs, and assets. Relicensed from GPLv3 to MIT and updated repo URLs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
10 KiB
Oxide Engine — Claude Code Context
Project Overview
Oxide is a general-purpose 3D game engine written in Rust. It is built to make any 3D game,
scaling from stylized low-poly (e.g. with a VCR/CRT post filter) to realistic graphics, and to ship
only what each game uses. It ships with an in-engine editor (oxide-editor) developed alongside
the engine and gaining capabilities at each stage.
The work is split into two phases (see PLAN.md):
- Phase 1 — general-purpose engine (Stages 0–16): everything needed to build and export any game. Stage 16 (game export to Linux + Windows) is the milestone.
- Phase 2 — built-in modules (Stages 17+): optional, self-contained capabilities (ray-traced audio, developer console, procedural toolkit, terrain, open world, pathfinding/AI, water), each a feature-gated module built on Phase-1 systems.
Simulation, open world, and procedural generation are capabilities the engine supports through modules, not design drivers. The guiding idea is build tools, not games.
Core Feature Goals (Phase 1 — the general-purpose engine)
- Scene graph and entity management
- Engine core framework: a module/plugin system (compile-time feature-gated crates + a
runtime
Moduletrait +rhaiscript modules), system scheduling, a layers & tags system (LayerMaskfor physics/render/query filtering + gameplay tags), a central asset server with handles, a reflection/type registry, and a data-driven render pass pipeline - Editor framework & project system: top menu, dockable panels, undo/redo command stack, a module→editor extension API (modules add panels/menus/tools/inspectors), a settings/ preferences framework (engine + editor + per-module settings, enable/disable modules), and a project system (create/open/save projects, file watching)
- Comprehensive input mapping: map any key to press/up/down, and named remappable actions
(e.g. a
Jumpaction defaulting toSpacethat game code references by name while players rebind the physical key in settings) - Comprehensive in-game UI system: widgets, layout, theming, text, and input routing that ship
inside exported games (distinct from the editor's
egui); UI documents are serializable and dual-editable, authored in a visual editor canvas - Comprehensive physics simulation (
rapier3d: colliders, joints, scene queries, sensors, layer-filtered collision/triggers, kinematic character controller — not a thin wrapper) - Scripting + live reload + in-editor terminal: game scripts are watched and hot-reloaded; the editor hosts a terminal that can run tools and AI agents which edit game code live
- Animation system · particle engine · shader support (simple → advanced, scalable fidelity)
- Standard audio: mixer/spatial system (ray-traced spatial sound is a Phase-2 module)
- Dual-editable types: every engine object/component type (
Transform,Script, materials, colliders, …) is editable from both the editor UI and from scripts/code via one reflected/ serializable representation, so any editor or AI agent can author game code and data in real time - Built-in content kit (prototyping primitives, shaders, character controller) for fast starts
- Game export to standalone Linux + Windows binaries (ships only the modules a project uses)
- In-engine editor (first-class; not an afterthought)
Built-in Modules (Phase 2 — optional, feature-gated)
- Ray-traced spatial audio (wave propagation, occlusion, reverb)
- Developer console & cheats (drop-in dev interface; compiled out of release)
- Procedural toolkit (noise + composable modifier stack — tools, not a fixed world generator)
- Terrain system (generate, sculpt, paint splat layers, scatter foliage/objects)
- Open world support (streaming, LOD, chunking)
- Pathfinding & NPC AI (navmesh, agents, behavior trees/state machines, perception)
- Water (rendering + buoyancy/swim/flow mechanics)
Anyone can write a module; each ships docs for both using it and authoring one.
Platform & Targets
- Linux is the primary platform, on both Wayland and Xorg (X11) — keep both backends working at
every stage (
winitwayland+x11features). - Windows support is added later, once the engine is substantial; avoid Linux-only assumptions.
- Game export targets both Linux and Windows standalone binaries (editor runs on Linux and can cross-export). See PLAN.md Stage 16.
Development Philosophy
- Build in stages; each stage must be tested and stable before the next begins
- Build tools, not games — ship composable building blocks; genre-specific behavior lives in game code or optional modules
- Ship only what's used — subsystems are feature-gated modules; an exported game compiles in only the modules it registers
- Scalable fidelity — the data-driven render pass pipeline lets a project run anything from a flat low-poly/stylized look to a full realistic stack, paying only for the passes it enables
- Modules are the primary extension point — a module registers engine logic and editor UI and its own settings through one documented API; anyone (including AI agents) can write one
- Every system should be composable and independently usable
- Prefer correctness and clarity over premature optimization
- Keep public APIs minimal — internal complexity is fine, external surface should be clean
- No feature creep between stages; additions go into the backlog for later stages
- The editor (
oxide-editor) grows with the engine — each stage adds editor support for new systems through the Stage-6 editor framework (panels, menus, undo stack, settings pages)
Documentation & File Maintenance
- Always update
CLAUDE.md,PLAN.md,README.md, and.gitignorewhen project rules, goals, stage definitions, or project structure changes PLAN.mdis the authoritative roadmap — keep it accurate and up-to-dateREADME.mdmust reflect the current build/install instructions and feature list at all times. Keep it a short overview — detailed documentation belongs indocs/, not the README.gitignoremust be updated whenever new tools, output formats, or file types are introduced that should not be tracked (e.g. new build targets, generated files, editor temp files)- Do not let these files become stale after structural or process changes
Full documentation in docs/
- The
docs/directory holds the full documentation of the engine — both usage (how to call each system) and inner workings (how/why it works). The project is too large to fit this inREADME.md. - Write documentation as you work, not after. A stage is not complete until its systems are documented under
docs/. - One topic per file; link between files rather than duplicating.
docs/README.mdis the documentation index — add new docs to it. - When an API changes, update the affected doc and its code snippets in the same change so docs never drift from the code.
- Current docs:
architecture.md,conventions.md,getting-started.md,development.md, and per-system references (e.g.math.md,windowing.md,render-context.md,scene.md).
Packaging, Installation & Export
- The project must be compilable to a Linux installable package
install.shat the repo root builds in release mode and installs the editor binary plus assets to the system (/usr/localby default, overridable viaPREFIX)- Keep
install.shupdated whenever new binaries or assets are added - The installed binary name is
oxide-editor - The editor must run on Linux under both Wayland and Xorg
- A later stage adds a Windows build of the editor/engine and game export to standalone Linux and Windows binaries (the exported game links the engine runtime without the editor) — see PLAN.md Stage 16; keep packaging docs current when that lands
Language & Tooling
- Language: Rust (stable toolchain)
- Build: Cargo workspace (
engine/,editor/,examples/,tests/) - Graphics:
wgpu(portability across Vulkan, Metal, DX12) - Physics:
rapier3d - Math:
glam - ECS:
hecs(preferred lightweight approach) - Editor UI:
egui(integrated intooxide-editor) - Scripting:
rhai(preferred — embeddable, sandboxed); file watching vianotifyfor live reload - Audio: standard system via
kira/rodio; ray-traced model built on the engine's own ray casts - Windowing backends:
winitwith bothwaylandandx11enabled (Linux); Win32 later
Repository
- Remote:
https://git.houmeres.sk/Houmeres/Oxide.git - Local:
/home/homer/Oxide
Git Workflow & Branching
Two long-lived branches: dev (integration) and main (stable). Full
detail in docs/development.md; the rules Claude follows:
- Auto-commit and push to
devevery new piece of work that can be fully verified automatically (it builds and its unit/integration/fuzz tests and benchmarks pass). Do this as soon as the work is complete and green — no need to ask first for these. - Manual-test gate before
main. If a change cannot be fully verified by automated tests — anything involving the GUI, rendering, audio, input feel, or otherwise needing a human to run the engine and observe it — push it todevonly, then ask the maintainer to test it. Promote tomainonly after the maintainer explicitly approves it works. - Fully-automated changes may go to both
devandmaintogether, because the passing automated suite is the sign-off (e.g. pure-logic modules like the math system). - Decision rule: "Can a test prove this works without a human looking at it?"
Yes → eligible for
main. No → stop atdevand request manual testing. When in doubt, treat it as needing manual testing. - Always run the local gate before committing:
cargo fmt --check && cargo clippy --all-targets -- -D warnings && cargo test. - End AI-assisted commit messages with the Claude co-author trailer.
Working with Claude
- Read
PLAN.mdfor the full staged roadmap before starting any new stage - Each stage has defined deliverables and test criteria — do not skip testing phases
- When implementing a system, prefer small focused modules over large monolithic files
- Breaking changes between stages are acceptable; backward compatibility is not a goal during early stages
- After completing work that changes project structure, goals, or process, update
CLAUDE.md,PLAN.md, andREADME.mdbefore considering the task done