• v1.4.1 30b5086098

    v1.4.1 Stable

    github-actions[bot] released this 2026-09-26 02:21:23 +02:00 | 0 commits to main since this release

    🔔 3D Controller Overlay + v1.4.1

    A bugfix release for two things that didn't work the way they should: keyboard and mouse over the network, and the version number of the Linux AppImage.

    🌐 Keyboard and mouse now work over the network

    Until now, a network receiver only ever showed controller and joystick input. Keyboard and mouse models stayed dead on the receiving end, even though the sender was supposed to forward them. Three separate problems were behind it:

    • Keys never matched. The receiver compared each binding's key name (stored as key_w, key_left shift, ...) against SDL's mixed-case names (W, Left Shift), so no key binding ever lit up. It now uses the same key lookup as local input.
    • Mouse movement was always zero. The sender read the mouse's movement a second time after it had already been taken for the frame, so it only ever sent zeros. It now sends the real movement, added up between packets so nothing is lost at lower send rates, and steady movement is no longer dropped as "unchanged".
    • Scroll wheel and mouse buttons 6 to 8 weren't sent at all. They are now.
    • Only what the model uses is sent. The sender used to forward every key you pressed. Now it only sends the keys, mouse buttons, mouse movement and scroll that the window's model is actually bound to, so ordinary typing never goes over the network.

    Both machines need 1.4.1: an older sender still has the mouse movement problem, and an older receiver still has the key problem.

    🏷️ The AppImage now reports its version

    AppImage installers and managers (AppImageLauncher, Gear Lever and similar) showed no version for 3dco+, because the AppImage's desktop entry never included one. It now carries X-AppImage-Version, set from the same version that's built into the app, so the installed entry shows 1.4.1. The app itself (Settings title, tray tooltip, Help) already showed the right version and is unchanged.

    Downloads
  • v1.4.0 dd831645bf

    v1.4.0 Stable

    github-actions[bot] released this 2026-09-25 23:02:33 +02:00 | 4 commits to main since this release

    🔔 3D Controller Overlay + v1.4.0

    A release about knowing what you're running and what changed. The app now tells you when it's been updated, what's new, and when a newer version is out, and it can hand you models that shipped after your first install. Along the way the UI moved to a smooth new font with full color emoji.

    🆕 "What's New" after every update

    The first time you open a new version, a short window shows that version's release notes, the same text as this page. It appears once, never on a normal launch, and not at all on a fresh install.

    If the update ships models you don't have yet, they're listed in the same window with a checkbox each (pre-ticked), so you can add them in one click. Previously, new bundled models only ever appeared if you deleted your whole models folder.

    📦 New: Bundled Models section in Settings

    Every model that comes with the app, with its status in your library:

    • Add a missing one (or Add All Missing).
    • Restore... one to its original bundled version, handy after experimenting with a model's bindings or travel. You're asked to confirm first, and your current version isn't deleted: it's moved to model_backups in the data directory, so nothing is ever lost.

    🔎 Update check (optional)

    On startup, the app asks GitHub whether a newer release exists. If so, you get a popup with its release notes, an Open Download Page button, and a Don't remind me about this version checkbox; the next release will still be announced. Nothing is ever downloaded or installed automatically.

    Turn it off, or check by hand, from Help in Settings (Check for updates on startup / Check Now). If GitHub can't be reached, nothing happens and nothing is shown.

    🏷️ The version is visible everywhere now

    • The Settings window title (so also the taskbar/dock) and the tray icon tooltip.
    • Windows: right-click 3dco+.exe → Properties → Details.
    • macOS: Get Info on the app (it used to say 1.0 for every release).
    • The Help section, as before.

    🎨 Smoother text and color emoji

    The UI font is now Noto Sans, rendered through FreeType, replacing ImGui's built-in pixel font. Text is smoother, scales cleanly (Input History's Font Size especially), and characters that used to show up as ? now render: dashes, curly quotes, arrows, check marks, and full-color emoji (Twemoji).

    ⚡ Lower CPU usage

    A performance pass aimed at keeping the overlay out of your game's way:

    • Frame cap is actually respected now. The Settings window used vsync, which quietly made the whole app, controller windows included, render at your monitor's refresh rate instead of the Frame Cap. On a 144 or 240 Hz monitor that meant 144/240 frames per second instead of the default 60.
    • Settings throttles itself in the background. While another window (your game) has focus, Settings redraws 10 times a second instead of every frame, and not at all while minimized. It's back to full speed the moment you click into it.
    • Much cheaper per-part rendering. Shader uniform lookups no longer allocate memory, and models with a shader effect no longer check every built-in shader's file on disk for every part, every frame. In testing with the 168-key keyboard model, main-thread CPU per frame dropped by about half, and by about 60% with a shader effect applied.
    • Less work switching between windows each frame (GL function pointers are no longer reloaded when they're identical), fewer blocking window-system queries on Linux, and the controller window's right-click menu only runs while it's open.

    🔧 For maintainers

    • No more manual version bumps. The version comes from the git tag at build time and flows into the app, the .exe resource, and the Info.plist.
    • Release notes live in the repo. Commit release-notes/vX.Y.Z.md before tagging: the build embeds it for the What's New window, and the release workflow uses it as the GitHub release description, so there's no more pasting.
    • Removed dead code: the per-window V-Sync setting (overridden every frame, UI already gone), recreateControllerWindow(), and a handful of functions nothing called.
    • New build dependency: FreeType (built from source in all three Docker builds; see the README's Building section for native builds).
    Downloads
  • v1.3.3 cfe639fe7f

    v1.3.3 Stable

    Khyretos released this 2026-09-25 05:26:34 +02:00 | 10 commits to main since this release

    🕹️ 3D Controller Overlay + v1.3.3

    A feature release built around one real problem: a joystick hat is one physical part, but each of its directions needs to move it differently. A mesh can now respond to several inputs at once, each with its own movement — and two new bundled flightstick models put that to work straight away. Plus two highlight settings that were quietly lost on every save/reload.

    ➕ New: Additional Bindings (several inputs per mesh)

    Until now every mesh had exactly one input binding and one Travel/Travel Rotation. That's fine for a button, but not for a hat switch: one mesh, up to 8 directions, each wanting its own tilt — and a diagonal needs to move on two axes at once.

    Under Movement & Animation there's now an Additional Bindings list. Click Add Binding and each entry gets its own input picker (the same capture/dropdown picker used everywhere else), its own Invert, Travel X/Y/Z, Rot X/Y/Z, and its own Smooth Travel settings. Every frame, each active binding's Travel and Travel Rotation are added together — so a diagonal hat press that activates "up" and "left" simply tilts both ways at once, and two bindings pushing in opposite directions cancel out, with no special-case logic. A mesh highlights if any of its bindings is active.

    The mesh's existing binding and Travel stay exactly as they were (now its primary binding), so every existing model loads and behaves identically — no migration. Additional bindings save to info.json as a new extra_bindings list per mesh; older files without it simply load with none.

    Scope: additional bindings cover "press"-style inputs — buttons, hats, axis-as-direction, keyboard keys, mouse buttons. Sticks, raw axis passthrough, and touchpads aren't supported here, since they drive a single continuous position rather than several contributions that can be summed.

    🛩️ New bundled models: Flightstick DAT L & Flightstick DAT R

    Left- and right-handed flightstick models, with base, throttle, 16 buttons, and a hat that already uses Additional Bindings for its four directions. Huge thanks to DAT (3D channel) for the models — credits are also in each model's Description field.

    As with the existing Flightstick model, flightsticks vary a lot in button/axis layout, so expect to check or adjust the mapping for your own hardware (see Manual mapping in the README).

    💾 Fixed: two highlight settings not surviving a save/reload

    • Highlight Color (Global) opacity. The color picker saved only red/green/blue to settings.json and dropped alpha, so the highlight's opacity/intensity silently reset to fully opaque on every restart even though the color itself came back fine. All four channels are saved now. Existing settings.json files with the old 3-value color still load, with opacity defaulting to full as before.
    • Per-mesh highlight value is now written to and read from info.json alongside the rest of the mesh's fields, instead of always reloading as 0. Older files without it load unchanged.

    Both fixes are backward compatible — nothing to do on your end.

    🎨 UI polish

    • The Additional Bindings input picker and the Pick meshes... / Copy Travel to Selected row in Movement & Animation no longer overflow past the width of every other control in the panel.

    Upgrading: no action needed. Existing models and settings load exactly as before; the new fields are only written once you save.

    Downloads
  • v1.3.2 de9127329c

    v1.3.2 Stable

    github-actions[bot] released this 2026-09-23 05:32:56 +02:00 | 14 commits to main since this release

    🐛 3D Controller Overlay + v1.3.2

    A focused bugfix release — one hard crash on Windows, fully root-caused and fixed, plus the bundled example models finally show their textures correctly right out of the box.

    💥 Fixed: hard crash on Windows when closing a controller window

    This one took some real digging, so here's the full story for anyone curious (or hitting something similar in their own ImGui+GLAD project).

    Symptom: closing a controller window on Windows reliably crashed the whole app to desktop. Linux was unaffected. Every crash dump showed the identical signature — exception 0xc0000005, instruction pointer at exactly 0x0. The process was jumping through a null function pointer.

    Root cause: Dear ImGui's OpenGL backend bundles its own, separate GL function loader by default (imgl3w) — completely independent of the GLAD loader the rest of the app uses. That loader only ever initializes once, globally, for the whole process, and resets itself every time any window's ImGui backend shuts down — exactly what happens on close. The next window to render anywhere afterward silently rebound every pointer to its own context instead, leaving every other already-open window calling through pointers that were no longer valid for it.

    Fix: ImGui's backend is now told to skip its own bundled loader entirely and use GLAD instead, so there's only ever one, correctly-synced set of pointers.

    Two other real, legitimate bugs were found and fixed along the way — a missing GL-context restore after a mid-frame window close, and GLAD's own pointer table not staying synced across this app's several separate GL contexts. Neither was the actual root cause (the crash persisted through both), but both are fixed regardless.

    🖼️ Fixed: bundled example models not showing textures on a fresh install

    The DAT Keyboard and 60% Keyboard example models shipped with texture paths baked in from the original dev machine — meaningless the moment they're extracted anywhere else. There was already a fallback for exactly this case (added in 1.3.1), but it had a real bug of its own that quietly broke it: the healing code treated info.json's own filename as if it were a folder, building a path that could never exist no matter where the real texture actually was. That's fixed, and the two bundled models now ship with portable paths from the start too — nothing to fall back from at all.

    🎨 Texture names in Settings now show just the filename

    The Textures list under a part's Materials section was showing each entry's full stored path — 1: C:\Users\...\textures\diffuse.jpg — instead of just 1: diffuse.jpg. Cleaned up.

    🔧 For maintainers: Windows builds now carry debug symbols

    The Windows Docker build compiles with debug info now and splits it back out of the shipped .exe via objcopy, so the distributed binary stays the same small size as before, while a separate .debug file (published as its own release asset) preserves full symbols for that exact build — a real stack trace out of WinDbg is possible for any future crash, without needing to reproduce it against a special debug build first.


    Related: #3 first asked for a fast way to toggle click-through without digging through the main menu every launch — already addressed in 1.3.1 via the tray icon's per-window Click-Through toggle and the drag-to-move/click-through shortcut fix. Mentioning it here since this release's own investigation touched a lot of the same window-interaction code.

    Downloads
  • v1.3.1 90876ba8b4

    v1.3.1 Stable

    github-actions[bot] released this 2026-09-22 05:16:27 +02:00 | 17 commits to main since this release

    3D Controller Overlay+ v1.3.1

    ✨ New features

    • Textures now live inside your model's own folder. Adding a texture copies it into the model's own textures folder instead of reading it from wherever you originally picked it from forever after - moving or deleting that original file no longer breaks the model. Removing a texture cleans up its own copy too, as long as nothing else in the model still references it. Filenames are sanitized for cross-platform safety along the way (Windows forbids some characters and names that Linux/macOS allow).
    • Texture paths now self-heal on load. If a saved texture path doesn't resolve on this machine - a bundled example model, or one copied over from somewhere else - the app looks for the same filename in the model's own textures folder before giving up on it.
    • "Reset All Meshes to Global Material" – a bulk button alongside the existing "Reset All Meshes to Global Textures" (which now shares a line with "New Global Texture"), for applying a changed global material across a model where many meshes already have their own overrides, without switching to each one by hand.
    • "Remove Travel from All Buttons" – the opposite of the existing "Copy Travel to All Buttons", zeroing Travel/Travel Rotation back out across every button-type mesh in one step.
    • Checkbox mesh picker for Travel copying – replaces the old name-substring filter. Pick exactly which meshes to copy a button's Travel/Travel Rotation to from a checklist, rather than relying on a shared naming convention.
    • Add is now the default Highlight Blend Mode, alongside the existing Replace - and it can now be set per-mesh under Highlight Override, not just globally for the whole model.
    • Tray icon toggles for Click-Through and Drag to Move (Linux only, for now). Each open controller window - and its Input History window, if one's open - gets its own submenu in the tray icon's right-click menu with these two toggles, reachable without the OS-level permission the shortcut-based version needs. A fallback for setups where that permission was never granted (see the shortcuts fix below).

    🛠️ Fixes & improvements

    • Fixed: shortcuts silently not working on some Linux setups. The cause was almost always a permissions issue (this app's account not being in the input group) that produced no error anywhere. Settings now shows a clear ✓/✗ status once Enable Shortcut Monitoring is on, with the exact fix when it's red.
    • Fixed: an Ignore Button rule on a glyph style's Combine With target not taking effect. Glyph lookup itself already followed a style's Combine With chain; the ignore-rule check now does too.
    • Fixed: a per-mesh Highlight Override could silently reset itself. Its color and blend mode were always saved and loaded correctly, but the toggle controlling whether they were actually used was only ever saved, never loaded back - so it quietly reset to off every time the model reloaded from its file.
    • Flip Y now defaults to off for a newly-added texture. The previous default of on was tuned against a single texture early in development; broader use since showed it wrong more often than right.
    • Lower baseline CPU usage, especially noticeable on models with many meshes or several texture maps per part. GL shader compilation, uniform lookups, and texture-uniform name bookkeeping used to be rebuilt from scratch on every mesh, every single frame, regardless of whether anything had actually changed; all of it is now cached instead.

    ⚠️ Upgrading

    • No model or settings format changes in this release - existing models and settings work as-is.
    • The first time an existing model with textures is opened, nothing changes automatically; texture files only get copied into the model's own folder the next time a texture is actually added or re-picked through Settings.
    • Tray icon toggles are Linux-only in this release. On Windows and macOS the underlying data plumbing is in place, but the tray menu itself doesn't show these items yet.

    Full details in the README.md and INSTRUCTIONS.md

    Downloads
  • v1.3.0 4350511fd9

    v1.3.0 Stable

    github-actions[bot] released this 2026-09-20 07:04:57 +02:00 | 20 commits to main since this release

    3D Controller Overlay+ v1.3.0

    ✨ New features

    • PBR-style texture maps – alongside the existing Diffuse/Specular/Emissive, a texture can now be a Normal Map (surface detail — bumps, grain, panel lines — without extra geometry), Metallic Map, Roughness Map, or AO Map. Not a full physically-based renderer bolted on, but a practical approximation layered onto the existing lighting model.
    • Global textures & materials – set a texture (any type above) or a material (ambient/diffuse/specular/shininess/color) once at the model level instead of on every part. A part with its own texture of a given type, or its own custom material, always overrides the global one — global is purely a fallback for parts that don't define their own.
    • Right-click menu on controller windows – right-click anywhere on the model for Reset View, Enable/Disable Click-Through, and Enable/Disable Drag to Move, without digging into Settings.
    • Fully configurable shortcuts – Click-Through and Drag-to-Move can each be bound to any keyboard key now, not a fixed short list. A single Enable Shortcut Monitoring toggle (off by default) turns this on for every window, on every platform.
    • Model Description field – alongside the existing Source URL, for crediting a model's contributors, leaving setup notes, or anything else worth keeping with it. Saves and loads with the model itself.
    • Unsaved-changes confirmation – pressing Escape, closing a controller window, or using the tray icon's Quit now checks for pending changes first and offers Quit Anyway / Cancel, instead of silently discarding an accidental close.

    ⚠️ Upgrading

    • Existing models keep working as-is — a model saved before this release simply has no global texture or global material set, the same as any part that's never had one customized.
    • Back up your custom models and settings.json first, as general precaution with any update.

    Full details in the README.md and INSTRUCTIONS.md

    Downloads
  • v1.2.0 3755846f20

    v1.2.0 Stable

    github-actions[bot] released this 2026-09-15 23:05:38 +02:00 | 24 commits to main since this release

    🎮 3dco+ v1.2.0

    ✨ Highlights

    🕹️ Input History window. A separate, always-on-top overlay per controller/
    keyboard/mouse window, showing recent presses the way fighting games do —
    Raw text, ms/frame-annotated Notation, or a fully data-driven set of icon
    packs (Xbox, PlayStation, Switch, Steam Deck, Keyboard & Mouse, or ones you
    build yourself). Includes real compound-motion detection (quarter-circles,
    dragon punches, 360s — actually recognized as you play, not just
    displayable via manual mapping) 🌀, hold detection ⏱️, gyro flick capture,
    per-trigger analog depth, merge-simultaneous-presses, and a persistent log
    file. See the README/INSTRUCTIONS "Input History" section for the full
    settings reference.

    🎨 Custom Glyph Mappings. Build your own icon set the same way you'd map
    a custom controller — pick or upload an image per input, optionally fall
    back to another style for anything you don't define. Shows up as a Display
    Style choice immediately. Its own resizable window now, not embedded in
    Settings.

    🪟 Real per-pixel transparency on Windows. Controller windows and Input
    History both now support true window transparency via a companion-window
    mechanism, working around a GLFW/Win32 limitation that otherwise makes
    per-pixel transparency impossible on a GLFW window directly.

    🌈 Theme. A new Settings section for the app's accent colors, with a
    one-click reset — applies instantly across Settings and every window it
    opens.


    🚀 Added

    • 🕹️ Input History window with Raw / Fighting-Game Notation / icon-pack
      display styles, per-window capture settings (gamepad, keyboard, mouse,
      gyro), and a persistent log file
    • 🎨 Custom Glyph Mappings editor, now its own resizable, properly-decorated
      window
    • 🌀 Real compound-motion detection (236, 623, 360, etc.) with a
      configurable, auto-scaling timeout
    • ⏱️ Hold detection for buttons, D-Pad, and analog sticks, shown live and
      recorded with duration on release
    • 🌈 Theme customization (primary/light/dark accent colors)
    • 🔄 Texture Flip X/Y controls, alongside existing Offset/Scale/Rotation
    • 📝 Unsaved-changes indicator in the Model section
    • ⚠️ UV mapping diagnostics: loading a mesh with no meaningful UV variation
      now warns explicitly, instead of just rendering as one flat color with
      no explanation

    🐛 Fixed

    • 🎯 Touchpoint recenter (mouse-driven touch position) now actually
      returns to the touchpad's true center after the idle timeout, including
      self-healing a touchpoint's parent/position if the model file itself
      wasn't perfectly set up
    • 🪟 Log window opening with no title bar/borders on Windows, caused by a
      borderless window hint set for a different window leaking into it
    • 💾 Texture assignments weren't being saved — worked in the moment, lost
      on model reload or app restart
    • 📷 Camera pan (Pan X/Y) wasn't saved and reset to center on every reload
    • 🎚️ Capturing an input for a Dual Highlight axis always produced a
      one-directional binding, limiting travel/rotation to half its
      configured range regardless of which way the stick was actually moved
    • 📜 The main Settings window's scrollbar not appearing when content was
      taller than the window (present, just unreachable)
    • 🖱️ Scroll wheel highlight now behaves like an ordinary button press
      (instant on/off) instead of a ~300ms fade

    📌 Notes

    • Bundled icon packs are the CC0-licensed Xelu Free Controller & Key
      Prompts pack — see Credits.

    🙌 As always, thanks for playing with 3dco+ — bug reports and feature
    requests are welcome!

    Downloads
  • v1.1.1 9e2e2a4cf8

    v1.1.1 Stable

    github-actions[bot] released this 2026-09-03 02:59:43 +02:00 | 27 commits to main since this release

    3D Controller Overlay+ v1.1.1

    A focused bugfix + polish release on top of 1.1.0.

    ✨ New

    • Smooth Travel Animation – buttons, bumpers, and paddles can now ease into a press instead of snapping instantly. Enable it per mesh under Movement & Animation, set a duration, and use the new Copy to All Buttons / Unassign from All Buttons buttons to apply it across the whole controller in one click. Not available on sticks, triggers, or touchpads/touchpoints by design — those track your input's live physical position every frame, so easing them would just look like lag instead of a nice animation.

    🛠️ Fixes

    • Fixed Popup and Travel silently disabling each other. A mesh flagged as a bumper/paddle with "Popup Bumpers"/"Popup Paddles" enabled would stop responding to its press/travel animation entirely — the two now work together as expected.
    • Fixed the Touch Area's Yaw/Pitch/Roll sliders only rotating a small fraction of the angle actually shown (a degrees/radians conversion bug). They now match the displayed value exactly.

    🎨 Polish

    • Settings window: collapsible section headers ("Position," "Rotation," "Shader Effect," etc.) now have their own darker background tint, so the header reads as a distinct title bar instead of blending into the background above it.

    No breaking changes — existing settings.json/info.json files continue to work as-is.

    Downloads
  • v1.1.0 61bf70b2d9

    v1.1.0 Stable

    Khyretos released this 2026-09-01 06:32:21 +02:00 | 29 commits to main since this release

    3D Controller Overlay+ v1.1.0

    ✨ New features

    • Network functionality – send a window's live state (buttons, axes, touch) to another running instance of the app over UDP or TCP. Render your overlay on a second PC, a Steam Deck, or any machine on your network instead of the one generating input.
    • Custom shader effects – Pixel Art, Cel-shaded/Toon, Aurora, Infernal, Rainbow, a brand-new Galaxy shader, and a completely reworked Black Hole effect. Paste in your own ShaderToy-style shaders too, with an Add Resource button for assigning channel textures (or let unused channels auto-fill with generated noise).
    • Taskbar/tray icon on all three platforms – shows the app's own icon now instead of a generic placeholder, and macOS finally has a tray icon at all.
    • New, much smaller Steam Controller 2026 model.
    • "Enable Debug Mode" setting – verbose diagnostic logging is now opt-in instead of always-on, fixing a small load-time delay on models with lots of parts.
    • Per-mesh visibility now saves with the model instead of resetting every time you reopen it.

    🛠️ Fixes & improvements

    • Fixed transparent-background compositing on AMD and NVIDIA.
    • Fixed input lag/stuttering under click-through while another app has foreground focus.
    • The log window is now its own always-on-top window (previously it could get sent behind the settings window), and log lines are now copyable.
    • Scroll wheel bindings now highlight like a normal button instead of the old stick-style behavior.
    • Fixed OBS/other capture tools showing a blank null window title on Windows with Transparent Background enabled.
    • Windows builds no longer open a console window alongside the app.

    ⚠️ Upgrading from 1.0.0

    • Back up your custom models and settings.json first, as general precaution with any major update.
    • Existing settings.json/info.json files are expected to keep working — missing fields just fall back to sensible defaults.
    • Shader looks were tuned against a handful of controllers, not every model in the library — results depend on your controller's shape and base color. If one doesn't look right out of the box, try adjusting the mesh's color/brightness settings; most looks improve a lot with a little manual fine-tuning.

    Full details in the README.md and INSTRUCTIONS.md

    Downloads
  • v1.0.0 8532c8b237

    v1.0.0 Stable

    github-actions[bot] released this 2026-08-25 16:15:59 +02:00 | 35 commits to main since this release

    🎮 3D Controller Overlay + v1.0.0

    Feature‑complete stable release — built for streamers, tinkerers, and controller enthusiasts.


    ⚠️ A word on AI

    This is a passion project built with heavy AI assistance (ChatGPT/Claude). I’m being fully transparent about that.
    Every architectural decision — how input flows from SDL into the mesh hierarchy, how the settings/import system is structured, what gets a raw joystick fallback vs. a GameController mapping, how the build/packaging pipeline is put together — was made, reviewed, and debugged by me.
    AI was my collaborator; the design, testing, and responsibility for what ships are mine.
    If you find something wrong, please open an issue — I'd genuinely rather know.


    ✨ What's new in 1.0.0

    This fork builds on the original 3D Controller Overlay by Larf. The + brings a massive set of improvements:

    🖥️ Rendering & Customisation

    • Custom model import via Assimp (FBX, glTF, OBJ, etc.) — assign meshes to controller parts directly in the app.
    • Pivot‑point editing — drag any mesh's pivot in the 3D viewport instead of editing raw numbers.
    • Per‑part material alpha — make individual buttons transparent if you need to.
    • Dual‑highlight colors for axes (positive vs. negative) with adjustable deadzone.
    • Touch‑area visualisation — see exactly where the touchpad hit‑box is on your mesh.
    • Multi‑touchpad support — up to 4 pads × 2 fingers each.

    🎮 Input

    • Keyboard & mouse overlays (system‑wide) — works even when the app doesn't have focus.
    • Raw joystick fallback — if SDL doesn't recognise your controller, you can still map it manually.
    • Gyro & accelerometer — sensitivity, drift correction, and a configurable reset button combo.
    • Manual mapping UI — bind any button, axis, or hat to any mesh, with inversion support.

    🔧 Engineering

    • Structured logging (spdlog) with an in‑app log window.
    • CMake build system + Docker cross‑build scripts for reproducible packaging.
    • AppImage, Windows .exe, and macOS universal .app builds via GitHub Actions.
    • Embedded model library — the bundled models are packed into the binary, no separate assets folder to lose.
    • Updated to SDL3 and latest Dear ImGui for better performance and bug fixes.

    📦 Downloads

    Platform File Notes
    🐧 Linux 3dco+.AppImage Self‑contained, run chmod +x and execute.
    🪟 Windows 3dco+.exe May trigger SmartScreen – click "More info" → "Run anyway".
    🍎 macOS 3dco+-macos.zip Contains universal 3dco+.app. Right‑click → Open to bypass Gatekeeper.

    👉 All assets are attached to this release below.


    🔧 Quick start

    1. Download the package for your OS.
    2. Run the executable.
    3. The app will extract the built‑in model library on first launch (takes a few seconds).
    4. Open a controller window, pick a model, and start mapping your inputs.

    For detailed instructions, see the README and INSTRUCTIONS.md.


    🐛 Known issues (tracked)

    Issue Status Notes
    Transparent background not working on some GPUs/drivers ⚠️ Limitation Depends on driver support; a warning is shown in the UI.
    macOS: Accessibility permission required for keyboard/mouse 🧾 By design Grant in System Settings → Privacy & Security → Accessibility.
    Gyro reset combo not working on certain controllers 🕵️ Under investigation Use the "Reset Gyro" button as a workaround.
    Imported model preview sometimes crashes on large files ⚠️ Rare Reduce polygon count or use OBJ format.
    Racing wheel / pedals 🚧 Planned Not yet in model library or input path (coming in a future release).

    🙏 Credits

    • Original creator & engine: Larf — 3D Controller Overlay
    • This fork: designed, built, and maintained by me (Khyretos) as a homage and a personal test of AI‑assisted coding.
    • Third‑party libraries: GLFW, glad, SDL3, GLM, Dear ImGui, stb_image, Assimp, spdlog, fmt, nlohmann_json, miniz.

    💬 Feedback

    If you use this and enjoy it, please star the repo ⭐ – it means a lot.
    Found a bug or have a feature request? Open an issue.

    Happy streaming and gaming! 🎮

    Downloads