Releases: heaven-hm/project-igi-converter
Release list
v1.10.0
[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
.olmlightmap files from decompiledobjects.qscTask_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
.meffiles (Type 3 only) with OpenGL shader blending - OLM Format — new
olmcommand for working with lightmap files:igi1conv olm info <file.olm>— print dimensions and file sizeigi1conv olm convert <file.olm> -o <out.png|out.tga>— export lightmap to image
- OLM Documentation — comprehensive file format reference in
game_file_formats.mdwith binding resolution, vertex layout, and directory structure lightmapCLI command — model id alone is ambiguous (the same.mefcan 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.olmfile 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
.meffiles is now restricted to AI model ID range (000_00_0–030_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 Persistence —
ObjectsQscPathin the.inifile 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.mdto 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
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
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 decompiledobjects.qscto extract HumanSoldier Task_New entries with model ID, bone hierarchy, and stand animation. - Auto-detection of
objects.qsc,common/ANIMSfolder, andLEVEL/modelsfolder 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.
Pkey to toggle rest-pose skinning for debugging;Bkey to toggle bone skeleton overlay.- Full 33-bone mapping verification logged to detect MEF/IFF skeleton mismatches.
- QSC object parser (
ComputeBoneWorldPositions()exposed inmef_native.hfor 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 / fpsfor 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-Gamedefaults orD:/IGI1/...test paths. GUI falls back to the user's home directory; theRealLevel1ObjectsQsctest uses theIGI_GAME_PATHenv var /--game-pathflag 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
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
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
Fixed
- MEF texture orientation (the "upside down / sideways" bug): The
.mef → .objand.mef → .mef(viamef 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 inigi1conv.exe) and the exported.obj/.mefnow render identically for the same source.mef. Concretely, the original015_01_1.mef(Type 0 rigid),001_01_1.mef(Type 1 bone), and404_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-site1.0f - v.uv.y/1.0f - uv[]literals have been removed and replaced with a single helper. The GUI 3D viewer readsv.uv.ydirectly 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:\IGI1path from the test suite. The corpus location is now fully user-controlled via the new--game-path=PATH/--corpus=PATHCLI flag or theIGI_GAME_PATHenv var. When neither is set,CorpusDir()returns "" and testsGTEST_SKIP()instead of failing.tests/igi1conv_test_util.hno 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 grepsmef_exporter.cppfor stray1.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.MefExportObjHasRealUvsandMefExportBinaryAndTextObjUvsMatch: 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 specificmodel_type(0 = rigid, 1 = bone, 3 = lightmap) in the corpus.GetMefModelType(const std::string& mefPath)— parsesmodel_typefrommef infooutput.FirstVtFromObj(const std::string& objPath)— reads the first non-(0,0)vtline from an OBJ.
- Test corpus (
D:\IGI1\igi1conv_test_suite— outside the repo, no hardcoded path committed): added320_01_1.mef(Type 0 rigid) and404_01_1.mef(Type 3 lightmap) so the per-type tests have files to exercise. The pre-existing0_000_01_1.mef(Type 1 bone) covers the third category.
v1.8.0
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, andMiddle 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
.datfile withgraphin its name defaults to '3D' view, and.qvmfiles 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
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-rigidnow accepts--datand--texdirflags- Automatically converts
.textexture files to.tgaformat 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
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
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.txtto 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, andIGIModelsAllLevel.jsonunderassets/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.rcto1so 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.zipandigi1conv_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
TextureDirandLevelDATmappings persistently viaigi1conv.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
SubMesharchitecture.- Automatically reads
RenderBlocksfrom.meffiles to map individual textures to specific geometry groups. - Automatically reads
usemtlrecords from.objand corresponding.mtllibraries to map separate materials perfectly.
- Automatically reads
- 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 IDmatching from JSON catalogs, filtering out unnecessary metadata like Graph IDs.
Changed
- Refactored
gui_main.cppto useQSortFilterProxyModelfor non-destructive filesystem filtering. - Prevented tooltips from disappearing during mouse drags by replacing them with the HUD.
- The
gui_main.cppbuild configuration no longer attempts to reload duplicated materials.
Fixed
- Fixed critical bug where the
.mefand.obj3D 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
igi1convGUI leveraging Qt6. - Added custom text, hex, image, and basic 3D model viewers.
- Added execution wrappers for CLI commands on standard IGI files.