FVD++ is an advanced Force Vector Design tool for creating high-precision roller coaster layouts. This version is a modern rewrite of the original software, transitioning from legacy Qt-based roots to a high-performance Dear ImGui architecture. This transition establishes a modern foundation for expanding the tool with advanced design features. All ongoing development and updates will be hosted in this repository. Note that while this repository is named openFVeiD to distinguish it from repositories containing legacy code, the application itself is still referred to as FVD++.
This project is a successor to the original openFVD project. While the architecture has been modernized for today's hardware and workflows, it maintains the mathematical precision and core design philosophy of the original application.
- Original Author: Stephan "Lenny" Alt (alt.stephan@web.de)
- Modernization & Maintenance: Veia (h27ck@proton.me)
- Vulkan Renderer & macOS Port: Ercan "geforcefan" Akyürek (ercan.akyuerek@gmail.com)
- Lucas van den Bosch (Documentation and tutorials)
- Ercan "geforcefan" Akyürek (Early cross-platform testing, Vulkan renderer, macOS support)
Special thanks to:
- Loundlim (
loundlim) - Maverick (
barracuda4099) - nerfer10 (
peterc8117) - TheTalbotHound (
thetalbothound) - xwaldo (
xwaldo)
To submit feature requests, report issues, and keep track of development, with notifications on new releases, etc., join the Discord server.
- User Interface: Dear ImGui integration with custom style controls, UI scaling, and status bar.
- Curve Chasing: Bi-directional spline chasing that automatically adjusts subsequent transition durations to keep the ending node of a section anchored in 3D space.
- Custom Math Transitions: Evaluates custom mathematical expressions defined by the user.
- Design Limiters: Overlay indicators on force and banking graphs highlighting exceedances of configurable design standards.
- Parametric Track Styles: Generates 3D track meshes from GLTF/GLB models scanned from local folders (including standard and community-contributed styles) with an in-app interactive style builder.
- Playhead Alignment: Snaps transition start or end boundaries directly to the current viewport playhead position.
- Rider-Local Geometric Sections: Support for creating track shapes in a rider-local coordinate system (
geometricriderlocal). - Force Analysis Offsets: Seating position offset support for calculating forces at specific rider locations.
- Static Spline Templates: Import of external track shapes as static, non-editable guide splines in the 3D viewport.
- Target Solver: Iterative numerical solver to adjust a transition's duration or amplitude to hit target variables at its end.
- High-Resolution Screenshots: Multiplied viewport resolution capture (up to 8x) for anti-aliased images via F12 shortcut.
- Environment Settings: Support for configurable mist distance and custom skybox textures.
- Orthographic Views: Top, Front, and Side orthographic viewports with projected floor grids and highlighted axes.
- Viewport Navigation: Automatic zoom-to-selection and immediate rendering updates on parameter changes.
- Renderer: Vulkan viewport rendering (MoltenVK on macOS) with floor grid and shadow projection.
- Coaster Specifications Reference - A comprehensive list of heartline offsets and track gauges for various coaster manufacturers and styles.
The following parametric track styles have been contributed by the community. See How to Install Track Styles for instructions:
| Author | Style | Version |
|---|---|---|
| nerfer10 | Arrow | 1.0 |
| nerfer10 | B&M | 1.0 |
| xwaldo | B&M Classic | 1.0 |
| xwaldo | B&M Dive | 1.0 |
| xwaldo | B&M Modern | 1.0 |
| xwaldo | GCI | 1.0 |
| nerfer10 | Generic Flat | 1.0 |
| xwaldo | Intamin Hot Racer | 1.0 |
| Loundlim | Intamin LSM 0.9m | 1.0 |
| Loundlim | Intamin Tri Tube 0.9m | 1.0 |
| nerfer10 | Raptor | 1.0 |
| xwaldo | RMC | 1.0 |
| Loundlim | RMC IBox Track | 1.0 |
| Loundlim | RMC Topper Track | 1.0 |
| Loundlim | S&S Airlaunch & Looper | 1.0 |
| nerfer10 | Schwarzkopf | 1.0 |
| nerfer10 | Small Flat | 1.0 |
| xwaldo | Vekoma MK1101 | 1.0 |
The following clearance envelope track styles have been contributed by the community:
| Author | Style | Version | Reference Train / Model |
|---|---|---|---|
| Loundlim | Arrow 4D | 1.0 | Arrow 4D (NL2) |
| Loundlim | Arrow Corkscrew | 1.0 | Arrow Corkscrew (NL2) |
| Loundlim | Arrow Suspended | 1.0 | Arrow Suspended (NL2) |
| Loundlim | B&M Dive | 1.0 | B&M Dive (NL2) |
| Loundlim | B&M Dive with scoops | 1.0 | B&M Dive with scoops (NL2) |
| Loundlim | B&M Floorless | 1.0 | B&M Floorless (NL2) |
| Loundlim | B&M Flyer | 1.0 | B&M Flyer (NL2) |
| Loundlim | B&M Hyper (4 across) | 1.0 | B&M Hyper 4-across (NL2) |
| Loundlim | B&M Hyper (staggered) | 1.0 | B&M Hyper staggered (NL2) |
| Loundlim | B&M Hyper (staggered with scoops) | 1.0 | B&M Hyper staggered with scoops (NL2) |
| Loundlim | B&M Invert | 1.0 | B&M Invert (NL2) |
| Loundlim | B&M Sitdown | 1.0 | B&M Sitdown (NL2) |
| Loundlim | B&M Standup | 1.0 | B&M Standup (NL2) |
| Loundlim | B&M Wing | 1.0 | B&M Wing (NL2) |
| Loundlim | GCI Millenium Flyer | 1.0 | GCI Millenium Flyer (NL2) |
| Loundlim | Gerstlauer Bobsled | 1.0 | Gerstlauer Bobsled (NL2) |
| Loundlim | Gerstlauer Eurofighter (1&2) | 1.0 | Gerstlauer Eurofighter (NL2) |
| Loundlim | Gerstlauer Infinity 1st gen | 1.0 | Gerstlauer Infinity 1st Gen (NL2) |
| Loundlim | Gerstlauer Infinity 2nd gen | 1.0 | Gerstlauer Infinity 2nd Gen (NL2) |
| Loundlim | Gerstlauer Spinner | 1.0 | Gerstlauer Spinner (NL2) |
| Loundlim | Gravity Group Timberliner | 1.0 | Gravity Group Timberliner (NL2) |
| Loundlim | Intamin Hyper | 1.0 | Intamin Hyper (NL2) |
| Loundlim | Intamin Impulse | 1.0 | Intamin Impulse (NL2) |
| Loundlim | Intamin LSM | 1.0 | Intamin LSM (Serming) |
| Loundlim | Intamin Rocket | 1.0 | Intamin Rocket (NL2) |
| Loundlim | Mack Extreme Spinner | 1.0 | Mack Extreme Spinner |
| Loundlim | Mack LSM & Hyper | 1.0 | Mack LSM & Hyper (NL2) |
| Loundlim | Maurer Spinner | 1.0 | Maurer Spinner (NL2) |
| Loundlim | Maurer X-Car | 1.0 | Maurer X-Car (NL2) |
| Loundlim | Morgan Wooden Trailored | 1.0 | Morgan Wooden Trailored (NL2) |
| Loundlim | Permier LIM | 1.0 | Premier LIM (NL2) |
| Loundlim | Premier Skyrocket | 1.0 | Premier Skyrocket (Coasterpete) |
| Loundlim | PTC 4 & 6 seater | 1.0 | PTC 4 & 6-seater (NL2) |
| Loundlim | RMC Hybrid 1st gen | 1.0 | RMC Hybrid 1st Gen (NL2) |
| Loundlim | RMC Raptor | 1.0 | RMC Raptor (TheCodeMaster) |
| Loundlim | Schwarzkopf Looper 1st gen | 1.0 | Schwarzkopf Looper 1st Gen (NL2) |
| Loundlim | Schwarzkopf Looper 2nd gen | 1.0 | Schwarzkopf Looper 2nd Gen (NL2) |
| Loundlim | Vekoma Flying Dutchman | 1.0 | Vekoma Flying Dutchman (NL2) |
| Loundlim | Vekoma Inverted Boomerang | 1.0 | Vekoma Inverted Boomerang (NL2) |
| Loundlim | Vekoma Minetrain | 1.0 | Vekoma Minetrain (NL2) |
| Loundlim | Vekoma MK1101 | 1.0 | Vekoma MK1101 (NL2) |
| Loundlim | Vekoma Motorbike | 1.0 | Vekoma Motorbike (NL2) |
| Loundlim | Vekoma SLC | 1.0 | Vekoma SLC (NL2) |
| Loundlim | Vekoma STC | 1.0 | Vekoma STC (Pieter & Serming) |
- Unit Adoption: Selected units are not yet fully adopted across all UI panels; metric remains predominant.
- Graph Updates: Graphs do not update immediately when switching between time and distance section arguments.
FVD++ renders through Vulkan and needs:
- GLM (v1.0.3)
- Vulkan loader and headers plus glslangValidator for SPIR-V compilation (a Vulkan SDK installation covers both)
Ensure you have CMake, standard build tools, Vulkan and windowing libraries installed on your system:
- Linux (Debian/Ubuntu):
sudo apt install -y build-essential cmake libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libvulkan-dev glslang-tools libglm-dev
- macOS (Homebrew):
brew install cmake glm molten-vk vulkan-loader vulkan-headers glslang
- Windows: install the LunarG Vulkan SDK and GLM via vcpkg:
vcpkg install glm:x64-windows-static
If GLM is not found automatically by CMake, it will fall back to a local dependency folder. To configure this fallback:
- Open
CMakeLists.txtand locate the fallback section:set(DEPS_ROOT "/path/to/dependencies")
- Modify
/path/to/dependenciesto point to the directory containing yourglm-1.0.3folder.
- Open PowerShell and run:
(Adjust the
mkdir build; cd build cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_TOOLCHAIN_FILE="C:/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET=x64-windows-static cmake --build . --config Release
CMAKE_TOOLCHAIN_FILEpath to match your local vcpkg or dependency setup if different.)
- Open a terminal and run:
mkdir build && cd build cmake .. make
On macOS the build produces an application bundle with the community track styles included. Launch it with:
open build/fvd.appDownloaded builds (for example CI artifacts) are not notarized, so macOS reports them as damaged. Clear the quarantine flag once:
xattr -cr fvd.appUser data (options, logs, track styles, skyboxes) lives in ~/Library/Application Support/FVD++. The shipped track styles are copied there on first launch; running the app from a source checkout keeps using the checkout's track_styles/ directly.
Install each skybox in its own folder under skybox/. The preferred face names are
nx, ny, nz, px, py, and pz, with PNG, JPEG, BMP, or TGA extensions.
The cubemap_0 through cubemap_5 naming format is also detected. FVD++ watches this
directory, so complete sets appear in the Environment window without restarting.
.fvdenv files store environment presets. Presets anywhere under skybox/ appear in the Environment
Preset dropdown and can be switched without restarting. The selected preset is watched
and reapplied when the file changes.
Track styles customize the rails, spines, cross-sections, etc. of your coasters. You can easily install them using either of the following methods.
- Windows / Linux: Located right next to your
fvd.exe/fvdexecutable. - macOS: Located inside your user's Application Support directory:
~/Library/Application Support/FVD++. (You can open Finder, pressCmd+Shift+G, and paste this path to navigate there directly.)
With every official release, we publish a pre-packaged track_styles.zip containing all available community styles.
- Download
track_styles.zipfrom the Latest GitHub Release. - Extract the ZIP. It will contain a
communityfolder. - Move or copy this
communityfolder directly into your localtrack_stylesdirectory. - Use File > Reload Assets in the main menu (or restart FVD++) to immediately use them!
If you want to download a specific style from the repository (e.g. from the community/track_styles/ folder):
- Navigate to the style directory on GitHub (for example,
community/track_styles/Loundlim/Clearance Envelopes/). - Download the
.fvdstylefile (which defines the style) and its associated.glbmesh asset file (which contains the 3D model). - Place both files next to each other inside your local
track_stylesdirectory (or a custom subfolder inside it, such astrack_styles/mine/). - Use File > Reload Assets in the main menu (or restart FVD++) to immediately reload and select the style in the drop-down menu!
FVD++ is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License v3.0 as published by the Free Software Foundation. See the LICENSE file for the full text.