Skip to content

Releases: heaven-hm/project-igi-converter

v1.10.0

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 24 Jun 18:50

[1.10.0] - 2026-06-24

Added

  • Lightmap Support for MEF Type 3 Models
    • Parse lightmap UV coordinates (UV2 channel) from MEF Type 3 vertex data (XTRV bytes +32..+39)
    • Resolve bound .olm lightmap files from decompiled objects.qsc Task_New trees
    • Support reused model IDs with disambiguation: when a model is placed at multiple locations with different baked lightmaps, the GUI shows a picker
    • Apply Lightmap right-click menu on .mef files (Type 3 only) with OpenGL shader blending
    • OLM Format — new olm command for working with lightmap files:
      • igi1conv olm info <file.olm> — print dimensions and file size
      • igi1conv olm convert <file.olm> -o <out.png|out.tga> — export lightmap to image
    • OLM Documentation — comprehensive file format reference in game_file_formats.md with binding resolution, vertex layout, and directory structure
    • lightmap CLI command — model id alone is ambiguous (the same .mef can be placed at many locations, each with its own baked lightmap), so the binding parser now also captures each placement's Task_New id and X/Y/Z position:
      • igi1conv lightmap list --model <id> --qsc <objects.qsc> — list every placement of a model bound to a lightmap (task id, name, position, logical id)
      • igi1conv lightmap resolve --model <id> --qsc <objects.qsc> [--task-id <id> | --pos X,Y,Z] — resolve to one placement (exact task id match, or nearest by Euclidean distance to a given position) and print its .olm file paths. Exits 4 (ambiguous, lists candidates) if the model has multiple placements and no disambiguator is given.

Fixed

  • Lightmap Binding Resolution — parser now resolves bindings at the nearest enclosing Task_New tree, not the outermost Container wrapper. The decompiled QSC nests multiple sibling Building tasks under a shared Task_New(-1, "Container", "Buildings", ...) parent; the old scanner treated the entire Container as one binding scope, causing every building's model IDs to be (wrongly) attributed to the first LightmapInfo found anywhere in the container. Fixed with bottom-up resolution: a node only binds its own + non-resolving children's model IDs if IT has a direct LightmapInfo child; otherwise they bubble unresolved to the parent.
  • Play Animation Menu Visibility — "Play Animation" context menu on .mef files is now restricted to AI model ID range (000_00_0030_00_0), matching the existing Apply-Animation-on-Model filter. Building/prop meshes outside that range have no bone animation sets and showing the action was misleading.
  • GUI Settings PersistenceObjectsQscPath in the .ini file was pointing to the wrong level during testing; fixed to match the configured level.
  • OLM Documentation Accuracy — corrected the OLM binary format description in game_file_formats.md to match the actual parser (OlmMainHeader/OlmLayerDescriptor, version-float identified rather than a FourCC magic, RGBA8 pixels with R/B channel swap on export), replacing an earlier inaccurate "MLOI magic + packed ARGB" description.

Changed

  • Version bumped to 1.10.0 (major: lightmap feature complete).

v1.9.7

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 23 Jun 21:12

What's New in 1.9.7

Apply Animation on Model

Right-click any .iff/.bff file and choose Apply Animation on Model... to pick a MEF model (IDs 000_00_0-030_00_0) and play the IFF animation skinned onto the 3D model. Animations are loaded via the shared IFF media bar for transport controls (play/pause/step-back/step-forward).

Play Animation on .mef Files

Right-click a .mef/.mex file (model ID range 000_00_0-030_00_0) to play its animation set directly.

Bug Fixes

  • MEF V-coordinate explosion: collision geometry UVs (x0.1, z0.1) now wrapped into [0,1) via std::fmod to prevent OBJ UV values from exploding outside [-1,2].
  • IFF animation file resolution: applyIffOnModel uses a persistent path map from directory scan, fixing 'Could not locate MEF file' for models in subdirectories.
  • Animation transport buttons: iffMediaBar.show() added in onAnimationPlayClicked so Play/Pause/Step controls appear.
  • Test corpus text IFF skip: FindCorpusFileByRegex skips decompiled text .IFF files (starts with CR/LF), fixing 6 IFF tests.
  • UV test model selection: UV tests use FindCorpusMefOfModelType(1/0) to avoid Type 3 lightmap models whose UV range spans -11..1.

Other

  • Version bumped 1.9.4 to 1.9.7 (includes earlier 1.9.5/1.9.6 dev changes)
  • All 91 tests pass, 7 skipped (dynamic only)

v1.9.4 - Animation mode with skeletal skinning

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 22 Jun 12:56

v1.9.4 - Animation mode with skeletal skinning

