Releases: fernandotonon/QtMeshEditor
Releases · fernandotonon/QtMeshEditor
2.20.0
What's New
LOD (Level of Detail) System
- LOD generation: Generate up to 4 reduced LOD levels from the Inspector panel with configurable per-level reduction ratios.
- Auto LOD: One-click automatic LOD generation using Ogre's built-in heuristics.
- LOD preview: Force any LOD level in the viewport to inspect the reduced mesh.
- LOD export: Export each LOD level as a separate file (glTF, OBJ, FBX, etc.) to a user-chosen directory.
- LOD info: The Inspector shows triangle counts for the base mesh and every LOD level.
- Remove LODs: Strip all generated LOD levels from the current mesh.
Mesh Validation & Repair
- Mesh validator: New Validator panel checks selected meshes for degenerate triangles (zero-area faces), non-finite UV coordinates (NaN/Inf), and extreme UV values.
- Fix All: Automatically exports the mesh through Assimp's cleanup pipeline (
FindDegenerates,FindInvalidData,SortByPType) and reimports the cleaned version.
Bug Fixes
MeshValidator::fixAll()now exports to a temp OBJ file before reimporting, so Assimp cleanup flags are actually applied (previously exported to.meshwhich bypasses Assimp).- Fixed UV buffer reading in the validator: UV data was incorrectly read from the position buffer stream when UVs reside in a different vertex stream.
Test Coverage
- Comprehensive unit tests for
MeshLodController(~100% coverage): singleton lifecycle, no-selection guards, LOD generation/removal/preview/export, signal propagation.
2.19.0
What's New
Unreal Engine FBX Support
- Animation-only FBX import: UE retarget FBX files (mesh-less exports) are now auto-detected. When a compatible skeletal mesh is already loaded, an instant merge dialog appears — no extra steps needed.
- Z-up coordinate baking: Mesh vertex data and root skeleton bone rest poses are now baked to Y-up at import time. Exported meshes from UE are upright by default without any scene-node rotation hack.
- Clean animation names: "Unreal Take" (UE's generic take name) is stripped automatically — animations are named after the source file instead (e.g.
mm_attack_03). - Preserve intentional numeric suffixes:
mm_attack_03staysmm_attack_03after merge, notmm_attack. Deduplication only strips_Nsuffixes on actual name collisions. - Inspector auto-refresh: The inspector panel updates immediately after an animation merge — no need to re-select the entity.
Bug Fixes
- Fixed animation processing ordering: animation deltas are now computed against the original (pre-bake) T-pose, avoiding axis-swapped root motion for Z-up FBX files with embedded animations.
- Model name is always derived from the file path rather than
scene->mName, which UE sets to generic values like "unreal_take". mergeAnimations()return value is now checked as the authoritative success signal.
Documentation
docs/index.htmlupdated with Unreal Engine FBX workflow alongside the Mixamo workflow.
2.18.1
What's Changed
- Support animation-only FBX imports (e.g. Unreal Engine retargets) by @fernandotonon in #238
- Fix Windows APPCRASH on machines without OpenGL (WinGet validation)
- Auto-detect FBX Z-up (Unreal Engine) vs Y-up (Mixamo) and apply visual correction
- Offer immediate merge when animation-only file is imported with a mesh selected
- Add bone list and coordinate system info to
qtmesh infooutput
Full Changelog: 2.18.0...2.18.1

