Repository navigation
Releases: Justyyin/ForzaTechStudio
Release list
ForzaTech Studio EXT V0.9.2.2-fh6fix
ForzaTech Studio EXT V0.9.2.2 — Complete List of Changes and Additions
Status: September 26, 2026 · Base: D3FEKT/ForzaTechStudio, tag V0.9.2.2 (commit 4f373c5) · Local fix author: Justyn
Creator: D3FEKT/ForzaTechStudio
1. Overview
This version fixes the complete set of issues behind "Forza Horizon 6 files cannot be opened, edited, or saved" and adds local extensions: automatic FH5/FH6 detection, a grey Horizon UI, direct game-root access on any drive, and an updated credits entry. Everything stays local — nothing is published.
2. Bug Fixes (FH6 Compatibility)
2.1 ZIP Extraction: Compression Method 22 (XMem Codec 2 / LZ77)
Problem: FH6 archives declare entries with compression method 22. The previous reader only knew Stored, Deflate, and LZX (21) and aborted with a debug line — the result were silent 0-KB files without any error message.
Changed:
- Added
CompressionType.LZ77 = 22andXMemCodecType.LZ77 = 2; decompression viaXMemDecompressStream(xcompress64.dll). - Errors are logged (
CustomZipFile.ExtractionErrors), partial files are cleaned up, extraction continues for the remaining entries. - Unknown methods now throw a descriptive exception instead of failing silently.
2.2 ZIP: Forza Extra Field 0x1123 (Authoritative Payload Offset)
Problem: ForzaTech archives store the absolute position of the compressed payload in the extra field 0x1123. The reader ignored this field and computed the offset from the local header length — whenever the local header and the actual data position diverged, entries were extracted incorrectly or discarded.
Changed: TryGetForzaDataOffset now evaluates the field in central and local headers; existing values are authoritative for both read and write paths.
2.3 Saving: ReplaceEntry Wrote Invalid Archives
Problem: ReplaceEntry wrote pre-deflated bytes into entries declared as NoCompression. The declared method and the actual stored bytes contradicted each other — every conforming ZIP reader, including the game itself, rejected the saved file.
Changed: ReplaceEntry now writes the local header, central directory, and EOCD itself. Unchanged entries keep their original payload and compression method; only the replaced entry is recompressed as Deflate (method 8). 0x1123 fields are rewritten consistently in the local and central headers.
2.4 Follow-up Fixes (Review Findings)
- Stale 0x1123 offset: When the field was missing in the source archive, the offset was computed before appending the field (6 bytes too early, local/central inconsistent). The field is now appended first, then the offset is derived from the final length.
- Directory roundtrip: Directory and empty entries lost their original name bytes, flags, timestamps, and extra fields (UTF-8 re-encoding instead of raw data). The local header is now read for all entries.
2.5 TransformIT Encryption: Understandable Diagnosis
Problem: Files taken directly from the FH5/FM2023/FH6 game folder reside in the Arxan TransformIT container and failed with generic parse errors.
Changed: New FileFormatInspector class (magic bytes, envelope layout, Shannon entropy) reliably detects encrypted content. Car Scene XML, the Materials & Shaders workspace, and the 3D viewer now report "decrypt first" instead of a low-level error.
Limitation: Encrypted files still cannot be opened directly after this fix — that is a technical constraint. Open/edit/save works for all unencrypted FH6 files, including method-22 archives.
2.6 Swatch Buttons Permanently Disabled on ZIP Resolution (Grey)
Problem: Texture references resolved from game archives (Media\*.zip) returned an archive-relative path as resolvedSource. The enable logic of the "Open Effective Swatch" / "Open Shader Default" buttons, however, requires an absolute, existing file path — ZIP hits could never satisfy the condition, so the buttons stayed grey for exactly the assets whose resolution succeeded. (This was the visible "everything is grey" effect in the program.)
Changed: TryLocateAssetBytesFromGamePath now materializes ZIP payloads via MaterializeResolvedSourceFile into a deterministic cache file (%TEMP%\ForzaTechStudio\resolved\<sha256(archive|asset)>.<ext>) and sets resolvedSource to that absolute path. Repeated resolutions overwrite the same file — no garbage accumulates.
3. Port of the Unpublished Upstream Changes (0.9.2.1 → 0.9.2.2)
The official V0.9.2.2 binary on GitHub is based on commit db44118, which was never published to the repository. So that this code base matches the official binary exactly, the semantic differences were fully ported via binary diff:
- Manufacturer colors FH6:
IsFh6Secondary,PrimaryEntries/SecondaryEntriesincluding combinedEntriesview,TryReadFh6SecondaryGroupsparser with fallback, secondary entries written on save. - Morph/wheel support:
ProcessedGeometry.MorphData,MorphTargetCount,IsWheelGeometry;ProcessWheelGeometrywithWheelGeometryProfile(2 morph targets); morph decoding in the importer;MorphBlobwrites itsStringslist. - FBX import: Model instancing (geometry × models with world transform), per-instance axis conversion.
- ModelBin creation: LOD selection, correct
MinLOD/LODFlags, version logic of buffer blobs. - MaterialAssignment:
MaterialPath/Parametersproperties,AddParameterAsync/RemoveParameterincl.GetDefaultValueForType. - Swatchbin viewer: HDR-BC6U/BC6S and R16G16B16A16_FLOAT decoding with tonemapping.
- Stability:
CrashLogService(crash logs under%LOCALAPPDATA%\ForzaTechStudio\CrashLogs),ExampleMaterialFolders,TaskScheduler.UnobservedTaskException. - Miscellaneous: LocatorsXML regex, VLay conversion for FH6,
MaterialPathsetter in the viewport, mesh enable/disable toggle.
Not portable: Pure XAML/UI changes of the four pages cannot be reconstructed from the binary and were deliberately not invented. Version stamp: 0.9.2.2.
4. New Features (Local Extensions)
4.1 Automatic FH5/FH6 Detection When Inserting (ModelBin Creator)
When a model (.obj/.fbx) is inserted, the ModelBin Creator detects by itself whether FH5 or FH6 materials are needed and loads the matching material list — without manually switching the game target.
Detection chain (order = reliability):
- If the model file resides under a configured FH5/FH6 game root, that game wins (path prefix, case-insensitive).
- If only one of the two Horizon games is configured, that one wins.
- No signal → the current dropdown selection is kept (no guessing).
When a target is detected, the game target is set automatically; layout, format versions, and the material auto-load follow. The dropdown remains manually correctable.
4.2 Material Loading with FH6 Priority
The discovered material ZIPs are sorted deterministically: the FH6 main library Media\_library\Materials.zip (2004 materials) is loaded automatically first; further archives (e.g. Media\Particles\Materials.zip, 2040 materials) are available in the dropdown. Verified FH6 sources:
| Source | Materials |
|---|---|
Media\_library\Materials.zip |
2004 |
Media\Particles\Materials.zip |
2040 |
Media\_library\MaterialsPG\characters.zip |
172 |
Media\_library\MaterialsPG\objects.zip |
216 |
Media\_library\MaterialsPG\Particles.zip |
152 |
4.3 Grey Horizon UI (FH5/FH6 Only)
New accent preset "Graphite" (grey instead of blue). Activates automatically as soon as Forza Horizon 5 or Forza Horizon 6 is the active game (ModelBin Creator, Library Browser, Materials & Shaders, Conversion Tool). Any other game or no selection → reverts to the user's accent color. Visible on the Appearance page as "Graphite (Horizon)".
4.4 Game-Root Access on Any Drive (Setup Page)
- The path row of the setup page is now an editable text box — paths can be typed directly (e.g.
D:\SteamLibrary\steamapps\common\ForzaHorizon6), any drive, any library. - New "Set Path" button next to "Browse": validates input (absolute path, folder exists), normalizes, and saves.
- Subfolder resolution: If a folder above the actual game root is entered, the validator searches one level below and adopts the real root automatically (hint in the status message). Multiple possible candidates are left to the user.
- Reason for the previous "no game root found" errors: FH6 has no auto-detection (by original design), and the files sit one level deeper than the old search path expected.
4.5 Credits Entry
Settings page, credits: "Justyn — Fix created 26.09.2026".
5. Verification
- Release build (
dotnet build -c Release, x64): 0 errors. - Version stamp: FileVersion/ProductVersion 0.9.2.2.
- Patch (32 files, ~4000 lines) applies cleanly against unmodified V0.9.2.2 (
git apply --check, exit code 0). - All new symbols verified in the binary (
Graphite,ApplyHorizonAccentScope,CorrectedPath,ApplyManualGamePath,ApplyDetectedGameTarget, "found in subfolder"), as well as all UI texts in the compiled resources (Justyn, "Set Path", path placeholder). - Deployed binaries mirrored from the verified build (SHA256 in
SHA256SUMS.txt).
6. Companion Files in This Folder
| File | Contents |
|---|---|
forzatechstudio-fh6-fixes.patch |
Complete source patch (applies to unmodified V0.9.2.2) |
PATCH_NOTES.md |
Technical patch notes |
AENDERUNGEN.md / CHANGES.md |
This document (German / English) |
SHA256SUMS.txt |
Checksums of the core binaries |
CustomZipFile.cs |
Patched ZIP implementation (reference) |
FileFormatInspector.cs |
Encryption detection (reference) |
ForzaTech Studio EXT V1.0.0.6 (BETA)
What's New
-
FBX to Mod Wizard — drop a raw FBX or OBJ, pick FH5/FH6, review the auto-matched materials, optionally link the result into a donor carbin (material indexes rewritten, donor IDs kept), and build a ready-to-install mod zip in one flow
-
Configurable auto-save — auto-save can be switched on or off, and the snapshot interval is a free numeric input (10–3600 seconds, default 100) instead of a fixed value; applied immediately without a restart
-
Last-snapshot timestamp in the auto-save settings, refreshed while the page is open
-
Background update checks — the app re-checks this repository every 6 hours while it runs, in addition to the startup check and the Update tab
-
Correct latest-release detection — the Update tab and the startup check now consider pre-releases and pick the highest release version instead of relying on GitHub's stable-only
/releases/latestendpoint, which shadowed the betas with an older release
Changed
- Auto-save settings are debounced (500 ms) instead of saving on every keystroke
Removed
-
CommunityToolkit.WinUI.UI.Controls.Markdown 7.x package — superseded by the bundled Markdown renderer (headings, lists, quotes, code blocks, tables, emphasis, links)
-
Unused HelixToolkit 3.1.2 package reference — the viewer stack flows through HelixToolkit.WinUI alone; application code has no direct SharpDX API usage
-
Nine stale legacy DLLs (CommunityToolkit 7.x / ColorCode) from earlier deploys that the app no longer loads
-
Regenerable build cache (~630 MB of bin/obj output) and the runtime GPU cache folder from the shipped package
Stability & Performance
-
Unified buffered file reading: every parser and service (materials/shaders workspace, Granny, GSF, clip/skeleton descriptors, modelbin conversion, zip creation, swatchbin, conversion tool) now reads through a shared 1 MB-buffered sequential-scan reader, cutting syscalls and memory churn on large game assets
-
Full 3D-viewport renderer replacement beyond HelixToolkit.WinUI 2.x is planned for the 1.1 line
Support
Bugs & help: message Justyyin on Discord — community: https://discord.gg/fh5
Full Changelog: https://github.com/Justyyin/ForzaTechStudio/commits/v1.0.0.6
ForzaTech Studio EXT 1.0.0.10 (OPEN BETA) - Big Update
Update
1.0.0.10 (OPEN BETA) — 2026-09-28
Announcement
1.0.0.10 (OPEN BETA) brings back the clearly labeled Mesh Enable control in Model Properties and automates in-game path handling: files picked from inside a configured game folder now get their real game:\... path without any manual typing.
New
-
Mesh Enable checkbox in Model Properties — a labeled checkbox next to the scope selectors shows the visibility state of the current selection and toggles it with a single click; it replaces the hard-to-discover eye-icon-only workflow from the previous builds
-
Stays in sync both ways — the checkbox follows the tree checkboxes, the scope eye buttons and per-mesh toggles, and changes made through it are reflected in the tree immediately
-
Multi-selection support — with multiple meshes or light groups selected, the checkbox reflects the combined state (checked only when all targets are visible) and applies the toggle to every selected target at once
-
Automatic in-game path detection when adding models — picking a modelbin that lives inside a configured FH4/FH5/FH6 game folder now adopts its real
game:\...path automatically; the manual "Set Model Path" prompt only appears for files outside any known game root -
Automatic AO swatch path — the AO swatchbin picker applies the same detection, so swatches picked from the game files get their true in-game path instead of the generic custom-car fallback
-
Tutorial menu — a new Tutorial entry in the navigation opens the built-in guide: how every feature works, what to watch out for, known limitations and what does not work yet; opens on the full tutorial by default with every tool guide in the sidebar
-
Configurable 3D viewer panels — Settings now has a 3D Viewer section where each property panel (Model Properties, Light Transformations, Locator Transformations, Carbin Properties, Animation, Points of Interest) can be shown or hidden, so the sidebar only contains the panels you actually use
Fixed
-
Missing "mesh enable" toggle reported by the community — visibility could previously only be changed through the small eye icon inside the Target Scope dropdown or the tree checkboxes; the dedicated labeled control users expected from earlier versions is back
-
Manual path entry for files picked from the game folder — the carbin editor no longer asks for a
game:\...path it can derive itself from the configured game directory
Changed
-
Compact header status — the game-folder status in the header now reads "Connected: FH6" / "Not connected" by default; Settings > Status Display switches between Compact, Full (game name and path) and Hidden, and the status now also recognizes Forza Horizon 4
-
Crash diagnostics — the CrashLogs folder now always contains session logs for the last 10 launches with clean exits marked, so a hard crash that bypasses the exception handlers still leaves a trace; managed crash logs are written as before
-
Settings page — the Credits block was removed from Settings; credits remain available in the footer dialog
1.0.0.9 (OPEN BETA) — 2026-09-28
Announcement
1.0.0.9 (OPEN BETA) fixes the imported car-paint UV roundtrip: the viewport and exports now use the same UV channel and flake tiling that the game applies to car paint, and rebuilt modelbins are protected against applying that tiling a second time.
Fixed
-
Car paint flake UVs in the 3D viewer — car paint materials now render with UV channel 1 when present and apply
FlakeNormalUVTiling/FlakeNormalTiling; manufacturer-color paint keeps its channel 4 overlay behavior -
FBX export —
UVMap_1is baked with the car-paint flake tiling for car-paint materials, matching the viewport and the game's sampling behavior; non-car-paint UVs are unchanged -
OBJ export — because OBJ carries one UV layer, car-paint meshes export that layer from UV1 and apply the same flake tiling
-
Import / export roundtrip — newly built modelbins normalize car-paint
FlakeNormalUVTilingto 1, so a model exported by ForzaTech Studio does not get the same tiling applied twice when it is imported again or built through the FBX to Mod Wizard
1.0.0.8 (OPEN BETA) — 2026-09-28
Announcement
1.0.0.8 (OPEN BETA) fixes the "ghost car" rendering report from the community: cars loaded from converted FH6 modelbins no longer render as translucent shells, LOD filtering now follows the mesh blob bit layout exactly, and scenes that fail to build geometry no longer fail silently.
Fixed
-
Ghost / translucent car bodies in the 3D viewer — modelbins produced by converted FH6 pipelines can carry material shader parameters with stray alpha values; the viewport now respects the mesh's render bucket, so opaque meshes stay fully opaque and only materials flagged transparent (glass, lenses) render translucent
-
LOD filter bit masks — LOD0 now matches bits 0-1 and LOD5 matches bit 6 exactly as defined by the mesh blob format; meshes whose files store nonstandard LOD flag bits are classified by the name-based fallback instead of disappearing from the scene
-
Silent mesh build failures — geometry that fails to build during scene assembly was previously dropped with only a debug trace; failures are now collected and written to
Logs\viewport-YYYYMMDD.logunder%LocalAppData%\ForzaTechStudio, so an incomplete scene can be reported with the exact mesh names and error messages
Support
Thanks for the private feedbacks and testing the tool: DYXiCZ, FreverZ , Fufunatorious
and big thanks to D3 for allowing this! - Forza Mods
Bugs & help: message Justyyin on Discord — https://discord.gg/fh5
ForzaTech Studio EXT V1.0.0.7 (OPEN BETA)
ForzaTech Studio EXT (OPEN BETA)
First release under the Open Beta channel. Portable, self-contained build (x64) — no .NET runtime required. Supports Forza Horizon 4, Forza Horizon 5 and Forza Horizon 6.
What's New
-
Rename meshes and materials inside modelbin files — Model Properties now has a Names section: rename a mesh or its material, and the new name is written into the file's metadata when the modelbin is saved. Material renames update every mesh bound to the same material and keep the material groups in sync.
-
Bone & mesh pivot markers in the 3D viewer — new "Bone & Mesh Pivots" toggle in the viewport options shows every bone joint with hierarchy lines plus a marker at each visible mesh origin. The selected mesh's bone is highlighted and the marker size adapts to the model — lining doors, hoods and wings up with their hinge bones is no longer guesswork.
-
FBX to Mod Wizard: per-mesh material overrides — expand any material row to give a single mesh its own material while the rest of the meshes keep the row assignment.
-
Geometric material pre-fill — when a material name matches nothing in the game library, the wizard analyzes the mesh shape (ground contact, thin upper panels, small front/rear clusters, interior fit) and pre-fills the best guess for tyres, glass, lights and interior. Red rows stay marked as guesses to verify.
-
Unsaved-changes protection — closing a file or tab, reloading, or an external file change now prompts Save / Discard / Cancel when unsaved changes exist. Renames and edits can no longer be lost silently.
Changed
-
Wizard status line reports unmatched and alias-suggested (amber) materials separately; the hint text explains that one row applies to all meshes sharing the material name.
-
Wizard material indexes now match the generated modelbin exactly (first-appearance order of the resolved assignment), fixing a crash when two source materials mapped to the same game material.
-
Scene attach runs on a ~12 ms per-frame budget when adding large numbers of meshes, keeping the window responsive during heavy loads (parsing and geometry building were already parallel).
-
Version tag in Settings, footer, welcome dialog and Update tab now reads 1.0.0.7 (OPEN BETA).
Known Issues
-
The 3D viewport runs on HelixToolkit.WinUI 2.x, which is maintenance-only; a full 3D-viewport renderer replacement is planned for the 1.1 line. Very large models can still stutter briefly while GPU buffers upload.
-
Perfect automatic material assignment is not always possible: without meaningful material names in the source FBX/OBJ, the wizard falls back to the alias table and geometric guesses — review the amber/red rows or use the per-mesh overrides.
Support
Bugs & help: message Justyyin on Discord — community: https://discord.gg/fh5
ForzaTech Studio EXT V1.0.0.5 (BETA)
ForzaTech Studio EXTv1.0.0.5 (BETA)
Forza Horizon 4 / 5 / 6 modding tool — community release line by Justyn.
New
- Forza Horizon 6 support — game folder detection, root access and file handling for FH6, alongside FH5 and FH4
- Automatic material list — fetched on model bin load, correct list selected per game (FH5 vs FH6)
- Update tab — checks the GitHub repository for a newer release, shows installed vs. latest, one-click download
- Live game-folder status in the header — green when connected (FH4/FH5/FH6), red when not configured
- Auto-save every 100 seconds with a "Session Restore" prompt after an unclean shutdown
- Change Logs, Credits and Discord entries in the navigation footer
- Support section — contact Justyyin on Discord for bugs and help
Changed
- Upgraded to .NET 10 — faster startup, lower memory footprint, improved GC
- Windows App SDK 1.8 → 2.5, Microsoft.Data.Sqlite 9 → 10.0.12, CommunityToolkit.Mvvm 8.3 → 8.4.2, BCnEncoder.Net 2.2 → 2.3.0, SharpCompress → 1.0.0; obsolete SharpDX package removed
- Fixed gray (graphite) accent throughout — accent picker and Appearance tab removed
- English-only — language picker and non-English files removed
- Welcome dialog with dynamic "Set Up Game Paths" button
- Discord dialog lists both community servers — Forza Mods and Paris Club (https://discord.gg/fh5)
- Version 1.0.0.5 (BETA)
Stability & Performance
- Buffered, sequential-scan file parsing — large model bins no longer freeze the UI or exhaust RAM
- Granny model / clip descriptor parsing moved off the UI thread
- Settings and session files written atomically (temp file + move)
- Flat publish layout — starts reliably from any folder, packed or unpacked
- Portable package ships the .NET 10 runtime — runs on a clean machine with nothing installed
- Crash logging to %LOCALAPPDATA%\ForzaTechStudio\CrashLogs
Fixed
- Game root resolution across drives
- Clear, actionable error messages for invalid or unsupported files
- Footer menu entries (Discord, Change Logs, Credits) open correctly again
- Original icon and taskbar branding restored
Support
Bugs & help: message Justyyin on Discord — https://discord.gg/fh5
Assets
ForzaTechStudio_v1.0.0.5_BETA_x64_SelfContained.zip— portable build, includes the .NET 10 runtime. Extract anywhere and runForzaTech Studio.exe.