~/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
  1. 2026-10-28Rocco v0.6.0(announcement)
  2. 2026-10-27Hello Rocco!(announcement)
  3. 2026-09-30Walking through the entity game(walkthrough)