git: 552a69882221 - main - graphics/zeno: make the extensions selectable through OPTIONS

From: Yuri Victorovich <yuri_at_FreeBSD.org>
Date: Fri, 16 Oct 2026 19:56:40 UTC
The branch main has been updated by yuri:

URL: https://cgit.FreeBSD.org/ports/commit/?id=552a69882221f596c683317ca2b893f94549c44a

commit 552a69882221f596c683317ca2b893f94549c44a
Author:     Martin Filla <freebsd@sysctl.cz>
AuthorDate: 2026-10-10 19:54:00 +0000
Commit:     Yuri Victorovich <yuri@FreeBSD.org>
CommitDate: 2026-10-16 19:56:38 +0000

    graphics/zeno: make the extensions selectable through OPTIONS
    
    PR:             299284
    Signed-off-by:  Martin Filla <freebsd@sysctl.cz>
---
 graphics/zeno/Makefile                             | 241 ++++++++++++++-------
 graphics/zeno/files/extra-patch-libigl-diag        |  25 +++
 ...qsort.cpp => extra-patch-libigl-meshfix-jqsort} |   0
 graphics/zeno/files/extra-patch-libigl-slice_into  |  16 ++
 4 files changed, 201 insertions(+), 81 deletions(-)

diff --git a/graphics/zeno/Makefile b/graphics/zeno/Makefile
index e7b178c901c8..62c3c550ebe8 100644
--- a/graphics/zeno/Makefile
+++ b/graphics/zeno/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	zeno
 DISTVERSION=	2024.10.1
-PORTREVISION=	4
+PORTREVISION=	5
 CATEGORIES=	graphics
 
 MAINTAINER=	freebsd@sysctl.cz
@@ -10,82 +10,29 @@ WWW=		https://zenustech.com/
 LICENSE=	MPL20
 LICENSE_FILE=	${WRKSRC}/LICENSE
 
-BUILD_DEPENDS=	alembic>0:graphics/alembic \
-		boost-libs>=1.85.0:devel/boost-libs \
+BUILD_DEPENDS=	boost-libs>=1.85.0:devel/boost-libs \
 		c-blosc2>0:archivers/c-blosc2 \
-		openmpi>0:net/openmpi \
-		cgal>=5.0.2:math/cgal \
 		onetbb>0:devel/onetbb \
-		opencv>0:graphics/opencv \
-		sdl2>0:devel/sdl20 \
-		qwt6-qt5>0:x11-toolkits/qwt6
+		openmpi>0:net/openmpi
 
-LIB_DEPENDS=	libAlembic.so:graphics/alembic \
-		libBulletCollision.so:devel/bullet \
+LIB_DEPENDS=	libboost_atomic.so:devel/boost-libs \
+		libboost_chrono.so:devel/boost-libs \
+		libboost_thread.so:devel/boost-libs \
 		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 \
