Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a9c0c32
feat(#407): native auto-rig core + CLI rig subcommand
fernandotonon Jun 23, 2026
db6937e
feat(#407): MCP auto_rig tool + GUI Auto-Rig + rig CLI tests + docs
fernandotonon Jun 23, 2026
fe12534
fix(#407): compile AutoRig.cpp into the test common lib
fernandotonon Jun 23, 2026
d0ef84e
ci: re-trigger CI for #407 (missed synchronize webhook)
fernandotonon Jun 23, 2026
f80427b
Merge remote-tracking branch 'origin/master' into feat/ai-autorig-407
fernandotonon Jun 23, 2026
0b370c9
fix(gui): blank QML panels + white models in installed builds (#755)
fernandotonon Jun 23, 2026
bede436
fix(#407): address review — QML registration, upAxis, error paths
fernandotonon Jun 23, 2026
79a7c1e
ci: key macOS caches on the resolved Xcode version (fix libz.tbd mism…
fernandotonon Jun 23, 2026
65d49e0
ci: bust stale macOS OGRE cache (xcode263) — fixes libz.tbd link error
fernandotonon Jun 23, 2026
8329bf6
ci: self-heal macOS OGRE cache across differing per-job Xcode images
fernandotonon Jun 23, 2026
b8d5159
ci: keep assimp macOS cache Xcode-agnostic (only ogre is Xcode-keyed)
fernandotonon Jun 23, 2026
142da63
test: fix flaky MainWindowTest.ModeBarLoadsAndModeChange (show window…
fernandotonon Jun 23, 2026
4fe583f
ci: pin SDKROOT so CMake ZLIB resolves under the selected Xcode (macOS)
fernandotonon Jun 23, 2026
dc03896
ci: bust stale macOS OGRE cache (xcode263) — unblock 3.9.1 macOS depl…
fernandotonon Jun 23, 2026
486704c
ci: pin EXACT Xcode 26.3 on all macOS jobs (stop per-image newest dri…
fernandotonon Jun 23, 2026
db5a1df
fix(import): restore textured viewport and paint preview on File→Open…
fernandotonon Jun 24, 2026
71a7897
feat(#407): native auto-rig core + CLI rig subcommand
fernandotonon Jun 23, 2026
d1594bf
feat(#407): MCP auto_rig tool + GUI Auto-Rig + rig CLI tests + docs
fernandotonon Jun 23, 2026
8f2f68d
fix(#407): compile AutoRig.cpp into the test common lib
fernandotonon Jun 23, 2026
4cf8996
fix(#407): address review — QML registration, upAxis, error paths
fernandotonon Jun 23, 2026
e41eb80
feat(#407): Mixamo-style marker placement + undoable rig/skin
fernandotonon Jun 24, 2026
d5af3aa
feat(#407): move auto-rig UI inline into Inspector + fix Skip
fernandotonon Jun 24, 2026
be48eb7
fix(#407): undoable rig crash — strip blend vertex elements on unrig
fernandotonon Jun 24, 2026
a7b5084
feat(#407): coherent marker inference + mesh-bounds clamping
fernandotonon Jun 24, 2026
df6e3d6
Merge remote-tracking branch 'origin/feat/ai-autorig-407' into feat/a…
fernandotonon Jun 24, 2026
75e7b68
fix(#407): update stale 6-marker test to 10; bust stale macOS assimp …
fernandotonon Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 87 additions & 7 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,16 @@ env:
ASSIMP_DIR_VERSION: '6.0'
OGRE_VERSION: '14.5.2'
# Bump to bust the macOS assimp/ogre caches. The cached OGRE/Assimp SDKs bake
# absolute Xcode SDK paths (e.g. .../usr/lib/libz.tbd) into their CMake export;
# when the macos-latest runner image bumps Xcode, a stale cache hit makes
# build-macos fail with "No rule to make target '<old-SDK>/libz.tbd'". Bump
# this whenever the runner's Xcode/SDK changes.
MACOS_CACHE_VERSION: 'xcode26b'
# an absolute Xcode SDK path (e.g. .../usr/lib/libz.tbd) into their CMake
# export. The Pin-Xcode step also pins SDKROOT so CMake's ZLIB resolves under
# the selected Xcode (xcode-select alone didn't stop find_package(ZLIB) from
# picking xcrun's default 26.5 SDK). Bump this whenever the pinned Xcode/SDK
# changes so the SDK is rebuilt against it and stale libz.tbd paths are
# discarded. (sdkpin1 = first build under the SDKROOT-pinned environment;
# sdkpin2 = bust the stale assimp cache that still baked the Xcode 26.5
# libz.tbd path — "No rule to make target .../MacOSX26.5.sdk/.../libz.tbd"
# when OGRE consumed it under the pinned 26.3.)
MACOS_CACHE_VERSION: 'sdkpin2'

jobs:
# send-slack-notification:
Expand Down Expand Up @@ -1580,6 +1585,22 @@ jobs:
echo "Selected Xcode: $DEV"
sudo xcode-select -s "$DEV"
echo "DEVELOPER_DIR=$DEV" >> "$GITHUB_ENV"
# Pin SDKROOT too. xcode-select / DEVELOPER_DIR alone don't stop
# CMake's find_package(ZLIB) from resolving to whatever SDK `xcrun`
# defaults to (on these images that was Xcode 26.5 even with 26.3
# selected), so OGRE's CMake export baked a 26.5 libz.tbd path that
# then failed to link under 26.3. Exporting SDKROOT makes clang AND
# CMake resolve system libs under the SAME pinned SDK everywhere.
SDKROOT_PATH="$(xcrun --sdk macosx --show-sdk-path 2>/dev/null)"
[ -n "$SDKROOT_PATH" ] && echo "SDKROOT=$SDKROOT_PATH" >> "$GITHUB_ENV"
echo "Pinned SDKROOT: $SDKROOT_PATH"
# The per-job runner images can carry DIFFERENT newest Xcodes
# (e.g. producer image has 26.5, consumer image only 26.3). Fold the
# resolved Xcode app into the cache key so each job only restores a
# cache built under its OWN Xcode; build-macos rebuilds OGRE on a
# miss (steps below) so a mismatch self-heals instead of failing
# with "No rule to make target '.../Xcode_XX/...libz.tbd'".
echo "XCODE_TAG=$(basename "$(dirname "$(dirname "$DEV")")")" >> "$GITHUB_ENV"

- name: change folder permissions
run: |
Expand All @@ -1603,6 +1624,9 @@ jobs:
/usr/local/lib/libzlibstatic.a
#key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('/home/runner/work/QtMeshEditor/QtMeshEditor/assimp') }}
# Need to delete manually if needed to rebuild. Until I find a better solution for detecting changes in the assimp repo.
# NOTE: assimp is NOT Xcode-keyed (unlike ogre): it's a plain static lib
# that doesn't bake absolute SDK paths, so one assimp cache works across
# Xcode versions and stays shared so the ogre-rebuild-on-miss can use it.
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.MACOS_CACHE_VERSION }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-${{ env.MACOS_CACHE_VERSION }}-
Expand Down Expand Up @@ -1633,6 +1657,22 @@ jobs:
echo "Selected Xcode: $DEV"
sudo xcode-select -s "$DEV"
echo "DEVELOPER_DIR=$DEV" >> "$GITHUB_ENV"
# Pin SDKROOT too. xcode-select / DEVELOPER_DIR alone don't stop
# CMake's find_package(ZLIB) from resolving to whatever SDK `xcrun`
# defaults to (on these images that was Xcode 26.5 even with 26.3
# selected), so OGRE's CMake export baked a 26.5 libz.tbd path that
# then failed to link under 26.3. Exporting SDKROOT makes clang AND
# CMake resolve system libs under the SAME pinned SDK everywhere.
SDKROOT_PATH="$(xcrun --sdk macosx --show-sdk-path 2>/dev/null)"
[ -n "$SDKROOT_PATH" ] && echo "SDKROOT=$SDKROOT_PATH" >> "$GITHUB_ENV"
echo "Pinned SDKROOT: $SDKROOT_PATH"
# The per-job runner images can carry DIFFERENT newest Xcodes
# (e.g. producer image has 26.5, consumer image only 26.3). Fold the
# resolved Xcode app into the cache key so each job only restores a
# cache built under its OWN Xcode; build-macos rebuilds OGRE on a
# miss (steps below) so a mismatch self-heals instead of failing
# with "No rule to make target '.../Xcode_XX/...libz.tbd'".
echo "XCODE_TAG=$(basename "$(dirname "$(dirname "$DEV")")")" >> "$GITHUB_ENV"

- name: change folder permissions
run: |
Expand Down Expand Up @@ -1665,7 +1705,7 @@ jobs:
cache-name: cache-ogre-macos
with:
path: ${{github.workspace}}/ogre/SDK
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.MACOS_CACHE_VERSION }}
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.MACOS_CACHE_VERSION }}-${{ env.XCODE_TAG }}

- if: steps.cache-ogre-macos.outputs.cache-hit != 'true'
name: Check out ogre repo
Expand Down Expand Up @@ -1698,6 +1738,22 @@ jobs:
echo "Selected Xcode: $DEV"
sudo xcode-select -s "$DEV"
echo "DEVELOPER_DIR=$DEV" >> "$GITHUB_ENV"
# Pin SDKROOT too. xcode-select / DEVELOPER_DIR alone don't stop
# CMake's find_package(ZLIB) from resolving to whatever SDK `xcrun`
# defaults to (on these images that was Xcode 26.5 even with 26.3
# selected), so OGRE's CMake export baked a 26.5 libz.tbd path that
# then failed to link under 26.3. Exporting SDKROOT makes clang AND
# CMake resolve system libs under the SAME pinned SDK everywhere.
SDKROOT_PATH="$(xcrun --sdk macosx --show-sdk-path 2>/dev/null)"
[ -n "$SDKROOT_PATH" ] && echo "SDKROOT=$SDKROOT_PATH" >> "$GITHUB_ENV"
echo "Pinned SDKROOT: $SDKROOT_PATH"
# The per-job runner images can carry DIFFERENT newest Xcodes
# (e.g. producer image has 26.5, consumer image only 26.3). Fold the
# resolved Xcode app into the cache key so each job only restores a
# cache built under its OWN Xcode; build-macos rebuilds OGRE on a
# miss (steps below) so a mismatch self-heals instead of failing
# with "No rule to make target '.../Xcode_XX/...libz.tbd'".
echo "XCODE_TAG=$(basename "$(dirname "$(dirname "$DEV")")")" >> "$GITHUB_ENV"

- name: change folder permissions
run: |
Expand Down Expand Up @@ -1761,7 +1817,31 @@ jobs:
cache-name: cache-ogre-macos
with:
path: ${{github.workspace}}/ogre/SDK
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.MACOS_CACHE_VERSION }}
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.MACOS_CACHE_VERSION }}-${{ env.XCODE_TAG }}

# If this runner image's Xcode differs from the one the producer cached
# under, the key above misses. Rebuild OGRE here under THIS job's Xcode so
# the SDK's baked libz.tbd path matches what we link against (self-heals the
# cross-image Xcode mismatch instead of failing on a stale libz.tbd path).
- if: steps.cache-ogre-macos.outputs.cache-hit != 'true'
name: Check out ogre repo (cache miss)
uses: actions/checkout@master
with:
repository: OGRECave/ogre
ref: v${{ env.OGRE_VERSION }}
path: ${{github.workspace}}/ogre
Comment thread
coderabbitai[bot] marked this conversation as resolved.

- if: steps.cache-ogre-macos.outputs.cache-hit != 'true'
name: Build Ogre3D repo (cache miss)
run: |
cd ${{github.workspace}}/ogre/
sudo cmake -S . -DOGRE_BUILD_PLUGIN_ASSIMP=ON -Dassimp_DIR=/usr/local/lib/cmake/assimp-${{ env.ASSIMP_DIR_VERSION }}/ \
-DOGRE_BUILD_PLUGIN_DOT_SCENE=ON -DOGRE_BUILD_RENDERSYSTEM_GL=ON -DOGRE_BUILD_RENDERSYSTEM_GL3PLUS=ON \
-DOGRE_BUILD_RENDERSYSTEM_GLES2=OFF -DOGRE_BUILD_TESTS=OFF -DOGRE_BUILD_TOOLS=OFF -DOGRE_BUILD_SAMPLES=OFF \
-DOGRE_BUILD_COMPONENT_CSHARP=OFF -DOGRE_BUILD_COMPONENT_JAVA=OFF -DOGRE_BUILD_COMPONENT_PYTHON=OFF \
-DOGRE_INSTALL_TOOLS=OFF -DOGRE_INSTALL_DOCS=OFF -DOGRE_INSTALL_SAMPLES=OFF -DOGRE_BUILD_LIBS_AS_FRAMEWORKS=OFF \
-DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
sudo make install -j8

- name: Configure CMake
env:
Expand Down
6 changes: 5 additions & 1 deletion CLAUDE.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ cmake_minimum_required(VERSION 3.24.0)
cmake_policy(SET CMP0005 NEW)
cmake_policy(SET CMP0048 NEW) # manages project version

project(QtMeshEditor VERSION 3.9.0 LANGUAGES C CXX)
project(QtMeshEditor VERSION 3.9.2 LANGUAGES C CXX)
message(STATUS "Building QtMeshEditor version ${PROJECT_VERSION}")

set(QTMESHEDITOR_VERSION_STRING "\"${PROJECT_VERSION}\"")
Expand Down
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Available on the [GitHub Actions Marketplace](https://github.com/marketplace/act
**Versioning**

- **Always follow the latest GitHub release** — use the Marketplace floating tag `fernandotonon/QtMeshEditor@v1` (same pattern as the [Marketplace example](https://github.com/marketplace/actions/qtmesheditor)). The composite action defaults to `image-tag: latest`, so the Docker CLI tracks the newest published `ghcr.io/fernandotonon/qtmesh` image.
- **Reproducible builds** — pin the action and the container to the same semver as this repository’s `project(QtMeshEditor VERSION …)` in `CMakeLists.txt` (currently **3.9.0**). After bumping the version in CMake, run `./scripts/sync-doc-versions-from-cmake.sh` to refresh the pinned refs in `README.md` and the docs site fallback; CI enforces the match with `./scripts/sync-doc-versions-from-cmake.sh --check`.
- **Reproducible builds** — pin the action and the container to the same semver as this repository’s `project(QtMeshEditor VERSION …)` in `CMakeLists.txt` (currently **3.9.2**). After bumping the version in CMake, run `./scripts/sync-doc-versions-from-cmake.sh` to refresh the pinned refs in `README.md` and the docs site fallback; CI enforces the match with `./scripts/sync-doc-versions-from-cmake.sh --check`.

Pinned workflow template (action + `ghcr.io` image aligned):

Expand All @@ -53,10 +53,10 @@ jobs:
- uses: actions/checkout@v4

- name: Run QtMesh scan
uses: fernandotonon/QtMeshEditor@3.9.0
uses: fernandotonon/QtMeshEditor@3.9.2
with:
command: scan
image-tag: "3.9.0"
image-tag: "3.9.2"
env:
QTMESH_CLOUD_TOKEN: ${{ secrets.QTMESH_CLOUD_TOKEN }}
```
Expand All @@ -81,37 +81,37 @@ Release tags are listed on the [releases page](https://github.com/fernandotonon/

```yaml
# Validate a specific mesh
- uses: fernandotonon/QtMeshEditor@3.9.0
- uses: fernandotonon/QtMeshEditor@3.9.2
with:
command: validate
input-file: ./models/character.fbx
image-tag: "3.9.0"
image-tag: "3.9.2"

# Convert FBX → glTF
- uses: fernandotonon/QtMeshEditor@3.9.0
- uses: fernandotonon/QtMeshEditor@3.9.2
with:
command: convert
input-file: ./models/character.fbx
output-file: ./output/character.gltf2
image-tag: "3.9.0"
image-tag: "3.9.2"

# Resample Mixamo animations (200+ keyframes → 30)
- uses: fernandotonon/QtMeshEditor@3.9.0
- uses: fernandotonon/QtMeshEditor@3.9.2
with:
command: anim
input-file: ./animations/dance.fbx
output-file: ./output/dance_optimized.fbx
options: --resample 30
image-tag: "3.9.0"
image-tag: "3.9.2"

# Get mesh info as JSON
- uses: fernandotonon/QtMeshEditor@3.9.0
- uses: fernandotonon/QtMeshEditor@3.9.2
id: info
with:
command: info
input-file: ./models/character.fbx
options: --json
image-tag: "3.9.0"
image-tag: "3.9.2"

# Docker (alternative — :latest tracks newest image; pin :3.4.0 to match semver action ref)
docker run --rm -v $(pwd):/workspace ghcr.io/fernandotonon/qtmesh:latest scan ./assets --fail-on error
Expand Down
Loading
Loading