Skip to main content
Euca’s renderer is a real-time PBR forward renderer (wgpu 27, native Metal on macOS): Cook-Torrance GGX shading, 3-cascade shadow maps with PCF, 4× MSAA + FXAA, HDR with ACES tonemapping, bloom, and SSAO. The camera and rendering endpoints let an agent frame a shot, apply view presets, and capture the viewport. For the full pipeline — passes, what’s wired, what’s opt-in — see Engine internals.
Rendering needs a GPU/render host. The headless :3917 server runs the simulation but has no renderer and no camera resource. GET /camera returns {"error":"No camera"} there, and the POST endpoints accept your request and return ok even though nothing is drawn — the camera state is stored, but there is no frame to apply it to. Run these against the editor or a windowed/GPU host, not the headless example server. This keeps appearance cleanly separated from the authoritative world state (why that matters).

What it does

  • Camera control — set eye/target, apply named view presets (top, front, back, right, left, perspective), or frame a specific entity. Setting the camera pins a CameraOverride so the editor’s orbit camera doesn’t fight your shot. (euca_render::Camera)
  • Materials & post-processing — per-entity PBR material overrides and the post-process stack live on their own page: Materials & post-processing.
  • ScreenshotPOST /screenshot captures the 3D viewport to a PNG (requires the render host).

Endpoints

MethodPathDescription
GET/cameraCurrent camera state (eye, target, fov, orthographic)
POST/cameraSet camera eye and/or target
POST/camera/viewApply a named view preset (top/front/back/right/left/perspective)
POST/camera/focusFrame a specific entity (distance clamped 5–20 units)
POST/screenshotCapture the 3D viewport as a PNG
Full schemas and a request playground are in the API reference.

Example

Against a render host, point the camera and frame an entity:
# Set an eye position and look-at target
curl -s -X POST http://localhost:3917/camera \
  -H 'Content-Type: application/json' \
  -d '{"eye":[0,12,-18],"target":[0,1,0]}'

# Or snap to a preset, then frame entity 0
curl -s -X POST http://localhost:3917/camera/view \
  -H 'Content-Type: application/json' -d '{"view":"perspective"}'
curl -s -X POST http://localhost:3917/camera/focus \
  -H 'Content-Type: application/json' -d '{"entity_id":0}'
On the headless server these calls return ok but render nothing — there is no camera or GPU to apply them to. Verify camera behavior on a host that actually draws frames.

Status

  • ✅ Camera pose, presets, entity framing, CameraOverride — shipped.
  • ✅ Forward PBR pipeline (Cook-Torrance GGX, 3-cascade CSM + PCF, MSAA + FXAA, HDR + ACES + bloom, SSAO) — shipped; GPU-driven indirect draw is active where the device supports it.
  • 🟡 Opt-in effects (TAA, motion blur, DoF, SSR, IBL, MetalFX) — built, off by default at most quality tiers. Volumetric fog is on by default. See Materials & post-processing.
  • ❌ Not in the live frame loop: a deferred/G-buffer path (the shipped path is Forward), and SSGI (dispatched but not composited). Bindless materials and mesh shaders are opt-in setters, not wired by default. See the honesty box in Engine internals.

Camera & render endpoints

Every camera, material, post-process, and fog endpoint, with schemas.