diff --git a/.gitattributes b/.gitattributes
index cb63127d..5977e6e2 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,12 +1,328 @@
-*.a filter=lfs diff=lfs merge=lfs -text
-*.lib filter=lfs diff=lfs merge=lfs -text
-*.dll filter=lfs diff=lfs merge=lfs -text
-*.pdb filter=lfs diff=lfs merge=lfs -text
-*.png filter=lfs diff=lfs merge=lfs -text
-*.jpg filter=lfs diff=lfs merge=lfs -text
-*.uberz filter=lfs diff=lfs merge=lfs -text
-*.bin filter=lfs diff=lfs merge=lfs -text
-*.ktx filter=lfs diff=lfs merge=lfs -text
-*.blend filter=lfs diff=lfs merge=lfs -text
-*.gltf filter=lfs diff=lfs merge=lfs -text
-*.glb filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbackendtest_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libsdl2.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmathio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmatdbg_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libspirv-cross-msl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libSPIRV-Tools.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libimageio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libOGLCompiler.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libSPIRV-Tools-diff.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmathio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libassimp.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmatlang.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmatdbg_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/swift/DartFilamentTexture.h filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbasis_encoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libimgui.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libimageio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbackend_test.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgetopt.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgtest.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmatdbg_resources.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libSPIRV.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libpng.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmatdbg_resources.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libsuzanne-resources.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmath.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libpng16.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbenchmark_main.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbluegl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/swift/build.sh filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libbluegl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libpng.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libglslang.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbenchmark.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgltf-demo-resources.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libSPIRV-Tools-lint.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilagui.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libsample-resources.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libOSDependent.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libspirv-cross-glsl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libgltfio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libpng.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libgltfio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libmatdbg.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libspirv-cross-core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilagui.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmath.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/swift/libdartfilamenttexture.dylib filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libSPIRV-Tools-link.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libz.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmatdbg.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/swift filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libSPIRV-Tools-reduce.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/debug/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/ios/libimageio.a filter=lfs diff=lfs merge=lfs -text
+materials/Makefile filter=lfs diff=lfs merge=lfs -text
+materials/gizmo.filamat filter=lfs diff=lfs merge=lfs -text
+materials/gizmo.mat filter=lfs diff=lfs merge=lfs -text
+materials/image.filamat filter=lfs diff=lfs merge=lfs -text
+materials/image.mat filter=lfs diff=lfs merge=lfs -text
+materials/unlit_fade.mat filter=lfs diff=lfs merge=lfs -text
+materials/unlit_opaque.mat filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64 filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86 filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/arm64-v8a/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/armeabi-v7a/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86_64/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/android/x86/libstb.a filter=lfs diff=lfs merge=lfs -text
+flutter_filament_federated/flutter_filament/example/web/dart_filament.wasm filter=lfs diff=lfs merge=lfs -text
+flutter_filament_federated/flutter_filament/example/web/main.unopt.wasm filter=lfs diff=lfs merge=lfs -text
+flutter_filament_federated/flutter_filament/example/web/main.wasm filter=lfs diff=lfs merge=lfs -text
+flutter_filament_federated/flutter_filament/example/web/dart_filament.js filter=lfs diff=lfs merge=lfs -text
+flutter_filament_federated/flutter_filament/example/web/dart_filament.worker.js filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmatdbg_resources.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libuberarchive.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libbasis_transcoder.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libgltfio_core.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libimage.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libviewer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilagui.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libshaders.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmeshoptimizer.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libibl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libuberzlib.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libutils.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libzstd.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilaflat.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilamat_lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libgltfio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libimageio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libdracodec.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilabridge.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libktxreader.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmatdbg.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmathio.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libbackend.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libbluegl.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilament.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libgeometry.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libstb.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libpng.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libibl-lite.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmatdbg_combined.a filter=lfs diff=lfs merge=lfs -text
+dart_filament/native/lib/macos/release/libmath.a filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/analyze_project.yaml b/.github/workflows/analyze_project.yaml
deleted file mode 100644
index d75c31cb..00000000
--- a/.github/workflows/analyze_project.yaml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Dart Analyzer
-
-on:
- push:
- branches: [ main ]
- pull_request:
- branches: [ main ]
-
-jobs:
- analyze:
- name: Analyze
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-java@v1
- with:
- java-version: '12.x'
-
- - name: Install Flutter
- uses: subosito/flutter-action@v1
- with:
- flutter-version: '2.x'
-
- - name: Get dependencies
- run: flutter pub get
-
- - name: Analyze
- run: flutter analyze
\ No newline at end of file
diff --git a/.github/workflows/calculate_pub_dev_score.yaml b/.github/workflows/calculate_pub_dev_score.yaml
deleted file mode 100644
index 9988c8e9..00000000
--- a/.github/workflows/calculate_pub_dev_score.yaml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: PubDev Score
-
-on:
- push:
- branches: [ master ]
- pull_request:
- branches: [ master ]
-
-jobs:
- package-analysis:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
- - uses: axel-op/dart-package-analyzer@v3
- id: analysis
- with:
- githubToken: ${{ secrets.GITHUB_TOKEN }}
-
- # use this id to retrieve the outputs in the next steps
- # exit dirty when the package doesn't reach 100%
- - name: Check scores
- env:
- # "analysis" is the id set above
- # PERCENTAGE=$(( $TOTAL * 100 / $TOTAL_MAX ))
- TOTAL: ${{ steps.analysis.outputs.total }}
- TOTAL_MAX: ${{ steps.analysis.outputs.total_max }}
- JSON_OUT: ${{ steps.analysis.outputs.json_output }}
- run: |
- if (( $TOTAL != $TOTAL_MAX ))
- then
- echo There are missing points in the project!
- echo $TOTAL from $TOTAL_MAX Points reached
- echo $JSON_OUT | jq
- exit 1
- fi
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 9dcd4503..46ef4bfd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,9 @@
+**/*/.cxx
+**/.github
+**/.idea
+.dart_tool
+**/.dart_tool
.vscode
-macos/src
-macos/include
-.DS_Store
\ No newline at end of file
+.DS_Store
+**/*/build
+flutter_filament_federated/*/pubspec.lock
diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml
deleted file mode 100644
index 9947e786..00000000
--- a/.idea/libraries/Dart_SDK.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index f0496777..00000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/.idea/runConfigurations/example_lib_main_dart.xml b/.idea/runConfigurations/example_lib_main_dart.xml
deleted file mode 100644
index 5fd9159d..00000000
--- a/.idea/runConfigurations/example_lib_main_dart.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 67826e51..00000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Makefile b/Makefile
index 64f6b95d..4015d76f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,9 +1,20 @@
-# building on MacOS, we currently just delete the macos/include
-# and macos/src directories and copy from iOS
-sync-macos: FORCE
- rm -rf ${current_dir}macos/include ${current_dir}macos/src
- cp -R ${current_dir}ios/include ${current_dir}macos
- cp -R ${current_dir}ios/src ${current_dir}macos
+dart-web:
+ cd dart_filament/native/web; mkdir -p build && cd build && emcmake cmake .. && emmake make
+dart-web-clean:
+ cd dart_filament/native/web && rm -rf build
+dart-wasm-cli-example: dart-web-clean dart-web
+ cd dart_filament/examples/cli_wasm/bin && dart compile wasm example_cli.dart && node main.js
+dart-web-example: dart-web
+ cp dart_filament/native/web/build/build/out/dart_filament* examples/web_wasm/bin
+ cd dart_filament/examples/web_wasm/bin && dart compile wasm example_web.dart
+flutter-example-web: dart-web-clean dart-web
+ cd flutter_filament_federated/flutter_filament/example/web && dart compile wasm main.dart && cd .. && flutter build web --wasm --profile
+flutter-example-macos:
+ cd flutter_filament_federated/flutter_filament/example/web && flutter run -d macos
+swift-bindings:
+ cd dart_filament/ && dart --enable-experiment=native-assets run ffigen --config ffigen/swift.yaml
+bindings:
+ cd dart_filament/ && dart --enable-experiment=native-assets run ffigen --config ffigen/native.yaml
# We compile a small set of custom materials for various helpers (background image, gizmo, etc)
# You must specify the `FILAMENT_PATH` environment variable, either the path /out/release
@@ -18,4 +29,4 @@ materials: FORCE
#rm materials/*.filamat
FORCE: ;
-
+
diff --git a/android/.cxx/abi_configuration_3f421w4c.json b/android/.cxx/abi_configuration_3f421w4c.json
deleted file mode 100644
index cc7b4d82..00000000
--- a/android/.cxx/abi_configuration_3f421w4c.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "allAbis": [
- "arm64-v8a"
- ],
- "validAbis": [
- "ARM64_V8A"
- ]
-}
\ No newline at end of file
diff --git a/android/.cxx/abi_configuration_3f421w4c.log b/android/.cxx/abi_configuration_3f421w4c.log
deleted file mode 100644
index 0637a088..00000000
--- a/android/.cxx/abi_configuration_3f421w4c.log
+++ /dev/null
@@ -1 +0,0 @@
-[]
\ No newline at end of file
diff --git a/android/.cxx/abi_configuration_3f421w4c_key.json b/android/.cxx/abi_configuration_3f421w4c_key.json
deleted file mode 100644
index 3ae4ccbd..00000000
--- a/android/.cxx/abi_configuration_3f421w4c_key.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "ndkHandlerSupportedAbis": [
- "ARMEABI_V7A",
- "ARM64_V8A",
- "X86",
- "X86_64"
- ],
- "ndkHandlerDefaultAbis": [
- "ARMEABI_V7A",
- "ARM64_V8A",
- "X86",
- "X86_64"
- ],
- "externalNativeBuildAbiFilters": [],
- "ndkConfigAbiFilters": [
- "arm64-v8a"
- ],
- "splitsFilterAbis": [],
- "ideBuildOnlyTargetAbi": true
-}
\ No newline at end of file
diff --git a/android/.cxx/ndk_locator_record_1q1i3ah3.json b/android/.cxx/ndk_locator_record_1q1i3ah3.json
deleted file mode 100644
index c7366bce..00000000
--- a/android/.cxx/ndk_locator_record_1q1i3ah3.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "ndk": "C:\\Users\\Nick\\AppData\\Local\\Android\\Sdk\\ndk\\25.2.9519653",
- "revision": {
- "mMajor": 25,
- "mMinor": 2,
- "mMicro": 9519653,
- "mPreview": 0,
- "mPrecision": "MICRO",
- "mPreviewSeparator": " "
- }
-}
\ No newline at end of file
diff --git a/android/.cxx/ndk_locator_record_1q1i3ah3.log b/android/.cxx/ndk_locator_record_1q1i3ah3.log
deleted file mode 100644
index 2849d5b7..00000000
--- a/android/.cxx/ndk_locator_record_1q1i3ah3.log
+++ /dev/null
@@ -1,22 +0,0 @@
-[
- {
- "level": "INFO",
- "message": "android.ndkVersion from module build.gradle is [25.2.9519653]"
- },
- {
- "level": "INFO",
- "message": "android.ndkPath from module build.gradle is not set"
- },
- {
- "level": "INFO",
- "message": "ndk.dir in local.properties is not set"
- },
- {
- "level": "INFO",
- "message": "Not considering ANDROID_NDK_HOME because support was removed after deprecation period."
- },
- {
- "level": "INFO",
- "message": "sdkFolder is C:\\Users\\Nick\\AppData\\Local\\Android\\Sdk"
- }
-]
\ No newline at end of file
diff --git a/android/.cxx/ndk_locator_record_1q1i3ah3_key.json b/android/.cxx/ndk_locator_record_1q1i3ah3_key.json
deleted file mode 100644
index 48347fb0..00000000
--- a/android/.cxx/ndk_locator_record_1q1i3ah3_key.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "ndkVersionFromDsl": "25.2.9519653",
- "sdkFolder": "C:\\Users\\Nick\\AppData\\Local\\Android\\Sdk",
- "sideBySideNdkFolderNames": [
- "19.2.5345600",
- "21.1.6352462",
- "21.4.7075529",
- "22.0.7026061",
- "22.1.7171670",
- "23.0.7599858",
- "23.1.7779620",
- "23.2.8568313",
- "24.0.8215888",
- "25.1.8937393",
- "25.2.9519653"
- ]
-}
\ No newline at end of file
diff --git a/android/CMakeLists.txt b/android/CMakeLists.txt
deleted file mode 100644
index d52dff40..00000000
--- a/android/CMakeLists.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-cmake_minimum_required(VERSION 3.10)
-
-include_directories(../ios/src)
-include_directories(../ios/include)
-include_directories(../ios/include/filament)
-include_directories(src/main/cpp)
-link_directories(src/main/jniLibs/${ANDROID_ABI})
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
-
-add_library(flutter_filament_android SHARED
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/FlutterFilamentApi.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/FlutterFilamentFFIApi.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/src/main/cpp/FilamentAndroid.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/SceneManager.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/FilamentViewer.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/StreamBufferAdapter.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/TimeIt.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/camutils/Manipulator.cpp"
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/camutils/Bookmark.cpp"
-)
-
-add_library(FILAMENT_SHADERS SHARED
- "${CMAKE_CURRENT_SOURCE_DIR}/../ios/include/material/image.c"
-)
-
-target_link_libraries(
- flutter_filament_android
- FILAMENT_SHADERS
- -landroid
- -llog
- -lgltfio_core
- -lfilament
- -lbackend
- -lgeometry
- -lfilameshio
- -lfilamat
- -lfilabridge
- -lcamutils
- -lfilaflat
- -ldracodec
- -libl
- -lktxreader
- -limageio
- -limage
- -lutils
- -ltinyexr
- -lstb
- -lbluevk
- -lvkshaders
- -luberzlib
- -lsmol-v
- -luberarchive
- -lmeshoptimizer
- -lgeometry
- -lbasis_transcoder
- -lGLESv3
- -lEGL
- -lpng
- -lz
- -lzstd
-)
\ No newline at end of file
diff --git a/android/src/main/cpp/FilamentAndroid.cpp b/android/src/main/cpp/FilamentAndroid.cpp
deleted file mode 100644
index 1e0c4695..00000000
--- a/android/src/main/cpp/FilamentAndroid.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#include
-#include
-
-extern "C" {
-
- #include "FlutterFilamentFFIApi.h"
-
- void* get_native_window_from_surface(
- jobject surface,
- JNIEnv* env
- ) {
- void* window = ANativeWindow_fromSurface(env, surface);
- return window;
- }
-
- // this does nothing, but we need it for JNA to return the correct pointer
- FilamentRenderCallback make_render_callback_fn_pointer(FilamentRenderCallback callback) {
- return callback;
- }
-
-}
diff --git a/android/src/main/jniLibs/arm64-v8a/libbackend.a b/android/src/main/jniLibs/arm64-v8a/libbackend.a
deleted file mode 100644
index 64f74e1c..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libbackend.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:577996c240a574c291848329ddc2823ed9432a3bb0eba4322bc8724f616b46dc
-size 2186272
diff --git a/android/src/main/jniLibs/arm64-v8a/libbasis_transcoder.a b/android/src/main/jniLibs/arm64-v8a/libbasis_transcoder.a
deleted file mode 100644
index 81af2883..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libbasis_transcoder.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:76eaee1bddc9c4fa2a5da5fece5bc33178092a24843250ad02623031fc6271b5
-size 387274
diff --git a/android/src/main/jniLibs/arm64-v8a/libbluevk.a b/android/src/main/jniLibs/arm64-v8a/libbluevk.a
deleted file mode 100644
index 793e4000..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libbluevk.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:11b0fc712800467f6f9eae1022a9b6a868c37040b8d27aab3b141f47684ee0f0
-size 200504
diff --git a/android/src/main/jniLibs/arm64-v8a/libcamutils.a b/android/src/main/jniLibs/arm64-v8a/libcamutils.a
deleted file mode 100644
index be7a5438..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libcamutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f56a73aa32f19c681cd140a83e64273b6bf550770cbc1ba0c39f8e8135d992ac
-size 49004
diff --git a/android/src/main/jniLibs/arm64-v8a/libcivetweb.a b/android/src/main/jniLibs/arm64-v8a/libcivetweb.a
deleted file mode 100644
index 67ec7345..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libcivetweb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c3d89171648cd80b9457cc1d06e50f44cf816b37932dfb05d1d192743a75f3f6
-size 283364
diff --git a/android/src/main/jniLibs/arm64-v8a/libdracodec.a b/android/src/main/jniLibs/arm64-v8a/libdracodec.a
deleted file mode 100644
index 7322665a..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libdracodec.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5e9862f1e4694a57fafd1140d8749dabbb50c580673a5eefbd4f184a799b09a1
-size 2537500
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilabridge.a b/android/src/main/jniLibs/arm64-v8a/libfilabridge.a
deleted file mode 100644
index ea488df7..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilabridge.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b920ca16cc9542ddfb5d1710ccaafe6d6302c957c46583cd378eecb4855749d3
-size 67032
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilaflat.a b/android/src/main/jniLibs/arm64-v8a/libfilaflat.a
deleted file mode 100644
index 07278718..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilaflat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ee941c4e8d442ce441720653bacf58dca3811d957522364cc0df7c1323e9b0b8
-size 49830
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilamat.a b/android/src/main/jniLibs/arm64-v8a/libfilamat.a
deleted file mode 100644
index 4eab1a7c..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilamat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f7cb50b8b077a1f5a3bc2f9ed0c77b45be68eae6090b2835ffd085bf2cdcc43d
-size 28876048
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilamat_lite.a b/android/src/main/jniLibs/arm64-v8a/libfilamat_lite.a
deleted file mode 100644
index 3fc305a3..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilamat_lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:014d1015b292c6a49e4bdbf86e1eea9000bc91497dcb072dd7c3c771de07a33e
-size 650872
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilament-iblprefilter.a b/android/src/main/jniLibs/arm64-v8a/libfilament-iblprefilter.a
deleted file mode 100644
index 9d07c3e8..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilament-iblprefilter.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e27d41d11d24399af9a06b3c320de343b4b035299c4372a035cf16f74d3a94e6
-size 72470
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilament.a b/android/src/main/jniLibs/arm64-v8a/libfilament.a
deleted file mode 100644
index 9e5681a9..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilament.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f9b76ab599e907ef8bc2c1372d01a8c1697b700fd231c523fc4d2d316d6c4e79
-size 2730404
diff --git a/android/src/main/jniLibs/arm64-v8a/libfilameshio.a b/android/src/main/jniLibs/arm64-v8a/libfilameshio.a
deleted file mode 100644
index 7b6f662d..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libfilameshio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d49cef08fadf1ce1853d683005b6e93d15364e40ec94913b9f4e33aa7bd1b1ed
-size 42044
diff --git a/android/src/main/jniLibs/arm64-v8a/libgeometry.a b/android/src/main/jniLibs/arm64-v8a/libgeometry.a
deleted file mode 100644
index b4c4a17a..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libgeometry.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fd3c186447e4e40f44b0fd37a6255add16c0b055cddcb73e9e570ea624d2b56e
-size 99010
diff --git a/android/src/main/jniLibs/arm64-v8a/libgltfio_core.a b/android/src/main/jniLibs/arm64-v8a/libgltfio_core.a
deleted file mode 100644
index 7b24a035..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libgltfio_core.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3768e9aaa45b74679c7470730422f33b5bef68821a42e9fa176e5d2dc60c0f7f
-size 1189476
diff --git a/android/src/main/jniLibs/arm64-v8a/libibl-lite.a b/android/src/main/jniLibs/arm64-v8a/libibl-lite.a
deleted file mode 100644
index 720f5109..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libibl-lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b826b2c7c829153b1d27706cb5db97cc69ef2f61f4736f020e17c30395651459
-size 360156
diff --git a/android/src/main/jniLibs/arm64-v8a/libibl.a b/android/src/main/jniLibs/arm64-v8a/libibl.a
deleted file mode 100644
index 5ea9905b..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libibl.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4853a94c43601aa7b5c072b4d789d435c5f2ddf4b9bdda96e44d363dbb7d1495
-size 440976
diff --git a/android/src/main/jniLibs/arm64-v8a/libimage.a b/android/src/main/jniLibs/arm64-v8a/libimage.a
deleted file mode 100644
index c922b79c..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libimage.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:19ccbbc7b5fb6f65c95c531f7562ee60882ebe755599787e050a6573e509f029
-size 104924
diff --git a/android/src/main/jniLibs/arm64-v8a/libimageio.a b/android/src/main/jniLibs/arm64-v8a/libimageio.a
deleted file mode 100644
index 46904f96..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libimageio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2affa1a46f0509e26741e613278ba7742e73d5665b201d9819c9357b3824c9ff
-size 212054
diff --git a/android/src/main/jniLibs/arm64-v8a/libktxreader.a b/android/src/main/jniLibs/arm64-v8a/libktxreader.a
deleted file mode 100644
index 117f7b2a..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libktxreader.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f7d7948a522c57f3b6bf0e3f1570c7ba5b90499006c79660d8d2bd157d280fad
-size 51514
diff --git a/android/src/main/jniLibs/arm64-v8a/libmeshoptimizer.a b/android/src/main/jniLibs/arm64-v8a/libmeshoptimizer.a
deleted file mode 100644
index 705c6a43..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libmeshoptimizer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d0089029b919d128e1520250925d23b304566c5a831eb7be4c156d61a11b37b6
-size 143536
diff --git a/android/src/main/jniLibs/arm64-v8a/libmikktspace.a b/android/src/main/jniLibs/arm64-v8a/libmikktspace.a
deleted file mode 100644
index 71b3a9ed..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libmikktspace.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:68f40361280bc8fde1350a00d8e3ce4129b69385bac3d9eda37c0b392f9a167e
-size 20686
diff --git a/android/src/main/jniLibs/arm64-v8a/libpng.a b/android/src/main/jniLibs/arm64-v8a/libpng.a
deleted file mode 100644
index 3e14c006..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libpng.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dde94c36b283091a5a3211e8a336f3f50dd1664db09929e5f2a654adaf0db6b3
-size 355194
diff --git a/android/src/main/jniLibs/arm64-v8a/libshaders.a b/android/src/main/jniLibs/arm64-v8a/libshaders.a
deleted file mode 100644
index 7d66cf62..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eca6cad667424fa5cb4808a009cf8b72b240bb3b4e5bcf14155d3b625eba7e28
-size 127430
diff --git a/android/src/main/jniLibs/arm64-v8a/libsmol-v.a b/android/src/main/jniLibs/arm64-v8a/libsmol-v.a
deleted file mode 100644
index 7afa6228..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libsmol-v.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:08bb916351f38d144803944cc2b9d6659a297dab73d99394d66237b3073177ee
-size 39734
diff --git a/android/src/main/jniLibs/arm64-v8a/libstb.a b/android/src/main/jniLibs/arm64-v8a/libstb.a
deleted file mode 100644
index a9aff10f..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libstb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:99fdf005160d4f1be0b72a24a3abafa7f11ba47950125a664a535637071dafc5
-size 130006
diff --git a/android/src/main/jniLibs/arm64-v8a/libtinyexr.a b/android/src/main/jniLibs/arm64-v8a/libtinyexr.a
deleted file mode 100644
index ee67bb55..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libtinyexr.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f27ccb09daed406bd49c8d47b1738815d8daf0336a3fea6fdb059876e2416493
-size 226376
diff --git a/android/src/main/jniLibs/arm64-v8a/libuberarchive.a b/android/src/main/jniLibs/arm64-v8a/libuberarchive.a
deleted file mode 100644
index 1c31e0bb..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libuberarchive.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cdb8a9ed3a9ba3cdbbeef8065358a92b6654363e7f4e1b57d0522abc063d27e6
-size 1831436
diff --git a/android/src/main/jniLibs/arm64-v8a/libuberzlib.a b/android/src/main/jniLibs/arm64-v8a/libuberzlib.a
deleted file mode 100644
index 9f299159..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libuberzlib.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b3bf56398e2410c37613d7ab6f43bdd65eaec1d70e2a315db08f2c6e836cb0d6
-size 32970
diff --git a/android/src/main/jniLibs/arm64-v8a/libutils.a b/android/src/main/jniLibs/arm64-v8a/libutils.a
deleted file mode 100644
index 1e92c42f..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:0ffbd71464e87f505601a1bf2e6ca8f1ff14a541d878811d9a7c460cf52d3d28
-size 360534
diff --git a/android/src/main/jniLibs/arm64-v8a/libviewer.a b/android/src/main/jniLibs/arm64-v8a/libviewer.a
deleted file mode 100644
index da583588..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libviewer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:89928210c8470639f8db62fbcc74c31b72f79411db3454040d77c749a9047b6b
-size 534600
diff --git a/android/src/main/jniLibs/arm64-v8a/libvkshaders.a b/android/src/main/jniLibs/arm64-v8a/libvkshaders.a
deleted file mode 100644
index 4fb38ade..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libvkshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9040bd03b7b1021be16908c4e398c55e67283f4e471dd4ffbc407828147e380d
-size 2446
diff --git a/android/src/main/jniLibs/arm64-v8a/libz.a b/android/src/main/jniLibs/arm64-v8a/libz.a
deleted file mode 100644
index 8ef669ad..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libz.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:aa6d6caaa63f5b406bce82001fa415d2dfe199c6e443514552655d9f2bed4bc4
-size 124934
diff --git a/android/src/main/jniLibs/arm64-v8a/libzstd.a b/android/src/main/jniLibs/arm64-v8a/libzstd.a
deleted file mode 100644
index a4763204..00000000
--- a/android/src/main/jniLibs/arm64-v8a/libzstd.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9884cc62093cae12ef44610b0bbf5ab9a3940772646377644f11677f5ec2a6a4
-size 693850
diff --git a/android/src/main/jniLibs/armeabi-v7a/libbackend.a b/android/src/main/jniLibs/armeabi-v7a/libbackend.a
deleted file mode 100644
index e696fb08..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libbackend.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b0e90af7a4eeddda57a6d2e908e17d5f811acf05e85f0bb02db9330e84baea14
-size 1921834
diff --git a/android/src/main/jniLibs/armeabi-v7a/libbasis_transcoder.a b/android/src/main/jniLibs/armeabi-v7a/libbasis_transcoder.a
deleted file mode 100644
index ea7118be..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libbasis_transcoder.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ac08b9235e1f64644cd63900be5eb89d41669e644fb9f9682f2a983cabb8af47
-size 334968
diff --git a/android/src/main/jniLibs/armeabi-v7a/libbluevk.a b/android/src/main/jniLibs/armeabi-v7a/libbluevk.a
deleted file mode 100644
index f3bcf4b1..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libbluevk.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e2dc261eb31198f16f611ca7f7c20acfec21e24b486ed5dea10ed64effad5bbf
-size 97648
diff --git a/android/src/main/jniLibs/armeabi-v7a/libcamutils.a b/android/src/main/jniLibs/armeabi-v7a/libcamutils.a
deleted file mode 100644
index c0af2554..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libcamutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6a58756b0425352edf2c02df034177fb0b0bf885bdb70850c5e3ec8091ca1308
-size 49696
diff --git a/android/src/main/jniLibs/armeabi-v7a/libcivetweb.a b/android/src/main/jniLibs/armeabi-v7a/libcivetweb.a
deleted file mode 100644
index e76343aa..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libcivetweb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:41041d6ee1b1ecb9fbeac961170b493b6f923f0cb0fadb450c30022132973f5f
-size 192156
diff --git a/android/src/main/jniLibs/armeabi-v7a/libdracodec.a b/android/src/main/jniLibs/armeabi-v7a/libdracodec.a
deleted file mode 100644
index a04aa5e6..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libdracodec.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f8e9f2005ad07aacb49c5b02c55f2b418879bd409f09619b8d6ccff427971310
-size 2163328
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilabridge.a b/android/src/main/jniLibs/armeabi-v7a/libfilabridge.a
deleted file mode 100644
index 0fe4758b..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilabridge.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:46bc4c3723ce398239975826895515ce0bff3c58b6f2e7875be819bb748b2800
-size 58366
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilaflat.a b/android/src/main/jniLibs/armeabi-v7a/libfilaflat.a
deleted file mode 100644
index 79f4f51c..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilaflat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:19627f494f67d03a428b786095cd9720f12137b3f0ca10518424d012e76d7e0a
-size 44928
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilamat.a b/android/src/main/jniLibs/armeabi-v7a/libfilamat.a
deleted file mode 100644
index 1b83d697..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilamat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:094642603b72a40f73a46596a9a30ff4b0076bb074c746ff2bf324cc5bb3d92a
-size 25254932
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilamat_lite.a b/android/src/main/jniLibs/armeabi-v7a/libfilamat_lite.a
deleted file mode 100644
index a71de223..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilamat_lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f65567b38b146e39092ce9f9eef8ff588dbd97531202aa847916ad98b91e90b7
-size 538770
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilament-iblprefilter.a b/android/src/main/jniLibs/armeabi-v7a/libfilament-iblprefilter.a
deleted file mode 100644
index 1cbda782..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilament-iblprefilter.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c22085b3bd21823ee8b28e3b9a43fe61c71e26c0ffd84447d505d307a98ec4e4
-size 61498
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilament.a b/android/src/main/jniLibs/armeabi-v7a/libfilament.a
deleted file mode 100644
index c14fc511..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilament.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:87e140c8a18facb798d66432d5c6e148e1d85a7f9e3a8b0cbd6b8ca727a470fa
-size 2627016
diff --git a/android/src/main/jniLibs/armeabi-v7a/libfilameshio.a b/android/src/main/jniLibs/armeabi-v7a/libfilameshio.a
deleted file mode 100644
index 44d9c34e..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libfilameshio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bb836a5781758df35cb3101fbdf85450ab125dc6a8f86b9c10f69212111e6740
-size 36352
diff --git a/android/src/main/jniLibs/armeabi-v7a/libgeometry.a b/android/src/main/jniLibs/armeabi-v7a/libgeometry.a
deleted file mode 100644
index 379ec7d1..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libgeometry.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e96465ea3fa2e75a9b138985cf090068febaeab3821c9f63515ae4ec10b511a8
-size 87278
diff --git a/android/src/main/jniLibs/armeabi-v7a/libgltfio_core.a b/android/src/main/jniLibs/armeabi-v7a/libgltfio_core.a
deleted file mode 100644
index 2d97f402..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libgltfio_core.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:99012d0b89fd8c149a5d68576f54de962bad345b5a89f6bd4078994583111303
-size 1022636
diff --git a/android/src/main/jniLibs/armeabi-v7a/libibl-lite.a b/android/src/main/jniLibs/armeabi-v7a/libibl-lite.a
deleted file mode 100644
index 2f5af2d0..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libibl-lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1637be0db30afc4d5291ad78bd2e4e661ff4168ab1d0e67182b5e32039fec901
-size 349604
diff --git a/android/src/main/jniLibs/armeabi-v7a/libibl.a b/android/src/main/jniLibs/armeabi-v7a/libibl.a
deleted file mode 100644
index f4447218..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libibl.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:baff9505cb2c26505b549f613a99a2b790426edfb25aefd76d3fd0dd7b8090ec
-size 431960
diff --git a/android/src/main/jniLibs/armeabi-v7a/libimage.a b/android/src/main/jniLibs/armeabi-v7a/libimage.a
deleted file mode 100644
index 5a47aad3..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libimage.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:111c0e0c798c56f82df3f6d9c54f8034bcd8d501f4032ad20fe5dc3d6fe85dcd
-size 80256
diff --git a/android/src/main/jniLibs/armeabi-v7a/libimageio.a b/android/src/main/jniLibs/armeabi-v7a/libimageio.a
deleted file mode 100644
index cfa51f4c..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libimageio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9c413e680c5df5f8ca0600df1938c0c94e52ba15f733fb86dac6259efe8becd1
-size 161038
diff --git a/android/src/main/jniLibs/armeabi-v7a/libktxreader.a b/android/src/main/jniLibs/armeabi-v7a/libktxreader.a
deleted file mode 100644
index f17d9588..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libktxreader.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:76e98365dcfffa1af20248f6183d04876c7801aeaf3b9baf1921eb8bc9c05092
-size 41644
diff --git a/android/src/main/jniLibs/armeabi-v7a/libmeshoptimizer.a b/android/src/main/jniLibs/armeabi-v7a/libmeshoptimizer.a
deleted file mode 100644
index 1ace7810..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libmeshoptimizer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a9c8bc64684f16214fa741edefaa467c3d3987d45ef7bc5f3a9339b309b3dd7e
-size 111704
diff --git a/android/src/main/jniLibs/armeabi-v7a/libmikktspace.a b/android/src/main/jniLibs/armeabi-v7a/libmikktspace.a
deleted file mode 100644
index 6a1857f8..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libmikktspace.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c531d71de69f8734b1946d8f18b18d7217f5f133bf10f7e120ca40f36b5f028b
-size 15326
diff --git a/android/src/main/jniLibs/armeabi-v7a/libpng.a b/android/src/main/jniLibs/armeabi-v7a/libpng.a
deleted file mode 100644
index ddc733de..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libpng.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fd5bf07a67fbb6096da10f6ffc3a60aaf720662370c6ccbbf3582999d0833c28
-size 243322
diff --git a/android/src/main/jniLibs/armeabi-v7a/libshaders.a b/android/src/main/jniLibs/armeabi-v7a/libshaders.a
deleted file mode 100644
index 4fbb925d..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:97f602f703a739609f874fb07e5f3116520dc4085ccc634c8f00cc1fa6551fd0
-size 126666
diff --git a/android/src/main/jniLibs/armeabi-v7a/libsmol-v.a b/android/src/main/jniLibs/armeabi-v7a/libsmol-v.a
deleted file mode 100644
index 83119cc3..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libsmol-v.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:375bc70b9a5e0a9143373d4ed579227d665e232889bd8963f55b5dab0c8ebb87
-size 27622
diff --git a/android/src/main/jniLibs/armeabi-v7a/libstb.a b/android/src/main/jniLibs/armeabi-v7a/libstb.a
deleted file mode 100644
index 627e4f4f..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libstb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:23f077c0379cbca2bad3b342cc0db2bb0bf1747dc95e884afd709143b2702dbf
-size 88774
diff --git a/android/src/main/jniLibs/armeabi-v7a/libtinyexr.a b/android/src/main/jniLibs/armeabi-v7a/libtinyexr.a
deleted file mode 100644
index 64b0e5fe..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libtinyexr.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:09ee485f222900bc3f67d9daec7711d7ca1c57abcacc7f4df5e5f76f2534ea47
-size 152200
diff --git a/android/src/main/jniLibs/armeabi-v7a/libuberarchive.a b/android/src/main/jniLibs/armeabi-v7a/libuberarchive.a
deleted file mode 100644
index 311e82d9..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libuberarchive.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f2e2eabf92a463967157fc0cf5319e4b59c1e9afe7d98bcd8667b89a5e3dffb9
-size 1831260
diff --git a/android/src/main/jniLibs/armeabi-v7a/libuberzlib.a b/android/src/main/jniLibs/armeabi-v7a/libuberzlib.a
deleted file mode 100644
index e5f78ff2..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libuberzlib.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ac61dec39919f1c19a9601b073020593e6cc9d0cbe27fe3e2104d904bd345196
-size 27354
diff --git a/android/src/main/jniLibs/armeabi-v7a/libutils.a b/android/src/main/jniLibs/armeabi-v7a/libutils.a
deleted file mode 100644
index 28e35f68..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3d314214a0a09fe047080b54cd8684a0322c192a45d1f859914677ec84c8711e
-size 299782
diff --git a/android/src/main/jniLibs/armeabi-v7a/libviewer.a b/android/src/main/jniLibs/armeabi-v7a/libviewer.a
deleted file mode 100644
index fe95a94d..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libviewer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:6865d378b0e97f1f829221c45e4b74091953d3ce66222c2534be6c5f470e13d8
-size 392688
diff --git a/android/src/main/jniLibs/armeabi-v7a/libvkshaders.a b/android/src/main/jniLibs/armeabi-v7a/libvkshaders.a
deleted file mode 100644
index 61b20241..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libvkshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c2bdeeafe7933584916aa8d8e07856b8660025eae13a602a090c884dd009776b
-size 2254
diff --git a/android/src/main/jniLibs/armeabi-v7a/libz.a b/android/src/main/jniLibs/armeabi-v7a/libz.a
deleted file mode 100644
index 165a8565..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libz.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fcf5034e7d1fb324feebe63497b151b0ce2acaaae2cd2a13ad18d24eba8d5fff
-size 91942
diff --git a/android/src/main/jniLibs/armeabi-v7a/libzstd.a b/android/src/main/jniLibs/armeabi-v7a/libzstd.a
deleted file mode 100644
index 201296bd..00000000
--- a/android/src/main/jniLibs/armeabi-v7a/libzstd.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:da1ea9abc45796696b36a30aa451978a646b43d85ebec43c157efff4501a7f87
-size 563610
diff --git a/android/src/main/jniLibs/x86/libbackend.a b/android/src/main/jniLibs/x86/libbackend.a
deleted file mode 100644
index 02ff1b1d..00000000
--- a/android/src/main/jniLibs/x86/libbackend.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d7d7fd061ad93dd9ac21c5b0620c3a7b38b54375d518bfb3f31dcb51f1b3d1f5
-size 1791656
diff --git a/android/src/main/jniLibs/x86/libbasis_transcoder.a b/android/src/main/jniLibs/x86/libbasis_transcoder.a
deleted file mode 100644
index 643993af..00000000
--- a/android/src/main/jniLibs/x86/libbasis_transcoder.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:84273290e6b3ebd92a97d9904005eb031a4e2c40e236b572ede6f20aa8f6b5c2
-size 392140
diff --git a/android/src/main/jniLibs/x86/libbluevk.a b/android/src/main/jniLibs/x86/libbluevk.a
deleted file mode 100644
index 14655b76..00000000
--- a/android/src/main/jniLibs/x86/libbluevk.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ae215d1057b2df182a15cef28c3dbcfadbd7e919cd658f79d48cc679dcc981fb
-size 131020
diff --git a/android/src/main/jniLibs/x86/libcamutils.a b/android/src/main/jniLibs/x86/libcamutils.a
deleted file mode 100644
index c84bd111..00000000
--- a/android/src/main/jniLibs/x86/libcamutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eb4db56341d4c880a3a7304e9788d9279890b30315c3d8cf4ded49b60e202e22
-size 46776
diff --git a/android/src/main/jniLibs/x86/libcivetweb.a b/android/src/main/jniLibs/x86/libcivetweb.a
deleted file mode 100644
index 0351cbe2..00000000
--- a/android/src/main/jniLibs/x86/libcivetweb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1d07d91f9ce5a99c910a5c767710305db09af0940a8b0e8fe44bd07d0098c0f2
-size 239568
diff --git a/android/src/main/jniLibs/x86/libdracodec.a b/android/src/main/jniLibs/x86/libdracodec.a
deleted file mode 100644
index e84018ef..00000000
--- a/android/src/main/jniLibs/x86/libdracodec.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fd82549b6db29c158d096340f72dddadf31cc757d7fd02496eeefbcaaa89c69b
-size 2175384
diff --git a/android/src/main/jniLibs/x86/libfilabridge.a b/android/src/main/jniLibs/x86/libfilabridge.a
deleted file mode 100644
index 9f0e181a..00000000
--- a/android/src/main/jniLibs/x86/libfilabridge.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:54953690caae540cb34c61f18b50161b4f83cc98a5e52c0498024bcd66deb4d5
-size 53346
diff --git a/android/src/main/jniLibs/x86/libfilaflat.a b/android/src/main/jniLibs/x86/libfilaflat.a
deleted file mode 100644
index 34ca497a..00000000
--- a/android/src/main/jniLibs/x86/libfilaflat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:12b12cdf3017cce821c86e612ceeb26e227a32ae42d46822ffc9149e1382c337
-size 41466
diff --git a/android/src/main/jniLibs/x86/libfilamat.a b/android/src/main/jniLibs/x86/libfilamat.a
deleted file mode 100644
index e1ef2257..00000000
--- a/android/src/main/jniLibs/x86/libfilamat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e0f1500570bb005e14cb490331980b2eed7d74b28500c6363947d833c97ae963
-size 23301288
diff --git a/android/src/main/jniLibs/x86/libfilamat_lite.a b/android/src/main/jniLibs/x86/libfilamat_lite.a
deleted file mode 100644
index 5ea6e85c..00000000
--- a/android/src/main/jniLibs/x86/libfilamat_lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f7831363303801ef3e83ee9d31f65c386f310e174a921d921ca17afe216b7115
-size 521960
diff --git a/android/src/main/jniLibs/x86/libfilament-iblprefilter.a b/android/src/main/jniLibs/x86/libfilament-iblprefilter.a
deleted file mode 100644
index c3d876b7..00000000
--- a/android/src/main/jniLibs/x86/libfilament-iblprefilter.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:033fc92a176e25d2ddebab48ffa059e0cdb11a8efcddb65addc2b29eb5cc5753
-size 63910
diff --git a/android/src/main/jniLibs/x86/libfilament.a b/android/src/main/jniLibs/x86/libfilament.a
deleted file mode 100644
index 5ed56f55..00000000
--- a/android/src/main/jniLibs/x86/libfilament.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bdc677eeb69936cf45cd5379680d49506c16ca8f0a9207790c5a97697b99a1f7
-size 2471750
diff --git a/android/src/main/jniLibs/x86/libfilameshio.a b/android/src/main/jniLibs/x86/libfilameshio.a
deleted file mode 100644
index 617d90d0..00000000
--- a/android/src/main/jniLibs/x86/libfilameshio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:37da0f2518b4c327552993b7ed775218d49018a4dd1000ad6fa7f4edc3a14b4d
-size 33196
diff --git a/android/src/main/jniLibs/x86/libgeometry.a b/android/src/main/jniLibs/x86/libgeometry.a
deleted file mode 100644
index f189df28..00000000
--- a/android/src/main/jniLibs/x86/libgeometry.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:61afbde1d11f2651ebccc78f9e04954c0b60c4c987de4197ccaaadb47b6195b8
-size 91242
diff --git a/android/src/main/jniLibs/x86/libgltfio_core.a b/android/src/main/jniLibs/x86/libgltfio_core.a
deleted file mode 100644
index 763c7f1e..00000000
--- a/android/src/main/jniLibs/x86/libgltfio_core.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:69d288c287cb4e31e4c163ac5ad67b78e1e76f8bb87891077c4c8926daa92186
-size 998496
diff --git a/android/src/main/jniLibs/x86/libibl-lite.a b/android/src/main/jniLibs/x86/libibl-lite.a
deleted file mode 100644
index e62a81d6..00000000
--- a/android/src/main/jniLibs/x86/libibl-lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a66050451e3ee22107bf106ffb08984fef456bd86d97a323839fbfd80bc209ee
-size 327150
diff --git a/android/src/main/jniLibs/x86/libibl.a b/android/src/main/jniLibs/x86/libibl.a
deleted file mode 100644
index eeaa863b..00000000
--- a/android/src/main/jniLibs/x86/libibl.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:40cd56ed861cbffda3135d53db841ba7448cf223881ff9a0a4aac13bbbed34ce
-size 398100
diff --git a/android/src/main/jniLibs/x86/libimage.a b/android/src/main/jniLibs/x86/libimage.a
deleted file mode 100644
index 2db166ab..00000000
--- a/android/src/main/jniLibs/x86/libimage.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d6f0f0e5ad5713bb7f4af574227d596006c0669e24ae86de1f205fa103510ab8
-size 90468
diff --git a/android/src/main/jniLibs/x86/libimageio.a b/android/src/main/jniLibs/x86/libimageio.a
deleted file mode 100644
index cc15d726..00000000
--- a/android/src/main/jniLibs/x86/libimageio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:fad4729150c16cbc07a1ef3f442f17c539723329a74e52e50b8001ded18061e2
-size 167674
diff --git a/android/src/main/jniLibs/x86/libktxreader.a b/android/src/main/jniLibs/x86/libktxreader.a
deleted file mode 100644
index f53785da..00000000
--- a/android/src/main/jniLibs/x86/libktxreader.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a9df29f881a854a55dc9343c670068bf9b7ca25166cd37f76e1a38b4a248e743
-size 54332
diff --git a/android/src/main/jniLibs/x86/libmeshoptimizer.a b/android/src/main/jniLibs/x86/libmeshoptimizer.a
deleted file mode 100644
index e98e7116..00000000
--- a/android/src/main/jniLibs/x86/libmeshoptimizer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:ca58790fd0f51daa86cc7b03f4790842f2e6c50695280c5d293a80e4af0c03e2
-size 142436
diff --git a/android/src/main/jniLibs/x86/libmikktspace.a b/android/src/main/jniLibs/x86/libmikktspace.a
deleted file mode 100644
index 54273374..00000000
--- a/android/src/main/jniLibs/x86/libmikktspace.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5e373508c804a2e4c3309f0a49d0e46b0aa9116becb34e8a06c87ee226f366b4
-size 24790
diff --git a/android/src/main/jniLibs/x86/libpng.a b/android/src/main/jniLibs/x86/libpng.a
deleted file mode 100644
index da729667..00000000
--- a/android/src/main/jniLibs/x86/libpng.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:68680810cf49495414ca6c5098b726696038bccb892f9de56c2899f97ae483c6
-size 308346
diff --git a/android/src/main/jniLibs/x86/libshaders.a b/android/src/main/jniLibs/x86/libshaders.a
deleted file mode 100644
index d6079bba..00000000
--- a/android/src/main/jniLibs/x86/libshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:e29d337f722c63f6b86200390fd7d55fe0e468a2efe22f5dd49007e52246b0db
-size 126578
diff --git a/android/src/main/jniLibs/x86/libsmol-v.a b/android/src/main/jniLibs/x86/libsmol-v.a
deleted file mode 100644
index 2b36439d..00000000
--- a/android/src/main/jniLibs/x86/libsmol-v.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c282f70f89e72652b42c4885e284bead0b4ef272fa52de3cd29e57a124117f2f
-size 33002
diff --git a/android/src/main/jniLibs/x86/libstb.a b/android/src/main/jniLibs/x86/libstb.a
deleted file mode 100644
index 47d91d74..00000000
--- a/android/src/main/jniLibs/x86/libstb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8cb8c05b15b6cd0d2310f875906b676e00af13c97be13f978c11ec66fb21855c
-size 117546
diff --git a/android/src/main/jniLibs/x86/libtinyexr.a b/android/src/main/jniLibs/x86/libtinyexr.a
deleted file mode 100644
index c6e736b1..00000000
--- a/android/src/main/jniLibs/x86/libtinyexr.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:a9a1b003919d978bac2301ed573b511f80101da311cd33486290cd4ba0caf953
-size 175696
diff --git a/android/src/main/jniLibs/x86/libuberarchive.a b/android/src/main/jniLibs/x86/libuberarchive.a
deleted file mode 100644
index 52adf78c..00000000
--- a/android/src/main/jniLibs/x86/libuberarchive.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:099166e038461fea456a389dd3d2ca81d1996969f376029525770522c9f31f85
-size 1831036
diff --git a/android/src/main/jniLibs/x86/libuberzlib.a b/android/src/main/jniLibs/x86/libuberzlib.a
deleted file mode 100644
index c50be51c..00000000
--- a/android/src/main/jniLibs/x86/libuberzlib.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:986915629470491d640ebe896300b37277280c8dbe82fddd34771e55204ef2b3
-size 27818
diff --git a/android/src/main/jniLibs/x86/libutils.a b/android/src/main/jniLibs/x86/libutils.a
deleted file mode 100644
index 7b68c8c5..00000000
--- a/android/src/main/jniLibs/x86/libutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8f26e15d26484f12e0813eae201785d490129c88d13bf291efe0b776565035f9
-size 270920
diff --git a/android/src/main/jniLibs/x86/libviewer.a b/android/src/main/jniLibs/x86/libviewer.a
deleted file mode 100644
index 010f64d5..00000000
--- a/android/src/main/jniLibs/x86/libviewer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:81b85dbda19b9960b3859a8841f495176e7052035b724a5c3e2de5437cfb184f
-size 421712
diff --git a/android/src/main/jniLibs/x86/libvkshaders.a b/android/src/main/jniLibs/x86/libvkshaders.a
deleted file mode 100644
index 73990e4b..00000000
--- a/android/src/main/jniLibs/x86/libvkshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5cbd41298d89ec7664ca6f98387ad87de447b30981d7ed4016af5d07e3aa706e
-size 2030
diff --git a/android/src/main/jniLibs/x86/libz.a b/android/src/main/jniLibs/x86/libz.a
deleted file mode 100644
index 43b7c158..00000000
--- a/android/src/main/jniLibs/x86/libz.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f2e41ef7a40d92f60921fc278c19dede08b4c947e3dbc1a68db2665a45afb768
-size 120202
diff --git a/android/src/main/jniLibs/x86/libzstd.a b/android/src/main/jniLibs/x86/libzstd.a
deleted file mode 100644
index ce9ad6e4..00000000
--- a/android/src/main/jniLibs/x86/libzstd.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9d5541b7365aaec6cedbf4416ab20e3878f2c3a7daf505a4795cb7ef14256e22
-size 836070
diff --git a/android/src/main/jniLibs/x86_64/libbackend.a b/android/src/main/jniLibs/x86_64/libbackend.a
deleted file mode 100644
index cab78ebe..00000000
--- a/android/src/main/jniLibs/x86_64/libbackend.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5954b6cfcbb4417d5710e6498a6adb01bd8ec5b9bda9c02b0360cb49c913f9f8
-size 2130866
diff --git a/android/src/main/jniLibs/x86_64/libbasis_transcoder.a b/android/src/main/jniLibs/x86_64/libbasis_transcoder.a
deleted file mode 100644
index fcdc6241..00000000
--- a/android/src/main/jniLibs/x86_64/libbasis_transcoder.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1b11944faf9a17d4f00db8f9f0c2385ee7cd99a6a8b756237c6aae6cd8ed3895
-size 412466
diff --git a/android/src/main/jniLibs/x86_64/libbluevk.a b/android/src/main/jniLibs/x86_64/libbluevk.a
deleted file mode 100644
index 275cf33e..00000000
--- a/android/src/main/jniLibs/x86_64/libbluevk.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f8bfa8311d1b5d55dbcba4904885f984a5b3fdbf4839824d20191f12259c2b9a
-size 175072
diff --git a/android/src/main/jniLibs/x86_64/libcamutils.a b/android/src/main/jniLibs/x86_64/libcamutils.a
deleted file mode 100644
index 1c561caf..00000000
--- a/android/src/main/jniLibs/x86_64/libcamutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:99abf7173591a8ec4d3b840f2356b911d6758e4974891e71461bc256c6460700
-size 55508
diff --git a/android/src/main/jniLibs/x86_64/libcivetweb.a b/android/src/main/jniLibs/x86_64/libcivetweb.a
deleted file mode 100644
index 01456358..00000000
--- a/android/src/main/jniLibs/x86_64/libcivetweb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:27c9ddda9df2b118f7d011f09d5fc939e790a27608a98d2da2973a50d098ddec
-size 296228
diff --git a/android/src/main/jniLibs/x86_64/libdracodec.a b/android/src/main/jniLibs/x86_64/libdracodec.a
deleted file mode 100644
index 2c7f4ecd..00000000
--- a/android/src/main/jniLibs/x86_64/libdracodec.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5b7a9d790442cd77a95370a022eff351b204644e7bc45bf9731b913eb9e179f9
-size 2577646
diff --git a/android/src/main/jniLibs/x86_64/libfilabridge.a b/android/src/main/jniLibs/x86_64/libfilabridge.a
deleted file mode 100644
index edfd614a..00000000
--- a/android/src/main/jniLibs/x86_64/libfilabridge.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dee5375dffeb6bf459461c4b8de8069a8a3fc66584037394f40d3b47fb79d887
-size 67288
diff --git a/android/src/main/jniLibs/x86_64/libfilaflat.a b/android/src/main/jniLibs/x86_64/libfilaflat.a
deleted file mode 100644
index eabfe188..00000000
--- a/android/src/main/jniLibs/x86_64/libfilaflat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:4c587aef1513eb974abafcf58866c4b34617931b4ba5f5bc310f48646d26c4f2
-size 47718
diff --git a/android/src/main/jniLibs/x86_64/libfilamat.a b/android/src/main/jniLibs/x86_64/libfilamat.a
deleted file mode 100644
index 7226a15e..00000000
--- a/android/src/main/jniLibs/x86_64/libfilamat.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:26cf0b30d49aa36b559a0b1512707f3b53a0b685834afc7d65dd395cc4dc2481
-size 29487854
diff --git a/android/src/main/jniLibs/x86_64/libfilamat_lite.a b/android/src/main/jniLibs/x86_64/libfilamat_lite.a
deleted file mode 100644
index ff4cd562..00000000
--- a/android/src/main/jniLibs/x86_64/libfilamat_lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:295259598574e8b24affb68d2ba409ddfbc5110219c66f80258ad4c44d9b4b60
-size 650064
diff --git a/android/src/main/jniLibs/x86_64/libfilament-iblprefilter.a b/android/src/main/jniLibs/x86_64/libfilament-iblprefilter.a
deleted file mode 100644
index 9fd4a122..00000000
--- a/android/src/main/jniLibs/x86_64/libfilament-iblprefilter.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3689e9ab9f215336805761a5f6290b57e2b8329eace8e7208fff582236ac189f
-size 73862
diff --git a/android/src/main/jniLibs/x86_64/libfilament.a b/android/src/main/jniLibs/x86_64/libfilament.a
deleted file mode 100644
index 7c083df5..00000000
--- a/android/src/main/jniLibs/x86_64/libfilament.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:27524a5352c1d7c8c6610ad5235fe6a82b174069735527bb57de246cee169c47
-size 2800470
diff --git a/android/src/main/jniLibs/x86_64/libfilameshio.a b/android/src/main/jniLibs/x86_64/libfilameshio.a
deleted file mode 100644
index 6d85b8a8..00000000
--- a/android/src/main/jniLibs/x86_64/libfilameshio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:2d435c6614a5051daf75fd7a8b885ec710439252a78fbcd8fedf935730610973
-size 40996
diff --git a/android/src/main/jniLibs/x86_64/libgeometry.a b/android/src/main/jniLibs/x86_64/libgeometry.a
deleted file mode 100644
index 2dd21148..00000000
--- a/android/src/main/jniLibs/x86_64/libgeometry.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d1c80a2c594936e6a1f55b485b3bd3e29f828a99785b53f631fa75ddc88eae51
-size 110424
diff --git a/android/src/main/jniLibs/x86_64/libgltfio_core.a b/android/src/main/jniLibs/x86_64/libgltfio_core.a
deleted file mode 100644
index 29c53183..00000000
--- a/android/src/main/jniLibs/x86_64/libgltfio_core.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:738d73b4185c8c6363b9fb9caeebc8f8c29d2c3611356cbe148d930e47dca309
-size 1199164
diff --git a/android/src/main/jniLibs/x86_64/libibl-lite.a b/android/src/main/jniLibs/x86_64/libibl-lite.a
deleted file mode 100644
index 88326778..00000000
--- a/android/src/main/jniLibs/x86_64/libibl-lite.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3d7b366656fa1f9208a173ed14f0a23656f3e080bb07cc8fb8ef12abfdb0a3ef
-size 385650
diff --git a/android/src/main/jniLibs/x86_64/libibl.a b/android/src/main/jniLibs/x86_64/libibl.a
deleted file mode 100644
index b6b80e86..00000000
--- a/android/src/main/jniLibs/x86_64/libibl.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9cd2a89622aa4425c109442f7a5adeed21498b4779e0e33433081c60179011cf
-size 471620
diff --git a/android/src/main/jniLibs/x86_64/libimage.a b/android/src/main/jniLibs/x86_64/libimage.a
deleted file mode 100644
index c2caff82..00000000
--- a/android/src/main/jniLibs/x86_64/libimage.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:48ecae870cc7b08019765640658c148d165b148f7fb351ddb2d74a7002c11da3
-size 109860
diff --git a/android/src/main/jniLibs/x86_64/libimageio.a b/android/src/main/jniLibs/x86_64/libimageio.a
deleted file mode 100644
index 64ec15d3..00000000
--- a/android/src/main/jniLibs/x86_64/libimageio.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d61c0a18fe03e0d62c48a6d95b346a84191dedd06f0d755c71e4967dace31ef2
-size 209914
diff --git a/android/src/main/jniLibs/x86_64/libktxreader.a b/android/src/main/jniLibs/x86_64/libktxreader.a
deleted file mode 100644
index c4607b92..00000000
--- a/android/src/main/jniLibs/x86_64/libktxreader.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:eaabc6b1d44100f4ec7ac90f86ff7913cb21a55e96be24ebba57b81f45d626be
-size 82906
diff --git a/android/src/main/jniLibs/x86_64/libmeshoptimizer.a b/android/src/main/jniLibs/x86_64/libmeshoptimizer.a
deleted file mode 100644
index f91e72d4..00000000
--- a/android/src/main/jniLibs/x86_64/libmeshoptimizer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:10e96ca27d8bb7706886c57c0790173dd750360b2e7c915181c3c687706b249a
-size 169648
diff --git a/android/src/main/jniLibs/x86_64/libmikktspace.a b/android/src/main/jniLibs/x86_64/libmikktspace.a
deleted file mode 100644
index caff1b97..00000000
--- a/android/src/main/jniLibs/x86_64/libmikktspace.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:80e35196ba4e8c328858b67b250d7b73cb003df260b64fe4780fad283c4ac29a
-size 26174
diff --git a/android/src/main/jniLibs/x86_64/libpng.a b/android/src/main/jniLibs/x86_64/libpng.a
deleted file mode 100644
index 96d50b1d..00000000
--- a/android/src/main/jniLibs/x86_64/libpng.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:b62be7d7eedb390e4f26940c9a65ce0fc8515c9cdab029b50b3bcbada2469f8a
-size 383722
diff --git a/android/src/main/jniLibs/x86_64/libshaders.a b/android/src/main/jniLibs/x86_64/libshaders.a
deleted file mode 100644
index 7a4f08f8..00000000
--- a/android/src/main/jniLibs/x86_64/libshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d08729aea048e5801b74810d5420b76283721442ad0e12374faf3116658d7210
-size 127398
diff --git a/android/src/main/jniLibs/x86_64/libsmol-v.a b/android/src/main/jniLibs/x86_64/libsmol-v.a
deleted file mode 100644
index 1bd3c3e9..00000000
--- a/android/src/main/jniLibs/x86_64/libsmol-v.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3633648c3bd68d7cf63e4283a1e23475d2dbe97ed2f300825691ac33d1fa8fe5
-size 44750
diff --git a/android/src/main/jniLibs/x86_64/libstb.a b/android/src/main/jniLibs/x86_64/libstb.a
deleted file mode 100644
index bcbb5884..00000000
--- a/android/src/main/jniLibs/x86_64/libstb.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3f7876773cd4e27f432ea1811beb8fc4588c2944957a31a9f892bb5d65aad81b
-size 136886
diff --git a/android/src/main/jniLibs/x86_64/libtinyexr.a b/android/src/main/jniLibs/x86_64/libtinyexr.a
deleted file mode 100644
index faa29388..00000000
--- a/android/src/main/jniLibs/x86_64/libtinyexr.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:8dca39d876437fefd651bbc5aaecf4f11e95c9ad8b2d7f3b4d1116976673ecac
-size 220104
diff --git a/android/src/main/jniLibs/x86_64/libuberarchive.a b/android/src/main/jniLibs/x86_64/libuberarchive.a
deleted file mode 100644
index dd71c687..00000000
--- a/android/src/main/jniLibs/x86_64/libuberarchive.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:baa93139416274e711557da2e42da4215b2256e3c78f25f1c071a5d107bec4e4
-size 1831372
diff --git a/android/src/main/jniLibs/x86_64/libuberzlib.a b/android/src/main/jniLibs/x86_64/libuberzlib.a
deleted file mode 100644
index 5f392595..00000000
--- a/android/src/main/jniLibs/x86_64/libuberzlib.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7a773ef5ce4e21b009bf95073514be4808981c66518c25368afb97469fe0502a
-size 31602
diff --git a/android/src/main/jniLibs/x86_64/libutils.a b/android/src/main/jniLibs/x86_64/libutils.a
deleted file mode 100644
index e36ad016..00000000
--- a/android/src/main/jniLibs/x86_64/libutils.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:67f0ac604642358050721abf6faeb06c09bd1a40585b0b6b9149cfc3d3769829
-size 339742
diff --git a/android/src/main/jniLibs/x86_64/libviewer.a b/android/src/main/jniLibs/x86_64/libviewer.a
deleted file mode 100644
index b7371183..00000000
--- a/android/src/main/jniLibs/x86_64/libviewer.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:423ea9531e1f44d7602901e801f998e4d7565dfb7d36183f77eb9525bfb3c65c
-size 558048
diff --git a/android/src/main/jniLibs/x86_64/libvkshaders.a b/android/src/main/jniLibs/x86_64/libvkshaders.a
deleted file mode 100644
index b015f736..00000000
--- a/android/src/main/jniLibs/x86_64/libvkshaders.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cc1ec619b430b3529c14072cb9fa8006d9760675fa035da77e1db11d44b19e67
-size 2390
diff --git a/android/src/main/jniLibs/x86_64/libz.a b/android/src/main/jniLibs/x86_64/libz.a
deleted file mode 100644
index 45f95644..00000000
--- a/android/src/main/jniLibs/x86_64/libz.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:231887c29b4cc99afb7ace9f54caab7465483a3f90cb67ac006400cba217e497
-size 135466
diff --git a/android/src/main/jniLibs/x86_64/libzstd.a b/android/src/main/jniLibs/x86_64/libzstd.a
deleted file mode 100644
index 4b2c3a81..00000000
--- a/android/src/main/jniLibs/x86_64/libzstd.a
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bc24c1145057b77348afe327c863266f7983c21afc68503fdbef83379733e08c
-size 837570
diff --git a/dart_filament/.gitattributes b/dart_filament/.gitattributes
new file mode 100644
index 00000000..01df7502
--- /dev/null
+++ b/dart_filament/.gitattributes
@@ -0,0 +1,56 @@
+native/web/lib/release/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libz.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libbenchmark_main.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libfilagui.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libgtest.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libibl.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libpng.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libspirv-cross-core.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libshaders.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libimgui.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libbluevk.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libimageio.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libgtest.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libvkshaders.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libtinyexr.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libspirv-cross-glsl.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libbenchmark_main.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libfilagui.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libibl.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libSPIRV-Tools.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libfilamat.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libfilamat_combined.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libglslang.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libmathio.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libbenchmark.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libviewer.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libgetopt.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libSPIRV.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libfilament-iblprefilter.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libgetopt.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libviewer.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libfilameshio.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libsmol-v.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libimgui.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libmathio.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libbenchmark.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libshaders.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/debug/libcamutils.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libOGLCompiler.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libSPIRV-Tools-opt.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libassimp.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libbluegl.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libgeometry_combined.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libspirv-cross-msl.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libOSDependent.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libcivetweb.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libmatlang.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/release/libmikktspace.a filter=lfs diff=lfs merge=lfs -text
+native/web/lib/**/*.a filter=lfs diff=lfs merge=lfs -text
diff --git a/dart_filament/.gitignore b/dart_filament/.gitignore
new file mode 100644
index 00000000..7c839775
--- /dev/null
+++ b/dart_filament/.gitignore
@@ -0,0 +1,2 @@
+native/web/build/
+pubspec.lock
diff --git a/ARCHITECTURE.md b/dart_filament/ARCHITECTURE.md
similarity index 100%
rename from ARCHITECTURE.md
rename to dart_filament/ARCHITECTURE.md
diff --git a/CHANGELOG.md b/dart_filament/CHANGELOG.md
similarity index 84%
rename from CHANGELOG.md
rename to dart_filament/CHANGELOG.md
index baf52fec..4896fcac 100644
--- a/CHANGELOG.md
+++ b/dart_filament/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.8.0
+* separated into Dart- and Flutter- specific packages
+* migrated Flutter package into federated plugin structure
+* added web support
+* addLight now accepts a LightType enum
+* added support for setting falloff, spot light radius, sun radius & halo
+
## 0.7.0
* `removeAsset` & `clearAssets` have been renamed `removeEntity` and `clearEntities`
* added support for parenting one entity to another
diff --git a/dart_filament/README.md b/dart_filament/README.md
new file mode 100644
index 00000000..3b29ae9c
--- /dev/null
+++ b/dart_filament/README.md
@@ -0,0 +1,449 @@
+# Flutter Filament
+
+Cross-platform, 3D PBR rendering and animation for [Flutter](https://github.com/google/filament).
+
+Wraps the [the Filament rendering library](https://github.com/google/filament).
+
+Powers the [Polyvox](https://polyvox.app) and [odd-io](https://github.com/odd-io/) engines.
+
+This is still in beta: bugs/missing features are to be expected.
+
+https://github.com/nmfisher/flutter_filament/assets/7238578/abaed1c8-c97b-4999-97b2-39e85e0fa7dd
+
+
+|Feature|Supported|
+|---|---|
+|Platforms|✅ iOS (arm64)
✅ MacOS (arm64)
✅ Android (arm64)
✅ Windows (x64) (>= 10)
⚠️ Linux (x64 - broken)
⚠️ Web (planned)|
+|Formats|✅ glb
⚠️ glTF (partial - see Known Issues)|
+|Texture support|✅ PNG
✅ JPEG
✅ KTX
⚠️ KTX2 (planned)|
+|Camera movement|✅ Desktop (mouse)
✅ Mobile (swipe/pinch)|
+|Animation|✅ Embedded glTF skinning animations
✅ Embedded glTF morph animations
✅ Runtime/dynamic morph animations
⚠️ Runtime/dynamic skinning animations
+|Entity manipulation|✅ Viewport selection
⚠️ Entity/transform parenting (planned)
⚠️ Transform manipulation (mouse/gesture to rotate/translate/scale object) (partial)
⚠️ Runtime material changes (planned)|
+
+Special thanks to [odd-io](https://github.com/odd-io/) for sponsoring work on supporting Windows, raycasting, testing and documentation.
+
+PRs are welcome but please create a placeholder PR to discuss before writing any code. This will help with feature planning, avoid clashes with existing work and keep the project structure consistent.
+
+## Getting Started
+
+This package requires Flutter >= `3.16.0-0.2.pre`, so you will need to first switch to the `beta` channel:
+
+```
+flutter channel beta
+flutter upgrade
+```
+There are specific issues with earlier versions on Windows/MacOS (mobile should actually be fine, so if you want to experiment on your own you're free to remove the minimum version from `pubspec.yaml`).
+
+Next, clone this repository and pull the latest binaries from Git LFS:
+
+```
+cd $HOME
+git clone && cd flutter_filament
+git lfs pull
+```
+
+(this step won't be needed after the plugin is published to pub.dev).
+
+> You *do not need to build Filament yourself*. The repository is bundled with all necessary headers/static libraries (`windows/lib`, `ios/lib`, `macos/lib` and `linux/lib`) and the Flutter plugin has been configured to link at build time.
+
+Run the example project to check:
+
+```
+cd example && flutter run -d
+```
+
+To use the plugin in your own project, add the plugin to your pubspec.yaml:
+
+```
+name: your_project
+description: Your project
+...
+dependencies:
+ flutter:
+ sdk: flutter
+ flutter_filament:
+ path:
+```
+
+## Basic Usage
+
+See the `example` project for a complete sample that incorporates many of the below steps, and more.
+
+### Creating the viewport widget and controller
+
+Create an instance of `FilamentControllerFFI` somewhere in your app where it will not be garbage collected until you no longer need a rendering canvas:
+
+```
+class MyApp extends StatelessWidget {
+
+ final _filamentController = FilamentControllerFFI();
+ ...
+}
+
+```
+
+This is a relatively lightweight object, however its constructor will load/bind symbols from the native library. This may momentarily block the UI, so you may wish to structure your app so that this is hidden behind a static widget until it is available.
+
+Next, create an instance of `FilamentWidget` in the widget hierarchy where you want the rendering canvas to appear. This can be sized as large or as small as you want. On most platforms, Flutter widgets can be positioned above or below the `FilamentWidget`.
+
+```
+class MyApp extends StatelessWidget {
+
+ final _filamentController = FilamentControllerFFI();
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ color: Colors.white,
+ home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[
+ Container(color:Colors.green, height:100, width:100),
+ Positioned.fill(top:100, left:100child:FilamentWidget(controller:_filamentController)),
+ Positioned(right:0, bottom:0, child:Container(color:Colors.purple, height:100, width:100))
+ ])));
+ }
+}
+```
+
+When a `FilamentWidget` is added to the widget hierarchy:
+1) by default a Container will be rendered with solid red. If you want to change this, pass a widget as the `initial` paramer to the `FilamentWidget` constructor.
+2) on the second frame, `FilamentWidget` will pass its dimensions/pixel ratio to the `FilamentController`
+3) You can then call `createViewer` to create:
+ * the rendering surface (on most platforms, a backing texture that will be registered with Flutter for use in a `Texture` widget)
+ * a rendering thread
+ * a `FilamentViewer` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController`
+4) after an indeterminate number of frames, `FilamentController` will notify `FilamentWidget` when a rendering surface is available the viewport
+5) `FilamentWidget` will replace the default `initial` Widget with the viewport (which will initially be solid black or white, depending on your platform).
+
+IMPORTANT: there *will* be a delay between adding a `FilamentWidget`, calling `createViewer` and the actual rendering viewport becoming available. This is why we fill `FilamentWidget` with red - to make it abundantly clear that you need to handle this asynchronous delay appropriately. Once `createViewer` has completed, the viewport is available for rendering.
+
+> Currently, the `initial` widget will also be displayed whenever the viewport is resized (including changing orientation on mobile and drag-to-resize on desktop). You probably want to change this from the default red.
+
+Congratulations! You now have a scene. It's completely empty, so you probably want to add something visible.
+
+### Load a background
+
+You probably want to set a background for your scene. You can load a skybox:
+```
+await _filamentController.loadSkybox("assets/default_env/default_env_skybox.ktx)
+```
+
+or a static background image:
+
+```
+await _filamentController.setBackgroundImage("assets/background.ktx)
+```
+
+or a solid background color:
+
+```
+await _filamentController.setBackgroundColor(0.0, 1.0, 0.0, 1.0); // solid green
+```
+
+At this point, you might not see any change in the viewport. This is because the FilamentController will only actually render into the viewport once `render` has been called.
+
+By default, the FilamentController will only render into the viewport by manually calling `render()` on the FilamentController. This is to avoid needlessly running a render loop when there is nothing to display.
+
+```
+await _filamentController.render()
+```
+
+You should now see your background displayed in the scene. To automatically render at 60fps, call `setRendering`:
+```
+await _filamentController.setRendering(true);
+```
+
+### Load an asset
+
+To add a glTF asset to the scene, call `loadGlb()` on `FilamentController` with the Flutter asset path to your .glb file.
+
+For example, if your `pubspec.yaml` looks like this:
+```
+flutter:
+ assets:
+ - assets/models/bob.glb
+```
+
+Then you would call the following
+```
+var entity = await _filamentController.loadGlb("assets/models/bob.glb");
+```
+You can also pass a URI to indicate that the glTF file should be loaded from the filesystem:
+```
+var entity = await _filamentController.loadGlb("file:///tmp/bob.glb");
+```
+
+The return type `FilamentEntity` is simply an integer handle that be used to manipulate the entity in the scene. For example, to remove the asset:
+```
+await _filamentController.removeEntity(entity);
+entity = null;
+```
+> Removing an entity from the scene will invalidate the corresponding `FilamentEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `FilamentEntity` does not invalidate/change any other `FilamentEntity` handles; you can continue to safely manipulate these via the `FilamentController`.
+
+### Lighting
+
+You should now see your object in the viewport, but since we haven't added a light, this will be solid black.
+
+Add an image-based light from a KTX file:
+
+```
+await _filamentController.loadIbl("assets/default_env/default_env_ibl.ktx");
+```
+
+You can also add dynamic lights:
+
+```
+var sun = await _filamentController.addLight(
+```
+
+### Manipulating entity transforms
+
+To set the world space position of the asset:
+```
+_filamentController.setPositon(entity, 1.0, 1.0, 1.0);
+```
+
+On desktop, you can also click any renderable object in the viewport to retrieve its associated FilamentEntity (see below).
+
+### Camera movement
+
+To enable mouse/swipe navigation through the scene, wrap the `FilamentWidget` inside a `FilamentGestureDetector`:
+
+```
+class MyApp extends StatelessWidget {
+
+ final _filamentController = FilamentControllerFFI();
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ color: Colors.white,
+ home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[
+ Positioned.fill(child:FilamentGestureDetector(
+ controller: _filamentController,
+ child:FilamentWidget(
+ controller:_filamentController
+ ))),
+ Positioned(right:0, bottom:0, child:Container(color:Colors.purple, height:100, width:100))
+ ])));
+ }
+}
+```
+
+On desktop:
+1) hold the middle mouse button and move the mouse to rotate the camera
+2) hold the left mouse button and move the mouse to pan the camera
+3) scroll up/down with the scrollwheel to zoom in/out.
+
+On mobile:
+1) swipe with your finger to pan the camera
+2) double tap the viewport, then swipe with your finger to rotate the camera (double-tap again to return to pan)
+3) pinch with two fingers in/out to zoom in/out.
+
+### Changing the active camera
+
+Every scene has a default camera. Whenever you rotate/pan/zoom the viewport, you are moving the default camera.
+
+If you have added an entity to the scene that contains one or more camera nodes, you can change the active scene camera to one of those camera nodes.
+
+```
+var asset = await _filamentController.loadGlb("assets/some_asset_with_camera.glb");
+await _filamentController.setCamera(asset, "Camera.002"); // pass the node name to load a specific camera under that entity node
+await _filamentController.setCamera(asset, null); // pass null to load the first camera found under that entity
+```
+
+### Picking entities
+
+On desktop, left-clicking an object in the viewport will retrieve the FilamentEntity for the top-most renderable instance at that cursor position (if any).
+
+Note this is an asynchronous operation, so you will need to subscribe to the [pickResult] stream on your [FilamentController] to do something with the result.
+
+```
+class MyApp extends StatefulWidget {
+ ...
+}
+
+
+class _MyAppState extends State {
+
+ final _filamentController = FilamentControllerFFI();
+
+ @override
+ void initState() {
+ _filamentController.pickResult.listen((FilamentEntity filamentEntity) async {
+ var entityName = _filamentController.getNameForEntity(filamentEntity);
+ await showDialog(builder:(ctx) {
+ return Container(child:Text("You clicked $entityName"));
+ });
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ color: Colors.white,
+ home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[
+ Positioned.fill(child:FilamentGestureDetector(
+ controller: _filamentController,
+ child:FilamentWidget(
+ controller:_filamentController
+ ))),
+ ])));
+ }
+}
+```
+
+## Advanced Usage
+
+If you want to work with custom materials, you will need some (basic knowledge of the underlying Filament library)[https://google.github.io/filament/Materials.html#compilingmaterials].
+
+Things to keep in mind:
+- You must compile materials with the correct version of Filament (see the table above). Keep in mind that versions may not be identical across platforms so you may need multiple uberz files for multiple platforms.
+
+e.g. the lit_opaque.uberz file has been created from a Filament build:
+
+```
+cd out/cmake-android-release-aarch64/libs/gltfio
+uberz -TSHADINGMODEL=lit -TBLENDING=opaque -o lit_opaque_43.uberz lit_opaque
+```
+
+(note that the number in the filename corresponds to the Material version, not the Filament version. Not every Filament version requires a new Material version).
+
+## Footguns
+
+### Stripping in release mode
+
+If you build your app in release mode, you will need to ensure that "Dead Strip" is set to false.
+
+This is because we only invoke the library at runtime via FFI, so at link time these symbols are otherwise treated as redundant.
+
+### Animations when backgrounded
+
+Don't call playAnimation when the app is in the background (i.e inactive/hidden). This will queue, but not start, an animation, and eventually this will overflow the command buffer when the app is foregrounded/resumed.
+
+If you have some kind of looping animation in your app code, make sure it pauses while the app is backgrounded.
+
+
+
+## Versioning
+
+||Android|iOS|MacOS|Windows|Linux|WebGL|
+|---|---|---|---|---|---||
+|Filament|v1.43.1 (arm64/armeabi-v7a/x86/x86_64)|v1.43.1* (arm64)|v1.43.1 (arm64)|v1.32.4 (x86_64)|TODO**|TODO***|
+|Flutter||3.15.0-15.2.pre|3.15.0-15.2.pre|3.15.0-15.2.pre
+
+* iOS release build has a skybox bug so the debug versions are currently shipped on iOS
+** (Waiting for https://github.com/google/filament/issues/7078 to be resolved before upgrading, not sure exactly when the bug was introduced but it was somewhere between v1.32.4 and v1.40.0)
+*** Texture widget not currently supported on web in Flutter.
+
+
+## Testing
+
+We automate testing by running the example project on actual iOS/Android/MacOS/Windows devices and executing various operations.
+
+Eventually we want to compare screenshots after each operation to a set of goldens for every platform.
+
+Currently this is only possible on iOS (see https://github.com/flutter/flutter/issues/123063 and https://github.com/flutter/flutter/issues/127306).
+
+To re-generate the golden screenshots for a given device:
+
+```
+./regenerate_goldens.sh
+```
+To run the tests and compare against those goldens:
+```
+./compare_goldens.sh
+```
+
+The results will depend on the actual device used to generate the golden, therefore if you are using a different device (which is likely), your results may not be the same. This is expected.
+
+# Building Filament from source
+
+```
+git clone git@github.com:nmfisher/filament.git && cd filament
+```
+
+## Android/iOS/MacOS
+
+```
+git checkout flutter-filament-ios-android-macos
+./build.sh -p release
+```
+
+## Windows
+
+To support embedding GPU textures in Flutter (rather than copying to a CPU pixel buffer on every frame), we need to build a slightly customized version of Filament that uses GLES on Windows (rather than the default, which uses OpenGL).
+
+Separately, we also force the Filament gltfio library to load assets via in-memory buffers, rather than the filesystem. This is simply a convenience so we don't have to use different logic for gltf resource loading across platforms.
+
+```
+git checkout flutter-filament-windows
+mkdir out && cd out
+"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" --build . --target gltf_viewer --config Debug
+```
+
+Building notes:
+On Android/iOS, we remove -fno-exceptions from CMakeLists.txt
+
+Project structure:
+- most shared code/headers under ios/src (because I still can't get podspec to build a target with symlinks or relative paths)
+- building on MacOS, we currently just delete the macos/include and macos/src directories and copy from iOS (for same reason),
+e.g.
+
+```
+make sync-macos
+```
+
+- Note also need to specifically build imageio/png/tinyexr
+- if release build, then need to comment out -fno-exceptions
+
+# Linux specific
+
+(Fedora 34)
+Building Filament:
+env LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/11/ CC=clang CXX=clang++ CXX_FLAGS="-v" LD_FLAGS="-v" FILAMENT_REQUIRES_CXXABI=true ./build.sh -c release
+
+Running example project:
+export PKG_CONFIG_PATH=/usr/lib/pkgconfig/:/usr/lib64/pkgconfig/ CPLUS_INCLUDE_PATH=/usr/include/gtk-3.0/:/usr/include/pango-1.0/:/usr/include/harfbuzz:/usr/include/cairo/:/usr/include/gdk-pixbuf-2.0/:/usr/include/atk-1.0/
+
+Web:
+
+EMCC_CFLAGS="-Wno-missing-field-initializers -Wno-deprecated-literal-operator -fPIC" ./build.sh -c -p webgl -i debug
+
+EMCC_CFLAGS="-I/Users/nickfisher/Documents/filament/libs/utils/include -I/Users/nickfisher/Documents/filament/libs/image/include -I/Users/nickfisher/Documents/filament/libs/math/include -I../../..//third_party/basisu/encoder/ -I../../..//third_party/libpng/ -I../../..//third_party/tinyexr/ -fPIC" emmake make
+
+
+## Materials
+
+We use a single material (no lighting and no transparency) for background images:
+
+```
+make generate-background-material
+```
+
+# Known issues
+
+## Windows
+
+Loading a glTF (but NOT a glb) may crash due to a race condition between uploading resource data to GPU memory and being freed on the host side. This has been fixed in recent versions of Filament, but other bugs on Windows prevent upgrading. Only workaround is to load a .glb file.
+
+## Android
+In release mode, you must add the following to your `app/build.gradle`:
+
+```
+ buildTypes {
+ release {
+ ...
+ shrinkResources false
+ minifyEnabled false
+ }
+ }
+...
+dependencies {
+ ....
+ implementation 'net.java.dev.jna:jna:5.10.0@aar'
+}
+```
+
+# Thanks
+
+- https://github.com/alexmercerind/flutter-windows-ANGLE-OpenGL-ES
\ No newline at end of file
diff --git a/dart_filament/examples/cli_macos/.gitignore b/dart_filament/examples/cli_macos/.gitignore
new file mode 100644
index 00000000..3a857904
--- /dev/null
+++ b/dart_filament/examples/cli_macos/.gitignore
@@ -0,0 +1,3 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
diff --git a/dart_filament/examples/cli_macos/CHANGELOG.md b/dart_filament/examples/cli_macos/CHANGELOG.md
new file mode 100644
index 00000000..effe43c8
--- /dev/null
+++ b/dart_filament/examples/cli_macos/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/dart_filament/examples/cli_macos/README.md b/dart_filament/examples/cli_macos/README.md
new file mode 100644
index 00000000..3816eca3
--- /dev/null
+++ b/dart_filament/examples/cli_macos/README.md
@@ -0,0 +1,2 @@
+A sample command-line application with an entrypoint in `bin/`, library code
+in `lib/`, and example unit test in `test/`.
diff --git a/dart_filament/examples/cli_macos/analysis_options.yaml b/dart_filament/examples/cli_macos/analysis_options.yaml
new file mode 100644
index 00000000..dee8927a
--- /dev/null
+++ b/dart_filament/examples/cli_macos/analysis_options.yaml
@@ -0,0 +1,30 @@
+# This file configures the static analysis results for your project (errors,
+# warnings, and lints).
+#
+# This enables the 'recommended' set of lints from `package:lints`.
+# This set helps identify many issues that may lead to problems when running
+# or consuming Dart code, and enforces writing Dart using a single, idiomatic
+# style and format.
+#
+# If you want a smaller set of lints you can change this to specify
+# 'package:lints/core.yaml'. These are just the most critical lints
+# (the recommended set includes the core lints).
+# The core lints are also what is used by pub.dev for scoring packages.
+
+include: package:lints/recommended.yaml
+
+# Uncomment the following section to specify additional rules.
+
+# linter:
+# rules:
+# - camel_case_types
+
+# analyzer:
+# exclude:
+# - path/to/excluded/files/**
+
+# For more information about the core and recommended set of lints, see
+# https://dart.dev/go/core-lints
+
+# For additional information about configuring this file, see
+# https://dart.dev/guides/language/analysis-options
diff --git a/dart_filament/examples/cli_macos/bin/example_cli.dart b/dart_filament/examples/cli_macos/bin/example_cli.dart
new file mode 100644
index 00000000..d05894c8
--- /dev/null
+++ b/dart_filament/examples/cli_macos/bin/example_cli.dart
@@ -0,0 +1,44 @@
+import 'dart:io';
+import 'package:dart_filament/dart_filament/compatibility/compatibility.dart';
+import 'package:dart_filament/dart_filament/swift/swift_bindings.g.dart';
+import 'package:dart_filament/dart_filament/compatibility/compatibility.dart';
+import 'package:dart_filament/dart_filament/utils/dart_resources.dart';
+import 'package:ffi/ffi.dart';
+import 'package:dart_filament/dart_filament.dart';
+
+void main() async {
+ var scriptDir = File(Platform.script.toFilePath()).parent.path;
+ final lib = DartFilamentTexture1(DynamicLibrary.open(
+ "$scriptDir/../../../native/lib/macos/swift/libdartfilamenttexture.dylib"));
+ final object = DartFilamentTexture.new1(lib);
+ object.initWithWidth_height_(500, 500);
+
+ final resourceLoader = calloc(1);
+ var loadToOut = NativeCallable<
+ Void Function(Pointer,
+ Pointer)>.listener(DartResourceLoader.loadResource);
+
+ resourceLoader.ref.loadToOut = loadToOut.nativeFunction;
+ var freeResource = NativeCallable.listener(
+ DartResourceLoader.freeResource);
+ resourceLoader.ref.freeResource = freeResource.nativeFunction;
+
+ var viewer = FilamentViewer(resourceLoader: resourceLoader.cast());
+
+ await viewer.initialized;
+ await viewer.createSwapChain(500, 500);
+ await viewer.createRenderTarget(500, 500, object.metalTextureAddress);
+ await viewer.updateViewportAndCameraProjection(500, 500);
+
+ var outDir = Directory("$scriptDir/skybox");
+ outDir.deleteSync(recursive: true);
+ outDir.createSync();
+
+ await viewer.setRecordingOutputDirectory(outDir.path);
+ await viewer.setRecording(true);
+ await viewer.loadSkybox(
+ "file:///$scriptDir/../../../flutter_filament/example/assets/default_env/default_env_skybox.ktx");
+ await Future.delayed(Duration(milliseconds: 16));
+ await viewer.render();
+ await viewer.dispose();
+}
diff --git a/dart_filament/examples/cli_macos/pubspec.yaml b/dart_filament/examples/cli_macos/pubspec.yaml
new file mode 100644
index 00000000..0ed9f80c
--- /dev/null
+++ b/dart_filament/examples/cli_macos/pubspec.yaml
@@ -0,0 +1,18 @@
+name: example_cli
+description: A sample command-line application.
+version: 1.0.0
+# repository: https://github.com/my_org/my_repo
+
+environment:
+ sdk: ^3.3.0
+
+# Add regular dependencies here.
+dependencies:
+ dart_filament:
+ path: ../../
+ ffi:
+
+dev_dependencies:
+ ffigen: ^11.0.0
+ lints: ^3.0.0
+ test: ^1.24.0
diff --git a/dart_filament/examples/cli_macos/test/example_cli_test.dart b/dart_filament/examples/cli_macos/test/example_cli_test.dart
new file mode 100644
index 00000000..900e362a
--- /dev/null
+++ b/dart_filament/examples/cli_macos/test/example_cli_test.dart
@@ -0,0 +1,8 @@
+import 'package:example_cli/example_cli.dart';
+import 'package:test/test.dart';
+
+void main() {
+ test('calculate', () {
+ expect(calculate(), 42);
+ });
+}
diff --git a/dart_filament/examples/cli_wasm/.gitignore b/dart_filament/examples/cli_wasm/.gitignore
new file mode 100644
index 00000000..3a857904
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/.gitignore
@@ -0,0 +1,3 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
diff --git a/dart_filament/examples/cli_wasm/CHANGELOG.md b/dart_filament/examples/cli_wasm/CHANGELOG.md
new file mode 100644
index 00000000..effe43c8
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/dart_filament/examples/cli_wasm/README.md b/dart_filament/examples/cli_wasm/README.md
new file mode 100644
index 00000000..3816eca3
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/README.md
@@ -0,0 +1,2 @@
+A sample command-line application with an entrypoint in `bin/`, library code
+in `lib/`, and example unit test in `test/`.
diff --git a/dart_filament/examples/cli_wasm/analysis_options.yaml b/dart_filament/examples/cli_wasm/analysis_options.yaml
new file mode 100644
index 00000000..dee8927a
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/analysis_options.yaml
@@ -0,0 +1,30 @@
+# This file configures the static analysis results for your project (errors,
+# warnings, and lints).
+#
+# This enables the 'recommended' set of lints from `package:lints`.
+# This set helps identify many issues that may lead to problems when running
+# or consuming Dart code, and enforces writing Dart using a single, idiomatic
+# style and format.
+#
+# If you want a smaller set of lints you can change this to specify
+# 'package:lints/core.yaml'. These are just the most critical lints
+# (the recommended set includes the core lints).
+# The core lints are also what is used by pub.dev for scoring packages.
+
+include: package:lints/recommended.yaml
+
+# Uncomment the following section to specify additional rules.
+
+# linter:
+# rules:
+# - camel_case_types
+
+# analyzer:
+# exclude:
+# - path/to/excluded/files/**
+
+# For more information about the core and recommended set of lints, see
+# https://dart.dev/go/core-lints
+
+# For additional information about configuring this file, see
+# https://dart.dev/guides/language/analysis-options
diff --git a/dart_filament/examples/cli_wasm/bin/.gitignore b/dart_filament/examples/cli_wasm/bin/.gitignore
new file mode 100644
index 00000000..768bac72
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/.gitignore
@@ -0,0 +1,4 @@
+example_cli.mjs
+example_cli.wasm
+example_cli.unopt.wasm
+node_modules/**/*
diff --git a/dart_filament/examples/cli_wasm/bin/build.log b/dart_filament/examples/cli_wasm/bin/build.log
new file mode 100644
index 00000000..2f3f8079
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/build.log
@@ -0,0 +1,98 @@
+MAIN
+initializing
+gto uberarchive ptr
+create void ptr callback
+resolve
+try
+done, returning
+created
+got promise [object Promise]
+got fn ptr address 2720
+Calling create_filament_viewer_ffi
+Call complete
+Created viewer, waiting for initialization
+Creating WebGL context.
+Created WebGL context 2.0
+Made WebGL context current
+FEngine (32 bits) created at 0x1937d0 (threading is disabled)
+
+[stack-gl], [ANGLE], [OpenGL ES 3.0 (WebGL 1.0 stack-gl 8.0.2)], [OpenGL ES GLSL ES 1.00 (WebGL GLSL ES 1.0 stack-gl)]
+
+Feature level: 1
+Active workarounds:
+
+Backend feature level: 1
+
+FEngine feature level: 1
+
+Set frame interval to 16.666666
+Setting tone mapping to ACES
+Bloom is disabled on WebGL builds as it causes instability with certain drivers. setBloom will be ignored
+View created
+Camera aperture 16.000000 shutter 0.008000 sensitivity 100.000000
+Created ubershader provider.
+Added imageEntity 6
+Got void ptr callback
+Set viewer to true
+Created viewer 1652064
+Initialied
+Loading GLB from buffer of length 116948
+Loaded glb
+Entities : [10, 11, 12]
+entityName : Cone
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+morph targets : [Key 1, Key 2, Key 3, Key 4, Key 5, Key 6, Key 7, Key 8]
+entityName : Cube
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+morph targets : [Key 1, Key 2]
+entityName : Cylinder
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+Getting morpht arget names
+No insdtance
+Using asset instance
+morph targets : [Key 1, Key 2, Key 3, Key 4]
diff --git a/dart_filament/examples/cli_wasm/bin/dart_filament.js b/dart_filament/examples/cli_wasm/bin/dart_filament.js
new file mode 120000
index 00000000..6710a76f
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/dart_filament.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.js
\ No newline at end of file
diff --git a/dart_filament/examples/cli_wasm/bin/dart_filament.wasm b/dart_filament/examples/cli_wasm/bin/dart_filament.wasm
new file mode 120000
index 00000000..a1439c39
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/dart_filament.wasm
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.wasm
\ No newline at end of file
diff --git a/dart_filament/examples/cli_wasm/bin/dart_filament.worker.js b/dart_filament/examples/cli_wasm/bin/dart_filament.worker.js
new file mode 120000
index 00000000..54392ba9
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/dart_filament.worker.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.worker.js
\ No newline at end of file
diff --git a/dart_filament/examples/cli_wasm/bin/example_cli.dart b/dart_filament/examples/cli_wasm/bin/example_cli.dart
new file mode 100644
index 00000000..16dc6810
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/example_cli.dart
@@ -0,0 +1,33 @@
+import 'package:dart_filament/dart_filament/compatibility/compatibility.dart';
+import 'package:dart_filament/dart_filament.dart';
+import 'package:animation_tools_dart/animation_tools_dart.dart';
+
+void main(List args) async {
+ final resourceLoader = flutter_filament_web_get_resource_loader_wrapper();
+ var viewer = FilamentViewer(resourceLoader: resourceLoader.cast());
+ viewer.initialized.then((_) async {
+ var entity = await viewer.loadGlb(
+ "/Users/nickfisher/Documents/polyvox/apps/packages/flutter_filament/flutter_filament_federated/flutter_filament/example/assets/shapes/shapes.glb");
+ var entities = await viewer.getChildEntities(entity, true);
+ for (final childEntity in entities) {
+ final childName = await viewer.getNameForEntity(childEntity);
+ var morphTargetNames =
+ await viewer.getMorphTargetNames(entity, childEntity!);
+ if (morphTargetNames.isNotEmpty) {
+ await viewer.setMorphTargetWeights(
+ childEntity, List.filled(morphTargetNames.length, 1.0));
+ }
+ var animationData = MorphAnimationData(
+ List.generate(
+ 10, (_) => List.filled(morphTargetNames.length, 1.0)),
+ morphTargetNames);
+
+ await viewer.setMorphAnimationData(entity, animationData,
+ targetMeshNames: [childName!]);
+ }
+ });
+
+ while (true) {
+ await Future.delayed(Duration(seconds: 1));
+ }
+}
diff --git a/dart_filament/examples/cli_wasm/bin/main.js b/dart_filament/examples/cli_wasm/bin/main.js
new file mode 100644
index 00000000..731e2338
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/main.js
@@ -0,0 +1,123 @@
+const fs = require('node:fs');
+const dart_filament = require("./dart_filament.js")
+const GLctx = require('gl')(100, 100, { preserveDrawingBuffer: true })
+
+// queueMicrotask = (func) => {
+// func();
+// }
+// read('dart_filament.wasm', 'binary')
+// const exports = {};
+// const module = {};
+
+const wasmBuffer = fs.readFileSync('dart_filament.wasm');
+
+var dartFilamentModulePromise = WebAssembly.compile(wasmBuffer);
+let globalDf;
+dart_filament({
+ dartFilamentResolveCallback: (cb, data) => {
+ const fn = globalDf.wasmTable.get(cb);
+ if(data) {
+ fn(data);
+ } else {
+ fn();
+ }
+ },
+ ctx:GLctx}).then((df) => {
+ globalDf = df;
+ createVoidCallback = () => {
+ let res; //placeholder for resolver callback, outside of promise
+ const promise = new Promise((resolve, reject) => {
+ res = resolve;
+ });
+ try {
+ const callback = () => {
+ try {
+ res({});
+ } catch(err) {
+ console.log(err);
+ }
+ }
+ const fnPtr = df.addFunction(callback, 'v');
+ return [promise, fnPtr];
+ } catch(err) {
+ console.log(err);
+ return null;
+ }
+ }
+ createIntCallback = () => {
+ let res;
+ const promise = new Promise((resolve, reject) => {
+ res = resolve;
+ });
+ try {
+ const callback = (val) => {
+ try {
+ res(val);
+ } catch(err) {
+ console.log(err);
+ }
+ }
+ const fnPtr = df.addFunction(callback, 'vi');
+ return [promise, fnPtr];
+ } catch(err) {
+ console.log(err);
+ return null;
+ }
+ }
+ createVoidPointerCallback = () => {
+ console.log("create void ptr callback");
+ let res; //placeholder for resolver callback, outside of promise
+ const promise = new Promise((resolve, reject) => {
+ console.log("resolve");
+ res = resolve;
+ });
+ try {
+ console.log("try");
+ const callback = (voidPtr) => {
+ try {
+ res(voidPtr);
+ } catch(err) {
+ console.log(err);
+ }
+ }
+ const fnPtr = df.addFunction(callback, 'vi');
+ console.log("done, returning");
+ return [promise, fnPtr];
+ } catch(err) {
+ console.log(err);
+ return null;
+ }
+ }
+
+ createBoolCallback = () => {
+ let res; //placeholder for resolver callback, outside of promise
+
+ const promise = new Promise((resolve, reject) => {
+ res = resolve;
+ });
+ try {
+ const callback = (val) => {
+ try {
+ res(val);
+ } catch(err) {
+ console.log(err);
+ }
+ }
+ const fnPtr = df.addFunction(callback, 'vi');
+ return [promise, fnPtr];
+ } catch(err) {
+ console.log(err);
+ return null;
+ }
+ }
+
+ import('./example_cli.mjs').then((dart2wasm_runtime) => {
+ var dartModulePromise = WebAssembly.compile(fs.readFileSync('./example_cli.wasm'));
+ const imports = {"dart_filament": df, "ctx": GLctx};
+ dart2wasm_runtime.instantiate(dartModulePromise, imports).then((moduleInstance) => {
+ dart2wasm_runtime.invoke(moduleInstance);
+ });
+ });
+});
+
+// // dartModulePromise.then((dartModule) => { console.log(dartModule.exports); dart2wasm_runtime.invoke(dartModule, imports);}); });
\ No newline at end of file
diff --git a/dart_filament/examples/cli_wasm/bin/package-lock.json b/dart_filament/examples/cli_wasm/bin/package-lock.json
new file mode 100644
index 00000000..69892e83
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/package-lock.json
@@ -0,0 +1,1559 @@
+{
+ "name": "bin",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "gl": "^8.0.2"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@npmcli/agent": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz",
+ "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/fs": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz",
+ "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/bit-twiddle": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz",
+ "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA=="
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "18.0.3",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz",
+ "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==",
+ "dependencies": {
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^4.0.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11",
+ "unique-filename": "^3.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ },
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
+ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw=="
+ },
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+ },
+ "node_modules/foreground-child": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
+ "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+ },
+ "node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
+ },
+ "node_modules/gl": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/gl/-/gl-8.0.2.tgz",
+ "integrity": "sha512-bAQg+aXnz/uBDwWEld/6Fifj0KBN3H3XElQgoz/F9hmBhIYKRohZP/41y43tHBQ6+LqVt1JKM1vts7t+Nzc6oA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "bit-twiddle": "^1.0.2",
+ "glsl-tokenizer": "^2.1.5",
+ "nan": "^2.18.0",
+ "node-abi": "^3.56.0",
+ "node-gyp": "^10.0.1",
+ "prebuild-install": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.3.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
+ "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^2.3.6",
+ "minimatch": "^9.0.1",
+ "minipass": "^7.0.4",
+ "path-scurry": "^1.11.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glsl-tokenizer": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
+ "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
+ "dependencies": {
+ "through2": "^0.6.3"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
+ "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+ },
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-lambda": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
+ },
+ "node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
+ "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
+ },
+ "node_modules/lru-cache": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+ "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/make-fetch-happen": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz",
+ "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==",
+ "dependencies": {
+ "@npmcli/agent": "^2.0.0",
+ "cacache": "^18.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "is-lambda": "^1.0.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^10.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/make-fetch-happen/node_modules/proc-log": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
+ "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz",
+ "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/nan": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz",
+ "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw=="
+ },
+ "node_modules/napi-build-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-abi": {
+ "version": "3.62.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz",
+ "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-gyp": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz",
+ "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^13.0.0",
+ "nopt": "^7.0.0",
+ "proc-log": "^3.0.0",
+ "semver": "^7.3.5",
+ "tar": "^6.1.2",
+ "which": "^4.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/prebuild-install": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
+ "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/proc-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+ "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "optional": true
+ },
+ "node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
+ "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz",
+ "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==",
+ "dependencies": {
+ "agent-base": "^7.1.1",
+ "debug": "^4.3.4",
+ "socks": "^2.7.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
+ },
+ "node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/tar-fs/node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/through2": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
+ "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
+ "dependencies": {
+ "readable-stream": ">=1.0.33-1 <1.1.0-0",
+ "xtend": ">=4.0.0 <4.1.0-0"
+ }
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/unique-filename": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+ "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+ "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+}
diff --git a/dart_filament/examples/cli_wasm/bin/package.json b/dart_filament/examples/cli_wasm/bin/package.json
new file mode 100644
index 00000000..c6382089
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/bin/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "gl": "^8.0.2"
+ }
+}
diff --git a/dart_filament/examples/cli_wasm/pubspec.yaml b/dart_filament/examples/cli_wasm/pubspec.yaml
new file mode 100644
index 00000000..0ed9f80c
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/pubspec.yaml
@@ -0,0 +1,18 @@
+name: example_cli
+description: A sample command-line application.
+version: 1.0.0
+# repository: https://github.com/my_org/my_repo
+
+environment:
+ sdk: ^3.3.0
+
+# Add regular dependencies here.
+dependencies:
+ dart_filament:
+ path: ../../
+ ffi:
+
+dev_dependencies:
+ ffigen: ^11.0.0
+ lints: ^3.0.0
+ test: ^1.24.0
diff --git a/dart_filament/examples/cli_wasm/test/example_cli_test.dart b/dart_filament/examples/cli_wasm/test/example_cli_test.dart
new file mode 100644
index 00000000..900e362a
--- /dev/null
+++ b/dart_filament/examples/cli_wasm/test/example_cli_test.dart
@@ -0,0 +1,8 @@
+import 'package:example_cli/example_cli.dart';
+import 'package:test/test.dart';
+
+void main() {
+ test('calculate', () {
+ expect(calculate(), 42);
+ });
+}
diff --git a/dart_filament/examples/web_wasm/.gitignore b/dart_filament/examples/web_wasm/.gitignore
new file mode 100644
index 00000000..3a857904
--- /dev/null
+++ b/dart_filament/examples/web_wasm/.gitignore
@@ -0,0 +1,3 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
diff --git a/dart_filament/examples/web_wasm/CHANGELOG.md b/dart_filament/examples/web_wasm/CHANGELOG.md
new file mode 100644
index 00000000..effe43c8
--- /dev/null
+++ b/dart_filament/examples/web_wasm/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/dart_filament/examples/web_wasm/README.md b/dart_filament/examples/web_wasm/README.md
new file mode 100644
index 00000000..3816eca3
--- /dev/null
+++ b/dart_filament/examples/web_wasm/README.md
@@ -0,0 +1,2 @@
+A sample command-line application with an entrypoint in `bin/`, library code
+in `lib/`, and example unit test in `test/`.
diff --git a/dart_filament/examples/web_wasm/analysis_options.yaml b/dart_filament/examples/web_wasm/analysis_options.yaml
new file mode 100644
index 00000000..dee8927a
--- /dev/null
+++ b/dart_filament/examples/web_wasm/analysis_options.yaml
@@ -0,0 +1,30 @@
+# This file configures the static analysis results for your project (errors,
+# warnings, and lints).
+#
+# This enables the 'recommended' set of lints from `package:lints`.
+# This set helps identify many issues that may lead to problems when running
+# or consuming Dart code, and enforces writing Dart using a single, idiomatic
+# style and format.
+#
+# If you want a smaller set of lints you can change this to specify
+# 'package:lints/core.yaml'. These are just the most critical lints
+# (the recommended set includes the core lints).
+# The core lints are also what is used by pub.dev for scoring packages.
+
+include: package:lints/recommended.yaml
+
+# Uncomment the following section to specify additional rules.
+
+# linter:
+# rules:
+# - camel_case_types
+
+# analyzer:
+# exclude:
+# - path/to/excluded/files/**
+
+# For more information about the core and recommended set of lints, see
+# https://dart.dev/go/core-lints
+
+# For additional information about configuring this file, see
+# https://dart.dev/guides/language/analysis-options
diff --git a/dart_filament/examples/web_wasm/bin/README.md b/dart_filament/examples/web_wasm/bin/README.md
new file mode 100644
index 00000000..75aba073
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/README.md
@@ -0,0 +1,16 @@
+# Flight Helmet
+
+## Screenshot
+
+
+
+## License Information
+
+Donated by Microsoft for glTF testing
+
+[](http://creativecommons.org/publicdomain/zero/1.0/)
+To the extent possible under law, Microsoft has waived all copyright and related or neighboring rights to this asset.
+
+Draco compression was done via Cesium tools on 27-03-2020 as follows.
+
+ gltf-pipeline -i FlightHelmet.gltf -o FlightHelmet.gltf -d -s --keep-unused-elements
diff --git a/dart_filament/examples/web_wasm/bin/assets b/dart_filament/examples/web_wasm/bin/assets
new file mode 120000
index 00000000..0500631d
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/assets
@@ -0,0 +1 @@
+../../../../flutter_filament_federated/flutter_filament/example/assets
\ No newline at end of file
diff --git a/dart_filament/examples/web_wasm/bin/dart_filament.js b/dart_filament/examples/web_wasm/bin/dart_filament.js
new file mode 120000
index 00000000..6710a76f
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/dart_filament.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.js
\ No newline at end of file
diff --git a/dart_filament/examples/web_wasm/bin/dart_filament.wasm b/dart_filament/examples/web_wasm/bin/dart_filament.wasm
new file mode 120000
index 00000000..a1439c39
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/dart_filament.wasm
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.wasm
\ No newline at end of file
diff --git a/dart_filament/examples/web_wasm/bin/dart_filament.worker.js b/dart_filament/examples/web_wasm/bin/dart_filament.worker.js
new file mode 120000
index 00000000..54392ba9
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/dart_filament.worker.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.worker.js
\ No newline at end of file
diff --git a/dart_filament/examples/web_wasm/bin/example_web.dart b/dart_filament/examples/web_wasm/bin/example_web.dart
new file mode 100644
index 00000000..c064242a
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/example_web.dart
@@ -0,0 +1,57 @@
+import 'dart:js_interop';
+import 'dart:js_interop_unsafe';
+import 'package:dart_filament/dart_filament/compatibility/compatibility.dart';
+import 'package:dart_filament/dart_filament/filament_viewer_impl.dart';
+import 'package:web/web.dart';
+
+void main(List arguments) async {
+ var fc = FooChar();
+
+ final canvas = document.getElementById("canvas") as HTMLCanvasElement;
+ canvas.width = window.innerWidth;
+ canvas.height = window.innerHeight;
+
+ var resourceLoader = flutter_filament_web_get_resource_loader_wrapper();
+
+ var viewer = FilamentViewer(resourceLoader: resourceLoader);
+
+ var mousedown = (JSObject event) {
+ var x = event.getProperty("clientX".toJS) as JSNumber;
+ var y = event.getProperty("clientY".toJS) as JSNumber;
+ viewer.rotateStart(x.toDartDouble, y.toDartDouble);
+ };
+
+ canvas.addEventListener("mousedown", mousedown.toJS);
+
+ var mousemove = (JSObject event) {
+ var x = event.getProperty("clientX".toJS) as JSNumber;
+ var y = event.getProperty("clientY".toJS) as JSNumber;
+ viewer.rotateUpdate(x.toDartDouble, y.toDartDouble);
+ };
+
+ canvas.addEventListener("mousemove", mousemove.toJS);
+
+ var mouseup = (JSObject event) {
+ viewer.rotateEnd();
+ };
+
+ canvas.addEventListener("mouseup", mousedown.toJS);
+
+ await viewer.initialized;
+ var width = window.innerWidth;
+ var height = window.innerHeight;
+ await viewer.createSwapChain(width.toDouble(), height.toDouble());
+ await viewer.setBackgroundColor(0.0, 1.0, 1.0, 1.0);
+ await viewer.loadSkybox("assets/default_env_skybox.ktx");
+ await viewer.loadIbl("assets/default_env_ibl.ktx");
+ await viewer.loadGltf("assets/FlightHelmet.gltf", "assets");
+ await viewer.updateViewportAndCameraProjection(
+ width.toDouble(), height.toDouble());
+ await viewer.setPostProcessing(true);
+ await viewer.setRendering(true);
+
+ while (true) {
+ await Future.delayed(Duration(milliseconds: 16));
+ }
+ print("Finisehd!");
+}
diff --git a/dart_filament/examples/web_wasm/bin/example_web.mjs b/dart_filament/examples/web_wasm/bin/example_web.mjs
new file mode 100644
index 00000000..836f37a3
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/example_web.mjs
@@ -0,0 +1,249 @@
+let buildArgsList;
+
+// `modulePromise` is a promise to the `WebAssembly.module` object to be
+// instantiated.
+// `importObjectPromise` is a promise to an object that contains any additional
+// imports needed by the module that aren't provided by the standard runtime.
+// The fields on this object will be merged into the importObject with which
+// the module will be instantiated.
+// This function returns a promise to the instantiated module.
+export const instantiate = async (modulePromise, importObjectPromise) => {
+ let dartInstance;
+
+ function stringFromDartString(string) {
+ const totalLength = dartInstance.exports.$stringLength(string);
+ let result = '';
+ let index = 0;
+ while (index < totalLength) {
+ let chunkLength = Math.min(totalLength - index, 0xFFFF);
+ const array = new Array(chunkLength);
+ for (let i = 0; i < chunkLength; i++) {
+ array[i] = dartInstance.exports.$stringRead(string, index++);
+ }
+ result += String.fromCharCode(...array);
+ }
+ return result;
+ }
+
+ function stringToDartString(string) {
+ const length = string.length;
+ let range = 0;
+ for (let i = 0; i < length; i++) {
+ range |= string.codePointAt(i);
+ }
+ if (range < 256) {
+ const dartString = dartInstance.exports.$stringAllocate1(length);
+ for (let i = 0; i < length; i++) {
+ dartInstance.exports.$stringWrite1(dartString, i, string.codePointAt(i));
+ }
+ return dartString;
+ } else {
+ const dartString = dartInstance.exports.$stringAllocate2(length);
+ for (let i = 0; i < length; i++) {
+ dartInstance.exports.$stringWrite2(dartString, i, string.charCodeAt(i));
+ }
+ return dartString;
+ }
+ }
+
+ // Prints to the console
+ function printToConsole(value) {
+ if (typeof dartPrint == "function") {
+ dartPrint(value);
+ return;
+ }
+ if (typeof console == "object" && typeof console.log != "undefined") {
+ console.log(value);
+ return;
+ }
+ if (typeof print == "function") {
+ print(value);
+ return;
+ }
+
+ throw "Unable to print message: " + js;
+ }
+
+ // Converts a Dart List to a JS array. Any Dart objects will be converted, but
+ // this will be cheap for JSValues.
+ function arrayFromDartList(constructor, list) {
+ const length = dartInstance.exports.$listLength(list);
+ const array = new constructor(length);
+ for (let i = 0; i < length; i++) {
+ array[i] = dartInstance.exports.$listRead(list, i);
+ }
+ return array;
+ }
+
+ buildArgsList = function(list) {
+ const dartList = dartInstance.exports.$makeStringList();
+ for (let i = 0; i < list.length; i++) {
+ dartInstance.exports.$listAdd(dartList, stringToDartString(list[i]));
+ }
+ return dartList;
+ }
+
+ // A special symbol attached to functions that wrap Dart functions.
+ const jsWrappedDartFunctionSymbol = Symbol("JSWrappedDartFunction");
+
+ function finalizeWrapper(dartFunction, wrapped) {
+ wrapped.dartFunction = dartFunction;
+ wrapped[jsWrappedDartFunctionSymbol] = true;
+ return wrapped;
+ }
+
+ // Imports
+ const dart2wasm = {
+
+_18: f => finalizeWrapper(f,x0 => dartInstance.exports._18(f,x0)),
+_19: f => finalizeWrapper(f,x0 => dartInstance.exports._19(f,x0)),
+_75: (x0,x1) => x0.getElementById(x1),
+_76: f => finalizeWrapper(f,x0 => dartInstance.exports._76(f,x0)),
+_77: (x0,x1,x2) => x0.addEventListener(x1,x2),
+_78: f => finalizeWrapper(f,x0 => dartInstance.exports._78(f,x0)),
+_79: f => finalizeWrapper(f,x0 => dartInstance.exports._79(f,x0)),
+_1499: (x0,x1) => x0.width = x1,
+_1501: (x0,x1) => x0.height = x1,
+_1878: () => globalThis.window,
+_1920: x0 => x0.innerWidth,
+_1921: x0 => x0.innerHeight,
+_6854: () => globalThis.document,
+_12721: () => globalThis.createBoolCallback(),
+_12722: () => globalThis.createVoidPointerCallback(),
+_12723: () => globalThis.createVoidCallback(),
+_12727: v => stringToDartString(v.toString()),
+_12743: () => {
+ let stackString = new Error().stack.toString();
+ let frames = stackString.split('\n');
+ let drop = 2;
+ if (frames[0] === 'Error') {
+ drop += 1;
+ }
+ return frames.slice(drop).join('\n');
+ },
+_12762: s => stringToDartString(JSON.stringify(stringFromDartString(s))),
+_12763: s => printToConsole(stringFromDartString(s)),
+_12777: (ms, c) =>
+ setTimeout(() => dartInstance.exports.$invokeCallback(c),ms),
+_12781: (c) =>
+ queueMicrotask(() => dartInstance.exports.$invokeCallback(c)),
+_12783: (a, i) => a.push(i),
+_12794: a => a.length,
+_12796: (a, i) => a[i],
+_12797: (a, i, v) => a[i] = v,
+_12799: a => a.join(''),
+_12809: (s, p, i) => s.indexOf(p, i),
+_12812: (o, start, length) => new Uint8Array(o.buffer, o.byteOffset + start, length),
+_12813: (o, start, length) => new Int8Array(o.buffer, o.byteOffset + start, length),
+_12814: (o, start, length) => new Uint8ClampedArray(o.buffer, o.byteOffset + start, length),
+_12815: (o, start, length) => new Uint16Array(o.buffer, o.byteOffset + start, length),
+_12816: (o, start, length) => new Int16Array(o.buffer, o.byteOffset + start, length),
+_12817: (o, start, length) => new Uint32Array(o.buffer, o.byteOffset + start, length),
+_12818: (o, start, length) => new Int32Array(o.buffer, o.byteOffset + start, length),
+_12821: (o, start, length) => new Float32Array(o.buffer, o.byteOffset + start, length),
+_12822: (o, start, length) => new Float64Array(o.buffer, o.byteOffset + start, length),
+_12827: (o) => new DataView(o.buffer, o.byteOffset, o.byteLength),
+_12831: Function.prototype.call.bind(Object.getOwnPropertyDescriptor(DataView.prototype, 'byteLength').get),
+_12832: (b, o) => new DataView(b, o),
+_12834: Function.prototype.call.bind(DataView.prototype.getUint8),
+_12836: Function.prototype.call.bind(DataView.prototype.getInt8),
+_12838: Function.prototype.call.bind(DataView.prototype.getUint16),
+_12840: Function.prototype.call.bind(DataView.prototype.getInt16),
+_12842: Function.prototype.call.bind(DataView.prototype.getUint32),
+_12844: Function.prototype.call.bind(DataView.prototype.getInt32),
+_12850: Function.prototype.call.bind(DataView.prototype.getFloat32),
+_12852: Function.prototype.call.bind(DataView.prototype.getFloat64),
+_12873: o => o === undefined,
+_12874: o => typeof o === 'boolean',
+_12875: o => typeof o === 'number',
+_12877: o => typeof o === 'string',
+_12880: o => o instanceof Int8Array,
+_12881: o => o instanceof Uint8Array,
+_12882: o => o instanceof Uint8ClampedArray,
+_12883: o => o instanceof Int16Array,
+_12884: o => o instanceof Uint16Array,
+_12885: o => o instanceof Int32Array,
+_12886: o => o instanceof Uint32Array,
+_12887: o => o instanceof Float32Array,
+_12888: o => o instanceof Float64Array,
+_12889: o => o instanceof ArrayBuffer,
+_12890: o => o instanceof DataView,
+_12891: o => o instanceof Array,
+_12892: o => typeof o === 'function' && o[jsWrappedDartFunctionSymbol] === true,
+_12896: (l, r) => l === r,
+_12897: o => o,
+_12898: o => o,
+_12899: o => o,
+_12900: b => !!b,
+_12901: o => o.length,
+_12904: (o, i) => o[i],
+_12905: f => f.dartFunction,
+_12906: l => arrayFromDartList(Int8Array, l),
+_12907: l => arrayFromDartList(Uint8Array, l),
+_12908: l => arrayFromDartList(Uint8ClampedArray, l),
+_12909: l => arrayFromDartList(Int16Array, l),
+_12910: l => arrayFromDartList(Uint16Array, l),
+_12911: l => arrayFromDartList(Int32Array, l),
+_12912: l => arrayFromDartList(Uint32Array, l),
+_12913: l => arrayFromDartList(Float32Array, l),
+_12914: l => arrayFromDartList(Float64Array, l),
+_12915: (data, length) => {
+ const view = new DataView(new ArrayBuffer(length));
+ for (let i = 0; i < length; i++) {
+ view.setUint8(i, dartInstance.exports.$byteDataGetUint8(data, i));
+ }
+ return view;
+ },
+_12916: l => arrayFromDartList(Array, l),
+_12917: stringFromDartString,
+_12918: stringToDartString,
+_12921: l => new Array(l),
+_12925: (o, p) => o[p],
+_12929: o => String(o),
+_12930: (p, s, f) => p.then(s, f),
+_12949: (o, p) => o[p]
+ };
+
+ const baseImports = {
+ dart2wasm: dart2wasm,
+
+
+ Math: Math,
+ Date: Date,
+ Object: Object,
+ Array: Array,
+ Reflect: Reflect,
+ };
+
+ const jsStringPolyfill = {
+ "charCodeAt": (s, i) => s.charCodeAt(i),
+ "compare": (s1, s2) => {
+ if (s1 < s2) return -1;
+ if (s1 > s2) return 1;
+ return 0;
+ },
+ "concat": (s1, s2) => s1 + s2,
+ "equals": (s1, s2) => s1 === s2,
+ "fromCharCode": (i) => String.fromCharCode(i),
+ "length": (s) => s.length,
+ "substring": (s, a, b) => s.substring(a, b),
+ };
+
+ dartInstance = await WebAssembly.instantiate(await modulePromise, {
+ ...baseImports,
+ ...(await importObjectPromise),
+ "wasm:js-string": jsStringPolyfill,
+ });
+
+ return dartInstance;
+}
+
+// Call the main function for the instantiated module
+// `moduleInstance` is the instantiated dart2wasm module
+// `args` are any arguments that should be passed into the main function.
+export const invoke = (moduleInstance, ...args) => {
+ const dartMain = moduleInstance.exports.$getMain();
+ const dartArgs = buildArgsList(args);
+ moduleInstance.exports.$invokeMain(dartMain, dartArgs);
+}
+
diff --git a/dart_filament/examples/web_wasm/bin/example_web.unopt.wasm b/dart_filament/examples/web_wasm/bin/example_web.unopt.wasm
new file mode 100644
index 00000000..3bda1345
Binary files /dev/null and b/dart_filament/examples/web_wasm/bin/example_web.unopt.wasm differ
diff --git a/dart_filament/examples/web_wasm/bin/example_web.wasm b/dart_filament/examples/web_wasm/bin/example_web.wasm
new file mode 100644
index 00000000..763b8df9
Binary files /dev/null and b/dart_filament/examples/web_wasm/bin/example_web.wasm differ
diff --git a/dart_filament/examples/web_wasm/bin/index.html b/dart_filament/examples/web_wasm/bin/index.html
new file mode 100644
index 00000000..4ac2c178
--- /dev/null
+++ b/dart_filament/examples/web_wasm/bin/index.html
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dart_filament/examples/web_wasm/pubspec.yaml b/dart_filament/examples/web_wasm/pubspec.yaml
new file mode 100644
index 00000000..b2c212f8
--- /dev/null
+++ b/dart_filament/examples/web_wasm/pubspec.yaml
@@ -0,0 +1,17 @@
+name: example_web
+description: A sample command-line application.
+version: 1.0.0
+# repository: https://github.com/my_org/my_repo
+
+environment:
+ sdk: ^3.3.0
+
+# Add regular dependencies here.
+dependencies:
+ dart_filament:
+ path: ../../
+ ffi:
+
+dev_dependencies:
+ lints: ^3.0.0
+ test: ^1.24.0
diff --git a/dart_filament/examples/web_wasm/test/example_web_test.dart b/dart_filament/examples/web_wasm/test/example_web_test.dart
new file mode 100644
index 00000000..4c50d967
--- /dev/null
+++ b/dart_filament/examples/web_wasm/test/example_web_test.dart
@@ -0,0 +1,8 @@
+import 'package:example_web/example_web.dart';
+import 'package:test/test.dart';
+
+void main() {
+ test('calculate', () {
+ expect(calculate(), 42);
+ });
+}
diff --git a/dart_filament/ffigen/native.yaml b/dart_filament/ffigen/native.yaml
new file mode 100644
index 00000000..f62ebe7b
--- /dev/null
+++ b/dart_filament/ffigen/native.yaml
@@ -0,0 +1,13 @@
+output: '../lib/dart_filament/compatibility/native/dart_filament.g.dart'
+headers:
+ entry-points:
+ - '../native/include/DartFilamentFFIApi.h'
+ - '../native/include/DartFilamentApi.h'
+ - '../native/include/ResourceBuffer.h'
+ include-directives:
+ - '../native/include/DartFilamentFFIApi.h'
+ - '../native/include/DartFilamentApi.h'
+ - '../native/include/ResourceBuffer.h'
+ffi-native:
+ assetId: package:dart_filament/dart_filament.dart
+ignore-source-errors: true
diff --git a/dart_filament/ffigen/swift.yaml b/dart_filament/ffigen/swift.yaml
new file mode 100644
index 00000000..c24e0acb
--- /dev/null
+++ b/dart_filament/ffigen/swift.yaml
@@ -0,0 +1,15 @@
+name: DartFilamentTexture
+description: Bindings for DartFilamentTexture.
+language: objc
+output: 'lib/dart_filament/swift/swift_bindings.g.dart'
+exclude-all-by-default: true
+objc-interfaces:
+ include:
+ - 'DartFilamentTexture'
+ module:
+ 'DartFilamentTexture': 'dart_filament_texture'
+headers:
+ entry-points:
+ - 'native/lib/macos/swift/DartFilamentTexture.h'
+preamble: |
+ // ignore_for_file: camel_case_types, non_constant_identifier_names, unused_element, unused_field, return_of_invalid_type, void_checks, annotate_overrides, no_leading_underscores_for_local_identifiers, library_private_types_in_public_apia
\ No newline at end of file
diff --git a/dart_filament/ffigen/web.yaml b/dart_filament/ffigen/web.yaml
new file mode 100644
index 00000000..7f322225
--- /dev/null
+++ b/dart_filament/ffigen/web.yaml
@@ -0,0 +1,28 @@
+output: '../lib/dart_filament/compatibility/web/dart_filament.g.dart'
+headers:
+ entry-points:
+ - '../native/web/include/FlutterFilamentWebApi.h'
+ - '../native/include/DartFilamentFFIApi.h'
+ - '../native/include/DartFilamentApi.h'
+ - '../native/include/ResourceBuffer.h'
+ include-directives:
+ - '../native/web/include/FlutterFilamentWebApi.h'
+ - '../native/include/DartFilamentFFIApi.h'
+ - '../native/include/DartFilamentApi.h'
+ - '../native/include/ResourceBuffer.h'
+compiler-opts:
+ - "-D__EMSCRIPTEN__"
+structs:
+ dependency-only: opaque
+ exclude:
+ - '.*'
+unions:
+ dependency-only: opaque
+ exclude:
+ - '.*'
+globals:
+ exclude:
+ - '.*'
+ffi-native:
+ assetId: dart_filament
+ignore-source-errors: true
diff --git a/dart_filament/hook/build.dart b/dart_filament/hook/build.dart
new file mode 100644
index 00000000..be509053
--- /dev/null
+++ b/dart_filament/hook/build.dart
@@ -0,0 +1,247 @@
+import 'dart:io';
+import 'package:archive/archive.dart';
+import 'package:logging/logging.dart';
+import 'package:native_assets_cli/native_assets_cli.dart';
+import 'package:native_toolchain_c/native_toolchain_c.dart';
+
+void main(List args) async {
+ await build(args, (config, output) async {
+
+ final logger = Logger("")..level = Level.ALL
+ ..onRecord.listen((record) => print(record.message));
+
+ var platform = config.targetOS.toString().toLowerCase();
+
+ var libDir = config.dryRun ? "" : (await getLibDir(config, logger)).path;
+
+ final packageName = config.packageName;
+
+ final sources = Directory("${config.packageRoot.toFilePath()}/native/src")
+ .listSync(recursive: true)
+ .whereType()
+ .map((f) => f.path)
+ .toList();
+ sources.addAll([
+ "${config.packageRoot.toFilePath()}/native/include/material/gizmo.c",
+ "${config.packageRoot.toFilePath()}/native/include/material/image.c",
+ ]);
+
+ final libs = [
+ "filament",
+ "backend",
+ "filameshio",
+ "viewer",
+ "filamat",
+ "geometry",
+ "utils",
+ "filabridge",
+ "gltfio_core",
+ "filament-iblprefilter",
+ "image",
+ "imageio",
+ "tinyexr",
+ "gltfio_core",
+ "filaflat",
+ "dracodec",
+ "ibl",
+ "ktxreader",
+ "png",
+ "z",
+ "stb",
+ "uberzlib",
+ "smol-v",
+ "uberarchive",
+ "zstd",
+ "basis_transcoder"
+ ];
+
+ final linkWith = [];
+
+ if (platform == "windows") {
+ linkWith.addAll(libs.map((lib) => "$libDir/$lib.lib"));
+ linkWith.addAll(["$libDir/bluevk.lib", "$libDir/bluegl.lib"]);
+ linkWith.addAll([
+ "gdi32.lib",
+ "user32.lib",
+ "shell32.lib",
+ "opengl32.lib",
+ "dwmapi.lib",
+ "comctl32.lib"
+ ]);
+ } else {
+ libs.add("stdc++");
+ }
+ final flags = [];
+ final defines = {};
+ var frameworks = [];
+
+ if (platform != "windows") {
+ flags.addAll(['-std=c++17']);
+ } else {
+ defines["WIN32"] = "1";
+ defines["_DEBUG"] = "1";
+ defines["_DLL"] = "1";
+ flags.addAll(["/std:c++20", "/MDd"]);
+ }
+
+ if (platform == "ios") {
+ frameworks.addAll(['Foundation', 'CoreGraphics', 'QuartzCore', 'GLKit', "Metal", 'CoreVideo', 'OpenGLES']);
+ } else if (platform == "macos") {
+ frameworks.addAll([
+ 'Foundation',
+ 'CoreVideo',
+ 'Cocoa',
+ "Metal",
+ ]);
+ libs.addAll(["bluegl", "bluevk"]);
+ } else if (platform == "android") {
+ libs.addAll(["GLESv3", "EGL", "bluevk", "dl", "android"]);
+ }
+
+ frameworks = frameworks.expand((f) => ["-framework", f]).toList();
+
+ final cbuilder = CBuilder.library(
+ name: packageName,
+ language: Language.cpp,
+ assetName: 'dart_filament.dart',
+ sources: sources,
+ includes: ['native/include', 'native/include/filament'],
+ defines: defines,
+ linkWith: linkWith,
+ flags: [
+ if (platform == "macos") '-mmacosx-version-min=13.0',
+ if (platform == "ios") '-mios-version-min=13.0',
+ ...flags,
+ ...frameworks,
+ if (platform != "windows") ...libs.map((lib) => "-l$lib"),
+ "-L$libDir",
+ ],
+ dartBuildFiles: ['hook/build.dart'],
+ );
+
+ await cbuilder.run(
+ config: config,
+ output: output,
+ logger: logger,
+ );
+ if (config.targetOS == OS.android) {
+ if (!config.dryRun) {
+ final archExtension = switch (config.targetArchitecture) {
+ Architecture.arm => "arm-linux-androideabi",
+ Architecture.arm64 => "aarch64-linux-android",
+ Architecture.x64 => "x86_64-linux-android",
+ Architecture.ia32 => "i686-linux-android",
+ _ => throw FormatException('Invalid')
+ };
+ var ndkRoot = File(config.cCompiler.compiler!.path).parent.parent.path;
+ var stlPath =
+ File("$ndkRoot/sysroot/usr/lib/${archExtension}/libc++_shared.so");
+ output.addAsset(NativeCodeAsset(
+ package: "dart_filament",
+ name: "libc++_shared.so",
+ linkMode: DynamicLoadingBundled(),
+ os: config.targetOS,
+ file: stlPath.uri,
+ architecture: config.targetArchitecture));
+ }
+ }
+ // do we need this?
+ if (config.targetOS == "windows") {
+ output.addAsset(
+ NativeCodeAsset(
+ package: "dart_filament",
+ name: "dart_filament.dll",
+ linkMode: DynamicLoadingBundled(),
+ os: config.targetOS,
+ file: Uri.file(
+ config.outputDirectory.toFilePath() + "/dart_filament.dll"),
+ architecture: config.targetArchitecture),
+ linkInPackage: config.packageName);
+ }
+ });
+}
+
+String _FILAMENT_VERSION ="v1.51.2";
+String _getLibraryUrl(String platform, String mode) {
+ return "https://pub-c8b6266320924116aaddce03b5313c0a.r2.dev/filament-${_FILAMENT_VERSION}-${platform}-${mode}.zip";
+}
+
+//
+// Download precompiled Filament libraries for the target platform from Cloudflare.
+//
+Future getLibDir(BuildConfig config, Logger logger) async {
+
+ var platform = config.targetOS.toString().toLowerCase();
+
+ // Except on Windows, most users will only need release builds of Filament.
+ // Debug builds are probably only relevant if you're a package developer debugging an internal Filament issue
+ // or if you're working on Flutter+Windows (which requires the CRT debug DLLs).
+ // Also note that there are known driver issues with Android debug builds, e.g.:
+ // https://github.com/google/filament/issues/7162
+ // (these aren't present in Filament release builds).
+ // However, if you know what you're doing, you can change "release" to "debug" below.
+ // TODO - check if we can pass this as a CLI compiler flag
+ var mode = "release";
+ if(platform == "windows") {
+ mode = config.buildMode == BuildMode.debug ? "debug" : "release";
+ }
+
+ var libDir = Directory("${config.packageRoot.toFilePath()}/.dart_tool/dart_filament/lib/${_FILAMENT_VERSION}/$platform/$mode/");
+
+ if (platform == "android") {
+ final archExtension = switch (config.targetArchitecture) {
+ Architecture.arm => "armeabi-v7a",
+ Architecture.arm64 => "arm64-v8a",
+ Architecture.x64 => "x86_64",
+ Architecture.ia32 => "x86",
+ _ => throw FormatException('Invalid')
+ };
+ libDir = Directory("${libDir.path}/$archExtension/");
+ } else if(platform == "windows") {
+ if(config.targetArchitecture != Architecture.x64) {
+ throw Exception("Unsupported architecture : ${config.targetArchitecture}");
+ }
+ }
+
+ final url = _getLibraryUrl(platform, mode);
+
+ final filename = url.split("/").last;
+
+ // Assume that the libraries exist if the directory containing them exists.
+ if (!libDir.existsSync()) {
+
+ final unzipDir = platform == "android" ? libDir.parent.path : libDir.path;
+
+ final libraryZip = File("$unzipDir/$filename");
+
+ if(libraryZip.existsSync()) {
+ libraryZip.deleteSync();
+ }
+
+ if(!libraryZip.parent.existsSync()) {
+ libraryZip.parent.createSync(recursive: true);
+ }
+
+ logger.info("Downloading prebuilt libraries for $platform/$mode from $url to ${libraryZip}, files will be unzipped to ${unzipDir}");
+ final request = await HttpClient().getUrl(Uri.parse(url));
+ final response = await request.close();
+
+ await response.pipe(libraryZip.openWrite());
+
+ final archive = ZipDecoder().decodeBytes(await libraryZip.readAsBytes());
+
+ for (final file in archive) {
+ final filename = file.name;
+ if (file.isFile) {
+ final data = file.content as List;
+ final f = File('${unzipDir}/$filename');
+ await f.create(recursive: true);
+ await f.writeAsBytes(data);
+ } else {
+ final d = Directory('${unzipDir}/$filename');
+ await d.create(recursive: true);
+ }
+ }
+ }
+ return libDir;
+}
diff --git a/dart_filament/lib/dart_filament.dart b/dart_filament/lib/dart_filament.dart
new file mode 100644
index 00000000..48cdfb48
--- /dev/null
+++ b/dart_filament/lib/dart_filament.dart
@@ -0,0 +1,6 @@
+library filament_dart;
+
+export 'dart_filament/entities/filament_entity.dart';
+export 'dart_filament/abstract_filament_viewer.dart';
+export 'dart_filament/filament_viewer_impl.dart';
+export 'dart_filament/entities/entity_transform_controller.dart';
diff --git a/lib/filament/filament_controller.dart b/dart_filament/lib/dart_filament/abstract_filament_viewer.dart
similarity index 81%
rename from lib/filament/filament_controller.dart
rename to dart_filament/lib/dart_filament/abstract_filament_viewer.dart
index 8dd4a112..65e8115e 100644
--- a/lib/filament/filament_controller.dart
+++ b/dart_filament/lib/dart_filament/abstract_filament_viewer.dart
@@ -1,22 +1,21 @@
-// ignore_for_file: constant_identifier_names
+import 'dart:math';
-import 'dart:async';
-import 'dart:typed_data';
-import 'dart:ui' as ui;
-import 'package:animation_tools_dart/animation_tools_dart.dart';
-import 'package:flutter/widgets.dart';
-
-import 'package:flutter_filament/filament/entities/gizmo.dart';
import 'package:vector_math/vector_math_64.dart';
-
+import 'dart:async';
import 'package:animation_tools_dart/animation_tools_dart.dart';
-
-// a handle that can be safely passed back to the rendering layer to manipulate an Entity
-typedef FilamentEntity = int;
+import 'package:dart_filament/dart_filament/entities/filament_entity.dart';
// "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates.
typedef FilamentPickResult = ({FilamentEntity entity, double x, double y});
+enum LightType {
+ SUN, //!< Directional light that also draws a sun's disk in the sky.
+ DIRECTIONAL, //!< Directional light, emits light in a given direction.
+ POINT, //!< Point light, emits light from a position, in all directions.
+ FOCUSED_SPOT, //!< Physically correct spot light.
+ SPOT,
+}
+
// copied from filament/backened/DriverEnums.h
enum PrimitiveType {
// don't change the enums values (made to match GL)
@@ -44,26 +43,8 @@ class TextureDetails {
{required this.textureId, required this.width, required this.height});
}
-abstract class FilamentController {
- ///
- /// A [ValueNotifier] to indicate whether a FilamentViewer is currently available.
- /// (FilamentViewer is a C++ type, hence why it is not referenced) here.
- /// Call [createViewer]/[destroyViewer] to create/destroy a FilamentViewer.
- ///
- ValueNotifier get hasViewer;
-
- ///
- /// Whether a Flutter Texture widget should be inserted into the widget hierarchy.
- /// This will be false on certain platforms where we use a transparent window underlay.
- /// Used internally by [FilamentWidget]; you probably don't need to access this property directly.
- ///
- bool get requiresTextureWidget;
-
- ///
- /// The Flutter texture ID and dimensions for current texture in use.
- /// This is only used by [FilamentWidget]; you shouldn't need to access directly yourself.
- ///
- final textureDetails = ValueNotifier(null);
+abstract class AbstractFilamentViewer {
+ Future get initialized;
///
/// The result(s) of calling [pick] (see below).
@@ -93,41 +74,9 @@ abstract class FilamentController {
Future setFrameRate(int framerate);
///
- /// Destroys the viewer and all backing textures. You can leave the FilamentWidget in the hierarchy after this is called, but you will need to manually call [createViewer] to
+ /// Destroys/disposes the viewer (including the entire scene). You cannot use the viewer after calling this method.
///
- Future destroy();
-
- ///
- /// Destroys the viewer only, leaving the texture intact. You probably want to call [destroy] instead of this; [destroyViewer] is exposed mostly for lifecycle changes which are handled by FilamentWidget.
- ///
- Future destroyViewer();
-
- ///
- /// Destroys the specified backing texture. You probably want to call [destroy] instead of this; this is exposed mostly for lifecycle changes which are handled by FilamentWidget.
- ///
- Future destroyTexture();
-
- ///
- /// Create a FilamentViewer. Must be called at least one frame after a [FilamentWidget] has been inserted into the rendering hierarchy.
- ///
- /// Before a FilamentViewer is created, the FilamentWidget will only contain an empty Container (by default, with a solid red background).
- /// FilamentWidget will then call [setDimensions] with dimensions/pixel ratio of the viewport
- /// Calling [createViewer] will then dispatch a request to the native platform to create a hardware texture (Metal on iOS, OpenGL on Linux, GLES on Android and Windows) and a FilamentViewer (the main interface for manipulating the 3D scene) .
- /// [FilamentWidget] will be notified that a texture is available and will replace the empty Container with a Texture widget
- ///
- Future createViewer();
-
- ///
- /// Sets the dimensions of the viewport and pixel ratio (obtained from [MediaQuery]) to be used the next time [resize] or [createViewer] is called.
- /// This is called by FilamentWidget; you shouldn't need to invoke this manually.
- ///
- Future setDimensions(ui.Rect rect, double pixelRatio);
-
- ///
- /// Resize the viewport & backing texture to the current dimensions (as last set by [setDimensions]).
- /// This is called by FilamentWidget; you shouldn't need to invoke this manually.
- ///
- Future resize();
+ Future dispose();
///
/// Set the background image to [path] (which should have a file extension .png, .jpg, or .ktx).
@@ -151,7 +100,7 @@ abstract class FilamentController {
///
/// Sets the color for the background plane (positioned at the maximum depth, i.e. behind all other objects including the skybox).
///
- Future setBackgroundColor(Color color);
+ Future setBackgroundColor(double r, double g, double b, double alpha);
///
/// Load a skybox from [skyboxPath] (which must be a .ktx file)
@@ -180,17 +129,13 @@ abstract class FilamentController {
Future removeIbl();
///
- /// Adds a dynamic light to the scene.
- /// copied from filament LightManager.h
- /// enum class Type : uint8_t {
- /// SUN, //!< Directional light that also draws a sun's disk in the sky.
- /// DIRECTIONAL, //!< Directional light, emits light in a given direction.
- /// POINT, //!< Point light, emits light from a position, in all directions.
- /// FOCUSED_SPOT, //!< Physically correct spot light.
- /// SPOT, //!< Spot light with coupling of outer cone and illumination disabled.
- /// };
+ /// Add a light to the scene.
+ /// See LightManager.h for details
+ /// Note that [sunAngularRadius] is in degrees,
+ /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians
+ ///
Future addLight(
- int type,
+ LightType type,
double colour,
double intensity,
double posX,
@@ -199,7 +144,13 @@ abstract class FilamentController {
double dirX,
double dirY,
double dirZ,
- bool castShadows);
+ {double falloffRadius = 1.0,
+ double spotLightConeInner = pi / 8,
+ double spotLightConeOuter = pi / 4,
+ double sunAngularRadius = 0.545,
+ double sunHaloSize = 10.0,
+ double sunHaloFallof = 80.0,
+ bool castShadows = true});
Future removeLight(FilamentEntity light);
@@ -276,11 +227,19 @@ abstract class FilamentController {
Future setMorphTargetWeights(FilamentEntity entity, List weights);
///
- /// Gets the names of all morph targets for the mesh [meshName] under [entity].
+ /// Gets the names of all morph targets for the child renderable [childEntity] under [entity].
///
Future> getMorphTargetNames(
- FilamentEntity entity, String meshName);
+ FilamentEntity entity, FilamentEntity childEntity);
+ ///
+ /// Gets the names of all bones for the armature at [skinIndex] under the specified [entity].
+ ///
+ Future> getBoneNames(FilamentEntity entity, {int skinIndex = 0});
+
+ ///
+ /// Gets the names of all glTF animations embedded in the specified entity.
+ ///
Future> getAnimationNames(FilamentEntity entity);
///
@@ -306,10 +265,62 @@ abstract class FilamentController {
Future resetBones(FilamentEntity entity);
///
- /// Transforms the bone(s)/joint(s) according [animation].
- /// To set the instantaneous transform, just use a single frame.
+ /// Enqueues and plays the [animation] for the specified bone(s).
+ /// By default, frame data is interpreted as being in *parent* bone space;
+ /// a 45 degree around Y means the bone will rotate 45 degrees around the
+ /// Y axis of the parent bone *in its current orientation*.
+ /// (i.e NOT the parent bone's rest position!).
+ /// Currently, only [Space.ParentBone] and [Space.Model] are supported; if you want
+ /// to transform to another space, you will need to do so manually.
///
- Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation);
+ Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation,
+ {int skinIndex = 0, double fadeInInSecs=0.0, double fadeOutInSecs=0.0});
+
+ ///
+ /// Gets the entity representing the bone at [boneIndex]/[skinIndex].
+ /// The returned entity is only intended for use with [getWorldTransform].
+ ///
+ Future getBone(FilamentEntity parent, int boneIndex,
+ {int skinIndex = 0});
+
+ ///
+ /// Gets the local (relative to parent) transform for [entity].
+ ///
+ Future getLocalTransform(FilamentEntity entity);
+
+ ///
+ /// Gets the world transform for [entity].
+ ///
+ Future getWorldTransform(FilamentEntity entity);
+
+ ///
+ /// Gets the inverse bind (pose) matrix for the bone.
+ /// Note that [parent] must be the FilamentEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc).
+ /// This is because all joint information is internally stored with the parent entity.
+ ///
+ Future getInverseBindMatrix(FilamentEntity parent, int boneIndex,
+ {int skinIndex = 0});
+
+ ///
+ /// Sets the transform (relative to its parent) for [entity].
+ ///
+ Future setTransform(FilamentEntity entity, Matrix4 transform);
+
+ ///
+ /// Updates the bone matrices for [entity] (which must be the FilamentEntity
+ /// returned by [loadGlb/loadGltf]).
+ /// Under the hood, this just calls [updateBoneMatrices] on the Animator
+ /// instance of the relevant FilamentInstance (which uses the local
+ /// bone transform and the inverse bind matrix to set the bone matrix).
+ ///
+ Future updateBoneMatrices(FilamentEntity entity);
+
+ ///
+ /// Directly set the bone matrix for the bone at the given index.
+ /// Don't call this manually unless you know what you're doing.
+ ///
+ Future setBoneTransform(
+ FilamentEntity entity, int boneIndex, Matrix4 transform, { int skinIndex=0});
///
/// Removes/destroys the specified entity from the scene.
@@ -380,7 +391,7 @@ abstract class FilamentController {
///
/// Sets the current scene camera to the glTF camera under [name] in [entity].
///
- Future setCameraFov(double degrees);
+ Future setCameraFov(double degrees, double width, double height);
///
/// Sets the tone mapping (requires postprocessing).
@@ -487,8 +498,8 @@ abstract class FilamentController {
///
/// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color].
///
- Future setMaterialColor(
- FilamentEntity entity, String meshName, int materialIndex, Color color);
+ Future setMaterialColor(FilamentEntity entity, String meshName,
+ int materialIndex, double r, double g, double b, double a);
///
/// Scale [entity] to fit within the unit cube.
@@ -618,6 +629,11 @@ abstract class FilamentController {
///
Future addAnimationComponent(FilamentEntity entity);
+ ///
+ /// Removes an animation component from [entity].
+ ///
+ Future removeAnimationComponent(FilamentEntity entity);
+
///
/// Makes [entity] collidable.
/// This allows you to call [testCollisions] with any other entity ("entity B") to see if [entity] has collided with entity B. The callback will be invoked if so.
@@ -640,7 +656,12 @@ abstract class FilamentController {
PrimitiveType primitiveType = PrimitiveType.TRIANGLES});
///
- /// Sets the parent transform of [child] to the transform of [parent].
+ /// Gets the parent transform of [child].
+ ///
+ Future getParent(FilamentEntity child);
+
+ ///
+ /// Sets the parent transform of [child] to [parent].
///
Future setParent(FilamentEntity child, FilamentEntity parent);
@@ -656,9 +677,14 @@ abstract class FilamentController {
Future setPriority(FilamentEntity entityId, int priority);
///
- /// The Scene holds the transform gizmo and all loaded entities/lights.
+ /// The Scene holds all loaded entities/lights.
///
Scene get scene;
+
+ ///
+ ///
+ ///
+ AbstractGizmo? get gizmo;
}
///
@@ -701,7 +727,19 @@ abstract class Scene {
void select(FilamentEntity entity);
///
- /// The transform gizmo.
///
- Gizmo get gizmo;
+ ///
+ void registerEntity(FilamentEntity entity);
+}
+
+abstract class AbstractGizmo {
+ bool get isActive;
+
+ void translate(double transX, double transY);
+
+ void reset();
+
+ void attach(FilamentEntity entity);
+
+ void detach();
}
diff --git a/dart_filament/lib/dart_filament/compatibility/compatibility.dart b/dart_filament/lib/dart_filament/compatibility/compatibility.dart
new file mode 100644
index 00000000..55e1f5e0
--- /dev/null
+++ b/dart_filament/lib/dart_filament/compatibility/compatibility.dart
@@ -0,0 +1,3 @@
+export 'web/compatibility.dart' if (dart.library.io) 'native/compatibility.dart';
+
+
diff --git a/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart b/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart
new file mode 100644
index 00000000..b8bdacac
--- /dev/null
+++ b/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart
@@ -0,0 +1,85 @@
+import 'dart:async';
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+export 'package:ffi/ffi.dart';
+export 'dart:ffi';
+export 'dart_filament.g.dart';
+
+final allocator = calloc;
+
+Future withVoidCallback(
+ Function(Pointer>) func) async {
+ final completer = Completer();
+ // ignore: prefer_function_declarations_over_variables
+ void Function() callback = () {
+ completer.complete();
+ };
+ final nativeCallable = NativeCallable.listener(callback);
+ func.call(nativeCallable.nativeFunction);
+ await completer.future;
+ nativeCallable.close();
+}
+
+Future withVoidPointerCallback(
+ Function(Pointer)>>)
+ func) async {
+ final completer = Completer>();
+ // ignore: prefer_function_declarations_over_variables
+ void Function(Pointer) callback = (Pointer ptr) {
+ completer.complete(ptr);
+ };
+ final nativeCallable =
+ NativeCallable)>.listener(callback);
+ func.call(nativeCallable.nativeFunction);
+ var ptr = await completer.future;
+ nativeCallable.close();
+ return ptr.address;
+}
+
+Future withBoolCallback(
+ Function(Pointer>) func) async {
+ final completer = Completer();
+ // ignore: prefer_function_declarations_over_variables
+ void Function(bool) callback = (bool result) {
+ completer.complete(result);
+ };
+ final nativeCallable = NativeCallable.listener(callback);
+ func.call(nativeCallable.nativeFunction);
+ await completer.future;
+ nativeCallable.close();
+ return completer.future;
+}
+
+Future withIntCallback(
+ Function(Pointer>) func) async {
+ final completer = Completer();
+ // ignore: prefer_function_declarations_over_variables
+ void Function(int) callback = (int result) {
+ completer.complete(result);
+ };
+ final nativeCallable =
+ NativeCallable.listener(callback);
+ func.call(nativeCallable.nativeFunction);
+ await completer.future;
+ nativeCallable.close();
+ return completer.future;
+}
+
+Future withCharPtrCallback(
+ Function(Pointer)>>)
+ func) async {
+ final completer = Completer();
+ // ignore: prefer_function_declarations_over_variables
+ void Function(Pointer) callback = (Pointer result) {
+ completer.complete(result.cast().toDartString());
+ };
+ final nativeCallable =
+ NativeCallable)>.listener(callback);
+ func.call(nativeCallable.nativeFunction);
+ await completer.future;
+ nativeCallable.close();
+ return completer.future;
+}
+
+class Compatibility {}
diff --git a/lib/filament/generated_bindings.dart b/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart
similarity index 61%
rename from lib/filament/generated_bindings.dart
rename to dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart
index ea667be2..3936caa2 100644
--- a/lib/filament/generated_bindings.dart
+++ b/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart
@@ -5,39 +5,41 @@
import 'dart:ffi' as ffi;
@ffi.Native<
- ffi.Pointer Function(
- ffi.Pointer,
- ffi.Pointer,
- ffi.Pointer,
- ffi.Pointer)>(
- symbol: 'create_filament_viewer', assetId: 'flutter_filament_plugin')
-external ffi.Pointer create_filament_viewer(
- ffi.Pointer context,
- ffi.Pointer loader,
- ffi.Pointer platform,
- ffi.Pointer uberArchivePath,
-);
-
-@ffi.Native)>(
- symbol: 'destroy_filament_viewer', assetId: 'flutter_filament_plugin')
-external void destroy_filament_viewer(
- ffi.Pointer viewer,
-);
-
-@ffi.Native<
- ffi.Pointer Function(
- LoadFilamentResourceFromOwner,
- FreeFilamentResourceFromOwner,
- ffi.Pointer)>(
- symbol: 'make_resource_loader', assetId: 'flutter_filament_plugin')
-external ffi.Pointer make_resource_loader(
+ ffi.Pointer Function(LoadFilamentResourceFromOwner,
+ FreeFilamentResourceFromOwner, ffi.Pointer)>(
+ symbol: 'make_resource_loader',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external ffi.Pointer make_resource_loader(
LoadFilamentResourceFromOwner loadFn,
FreeFilamentResourceFromOwner freeFn,
ffi.Pointer owner,
);
+@ffi.Native<
+ ffi.Pointer Function(
+ ffi.Pointer,
+ ffi.Pointer,
+ ffi.Pointer,
+ ffi.Pointer)>(
+ symbol: 'create_filament_viewer',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external ffi.Pointer create_filament_viewer(
+ ffi.Pointer context,
+ ffi.Pointer loader,
+ ffi.Pointer platform,
+ ffi.Pointer uberArchivePath,
+);
+
+@ffi.Native)>(
+ symbol: 'destroy_filament_viewer',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external void destroy_filament_viewer(
+ ffi.Pointer viewer,
+);
+
@ffi.Native Function(ffi.Pointer)>(
- symbol: 'get_scene_manager', assetId: 'flutter_filament_plugin')
+ symbol: 'get_scene_manager',
+ assetId: 'package:dart_filament/dart_filament.dart')
external ffi.Pointer get_scene_manager(
ffi.Pointer viewer,
);
@@ -45,7 +47,8 @@ external ffi.Pointer get_scene_manager(
@ffi.Native<
ffi.Void Function(
ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>(
- symbol: 'create_render_target', assetId: 'flutter_filament_plugin')
+ symbol: 'create_render_target',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void create_render_target(
ffi.Pointer viewer,
int texture,
@@ -54,7 +57,8 @@ external void create_render_target(
);
@ffi.Native)>(
- symbol: 'clear_background_image', assetId: 'flutter_filament_plugin')
+ symbol: 'clear_background_image',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void clear_background_image(
ffi.Pointer viewer,
);
@@ -62,7 +66,8 @@ external void clear_background_image(
@ffi.Native<
ffi.Void Function(
ffi.Pointer, ffi.Pointer, ffi.Bool)>(
- symbol: 'set_background_image', assetId: 'flutter_filament_plugin')
+ symbol: 'set_background_image',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_background_image(
ffi.Pointer viewer,
ffi.Pointer path,
@@ -72,7 +77,8 @@ external void set_background_image(
@ffi.Native<
ffi.Void Function(
ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(
- symbol: 'set_background_image_position', assetId: 'flutter_filament_plugin')
+ symbol: 'set_background_image_position',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_background_image_position(
ffi.Pointer viewer,
double x,
@@ -83,7 +89,8 @@ external void set_background_image_position(
@ffi.Native<
ffi.Void Function(
ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>(
- symbol: 'set_background_color', assetId: 'flutter_filament_plugin')
+ symbol: 'set_background_color',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_background_color(
ffi.Pointer viewer,
double r,
@@ -93,29 +100,31 @@ external void set_background_color(
);
@ffi.Native, ffi.Int)>(
- symbol: 'set_tone_mapping', assetId: 'flutter_filament_plugin')
+ symbol: 'set_tone_mapping',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_tone_mapping(
ffi.Pointer viewer,
int toneMapping,
);
@ffi.Native, ffi.Float)>(
- symbol: 'set_bloom', assetId: 'flutter_filament_plugin')
+ symbol: 'set_bloom', assetId: 'package:dart_filament/dart_filament.dart')
external void set_bloom(
ffi.Pointer viewer,
double strength,
);
@ffi.Native, ffi.Pointer)>(
- symbol: 'load_skybox', assetId: 'flutter_filament_plugin')
+ symbol: 'load_skybox', assetId: 'package:dart_filament/dart_filament.dart')
external void load_skybox(
ffi.Pointer viewer,
ffi.Pointer skyboxPath,
);
@ffi.Native<
- ffi.Void Function(ffi.Pointer, ffi.Pointer,
- ffi.Float)>(symbol: 'load_ibl', assetId: 'flutter_filament_plugin')
+ ffi.Void Function(
+ ffi.Pointer, ffi.Pointer, ffi.Float)>(
+ symbol: 'load_ibl', assetId: 'package:dart_filament/dart_filament.dart')
external void load_ibl(
ffi.Pointer viewer,
ffi.Pointer iblPath,
@@ -123,37 +132,45 @@ external void load_ibl(
);
@ffi.Native, ffi.Pointer)>(
- symbol: 'rotate_ibl', assetId: 'flutter_filament_plugin')
+ symbol: 'rotate_ibl', assetId: 'package:dart_filament/dart_filament.dart')
external void rotate_ibl(
ffi.Pointer viewer,
ffi.Pointer rotationMatrix,
);
@ffi.Native)>(
- symbol: 'remove_skybox', assetId: 'flutter_filament_plugin')
+ symbol: 'remove_skybox',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void remove_skybox(
ffi.Pointer viewer,
);
@ffi.Native)>(
- symbol: 'remove_ibl', assetId: 'flutter_filament_plugin')
+ symbol: 'remove_ibl', assetId: 'package:dart_filament/dart_filament.dart')
external void remove_ibl(
ffi.Pointer viewer,
);
@ffi.Native<
- EntityId Function(
- ffi.Pointer,
- ffi.Uint8,
- ffi.Float,
- ffi.Float,
- ffi.Float,
- ffi.Float,
- ffi.Float,
- ffi.Float,
- ffi.Float,
- ffi.Float,
- ffi.Bool)>(symbol: 'add_light', assetId: 'flutter_filament_plugin')
+ EntityId Function(
+ ffi.Pointer,
+ ffi.Uint8,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Float,
+ ffi.Bool)>(
+ symbol: 'add_light', assetId: 'package:dart_filament/dart_filament.dart')
external int add_light(
ffi.Pointer viewer,
int type,
@@ -165,25 +182,32 @@ external int add_light(
double dirX,
double dirY,
double dirZ,
+ double falloffRadius,
+ double spotLightConeInner,
+ double spotLightConeOuter,
+ double sunAngularRadius,
+ double sunHaloSize,
+ double sunHaloFallof,
bool shadows,
);
@ffi.Native, EntityId)>(
- symbol: 'remove_light', assetId: 'flutter_filament_plugin')
+ symbol: 'remove_light', assetId: 'package:dart_filament/dart_filament.dart')
external void remove_light(
ffi.Pointer viewer,
int entityId,
);
@ffi.Native)>(
- symbol: 'clear_lights', assetId: 'flutter_filament_plugin')
+ symbol: 'clear_lights', assetId: 'package:dart_filament/dart_filament.dart')
external void clear_lights(
ffi.Pointer viewer,
);
@ffi.Native<
- EntityId Function(ffi.Pointer, ffi.Pointer,
- ffi.Int)>(symbol: 'load_glb', assetId: 'flutter_filament_plugin')
+ EntityId Function(
+ ffi.Pointer, ffi.Pointer, ffi.Int)>(
+ symbol: 'load_glb', assetId: 'package:dart_filament/dart_filament.dart')
external int load_glb(
ffi.Pointer sceneManager,
ffi.Pointer assetPath,
@@ -193,7 +217,8 @@ external int load_glb(
@ffi.Native<
EntityId Function(
ffi.Pointer, ffi.Pointer, ffi.Size)>(
- symbol: 'load_glb_from_buffer', assetId: 'flutter_filament_plugin')
+ symbol: 'load_glb_from_buffer',
+ assetId: 'package:dart_filament/dart_filament.dart')
external int load_glb_from_buffer(
ffi.Pointer sceneManager,
ffi.Pointer data,
@@ -203,7 +228,7 @@ external int load_glb_from_buffer(
@ffi.Native<
EntityId Function(ffi.Pointer, ffi.Pointer,
ffi.Pointer)>(
- symbol: 'load_gltf', assetId: 'flutter_filament_plugin')
+ symbol: 'load_gltf', assetId: 'package:dart_filament/dart_filament.dart')
external int load_gltf(
ffi.Pointer sceneManager,
ffi.Pointer assetPath,
@@ -211,14 +236,16 @@ external int load_gltf(
);
@ffi.Native, EntityId)>(
- symbol: 'create_instance', assetId: 'flutter_filament_plugin')
+ symbol: 'create_instance',
+ assetId: 'package:dart_filament/dart_filament.dart')
external int create_instance(
ffi.Pointer sceneManager,
int id,
);
@ffi.Native, EntityId)>(
- symbol: 'get_instance_count', assetId: 'flutter_filament_plugin')
+ symbol: 'get_instance_count',
+ assetId: 'package:dart_filament/dart_filament.dart')
external int get_instance_count(
ffi.Pointer sceneManager,
int entityId,
@@ -227,7 +254,8 @@ external int get_instance_count(
@ffi.Native<
ffi.Void Function(
ffi.Pointer, EntityId, ffi.Pointer)>(
- symbol: 'get_instances', assetId: 'flutter_filament_plugin')
+ symbol: 'get_instances',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void get_instances(
ffi.Pointer sceneManager,
int entityId,
@@ -235,13 +263,15 @@ external void get_instances(
);
@ffi.Native)>(
- symbol: 'set_main_camera', assetId: 'flutter_filament_plugin')
+ symbol: 'set_main_camera',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_main_camera(
ffi.Pointer viewer,
);
@ffi.Native)>(
- symbol: 'get_main_camera', assetId: 'flutter_filament_plugin')
+ symbol: 'get_main_camera',
+ assetId: 'package:dart_filament/dart_filament.dart')
external int get_main_camera(
ffi.Pointer viewer,
);
@@ -249,15 +279,16 @@ external int get_main_camera(
@ffi.Native<
ffi.Bool Function(
ffi.Pointer, EntityId, ffi.Pointer)>(
- symbol: 'set_camera', assetId: 'flutter_filament_plugin')
+ symbol: 'set_camera', assetId: 'package:dart_filament/dart_filament.dart')
external bool set_camera(
ffi.Pointer viewer,
- int asset,
+ int entity,
ffi.Pointer nodeName,
);
@ffi.Native, ffi.Bool)>(
- symbol: 'set_view_frustum_culling', assetId: 'flutter_filament_plugin')
+ symbol: 'set_view_frustum_culling',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_view_frustum_culling(
ffi.Pointer viewer,
bool enabled,
@@ -273,7 +304,7 @@ external void set_view_frustum_culling(
ffi.Void Function(ffi.Pointer buf, ffi.Size size,
ffi.Pointer data)>>,
ffi.Pointer)>(
- symbol: 'render', assetId: 'flutter_filament_plugin')
+ symbol: 'render', assetId: 'package:dart_filament/dart_filament.dart')
external void render(
ffi.Pointer viewer,
int frameTimeInNanos,
@@ -289,7 +320,8 @@ external void render(
@ffi.Native<
ffi.Void Function(ffi.Pointer, ffi.Pointer,
ffi.Uint32, ffi.Uint32)>(
- symbol: 'create_swap_chain', assetId: 'flutter_filament_plugin')
+ symbol: 'create_swap_chain',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void create_swap_chain(
ffi.Pointer viewer,
ffi.Pointer window,
@@ -298,13 +330,15 @@ external void create_swap_chain(
);
@ffi.Native)>(
- symbol: 'destroy_swap_chain', assetId: 'flutter_filament_plugin')
+ symbol: 'destroy_swap_chain',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void destroy_swap_chain(
ffi.Pointer viewer,
);
@ffi.Native, ffi.Float)>(
- symbol: 'set_frame_interval', assetId: 'flutter_filament_plugin')
+ symbol: 'set_frame_interval',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void set_frame_interval(
ffi.Pointer viewer,
double interval,
@@ -314,7 +348,7 @@ external void set_frame_interval(
ffi.Void Function(
ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float)>(
symbol: 'update_viewport_and_camera_projection',
- assetId: 'flutter_filament_plugin')
+ assetId: 'package:dart_filament/dart_filament.dart')
external void update_viewport_and_camera_projection(
ffi.Pointer viewer,
int width,
@@ -323,14 +357,16 @@ external void update_viewport_and_camera_projection(
);
@ffi.Native)>(
- symbol: 'scroll_begin', assetId: 'flutter_filament_plugin')
+ symbol: 'scroll_begin', assetId: 'package:dart_filament/dart_filament.dart')
external void scroll_begin(
ffi.Pointer viewer,
);
@ffi.Native<
- ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float,
- ffi.Float)>(symbol: 'scroll_update', assetId: 'flutter_filament_plugin')
+ ffi.Void Function(
+ ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>(
+ symbol: 'scroll_update',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void scroll_update(
ffi.Pointer viewer,
double x,
@@ -339,14 +375,15 @@ external void scroll_update(
);
@ffi.Native)>(
- symbol: 'scroll_end', assetId: 'flutter_filament_plugin')
+ symbol: 'scroll_end', assetId: 'package:dart_filament/dart_filament.dart')
external void scroll_end(
ffi.Pointer viewer,
);
@ffi.Native<
- ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float,
- ffi.Bool)>(symbol: 'grab_begin', assetId: 'flutter_filament_plugin')
+ ffi.Void Function(
+ ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>(
+ symbol: 'grab_begin', assetId: 'package:dart_filament/dart_filament.dart')
external void grab_begin(
ffi.Pointer viewer,
double x,
@@ -355,7 +392,7 @@ external void grab_begin(
);
@ffi.Native, ffi.Float, ffi.Float)>(
- symbol: 'grab_update', assetId: 'flutter_filament_plugin')
+ symbol: 'grab_update', assetId: 'package:dart_filament/dart_filament.dart')
external void grab_update(
ffi.Pointer viewer,
double x,
@@ -363,21 +400,19 @@ external void grab_update(
);
@ffi.Native)>(
- symbol: 'grab_end', assetId: 'flutter_filament_plugin')
+ symbol: 'grab_end', assetId: 'package:dart_filament/dart_filament.dart')
external void grab_end(
ffi.Pointer viewer,
);
@ffi.Native<
- ffi.Void Function(
- ffi.Pointer,
- EntityId,
- ffi.Pointer,
- ffi.Pointer,
- ffi.Int)>(symbol: 'apply_weights', assetId: 'flutter_filament_plugin')
+ ffi.Void Function(ffi.Pointer, EntityId,
+ ffi.Pointer, ffi.Pointer, ffi.Int)>(
+ symbol: 'apply_weights',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void apply_weights(
ffi.Pointer sceneManager,
- int asset,
+ int entity,
ffi.Pointer entityName,
ffi.Pointer weights,
int count,
@@ -386,10 +421,11 @@ external void apply_weights(
@ffi.Native<
ffi.Bool Function(
ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>(
- symbol: 'set_morph_target_weights', assetId: 'flutter_filament_plugin')
+ symbol: 'set_morph_target_weights',
+ assetId: 'package:dart_filament/dart_filament.dart')
external bool set_morph_target_weights(
ffi.Pointer sceneManager,
- int asset,
+ int entity,
ffi.Pointer morphData,
int numWeights,
);
@@ -403,10 +439,11 @@ external bool set_morph_target_weights(
ffi.Int,
ffi.Int,
ffi.Float)>(
- symbol: 'set_morph_animation', assetId: 'flutter_filament_plugin')
+ symbol: 'set_morph_animation',
+ assetId: 'package:dart_filament/dart_filament.dart')
external bool set_morph_animation(
ffi.Pointer sceneManager,
- int asset,
+ int entity,
ffi.Pointer morphData,
ffi.Pointer morphIndices,
int numMorphTargets,
@@ -415,59 +452,99 @@ external bool set_morph_animation(
);
@ffi.Native, EntityId)>(
- symbol: 'reset_to_rest_pose', assetId: 'flutter_filament_plugin')
+ symbol: 'reset_to_rest_pose',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void reset_to_rest_pose(
ffi.Pointer sceneManager,
int asset,
);
@ffi.Native<
- ffi.Void Function(
- ffi.Pointer,
- EntityId,
- ffi.Pointer,
- ffi.Int,
- ffi.Pointer,
- ffi.Pointer>,
- ffi.Int,
- ffi.Float,
- ffi.Bool)>(
- symbol: 'add_bone_animation', assetId: 'flutter_filament_plugin')
+ ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int,
+ ffi.Pointer, ffi.Int, ffi.Float, ffi.Float, ffi.Float)>(
+ symbol: 'add_bone_animation',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void add_bone_animation(
ffi.Pointer sceneManager,
- int asset,
+ int entity,
+ int skinIndex,
+ int boneIndex,
ffi.Pointer frameData,
int numFrames,
- ffi.Pointer boneName,
- ffi.Pointer> meshNames,
- int numMeshTargets,
double frameLengthInMs,
- bool isModelSpace,
+ double fadeOutInSecs,
+ double fadeInInSecs,
);
@ffi.Native<
- ffi.Bool Function(
- ffi.Pointer,
- EntityId,
- ffi.Pointer,
- ffi.Pointer,
- ffi.Pointer)>(
- symbol: 'set_bone_transform', assetId: 'flutter_filament_plugin')
+ ffi.Void Function(
+ ffi.Pointer, EntityId, ffi.Pointer)>(
+ symbol: 'get_local_transform',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external void get_local_transform(
+ ffi.Pointer sceneManager,
+ int entityId,
+ ffi.Pointer arg2,
+);
+
+@ffi.Native<
+ ffi.Void Function(ffi.Pointer, EntityId, ffi.Int,
+ ffi.Pointer, ffi.Int)>(
+ symbol: 'get_rest_local_transforms',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external void get_rest_local_transforms(
+ ffi.Pointer sceneManager,
+ int entityId,
+ int skinIndex,
+ ffi.Pointer out,
+ int numBones,
+);
+
+@ffi.Native<
+ ffi.Void Function(
+ ffi.Pointer, EntityId, ffi.Pointer)>(
+ symbol: 'get_world_transform',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external void get_world_transform(
+ ffi.Pointer sceneManager,
+ int entityId,
+ ffi.Pointer arg2,
+);
+
+@ffi.Native<
+ ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int,
+ ffi.Pointer)>(
+ symbol: 'get_inverse_bind_matrix',
+ assetId: 'package:dart_filament/dart_filament.dart')
+external void get_inverse_bind_matrix(
+ ffi.Pointer sceneManager,
+ int entityId,
+ int skinIndex,
+ int boneIndex,
+ ffi.Pointer arg4,
+);
+
+@ffi.Native<
+ ffi.Bool Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int,
+ ffi.Pointer)>(
+ symbol: 'set_bone_transform',
+ assetId: 'package:dart_filament/dart_filament.dart')
external bool set_bone_transform(
ffi.Pointer sceneManager,
- int asset,
- ffi.Pointer entityName,
+ int entity,
+ int skinIndex,
+ int boneIndex,
ffi.Pointer transform,
- ffi.Pointer boneName,
);
@ffi.Native<
ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool,
ffi.Bool, ffi.Bool, ffi.Float)>(
- symbol: 'play_animation', assetId: 'flutter_filament_plugin')
+ symbol: 'play_animation',
+ assetId: 'package:dart_filament/dart_filament.dart')
external void play_animation(
ffi.Pointer