~/pixelsprout $ cat projects/rocco/README
rocco
A 3D game engine in Odin that runs games written in Roc. Source onGitHub.
~/pixelsprout $ rocco status --roadmap
stage 39/41one leaf per milestone
[x]M1one source tree, three desktop targetsgrown
- [x] Linux link spike in Docker
- [x] Replace the MSL shader string with a sokol-shdc build step
- [x] Add the three platform files
- [x] Roc build script and Windows input script
- [x] Add ROCCO_EXIT_AFTER_FRAMES to the host
- [x] Run bodies on Linux in Docker
- [x] Build and run bodies on Windows by hand
- [x] Rewrite the roadmap and README for three targets
- [x] Fix GL clip-space depth with sokol-shdc fixup_clipspace
- [x] Pin sokol as a git submodule
[x]M2the platform stops naming the gamegrown
- [x] Audit and extend the roc-odin-glue spec for the generic platform
- [x] Write the host side of Scene and link examples/entity-game
- [x] Link examples/cards end to end on the generic platform
- [x] Update the build script and checks; delete bodies and docs/examples
- [x] Write the camera package in packages/camera/
- [x] Add the allocation report and scripts/alloc-check.sh
- [x] Check both games on x64win by hand
- [x] Fix the nine glue review nits
[x]M3mesh handles and the manifestgrown
- [x] Give the renderer a mesh table indexed by id
- [x] Build the manifest from the mesh table
- [x] Draw every Scene entry with its own mesh and transform
- [x] Add the Meshes package and port the three games to it
[x]M4geometry from diskgrown
- [x] Parse .glb files into mesh data
- [x] Load every .glb in assets/meshes/ into the level arena at startup
- [x] Name primitives primitive/<name> and files by stem in the manifest
- [x] Draw the entity game player as the sprout and face its velocity
- [x] Commit sprout.glb and see the sprout in the entity game
[x]M5entities in Rocgrown
- [x] Move entities into the game's Model as List(Entity)
- [x] Implement parenting as a parent tag and one fold with the ordering invariant
- [x] Add runtime spawn and the id counter to the entity game
- [x] Reserve the pairing map for 4096 draws
[x]M6collision as datagrown
- [x] Add Collider and List(Contact) to the vocabulary
- [x] Compute contacts on the host: sweep and prune, then box and sphere tests
- [x] Make the entity game stop at the door and collect by contact
[x]M7one gameplay verbgrown
- [x] Add jump with gravity, grounded, solid kinds and the block
- [x] Add the goal pad, the win phase, the celebration, the restart and the stranger check
[x]M8tag unions in the gluegrown
- [x] Emit non-recursive tag unions from the Odin glue
- [x] Make Collider a tag union and delete its kind number
- [x] Turn on 4x MSAA for the window and pipeline
[x]M9commandsgrown
- [x] Seam and host: run commands from step, cursor from Scene
- [x] Glue: single-tag unions and a Box inside a returned record
- [x] Games: step returns commands, entity game binds ESC
- [x] Docs: commands and cursor in DESIGN, GLOSSARY and CONTEXT
[x]M10Kula slice onegrown
- [x] Vec3 package: packages/linalg and the entity game uses it
- [x] Orientation crosses the seam: Quat in linalg, Draw.rot, Camera.up, host slerp
- [x] Kula skeleton: games/kula in the scripts, World, Grid, Level and a drawn level
- [x] Kula Ball and View: rolls, turns, climbs, edge rolls, jumps, camera follows
- [x] Kula Rules and meshes: keys, exit, win, falling, restart, block.glb and ball.glb
- [x] Kula close-out: README, the check by hand, the Linux run, roadmap results
- [x] Kula: revisit the near-face distance
- [x] Kula: jump in place and the forward-jump rules
[x]M11lights as datagrown
- [x] Add Light to the vocabulary and give each game its lights
- [x] Light the scene from Scene.lights in the host
- [x] Add a point light to kula and record lights in the docs
[x]M12packs, textures and PBRgrown
- [x] Add a generation to mesh ids before level meshes unload
- [x] Tone map, black clear and the light retune
- [x] Pack term, ADR and docs
- [x] Load a pack through the seam
- [x] Unload and shared assets
- [x] Base colour textures
- [x] PBR materials
- [x] Kula Themes and level progression
- [x] Cubemap sky
- [x] Kula look
- [x]M13shadowsgrown
[x]M14the HUDgrown
- [x] UI docs: DESIGN.md and GLOSSARY.md
- [x] Link Clay into the host
- [x] Vocabulary: Rgba, Element and Scene.ui
- [x] Bake the SDF font
- [x] Draw the UI after the sky
- [x] packages/ui: nested helpers that build the stream
- [x] Kula: show the keys collected
[x]M15CI and the bundlegrown
- [x] Alpha: GitHub Actions CI matrix over the three targets
- [x] Alpha: publish the platform with roc bundle
- [x] Port pong to the current seam
- [x] Link Clay on x64win and link Windows with no Visual Studio
- [x] Neutral archive names and inputs --release
- [x] Commit the Linux CRT objects and library stubs
- [x] Make the macOS sysroot from a reviewed catalog
- [x] CI matrix on macOS arm64 and Ubuntu
- [x] Release workflow with roc bundle
- [x] Move Kula to Pixelsprout/kula
- [x] Pong becomes the UI test
- [x] Entity-game tests the sun shadow
- [x] Entity-game tests point lights
- [x] Entity-game tests the sky
- [x] Commit the Windows import libraries
- [x] CI job on Windows
- [x] ADR 0005 and CONTEXT.md for Queries
- [x] Seam: Scene.queries, QueryResults and ContactsOf
- [x] Raycast query
- [x] Overlap query
[x]M16Benchmarksgrown
- [x] True --release build
- [x] Prefactor: the per-Frame run loop as one procedure
- [x] Args in Config
- [x] Headless and Lockstep, with the step and view Spans to CSV
- [x] Tracer bullet: the Model size bench game through a summary
- [x] The other Spans and windowed Lockstep
- [x] The full benchmark protocol
- [x] Colliders bench game
- [x] Draws bench game
- [x] UI bench game
- [x] Tuned Model size bench game
- [x] The Odin twin build and the Model size twin
- [x] Colliders twin
- [x] Roc heap A/B: allocation map against size header
- [x] Mixed bench game and the headline figure
- [x] The method document and the first reference run
[x]M17Launchgrown
- [x] Tracer bullet: the fifth call through the header, the glue, Game calls and every game
- [x] The window options, the GPU sizes and the Launch check
- [x] The step rate from Launch
- [x] The capacities from Launch
- [x] Docs, the high_dpi measurement and the dex closures
[x]M18docs and v0.2.0grown
- [x] The docs step and the first page
- [x] The tutorial character
- [x] Doc comments and the missing-comment check
- [x] Docs in the release
- [x] The site renders the docs
- [x] Tutorial chapters 1 to 3
- [x] Tutorial chapters 4 to 7
- [x] Guide pages 2 to 10
- [x] Release v0.2.0 and move Kula
[x]M19the Bridgegrown
- [x] Prefactor: render to an offscreen target
- [x] Bridge transport, hello and quit
- [x] The step op
- [x] The scene op
- [x] The screenshot op
- [x] Drivers: bridge.py, screenshot.sh and the CI check
- [x] Finish the Bridge docs
[x]M20Audiogrown
- [x] Kula: landing sound
- [x] miniaudio in the host
- [x] The audio Vocabulary change
- [x] Sounds as Pack assets
- [x] Play: voices, the Listener and the mixer test
- [x] Loops: pair Scene.loops by Loop id
- [x] Tutorial chapter 8 and the sound guide
- [x] Cut v0.3.0
[x]M21a view against a treegrown
- [x] Glue: recursive unions through a List
- [x] The tree crosses the seam
- [x] Docs and figures for the tree
- [x] Cut v0.4.0
- [x] Kula: the HUD as a tree
[x]M22the 3D treegrown
- [x] A Collider turns by a Quat
- [x] Pose in packages/linalg
- [x] The 3D tree crosses the seam
- [x] Docs for the 3D tree
[x]M23Gamepadgrown
- [x] The gamepad Vocabulary change and the Bridge
- [x] macOS: GameController through dlopen
- [x] Windows: XInput through LoadLibraryA
- [x] Linux: evdev and inotify
- [x] Tutorial chapter 9, the gamepad guide and ADR 0015
- [x] Cut v0.5.0
- [x] macOS GIP probe: the PDP start packets and report layout over libusb
- [x] macOS: wired Xbox One pads through GIP over IOKit USB
[x]M24Animationgrown
- [x] The Pose Vocabulary change and the Manifest Clips
- [x] Rig Pip and key Idle and Walk in the tutorial Blender script
- [x] The loader reads one Skin and its Clips
- [x] Sample a Clip and mix two by the fade
- [x] Skin on the GPU, with shadows and interpolation
- [x] Tutorial chapter 10, its guide page and ADR 0016
[x]M26Speakersgrown
- [x] The Speaker Vocabulary change and the Sound duration
- [x] Once Speakers in the host
- [x] Tutorial chapter 8 with Speakers, the sound guide and ADR 0017
[x]M27the announcement releasegrown
- [x] Kula: move to v0.6.0-rc.1 and play with a gamepad
- [x] Hear chapter 8 on Linux and Windows on the rc
- [x] Kula: convert Roll Away Hiro levels 1 to 3
- [x] Grill the Kula features that Hiro levels 1 to 3 need
- [x] Check the docs end to end on the rc
- [x] Run the Kula rc checks
- [x] Tag v0.6.0
- [x] Kula: move to v0.6.0 and merge
- [x] Draft and publish the announcement
- [x] Kula: pick up items by distance and move them
- [x] Kula: the level score, the total score and the HUD layout
- [x] Kula: bronze coins
- [x] Kula: fruit
- [x] Kula: the level clock
- [x] Kula: the pickup flash
- [x] Kula: Hiro levels 1 to 3 replace Kula's levels
- [x] Kula: bounce on every landing and squish the ball
- [x] Kula: the level end sequence
- [x] Kula: the key model and key sounds
- [x] Kula: the hiro Theme
- [x] Kula: rendered pyramids in the hiro sky
- [x] Kula: play again from Won
- [x] Kula: show the clock all the time
[x]M29Ports over the Bridgegrown
- [x] Vocabulary: Tell, Listen and QueryResults.ports with the Port module
- [x] The port queue in the host
- [x] The tell op and protocol 2
- [x] The Driver gains tell
- [x] The bridge-echo example and the Bridge check
- [x] Documents: guide/bridge.md and ADR 0018
[x]M30UI textgrown
- [x] T3: Text measure in Roc
- [x] T1: Text edge and clear colour
[x]M31Pointer and devicesgrown
- [x] Pointer input for the UI
- [x] Clip UI boxes and scroll them from the Model
- [x] T4: Pointer, hit test, overflow, parent float
- [x] T6: Real devices through the Bridge
[x]M32UI widgetsgrown
- [x] T5: Widgets in packages/ui
- [x] T11: Rename the UI Box tag to Panel
[x]M33Lightinggrown
- [x] Cascaded shadow maps
- [x] Grill: how many lights a scene needs and how to select them
- [x] T7: Emissive and glow
- [x] T8: Light list per Draw
[x]M34UI imagesgrown
- [x] Kula: key icons in the HUD
- [x] Image assets: the image/ Pack kind, Manifest size, platform Image
- [x] UI images: PanelConfig.image, texture runs, image shader mode
- [x] Kula: move to the images release and migrate to Panel
- [x] Agent Town: migrate to Panel and PanelConfig
- [x] Agent Town: status icons in the ledger
[x]M35Materials per primitivegrown
- [x] Prefactor: a Mesh holds parts
- [x] Load and draw one part per material
- [x] A multi-material example with a Bridge check
- [x] Release v0.8.0 and check the otter's glowing gear
[x]M36Surface detailgrown
- [x] Vertex tangent
- [x] Normal and occlusion maps
- [x] Lengyel tangents
- [x] Glow panel with a Bridge check
- [x] Release v0.9.0 and close Milestone 36
[x]M37Post and Environmentgrown
- [x] Fog toward the Theme colour
- [x] Choose the tone map per game
- [x] HDR target and post pass
- [x] Scene.environment
- [x] Fog
- [x] Bloom
- [x] Glow bloom and tone maps with a Bridge check
- [x] Release v0.10.0 and close Milestone 37
[x]M38Transparencygrown
- [x] Prefactor: alpha modes in the part material
- [x] MASK: cutout parts
- [x] BLEND: sorted glass after the sky
- [x] Transmission note, guide and ADR
- [x] A glass tube in the glow example with a Bridge check
- [x] Release v0.11.0 and check Agent Town's glass tube
- [x]M39Clustered lightsgrown
- [x]M40Selection outlinegrown
[x]M41Particlesgrown
- [x] Particles: emitters drawn as billboards
[~]M42Game fontsgrowing
- [ ] Game-provided fonts in assets/fonts
[~]M43Animation 2growing
- [x] Pip Run Clip and examples/animation
- [x] Mesh.synced_time: the fade Clip's time at the same phase
- [x] Grounding: lift a skinned Draw so no foot sinks
- [x] guide/animation.md: Clips, fades, phase sync and Grounding
- [ ] Check skinned drawing on GL 4.3 limits and on a Windows machine
[~]sideBeside the milestones: opportunistic workgrowing
- [ ] Debug drawing: lines, wireframe, text
- [x] Audio via saudio, returned as data
- [ ] The allocation pool behind roc_alloc and roc_dealloc
- [ ] Debug and speed parity for allocator counters
- [x] Simplify the macOS sysroot script to keep the SDK layout
- [ ] World-space sprites with an orthographic camera
- [ ] An equirectangular sky loader
- [ ] Blender as a level editor
- [x] A key.glb for Kula
- [x] Kula: a fall lands on a block below instead of passing through it
- [x] Kula: check when the key at (0, 2, 5) is collected on a jump from a roll
- [ ] Kula: forced roll on landing from a fall or jump
- [ ] Kula: screen shake when a fall lands at top speed
- [x] Kula: keep the ball spinning during a jump and a fall
- [x] Kula: explore the ball's idle bob
- [x] Kula: explore the jump stretch and landing squish
- [x] Engine: scale a Draw along a world axis
- [x] Kula: copy the idle bob
- [x] Kula: a fading point light when the ball collects a key
- [x] Game-level engine settings
- [ ] A Zelda-style open-world demo game
- [x] Turn on high_dpi
- [x] Grill: generalise Contacts into a Queries list
- [ ] Find the dev shim on nightly-2026-10-11 and fix the audit steps
- [x] Move the glue submodule to nightly-2026-10-11-7d256b9
- [ ] Investigate a one-off bad free in entity-game on Linux
- [ ] Benchmark regression tracking
- [x] A default for every record a game builds
- [x] Collision search limits the headline figure
- [ ] model-size-tuned is slower than model-size
- [ ] An empty UI costs 52 us of ui_layout per Frame
- [ ] Roc view Span varies between processes in the ui bench game
- [ ] render_submit limits the headline figure
- [ ] A Quit from init does not stop a windowed run
- [ ] CI: skip the full run when only docs/ or .dex/ changes
- [ ] Check Linux with an Xbox pad
- [ ] A debug Linux game build does not link: nanosleep is not in the stubs
- [ ] Morph targets in the glTF loader
- [ ] Clips on nodes with no Skin
- [ ] Read a Joint's position back to the game
- [ ] More than 64 Joints per Skin
- [ ] Files that mix skinned and unskinned meshes
- [x] Engine: a Draw that casts no shadow
- [x] Instancing and frustum culling
- [x] Camera.project: a world point to window pixels
- [x] Input.window: the logical window size in each step
- [ ] Clay Words wrap can give a text line of length -1
- [ ] Nine-slice Panels
- [ ] Tiled images in a Panel
- [ ] Launch.image_filter, a default filter for every Image
- [x] One Host assembly module for app_run and the tests
- [x] Break the engine dependency cycle with six moves
- [x] Move the Pairing out of frame_render.odin
- [ ] Choose the Sphere's rings and segments
- [x] Cutout shadows for MASK parts
- [x] Bound PNG decode scratch while loading textured meshes
- [ ] Investigate virtual shadow maps for Rocco
- [ ] Engine distance culling and mesh LODs
- [ ] Two-bone IK with foot contacts
- [ ] Root motion: a Clip's ground speed for the game
- [ ] Load CUBICSPLINE keys in Clips
- [x]sideBring examples/pong back in line with the Scenegrown
- [x]sideChoose the Kula lookgrown
[~]sideExpose shadow quality controls and measured preset helpersgrowing
- [x] Implement live shadow controls and startup quality helpers
[x]sideGame shader assets, materials, and reloadgrown
- [x] Validate the portable shader contract and asset format
- [x] Preserve named material slots and imported vertex colours
- [x] Compile game shader assets and generate typed Roc helpers
- [x] Load Shader assets and apply Surface material overrides
- [x] Run ordered game Post shaders with declared inputs
- [x] Watch and reload compatible game Shader assets
- [x]sideLight surfaces from a cubemap environmentgrown
- [ ]sideMore than one shadow casterseed
[x]sideShared code for gamesgrown
- [x] Spike: expose the vocabulary types from the platform to games
- [x] Research: give games named sokol key codes
- [x] Grill: where the vocabulary types and key codes live
- [x] Add pf.Vocabulary and port the three games to it
- [x] Generate pf.Key from sokol and port the three games to it
[~]sideStage prototype engine gapsgrowing
- [ ] Snap each glyph to whole pixels in small UI text
- [x] Camera.unproject: a pointer ray for picking
- [x] Name the shader and the Pack when a Surface Shader is absent
- [x] A Log Command: game text to stderr and the Bridge
- [x] Attach: children placed at a Joint
- [x] Sky blend and sky fog
- [x] Document how to tint only part of a model
- [x] A Cylinder Primitive
- [ ] A dim-occluded policy for the example outline
- [ ] Spike: Metal GPU frame time
- [ ] A Roc repro: F32 floor and to_u64_wrap overflow
[~]sideWeb builds through WebGPUgrowing
- [x] Web spike: link a Roc wasm32 app to an Odin host with emscripten
- [ ] Web spike: emit 32-bit layouts from OdinGlue
- [ ] Web spike: sokol WebGPU and the UI pass
- [ ] Web spike: wgsl shader backend and the lit pass
- [x] Web spike: arenas without virtual reserve
- [ ] Web host: Packs, audio and the itch build
- [ ] Web Bridge over WebSocket
~/pixelsprout $ git log devlog --oneline -- rocco