-		libopencv_stitching.so:graphics/opencv \
-		libopencv_videoio.so:graphics/opencv \
-		libopencv_imgcodecs.so:graphics/opencv \
-		libopencv_xfeatures2d.so:graphics/opencv \
-		libopencv_ml.so:graphics/opencv \
-		libopencv_shape.so:graphics/opencv \
-		libopencv_calib3d.so:graphics/opencv \
-		libopencv_features2d.so:graphics/opencv \
-		libopencv_imgproc.so:graphics/opencv \
-		libopencv_flann.so:graphics/opencv \
-		libopencv_core.so:graphics/opencv
-
-USES=		blaslapack:netlib cmake compiler:c++17-lang eigen:3 localbase:ldflags pkgconfig qt:5
+		libminizip.so:archivers/minizip \
+		libqwt.so:x11-toolkits/qwt6@qt5
+
+USES=		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_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:bullet3:aa4931408428cd72057e59627770fc027c5bb0be:bullet/projects/Rigid/bullet3 \
-		zenustech:OpenSubdiv:a50680658f9732a41fea8e150310cfb9b147dc3c:opensubdiv/projects/MeshSubdiv/OpenSubdiv \
-		zenustech:assimp:745fcc9ba0c79feb4edfc71f464d6d4c920ecc06:assimp/projects/FBX/assimp \
-		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 \
-		ZENO_WITH_ZenoFX \
-		ZENO_WITH_Alembic ZENO_SYSTEM_ALEMBIC \
-		ZENO_WITH_Rigid \
-		ZENO_WITH_oldzenbase \
-		ZENO_WITH_TreeSketch \
-		ZENO_SYSTEM_OPENVDB \
-		ZENO_WITH_Functional \
-		ZENO_WITH_LSystem \
-		ZENO_WITH_mesher \
-		ZENO_WITH_CalcGeometryUV \
-		ZENO_WITH_MeshSubdiv \
-		ZENO_WITH_Audio \
-		ZENO_WITH_PBD \
-		ZENO_WITH_GUI \
-		ZENO_WITH_ImgCV \
-		ZENO_WITH_TOOL_FLIPtools \
-		ZENO_WITH_TOOL_cgmeshTools \
-		ZENO_WITH_TOOL_BulletTools \
-		ZENO_WITH_TOOL_HerculesTools \
-		ZENO_WITH_cgmesh ZENO_WITH_FEM ZENO_WITH_Skinning \
-		ZENO_WITH_DemBones ZENO_WITH_FBX \
-		LIBIGL_SKIP_DOWNLOAD
+		ZENO_SYSTEM_OPENVDB
 
 # Bundled assimp, voro++, meshfix and tetgen are linked statically into
 # libzeno.so so nothing extra has to be installed
@@ -95,41 +42,173 @@ CMAKE_OFF=	ZENO_BUILD_DESIGNER ZENO_BUILD_PLAYER ZENO_INSTALL_TARGET \
 		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_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.
+
+# Every extension below is a set of nodes compiled into libzeno.so, so these
+# options only change what the editor offers - the package always installs the
+# same three files.  Extensions that stay off and why:
+#   zenvdb, FastFLIP	# need the openvdb submodule, add it to GH_TUPLE first
+#   Euler		# needs zenvdb, and compiling it killed gcc
+#   SampleModel		# error: '_pgmptr' was not declared in this scope
+#   CUDA, CuEulerian, CuLagrange, PyZpc, Nemo	# need CUDA
+#   GLTF, USD, Python, Roads, Geometry, ...	# not tried on FreeBSD yet
 # ZENO_BUILD_DESIGNER - bug https://github.com/zenustech/zeno/issues/1907