Added

  • Animation mode (Mode 6): New GUI mode that plays IFF bone animations on textured 3D MEF models. Gated by Settings > Animation toggle. Includes:
    • QSC object parser (qsc_object_parser.*) that reverse-engineers decompiled objects.qsc to extract HumanSoldier Task_New entries with model ID, bone hierarchy, and stand animation.
    • Auto-detection of objects.qsc, common/ANIMS folder, and LEVEL/models folder when a level is selected (Settings > Level).
    • Animation panel with Model dropdown, Animations listbox, Play button, Loop checkbox, and FPS input textbox (configurable 1-120 FPS).
    • Skeletal skinning that deforms the textured MEF mesh using IFF bone transforms each frame (30+ FPS).
    • Right-click "Play Animation" on binary .MEF/.MEX files.
    • P key to toggle rest-pose skinning for debugging; B key to toggle bone skeleton overlay.
    • Full 33-bone mapping verification logged to detect MEF/IFF skeleton mismatches.
  • ComputeBoneWorldPositions() exposed in mef_native.h for GUI skinning.

Fixed

  • Animation root-offset mismatch: IFF places root at (0,0,0) but MEF mesh uses (0,0,3990.4). The skinning now adds the root translation back so the deformed model stays in the MEF viewer frame, preventing detached body parts.
  • Animation playback speed: Timer increment was hardcoded at 16ms per tick regardless of actual timer interval (33ms). Now uses 1000.0f / fps for correct speed at any FPS.
  • Bone overlay alignment: addBonesOverlay() was double-normalising bone vertices (pre-normalising then getting normalised again by the mesh loop), collapsing all 33 bones into a single dot. Now pushes raw MEF-space coordinates so the single normalisation loop handles mesh and bones together — bones are perfectly aligned with the model at all model scales.
  • All hardcoded paths removed: No more machine-specific D:/Software/IGI-Game defaults or D:/IGI1/... test paths. GUI falls back to the user's home directory; the RealLevel1ObjectsQsc test uses the IGI_GAME_PATH env var / --game-path flag and skips cleanly when absent.

Changed

  • Version bumped to 1.9.4.
  • Animation FPS now configurable via a QLineEdit in the Animation panel (default 30).
  • Duplicate FPS label removed from the Animation panel.

v1.9.3 - Graph toolbar at top of 3D viewer

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 22 Jun 01:05

See CHANGELOG.md for the full list of changes. The graph toolbar (Node / -Node / Nodes / Links / Total Nodes / Total Links / Reset) is now created before the modelViewer and added to rightLayout between the view-mode row and the modelViewer, so the buttons sit on top of the 3D rendering surface - matching the layout pattern used by the IFF media bar and the image editor toolbar. All 57 tests pass.

v1.9.2 - 3D graph toolbar, .DAT graph menu, image-to-TEX fix

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 22 Jun 00:47

See CHANGELOG.md for the full list of changes. Highlights: 3D graph toolbar (Node / -Node / Nodes / Links / Total Nodes / Total Links shown when a graph*.dat is loaded); .DAT context menu now detects graph*.dat and offers Export to JSON / Export to Table (.md); 'Pack to .res archive' renamed to 'Pack to Archive' and auto-saves to a sibling .res; image-to-TEX error log now reports input -> output and shows a critical message. All 57 tests pass.

v1.9.1 - MEF V-flip fix & hardcoded path removal

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 21 Jun 23:43

Fixed

  • MEF texture orientation (the "upside down / sideways" bug): The .mef → .obj and .mef → .mef (via mef build-rigid) export paths now preserve V verbatim for every model type, matching the orientation the IGI engine and the GUI 3D viewer use. The 3D viewer (the live preview in igi1conv.exe) and the exported .obj / .mef now render identically for the same source .mef. Concretely, the original 015_01_1.mef (Type 0 rigid), 001_01_1.mef (Type 1 bone), and 404_01_1.mef (Type 3 lightmap) all render right-side-up in the viewer and in the exported files. The 82% of MEFs that are Type 3 (lightmap) no longer come out flipped, and bone-model face textures are no longer upside down.

Changed

  • Centralised V-flip decision in MefVToObjV(v, modelType) (source/parsers/mef_exporter.cpp). The old per-call-site 1.0f - v.uv.y / 1.0f - uv[] literals have been removed and replaced with a single helper. The GUI 3D viewer reads v.uv.y directly with no V-flip helper. The rule is now the identity for every model type — no more special-casing of Type 1 (bone) vs Type 3 (lightmap) vs Type 0 (rigid).
  • Removed hardcoded D:\IGI1 path from the test suite. The corpus location is now fully user-controlled via the new --game-path=PATH / --corpus=PATH CLI flag or the IGI_GAME_PATH env var. When neither is set, CorpusDir() returns "" and tests GTEST_SKIP() instead of failing. tests/igi1conv_test_util.h no longer mentions a Windows-specific path.

