SYS::CORE

chloe.cx

A signal-processing game engine that converts raw creative intent into rendered reality.

INP::INPUT
INP

Hardware-agnostic input pipeline supporting multi-device binding, dead-zone calibration, and event coalescing across gamepad, keyboard, and pointer streams. Input signals are normalized before entering the processing chain.

AST::LOADER
AST

Streaming asset loader with dependency-graph resolution, hot-reload capability, and format-agnostic deserialization. Assets flow through a priority queue with memory-pressure-aware eviction policies.

SCN::PARSER
SCN

Hierarchical scene graph parser that builds spatial partition trees from declarative scene descriptions. Supports instanced sub-scenes, LOD chains, and streaming world tiles with seamless boundary stitching.

PHY::SIMULATION
PHY

Fixed-timestep physics simulation with broadphase spatial hashing, narrowphase GJK collision detection, and iterative constraint solver. Supports rigid bodies, soft bodies, and fluid particle systems within a unified integration loop.

BHV::BEHAVIOR
BHV

Composable behavior tree executor with blackboard state sharing, utility-based action selection, and GOAP planning fallback. Agent behaviors compile to bytecode for cache-friendly evaluation across thousands of concurrent entities.

RND::RENDERER
RND

Multi-backend rendering pipeline with deferred shading, clustered light culling, and indirect draw call batching. Render graph compiles draw commands into GPU-optimal submission order with automatic barrier insertion.

AUD::ENGINE
AUD

Spatially-aware audio mixer with HRTF binaural rendering, occlusion ray-casting, and reverb zone blending. DSP graph supports real-time parameter automation and sample-accurate event synchronization.

NET::STACK
NET

Deterministic lockstep networking with delta-compressed snapshots, client-side prediction, and server reconciliation. Transport layer abstracts over UDP, WebRTC, and WebSocket with automatic protocol negotiation.

RND::RENDER GRAPH v3.2.1

The render graph is a directed acyclic graph of render passes, each declaring its resource inputs, outputs, and transient allocations. The graph compiler performs dead-pass elimination, resource aliasing, and barrier batching to minimize GPU idle time. Custom passes are authored as simple structs implementing a two-method interface.

struct ShadowPass {
    fn setup(&mut self, builder: &mut RenderGraphBuilder) {
        let depth = builder.create_texture(TextureDesc {
            format: Format::D32Float,
            extent: [2048, 2048, 1],
            usage: TextureUsage::DEPTH_STENCIL,
        });
        builder.write_depth(depth);
        builder.read_buffer(self.light_buffer);
    }

    fn execute(&self, ctx: &RenderContext) {
        ctx.set_pipeline(&self.shadow_pipeline);
        ctx.bind_buffer(0, self.light_buffer);
        ctx.draw_indirect(self.draw_commands);
    }
}

Pass scheduling respects explicit ordering constraints while maximizing async compute overlap. The final submission plan is cached per-frame-graph-topology and invalidated only when passes are added or removed.

PHY::CONSTRAINT SOLVER v2.8.0

The iterative constraint solver uses a Gauss-Seidel approach with warm-starting from the previous frame's accumulated impulses. Contact manifolds are persistent across frames, enabling stable stacking and reducing solver iterations. Joint limits and motors are expressed as one-dimensional constraint rows sharing the same solver infrastructure.

fn solve_constraints(islands: &[Island], dt: f32) {
    for island in islands {
        let inv_dt = 1.0 / dt;
        // Warm start from cached impulses
        for c in &island.constraints {
            apply_impulse(c.body_a, c.body_b, c.accumulated);
        }
        // Iterative solve
        for _iter in 0..SOLVER_ITERATIONS {
            for c in &mut island.constraints {
                let lambda = compute_lambda(c, inv_dt);
                let clamped = clamp_impulse(c, lambda);
                apply_impulse(c.body_a, c.body_b, clamped);
                c.accumulated += clamped;
            }
        }
    }
}

Island detection partitions the world into independent groups of interacting bodies, allowing parallelized solving across CPU cores. Sleeping bodies are excluded from island formation until external forces wake them.

AUD::DSP GRAPH v1.4.3

The audio DSP graph processes sample buffers through a topologically-sorted chain of effect nodes. Each node operates on fixed-size blocks aligned to cache lines, enabling SIMD processing without gather operations. The graph supports dynamic routing, allowing runtime insertion and removal of effect nodes without glitching.

graph.connect(source, reverb, Port::Stereo);
graph.connect(reverb, compressor, Port::Stereo);
graph.connect(compressor, master, Port::Stereo);

// Insert a filter at runtime
let filter = graph.add_node(LowPassFilter::new(800.0));
graph.insert_between(source, reverb, filter);

// Parameter automation
graph.automate(filter, "cutoff", Envelope {
    points: vec![(0.0, 800.0), (1.0, 2400.0)],
    curve: Curve::Exponential,
});

Latency is bounded by the block size and graph depth. A typical configuration processes 256-sample blocks at 48kHz, yielding 5.3ms end-to-end latency through a four-node chain.