render iteration
This commit is contained in:
97
CLAUDE.md
97
CLAUDE.md
@@ -81,14 +81,13 @@ As of December 2025, SDL3 Rust bindings are usable but still maturing:
|
||||
**Using wgpu instead of OpenGL:**
|
||||
- Modern GPU API abstraction (Vulkan/Metal/DX12/OpenGL backends)
|
||||
- Better cross-platform support
|
||||
- WGSL shader language (WebGPU Shading Language)
|
||||
- WESL shader language (WebGPU Shading Language)
|
||||
- Type-safe API with explicit resource management
|
||||
- Low-res framebuffer rendering with 3-bit RGB dithering (retro aesthetic)
|
||||
|
||||
**Rendering Architecture:**
|
||||
- wgpu for 3D mesh rendering with custom shaders
|
||||
- Low-resolution framebuffer (160×120) upscaled to window size
|
||||
- Bayer 8×8 dithering for 3-bit RGB color (8 colors total)
|
||||
- Multiple rendering pipelines: standard meshes and terrain
|
||||
- Separate bind groups for different material types
|
||||
|
||||
@@ -141,7 +140,6 @@ SDL Events → InputState → player_input_system() → InputComponent → movem
|
||||
|
||||
**wgpu Rendering System:**
|
||||
- Low-res framebuffer (160×120) renders to texture
|
||||
- Bayer 8×8 dithering reduces colors to 3-bit RGB (8 colors)
|
||||
- Final blit pass upscales framebuffer to window using nearest-neighbor sampling
|
||||
- Depth buffer for 3D rendering with proper occlusion
|
||||
|
||||
@@ -199,10 +197,10 @@ cargo fmt
|
||||
|
||||
## Shader Files
|
||||
|
||||
WGSL shaders are stored in the `shaders/` directory:
|
||||
- `shaders/standard.wgsl` - Standard mesh rendering with directional lighting
|
||||
- `shaders/terrain.wgsl` - Terrain rendering with shadow mapping (no displacement)
|
||||
- `shaders/blit.wgsl` - Fullscreen blit for upscaling low-res framebuffer
|
||||
WESL shaders are stored in the `src/shaders/` directory:
|
||||
- `src/shaders/standard.wesl` - Standard mesh rendering with directional lighting
|
||||
- `src/shaders/terrain.wesl` - Terrain rendering with shadow mapping (no displacement)
|
||||
- `src/shaders/blit.wgsl` - Fullscreen blit for upscaling low-res framebuffer
|
||||
|
||||
Shaders are loaded at runtime via `std::fs::read_to_string()`, allowing hot-reloading by restarting the application.
|
||||
|
||||
@@ -230,7 +228,7 @@ Shaders are loaded at runtime via `std::fs::read_to_string()`, allowing hot-relo
|
||||
|
||||
**Rendering:**
|
||||
- `render.rs` - wgpu renderer, pipelines, bind groups, DrawCall execution
|
||||
- `shader.rs` - Standard mesh shader (WGSL) with diffuse+ambient lighting
|
||||
- `shader.rs` - Standard mesh shader (WESL) with diffuse+ambient lighting
|
||||
- `terrain.rs` - Terrain entity spawning, glTF loading, EXR heightmap → physics collider
|
||||
- `postprocess.rs` - Low-res framebuffer and blit shader for upscaling
|
||||
- `mesh.rs` - Vertex/Mesh structs, plane/cube mesh generation, glTF loading
|
||||
@@ -578,86 +576,3 @@ Time::init(); // In main() before game loop
|
||||
let time = Time::get_time_elapsed(); // Anywhere in code
|
||||
```
|
||||
|
||||
## Current Implementation Status
|
||||
|
||||
### Implemented Features
|
||||
|
||||
**ECS Architecture:**
|
||||
- ✅ Full ECS conversion completed
|
||||
- ✅ Entity system with EntityManager (spawn/despawn/query)
|
||||
- ✅ Component storages (Transform, Mesh, Physics, Movement, Input, PlayerTag, StateMachine)
|
||||
- ✅ Systems pipeline (input → state machine → physics → physics sync → render)
|
||||
- ✅ No `Rc<RefCell<>>` - clean component ownership
|
||||
- ✅ Event bus integrated as complementary to systems
|
||||
|
||||
**Core Rendering:**
|
||||
- ✅ wgpu renderer with Vulkan backend
|
||||
- ✅ Low-res framebuffer (160×120) with Bayer dithering
|
||||
- ✅ Multiple render pipelines (standard mesh + terrain)
|
||||
- ✅ Directional lighting with diffuse + ambient
|
||||
- ✅ Terrain rendering (glTF with baked heights, no shader displacement)
|
||||
- ✅ EXR heightmap loading for physics colliders
|
||||
- ✅ glTF mesh loading
|
||||
- ✅ render_system (ECS-based DrawCall generation)
|
||||
|
||||
**Input System:**
|
||||
- ✅ Two-layer input pipeline (InputState → InputComponent)
|
||||
- ✅ player_input_system converts raw input to gameplay commands
|
||||
- ✅ SDL event handling in InputState
|
||||
- ✅ Per-entity InputComponent for controllable entities
|
||||
|
||||
**Camera & Debug:**
|
||||
- ✅ 3D camera with rotation (yaw/pitch)
|
||||
- ✅ Noclip mode for development (in debug/noclip.rs)
|
||||
- ✅ Mouse look with relative mouse mode
|
||||
- ✅ Toggle with 'I' key, 'N' for noclip mode
|
||||
|
||||
**Physics:**
|
||||
- ✅ rapier3d integration with PhysicsManager singleton
|
||||
- ✅ PhysicsComponent storage (rigidbody/collider handles)
|
||||
- ✅ physics_sync_system (syncs physics → transforms)
|
||||
- ✅ Physics step integrated into game loop
|
||||
- ⚠️ Ground detection not yet implemented
|
||||
- ⚠️ Movement physics not yet connected
|
||||
|
||||
**State Machines:**
|
||||
- ✅ Generic StateMachine implementation
|
||||
- ✅ StateMachineStorage (ECS component)
|
||||
- ✅ state_machine_system updates all state machines
|
||||
- ✅ Transitions can query ECS components
|
||||
- ⚠️ Player state transitions not yet configured
|
||||
|
||||
**Player:**
|
||||
- ✅ Player entity spawning function
|
||||
- ✅ Components: Transform, Mesh, Physics, Movement, Input, PlayerTag
|
||||
- ⚠️ Movement system not yet implemented
|
||||
- ⚠️ State machine not yet attached to player
|
||||
- ⚠️ Currently inactive (noclip camera used instead)
|
||||
|
||||
**Movement Configuration:**
|
||||
- ✅ Horizontal movement config (Bezier acceleration curves)
|
||||
- ✅ Vertical movement config (jump mechanics)
|
||||
- ✅ MovementComponent storage
|
||||
- ⚠️ Movement system not yet implemented
|
||||
- ⚠️ Not yet integrated with physics
|
||||
|
||||
### Not Yet Implemented
|
||||
|
||||
- ❌ Movement system (apply InputComponent → physics velocities)
|
||||
- ❌ Ground detection and collision response
|
||||
- ❌ Player state machine configuration
|
||||
- ❌ Camera follow behavior (tracks player entity)
|
||||
- ❌ Snow deformation compute shaders
|
||||
- ❌ Debug UI system
|
||||
|
||||
### Current Focus
|
||||
|
||||
**ECS migration is complete!** The architecture is now fully entity-component-system based with clean separation of data and logic. The next steps are:
|
||||
|
||||
1. Implement movement_system to apply InputComponent to physics
|
||||
2. Configure player state machine transitions
|
||||
3. Implement ground detection
|
||||
4. Add camera follow system
|
||||
5. Integrate snow deformation
|
||||
|
||||
The noclip camera mode serves as the primary navigation method for testing. Press 'N' to toggle noclip mode.
|
||||
|
||||
Reference in New Issue
Block a user