git: 40b0dbeea3fb - main - graphics/zeno: Unbundle bullet, build with base clang, fix runtime crashes
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 08 Oct 2026 10:15:08 UTC
The branch main has been updated by fluffy:
URL: https://cgit.FreeBSD.org/ports/commit/?id=40b0dbeea3fb99c080d422e5774791772b2b0275
commit 40b0dbeea3fb99c080d422e5774791772b2b0275
Author: Martin Filla <freebsd@sysctl.cz>
AuthorDate: 2026-10-06 08:13:16 +0000
Commit: Dima Panov <fluffy@FreeBSD.org>
CommitDate: 2026-10-08 10:12:33 +0000
graphics/zeno: Unbundle bullet, build with base clang, fix runtime crashes
* Use bullet from devel/bullet instead of the bundled zenustech/bullet3
fork. The fork was built as shared libraries (it forces
BUILD_SHARED_LIBS=ON) that libzeno.so linked against but which were
never installed, so libzeno.so failed at runtime with
libBulletDynamics.so.3.17, libVHACD.so, libBussIK.so, ... not found.
Only the parts devel/bullet does not provide (BulletInverseDynamics
headers, BussIK, VHACD, URDFImporter) are still taken from the fork
and compiled directly into libzeno.so. The single precision flavor
is required (zeno assumes btScalar is float), so the build stops
early when bullet-double is installed.
* Build with base clang instead of GCC. Mixing libstdc++ with Qt5 and
the other dependencies built against libc++/libcxxrt crashed
zenoedit in __dynamic_cast as soon as a node was added. The
--allow-shlib-undefined -lomp workaround is no longer needed.
Added a patch for the only clang build error (PrimUnmerge.cpp).
* Fix LIB_DEPENDS on math/Imath: depend on libImath.so instead of
libImath-3_1.so, which no longer exists since Imath 3.2.
* Enable ZenoFX (wrangle nodes, without the CUDA part) and Alembic
using graphics/alembic, which was already a dependency but unused.
Added graphics/openexr to LIB_DEPENDS.
* Drop the openvdb, assimp, dem-bones-bin and libigl GH_TUPLEs, which
were used only by disabled extensions (~73 MB fewer distfiles).
* Bump PORTREVISION.
PR: 299168
---
graphics/zeno/Makefile | 70 ++++++++++++++++------
graphics/zeno/distinfo | 16 ++---
.../files/patch-projects_Alembic_CMakeLists.txt | 12 ++++
.../zeno/files/patch-projects_FBX_CMakeLists.txt | 18 ++++++
.../zeno/files/patch-projects_Rigid_CMakeLists.txt | 55 +++++++++++++++++
...pha__src_JMeshLib-1.2_src_PRIMITIVES_jqsort.cpp | 11 ++++
.../files/patch-zeno_src_nodes_neo_PrimUnmerge.cpp | 22 +++++++
7 files changed, 178 insertions(+), 26 deletions(-)
diff --git a/graphics/zeno/Makefile b/graphics/zeno/Makefile
index 145231b8a046..e7b178c901c8 100644
--- a/graphics/zeno/Makefile
+++ b/graphics/zeno/Makefile
@@ -1,6 +1,6 @@
PORTNAME= zeno
DISTVERSION= 2024.10.1
-PORTREVISION= 3
+PORTREVISION= 4
CATEGORIES= graphics
MAINTAINER= freebsd@sysctl.cz
@@ -21,7 +21,11 @@ BUILD_DEPENDS= alembic>0:graphics/alembic \
qwt6-qt5>0:x11-toolkits/qwt6
LIB_DEPENDS= libAlembic.so:graphics/alembic \
+ libBulletCollision.so:devel/bullet \
libcryptopp.so:security/cryptopp \
+ libgmp.so:math/gmp \
+ libmpfr.so:math/mpfr \
+ libOpenEXR.so:graphics/openexr \
libImath.so:math/Imath \
libtiff.so:graphics/tiff \
libopencv_highgui.so:graphics/opencv \
@@ -37,25 +41,31 @@ LIB_DEPENDS= libAlembic.so:graphics/alembic \
libopencv_flann.so:graphics/opencv \
libopencv_core.so:graphics/opencv
-USES= cmake compiler:c++17-lang eigen:3 localbase:ldflags pkgconfig qt:5
+USES= blaslapack:netlib cmake compiler:c++17-lang eigen:3 localbase:ldflags pkgconfig qt:5
USE_LDCONFIG= yes
USE_QT= core gui network opengl svg widgets buildtools:build qmake:build
-USE_GCC= yes
USE_SDL= sdl2
USE_XORG= xext
+ONLY_FOR_ARCHS= amd64
+ONLY_FOR_ARCHS_REASON= heavy use of SSE instructions in ZenoFX module
+
+# bundled OpenNL (meshfix) relies on implicit function declarations
+CFLAGS+= -Wno-error=implicit-function-declaration
+
USE_GITHUB= yes
GH_ACCOUNT= zenustech
-GH_TUPLE+= zenustech:openvdb:74a95a74d91e0115be00d7b94391f5607e02d60f:openvdb/projects/zenvdb/openvdb \
+GH_TUPLE+= zenustech:bullet3:aa4931408428cd72057e59627770fc027c5bb0be:bullet/projects/Rigid/bullet3 \
+ zenustech:OpenSubdiv:a50680658f9732a41fea8e150310cfb9b147dc3c:opensubdiv/projects/MeshSubdiv/OpenSubdiv \
zenustech:assimp:745fcc9ba0c79feb4edfc71f464d6d4c920ecc06:assimp/projects/FBX/assimp \
- zenustech:dem-bones-bin:30a39493f0394dfedc5d72ea463405b8f07a446e:dem/projects/FBX/dem-bones-bin \
- zenustech:libigl:9af4b833cb37c0d4b77ca62b7502284b3a83a47e:libigl/projects/cgmesh/libigl \
- zenustech:bullet3:aa4931408428cd72057e59627770fc027c5bb0be:bullet/projects/Rigid/bullet3 \
- zenustech:OpenSubdiv:a50680658f9732a41fea8e150310cfb9b147dc3c:opensubdiv/projects/MeshSubdiv/OpenSubdiv
+ zenustech:libigl:4c94cfef23974d945a6c0cf97660c327839df5d0:libigl/projects/cgmesh/libigl \
+ libigl:tetgen:4f3bfba3997f20aa1f96cfaff604313a8c2c85b6:tetgen/projects/cgmesh/libigl/external/tetgen \
+ libigl:libigl-predicates:488242fa2b1f98a9c5bd1441297fb4a99a6a9ae4:predicates/projects/cgmesh/libigl/external/predicates
CMAKE_ON= ZENO_BUILD_EDITOR ZENO_BUILD_SHARED ZENO_IPC_USE_TCP \
ZENO_MULTIPROCESS ZENO_NO_WARNING ZENO_USE_CCACHE \
- ZENOFX_ENABLE_LBVH \
+ ZENO_WITH_ZenoFX \
+ ZENO_WITH_Alembic ZENO_SYSTEM_ALEMBIC \
ZENO_WITH_Rigid \
ZENO_WITH_oldzenbase \
ZENO_WITH_TreeSketch \
@@ -72,30 +82,54 @@ CMAKE_ON= ZENO_BUILD_EDITOR ZENO_BUILD_SHARED ZENO_IPC_USE_TCP \
ZENO_WITH_TOOL_FLIPtools \
ZENO_WITH_TOOL_cgmeshTools \
ZENO_WITH_TOOL_BulletTools \
- ZENO_WITH_TOOL_HerculesTools
+ ZENO_WITH_TOOL_HerculesTools \
+ ZENO_WITH_cgmesh ZENO_WITH_FEM ZENO_WITH_Skinning \
+ ZENO_WITH_DemBones ZENO_WITH_FBX \
+ LIBIGL_SKIP_DOWNLOAD
+# Bundled assimp, voro++, meshfix and tetgen are linked statically into
+# libzeno.so so nothing extra has to be installed
CMAKE_OFF= ZENO_BUILD_DESIGNER ZENO_BUILD_PLAYER ZENO_INSTALL_TARGET \
ZENO_MARCH_NATIVE ZENO_OPTIX_PROC ZENO_USE_FAST_MATH \
ZENO_WIN32_RC ZENO_WITH_CUDA \
- ZENO_WITH_ZenoFX ZENOFX_ENABLE_OPENVDB \
- ZENO_WITH_Alembic ZENO_SYSTEM_ALEMBIC
+ ZFX_ENABLE_CUDA \
+ BUILD_SHARED_LIBS VORO_BUILD_SHARED_LIBS \
+ ASSIMP_BUILD_ASSIMP_TOOLS ASSIMP_BUILD_TESTS
#ZENO_WITH_FastFLIP ZENO_WITH_zenvdb # compile zenovdb
#ZENO_WITH_Euler ZENO_WITH_zenvdb # compile zenvdb killed gcc
- #ZENO_WITH_Skinning ZENO_WITH_cgmesh # git download project dependent skinning on cgmesh
- #ZENO_WITH_cgmesh ZENO_WITH_FEM # git download projects dependent cgmesh on FEM
- #ZENO_WITH_DemBones ZENO_WITH_FBX # harcoded folder and libs in CMakefile
#ZENO_WITH_SampleModel # error: '_pgmptr' was not declared in this scope
+# Skinning needs cgmesh (libigl) and FEM (LBFGSpp headers).
+# FBX uses the bundled assimp fork; the prebuilt DemBones binaries from the
+# dem-bones-bin submodule are Linux/Windows only, so ExportFBX looks for
+# DemBones in ${PREFIX}/bin instead.
+# SampleModel and zenvdb need submodules which are not fetched (openvdb), add
+# them to GH_TUPLE when enabling those.
# ZENO_BUILD_DESIGNER - bug https://github.com/zenustech/zeno/issues/1907
-# fix on 14.1: "ld: error: undefined reference due to --no-allow-shlib-undefined:
-LDFLAGS+= -Wl,--allow-shlib-undefined -lomp
-
PLIST_FILES= bin/autotest \
bin/zenoedit \
lib/libzeno.so
+# Bundled bullet3 fork is used only for parts devel/bullet does not provide
+# (BulletInverseDynamics *.hpp, BussIK, VHACD, URDFImporter), the rest comes
+# from devel/bullet
+BULLET_FORK= ${WRKSRC}/projects/Rigid/bullet3
+
+post-extract:
+ @cd ${BULLET_FORK} && ${RM} -r HACD src/Bullet3* src/BulletCollision \
+ src/BulletDynamics src/BulletSoftBody src/LinearMath src/clew \
+ src/*.cpp src/*.h
+
+post-patch:
+ @${FIND} ${BULLET_FORK}/src -name '*.[ch]*' -exec ${REINPLACE_CMD} -E \
+ 's@#include "(\.\./)+(LinearMath|BulletCollision|BulletDynamics|Bullet3Common|btBullet)@#include "\2@' {} +
+
pre-configure:
+ @if ${GREP} -q BT_USE_DOUBLE_PRECISION ${LOCALBASE}/libdata/pkgconfig/bullet.pc; then \
+ ${ECHO_MSG} "===> ${PKGNAME} requires single precision devel/bullet, deinstall bullet-double first"; \
+ ${FALSE}; \
+ fi
${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' ${WRKSRC}/ui/zenoui/CMakeLists.txt
do-install:
diff --git a/graphics/zeno/distinfo b/graphics/zeno/distinfo
index 27ddea15c59c..f62f592334f7 100644
--- a/graphics/zeno/distinfo
+++ b/graphics/zeno/distinfo
@@ -1,15 +1,15 @@
TIMESTAMP = 1732976904
SHA256 (zenustech-zeno-2024.10.1_GH0.tar.gz) = ae44fd0ac2aabf225718ffa4d10a057b4ad088534f81df19682b77701dfca139
SIZE (zenustech-zeno-2024.10.1_GH0.tar.gz) = 101700063
-SHA256 (zenustech-openvdb-74a95a74d91e0115be00d7b94391f5607e02d60f_GH0.tar.gz) = eb57b050e06ebf9d900a537f3d57b0d1b359ffeba8a347773dba3f4618041698
-SIZE (zenustech-openvdb-74a95a74d91e0115be00d7b94391f5607e02d60f_GH0.tar.gz) = 3816032
-SHA256 (zenustech-assimp-745fcc9ba0c79feb4edfc71f464d6d4c920ecc06_GH0.tar.gz) = ed5017b2f8bdee0f117ed9ada0ea0f4e67705bd264e9bb0a086d89a9fcac3834
-SIZE (zenustech-assimp-745fcc9ba0c79feb4edfc71f464d6d4c920ecc06_GH0.tar.gz) = 46626516
-SHA256 (zenustech-dem-bones-bin-30a39493f0394dfedc5d72ea463405b8f07a446e_GH0.tar.gz) = 813a7a3c9d66527881591c716c91cc863ec3b3b4f7e8f176a99dbcbe3aa6d521
-SIZE (zenustech-dem-bones-bin-30a39493f0394dfedc5d72ea463405b8f07a446e_GH0.tar.gz) = 20143407
-SHA256 (zenustech-libigl-9af4b833cb37c0d4b77ca62b7502284b3a83a47e_GH0.tar.gz) = 75156457813f2679696db8bbfaef137fab9b8accd78488d4c49ce50e94e08fcc
-SIZE (zenustech-libigl-9af4b833cb37c0d4b77ca62b7502284b3a83a47e_GH0.tar.gz) = 2524253
SHA256 (zenustech-bullet3-aa4931408428cd72057e59627770fc027c5bb0be_GH0.tar.gz) = 134f6f0baddd84eaf1c0535bfd7c4fb1797ca3897375b513c9fec6a9fbe30abc
SIZE (zenustech-bullet3-aa4931408428cd72057e59627770fc027c5bb0be_GH0.tar.gz) = 1647993
SHA256 (zenustech-OpenSubdiv-a50680658f9732a41fea8e150310cfb9b147dc3c_GH0.tar.gz) = 4bf359ef175e9ef90296d84cdafef67b748a0a35339fb3b7d2192761f4965f0d
SIZE (zenustech-OpenSubdiv-a50680658f9732a41fea8e150310cfb9b147dc3c_GH0.tar.gz) = 39239132
+SHA256 (zenustech-assimp-745fcc9ba0c79feb4edfc71f464d6d4c920ecc06_GH0.tar.gz) = ed5017b2f8bdee0f117ed9ada0ea0f4e67705bd264e9bb0a086d89a9fcac3834
+SIZE (zenustech-assimp-745fcc9ba0c79feb4edfc71f464d6d4c920ecc06_GH0.tar.gz) = 46626516
+SHA256 (zenustech-libigl-4c94cfef23974d945a6c0cf97660c327839df5d0_GH0.tar.gz) = 772b2e071c94b5d3a2e1c2ea62ac68c6b8018add43266c9effec2bd455f6b479
+SIZE (zenustech-libigl-4c94cfef23974d945a6c0cf97660c327839df5d0_GH0.tar.gz) = 2521399
+SHA256 (libigl-tetgen-4f3bfba3997f20aa1f96cfaff604313a8c2c85b6_GH0.tar.gz) = 2ae0cac33484f06a2e1f0128959a122cc13933ad50ec163b003a6746ce65f5d9
+SIZE (libigl-tetgen-4f3bfba3997f20aa1f96cfaff604313a8c2c85b6_GH0.tar.gz) = 312373
+SHA256 (libigl-libigl-predicates-488242fa2b1f98a9c5bd1441297fb4a99a6a9ae4_GH0.tar.gz) = b910e02b80a3b4bce342a1133ccf213b10c171283b0e8c62ac77ac6765853244
+SIZE (libigl-libigl-predicates-488242fa2b1f98a9c5bd1441297fb4a99a6a9ae4_GH0.tar.gz) = 24578
diff --git a/graphics/zeno/files/patch-projects_Alembic_CMakeLists.txt b/graphics/zeno/files/patch-projects_Alembic_CMakeLists.txt
new file mode 100644
index 000000000000..abd8e1dc6146
--- /dev/null
+++ b/graphics/zeno/files/patch-projects_Alembic_CMakeLists.txt
@@ -0,0 +1,12 @@
+--- projects/Alembic/CMakeLists.txt.orig 2024-09-30 13:46:54 UTC
++++ projects/Alembic/CMakeLists.txt
+@@ -9,6 +9,9 @@
+ if (ZENO_SYSTEM_ALEMBIC)
+ find_package(Alembic REQUIRED)
+ target_link_libraries(zeno PRIVATE Alembic::Alembic)
++ # png16.cpp uses OpenEXR, otherwise provided by the Alembic submodule
++ find_package(OpenEXR REQUIRED)
++ target_link_libraries(zeno PRIVATE OpenEXR::OpenEXR)
+ else()
+ if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Alembic/CMakeLists.txt)
+ message(FATAL_ERROR "Alembic submodule not found! Please run: git submodule update --init --recursive")
diff --git a/graphics/zeno/files/patch-projects_FBX_CMakeLists.txt b/graphics/zeno/files/patch-projects_FBX_CMakeLists.txt
new file mode 100644
index 000000000000..73377099d460
--- /dev/null
+++ b/graphics/zeno/files/patch-projects_FBX_CMakeLists.txt
@@ -0,0 +1,18 @@
+--- projects/FBX/CMakeLists.txt.orig 2024-09-30 13:46:54 UTC
++++ projects/FBX/CMakeLists.txt
+@@ -40,12 +40,7 @@
+ endif()
+ endif()
+
+-set(DEM_DIR ${CMAKE_CURRENT_SOURCE_DIR}/dem-bones-bin/bin/${CMAKE_SYSTEM_NAME})
+-if (NOT EXISTS ${DEM_DIR})
+- message(FATAL_ERROR "Please run: git submodule update --init --recursive")
+-endif()
+-zeno_add_asset_dir(${DEM_DIR})
++# DemBones binary is not available on FreeBSD, ExportFBX looks for it in PREFIX/bin
++set(DEM_DIR ${CMAKE_INSTALL_PREFIX}/bin)
+ configure_file(zeno_FBX_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/confinc/zeno_FBX_config.h @ONLY)
+ target_include_directories(zeno PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/confinc)
+-
+-execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/dem-bones-bin/models ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/models)
+\ No newline at end of file
diff --git a/graphics/zeno/files/patch-projects_Rigid_CMakeLists.txt b/graphics/zeno/files/patch-projects_Rigid_CMakeLists.txt
new file mode 100644
index 000000000000..0ed544a756bc
--- /dev/null
+++ b/graphics/zeno/files/patch-projects_Rigid_CMakeLists.txt
@@ -0,0 +1,55 @@
+--- projects/Rigid/CMakeLists.txt.orig 2024-09-30 13:46:54 UTC
++++ projects/Rigid/CMakeLists.txt
+@@ -1,11 +1,20 @@
+ add_definitions(-DBT_THREAD_SAFE)
+ add_compile_options(-w)
+
+-if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bullet3/CMakeLists.txt)
++# FreeBSD: use system bullet (devel/bullet) instead of the bundled copy
++find_package(PkgConfig REQUIRED)
++pkg_check_modules(BULLET REQUIRED bullet)
++
++# Parts of zenustech/bullet3 fork which are not provided by devel/bullet
++if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bullet3/src/URDFImporter/CMakeLists.txt)
+ message(FATAL_ERROR "bullet3 submodule not found! Please run: git submodule update --init --recursive")
+ endif()
+-add_subdirectory(bullet3)
+-add_subdirectory(bullet3/HACD)
++file (GLOB ZEN_BULLET_EXTRAS_SOURCE
++ bullet3/src/BulletInverseDynamics/*.cpp
++ bullet3/src/BulletInverseDynamics/details/*.cpp
++ bullet3/src/BussIK/*.cpp
++ bullet3/src/VHACD/src/*.cpp
++ bullet3/src/URDFImporter/*.cpp)
+
+ file (GLOB ZEN_RIGID_SOURCE *.cpp *.h)
+
+@@ -14,18 +23,15 @@
+ list (APPEND ZEN_RIGID_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/RigidFracture.cpp)
+ endif(ZENO_WITH_CUDA)
+
+-target_sources(zeno PRIVATE ${ZEN_RIGID_SOURCE})
+-zeno_disable_warning(${ZEN_RIGID_SOURCE})
++target_sources(zeno PRIVATE ${ZEN_RIGID_SOURCE} ${ZEN_BULLET_EXTRAS_SOURCE})
++zeno_disable_warning(${ZEN_RIGID_SOURCE} ${ZEN_BULLET_EXTRAS_SOURCE})
+ target_include_directories(zeno PRIVATE .)
+-target_include_directories(zeno PRIVATE bullet3/src)
++target_include_directories(zeno PRIVATE bullet3/src bullet3/src/VHACD)
++target_include_directories(zeno PRIVATE ${BULLET_INCLUDE_DIRS} ${BULLET_INCLUDEDIR}/HACD)
++target_compile_options(zeno PRIVATE ${BULLET_CFLAGS_OTHER})
+
+-target_link_libraries(zeno PRIVATE LinearMath)
+-target_link_libraries(zeno PRIVATE Bullet3Common)
+-target_link_libraries(zeno PRIVATE BulletInverseDynamics)
+-target_link_libraries(zeno PRIVATE BulletCollision)
+-target_link_libraries(zeno PRIVATE BulletDynamics)
+-target_link_libraries(zeno PRIVATE BulletSoftBody)
+-target_link_libraries(zeno PRIVATE HACD)
+-target_link_libraries(zeno PRIVATE VHACD)
+-target_link_libraries(zeno PRIVATE BussIK)
+-target_link_libraries(zeno PRIVATE URDFImporter)
++foreach (lib IN ITEMS BulletSoftBody BulletDynamics BulletCollision
++ Bullet3Common LinearMath HACD)
++ find_library(BULLET_${lib}_LIBRARY NAMES ${lib} HINTS ${BULLET_LIBRARY_DIRS} REQUIRED)
++ target_link_libraries(zeno PRIVATE ${BULLET_${lib}_LIBRARY})
++endforeach()
diff --git a/graphics/zeno/files/patch-projects_cgmesh_libigl_meshfix_JMeshExt-1.0alpha__src_JMeshLib-1.2_src_PRIMITIVES_jqsort.cpp b/graphics/zeno/files/patch-projects_cgmesh_libigl_meshfix_JMeshExt-1.0alpha__src_JMeshLib-1.2_src_PRIMITIVES_jqsort.cpp
new file mode 100644
index 000000000000..fd180b01d934
--- /dev/null
+++ b/graphics/zeno/files/patch-projects_cgmesh_libigl_meshfix_JMeshExt-1.0alpha__src_JMeshLib-1.2_src_PRIMITIVES_jqsort.cpp
@@ -0,0 +1,11 @@
+--- projects/cgmesh/libigl/meshfix/JMeshExt-1.0alpha_src/JMeshLib-1.2/src/PRIMITIVES/jqsort.cpp.orig 2024-09-30 13:46:54 UTC
++++ projects/cgmesh/libigl/meshfix/JMeshExt-1.0alpha_src/JMeshLib-1.2/src/PRIMITIVES/jqsort.cpp
+@@ -36,7 +36,7 @@
+
+ void jqsort_prv(void *v[], int left, int right, int (*comp)(const void *, const void *))
+ {
+- register int i, last;
++ int i, last;
+
+ if (left >= right) return;
+ jswap(v, left, (left+right)/2);
diff --git a/graphics/zeno/files/patch-zeno_src_nodes_neo_PrimUnmerge.cpp b/graphics/zeno/files/patch-zeno_src_nodes_neo_PrimUnmerge.cpp
new file mode 100644
index 000000000000..346a5d5e8a9d
--- /dev/null
+++ b/graphics/zeno/files/patch-zeno_src_nodes_neo_PrimUnmerge.cpp
@@ -0,0 +1,22 @@
+--- zeno/src/nodes/neo/PrimUnmerge.cpp.orig 2024-09-30 13:46:54 UTC
++++ zeno/src/nodes/neo/PrimUnmerge.cpp
+@@ -224,7 +224,8 @@
+ }
+ mapping[attr[i]].push_back(i);
+ }
+- for (auto &[key, val]: mapping) {
++ for (auto &kv: mapping) {
++ auto &val = kv.second; // clang: structured binding can not be captured with OpenMP
+ auto new_prim = std::dynamic_pointer_cast<PrimitiveObject>(prim->clone());
+ new_prim->tris.resize(val.size());
+ for (auto i = 0; i < val.size(); i++) {
+@@ -248,7 +249,8 @@
+ }
+ mapping[attr[i]].push_back(i);
+ }
+- for (auto &[key, val]: mapping) {
++ for (auto &kv: mapping) {
++ auto &val = kv.second; // clang: structured binding can not be captured with OpenMP
+ auto new_prim = std::dynamic_pointer_cast<PrimitiveObject>(prim->clone());
+ new_prim->polys.resize(val.size());
+ for (auto i = 0; i < val.size(); i++) {