-
Notifications
You must be signed in to change notification settings - Fork 1
feat(#519): Anim Slice B — vertex animation + Alembic (.abc) import #804
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
fernandotonon
wants to merge
18
commits into
master
Choose a base branch
from
feat/anim-slice-b-vertex-alembic
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
cf9ffb0
feat(#519): Anim Slice B1 — VertexAnimationManager + VAT_POSE playback
fernandotonon 755e43d
fix(#519): add VertexAnimationManager.cpp to the test-common library
fernandotonon 19fa1fd
feat(#519): Anim Slice B2 — Alembic (.abc) vertex-cache reader
fernandotonon f8997f6
ci(#519): don't enable Alembic on the coverage lane
fernandotonon f9b9096
fix(#519): stop playback before morph/vertex delete; fix morph header…
fernandotonon b89b751
feat(anim #519 B3): Alembic --info CLI + import_alembic/play_vertex_a…
fernandotonon d10aa95
feat(anim #519 B3): frame-cap honesty + readInfo/truncation tests
fernandotonon b927eee
docs(#519 B3): document Alembic --info CLI + import_alembic/play_vert…
fernandotonon 28ed49d
feat(#519 B3): add Alembic (.abc) filter to the import file dialog
fernandotonon 0f6dc8c
fix(#519): drop stale per-frame poses when rebuilding a vertex clip
fernandotonon acf5aa0
fix(#519): address B3 review — runOgreOp guard, readInfo empty-sample…
fernandotonon 0ae3cd2
feat(#519): Vertex Morph Animation group in Edit Mode + per-format im…
fernandotonon dae6833
feat(#519): morph reorder + Add-popup focus/theme; hide targets from …
fernandotonon 7e4c89f
feat(#519): base-preserving morph sculpt session + live render during…
fernandotonon f6a1f28
feat(#519): morph weight keyframing over time + glTF morph-weights ex…
fernandotonon b44d4bd
docs(#519): document morph authoring UX + weight keyframing + glTF ex…
fernandotonon a29cbb6
feat(#519): multi-clip morph weight animation + drag-drop reorder + O…
fernandotonon 3e93dba
Merge remote-tracking branch 'origin/master' into feat/anim-slice-b-v…
fernandotonon File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| # Alembic (.abc) vertex-animation import — Anim epic Slice B (#519), sub-slice B2. | ||
| # | ||
| # Vendors Imath 3 + Alembic (both BSD-3-Clause) via FetchContent, statically, | ||
| # with every optional component OFF (no HDF5, Python, tests, binaries, install). | ||
| # Exposes an imported target `qtmesh_alembic` that the app links; the C++ side | ||
| # is #ifdef ENABLE_ALEMBIC-guarded so a build without this still compiles. | ||
| # | ||
| # Why build from source rather than find_package: Alembic + Imath system | ||
| # packages are absent or version-skewed across our three targets (macOS via | ||
| # brew, Ubuntu CI, Windows MinGW). FetchContent gives one reproducible version | ||
| # everywhere, matching how the project already vendors ONNX Runtime / libsodium | ||
| # / tinyexr. | ||
| # | ||
| # Dependency chain: Alembic FIND_PACKAGE(Imath) → we build Imath as a | ||
| # subproject first, point Imath_DIR at its generated build-tree config so | ||
| # Alembic's find_package(Imath CONFIG) resolves to the target we just built. | ||
|
|
||
| if(TARGET qtmesh_alembic) | ||
| return() | ||
| endif() | ||
|
|
||
| include(FetchContent) | ||
|
|
||
| set(QTMESH_IMATH_TAG "v3.1.12" CACHE STRING "Imath git tag") | ||
| set(QTMESH_ALEMBIC_TAG "1.8.8" CACHE STRING "Alembic git tag") | ||
|
|
||
| # ---- Imath --------------------------------------------------------------- | ||
| # Static, no tests/python. IMATH_INSTALL stays ON: Alembic's own | ||
| # INSTALL(EXPORT AlembicTargets) is unconditional and references Imath, so | ||
| # Imath MUST be in an export set too or CMake's generate step fails | ||
| # ("target Alembic requires target Imath that is not in any export set"). | ||
| # We never actually run `make install` from the app build, so an ON install | ||
| # rule is harmless — it just keeps the export sets consistent. | ||
| set(IMATH_INSTALL ON CACHE BOOL "" FORCE) | ||
| set(IMATH_INSTALL_PKG_CONFIG OFF CACHE BOOL "" FORCE) | ||
| set(PYTHON OFF CACHE BOOL "" FORCE) | ||
| set(BUILD_TESTING OFF CACHE BOOL "" FORCE) | ||
| set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) | ||
|
|
||
| FetchContent_Declare( | ||
| qtmesh_imath | ||
| GIT_REPOSITORY https://github.com/AcademySoftwareFoundation/Imath.git | ||
| GIT_TAG ${QTMESH_IMATH_TAG} | ||
| GIT_SHALLOW TRUE | ||
| ) | ||
| FetchContent_MakeAvailable(qtmesh_imath) | ||
|
|
||
| # Alembic's find_package(Imath) resolves against a CONFIG. Imath-as-subproject | ||
| # writes its package config under the build dir; point find_package there. | ||
| if(NOT DEFINED Imath_DIR) | ||
| set(Imath_DIR "${qtmesh_imath_BINARY_DIR}/config" CACHE PATH "" FORCE) | ||
| endif() | ||
|
|
||
| # ---- Alembic ------------------------------------------------------------- | ||
| # Everything optional OFF: no HDF5 backend (we only read the modern Ogawa | ||
| # backend), no tests/binaries/python/prman/maya/arnold, static lib. | ||
| set(USE_HDF5 OFF CACHE BOOL "" FORCE) | ||
| set(USE_TESTS OFF CACHE BOOL "" FORCE) | ||
| set(USE_BINARIES OFF CACHE BOOL "" FORCE) | ||
| set(USE_EXAMPLES OFF CACHE BOOL "" FORCE) | ||
| set(USE_PYALEMBIC OFF CACHE BOOL "" FORCE) | ||
| set(USE_ARNOLD OFF CACHE BOOL "" FORCE) | ||
| set(USE_PRMAN OFF CACHE BOOL "" FORCE) | ||
| set(USE_MAYA OFF CACHE BOOL "" FORCE) | ||
| set(ALEMBIC_SHARED_LIBS OFF CACHE BOOL "" FORCE) | ||
| set(ALEMBIC_ILMBASE_LINK_STATIC ON CACHE BOOL "" FORCE) | ||
| set(ALEMBIC_LIB_INSTALL_DIR "lib" CACHE STRING "" FORCE) | ||
|
|
||
| FetchContent_Declare( | ||
| qtmesh_alembic | ||
| GIT_REPOSITORY https://github.com/alembic/alembic.git | ||
| GIT_TAG ${QTMESH_ALEMBIC_TAG} | ||
| GIT_SHALLOW TRUE | ||
| ) | ||
| FetchContent_MakeAvailable(qtmesh_alembic) | ||
|
|
||
| # Alembic's core library target is `Alembic` (with an `Alembic::Alembic` alias | ||
| # in recent versions). Wrap whichever exists behind our stable name so the app | ||
| # links `qtmesh_alembic` regardless. | ||
| if(TARGET Alembic::Alembic) | ||
| add_library(qtmesh_alembic INTERFACE) | ||
| target_link_libraries(qtmesh_alembic INTERFACE Alembic::Alembic Imath::Imath) | ||
| elseif(TARGET Alembic) | ||
| add_library(qtmesh_alembic INTERFACE) | ||
| target_link_libraries(qtmesh_alembic INTERFACE Alembic Imath::Imath) | ||
| # The plain `Alembic` target's public include dirs cover its own headers; | ||
| # Imath::Imath carries the Imath headers Alembic's public API exposes. | ||
| else() | ||
| message(FATAL_ERROR "Alembic.cmake: neither Alembic nor Alembic::Alembic target was created") | ||
| endif() | ||
|
|
||
| message(STATUS "Alembic ${QTMESH_ALEMBIC_TAG} + Imath ${QTMESH_IMATH_TAG} vendored (static)") | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🌐 Web query:
Where does Imath 3.1.12 CMakeLists.txt write its build-tree package config (Imath_DIR) when building as a FetchContent subproject?💡 Result:
When using Imath 3.1.12 as a FetchContent subproject, the build-tree configuration files (including ImathConfig.cmake) are generated within the Imath build directory, specifically inside the directory defined by ${CMAKE_CURRENT_BINARY_DIR} [1]. In the Imath build system, the configuration files are managed in config/CMakeLists.txt [1]. The ImathConfig.cmake and associated version files are generated into the root of the Imath build directory (within that subproject's binary directory) using CMake's configure_package_config_file command [1]. Because FetchContent adds the project directly into the main build tree, you generally do not need to manually set Imath_DIR to locate the package [2][3]. Instead, you can simply call find_package(Imath CONFIG) in your downstream CMake code [3]. CMake will typically find the Imath targets exported within the current build session, allowing you to link against them using the Imath::Imath namespace [1][3]. If for any reason manual path resolution is required, it would point to the binary directory where the Imath subproject was configured [1].
Citations:
🏁 Script executed:
Repository: fernandotonon/QtMeshEditor
Length of output: 984
🏁 Script executed:
Repository: fernandotonon/QtMeshEditor
Length of output: 5125
🌐 Web query:
Imath 3.1.12 config/CMakeLists.txt configure_package_config_file ImathConfig.cmake CMAKE_CURRENT_BINARY_DIR config subdirectory💡 Result:
In Imath 3.1.12, the config/CMakeLists.txt file uses the CMake command configure_package_config_file to generate the ImathConfig.cmake file [1]. This command is part of the CMakePackageConfigHelpers module, which is essential for creating relocatable CMake package configuration files [2][3][4]. The usage in Imath 3.1.12 follows this standard pattern [1]: include(CMakePackageConfigHelpers) configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/ImathConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/ImathConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Imath) Key technical details regarding this configuration include: 1. Purpose of configure_package_config_file: Unlike the standard configure_file, this command is specifically designed for generating Config.cmake files [3][4]. It enables the created file to be relocatable by calculating path variables (like install directories) relative to the installation prefix, rather than using absolute build-time paths [3][4][5]. 2. CMAKE_CURRENT_BINARY_DIR: This variable is used as the output destination for the generated ImathConfig.cmake file [1]. Generating it here ensures that the file is created within the build tree, from where it can subsequently be installed to the final destination using an install command [1][5]. 3. INSTALL_DESTINATION: This mandatory argument specifies where the package configuration file will eventually be installed [3][5]. The command uses this path to correctly calculate relative paths within the generated configuration file, ensuring that when a user subsequently finds the package via find_package, the paths resolve correctly regardless of where the package was installed on their system [3][4]. 4. Workflow: After generating the file in the CMAKE_CURRENT_BINARY_DIR, the Imath build system uses the install command to copy the generated ImathConfig.cmake and associated version file (generated via write_basic_package_version_file) to the appropriate system directory (e.g., ${CMAKE_INSTALL_LIBDIR}/cmake/Imath) [1].
Citations:
🏁 Script executed:
Repository: fernandotonon/QtMeshEditor
Length of output: 164
🌐 Web query:
site:github.com/AcademySoftwareFoundation/Imath v3.1.12 config/CMakeLists.txt ImathConfig.cmake configure_package_config_file💡 Result:
In Imath v3.1.12, the configuration of the package's CMake files is managed within the config/CMakeLists.txt file [1][2]. The project utilizes the standard CMake command
configure_package_config_fileto generate theImathConfig.cmakefile from an input template,ImathConfig.cmake.in[1]. Specifically, the following process is used in config/CMakeLists.txt: 1. TheCMakePackageConfigHelpersmodule is included to provide the necessary helper functions [1]. 2.configure_package_config_fileis called to generate the finalImathConfig.cmakein the build directory, with theINSTALL_DESTINATIONset to the appropriate subdirectory within the installation library path (typicallylib/cmake/Imath) [1]. 3. A corresponding version file is generated usingwrite_basic_package_version_fileto ensure compatibility checks duringfind_package(Imath CONFIG)calls [1]. 4. The generatedImathConfig.cmakeandImathConfigVersion.cmakefiles are subsequently installed to the target directory alongside the exported project targets [1]. This setup allows downstream projects to reliably locate Imath usingfind_package(Imath CONFIG)[3][4]. Notably, version 3.1.12 specifically addressed issues related to improper versioning in these configuration files that were present in the previous v3.1.11 release [2][5].Citations:
🌐 Web query:
site:github.com/AcademySoftwareFoundation/Imath v3.1.12 "configure_package_config_file" "CMAKE_CURRENT_BINARY_DIR"💡 Result:
The function configure_package_config_file is a command provided by the CMakePackageConfigHelpers module in CMake. It is used to generate a package configuration file (typically named Config.cmake) for a project, which enables other projects to find and use your library via the find_package command [1]. In practice, CMAKE_CURRENT_BINARY_DIR is frequently used as the location to generate this configuration file before it is installed [1][2]. By generating the file in the binary directory, you ensure that the project can reference the generated configuration file (and associated version files) during both the build process and installation phase [1][2]. A typical usage pattern, as seen in projects like Imath, involves these steps: 1. Include the helper module: include(CMakePackageConfigHelpers) 2. Call the function: configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/MyPackageConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/MyPackageConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/MyPackage) This command configures the input template file (.cmake.in) by replacing variables with their current values and outputs the result to the specified file in CMAKE_CURRENT_BINARY_DIR, while setting up path variables to be relocatable based on the INSTALL_DESTINATION [1].
Citations:
Point
Imath_DIRat the Imath binary dir. Imath 3.1.12 writesImathConfig.cmaketo${qtmesh_imath_BINARY_DIR}, not${qtmesh_imath_BINARY_DIR}/config, so the current path makes Alembic’sfind_package(Imath CONFIG)miss the package.🤖 Prompt for AI Agents