+OPTIONS_DEFINE=	ALEMBIC AUDIO CALCUV CGMESH DEMBONES FBX FEM FUNCTIONAL \
+		GUI IMGCV LSYSTEM MESHER MESHSUBDIV OLDZENBASE PBD RIGID \
+		SKINNING TREESKETCH ZENOFX
+OPTIONS_GROUP=	TOOLS
+OPTIONS_GROUP_TOOLS=	BULLETTOOLS CGMESHTOOLS FLIPTOOLS HERCULESTOOLS
+OPTIONS_DEFAULT=	ALEMBIC AUDIO CALCUV CGMESH DEMBONES FBX FEM \
+			FUNCTIONAL GUI IMGCV LSYSTEM MESHER MESHSUBDIV \
+			OLDZENBASE PBD RIGID SKINNING TREESKETCH ZENOFX \
+			BULLETTOOLS CGMESHTOOLS FLIPTOOLS HERCULESTOOLS
+
+ALEMBIC_DESC=		Alembic (.abc) import and export nodes
+AUDIO_DESC=		Audio analysis nodes (bundled Aquila)
+CALCUV_DESC=		UV unwrapping nodes (bundled xatlas)
+CGMESH_DESC=		Computational geometry nodes (libigl, CGAL, voro++)
+DEMBONES_DESC=		Skinning decomposition nodes (DemBones)
+FBX_DESC=		FBX import and export nodes (bundled assimp)
+FEM_DESC=		Finite element nodes, implies CGMESH
+FUNCTIONAL_DESC=	Functional programming nodes
+GUI_DESC=		Interactive viewport nodes (SDL2)
+IMGCV_DESC=		Image processing nodes (OpenCV)
+LSYSTEM_DESC=		L-system procedural growth nodes
+MESHER_DESC=		Mesh generation nodes
+MESHSUBDIV_DESC=	Subdivision surface nodes (bundled OpenSubdiv)
+OLDZENBASE_DESC=	Legacy mesh and particle nodes
+PBD_DESC=		Position based dynamics nodes
+RIGID_DESC=		Rigid body nodes (Bullet)
+SKINNING_DESC=		Mesh skinning nodes, implies CGMESH and FEM
+TREESKETCH_DESC=	Tree sketching nodes
+ZENOFX_DESC=		ZenoFX expression wrangler nodes
+TOOLS_DESC=		Node graph presets
+BULLETTOOLS_DESC=	Bullet presets, implies RIGID
+CGMESHTOOLS_DESC=	Voronoi fracture presets, implies CGMESH
+FLIPTOOLS_DESC=		FLIP fluid presets
+HERCULESTOOLS_DESC=	Hercules presets
+
+ALEMBIC_CMAKE_BOOL=	ZENO_WITH_Alembic ZENO_SYSTEM_ALEMBIC
+ALEMBIC_BUILD_DEPENDS=	alembic>0:graphics/alembic
+ALEMBIC_LIB_DEPENDS=	libAlembic.so:graphics/alembic \
+			libImath.so:math/Imath \
+			libOpenEXR.so:graphics/openexr \
+			libpng16.so:graphics/png
+
+AUDIO_CMAKE_BOOL=	ZENO_WITH_Audio
+
+CALCUV_CMAKE_BOOL=	ZENO_WITH_CalcGeometryUV
+
+# The bundled zenustech/libigl fork pulled in here (and with it FEM and
+# SKINNING) dates from 2022 and asks for Eigen 3.3.7 in its own CMake; its
+# diag() and slice_into() use Eigen::DynamicSparseMatrix, which Eigen 5 no
+# longer ships.  The patches below swap that for Eigen::SparseMatrix, so the
+# igl headers zeno uses compile against math/eigen3 as well as math/eigen5.
+# eigen:3 stays for now: CGAL and the rest of the stack here are still built
+# against Eigen 3.
+CGMESH_CMAKE_BOOL=	ZENO_WITH_cgmesh LIBIGL_SKIP_DOWNLOAD
+CGMESH_USES=		blaslapack:netlib
+CGMESH_BUILD_DEPENDS=	cgal>=5.0.2:math/cgal
+CGMESH_LIB_DEPENDS=	libgmp.so:math/gmp \
+			libmpfr.so:math/mpfr
+CGMESH_GH_TUPLE=	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
+# The libigl fork only gets extracted when this option is on, so its patches
+# have to be conditional too
+CGMESH_EXTRA_PATCHES=	${PATCHDIR}/extra-patch-libigl-diag \
+			${PATCHDIR}/extra-patch-libigl-meshfix-jqsort \
+			${PATCHDIR}/extra-patch-libigl-slice_into
+# bundled OpenNL (meshfix) relies on implicit function declarations
+CGMESH_CFLAGS=		-Wno-error=implicit-function-declaration
 
