Add friction coefficient to RigidBody (default 0.5) and implement
tangential impulse clamping in resolve_collisions using Coulomb's law,
including resting-contact friction for sliding bodies.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implement GJK (Gilbert-Johnson-Keerthi) overlap detection and EPA
(Expanding Polytope Algorithm) penetration resolution for arbitrary
convex collider pairs. Used as the fallback narrow phase for any
combination involving Capsule, while Sphere/Box specialized routines
are preserved for performance.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add Capsule { radius, half_height } to the Collider enum, with AABB
computation and ray-vs-capsule intersection support. The capsule is
oriented along the Y axis (cylinder + two hemisphere caps).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Parse PNG files (RGB and RGBA, 8-bit) with full filter reconstruction
(None, Sub, Up, Average, Paeth). Uses the self-contained deflate
decompressor for IDAT chunk decompression.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implement RFC 1951 Deflate decompression with zlib wrapper handling.
Supports stored blocks, fixed Huffman codes, and dynamic Huffman codes
with LZ77 back-reference decoding.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add IMGUI HUD overlay showing HP, wave, score, and enemy count.
Display centered Game Over panel with final score and restart prompt.
Add procedural sine-wave audio clips for shooting (440Hz) and enemy
kills (220Hz) via voltex_audio. Player blinks white during invincibility.
Press R to restart after game over.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Projectiles destroy enemies on contact (radius check 0.55). Enemies
damage the player on contact with 1s invincibility window. Score +100
per kill. Game over when HP reaches 0. update() now returns FrameEvents
so the caller can trigger audio/visual feedback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Red sphere enemies spawn at arena edges via a wave system that
escalates each round. Enemies use direct seek steering to chase
the player. Both shadow and color passes render enemies.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Left click fires small yellow sphere projectiles from the player toward
the mouse cursor position on the XZ plane. Includes fire cooldown (0.2s),
projectile lifetime (2.0s), and ray-plane intersection for mouse aiming.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add blue sphere as the player with WASD movement on XZ plane,
clamped to arena bounds. Camera now tracks player position.
Pre-allocate dynamic UBO buffers for 100 entities to support
future enemies and projectiles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Static arena with 20x20 floor and 4 box obstacles rendered using the
forward PBR pipeline with shadow mapping. Fixed quarter-view camera
at (0, 15, 10) looking at origin.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Interactive demo showing panel, text, button, slider, and checkbox
widgets rendered via the new UiRenderer pipeline. Uses winit event
loop with mouse input forwarded to UiContext.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add UiRenderer with wgpu render pipeline for 2D UI overlay rendering.
Includes WGSL shader with orthographic projection, alpha blending,
and R8Unorm font atlas sampling. Font pixel (0,0) set to white for
solid-color rect rendering via UV (0,0).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds NetSocket (non-blocking UdpSocket wrapper with local_addr), NetServer
(connection tracking via HashMap, poll/broadcast/send_to_client), and NetClient
(connect/poll/send/disconnect lifecycle). Includes an integration test on
127.0.0.1:0 that validates ClientConnected, Connected, and UserData receipt
end-to-end with 50ms sleeps to ensure UDP packet delivery.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduces the voltex_net crate (no external dependencies) with a binary
Packet protocol over UDP. Supports 6 variants (Connect, Accept, Disconnect,
Ping, Pong, UserData) with a 4-byte header (type_id u8, payload_len u16 LE,
reserved u8) and per-variant payload encoding. Includes 7 unit tests covering
all roundtrips and invalid-type error handling.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements SteeringAgent and five steering behaviors. truncate() clamps
force magnitude. follow_path() advances waypoints within waypoint_radius
and uses arrive() for the final waypoint. 6 passing tests covering all
behaviors including deceleration and path advancement.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements find_path() using A* over triangle adjacency with XZ heuristic.
Path starts at the given start point, passes through intermediate triangle
centers, and ends at the goal point. Returns None when points are outside
the mesh or no connection exists. 5 passing tests.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduces the voltex_ai crate with NavMesh, NavTriangle structs and
XZ-plane barycentric point-in-triangle helper. Includes find_triangle,
triangle_center, and edge_midpoint utilities with 4 passing tests.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add 'enable wgpu_ray_query' to RT shadow shader
- Fix RayDesc struct constructor syntax and rayQueryGetCommittedIntersection API
- Enable ExperimentalFeatures in GpuContext for RT
- Change RT shadow texture binding to non-filterable (R32Float)
- Use textureLoad instead of textureSample for RT shadow in lighting pass
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Lighting pass now renders to Rgba16Float HDR target. A 5-level bloom
mip chain (downsample with bright-extract threshold, then additive
upsample) feeds into an ACES tonemap pass that composites the final
LDR output to the swapchain surface. All resources resize correctly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Integrate BLAS/TLAS acceleration structures and RT shadow compute pass
into the deferred rendering demo. Adds GpuContext::new_with_features()
for requesting EXPERIMENTAL_RAY_QUERY, Mesh::new_with_usage() for
BLAS_INPUT buffer flags, and extends the lighting shadow bind group
to 9 entries (shadow map + IBL + SSGI + RT shadow).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds t_ssgi/s_ssgi bindings (group 2, bindings 5-6) to
lighting_shadow_bind_group_layout and deferred_lighting.wgsl. Replaces the
simple ambient term with SSGI-modulated ambient: ao*ssgi_ao applied to IBL
diffuse+specular, plus ssgi_indirect for indirect color bleeding.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds ssgi_shader.wgsl (fullscreen pass: view-space TBN from noise, 64-sample
hemisphere loop with occlusion + color bleeding, outputs vec4(ao, indirect_rgb)).
Adds ssgi_gbuffer_bind_group_layout, ssgi_data_bind_group_layout, and
create_ssgi_pipeline to deferred_pipeline.rs. Exports all three from lib.rs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Demonstrates two-pass deferred rendering: G-Buffer pass writes position,
normal, albedo, and material to 4 render targets; lighting pass composites
with 8 animated orbiting point lights plus a directional light using a
fullscreen triangle.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implements deferred_lighting.wgsl for the fullscreen lighting pass:
reads G-Buffer textures, runs the identical Cook-Torrance BRDF functions
(distribution_ggx, geometry_smith, fresnel_schlick, attenuation, etc.)
from pbr_shader.wgsl, computes multi-light contribution with PCF shadow
and IBL, then applies Reinhard tonemapping and gamma correction.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>