Added

  • Comprehensive MEF V-flip regression suite in tests/test_igi1conv_commands.cpp:
    • MefExportVFlip_Type0_Rigid_DoesNotFlipV: rigid models preserve V.
    • MefExportVFlip_Type1_Bone_DoesNotFlipV: bone models preserve V.
    • MefExportVFlip_Type3_Lightmap_DoesNotFlipV: lightmap models preserve V.
    • MefExportVFlip_AllTypesRespectRule: sweeps up to 64 MEFs in the corpus, asserts every model obeys the per-type rule.
    • MefExportVFlip_BinaryAndTextPathsAgree: binary MEF → OBJ and text MEF → OBJ produce identical V for the same source MEF.
    • MefExportVFlip_NoStrayOneMinusVLiterals: structural test that greps mef_exporter.cpp for stray 1.0f - v.uv.y / 1.0f - uv[ literals outside the helper, so the formula can't drift between call sites.
    • MefViewerDoesNotFlipV: structural test that the GUI 3D viewer never re-introduces a V-flip helper.
    • MefExportObjHasRealUvs and MefExportBinaryAndTextObjUvsMatch: lock in that the OBJ export has real per-vertex UVs and that the binary and text paths agree.
  • New test util helpers in tests/igi1conv_test_util.h:
    • FindCorpusMefOfModelType(int wantedType, const std::string& namePattern = "") — finds a MEF with a specific model_type (0 = rigid, 1 = bone, 3 = lightmap) in the corpus.
    • GetMefModelType(const std::string& mefPath) — parses model_type from mef info output.
    • FirstVtFromObj(const std::string& objPath) — reads the first non-(0,0) vt line from an OBJ.
  • Test corpus (D:\IGI1\igi1conv_test_suite — outside the repo, no hardcoded path committed): added 320_01_1.mef (Type 0 rigid) and 404_01_1.mef (Type 3 lightmap) so the per-type tests have files to exercise. The pre-existing 0_000_01_1.mef (Type 1 bone) covers the third category.

v1.8.0

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 21 Jun 05:16

Changelog for v1.8.0

Added

  • 3D Graph Editor Viewport: Implemented interactive 3D viewport rendering for graph files (graph*.dat), displaying graph nodes as 3D red cubes and visual connections as lines.
  • Dynamic Node Scaling: Implemented automatic dynamic scaling for graph nodes based on the spatial span of the loaded map.
  • Interactive Node Scale Controls: Added hotkeys to manually scale nodes: Ctrl + / Ctrl - to increase/decrease node size, Ctrl + Mouse Wheel, and Middle Mouse + Mouse Wheel.
  • View Toggles: Added toggles (keys 'N' for Nodes, 'L' for Links) to hide/show nodes and links.
  • Improved View Defaults: Configured default view rules where any .dat file with graph in its name defaults to '3D' view, and .qvm files default to 'Text' view.
  • View Mode Renaming: Renamed '3D View' to '3D', and 'Image View' to 'Image' mode in the GUI.

Fixed

  • Large Graphs Visibility: Corrected sizing issue where nodes were too small to see in large graphs with 30-100+ nodes.

v1.7.0 - Recursive ATTA & Texture Resolution

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 16 Jun 19:37

Release v1.7.0 - Recursive ATTA & Texture Resolution

This release adds complete recursive attachment (ATTA) support and automatic texture resolution for both OBJ export and rigid model building.

New Features

Recursive ATTA Merging

  • Both "Export to OBJ" (mef export-bundle) and "Build Rigid Model" (mef build-rigid) now walk the full attachment hierarchy
  • All sub-models are automatically merged with correct transformations and material offsets
  • No more manual assembly required for complex character rigs or composite models

Texture Resolution & Conversion

  • mef build-rigid now accepts --dat and --texdir flags
  • Automatically converts .tex texture files to .tga format with correct slot offsets
  • Fallback to local mat_N.* files if game textures aren't found
  • GUI passes level settings automatically to build-rigid command

Improved 3D Viewer

  • Fixed bone model (type1) rendering - characters now display with correct world-space positioning
  • Matches OBJ exporter output exactly

Downloads

  • igi1conv-v1.7.0-win64.zip (15 MB) - Complete release build with all dependencies and tools

Documentation

See README.md for usage examples and CHANGELOG.md for technical details.

Command Examples

Export OBJ with all attachments:
```bash
igi1conv mef export-bundle model.mef -o output/ --dat level.dat --texdir textures/
```

Build rigid model and resolve textures:
```bash
igi1conv mef build-rigid model.mef -o rigid.mef --dat level.dat --texdir textures/
```


Built with C++17, Qt6, and OpenGL 3.3+

v1.6.0

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 12 Jun 12:17

Release v1.6.0 containing fixed major bugs of AI Bone OBJ models and textures, parsing corrections, separate texture export commands, and dual architecture support.

v1.5.0 - Dual Architecture Support & Texture Painting

Choose a tag to compare

@haseeb-heaven haseeb-heaven released this 12 Jun 10:14

Changelog

All notable changes to this project will be documented in this file.

[1.5.0] - 2026-06-12

Added

  • 32-Bit (Win32) Architecture Support: Integrated complete compilation and deployment pipelines for 32-bit Windows targets, enabling compatibility with legacy systems.
  • Dual Qt5 / Qt6 Compatibility: Overhauled the OpenGL rendering and widget codebase (in gui_main.cpp) to compile seamlessly using either the local Qt5 SDK or system Qt6 SDK.
  • Automatic Architecture Detection: Upgraded CMakeLists.txt to automatically detect target architecture (pointer size) from the generator options and resolve the corresponding Qt dependencies.
  • Auto-Deployed Runtime Assets: Grouped IGIAutoComplete.txt, IGIModels.json, and IGIModelsAllLevel.json under assets/ and configured a post-build step in CMake to automatically copy them to the compiled binary folder.
  • Embedded Application Icon Everywhere: Fixed the resource compilation order in CMake (moving AUTOMOC/AUTORCC/AUTOUIC before target declaration) and changed the resource ID in igi1conv.rc to 1 so the app icon displays correctly in both Windows Explorer and the window taskbar at runtime.
  • Simplified UI Documentation: Consolidated the three theme screenshots in the README into a single horizontal row with a concise description and reordered the layout to display the GUI version first and CLI commands last.
  • Release Packaging Script: Created a script to package compiled builds into separate zip packages (igi1conv_v1.5.0_x86.zip and igi1conv_v1.5.0_x64.zip) for distribution.

[1.3.0] - 2026-06-12

Added

  • Comprehensive GUI Documentation: Added 15+ high-quality markdown screenshot descriptions covering IDE functionality, Hex View, Model Search, and comprehensive GUI Themes (Military, Solarized, Dark).
  • Automated Screenshot Engineering: Developed a highly resilient UI automation pipeline script (take_screenshots.py) incorporating rigorous self-healing loops to bypass OS foreground restrictions and generate flawless IDE captures.
  • Enhanced Configurations: Automatically registers TextureDir and LevelDAT mappings persistently via igi1conv.ini, completely bypassing fatal GUI dialog blockers during automated texture extraction scripts.

[1.2.0] - 2026-06-11

  • Integrated IDE Features: Converted the basic Qt window into a full-fledged IDE/Explorer.
    • Added Dark Theme and Light Theme toggles in the View menu.
    • Added a search bar above the file explorer tree for recursive wild-card file filtering.
    • Added an in-file text search bar for finding text inside the opened file viewer.
  • File Operations Context Menu: Right-clicking a file in the explorer now supports native file system operations:
    • Rename files (with popup prompt).
    • Delete files (with confirmation prompt).
    • Cut, Copy, and Paste files across directories.
  • Advanced 3D Multi-Material Renderer: Overhauled the OpenGL engine to support SubMesh architecture.
    • Automatically reads RenderBlocks from .mef files to map individual textures to specific geometry groups.
    • Automatically reads usemtl records from .obj and corresponding .mtl libraries to map separate materials perfectly.
  • Live 3D Metadata HUD: Replaced the native OS tooltip with an anchored semi-transparent HUD overlay.
    • Tracks live mouse movements to report accurate 3D translation offsets and rotation angles (Pitch, Yaw, Roll/Zoom) in real-time.
    • Retrieves exact unique Model ID matching from JSON catalogs, filtering out unnecessary metadata like Graph IDs.

Changed

  • Refactored gui_main.cpp to use QSortFilterProxyModel for non-destructive filesystem filtering.
  • Prevented tooltips from disappearing during mouse drags by replacing them with the HUD.
  • The gui_main.cpp build configuration no longer attempts to reload duplicated materials.

Fixed

  • Fixed critical bug where the .mef and .obj 3D viewer would overwrite previous textures, causing the entire model to be wrapped in the mesh's final declared material.
  • Fixed an issue where the OS suppressed tooltips while the mouse button was held down, preventing users from seeing rotation angles.

[1.1.0] - Initial Advanced GUI Edition

  • Introduced igi1conv GUI leveraging Qt6.
  • Added custom text, hex, image, and basic 3D model viewers.
  • Added execution wrappers for CLI commands on standard IGI files.