-PLIST_FILES=	bin/autotest \
-		bin/zenoedit \
-		lib/libzeno.so
+DEMBONES_CMAKE_BOOL=	ZENO_WITH_DemBones
+
+# The prebuilt DemBones binaries from the dem-bones-bin submodule are
+# Linux/Windows only, so ExportFBX looks for DemBones in ${PREFIX}/bin instead
+FBX_CMAKE_BOOL=		ZENO_WITH_FBX
+FBX_GH_TUPLE=		zenustech:assimp:745fcc9ba0c79feb4edfc71f464d6d4c920ecc06:assimp/projects/FBX/assimp
+
+FEM_CMAKE_BOOL=		ZENO_WITH_FEM
+FEM_IMPLIES=		CGMESH
+
+FUNCTIONAL_CMAKE_BOOL=	ZENO_WITH_Functional
+
+GUI_CMAKE_BOOL=		ZENO_WITH_GUI
+GUI_USES=		sdl xorg
+GUI_USE=		SDL=sdl2 XORG=xext
+
+IMGCV_CMAKE_BOOL=	ZENO_WITH_ImgCV
+IMGCV_BUILD_DEPENDS=	opencv>0:graphics/opencv
+IMGCV_LIB_DEPENDS=	libopencv_calib3d.so:graphics/opencv \
+			libopencv_core.so:graphics/opencv \
+			libopencv_features2d.so:graphics/opencv \
+			libopencv_flann.so:graphics/opencv \
+			libopencv_highgui.so:graphics/opencv \
+			libopencv_imgcodecs.so:graphics/opencv \
+			libopencv_imgproc.so:graphics/opencv \
+			libopencv_ml.so:graphics/opencv \
+			libopencv_shape.so:graphics/opencv \
+			libopencv_stitching.so:graphics/opencv \
+			libopencv_videoio.so:graphics/opencv \
+			libopencv_xfeatures2d.so:graphics/opencv \
+			libtiff.so:graphics/tiff
+
+LSYSTEM_CMAKE_BOOL=	ZENO_WITH_LSystem
+
+MESHER_CMAKE_BOOL=	ZENO_WITH_mesher
+
+MESHSUBDIV_CMAKE_BOOL=	ZENO_WITH_MeshSubdiv
+MESHSUBDIV_GH_TUPLE=	zenustech:OpenSubdiv:a50680658f9732a41fea8e150310cfb9b147dc3c:opensubdiv/projects/MeshSubdiv/OpenSubdiv
+
+OLDZENBASE_CMAKE_BOOL=	ZENO_WITH_oldzenbase
+
+PBD_CMAKE_BOOL=		ZENO_WITH_PBD
 
 # Bundled bullet3 fork is used only for parts devel/bullet does not provide
 # (BulletInverseDynamics *.hpp, BussIK, VHACD, URDFImporter), the rest comes
 # from devel/bullet
+RIGID_CMAKE_BOOL=	ZENO_WITH_Rigid
+RIGID_LIB_DEPENDS=	libBulletCollision.so:devel/bullet
+RIGID_GH_TUPLE=		zenustech:bullet3:aa4931408428cd72057e59627770fc027c5bb0be:bullet/projects/Rigid/bullet3
+
+SKINNING_CMAKE_BOOL=	ZENO_WITH_Skinning
+# skinning_bbw.cpp includes LBFGSB.h, which only lands on the include path
+# when FEM is built
+SKINNING_IMPLIES=	CGMESH FEM
+
+TREESKETCH_CMAKE_BOOL=	ZENO_WITH_TreeSketch
+
+ZENOFX_CMAKE_BOOL=	ZENO_WITH_ZenoFX
+
+BULLETTOOLS_CMAKE_BOOL=		ZENO_WITH_TOOL_BulletTools
+BULLETTOOLS_IMPLIES=		RIGID
+CGMESHTOOLS_CMAKE_BOOL=		ZENO_WITH_TOOL_cgmeshTools
+CGMESHTOOLS_IMPLIES=		CGMESH
+FLIPTOOLS_CMAKE_BOOL=		ZENO_WITH_TOOL_FLIPtools
+HERCULESTOOLS_CMAKE_BOOL=	ZENO_WITH_TOOL_HerculesTools
+
+PLIST_FILES=	bin/autotest \
+		bin/zenoedit \
+		lib/libzeno.so
+
 BULLET_FORK=	${WRKSRC}/projects/Rigid/bullet3
 
