{"id":50448253,"url":"https://github.com/ilia-smelkov/holoroll","last_synced_at":"2026-05-31T23:01:27.946Z","repository":{"id":361620583,"uuid":"1221765693","full_name":"Ilia-Smelkov/HoloRoll","owner":"Ilia-Smelkov","description":"Reaper util for playing 3d animations based on low-weight Obj and MDD file formats","archived":false,"fork":false,"pushed_at":"2026-05-31T15:08:15.000Z","size":886,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T15:16:06.828Z","etag":null,"topics":["gameaudio","gamedev","mdd","reaper"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Ilia-Smelkov.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-26T16:49:29.000Z","updated_at":"2026-05-31T14:57:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Ilia-Smelkov/HoloRoll","commit_stats":null,"previous_names":["ilia-smelkov/holoroll"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/Ilia-Smelkov/HoloRoll","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilia-Smelkov%2FHoloRoll","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilia-Smelkov%2FHoloRoll/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilia-Smelkov%2FHoloRoll/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilia-Smelkov%2FHoloRoll/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Ilia-Smelkov","download_url":"https://codeload.github.com/Ilia-Smelkov/HoloRoll/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Ilia-Smelkov%2FHoloRoll/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33752286,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gameaudio","gamedev","mdd","reaper"],"created_at":"2026-05-31T23:01:23.687Z","updated_at":"2026-05-31T23:01:27.941Z","avatar_url":"https://github.com/Ilia-Smelkov.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# HoloRoll\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Platform: Windows x64](https://img.shields.io/badge/platform-Windows%20x64-blue.svg)](#)\n[![REAPER 6+](https://img.shields.io/badge/REAPER-6.0%2B-orange.svg)](https://www.reaper.fm)\n\n**See your animation while you score it.**\n\nHoloRoll plugs into REAPER and shows your 3D animation right inside\nthe DAW. The animation plays in lock-step with the playhead, so when\nyou're picking a sound for a footstep, a sword swing, or a UI flourish,\nyou can actually *watch* the moment instead of guessing from a waveform.\nDrop a `.glb` from Blender into your project's animations folder, and\nit shows up on the timeline as a media item you can move, copy, and\nlayer sounds on top of.\n\n\u003e **Status: 0.11.1.** Drop animations from Blender into a folder, get\n\u003e them on the timeline, design sound to match. Everything below works\n\u003e today on Windows.\n\u003e\n\u003e **Coming next: Unreal Engine integration.** A live bridge from your\n\u003e Unreal project so HoloRoll can pull animations directly from\n\u003e sequences without exporting `.glb` files manually. This is the\n\u003e headline feature we're building toward — the file-based workflow\n\u003e here is the foundation it'll sit on top of.\n\u003e\n\u003e See [CHANGELOG.md](CHANGELOG.md) for what's shipped and\n\u003e [ROADMAP.md](ROADMAP.md) for what's next.\n\n\u003c!-- TODO: drop a GIF here once the visualizer pass is in --\u003e\n\n## What it does\n\n- **Watch animations on the timeline.** Each animation is a media item.\n  The viewport renders whatever item is under the playhead, so you scrub\n  motion the same way you scrub audio.\n- **Drop and go.** Save a `.glb` from Blender into\n  `\u003cproject\u003e/Animations/\u003cproject_name\u003e/`, drag it onto the viewport, or\n  drop it in the global Incoming folder — HoloRoll picks it up within a\n  second and asks if you want to place it.\n- **Variations for sound design.** One animation, many items. Set\n  Variations to 3 and you get `door_open`, `door_open_02`,\n  `door_open_03` — same motion, different items, layer different\n  sounds on each.\n- **Pre-roll / post-roll buffers.** When the playhead sits a second\n  before an item, the viewport already shows frame 0. After the item,\n  the last frame holds. Gives you breathing room for anticipation\n  whooshes and tail reverbs without affecting the item's actual length.\n- **Scale awareness.** A 1.80 m reference figure stands next to your\n  model so you can eyeball whether you're scoring a person, a Godzilla,\n  or a doorknob. Dimensions plate in the corner shows the live bbox in\n  metres.\n- **3/4 default framing.** New animations snap to a Blender-style\n  front-right-top view, with the camera distance auto-fit to the model.\n\n## Formats\n\n**`.glb` (skinned glTF) is the primary format.** Export from Blender's\nFile → Export → glTF 2.0 with Animation enabled. Multiple animations\nin one file become separate library entries.\n\n**`.mdd` (Blender Point Cache)** is also supported, for vertex-level\nanimation that doesn't fit a skinned rig (cloth sims, soft bodies,\nshape-deforming effects). Pair it with a matching `.obj` for full\nshading; without an `.obj` you get a points-only render.\n\n## Installation\n\n### From installer (recommended)\n\n1. Download `HoloRoll-Setup-\u003cversion\u003e.exe` from the\n   [Releases page](https://github.com/Ilia-Smelkov/HoloRoll/releases).\n2. Run it. The installer detects your REAPER plugin folder automatically.\n3. Restart REAPER. Run the action `HoloRoll: Toggle Viewport` from the\n   Action List (or assign it a hotkey).\n\nThe installer supports headless invocation — see\n[docs/headless_install.md](docs/headless_install.md).\n\n### From source\n\n```powershell\ngit clone https://github.com/Ilia-Smelkov/HoloRoll.git\ncd HoloRoll\n.\\scripts\\bootstrap.ps1 -Preset x64-Release -DeployToReaper -KillReaper -RestartReaper\n```\n\nRequirements: Windows 10/11 x64, Visual Studio 2022, CMake 3.24+.\n\n## Quick start\n\n1. Save your REAPER project (HoloRoll uses the project folder).\n2. Action List → `HoloRoll: Toggle Viewport`.\n3. Drag a `.glb` from Explorer onto the HoloRoll viewport.\n4. Click `Place all` in the modal that appears.\n5. Press Play. The item under the playhead drives the viewport.\n\n## Camera controls\n\n| Input | Action |\n|---|---|\n| RMB hold + drag | Mouse-look |\n| RMB hold + WASD | Fly forward / back / strafe |\n| RMB hold + Q / E | Move down / up |\n| Mouse wheel | Adjust fly speed |\n| LMB drag on rotation gizmo arc | Rotate object around that axis |\n| `Reset camera` button | Snap to 3/4 default framing |\n\n## Roadmap\n\nSee [ROADMAP.md](ROADMAP.md) for the full plan.\n\n**The big one: Unreal Engine bridge.** Live link between an Unreal\nproject and HoloRoll, so animations and sequences come straight from\nthe game without going through `.glb` exports. This is what HoloRoll\nis ultimately built for — game audio designers scoring directly\nagainst the actual in-engine motion. The current `.glb` workflow is\nthe groundwork for that pipeline.\n\nOther planned work: Unity bridge, motion analysis (auto-detect\nbone movement keypoints to suggest hit timings), region manager UI,\nfull UI presentation pass.\n\n---\n\n## Format details\n\nIf you just want to use HoloRoll, you don't need this section.\n\n### GLB\nStandard glTF 2.0 binary. HoloRoll loads the first skinned mesh's\nfirst primitive, walks the joint hierarchy, samples animation channels\nat the configured fps, and bakes per-frame vertex positions via linear\nblend skinning on load.\n\nSupported:\n- LINEAR and STEP interpolation\n- UBYTE / USHORT joint indices, FLOAT / UBYTE / USHORT joint weights\n- glTF default coordinate space (Y-up, right-handed)\n\nNot supported:\n- Morph targets / vertex animation without skinning\n- CUBICSPLINE keyframes (silently degraded to LINEAR)\n- Multiple meshes / multiple primitives per mesh (first wins)\n- Embedded textures (stripped on load — HoloRoll uses Lambert grayscale)\n\nMultiple animations inside one `.glb` produce separate library entries:\n`\u003cfilestem\u003e.\u003canimname\u003e` (or `\u003cfilestem\u003e.\u003cindex\u003e` if unnamed).\n\n### MDD\nBig-Endian Blender Point Cache. Layout: `int32 totalFrames`,\n`int32 totalPoints`, then `float32 times[totalFrames]`, then\n`float32 coords[totalFrames × totalPoints × 3]`.\n\nOBJ pairing:\n1. Same basename: `walk.mdd` ↔ `walk.obj`\n2. Fallback: any OBJ in the folder whose vertex count matches the MDD's\n   `totalPoints`. One `character.obj` can serve `character_idle.mdd`,\n   `character_walk.mdd`, etc.\n\n### Folder layout\n```\n\u003cproject_dir\u003e/\n  MyLevel.rpp\n  Animations/\n    MyLevel/             \u003c-- per-project subfolder, isolated\n      door_open.glb\n      character_idle.glb\n```\n\nGlobal Incoming folder (auto-routes into the active project):\n`%APPDATA%\\REAPER\\UserPlugins\\HoloRollIncoming\\`\n\n### Config\n\n`%APPDATA%\\REAPER\\UserPlugins\\holoroll_config.ini`:\n\n```ini\nfps=24\nregion_gap_seconds=1\nregion_name_prefix=\nhot_reload.enabled=1\nscene.show_ground_plane=1\nscene.ground_radius=20\nscene.grid_step=1\nscene.show_bbox_dimensions=1\nscene.show_grid_labels=1\nscene.show_reference_human=1\nplacement.variations=1\nplacement.pre_roll_seconds=1\nplacement.post_roll_seconds=1\nplacement.region_overhang_seconds=0.5\n```\n\n### Actions registered in REAPER\n\n| Command | Description |\n|---|---|\n| `HoloRoll: Toggle Viewport` | Show / hide the docked viewport |\n| `HoloRoll: Choose Animations Folder` | Override the project's default folder |\n| `HoloRoll: Place All Animation Regions` | Place one item + region per animation |\n| `HoloRoll: Open Config File` | Open `holoroll_config.ini` in editor |\n| `HoloRoll: Reload Config` | Re-read the config from disk |\n\n## Contributing\n\nBug reports and PRs are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md).\n\n## License\n\n[MIT](LICENSE) — Copyright (c) 2026 Ilia Smelkov / Muted Games.\n\nThird-party components:\n\n- **REAPER SDK** in `third_party/reaper-sdk/` — © Cockos Inc.,\n  distributed under its own permissive license.\n- **ImGui** — © Omar Cornut and contributors, MIT-licensed.\n- **tinygltf** — © Syoyo Fujita and contributors, MIT-licensed.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filia-smelkov%2Fholoroll","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Filia-smelkov%2Fholoroll","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Filia-smelkov%2Fholoroll/lists"}