Files
Oxide/CLAUDE.md
T
Homer Simpson 9eead719b0 Import Oxide engine (Stages 0–10) under MIT license
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>
2026-07-05 20:41:02 +02:00

160 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 016):** 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 `Module` trait + `rhai` script modules), system scheduling, a **layers & tags** system
(`LayerMask` for 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 `Jump` action defaulting to `Space` that 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 (`winit` `wayland` + `x11` features).
- **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 `.gitignore` when project rules, goals, stage definitions, or project structure changes
- `PLAN.md` is the authoritative roadmap — keep it accurate and up-to-date
- `README.md` must reflect the current build/install instructions and feature list at all times. Keep it a **short overview** — detailed documentation belongs in `docs/`, not the README
- `.gitignore` must 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 in `README.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.md` is 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.sh` at the repo root builds in release mode and installs the editor binary plus assets to the system (`/usr/local` by default, overridable via `PREFIX`)
- Keep `install.sh` updated 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 into `oxide-editor`)
- Scripting: `rhai` (preferred — embeddable, sandboxed); file watching via `notify` for live reload
- Audio: standard system via `kira`/`rodio`; ray-traced model built on the engine's own ray casts
- Windowing backends: `winit` with both `wayland` and `x11` enabled (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 `dev`** every 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 to `dev`
only, then ask the maintainer to test it. Promote to `main` **only after the
maintainer explicitly approves** it works.
- **Fully-automated changes may go to both `dev` and `main` together**, 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 at `dev` and 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.md` for 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`, and `README.md` before considering the task done