-post-extract:
+post-extract-RIGID-on:
 	@cd ${BULLET_FORK} && ${RM} -r HACD src/Bullet3* src/BulletCollision \
 		src/BulletDynamics src/BulletSoftBody src/LinearMath src/clew \
 		src/*.cpp src/*.h
 
-post-patch:
+post-patch-RIGID-on:
 	@${FIND} ${BULLET_FORK}/src -name '*.[ch]*' -exec ${REINPLACE_CMD} -E \
 		's@#include "(\.\./)+(LinearMath|BulletCollision|BulletDynamics|Bullet3Common|btBullet)@#include "\2@' {} +
 
-pre-configure:
+pre-configure-RIGID-on:
 	@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
+
+pre-configure:
 	${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' ${WRKSRC}/ui/zenoui/CMakeLists.txt
 
 do-install:
diff --git a/graphics/zeno/files/extra-patch-libigl-diag b/graphics/zeno/files/extra-patch-libigl-diag
new file mode 100644
index 000000000000..7454e889b8b7
--- /dev/null
+++ b/graphics/zeno/files/extra-patch-libigl-diag
@@ -0,0 +1,25 @@
+Eigen::DynamicSparseMatrix lived in unsupported/ and was removed in Eigen 5.
+Eigen::SparseMatrix::coeffRef() inserts missing entries just like the dynamic
+variant did, so this keeps the same behaviour while building against both
+math/eigen3 and math/eigen5.
+
+--- projects/cgmesh/libigl/include/igl/diag.cpp.orig	2022-09-08 08:37:09 UTC
++++ projects/cgmesh/libigl/include/igl/diag.cpp
+@@ -72,7 +72,7 @@
+   Eigen::SparseMatrix<T>& X)
+ {
+   // clear and resize output
+-  Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size());
++  Eigen::SparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size());
+   dyn_X.reserve(V.size());
+   // loop over non-zeros
+   for(typename Eigen::SparseVector<T>::InnerIterator it(V); it; ++it)
+@@ -89,7 +89,7 @@
+ {
+   assert(V.rows() == 1 || V.cols() == 1);
+   // clear and resize output
+-  Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size());
++  Eigen::SparseMatrix<T, Eigen::RowMajor> dyn_X(V.size(),V.size());
+   dyn_X.reserve(V.size());
+   // loop over non-zeros
+   for(int i = 0;i<V.size();i++)
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/extra-patch-libigl-meshfix-jqsort
similarity index 100%
rename from graphics/zeno/files/patch-projects_cgmesh_libigl_meshfix_JMeshExt-1.0alpha__src_JMeshLib-1.2_src_PRIMITIVES_jqsort.cpp
rename to graphics/zeno/files/extra-patch-libigl-meshfix-jqsort
diff --git a/graphics/zeno/files/extra-patch-libigl-slice_into b/graphics/zeno/files/extra-patch-libigl-slice_into
new file mode 100644
index 000000000000..309d560dccbf
--- /dev/null
+++ b/graphics/zeno/files/extra-patch-libigl-slice_into
@@ -0,0 +1,16 @@
+Eigen::DynamicSparseMatrix lived in unsupported/ and was removed in Eigen 5.
+Eigen::SparseMatrix::coeffRef() inserts missing entries just like the dynamic
+variant did, so this keeps the same behaviour while building against both
+math/eigen3 and math/eigen5.
+
+--- projects/cgmesh/libigl/include/igl/slice_into.cpp.orig	2022-09-08 08:37:09 UTC
++++ projects/cgmesh/libigl/include/igl/slice_into.cpp
+@@ -34,7 +34,7 @@
+ #endif
+ 
+   // create temporary dynamic sparse matrix
+-  Eigen::DynamicSparseMatrix<T, Eigen::RowMajor> dyn_Y(Y);
++  Eigen::SparseMatrix<T, Eigen::RowMajor> dyn_Y(Y);
+   // Iterate over outside
+   for(int k=0; k<X.outerSize(); ++k)
+   {