2.18.0
What's Changed
- Increase primitives and mesh exporter coverage by @fernandotonon in #229
- Convert Animation Control to QML inspector section (v2.18.0) by @fernandotonon in #231
Full Changelog: 2.17.1...2.18.0
2.17.1
What's Changed
Bug Fixes
- Fix Windows CLI output:
qtmesheditor.exeis built as a WIN32 GUI subsystem executable, so it had no console attached when launched from PowerShell or cmd. All CLI output (--version,--help, subcommands) was silently dropped. Fixed by callingAttachConsole(ATTACH_PARENT_PROCESS)+freopen("CONOUT$")when CLI mode is detected on Windows. This resolves the WinGet manual validation failure.
CI Improvements
- Added Windows CLI smoke tests: one that runs on every push/PR (from
bin/directory) and one that runs on releases (from the extracted zip), to catch missing DLLs and startup failures before artifacts are uploaded.
2.17.0
New Features
- Animation Merge: Improved animation naming during merge
- Clean Mixamo noise from animation names (
mixamo.comremoved) - Smart deduplication: repeated merges produce
jump,jump_2,jump_3(notjump_2_2_2) - Only prefix generic animation names (e.g.
mixamo.com→ node name); meaningful names likejump,idlekept as-is - Stale animation states properly cleaned after rename
- Clean Mixamo noise from animation names (
Bug Fixes
- Animation Merge: Fix duplicate animation count (9 instead of 5) caused by stale AnimationState entries after rename
- Animation Merge: Fix name collision error on repeated merges (two-pass rename avoids old↔new name conflicts)
- Animation Merge: Fix re-prefixing on subsequent merges (
test_test_jumpno longer happens)
2.16.2
Bug Fixes
- Windows: Fix blank Inspector panel and Material Editor List — bundle QtQuick.Controls and QtQuick.Layouts QML modules in the Windows release
- Windows: Fix QML import path separator (
;on Windows,:on Unix) - CI: Fix 9 test suites that were silently crashing under Mesa/Xvfb
- CI: Proper crash detection — removed
sudofrom test execution, fixed signal handler to distinguish test crashes from teardown crashes
2.16.1
Patch Release
- Windows: Replace
qtmesh.cmdwith properqtmesh.exelauncher for WinGet compatibility - WinGet: Both
qtmesheditorandqtmeshcommands are now registered as portable aliases - Packaging: WinGet manifests updated to schema v1.12.0
2.16.0
What's New in 2.16.0
Major UI modernization with a unified QML Inspector panel, new transform tools, and undo/redo support.
Transform Tools
- Scale Gizmo — new R key shortcut, cube handles at axis endpoints
- Local/World Transform Space — X key toggle, gizmo orients to node and drag follows local axes
- Unity Keyboard Shortcuts — Q=Select, W=Translate, E=Rotate, R=Scale, F=Frame selection
- Frame Selection — F key zooms camera to fit selected objects
Undo/Redo
- Ctrl+Z / Ctrl+Shift+Z for translate, rotate, and scale operations
- Edit menu with Undo/Redo actions
- Undo stack auto-clears on object deletion to prevent stale pointer crashes
QML Inspector Panel
Replaces the old 4-tab sidebar (Transform/Material/Edit/Animation) with a single scrollable inspector:
- Scene Tree — hierarchical view (Node → Mesh → Submesh) with expand/collapse, Ctrl+click multi-select
- Material Typeahead — click
[MaterialName]on any submesh to search and apply materials - Transform Spinboxes — position/rotation/scale with up/down arrow keys and buttons
- Primitive Parameters — context-sensitive fields per primitive type (size, radius, segments, UV)
- Animations — per-entity groups with enable/loop checkboxes, double-click rename, skeleton/weights toggles, play/pause
Layout Improvements
- View Toolbar — Grid, Normals, Mesh Info, View Cube toggles moved from buried Options menu
- Animation Control auto-docks below viewports for animated entities (Options → View → Animation Control to toggle)
- Inspector fills full right-side height, no more tab widget wrapper
- Wider default window (1110px)
- Status bar shows transform space + selection type/count
- Tooltip keyboard shortcut hints on all toolbar buttons
Under the Hood
- ThemeManager singleton for consistent QML theming synced from QPalette
- SceneTreeModel (QAbstractItemModel) with debounced rebuild for scene changes
- BatchExporter and MaterialPresetLibrary stubs for future features
- Clean shutdown — LLM worker model explicitly unloaded,
_exit(0)on macOS to avoid ggml-metal assert - New unit tests: ScaleGizmo, UndoManager, SceneTreeModel, ThemeManager, TransformSpace
- Keyboard shortcuts documented on the docs page
Bug Fixes
- Fixed black Inspector/ViewCube on Linux (software rendering set before QQuickWidget creation)
- Fixed crash when importing mesh with non-primitive nodes (isPrimitive guard)
- Fixed crash when renaming animations (skeleton debug cleanup before rename)
- Fixed re-entrant crash toggling skeleton/weights from Inspector
- Fixed QML warnings about undefined primitive field config
- Local transform space now actually works for drag operations (not just cosmetic)
- Frame selection uses focused viewport instead of always first
Preview
Full Changelog: 2.15.1...2.16.0
2.15.1
Fixes & Improvements
SD Stability
- Fix crash on second texture generation — sd.cpp context is now recreated before each call (Metal backend corrupts internal state after first generation)
- Remove img2img (image editing) — crashes on macOS Metal regardless of workarounds
- Pin stable-diffusion.cpp to commit
545fac4for reproducible builds
Material Generation Pipeline
- Material with AI-generated texture is only applied after the texture finishes generating (no more broken intermediate state)
- Unified progress bar: shows "LLM: X%" during material generation, then "Texture: X%" during image generation
- Previously generated textures now load correctly on app restart (resource directory registered at startup)
- LLM system prompt now encourages textures for realistic materials, but only when SD is available
UI / Dark Theme
- Fixed black labels in dark theme across PassProperties and TextureProperties panels (GroupBox titles, CheckBox labels)
- Fixed placeholder text color in AI prompt field
- PBR template replaced with Normal Map template
- Updated AI prompt placeholder text
- Texture preview cache-busting for regenerated textures with same filename
Platform Fixes
- ViewCube no longer stays on top of other windows on Linux and Windows (
Qt::SubWindowinstead ofQt::Tool) - Enable SD in CI deploy builds for Linux and macOS (Windows excluded — MinGW ggml incompatibility)
- Viewport background: RGB(30, 30, 30)
- Snap: documented
qtmesheditor.qtmeshCLI usage and alias command qtmesheditor --helpand--versionnow route to CLI mode