_thermionViewer;
+ void initState() { _thermionFlutterPlugin = ThermionFlutterPlugin(); _thermionViewer = _thermionFlutterPlugin.createViewer(); } Widget build(BuildContext context) { return Stack(children:[ Positioned.fill( child:ThermionWidget( plugin:_thermionFlutterPlugin ) ) ]); }}```
+
+[0] Currently, the rendering surface on Windows and Web will always appear at the bottom of the application. You still need a ThermionWidget, but this only keeps track of the dimensions of your viewport and punches a transparent hole in the hierarchy; the actual rendering surface is attached beneath the Flutter window.
+`ThermionWidget` will not display the rendering surface (even an empty one) until the call to `createViewer` has been completed.
+- 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 ThermionWidget constructor.on the second frame, ThermionWidget will pass its dimensions/pixel ratio to the FilamentController
+
+ 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 threada ThermionViewerFFI and an AssetManager, which will allow you to load assets/cameras/lighting/etc via the FilamentControllerafter an indeterminate number of frames, FilamentController will notify ThermionWidget when a rendering surface is available the viewportThermionWidget 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 ThermionWidget, calling createViewer and the actual rendering viewport becoming available. This is why we fill ThermionWidget 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.
+
+
+
+
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index ba75c69f..00000000
--- a/LICENSE
+++ /dev/null
@@ -1 +0,0 @@
-TODO: Add your license here.
diff --git a/Makefile b/Makefile
index 6b6f095c..2534cd72 100644
--- a/Makefile
+++ b/Makefile
@@ -1,27 +1,32 @@
-mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
-current_dir := $(dir $(mkfile_path))
-parent_dir := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/..)
+dart-web:
+ cd thermion_dart/native/web; mkdir -p build && cd build && emcmake cmake .. && emmake make
+dart-web-clean:
+ cd thermion_dart/native/web && rm -rf build
+dart-wasm-cli-example: dart-web-clean dart-web
+ cd thermion_dart/examples/cli_wasm/bin && dart compile wasm example_cli.dart && node main.js
+dart-web-example: dart-web
+ cp thermion_dart/native/web/build/build/out/thermion_dart* examples/web_wasm/bin
+ cd thermion_dart/examples/web_wasm/bin && dart compile wasm example_web.dart
+flutter-example-web: dart-web-clean dart-web
+ cd thermion_flutter_federated/thermion_flutter/example/web && dart compile wasm main.dart && cd .. && flutter build web --wasm --profile
+flutter-example-macos:
+ cd thermion_flutter_federated/thermion_flutter/example/web && flutter run -d macos
+swift-bindings:
+ cd thermion_dart/ && dart --enable-experiment=native-assets run ffigen --config ffigen/swift.yaml
+bindings:
+ cd thermion_dart/ && dart --enable-experiment=native-assets run ffigen --config ffigen/native.yaml
-filament_build_out := $(parent_dir)/filament/out/cmake-release
-
-# 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
+# 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
+# eg: FILAMENT_PATH=/path/to/filament/out/release/bin make materials
+#
+materials: FORCE
+ @echo "Using Filament build from ${FILAMENT_PATH}"
+ ${FILAMENT_PATH}/matc -a opengl -a metal -o materials/image.filamat materials/image.mat
+ $(FILAMENT_PATH)/resgen -c -p image -x ios/include/material/ materials/image.filamat
+ $(FILAMENT_PATH)/matc -a opengl -a metal -o materials/gizmo.filamat materials/gizmo.mat
+ $(FILAMENT_PATH)/resgen -c -p gizmo -x ios/include/material/ materials/gizmo.filamat
+ #rm materials/*.filamat
FORCE: ;
-
-# We use a single material (no lighting and no transparency) for background images
-#
-# by default this assumes you have built filament in a sibling folder
-# you may customize the out folder by speicifying `filament_build_out`
-#
-# eg: make generate-background-material filament_build_out=/filament/out/release
-#
-generate-background-material:
- ${filament_build_out}/tools/matc/matc -a opengl -a metal -o materials/image.filamat materials/image.mat
- ${filament_build_out}/tools/resgen/resgen -c -p image -x ios/include/material/ materials/image.filamat
- rm materials/image.filamat
+
diff --git a/README.md b/README.md
index 0580b9c1..cf13fe81 100644
--- a/README.md
+++ b/README.md
@@ -1,436 +1,37 @@
-# Flutter Filament
+
-Cross-platform, 3D PBR rendering and animation for [Flutter](https://github.com/google/filament).
+
+ Quickstart (Flutter) •
+ Documentation •
+ Showcase •
+ Discord
+
-Wraps the [the Filament rendering library](https://github.com/google/filament).
+## Cross-platform 3D engine for Dart and Flutter.
-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.
+### Features
+- Supports iOS (arm64), MacOS (arm64/x64), Android (arm64), Windows (x64) (>= 10), Web/WASM
+- glTF, KTX, PNG & JPEG texture support
+- camera/entity manipulation with mouse (desktop) and gestures (mobile)
+- skinning + morph animations
+### Sponsors, Contributors & Acknowledgments
-https://github.com/nmfisher/flutter_filament/assets/7238578/42cd9641-e100-4a1d-8423-810d53559c71
-
-
-
-|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)|
+Thermion uses the [Filament](https://github.com/google/filament) physically based rendering package under the hood.
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.
+Thank you to the following people:
-## Getting Started
+- @Hannnes1 for help migrating to `native-assets`
+- @jarrodcolburn for documentation contributions
+- @daverin for MacOS library contributions
+- @LukasPoque for CI/refactoring work
+- @alexmercerind for his work on integrating ANGLE textures on Flutter Windows
-This package requires Flutter >= `3.16.0`.
-
-```bash
-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:
-
-```bash
-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:
-
-```bash
-cd example && flutter run -d
-```
-
-To use the plugin in your own project, add the plugin to your pubspec.yaml:
-
-```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:
-
-```dart
-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`.
-
-```dart
-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 `AssetManager`, 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:
-```dart
-await _filamentController.loadSkybox("assets/default_env/default_env_skybox.ktx)
-```
-
-or a static background image:
-
-```dart
-await _filamentController.setBackgroundImage("assets/background.ktx)
-```
-
-or a solid background color:
-
-```dart
-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.
-
-```dart
-await _filamentController.render()
-```
-
-You should now see your background displayed in the scene. To automatically render at 60fps, call `setRendering`:
-```dart
-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:
-```yaml
-flutter:
- assets:
- - assets/models/bob.glb
-```
-
-Then you would call the following
-```dart
-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:
-```dart
-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:
-```dart
-await _filamentController.removeAsset(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 `removeAsset` or `clearAssets`. 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:
-
-```dart
-await _filamentController.loadIbl("assets/default_env/default_env_ibl.ktx");
-```
-
-You can also add dynamic lights:
-
-```dart
-var sun = await _filamentController.addLight(
-```
-
-### Manipulating entity transforms
-
-To set the world space position of the asset:
-```dart
-_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`:
-
-```dart
-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.
-
-```dart
-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.
-
-```dart
-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:
-
-```bash
-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:
-
-```bash
-./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
-
-```bash
-git clone git@github.com:nmfisher/filament.git && cd filament
-```
-
-## Android/iOS/MacOS
-
-```bash
-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.
-
-```bash
-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.
-
-```bash
-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:
-
-```bash
-make generate-background-material
-```
-
-# Known issues
-
-On 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.
-
-# Thanks
-
-- https://github.com/alexmercerind/flutter-windows-ANGLE-OpenGL-ES
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 7a337f0e..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/AssetManager.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/settings.gradle b/android/settings.gradle
deleted file mode 100644
index d7463b36..00000000
--- a/android/settings.gradle
+++ /dev/null
@@ -1 +0,0 @@
-rootProject.name = 'flutter_filament'
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/docs.json b/docs.json
new file mode 100644
index 00000000..f177d25e
--- /dev/null
+++ b/docs.json
@@ -0,0 +1,16 @@
+{
+ "name": "Thermion",
+ "description": "3D rendering framework for Dart and/or Flutter",
+ "logo": "logo.png",
+ "sidebar": [
+ [
+ "Getting Started",
+ [
+ ["Overview", "/"],
+ ["Quick Start", "/quickstart"]
+ ]
+ ],
+ ["Misc.", [["Contributing", "/contributing"]]]
+ ]
+
+}
diff --git a/docs/android.mdx b/docs/android.mdx
new file mode 100644
index 00000000..4020b554
--- /dev/null
+++ b/docs/android.mdx
@@ -0,0 +1,12 @@
+## Android
+
+In release mode, you must add the following to your `app/build.gradle`:
+
+```
+ buildTypes {
+ release {
+ shrinkResources false
+ minifyEnabled false
+ }
+ }
+```
\ No newline at end of file
diff --git a/docs/another-page.mdx b/docs/another-page.mdx
new file mode 100644
index 00000000..581e0d15
--- /dev/null
+++ b/docs/another-page.mdx
@@ -0,0 +1 @@
+# Another Page
\ No newline at end of file
diff --git a/docs/contributing.mdx b/docs/contributing.mdx
new file mode 100644
index 00000000..a4466ca5
--- /dev/null
+++ b/docs/contributing.mdx
@@ -0,0 +1,6 @@
+## Contributing
+
+Thermion is an open source project and we welcome all contributions from every level of experience.
+
+Please [join us on Discord](https://discord.gg/h2VdDK3EAQ) if you'd like some guidance or just want to chat.
+
diff --git a/docs/examples.mdx b/docs/examples.mdx
new file mode 100644
index 00000000..c6ccb62b
--- /dev/null
+++ b/docs/examples.mdx
@@ -0,0 +1,8 @@
+# Examples
+Thermion is a package for creating 3D applications with Dart and/or Flutter.
+
+## Polyvox
+
+iOS app
+
+## Nick Fisher (Personal Website)
\ No newline at end of file
diff --git a/docs/filament.mdx b/docs/filament.mdx
new file mode 100644
index 00000000..165154f0
--- /dev/null
+++ b/docs/filament.mdx
@@ -0,0 +1,46 @@
+## Filament
+
+Thermion uses the [Filament](https://github.com/google/filament) PBR package for much of the heavy lifting - rendering, materials, glTF, and so on.
+
+Thermion is currently based on the `1.51.2` release of Filament.
+
+## Building your own materials
+
+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.
+
+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
+
+Only the WebGL2/WASM build differs from the official Filament build.
+
+- Note also need to specifically build imageio/png/tinyexr
+
+
+
+
diff --git a/ARCHITECTURE.md b/docs/flutter.mdx
similarity index 98%
rename from ARCHITECTURE.md
rename to docs/flutter.mdx
index 8b952df9..85cec869 100644
--- a/ARCHITECTURE.md
+++ b/docs/flutter.mdx
@@ -11,7 +11,7 @@ This is an overview of how the rendering surface is constructed, and how the Flu
|iOS|CVPixelBuffer surface (Metal) + Flutter Texture widget|
|MacOS|CVMetalTexture render target (Metal) + Flutter Texture widget|
-On most platforms, we create Filament with a headless swapchain, then render into a (hardware accelerated) texture that Flutter imports into its own widget hierarchy via a Texture widget. This allows the Filament viewport to be transformed/composed completely within the Flutter hierarchy (i.e. you could rotate/scale/translate the FilamentWidget in Flutter if you wanted, or insert other widgets above/below).
+On most platforms, we create Filament with a headless swapchain, then render into a (hardware accelerated) texture that Flutter imports into its own widget hierarchy via a Texture widget. This allows the Filament viewport to be transformed/composed completely within the Flutter hierarchy (i.e. you could rotate/scale/translate the ThermionWidget in Flutter if you wanted, or insert other widgets above/below).
Due to performance issues on Windows, we choose a different default approach where Filament renders into its own window, which is then composed with the Flutter window via the system compositor. This only works on Windows 10.
diff --git a/docs/images/drawing.png b/docs/images/drawing.png
new file mode 100644
index 00000000..87e1931d
--- /dev/null
+++ b/docs/images/drawing.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:198e1d357c8690e2c3c994acf16b78c48ba33c09cd17ea94a1da41cfa49bb6e9
+size 79668
diff --git a/docs/images/drawing.svg b/docs/images/drawing.svg
new file mode 100644
index 00000000..33f58053
--- /dev/null
+++ b/docs/images/drawing.svg
@@ -0,0 +1,313 @@
+
+
+
+
diff --git a/docs/images/macos_min_deployment.png b/docs/images/macos_min_deployment.png
new file mode 100644
index 00000000..121bdbf4
Binary files /dev/null and b/docs/images/macos_min_deployment.png differ
diff --git a/docs/images/thermion_sample_project.png b/docs/images/thermion_sample_project.png
new file mode 100644
index 00000000..c06cee09
Binary files /dev/null and b/docs/images/thermion_sample_project.png differ
diff --git a/docs/index.mdx b/docs/index.mdx
new file mode 100644
index 00000000..b119fc1f
--- /dev/null
+++ b/docs/index.mdx
@@ -0,0 +1,25 @@
+
+
+Thermion is a framework for creating cross-platform 3D applications with Dart and/or Flutter.
+
+## Overview
+
+### Package structure
+
+Thermion is divided into two packages:
+- `thermion_flutter`, a Flutter package for creating/embedding a rendering surface inside a Flutter app.
+- `thermion_dart`, which contains all the code needed to create a viewer.
+
+With this structure, the Flutter-specific components are not coupled to the Dart components, meaning Thermion can be used for rendering in both Flutter and non-Flutter applications.
+
+For example, Thermion ships with examples for rendering with Dart only (no Flutter) with a CLI/headless application on MacOS, and with a Javascript/WASM/HTML applicaiton in browsers.
+
+`thermion_flutter` exports `thermion_dart`, so if you are working with a Flutter application, you will only need to import `thermion_fluttter`.
+
+### ThermionViewer (`thermion_dart`)
+
+// TODO
+
+### ThermionWidget (`thermion_flutter`)
+
+// TODO
diff --git a/docs/logo.png b/docs/logo.png
new file mode 100644
index 00000000..db74c00d
Binary files /dev/null and b/docs/logo.png differ
diff --git a/docs/logo_square.png b/docs/logo_square.png
new file mode 100644
index 00000000..70597c0c
Binary files /dev/null and b/docs/logo_square.png differ
diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx
new file mode 100644
index 00000000..ad685fed
--- /dev/null
+++ b/docs/quickstart.mdx
@@ -0,0 +1,209 @@
+## Quickstart (Flutter)
+
+> You can find the entire project below in the [examples/flutter/quickstart](examples/flutter/quickstart) folder of the repository.
+
+1. Switch to Flutter master channel, create a new project, then add `thermion_flutter` as a dependency
+
+```bash
+$ flutter channel master
+$ flutter config --enable-native-assets
+$ flutter create thermion_sample_project && cd thermion_sample_project
+$ flutter pub add thermion_flutter
+```
+
+2. If running on iOS or MacOS, change the minimum deployment target to OSX 13
+
+
+
+Make sure the `platform` entry refers to `13.0` in your Podfile.
+
+In `macos/Podfile` (for macOS):
+```
+platform :osx, '13.0'
+```
+
+In `ios/Podfile`, (for iOS):
+```
+platform :ios, '13.0'
+```
+
+Then open XCode:
+```
+open macos/Runner.xcworkspace
+```
+
+and change the minimum deployment target to 13.0:
+
+
+
+
+
+2. Add a folder containing your assets (glTF model + skybox ktx) to your `pubspec.yaml` asset list
+
+```yaml
+...
+flutter
+ uses-material-design: true
+ assets:
+ - assets/
+```
+
+3. Create an instance of `ThermionFlutterPlugin` in your app.
+
+```dart
+
+class _MyAppState extends State {
+ late ThermionFlutterPlugin _thermionFlutterPlugin;
+ late Future _thermionViewer;
+ void initState() {
+ _thermionFlutterPlugin = ThermionFlutterPlugin();
+ _thermionViewer = _thermionFlutterPlugin.createViewer();
+ }
+}
+
+```
+
+
+4. Add a `ThermionWidget` to your widget hierarchy
+
+```dart
+
+class _MyAppState extends State {
+
+ late ThermionFlutterPlugin _thermionFlutterPlugin;
+ late Future _thermionViewer;
+ void initState() {
+ _thermionFlutterPlugin = ThermionFlutterPlugin();
+ _thermionViewer = _thermionFlutterPlugin.initialize();
+ }
+
+ Widget build(BuildContext context) {
+ return Stack(children:[
+ Positioned.fill(
+ child:ThermionWidget(
+ plugin:_thermionFlutterPlugin
+ )
+ )
+ ]);
+ }
+}
+
+```
+
+4. Add a button to load the model when pressed
+
+```dart
+
+...
+
+class _MyAppState extends State {
+
+...
+
+ bool _loaded = false;
+
+ Widget build(BuildContext context) {
+ return Stack(children:[
+ Positioned.fill(
+ child:ThermionWidget(
+ plugin:_thermionFlutterPlugin
+ )
+ ),
+ if (!_loaded)
+ Center(
+ child: ElevatedButton(
+ child: const Text("Load"),
+ onPressed: () async {
+ // TODO
+ _loaded = true;
+ setState(() {});
+ }))
+ ]);
+}}
+```
+
+5. When the button is pressed, load a skybox, lighting and the glb asset
+
+You will need to import the `dart:math` and `package:vector_math` libraries.
+
+```dart
+import 'package:vector_math/vector_math_64.dart' as v;
+import 'dart:math';
+
+...
+
+class _MyAppState extends State {
+
+ ...
+
+ Widget build(BuildContext context) {
+ return Stack(children:[
+ ...
+ if(!_loaded)
+ Center(
+ child: ElevatedButton(
+ child: const Text("Load"),
+ onPressed: () async {
+ var viewer = await _thermionViewer;
+ await viewer.loadIbl("assets/default_env_ibl.ktx");
+ await viewer.loadSkybox("assets/default_env_skybox.ktx");
+ await viewer.loadGlb("assets/cube.glb");
+
+ await viewer.setCameraPosition(0, 1, 10);
+ await viewer.setCameraRotation(v.Quaternion.axisAngle(
+ v.Vector3(1, 0, 0), -30 / 180 * pi) *
+ v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi));
+ await viewer.addLight(
+ LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
+ await viewer.setRendering(true);
+ _loaded = true;
+ setState(() {});
+ }
+ )
+ )
+ ]);
+ }
+}
+```
+
+Here, we've added a skybox (the background (cube) image rendered behind all other elements in the scene), image-based lighting (where an image is used to determine the direction and intensity of a light source) and a directional light (Sun).
+
+Anything added to the scene is referred to as an "entity" (including lights and cameras).
+
+Entities are always added to the scene at position (0,0,0).
+
+The default scene camera is located at (0,0,0) (and is looking at -Z, or "into" the screen), so by adding a cube at (0,0,0), the camera will now be inside the cube.
+
+We need to move the camera outside the cube so it's visible.
+
+6. Change the camera orientation
+```dart
+ var viewer = await _thermionViewer;
+ await viewer.loadSkybox("assets/default_env_skybox.ktx");
+ await viewer.loadGlb("assets/cube.glb");
+
+ await viewer.setCameraPosition(0, 1, 10);
+ await viewer.setCameraRotation(v.Quaternion.axisAngle(
+ v.Vector3(1, 0, 0), -30 / 180 * pi) *
+ v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi));
+```
+
+The cube still won't be visible until we add a light to the scene and tell Thermion to start rendering.
+
+7. Add a light and turn rendering on
+```dart
+ ...
+ await viewer.addLight(
+ LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
+ await viewer.setRendering(true);
+ ...
+````
+
+8. Run the project
+```
+$ flutter run -d macos
+```
+
+
+
+Your first Thermion project is complete!
\ No newline at end of file
diff --git a/docs/windows.mdx b/docs/windows.mdx
new file mode 100644
index 00000000..c2644256
--- /dev/null
+++ b/docs/windows.mdx
@@ -0,0 +1,24 @@
+## Windows
+
+## pubspec.yaml
+
+On Windows, you will need to add a custom version of `native_toolchain_c` to your `dependency_overrides`. This is currently needed to link static libraries when building a DLL.
+
+```
+native_toolchain_c:
+ git:
+ url: git@github.com:nmfisher/native.git
+ path: pkgs/native_toolchain_c
+ ref: 99020084c4687be4c58c7115a167088c0441d1de
+```
+
+This will eventually be fixed upstream in the `native_toolchain_c` package, so this should be a short-term/temporary issue only.
+
+## ANGLE build (not currently working)
+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).
+
+```
+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
+```
\ No newline at end of file
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
deleted file mode 100644
index 60b5af61..00000000
--- a/example/android/app/build.gradle
+++ /dev/null
@@ -1,81 +0,0 @@
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-android-extensions'
-
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
-android {
- compileSdkVersion 33
- ndkVersion "25.2.9519653"
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- kotlinOptions {
- jvmTarget = '1.8'
- }
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- defaultConfig {
- applicationId "app.polyvox.flutter_filament_example"
- minSdkVersion 22
- targetSdkVersion 31
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- ndk {
- abiFilters 'arm64-v8a' // 'x86_64' 'armeabi-v7a'
- }
- }
-
- buildTypes {
- release {
- signingConfig signingConfigs.debug
- minifyEnabled true
- shrinkResources true
- proguardFiles getDefaultProguardFile(
- 'proguard-android-optimize.txt'),
- 'proguard-rules.pro'
- }
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2"
- implementation "androidx.annotation:annotation:1.3.0"
- implementation "androidx.core:core:1.7.0"
- implementation 'net.java.dev.jna:jna:5.10.0@aar'
-}
diff --git a/example/android/app/proguard-rules.pro b/example/android/app/proguard-rules.pro
deleted file mode 100644
index f67c58ea..00000000
--- a/example/android/app/proguard-rules.pro
+++ /dev/null
@@ -1,9 +0,0 @@
--keep class io.flutter.app.** { *; }
--keep class io.flutter.plugin.** { *; }
--keep class io.flutter.util.** { *; }
--keep class io.flutter.view.** { *; }
--keep class io.flutter.** { *; }
--keep class io.flutter.plugins.** { *; }
--dontwarn java.awt.*
--keep class com.sun.jna.* { *; }
--keepclassmembers class * extends com.sun.jna.* { public *; }
\ No newline at end of file
diff --git a/example/android/app/src/main/kotlin/app/polyvox/flutter_filament_example/MainActivity.kt b/example/android/app/src/main/kotlin/app/polyvox/flutter_filament_example/MainActivity.kt
deleted file mode 100644
index fbdcbc30..00000000
--- a/example/android/app/src/main/kotlin/app/polyvox/flutter_filament_example/MainActivity.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package app.polyvox.flutter_filament_example
-
-import io.flutter.embedding.android.FlutterActivity
-import io.flutter.embedding.android.TransparencyMode
-
-class MainActivity: FlutterActivity() {
- override fun getTransparencyMode(): TransparencyMode {
- return TransparencyMode.transparent
- }
-}
diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml
deleted file mode 100644
index d563b149..00000000
--- a/example/android/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
diff --git a/example/android/build.gradle b/example/android/build.gradle
deleted file mode 100644
index 2f76fefa..00000000
--- a/example/android/build.gradle
+++ /dev/null
@@ -1,30 +0,0 @@
-buildscript {
- ext.kotlin_version = '1.6.0'
- repositories {
- google()
- mavenCentral()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:4.1.0'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
-
- }
-}
-
-allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
- project.evaluationDependsOn(':app')
-}
-
-tasks.register("clean", Delete) {
- delete rootProject.buildDir
-}
diff --git a/example/android/gradle.properties b/example/android/gradle.properties
deleted file mode 100644
index 94adc3a3..00000000
--- a/example/android/gradle.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-org.gradle.jvmargs=-Xmx1536M
-android.useAndroidX=true
-android.enableJetifier=true
diff --git a/example/android/settings.gradle b/example/android/settings.gradle
deleted file mode 100644
index 121d30d8..00000000
--- a/example/android/settings.gradle
+++ /dev/null
@@ -1,15 +0,0 @@
-include ':app'
-
-def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
-
-def plugins = new Properties()
-def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
-if (pluginsFile.exists()) {
- pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
-}
-
-plugins.each { name, path ->
- def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
- include ":$name"
- project(":$name").projectDir = pluginDirectory
-}
\ No newline at end of file
diff --git a/example/assets/lit_opaque_32.uberz b/example/assets/lit_opaque_32.uberz
deleted file mode 100644
index a19003d2..00000000
--- a/example/assets/lit_opaque_32.uberz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:f3968531385d8ba9db3e8460451ccf55c5e80108caeae813fcfb8f32230dbd2e
-size 3607448
diff --git a/example/assets/lit_opaque_43.uberz b/example/assets/lit_opaque_43.uberz
deleted file mode 100644
index 5986f870..00000000
--- a/example/assets/lit_opaque_43.uberz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cded95729bd217f86db59866042260dd8049bbff25bbde8fb52f37bd605653fa
-size 212643
diff --git a/example/assets/lit_opaque_43_gles.uberz b/example/assets/lit_opaque_43_gles.uberz
deleted file mode 100644
index 5986f870..00000000
--- a/example/assets/lit_opaque_43_gles.uberz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cded95729bd217f86db59866042260dd8049bbff25bbde8fb52f37bd605653fa
-size 212643
diff --git a/example/assets/lit_opaque_43_metal_macos.uberz b/example/assets/lit_opaque_43_metal_macos.uberz
deleted file mode 100644
index a6a41a51..00000000
--- a/example/assets/lit_opaque_43_metal_macos.uberz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:d7a46bb2bec8300cb9fcd41a9bd0fecd38c17732ff5afaaa54136c9d1d578a65
-size 2596038
diff --git a/example/assets/shapes/shapes.bin b/example/assets/shapes/shapes.bin
deleted file mode 100644
index e159dcdd..00000000
--- a/example/assets/shapes/shapes.bin
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:9cd37bd5152ca0d7bde93663e188a537b2ac2bad58eaf69fbac00d9bc2da9f43
-size 93896
diff --git a/example/assets/shapes/shapes.blend b/example/assets/shapes/shapes.blend
deleted file mode 100644
index b13524b3..00000000
--- a/example/assets/shapes/shapes.blend
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3085e273974ed731754f59598767923c824dbbfdeebb2a620897e421d6a4689f
-size 1212972
diff --git a/example/assets/shapes/shapes.glb b/example/assets/shapes/shapes.glb
deleted file mode 100644
index 31340700..00000000
--- a/example/assets/shapes/shapes.glb
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3fa9367e8955a1e47e704e56f267854019f0135199a06d8e25f62cec503d67d6
-size 136160
diff --git a/example/assets/shapes/shapes.gltf b/example/assets/shapes/shapes.gltf
deleted file mode 100644
index e87aacbd..00000000
--- a/example/assets/shapes/shapes.gltf
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:cf4bf82fd77a54fd6573cded79d1d4db0d0e000c4200c0eadee9ce29425449de
-size 32690
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
deleted file mode 100644
index 30bedf6c..00000000
--- a/example/ios/Podfile.lock
+++ /dev/null
@@ -1,41 +0,0 @@
-PODS:
- - Flutter (1.0.0)
- - flutter_filament (0.0.1):
- - Flutter
- - integration_test (0.0.1):
- - Flutter
- - path_provider_foundation (0.0.1):
- - Flutter
- - FlutterMacOS
- - permission_handler_apple (9.1.1):
- - Flutter
-
-DEPENDENCIES:
- - Flutter (from `Flutter`)
- - flutter_filament (from `.symlinks/plugins/flutter_filament/ios`)
- - integration_test (from `.symlinks/plugins/integration_test/ios`)
- - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
-
-EXTERNAL SOURCES:
- Flutter:
- :path: Flutter
- flutter_filament:
- :path: ".symlinks/plugins/flutter_filament/ios"
- integration_test:
- :path: ".symlinks/plugins/integration_test/ios"
- path_provider_foundation:
- :path: ".symlinks/plugins/path_provider_foundation/darwin"
- permission_handler_apple:
- :path: ".symlinks/plugins/permission_handler_apple/ios"
-
-SPEC CHECKSUMS:
- Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
- flutter_filament: 9d744e795935e0fc5308e46a0c5947cb91714848
- integration_test: 13825b8a9334a850581300559b8839134b124670
- path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
- permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
-
-PODFILE CHECKSUM: 7adbc9d59f05e1b01f554ea99b6c79e97f2214a2
-
-COCOAPODS: 1.12.1
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 28c6bf03..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index 2ccbfd96..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index f091b6b0..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index 4cde1211..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index d0ef06e7..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index dcdc2306..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index 2ccbfd96..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index c8f9ed8f..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index a6d6b860..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index a6d6b860..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index 75b2d164..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index c4df70d3..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 6a84f41e..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index d0e1f585..00000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/example/ios/RunnerTests/RunnerTests.swift b/example/ios/RunnerTests/RunnerTests.swift
deleted file mode 100644
index 481885f5..00000000
--- a/example/ios/RunnerTests/RunnerTests.swift
+++ /dev/null
@@ -1,26 +0,0 @@
-import Flutter
-import UIKit
-import XCTest
-
-@testable import flutter_filament
-
-// This demonstrates a simple unit test of the Swift portion of this plugin's implementation.
-//
-// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
-
-class RunnerTests: XCTestCase {
-
- func testGetPlatformVersion() {
- let plugin = FlutterFilamentPlugin()
-
- let call = FlutterMethodCall(methodName: "getPlatformVersion", arguments: [])
-
- let resultExpectation = expectation(description: "result block must be called.")
- plugin.handle(call) { result in
- XCTAssertEqual(result as! String, "iOS " + UIDevice.current.systemVersion)
- resultExpectation.fulfill()
- }
- waitForExpectations(timeout: 1)
- }
-
-}
diff --git a/example/lib/camera_matrix_overlay.dart b/example/lib/camera_matrix_overlay.dart
deleted file mode 100644
index 2b3cb3ee..00000000
--- a/example/lib/camera_matrix_overlay.dart
+++ /dev/null
@@ -1,103 +0,0 @@
-import 'dart:async';
-
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-import 'package:flutter_filament/filament_controller.dart';
-
-class CameraMatrixOverlay extends StatefulWidget {
- final FilamentController controller;
- final bool showProjectionMatrices;
-
- const CameraMatrixOverlay(
- {super.key,
- required this.controller,
- required this.showProjectionMatrices});
-
- @override
- State createState() => _CameraMatrixOverlayState();
-}
-
-class _CameraMatrixOverlayState extends State {
- Timer? _cameraTimer;
- String? _cameraPosition;
- String? _cameraRotation;
-
- String? _cameraProjectionMatrix;
- String? _cameraCullingProjectionMatrix;
-
- void _tick(Timer timer) async {
- var cameraPosition = await widget.controller.getCameraPosition();
- var cameraRotation = await widget.controller.getCameraRotation();
-
- _cameraPosition =
- "${cameraPosition.storage.map((v) => v.toStringAsFixed(2))}";
- _cameraRotation =
- "${cameraRotation.storage.map((v) => v.toStringAsFixed(2))}";
-
- if (widget.showProjectionMatrices) {
- var projMatrix = await widget.controller.getCameraProjectionMatrix();
- var cullingMatrix =
- await widget.controller.getCameraCullingProjectionMatrix();
-
- _cameraProjectionMatrix =
- projMatrix.storage.map((v) => v.toStringAsFixed(2)).join(",");
- _cameraCullingProjectionMatrix =
- cullingMatrix.storage.map((v) => v.toStringAsFixed(2)).join(",");
- }
-
- setState(() {});
- }
-
- void _updateTimer() {
- _cameraTimer?.cancel();
- if (widget.controller.hasViewer.value) {
- _cameraTimer = Timer.periodic(const Duration(milliseconds: 50), _tick);
- }
- }
-
- @override
- void initState() {
- super.initState();
-
- _updateTimer();
-
- widget.controller.hasViewer.addListener(_updateTimer);
- }
-
- @override
- void didUpdateWidget(CameraMatrixOverlay oldWidget) {
- super.didUpdateWidget(oldWidget);
- setState(() {});
- }
-
- @override
- void dispose() {
- super.dispose();
- widget.controller.hasViewer.removeListener(_updateTimer);
- _cameraTimer?.cancel();
- }
-
- @override
- Widget build(BuildContext context) {
- return Container(
- decoration: BoxDecoration(
- color: Colors.black.withOpacity(0.5),
- borderRadius: BorderRadius.circular(29)),
- padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- mainAxisSize: MainAxisSize.min,
- children: [
- Text("Camera position : $_cameraPosition $_cameraRotation",
- style: const TextStyle(color: Colors.white, fontSize: 12)),
- widget.showProjectionMatrices
- ? Text("Projection matrix : $_cameraProjectionMatrix",
- style: const TextStyle(color: Colors.white, fontSize: 12))
- : Container(),
- widget.showProjectionMatrices
- ? Text("Culling matrix : $_cameraCullingProjectionMatrix",
- style: const TextStyle(color: Colors.white, fontSize: 12))
- : Container(),
- ]));
- }
-}
diff --git a/example/lib/example_viewport.dart b/example/lib/example_viewport.dart
deleted file mode 100644
index 4cfe2ee5..00000000
--- a/example/lib/example_viewport.dart
+++ /dev/null
@@ -1,26 +0,0 @@
-import 'package:flutter/widgets.dart';
-import 'package:flutter_filament/filament_controller.dart';
-import 'package:flutter_filament/widgets/filament_gesture_detector.dart';
-import 'package:flutter_filament/widgets/filament_widget.dart';
-
-class ExampleViewport extends StatelessWidget {
- final FilamentController? controller;
- final EdgeInsets padding;
-
- const ExampleViewport(
- {super.key, required this.controller, required this.padding});
-
- @override
- Widget build(BuildContext context) {
- return controller != null
- ? Padding(
- padding: padding,
- child: FilamentGestureDetector(
- showControlOverlay: true,
- controller: controller!,
- child: FilamentWidget(
- controller: controller!,
- )))
- : Container();
- }
-}
diff --git a/example/lib/main.dart b/example/lib/main.dart
deleted file mode 100644
index 249cede9..00000000
--- a/example/lib/main.dart
+++ /dev/null
@@ -1,176 +0,0 @@
-import 'dart:async';
-
-import 'package:flutter/material.dart';
-import 'package:flutter_filament/filament_controller_ffi.dart';
-import 'package:flutter_filament_example/camera_matrix_overlay.dart';
-import 'package:flutter_filament_example/menus/controller_menu.dart';
-import 'package:flutter_filament_example/example_viewport.dart';
-import 'package:flutter_filament_example/picker_result_widget.dart';
-import 'package:flutter_filament_example/menus/scene_menu.dart';
-
-import 'package:flutter_filament/filament_controller.dart';
-
-const loadDefaultScene = bool.hasEnvironment('--load-default-scene');
-
-void main() async {
- print(loadDefaultScene);
- runApp(MyApp());
-}
-
-class MyApp extends StatefulWidget {
- const MyApp({Key? key}) : super(key: key);
-
- @override
- State createState() => _MyAppState();
-}
-
-class _MyAppState extends State with SingleTickerProviderStateMixin {
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- theme: ThemeData(useMaterial3: true),
- // showPerformanceOverlay: true,
- home: const Scaffold(body: ExampleWidget()));
- }
-}
-
-class ExampleWidget extends StatefulWidget {
- const ExampleWidget({super.key});
-
- @override
- State createState() {
- return ExampleWidgetState();
- }
-}
-
-enum MenuType { controller, assets, camera, misc }
-
-class ExampleWidgetState extends State {
- FilamentController? _filamentController;
-
- EdgeInsets _viewportMargin = EdgeInsets.zero;
-
- // these are all the options that can be set via the menu
- // we store them here
- static bool rendering = false;
- static int framerate = 60;
- static bool postProcessing = true;
- static bool frustumCulling = true;
- static ManipulatorMode cameraManipulatorMode = ManipulatorMode.ORBIT;
-
- static double zoomSpeed = 0.01;
- static double orbitSpeedX = 0.01;
- static double orbitSpeedY = 0.01;
-
- static FilamentEntity? last;
-
- static bool hasSkybox = false;
- static bool coneHidden = false;
-
- static FilamentEntity? shapes;
- static FilamentEntity? flightHelmet;
- static FilamentEntity? buster;
-
- static List? animations;
-
- static FilamentEntity? directionalLight;
-
- static bool loop = false;
- static final showProjectionMatrices = ValueNotifier(false);
-
- late StreamSubscription _listener;
-
- @override
- void initState() {
- super.initState();
- if (loadDefaultScene) {
- WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
- setState(() {
- _filamentController = FilamentControllerFFI();
- });
- await Future.delayed(const Duration(milliseconds: 100));
- WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
- await _filamentController!.createViewer();
- await _filamentController!
- .loadSkybox("assets/default_env/default_env_skybox.ktx");
- await _filamentController!.setRendering(true);
- await _filamentController!.loadGlb("assets/shapes/shapes.glb");
- });
- });
- }
- }
-
- @override
- void dispose() {
- super.dispose();
- _listener.cancel();
- }
-
- @override
- Widget build(BuildContext context) {
- return Stack(children: [
- Positioned.fill(
- child: ExampleViewport(
- controller: _filamentController,
- padding: _viewportMargin,
- ),
- ),
- Align(
- alignment: Alignment.bottomCenter,
- child: Container(
- padding: const EdgeInsets.only(bottom: 30),
- height: 100,
- color: Colors.white,
- child: Row(crossAxisAlignment: CrossAxisAlignment.end, children: [
- ControllerMenu(
- controller: _filamentController,
- onControllerDestroyed: () {},
- onControllerCreated: (controller) {
- setState(() {
- _filamentController = controller;
- _listener = _filamentController!.onLoad
- .listen((FilamentEntity entity) {
- print("Set last to $entity");
- last = entity;
- if (mounted) {
- setState(() {});
- }
- print(_filamentController!.getNameForEntity(entity) ??
- "NAME NOT FOUND");
- });
- });
- }),
- SceneMenu(
- controller: _filamentController,
- ),
- Expanded(child: Container()),
- TextButton(
- child: const Text("Toggle viewport size"),
- onPressed: () {
- setState(() {
- _viewportMargin = (_viewportMargin == EdgeInsets.zero)
- ? const EdgeInsets.all(30)
- : EdgeInsets.zero;
- });
- },
- )
- ]))),
- _filamentController == null
- ? Container()
- : Padding(
- padding: const EdgeInsets.only(top: 40, left: 20, right: 20),
- child: ValueListenableBuilder(
- valueListenable: showProjectionMatrices,
- builder: (ctx, value, child) => CameraMatrixOverlay(
- controller: _filamentController!,
- showProjectionMatrices: value)),
- ),
- _filamentController == null
- ? Container()
- : Align(
- alignment: Alignment.topRight,
- child: PickerResultWidget(controller: _filamentController!),
- )
- ]);
- }
-}
diff --git a/example/lib/menus/asset_submenu.dart b/example/lib/menus/asset_submenu.dart
deleted file mode 100644
index 31e73d35..00000000
--- a/example/lib/menus/asset_submenu.dart
+++ /dev/null
@@ -1,309 +0,0 @@
-import 'dart:math';
-
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-import 'package:flutter_filament/filament_controller.dart';
-import 'package:flutter_filament_example/main.dart';
-import 'package:permission_handler/permission_handler.dart';
-
-class AssetSubmenu extends StatefulWidget {
- final FilamentController controller;
- const AssetSubmenu({super.key, required this.controller});
-
- @override
- State createState() => _AssetSubmenuState();
-}
-
-class _AssetSubmenuState extends State {
- @override
- void initState() {
- super.initState();
- }
-
- Widget _shapesSubmenu() {
- var children = [
- MenuItemButton(
- onPressed: () async {
- if (ExampleWidgetState.shapes == null) {
- ExampleWidgetState.shapes =
- await widget.controller.loadGlb('assets/shapes/shapes.glb');
- ExampleWidgetState.animations = await widget.controller
- .getAnimationNames(ExampleWidgetState.shapes!);
- } else {
- await widget.controller.removeAsset(ExampleWidgetState.shapes!);
- ExampleWidgetState.shapes = null;
- ExampleWidgetState.animations = null;
- }
- },
- child: const Text('Load GLB')),
- MenuItemButton(
- onPressed: ExampleWidgetState.shapes != null
- ? null
- : () async {
- if (ExampleWidgetState.shapes != null) {
- widget.controller.removeAsset(ExampleWidgetState.shapes!);
- }
- ExampleWidgetState.shapes = await widget.controller
- .loadGltf('assets/shapes/shapes.gltf', 'assets/shapes');
- },
- child: const Text('Load GLTF')),
- MenuItemButton(
- onPressed: ExampleWidgetState.shapes == null
- ? null
- : () async {
- await widget.controller
- .transformToUnitCube(ExampleWidgetState.shapes!);
- },
- child: const Text('Transform to unit cube')),
- MenuItemButton(
- onPressed: () async {
- var names = await widget.controller
- .getMorphTargetNames(ExampleWidgetState.shapes!, "Cylinder");
- await showDialog(
- context: context,
- builder: (ctx) {
- return Container(
- height: 100,
- width: 100,
- color: Colors.white,
- child: Text(names.join(",")));
- });
- },
- child: const Text("Show morph target names for Cylinder")),
- MenuItemButton(
- onPressed: () async {
- widget.controller.setMorphTargetWeights(
- ExampleWidgetState.shapes!, "Cylinder", List.filled(4, 1.0));
- },
- child: const Text("set Cylinder morph weights to 1")),
- MenuItemButton(
- onPressed: () async {
- widget.controller.setMorphTargetWeights(
- ExampleWidgetState.shapes!, "Cylinder", List.filled(4, 0.0));
- },
- child: const Text("Set Cylinder morph weights to 0")),
- MenuItemButton(
- onPressed: () async {
- widget.controller
- .setPosition(ExampleWidgetState.shapes!, 1.0, 1.0, -1.0);
- },
- child: const Text('Set position to 1, 1, -1'),
- ),
- MenuItemButton(
- onPressed: () async {
- if (ExampleWidgetState.coneHidden) {
- widget.controller.reveal(ExampleWidgetState.shapes!, "Cone");
- } else {
- widget.controller.hide(ExampleWidgetState.shapes!, "Cone");
- }
-
- ExampleWidgetState.coneHidden = !ExampleWidgetState.coneHidden;
- },
- child:
- Text(ExampleWidgetState.coneHidden ? 'show cone' : 'hide cone')),
- MenuItemButton(
- onPressed: ExampleWidgetState.shapes == null
- ? null
- : () async {
- widget.controller.setMaterialColor(
- ExampleWidgetState.shapes!, "Cone", 0, Colors.purple);
- },
- child: const Text("Set cone material color to purple")),
- MenuItemButton(
- onPressed: () async {
- ExampleWidgetState.loop = !ExampleWidgetState.loop;
- },
- child: Text(
- "Toggle animation looping ${ExampleWidgetState.loop ? "OFF" : "ON"}"))
- ];
- if (ExampleWidgetState.animations != null) {
- children.addAll(ExampleWidgetState.animations!.map((a) => MenuItemButton(
- onPressed: () {
- widget.controller.playAnimation(ExampleWidgetState.shapes!,
- ExampleWidgetState.animations!.indexOf(a),
- replaceActive: true,
- crossfade: 0.5,
- loop: ExampleWidgetState.loop);
- },
- child: Text(
- "play animation ${ExampleWidgetState.animations!.indexOf(a)} (replace/fade)"))));
- children.addAll(ExampleWidgetState.animations!.map((a) => MenuItemButton(
- onPressed: () {
- widget.controller.playAnimation(ExampleWidgetState.shapes!,
- ExampleWidgetState.animations!.indexOf(a),
- replaceActive: false, loop: ExampleWidgetState.loop);
- },
- child: Text(
- "Play animation ${ExampleWidgetState.animations!.indexOf(a)} (noreplace)"))));
- }
-
- return SubmenuButton(menuChildren: children, child: const Text("Shapes"));
- }
-
- @override
- Widget build(BuildContext context) {
- return SubmenuButton(
- menuChildren: [
- _shapesSubmenu(),
- MenuItemButton(
- onPressed: () async {
- ExampleWidgetState.directionalLight = await widget.controller
- .addLight(1, 6500, 150000, 0, 1, 0, 0, -1, 0, true);
- },
- child: const Text("Add directional light"),
- ),
- MenuItemButton(
- onPressed: () async {
- await widget.controller.clearLights();
- },
- child: const Text("Clear lights"),
- ),
- MenuItemButton(
- onPressed: () async {
- if (ExampleWidgetState.buster == null) {
- ExampleWidgetState.buster = await widget.controller.loadGltf(
- "assets/BusterDrone/scene.gltf", "assets/BusterDrone",
- force: true);
- await widget.controller
- .playAnimation(ExampleWidgetState.buster!, 0, loop: true);
- ExampleWidgetState.animations = await widget.controller
- .getAnimationNames(ExampleWidgetState.shapes!);
- } else {
- await widget.controller.removeAsset(ExampleWidgetState.buster!);
- ExampleWidgetState.buster = null;
- }
- },
- child: Text(ExampleWidgetState.buster == null
- ? 'Load buster'
- : 'Remove buster')),
- MenuItemButton(
- onPressed: () async {
- if (ExampleWidgetState.flightHelmet == null) {
- ExampleWidgetState.flightHelmet ??= await widget.controller
- .loadGltf('assets/FlightHelmet/FlightHelmet.gltf',
- 'assets/FlightHelmet',
- force: true);
- } else {
- await widget.controller
- .removeAsset(ExampleWidgetState.flightHelmet!);
- ExampleWidgetState.flightHelmet = null;
- }
- },
- child: Text(ExampleWidgetState.flightHelmet == null
- ? 'Load flight helmet'
- : 'Remove flight helmet')),
- MenuItemButton(
- onPressed: () {
- widget.controller.setBackgroundColor(const Color(0xFF73C9FA));
- },
- child: const Text("Set background color")),
- MenuItemButton(
- onPressed: () {
- widget.controller.setBackgroundImage('assets/background.ktx');
- },
- child: const Text("Load background image")),
- MenuItemButton(
- onPressed: () {
- widget.controller.setBackgroundImage('assets/background.ktx',
- fillHeight: true);
- },
- child: const Text("Load background image (fill height)")),
- MenuItemButton(
- onPressed: () {
- if (ExampleWidgetState.hasSkybox) {
- widget.controller.removeSkybox();
- } else {
- widget.controller
- .loadSkybox('assets/default_env/default_env_skybox.ktx');
- }
- ExampleWidgetState.hasSkybox = !ExampleWidgetState.hasSkybox;
- },
- child: Text(ExampleWidgetState.hasSkybox
- ? 'Remove skybox'
- : 'Load skybox')),
- MenuItemButton(
- onPressed: () {
- widget.controller
- .loadIbl('assets/default_env/default_env_ibl.ktx');
- },
- child: const Text('Load IBL')),
- MenuItemButton(
- onPressed: () async {
- await Permission.microphone.request();
- },
- child: const Text("Request permissions (tests inactive->resume)")),
- MenuItemButton(
- onPressed: () async {
- await widget.controller.clearAssets();
- ExampleWidgetState.flightHelmet = null;
- ExampleWidgetState.buster = null;
- ExampleWidgetState.shapes = null;
- },
- child: const Text('Clear assets')),
- ],
- child: const Text("Assets"),
- );
- }
-}
-
-
-// _item(() async {
-// var frameData = Float32List.fromList(
-// List.generate(120, (i) => i / 120).expand((x) {
-// var vals = List.filled(7, x);
-// vals[3] = 1.0;
-// // vals[4] = 0;
-// vals[5] = 0;
-// vals[6] = 0;
-// return vals;
-// }).toList());
-
-// widget.controller!.setBoneAnimation(
-// _shapes!,
-// BoneAnimationData(
-// "Bone.001", ["Cube.001"], frameData, 1000.0 / 60.0));
-// // ,
-// // "Bone.001",
-// // "Cube.001",
-// // BoneTransform([Vec3(x: 0, y: 0.0, z: 0.0)],
-// // [Quaternion(x: 1, y: 1, z: 1, w: 1)]));
-// }, 'construct bone animation'),
-
-// _item(() async {
-// var morphs = await widget.controller!
-// .getMorphTargetNames(_shapes!, "Cylinder");
-// final animation = AnimationBuilder(
-// availableMorphs: morphs,
-// framerate: 30,
-// meshName: "Cylinder")
-// .setDuration(4)
-// .setMorphTargets(["Key 1", "Key 2"])
-// .interpolateMorphWeights(0, 4, 0, 1)
-// .build();
-// widget.controller!.setMorphAnimationData(_shapes!, animation);
-// }, "animate cylinder morph weights #1 and #2"),
-// _item(() async {
-// var morphs = await widget.controller!
-// .getMorphTargetNames(_shapes!, "Cylinder");
-// final animation = AnimationBuilder(
-// availableMorphs: morphs,
-// framerate: 30,
-// meshName: "Cylinder")
-// .setDuration(4)
-// .setMorphTargets(["Key 3", "Key 4"])
-// .interpolateMorphWeights(0, 4, 0, 1)
-// .build();
-// widget.controller!.setMorphAnimationData(_shapes!, animation);
-// }, "animate cylinder morph weights #3 and #4"),
-// _item(() async {
-// var morphs = await widget.controller!
-// .getMorphTargetNames(_shapes!, "Cube");
-// final animation = AnimationBuilder(
-// availableMorphs: morphs, framerate: 30, meshName: "Cube")
-// .setDuration(4)
-// .setMorphTargets(["Key 1", "Key 2"])
-// .interpolateMorphWeights(0, 4, 0, 1)
-// .build();
-// widget.controller!.setMorphAnimationData(_shapes!, animation);
-// }, "animate shapes morph weights #1 and #2"),
-
diff --git a/example/lib/menus/controller_menu.dart b/example/lib/menus/controller_menu.dart
deleted file mode 100644
index b18c3461..00000000
--- a/example/lib/menus/controller_menu.dart
+++ /dev/null
@@ -1,117 +0,0 @@
-import 'dart:io';
-
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-import 'package:flutter_filament/filament_controller.dart';
-import 'package:flutter_filament/filament_controller_ffi.dart';
-
-class ControllerMenu extends StatefulWidget {
- final FilamentController? controller;
- final void Function(FilamentController controller) onControllerCreated;
- final void Function() onControllerDestroyed;
-
- ControllerMenu(
- {this.controller,
- required this.onControllerCreated,
- required this.onControllerDestroyed});
-
- @override
- State createState() => _ControllerMenuState();
-}
-
-class _ControllerMenuState extends State {
- FilamentController? _filamentController;
- final FocusNode _buttonFocusNode = FocusNode(debugLabel: 'Camera Menu');
-
- void _createController({String? uberArchivePath}) {
- if (_filamentController != null) {
- throw Exception("Controller already exists");
- }
- _filamentController =
- FilamentControllerFFI(uberArchivePath: uberArchivePath);
- widget.onControllerCreated(_filamentController!);
- }
-
- @override
- void initState() {
- super.initState();
- _filamentController = widget.controller;
- }
-
- @override
- void didUpdateWidget(ControllerMenu oldWidget) {
- super.didUpdateWidget(oldWidget);
- if (widget.controller != _filamentController) {
- setState(() {
- _filamentController = widget.controller;
- });
- }
- }
-
- @override
- Widget build(BuildContext context) {
- var items = [];
- if (_filamentController?.hasViewer.value != true) {
- items.addAll([
- MenuItemButton(
- child: const Text("Create FilamentViewer"),
- onPressed: _filamentController == null
- ? null
- : () {
- _filamentController!.createViewer();
- },
- ),
- MenuItemButton(
- child: const Text("Create FilamentController (default ubershader)"),
- onPressed: () {
- _createController();
- },
- ),
- MenuItemButton(
- child: const Text(
- "Create FilamentController (custom ubershader - lit opaque only)"),
- onPressed: () {
- _createController(
- uberArchivePath: Platform.isWindows
- ? "assets/lit_opaque_32.uberz"
- : Platform.isMacOS
- ? "assets/lit_opaque_43.uberz"
- : Platform.isIOS
- ? "assets/lit_opaque_43.uberz"
- : "assets/lit_opaque_43_gles.uberz");
- },
- )
- ]);
- } else {
- items.addAll([
- MenuItemButton(
- child: const Text("Destroy viewer"),
- onPressed: () {
- _filamentController!.destroy();
- _filamentController = null;
- widget.onControllerDestroyed();
- setState(() {});
- },
- )
- ]);
- }
- return MenuAnchor(
- childFocusNode: _buttonFocusNode,
- menuChildren: items,
- builder:
- (BuildContext context, MenuController controller, Widget? child) {
- return Align(
- alignment: Alignment.bottomLeft,
- child: TextButton(
- onPressed: () {
- if (controller.isOpen) {
- controller.close();
- } else {
- controller.open();
- }
- },
- child: const Text("Controller / Viewer"),
- ));
- });
- }
-}
diff --git a/example/lib/menus/rendering_submenu.dart b/example/lib/menus/rendering_submenu.dart
deleted file mode 100644
index 6f65d4be..00000000
--- a/example/lib/menus/rendering_submenu.dart
+++ /dev/null
@@ -1,63 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-import 'package:flutter_filament/filament_controller.dart';
-import 'package:flutter_filament_example/main.dart';
-
-class RenderingSubmenu extends StatefulWidget {
- final FilamentController controller;
-
- const RenderingSubmenu({super.key, required this.controller});
-
- @override
- State createState() => _RenderingSubmenuState();
-}
-
-class _RenderingSubmenuState extends State {
- @override
- Widget build(BuildContext context) {
- return SubmenuButton(
- menuChildren: [
- MenuItemButton(
- onPressed: () {
- widget.controller.render();
- },
- child: const Text("Render single frame"),
- ),
- MenuItemButton(
- onPressed: () {
- ExampleWidgetState.rendering = !ExampleWidgetState.rendering;
- widget.controller.setRendering(ExampleWidgetState.rendering);
- },
- child: Text(
- "Set continuous rendering to ${!ExampleWidgetState.rendering}"),
- ),
- MenuItemButton(
- onPressed: () {
- ExampleWidgetState.framerate =
- ExampleWidgetState.framerate == 60 ? 30 : 60;
- widget.controller.setFrameRate(ExampleWidgetState.framerate);
- },
- child: Text(
- "Toggle framerate (currently $ExampleWidgetState.framerate) "),
- ),
- MenuItemButton(
- onPressed: () {
- widget.controller.setToneMapping(ToneMapper.LINEAR);
- },
- child: const Text("Set tone mapping to linear"),
- ),
- MenuItemButton(
- onPressed: () {
- ExampleWidgetState.postProcessing =
- !ExampleWidgetState.postProcessing;
- widget.controller
- .setPostProcessing(ExampleWidgetState.postProcessing);
- },
- child: Text(
- "${ExampleWidgetState.postProcessing ? "Disable" : "Enable"} postprocessing"),
- ),
- ],
- child: const Text("Rendering"),
- );
- }
-}
diff --git a/example/lib/menus/scene_menu.dart b/example/lib/menus/scene_menu.dart
deleted file mode 100644
index 56367c14..00000000
--- a/example/lib/menus/scene_menu.dart
+++ /dev/null
@@ -1,68 +0,0 @@
-import 'package:flutter/material.dart';
-
-import 'package:flutter_filament/filament_controller.dart';
-import 'package:flutter_filament_example/menus/asset_submenu.dart';
-import 'package:flutter_filament_example/menus/camera_submenu.dart';
-import 'package:flutter_filament_example/menus/rendering_submenu.dart';
-
-class SceneMenu extends StatefulWidget {
- final FilamentController? controller;
-
- const SceneMenu({super.key, required this.controller});
-
- @override
- State createState() {
- return _SceneMenuState();
- }
-}
-
-class _SceneMenuState extends State {
- @override
- void didUpdateWidget(SceneMenu oldWidget) {
- super.didUpdateWidget(oldWidget);
- if (widget.controller != null &&
- widget.controller != oldWidget.controller ||
- widget.controller!.hasViewer != oldWidget.controller!.hasViewer) {
- setState(() {});
- }
- }
-
- @override
- Widget build(BuildContext context) {
- return ValueListenableBuilder(
- valueListenable:
- widget.controller?.hasViewer ?? ValueNotifier(false),
- builder: (BuildContext ctx, bool hasViewer, Widget? child) {
- return MenuAnchor(
- menuChildren: widget.controller == null
- ? []
- : [
- RenderingSubmenu(
- controller: widget.controller!,
- ),
- AssetSubmenu(controller: widget.controller!),
- CameraSubmenu(
- controller: widget.controller!,
- ),
- ],
- builder: (BuildContext context, MenuController controller,
- Widget? child) {
- return Align(
- alignment: Alignment.bottomLeft,
- child: TextButton(
- onPressed: !hasViewer
- ? null
- : () {
- if (controller.isOpen) {
- controller.close();
- } else {
- controller.open();
- }
- },
- child: const Text("Scene"),
- ));
- },
- );
- });
- }
-}
diff --git a/example/linux/flutter/generated_plugin_registrant.cc b/example/linux/flutter/generated_plugin_registrant.cc
deleted file mode 100644
index 98d022b4..00000000
--- a/example/linux/flutter/generated_plugin_registrant.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// Generated file. Do not edit.
-//
-
-// clang-format off
-
-#include "generated_plugin_registrant.h"
-
-#include
-
-void fl_register_plugins(FlPluginRegistry* registry) {
- g_autoptr(FlPluginRegistrar) flutter_filament_registrar =
- fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterFilamentPlugin");
- flutter_filament_plugin_register_with_registrar(flutter_filament_registrar);
-}
diff --git a/example/makefile b/example/makefile
deleted file mode 100644
index b0562352..00000000
--- a/example/makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-include ../makefile
-
-# building on MacOS, we currently just delete the macos/include
-# and macos/src directories and copy from iOS
-
-sync-libs-macos-and-update-pods: sync-libs-macos
- pushd macos && pod update
\ No newline at end of file
diff --git a/example/pubspec.lock b/example/pubspec.lock
deleted file mode 100644
index 13549bc4..00000000
--- a/example/pubspec.lock
+++ /dev/null
@@ -1,520 +0,0 @@
-# Generated by pub
-# See https://dart.dev/tools/pub/glossary#lockfile
-packages:
- archive:
- dependency: transitive
- description:
- name: archive
- sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03"
- url: "https://pub.dev"
- source: hosted
- version: "3.4.6"
- async:
- dependency: transitive
- description:
- name: async
- sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
- url: "https://pub.dev"
- source: hosted
- version: "2.11.0"
- boolean_selector:
- dependency: transitive
- description:
- name: boolean_selector
- sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.1"
- characters:
- dependency: transitive
- description:
- name: characters
- sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
- url: "https://pub.dev"
- source: hosted
- version: "1.3.0"
- clock:
- dependency: transitive
- description:
- name: clock
- sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
- url: "https://pub.dev"
- source: hosted
- version: "1.1.1"
- collection:
- dependency: transitive
- description:
- name: collection
- sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
- url: "https://pub.dev"
- source: hosted
- version: "1.18.0"
- convert:
- dependency: transitive
- description:
- name: convert
- sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
- url: "https://pub.dev"
- source: hosted
- version: "3.1.1"
- crypto:
- dependency: "direct dev"
- description:
- name: crypto
- sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
- url: "https://pub.dev"
- source: hosted
- version: "3.0.3"
- cupertino_icons:
- dependency: "direct main"
- description:
- name: cupertino_icons
- sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d
- url: "https://pub.dev"
- source: hosted
- version: "1.0.6"
- fake_async:
- dependency: transitive
- description:
- name: fake_async
- sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
- url: "https://pub.dev"
- source: hosted
- version: "1.3.1"
- ffi:
- dependency: transitive
- description:
- name: ffi
- sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.0"
- file:
- dependency: transitive
- description:
- name: file
- sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
- url: "https://pub.dev"
- source: hosted
- version: "7.0.0"
- flutter:
- dependency: "direct main"
- description: flutter
- source: sdk
- version: "0.0.0"
- flutter_driver:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.0"
- flutter_filament:
- dependency: "direct main"
- description:
- path: ".."
- relative: true
- source: path
- version: "0.5.0"
- flutter_lints:
- dependency: "direct dev"
- description:
- name: flutter_lints
- sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493
- url: "https://pub.dev"
- source: hosted
- version: "1.0.4"
- flutter_test:
- dependency: "direct dev"
- description: flutter
- source: sdk
- version: "0.0.0"
- flutter_web_plugins:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.0"
- fuchsia_remote_debug_protocol:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.0"
- image:
- dependency: transitive
- description:
- name: image
- sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6"
- url: "https://pub.dev"
- source: hosted
- version: "3.3.0"
- image_compare:
- dependency: "direct dev"
- description:
- name: image_compare
- sha256: "774e9ef1558ca328191fe9690e8e024159a3a2db6ea4ef6b65bea0faa3631b74"
- url: "https://pub.dev"
- source: hosted
- version: "1.1.2"
- integration_test:
- dependency: "direct dev"
- description: flutter
- source: sdk
- version: "0.0.0"
- intl:
- dependency: transitive
- description:
- name: intl
- sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
- url: "https://pub.dev"
- source: hosted
- version: "0.18.1"
- js:
- dependency: transitive
- description:
- name: js
- sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
- url: "https://pub.dev"
- source: hosted
- version: "0.6.7"
- leak_tracker:
- dependency: transitive
- description:
- name: leak_tracker
- sha256: f38a2c91c12f31726ca13015fbab3d2e9440edcb7c17b8b36ed9b85ed6eee6a2
- url: "https://pub.dev"
- source: hosted
- version: "9.0.11"
- leak_tracker_flutter_testing:
- dependency: transitive
- description:
- name: leak_tracker_flutter_testing
- sha256: "23770c69594f5260a79fe9d84e29f8b175d1b05d128e751c904b3cdf910e5dfc"
- url: "https://pub.dev"
- source: hosted
- version: "1.0.9"
- leak_tracker_testing:
- dependency: transitive
- description:
- name: leak_tracker_testing
- sha256: b06739349ec2477e943055aea30172c5c7000225f79dad4702e2ec0eda79a6ff
- url: "https://pub.dev"
- source: hosted
- version: "1.0.5"
- lints:
- dependency: transitive
- description:
- name: lints
- sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c
- url: "https://pub.dev"
- source: hosted
- version: "1.0.1"
- matcher:
- dependency: transitive
- description:
- name: matcher
- sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
- url: "https://pub.dev"
- source: hosted
- version: "0.12.16"
- material_color_utilities:
- dependency: transitive
- description:
- name: material_color_utilities
- sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
- url: "https://pub.dev"
- source: hosted
- version: "0.8.0"
- meta:
- dependency: transitive
- description:
- name: meta
- sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
- url: "https://pub.dev"
- source: hosted
- version: "1.11.0"
- path:
- dependency: transitive
- description:
- name: path
- sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
- url: "https://pub.dev"
- source: hosted
- version: "1.8.3"
- path_provider:
- dependency: "direct main"
- description:
- name: path_provider
- sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
- url: "https://pub.dev"
- source: hosted
- version: "2.1.1"
- path_provider_android:
- dependency: transitive
- description:
- name: path_provider_android
- sha256: "6b8b19bd80da4f11ce91b2d1fb931f3006911477cec227cce23d3253d80df3f1"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.0"
- path_provider_foundation:
- dependency: transitive
- description:
- name: path_provider_foundation
- sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
- url: "https://pub.dev"
- source: hosted
- version: "2.3.1"
- path_provider_linux:
- dependency: transitive
- description:
- name: path_provider_linux
- sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
- url: "https://pub.dev"
- source: hosted
- version: "2.2.1"
- path_provider_platform_interface:
- dependency: transitive
- description:
- name: path_provider_platform_interface
- sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.1"
- path_provider_windows:
- dependency: transitive
- description:
- name: path_provider_windows
- sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.1"
- permission_handler:
- dependency: "direct main"
- description:
- name: permission_handler
- sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8"
- url: "https://pub.dev"
- source: hosted
- version: "11.0.1"
- permission_handler_android:
- dependency: transitive
- description:
- name: permission_handler_android
- sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e
- url: "https://pub.dev"
- source: hosted
- version: "11.1.0"
- permission_handler_apple:
- dependency: transitive
- description:
- name: permission_handler_apple
- sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5"
- url: "https://pub.dev"
- source: hosted
- version: "9.1.4"
- permission_handler_platform_interface:
- dependency: transitive
- description:
- name: permission_handler_platform_interface
- sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4"
- url: "https://pub.dev"
- source: hosted
- version: "3.12.0"
- permission_handler_windows:
- dependency: transitive
- description:
- name: permission_handler_windows
- sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098
- url: "https://pub.dev"
- source: hosted
- version: "0.1.3"
- petitparser:
- dependency: transitive
- description:
- name: petitparser
- sha256: eeb2d1428ee7f4170e2bd498827296a18d4e7fc462b71727d111c0ac7707cfa6
- url: "https://pub.dev"
- source: hosted
- version: "6.0.1"
- platform:
- dependency: transitive
- description:
- name: platform
- sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59"
- url: "https://pub.dev"
- source: hosted
- version: "3.1.3"
- plugin_platform_interface:
- dependency: transitive
- description:
- name: plugin_platform_interface
- sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d
- url: "https://pub.dev"
- source: hosted
- version: "2.1.6"
- pointycastle:
- dependency: transitive
- description:
- name: pointycastle
- sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
- url: "https://pub.dev"
- source: hosted
- version: "3.7.3"
- process:
- dependency: transitive
- description:
- name: process
- sha256: "266ca5be5820feefc777793d0a583acfc8c40834893c87c00c6c09e2cf58ea42"
- url: "https://pub.dev"
- source: hosted
- version: "5.0.1"
- sky_engine:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.99"
- source_span:
- dependency: transitive
- description:
- name: source_span
- sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
- url: "https://pub.dev"
- source: hosted
- version: "1.10.0"
- stack_trace:
- dependency: transitive
- description:
- name: stack_trace
- sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
- url: "https://pub.dev"
- source: hosted
- version: "1.11.1"
- stream_channel:
- dependency: transitive
- description:
- name: stream_channel
- sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
- url: "https://pub.dev"
- source: hosted
- version: "2.1.2"
- string_scanner:
- dependency: transitive
- description:
- name: string_scanner
- sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.0"
- sync_http:
- dependency: transitive
- description:
- name: sync_http
- sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961"
- url: "https://pub.dev"
- source: hosted
- version: "0.3.1"
- term_glyph:
- dependency: transitive
- description:
- name: term_glyph
- sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
- url: "https://pub.dev"
- source: hosted
- version: "1.2.1"
- test_api:
- dependency: transitive
- description:
- name: test_api
- sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
- url: "https://pub.dev"
- source: hosted
- version: "0.6.1"
- tuple:
- dependency: transitive
- description:
- name: tuple
- sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151
- url: "https://pub.dev"
- source: hosted
- version: "2.0.2"
- typed_data:
- dependency: transitive
- description:
- name: typed_data
- sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
- url: "https://pub.dev"
- source: hosted
- version: "1.3.2"
- universal_io:
- dependency: transitive
- description:
- name: universal_io
- sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.2"
- vector_math:
- dependency: transitive
- description:
- name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.4"
- vm_service:
- dependency: transitive
- description:
- name: vm_service
- sha256: a13d5503b4facefc515c8c587ce3cf69577a7b064a9f1220e005449cf1f64aad
- url: "https://pub.dev"
- source: hosted
- version: "12.0.0"
- web:
- dependency: transitive
- description:
- name: web
- sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
- url: "https://pub.dev"
- source: hosted
- version: "0.3.0"
- web_socket_channel:
- dependency: transitive
- description:
- name: web_socket_channel
- sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
- url: "https://pub.dev"
- source: hosted
- version: "2.4.0"
- webdriver:
- dependency: transitive
- description:
- name: webdriver
- sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e"
- url: "https://pub.dev"
- source: hosted
- version: "3.0.3"
- win32:
- dependency: transitive
- description:
- name: win32
- sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
- url: "https://pub.dev"
- source: hosted
- version: "5.0.9"
- xdg_directories:
- dependency: transitive
- description:
- name: xdg_directories
- sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2"
- url: "https://pub.dev"
- source: hosted
- version: "1.0.3"
- xml:
- dependency: transitive
- description:
- name: xml
- sha256: af5e77e9b83f2f4adc5d3f0a4ece1c7f45a2467b695c2540381bac793e34e556
- url: "https://pub.dev"
- source: hosted
- version: "6.4.2"
-sdks:
- dart: ">=3.2.0-194.0.dev <4.0.0"
- flutter: ">=3.16.0-0.2.pre"
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
deleted file mode 100644
index e2801abd..00000000
--- a/example/pubspec.yaml
+++ /dev/null
@@ -1,49 +0,0 @@
-name: flutter_filament_example
-description: Demonstrates how to use the flutter_filament plugin.
-
-# The following line prevents the package from being accidentally published to
-# pub.dev using `flutter pub publish`. This is preferred for private packages.
-publish_to: 'none' # Remove this line if you wish to publish to pub.dev
-
-environment:
- sdk: ">=3.0.0 <4.0.0"
-
-# Dependencies specify other packages that your package needs in order to work.
-# To automatically upgrade your package dependencies to the latest versions
-# consider running `flutter pub upgrade --major-versions`. Alternatively,
-# dependencies can be manually updated by changing the version numbers below to
-# the latest version available on pub.dev. To see which dependencies have newer
-# versions available, run `flutter pub outdated`.
-dependencies:
- flutter:
- sdk: flutter
- path_provider:
- flutter_filament:
- path: ../
- permission_handler:
- cupertino_icons: ^1.0.2
-
-dev_dependencies:
- flutter_test:
- sdk: flutter
- integration_test:
- sdk: flutter
- flutter_lints: ^1.0.0
- crypto:
- image_compare: ^1.1.2
-
-
-# For information on the generic Dart part of this file, see the
-# following page: https://dart.dev/tools/pub/pubspec
-
-# The following section is specific to Flutter.
-flutter:
- uses-material-design: true
- assets:
- - assets/
- - assets/shapes/
- - assets/default_env/
- - assets/BusterDrone/
- - assets/BusterDrone/textures/
- - assets/FlightHelmet/
-
\ No newline at end of file
diff --git a/example/web/index.html b/example/web/index.html
deleted file mode 100644
index bd7bcbe9..00000000
--- a/example/web/index.html
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- flutter_filament_example
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/windows/flutter/generated_plugin_registrant.cc b/example/windows/flutter/generated_plugin_registrant.cc
deleted file mode 100644
index 754e1cb7..00000000
--- a/example/windows/flutter/generated_plugin_registrant.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-//
-// Generated file. Do not edit.
-//
-
-// clang-format off
-
-#include "generated_plugin_registrant.h"
-
-#include
-#include
-
-void RegisterPlugins(flutter::PluginRegistry* registry) {
- FlutterFilamentPluginCApiRegisterWithRegistrar(
- registry->GetRegistrarForPlugin("FlutterFilamentPluginCApi"));
- PermissionHandlerWindowsPluginRegisterWithRegistrar(
- registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
-}
diff --git a/examples/assets/1.glb b/examples/assets/1.glb
new file mode 100644
index 00000000..f6e5c4cf
--- /dev/null
+++ b/examples/assets/1.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4a1d72d69da8b933bde5453ef2000612b561f8ddfa536a7ad89288ef11eb876d
+size 1624
diff --git a/examples/assets/2.glb b/examples/assets/2.glb
new file mode 100644
index 00000000..a5bd07f7
--- /dev/null
+++ b/examples/assets/2.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fe0151ced8fd8609f9692f3d62dbd30890dada97cb6995572e37c7e7b4440d86
+size 21304
diff --git a/examples/assets/3.glb b/examples/assets/3.glb
new file mode 100644
index 00000000..de666f7c
--- /dev/null
+++ b/examples/assets/3.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0f8b793f6513cf83f80ce9c63c7b51d329908b1991f17ca642911634b15b32de
+size 34172
diff --git a/example/assets/BusterDrone/scene.bin b/examples/assets/BusterDrone/scene.bin
similarity index 100%
rename from example/assets/BusterDrone/scene.bin
rename to examples/assets/BusterDrone/scene.bin
diff --git a/example/assets/BusterDrone/scene.gltf b/examples/assets/BusterDrone/scene.gltf
similarity index 100%
rename from example/assets/BusterDrone/scene.gltf
rename to examples/assets/BusterDrone/scene.gltf
diff --git a/example/assets/BusterDrone/textures/Boden_baseColor.jpg b/examples/assets/BusterDrone/textures/Boden_baseColor.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/Boden_baseColor.jpg
rename to examples/assets/BusterDrone/textures/Boden_baseColor.jpg
diff --git a/example/assets/BusterDrone/textures/Boden_metallicRoughness.jpg b/examples/assets/BusterDrone/textures/Boden_metallicRoughness.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/Boden_metallicRoughness.jpg
rename to examples/assets/BusterDrone/textures/Boden_metallicRoughness.jpg
diff --git a/example/assets/BusterDrone/textures/Boden_normal.jpg b/examples/assets/BusterDrone/textures/Boden_normal.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/Boden_normal.jpg
rename to examples/assets/BusterDrone/textures/Boden_normal.jpg
diff --git a/example/assets/BusterDrone/textures/body_baseColor.jpg b/examples/assets/BusterDrone/textures/body_baseColor.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/body_baseColor.jpg
rename to examples/assets/BusterDrone/textures/body_baseColor.jpg
diff --git a/example/assets/BusterDrone/textures/body_emissive.jpg b/examples/assets/BusterDrone/textures/body_emissive.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/body_emissive.jpg
rename to examples/assets/BusterDrone/textures/body_emissive.jpg
diff --git a/example/assets/BusterDrone/textures/body_metallicRoughness.jpg b/examples/assets/BusterDrone/textures/body_metallicRoughness.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/body_metallicRoughness.jpg
rename to examples/assets/BusterDrone/textures/body_metallicRoughness.jpg
diff --git a/example/assets/BusterDrone/textures/body_normal.jpg b/examples/assets/BusterDrone/textures/body_normal.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/body_normal.jpg
rename to examples/assets/BusterDrone/textures/body_normal.jpg
diff --git a/example/assets/BusterDrone/textures/material_baseColor.jpg b/examples/assets/BusterDrone/textures/material_baseColor.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/material_baseColor.jpg
rename to examples/assets/BusterDrone/textures/material_baseColor.jpg
diff --git a/example/assets/BusterDrone/textures/material_metallicRoughness.jpg b/examples/assets/BusterDrone/textures/material_metallicRoughness.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/material_metallicRoughness.jpg
rename to examples/assets/BusterDrone/textures/material_metallicRoughness.jpg
diff --git a/example/assets/BusterDrone/textures/material_normal.jpg b/examples/assets/BusterDrone/textures/material_normal.jpg
similarity index 100%
rename from example/assets/BusterDrone/textures/material_normal.jpg
rename to examples/assets/BusterDrone/textures/material_normal.jpg
diff --git a/example/assets/FlightHelmet/FlightHelmet.bin b/examples/assets/FlightHelmet/FlightHelmet.bin
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet.bin
rename to examples/assets/FlightHelmet/FlightHelmet.bin
diff --git a/example/assets/FlightHelmet/FlightHelmet.gltf b/examples/assets/FlightHelmet/FlightHelmet.gltf
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet.gltf
rename to examples/assets/FlightHelmet/FlightHelmet.gltf
diff --git a/example/assets/FlightHelmet/FlightHelmet_baseColor.png b/examples/assets/FlightHelmet/FlightHelmet_baseColor.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_baseColor.png
rename to examples/assets/FlightHelmet/FlightHelmet_baseColor.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_baseColor1.png b/examples/assets/FlightHelmet/FlightHelmet_baseColor1.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_baseColor1.png
rename to examples/assets/FlightHelmet/FlightHelmet_baseColor1.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_baseColor2.png b/examples/assets/FlightHelmet/FlightHelmet_baseColor2.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_baseColor2.png
rename to examples/assets/FlightHelmet/FlightHelmet_baseColor2.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_baseColor3.png b/examples/assets/FlightHelmet/FlightHelmet_baseColor3.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_baseColor3.png
rename to examples/assets/FlightHelmet/FlightHelmet_baseColor3.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_baseColor4.png b/examples/assets/FlightHelmet/FlightHelmet_baseColor4.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_baseColor4.png
rename to examples/assets/FlightHelmet/FlightHelmet_baseColor4.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_normal.png b/examples/assets/FlightHelmet/FlightHelmet_normal.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_normal.png
rename to examples/assets/FlightHelmet/FlightHelmet_normal.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_normal1.png b/examples/assets/FlightHelmet/FlightHelmet_normal1.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_normal1.png
rename to examples/assets/FlightHelmet/FlightHelmet_normal1.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_normal2.png b/examples/assets/FlightHelmet/FlightHelmet_normal2.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_normal2.png
rename to examples/assets/FlightHelmet/FlightHelmet_normal2.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_normal3.png b/examples/assets/FlightHelmet/FlightHelmet_normal3.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_normal3.png
rename to examples/assets/FlightHelmet/FlightHelmet_normal3.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_normal4.png b/examples/assets/FlightHelmet/FlightHelmet_normal4.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_normal4.png
rename to examples/assets/FlightHelmet/FlightHelmet_normal4.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic.png b/examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic.png
rename to examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic1.png b/examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic1.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic1.png
rename to examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic1.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic2.png b/examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic2.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic2.png
rename to examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic2.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic3.png b/examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic3.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic3.png
rename to examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic3.png
diff --git a/example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic4.png b/examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic4.png
similarity index 100%
rename from example/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic4.png
rename to examples/assets/FlightHelmet/FlightHelmet_occlusionRoughnessMetallic4.png
diff --git a/example/assets/FlightHelmet/README.md b/examples/assets/FlightHelmet/README.md
similarity index 100%
rename from example/assets/FlightHelmet/README.md
rename to examples/assets/FlightHelmet/README.md
diff --git a/example/assets/background.ktx b/examples/assets/background.ktx
similarity index 100%
rename from example/assets/background.ktx
rename to examples/assets/background.ktx
diff --git a/example/assets/background.png b/examples/assets/background.png
similarity index 100%
rename from example/assets/background.png
rename to examples/assets/background.png
diff --git a/example/assets/default_env/default_env_ibl.ktx b/examples/assets/default_env/default_env_ibl.ktx
similarity index 100%
rename from example/assets/default_env/default_env_ibl.ktx
rename to examples/assets/default_env/default_env_ibl.ktx
diff --git a/example/assets/default_env/default_env_skybox.ktx b/examples/assets/default_env/default_env_skybox.ktx
similarity index 100%
rename from example/assets/default_env/default_env_skybox.ktx
rename to examples/assets/default_env/default_env_skybox.ktx
diff --git a/examples/assets/shapes/shapes.bin b/examples/assets/shapes/shapes.bin
new file mode 100644
index 00000000..661d051b
--- /dev/null
+++ b/examples/assets/shapes/shapes.bin
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5821c53850d84c5b2d0b39ad28e6cde94d8fc7e1bbb97d5d898c40733e2d4e99
+size 107424
diff --git a/examples/assets/shapes/shapes.blend b/examples/assets/shapes/shapes.blend
new file mode 100644
index 00000000..1f15f926
--- /dev/null
+++ b/examples/assets/shapes/shapes.blend
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d9134594e40a4bad7601d0396bb5f2a7600656bda5d815b3cb2e855ba6c6c5e4
+size 1263808
diff --git a/examples/assets/shapes/shapes.blend1 b/examples/assets/shapes/shapes.blend1
new file mode 100644
index 00000000..27743c63
--- /dev/null
+++ b/examples/assets/shapes/shapes.blend1
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ab0cada556723be0d138d7b1cadb5e315a273524db0468e0c4255d8d2b0c1c2d
+size 1222992
diff --git a/examples/assets/shapes/shapes.glb b/examples/assets/shapes/shapes.glb
new file mode 100644
index 00000000..9d154306
--- /dev/null
+++ b/examples/assets/shapes/shapes.glb
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c58d82602dc9b4dabb63f378fecd7ecb9eaf6f5da5746552ec42dde4ec211d7
+size 121104
diff --git a/examples/assets/shapes/shapes.gltf b/examples/assets/shapes/shapes.gltf
new file mode 100644
index 00000000..f06ccefc
--- /dev/null
+++ b/examples/assets/shapes/shapes.gltf
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c1d3eac0151a58c3f36bea0f636691559612fd2d5ce21bb3551d43e86043e26
+size 36741
diff --git a/example/assets/shapes/texture_test.png b/examples/assets/shapes/texture_test.png
similarity index 100%
rename from example/assets/shapes/texture_test.png
rename to examples/assets/shapes/texture_test.png
diff --git a/examples/assets/solidcolor.filamat b/examples/assets/solidcolor.filamat
new file mode 100644
index 00000000..4b3536e9
--- /dev/null
+++ b/examples/assets/solidcolor.filamat
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c07d5f3b06fb763d74e4d6afa2ff933d8953e8f73828320d0c34c2105e346d97
+size 38119
diff --git a/examples/assets/solidcolor.mat b/examples/assets/solidcolor.mat
new file mode 100644
index 00000000..d416afd8
--- /dev/null
+++ b/examples/assets/solidcolor.mat
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2033d3f7f8e0af983d8ab237737b45db2ed476b9283c6b0fda6a6954e1a72dea
+size 294
diff --git a/examples/dart/cli_macos/.gitignore b/examples/dart/cli_macos/.gitignore
new file mode 100644
index 00000000..3a857904
--- /dev/null
+++ b/examples/dart/cli_macos/.gitignore
@@ -0,0 +1,3 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
diff --git a/examples/dart/cli_macos/CHANGELOG.md b/examples/dart/cli_macos/CHANGELOG.md
new file mode 100644
index 00000000..effe43c8
--- /dev/null
+++ b/examples/dart/cli_macos/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/examples/dart/cli_macos/README.md b/examples/dart/cli_macos/README.md
new file mode 100644
index 00000000..3816eca3
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_macos/analysis_options.yaml b/examples/dart/cli_macos/analysis_options.yaml
new file mode 100644
index 00000000..dee8927a
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_macos/bin/assets b/examples/dart/cli_macos/bin/assets
new file mode 120000
index 00000000..2978ef39
--- /dev/null
+++ b/examples/dart/cli_macos/bin/assets
@@ -0,0 +1 @@
+../../../assets
\ No newline at end of file
diff --git a/examples/dart/cli_macos/bin/example_cli.dart b/examples/dart/cli_macos/bin/example_cli.dart
new file mode 100644
index 00000000..e56c3400
--- /dev/null
+++ b/examples/dart/cli_macos/bin/example_cli.dart
@@ -0,0 +1,46 @@
+import 'dart:io';
+import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart';
+import 'package:thermion_dart/thermion_dart/swift/swift_bindings.g.dart';
+import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart';
+import 'package:thermion_dart/thermion_dart/utils/dart_resources.dart';
+import 'package:ffi/ffi.dart';
+import 'package:thermion_dart/thermion_dart.dart';
+
+void main() async {
+ var scriptDir = File(Platform.script.toFilePath()).parent.path;
+ final lib = ThermionDartTexture1(
+ DynamicLibrary.open("$scriptDir/libthermion_swift.dylib"));
+ final object = ThermionDartTexture.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 = ThermionViewerFFI(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/output");
+ if (outDir.existsSync()) {
+ outDir.deleteSync(recursive: true);
+ }
+ outDir.createSync();
+
+ await viewer.setRecordingOutputDirectory(outDir.path);
+ await viewer.setRecording(true);
+ await viewer.loadSkybox(
+ "file:///$scriptDir/assets/default_env/default_env_skybox.ktx");
+ await Future.delayed(Duration(milliseconds: 16));
+ await viewer.render();
+ await viewer.dispose();
+}
diff --git a/examples/dart/cli_macos/bin/libthermion_swift.dylib b/examples/dart/cli_macos/bin/libthermion_swift.dylib
new file mode 120000
index 00000000..c9146a01
--- /dev/null
+++ b/examples/dart/cli_macos/bin/libthermion_swift.dylib
@@ -0,0 +1 @@
+../../../../thermion_dart/native/lib/macos/swift/libthermion_swift.dylib
\ No newline at end of file
diff --git a/examples/dart/cli_macos/bin/output/output_000007.png b/examples/dart/cli_macos/bin/output/output_000007.png
new file mode 100644
index 00000000..656ea930
Binary files /dev/null and b/examples/dart/cli_macos/bin/output/output_000007.png differ
diff --git a/examples/dart/cli_macos/pubspec.yaml b/examples/dart/cli_macos/pubspec.yaml
new file mode 100644
index 00000000..e2672c8a
--- /dev/null
+++ b/examples/dart/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:
+ thermion_dart:
+ path: ../../../thermion_dart
+ ffi:
+
+dev_dependencies:
+ ffigen: ^11.0.0
+ lints: ^3.0.0
+ test: ^1.24.0
diff --git a/examples/dart/cli_macos/test/example_cli_test.dart b/examples/dart/cli_macos/test/example_cli_test.dart
new file mode 100644
index 00000000..900e362a
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_wasm/.gitignore b/examples/dart/cli_wasm/.gitignore
new file mode 100644
index 00000000..3a857904
--- /dev/null
+++ b/examples/dart/cli_wasm/.gitignore
@@ -0,0 +1,3 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
diff --git a/examples/dart/cli_wasm/CHANGELOG.md b/examples/dart/cli_wasm/CHANGELOG.md
new file mode 100644
index 00000000..effe43c8
--- /dev/null
+++ b/examples/dart/cli_wasm/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/examples/dart/cli_wasm/README.md b/examples/dart/cli_wasm/README.md
new file mode 100644
index 00000000..3816eca3
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_wasm/analysis_options.yaml b/examples/dart/cli_wasm/analysis_options.yaml
new file mode 100644
index 00000000..dee8927a
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_wasm/bin/.gitignore b/examples/dart/cli_wasm/bin/.gitignore
new file mode 100644
index 00000000..768bac72
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/.gitignore
@@ -0,0 +1,4 @@
+example_cli.mjs
+example_cli.wasm
+example_cli.unopt.wasm
+node_modules/**/*
diff --git a/examples/dart/cli_wasm/bin/build.log b/examples/dart/cli_wasm/bin/build.log
new file mode 100644
index 00000000..2f3f8079
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_wasm/bin/example_cli.dart b/examples/dart/cli_wasm/bin/example_cli.dart
new file mode 100644
index 00000000..7e5f0a1f
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/example_cli.dart
@@ -0,0 +1,33 @@
+import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart';
+import 'package:thermion_dart/thermion_dart.dart';
+import 'package:animation_tools_dart/animation_tools_dart.dart';
+
+void main(List args) async {
+ final resourceLoader = thermion_dart_web_get_resource_loader_wrapper();
+ var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast());
+ viewer.initialized.then((_) async {
+ var entity = await viewer.loadGlb(
+ "/Users/nickfisher/Documents/polyvox/apps/packages/thermion_flutter/thermion_flutter_federated/thermion_flutter/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/examples/dart/cli_wasm/bin/main.js b/examples/dart/cli_wasm/bin/main.js
new file mode 100644
index 00000000..9a2a5033
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/main.js
@@ -0,0 +1,123 @@
+const fs = require('node:fs');
+const thermion_dart = require("./thermion_dart.js")
+const GLctx = require('gl')(100, 100, { preserveDrawingBuffer: true })
+
+// queueMicrotask = (func) => {
+// func();
+// }
+// read('thermion_dart.wasm', 'binary')
+// const exports = {};
+// const module = {};
+
+const wasmBuffer = fs.readFileSync('thermion_dart.wasm');
+
+var dartFilamentModulePromise = WebAssembly.compile(wasmBuffer);
+let globalDf;
+thermion_dart({
+ 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 = {"thermion_dart": 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/examples/dart/cli_wasm/bin/package-lock.json b/examples/dart/cli_wasm/bin/package-lock.json
new file mode 100644
index 00000000..69892e83
--- /dev/null
+++ b/examples/dart/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/examples/dart/cli_wasm/bin/package.json b/examples/dart/cli_wasm/bin/package.json
new file mode 100644
index 00000000..c6382089
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/package.json
@@ -0,0 +1,5 @@
+{
+ "dependencies": {
+ "gl": "^8.0.2"
+ }
+}
diff --git a/examples/dart/cli_wasm/bin/thermion_dart.js b/examples/dart/cli_wasm/bin/thermion_dart.js
new file mode 120000
index 00000000..6710a76f
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/thermion_dart.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.js
\ No newline at end of file
diff --git a/examples/dart/cli_wasm/bin/thermion_dart.wasm b/examples/dart/cli_wasm/bin/thermion_dart.wasm
new file mode 120000
index 00000000..a1439c39
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/thermion_dart.wasm
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.wasm
\ No newline at end of file
diff --git a/examples/dart/cli_wasm/bin/thermion_dart.worker.js b/examples/dart/cli_wasm/bin/thermion_dart.worker.js
new file mode 120000
index 00000000..54392ba9
--- /dev/null
+++ b/examples/dart/cli_wasm/bin/thermion_dart.worker.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.worker.js
\ No newline at end of file
diff --git a/examples/dart/cli_wasm/pubspec.yaml b/examples/dart/cli_wasm/pubspec.yaml
new file mode 100644
index 00000000..e02af0c1
--- /dev/null
+++ b/examples/dart/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:
+ thermion_dart:
+ path: ../../
+ ffi:
+
+dev_dependencies:
+ ffigen: ^11.0.0
+ lints: ^3.0.0
+ test: ^1.24.0
diff --git a/examples/dart/cli_wasm/test/example_cli_test.dart b/examples/dart/cli_wasm/test/example_cli_test.dart
new file mode 100644
index 00000000..900e362a
--- /dev/null
+++ b/examples/dart/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/examples/dart/web_wasm/.gitignore b/examples/dart/web_wasm/.gitignore
new file mode 100644
index 00000000..3a857904
--- /dev/null
+++ b/examples/dart/web_wasm/.gitignore
@@ -0,0 +1,3 @@
+# https://dart.dev/guides/libraries/private-files
+# Created by `dart pub`
+.dart_tool/
diff --git a/examples/dart/web_wasm/CHANGELOG.md b/examples/dart/web_wasm/CHANGELOG.md
new file mode 100644
index 00000000..effe43c8
--- /dev/null
+++ b/examples/dart/web_wasm/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+- Initial version.
diff --git a/examples/dart/web_wasm/README.md b/examples/dart/web_wasm/README.md
new file mode 100644
index 00000000..3816eca3
--- /dev/null
+++ b/examples/dart/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/examples/dart/web_wasm/analysis_options.yaml b/examples/dart/web_wasm/analysis_options.yaml
new file mode 100644
index 00000000..dee8927a
--- /dev/null
+++ b/examples/dart/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/examples/dart/web_wasm/bin/README.md b/examples/dart/web_wasm/bin/README.md
new file mode 100644
index 00000000..75aba073
--- /dev/null
+++ b/examples/dart/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/examples/dart/web_wasm/bin/assets b/examples/dart/web_wasm/bin/assets
new file mode 120000
index 00000000..0500631d
--- /dev/null
+++ b/examples/dart/web_wasm/bin/assets
@@ -0,0 +1 @@
+../../../../flutter_filament_federated/flutter_filament/example/assets
\ No newline at end of file
diff --git a/examples/dart/web_wasm/bin/example_web.dart b/examples/dart/web_wasm/bin/example_web.dart
new file mode 100644
index 00000000..37e35c1a
--- /dev/null
+++ b/examples/dart/web_wasm/bin/example_web.dart
@@ -0,0 +1,57 @@
+import 'dart:js_interop';
+import 'dart:js_interop_unsafe';
+import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart';
+import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.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 = thermion_dart_web_get_resource_loader_wrapper();
+
+ var viewer = ThermionViewerFFI(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/examples/dart/web_wasm/bin/example_web.mjs b/examples/dart/web_wasm/bin/example_web.mjs
new file mode 100644
index 00000000..836f37a3
--- /dev/null
+++ b/examples/dart/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/examples/dart/web_wasm/bin/example_web.unopt.wasm b/examples/dart/web_wasm/bin/example_web.unopt.wasm
new file mode 100644
index 00000000..3bda1345
Binary files /dev/null and b/examples/dart/web_wasm/bin/example_web.unopt.wasm differ
diff --git a/examples/dart/web_wasm/bin/example_web.wasm b/examples/dart/web_wasm/bin/example_web.wasm
new file mode 100644
index 00000000..763b8df9
Binary files /dev/null and b/examples/dart/web_wasm/bin/example_web.wasm differ
diff --git a/examples/dart/web_wasm/bin/index.html b/examples/dart/web_wasm/bin/index.html
new file mode 100644
index 00000000..7abc5620
--- /dev/null
+++ b/examples/dart/web_wasm/bin/index.html
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/dart/web_wasm/bin/thermion_dart.js b/examples/dart/web_wasm/bin/thermion_dart.js
new file mode 120000
index 00000000..6710a76f
--- /dev/null
+++ b/examples/dart/web_wasm/bin/thermion_dart.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.js
\ No newline at end of file
diff --git a/examples/dart/web_wasm/bin/thermion_dart.wasm b/examples/dart/web_wasm/bin/thermion_dart.wasm
new file mode 120000
index 00000000..a1439c39
--- /dev/null
+++ b/examples/dart/web_wasm/bin/thermion_dart.wasm
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.wasm
\ No newline at end of file
diff --git a/examples/dart/web_wasm/bin/thermion_dart.worker.js b/examples/dart/web_wasm/bin/thermion_dart.worker.js
new file mode 120000
index 00000000..54392ba9
--- /dev/null
+++ b/examples/dart/web_wasm/bin/thermion_dart.worker.js
@@ -0,0 +1 @@
+../../../native/web/build/build/out/dart_filament.worker.js
\ No newline at end of file
diff --git a/examples/dart/web_wasm/pubspec.yaml b/examples/dart/web_wasm/pubspec.yaml
new file mode 100644
index 00000000..e1be14e3
--- /dev/null
+++ b/examples/dart/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:
+ thermion_dart:
+ path: ../../
+ ffi:
+
+dev_dependencies:
+ lints: ^3.0.0
+ test: ^1.24.0
diff --git a/examples/dart/web_wasm/test/example_web_test.dart b/examples/dart/web_wasm/test/example_web_test.dart
new file mode 100644
index 00000000..4c50d967
--- /dev/null
+++ b/examples/dart/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/example/.fvm/fvm_config.json b/examples/flutter/example/.fvm/fvm_config.json
similarity index 100%
rename from example/.fvm/fvm_config.json
rename to examples/flutter/example/.fvm/fvm_config.json
diff --git a/example/.gitattributes b/examples/flutter/example/.gitattributes
similarity index 100%
rename from example/.gitattributes
rename to examples/flutter/example/.gitattributes
diff --git a/example/.gitignore b/examples/flutter/example/.gitignore
similarity index 93%
rename from example/.gitignore
rename to examples/flutter/example/.gitignore
index 40b27f75..76cbb205 100644
--- a/example/.gitignore
+++ b/examples/flutter/example/.gitignore
@@ -32,7 +32,6 @@
/build/
# Web related
-lib/generated_plugin_registrant.dart
# Symbolication related
app.*.symbols
@@ -48,4 +47,4 @@ app.*.map.json
/android/.cxx/**/*
# fvm
-.fvm/flutter_sdk
\ No newline at end of file
+.fvm/flutter_sdk
diff --git a/example/.metadata b/examples/flutter/example/.metadata
similarity index 65%
rename from example/.metadata
rename to examples/flutter/example/.metadata
index 13169084..de6eb858 100644
--- a/example/.metadata
+++ b/examples/flutter/example/.metadata
@@ -4,7 +4,7 @@
# This file should be version controlled and should not be manually edited.
version:
- revision: "a3a651d82270ff0c40ab2d1615ef6d36af11d580"
+ revision: "12d54de962782853206992fedce29723fcb4a95b"
channel: "master"
project_type: app
@@ -13,11 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
- create_revision: a3a651d82270ff0c40ab2d1615ef6d36af11d580
- base_revision: a3a651d82270ff0c40ab2d1615ef6d36af11d580
- - platform: android
- create_revision: a3a651d82270ff0c40ab2d1615ef6d36af11d580
- base_revision: a3a651d82270ff0c40ab2d1615ef6d36af11d580
+ create_revision: 12d54de962782853206992fedce29723fcb4a95b
+ base_revision: 12d54de962782853206992fedce29723fcb4a95b
+ - platform: macos
+ create_revision: 12d54de962782853206992fedce29723fcb4a95b
+ base_revision: 12d54de962782853206992fedce29723fcb4a95b
# User provided section
diff --git a/example/README.md b/examples/flutter/example/README.md
similarity index 90%
rename from example/README.md
rename to examples/flutter/example/README.md
index 8f831b07..a1e9374f 100644
--- a/example/README.md
+++ b/examples/flutter/example/README.md
@@ -1,6 +1,6 @@
-# flutter_filament_example
+# thermion_flutter_example
-Demonstrates how to use the flutter_filament plugin.
+Demonstrates how to use the thermion_flutter plugin.
## Linux
diff --git a/example/analysis_options.yaml b/examples/flutter/example/analysis_options.yaml
similarity index 100%
rename from example/analysis_options.yaml
rename to examples/flutter/example/analysis_options.yaml
diff --git a/example/android/.gitignore b/examples/flutter/example/android/.gitignore
similarity index 97%
rename from example/android/.gitignore
rename to examples/flutter/example/android/.gitignore
index 473d8bd3..6f568019 100644
--- a/example/android/.gitignore
+++ b/examples/flutter/example/android/.gitignore
@@ -6,8 +6,6 @@ gradle-wrapper.jar
/local.properties
GeneratedPluginRegistrant.java
-.cxx/
-
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
diff --git a/examples/flutter/example/android/app/build.gradle b/examples/flutter/example/android/app/build.gradle
new file mode 100644
index 00000000..2641214e
--- /dev/null
+++ b/examples/flutter/example/android/app/build.gradle
@@ -0,0 +1,51 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
+android {
+ namespace = "app.polyvox.example"
+ compileSdkVersion 34
+ ndkVersion "25.2.9519653"
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId = "app.polyvox.example"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
+ minSdk = 30
+ targetSdk = 31
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ buildTypes {
+ release {
+ signingConfig = signingConfigs.debug
+ shrinkResources false
+ minifyEnabled false
+ }
+ debug {
+
+ }
+ }
+}
+
+dependencies {
+ implementation 'net.java.dev.jna:jna:5.10.0@aar'
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/example/android/app/src/debug/AndroidManifest.xml b/examples/flutter/example/android/app/src/debug/AndroidManifest.xml
similarity index 57%
rename from example/android/app/src/debug/AndroidManifest.xml
rename to examples/flutter/example/android/app/src/debug/AndroidManifest.xml
index 3fac46b6..399f6981 100644
--- a/example/android/app/src/debug/AndroidManifest.xml
+++ b/examples/flutter/example/android/app/src/debug/AndroidManifest.xml
@@ -1,6 +1,6 @@
-
-
diff --git a/example/android/app/src/main/AndroidManifest.xml b/examples/flutter/example/android/app/src/main/AndroidManifest.xml
similarity index 60%
rename from example/android/app/src/main/AndroidManifest.xml
rename to examples/flutter/example/android/app/src/main/AndroidManifest.xml
index 10e1b0cb..74a78b93 100644
--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/examples/flutter/example/android/app/src/main/AndroidManifest.xml
@@ -1,20 +1,17 @@
-
-
-
+
+ android:icon="@mipmap/ic_launcher">
+ android:windowSoftInputMode="adjustResize">
-
@@ -43,4 +31,15 @@
android:name="flutterEmbedding"
android:value="2" />
+
+
+
+
+
+
+
diff --git a/examples/flutter/example/android/app/src/main/kotlin/app/polyvox/example/MainActivity.kt b/examples/flutter/example/android/app/src/main/kotlin/app/polyvox/example/MainActivity.kt
new file mode 100644
index 00000000..c546a613
--- /dev/null
+++ b/examples/flutter/example/android/app/src/main/kotlin/app/polyvox/example/MainActivity.kt
@@ -0,0 +1,5 @@
+package app.polyvox.example
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity()
diff --git a/example/android/app/src/main/res/drawable-v21/launch_background.xml b/examples/flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml
similarity index 100%
rename from example/android/app/src/main/res/drawable-v21/launch_background.xml
rename to examples/flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml
diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/examples/flutter/example/android/app/src/main/res/drawable/launch_background.xml
similarity index 100%
rename from example/android/app/src/main/res/drawable/launch_background.xml
rename to examples/flutter/example/android/app/src/main/res/drawable/launch_background.xml
diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to examples/flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to examples/flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to examples/flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to examples/flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to examples/flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/example/android/app/src/main/res/values-night/styles.xml b/examples/flutter/example/android/app/src/main/res/values-night/styles.xml
similarity index 94%
rename from example/android/app/src/main/res/values-night/styles.xml
rename to examples/flutter/example/android/app/src/main/res/values-night/styles.xml
index 449a9f93..06952be7 100644
--- a/example/android/app/src/main/res/values-night/styles.xml
+++ b/examples/flutter/example/android/app/src/main/res/values-night/styles.xml
@@ -3,14 +3,14 @@
+
+
+
diff --git a/example/android/app/src/profile/AndroidManifest.xml b/examples/flutter/example/android/app/src/profile/AndroidManifest.xml
similarity index 57%
rename from example/android/app/src/profile/AndroidManifest.xml
rename to examples/flutter/example/android/app/src/profile/AndroidManifest.xml
index 3fac46b6..399f6981 100644
--- a/example/android/app/src/profile/AndroidManifest.xml
+++ b/examples/flutter/example/android/app/src/profile/AndroidManifest.xml
@@ -1,6 +1,6 @@
-
-
diff --git a/examples/flutter/example/android/build.gradle b/examples/flutter/example/android/build.gradle
new file mode 100644
index 00000000..d2ffbffa
--- /dev/null
+++ b/examples/flutter/example/android/build.gradle
@@ -0,0 +1,18 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = "../build"
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/examples/flutter/example/android/gradle.properties b/examples/flutter/example/android/gradle.properties
new file mode 100644
index 00000000..25971708
--- /dev/null
+++ b/examples/flutter/example/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/examples/flutter/example/android/gradle/wrapper/gradle-wrapper.properties
similarity index 80%
rename from example/android/gradle/wrapper/gradle-wrapper.properties
rename to examples/flutter/example/android/gradle/wrapper/gradle-wrapper.properties
index bc6a58af..e1ca574e 100644
--- a/example/android/gradle/wrapper/gradle-wrapper.properties
+++ b/examples/flutter/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
diff --git a/examples/flutter/example/android/settings.gradle b/examples/flutter/example/android/settings.gradle
new file mode 100644
index 00000000..536165d3
--- /dev/null
+++ b/examples/flutter/example/android/settings.gradle
@@ -0,0 +1,25 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }()
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+plugins {
+ id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+ id "com.android.application" version "7.3.0" apply false
+ id "org.jetbrains.kotlin.android" version "1.7.10" apply false
+}
+
+include ":app"
diff --git a/examples/flutter/example/assets b/examples/flutter/example/assets
new file mode 120000
index 00000000..41aef43f
--- /dev/null
+++ b/examples/flutter/example/assets
@@ -0,0 +1 @@
+../../assets
\ No newline at end of file
diff --git a/example/integration_test/goldens/ios/0_fresh.png b/examples/flutter/example/integration_test/goldens/ios/0_fresh.png
similarity index 100%
rename from example/integration_test/goldens/ios/0_fresh.png
rename to examples/flutter/example/integration_test/goldens/ios/0_fresh.png
diff --git a/example/integration_test/goldens/ios/10_setshapespositionto.png b/examples/flutter/example/integration_test/goldens/ios/10_setshapespositionto.png
similarity index 100%
rename from example/integration_test/goldens/ios/10_setshapespositionto.png
rename to examples/flutter/example/integration_test/goldens/ios/10_setshapespositionto.png
diff --git a/example/integration_test/goldens/ios/11_Disablefrustumculling.png b/examples/flutter/example/integration_test/goldens/ios/11_Disablefrustumculling.png
similarity index 100%
rename from example/integration_test/goldens/ios/11_Disablefrustumculling.png
rename to examples/flutter/example/integration_test/goldens/ios/11_Disablefrustumculling.png
diff --git a/example/integration_test/goldens/ios/12_Settonemappingtolinear.png b/examples/flutter/example/integration_test/goldens/ios/12_Settonemappingtolinear.png
similarity index 100%
rename from example/integration_test/goldens/ios/12_Settonemappingtolinear.png
rename to examples/flutter/example/integration_test/goldens/ios/12_Settonemappingtolinear.png
diff --git a/example/integration_test/goldens/ios/13_Movecameratoasset.png b/examples/flutter/example/integration_test/goldens/ios/13_Movecameratoasset.png
similarity index 100%
rename from example/integration_test/goldens/ios/13_Movecameratoasset.png
rename to examples/flutter/example/integration_test/goldens/ios/13_Movecameratoasset.png
diff --git a/example/integration_test/goldens/ios/14_movecamerato.png b/examples/flutter/example/integration_test/goldens/ios/14_movecamerato.png
similarity index 100%
rename from example/integration_test/goldens/ios/14_movecamerato.png
rename to examples/flutter/example/integration_test/goldens/ios/14_movecamerato.png
diff --git a/example/integration_test/goldens/ios/15_setcameratofirstcamerainshapesGLB.png b/examples/flutter/example/integration_test/goldens/ios/15_setcameratofirstcamerainshapesGLB.png
similarity index 100%
rename from example/integration_test/goldens/ios/15_setcameratofirstcamerainshapesGLB.png
rename to examples/flutter/example/integration_test/goldens/ios/15_setcameratofirstcamerainshapesGLB.png
diff --git a/example/integration_test/goldens/ios/16_resize.png b/examples/flutter/example/integration_test/goldens/ios/16_resize.png
similarity index 100%
rename from example/integration_test/goldens/ios/16_resize.png
rename to examples/flutter/example/integration_test/goldens/ios/16_resize.png
diff --git a/example/integration_test/goldens/ios/17_resize.png b/examples/flutter/example/integration_test/goldens/ios/17_resize.png
similarity index 100%
rename from example/integration_test/goldens/ios/17_resize.png
rename to examples/flutter/example/integration_test/goldens/ios/17_resize.png
diff --git a/example/integration_test/goldens/ios/18_resize.png b/examples/flutter/example/integration_test/goldens/ios/18_resize.png
similarity index 100%
rename from example/integration_test/goldens/ios/18_resize.png
rename to examples/flutter/example/integration_test/goldens/ios/18_resize.png
diff --git a/example/integration_test/goldens/ios/19_resize.png b/examples/flutter/example/integration_test/goldens/ios/19_resize.png
similarity index 100%
rename from example/integration_test/goldens/ios/19_resize.png
rename to examples/flutter/example/integration_test/goldens/ios/19_resize.png
diff --git a/example/integration_test/goldens/ios/1_createviewerdefaultubershader.png b/examples/flutter/example/integration_test/goldens/ios/1_createviewerdefaultubershader.png
similarity index 100%
rename from example/integration_test/goldens/ios/1_createviewerdefaultubershader.png
rename to examples/flutter/example/integration_test/goldens/ios/1_createviewerdefaultubershader.png
diff --git a/example/integration_test/goldens/ios/2_Renderingfalse.png b/examples/flutter/example/integration_test/goldens/ios/2_Renderingfalse.png
similarity index 100%
rename from example/integration_test/goldens/ios/2_Renderingfalse.png
rename to examples/flutter/example/integration_test/goldens/ios/2_Renderingfalse.png
diff --git a/example/integration_test/goldens/ios/3_loadskybox.png b/examples/flutter/example/integration_test/goldens/ios/3_loadskybox.png
similarity index 100%
rename from example/integration_test/goldens/ios/3_loadskybox.png
rename to examples/flutter/example/integration_test/goldens/ios/3_loadskybox.png
diff --git a/example/integration_test/goldens/ios/4_loadIBL.png b/examples/flutter/example/integration_test/goldens/ios/4_loadIBL.png
similarity index 100%
rename from example/integration_test/goldens/ios/4_loadIBL.png
rename to examples/flutter/example/integration_test/goldens/ios/4_loadIBL.png
diff --git a/example/integration_test/goldens/ios/5_loadshapesGLB.png b/examples/flutter/example/integration_test/goldens/ios/5_loadshapesGLB.png
similarity index 100%
rename from example/integration_test/goldens/ios/5_loadshapesGLB.png
rename to examples/flutter/example/integration_test/goldens/ios/5_loadshapesGLB.png
diff --git a/example/integration_test/goldens/ios/6_zoomin.png b/examples/flutter/example/integration_test/goldens/ios/6_zoomin.png
similarity index 100%
rename from example/integration_test/goldens/ios/6_zoomin.png
rename to examples/flutter/example/integration_test/goldens/ios/6_zoomin.png
diff --git a/example/integration_test/goldens/ios/7_rotate.png b/examples/flutter/example/integration_test/goldens/ios/7_rotate.png
similarity index 100%
rename from example/integration_test/goldens/ios/7_rotate.png
rename to examples/flutter/example/integration_test/goldens/ios/7_rotate.png
diff --git a/example/integration_test/goldens/ios/8_pan.png b/examples/flutter/example/integration_test/goldens/ios/8_pan.png
similarity index 100%
rename from example/integration_test/goldens/ios/8_pan.png
rename to examples/flutter/example/integration_test/goldens/ios/8_pan.png
diff --git a/example/integration_test/goldens/ios/9_transformtounitcube.png b/examples/flutter/example/integration_test/goldens/ios/9_transformtounitcube.png
similarity index 100%
rename from example/integration_test/goldens/ios/9_transformtounitcube.png
rename to examples/flutter/example/integration_test/goldens/ios/9_transformtounitcube.png
diff --git a/example/integration_test/plugin_integration_test.dart b/examples/flutter/example/integration_test/plugin_integration_test.dart
similarity index 95%
rename from example/integration_test/plugin_integration_test.dart
rename to examples/flutter/example/integration_test/plugin_integration_test.dart
index ea543418..d1a921f0 100644
--- a/example/integration_test/plugin_integration_test.dart
+++ b/examples/flutter/example/integration_test/plugin_integration_test.dart
@@ -4,9 +4,9 @@ import 'dart:ui';
import 'package:flutter/gestures.dart';
import 'package:flutter/widgets.dart';
+import 'package:thermion_flutter/filament/widgets/filament_widget.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
-import 'package:flutter_filament/widgets/filament_widget.dart';
import '../lib/main.dart' as app;
void main() {
@@ -89,9 +89,9 @@ void main() {
await _snapshot(tester, "fresh");
await tap(tester, "Controller / Viewer");
- await tap(tester, "Create FilamentController (default ubershader)");
+ await tap(tester, "Create ThermionFlutterPlugin (default ubershader)");
await tap(tester, "Controller / Viewer");
- await tap(tester, "Create FilamentViewer",
+ await tap(tester, "Create ThermionViewerFFI",
4); // on older devices this may take a while, so let's insert a length delay
await tap(tester, "Scene");
@@ -114,7 +114,7 @@ void main() {
await tap(tester, "Load IBL", 1);
final Offset pointerLocation =
- tester.getCenter(find.byType(FilamentWidget));
+ tester.getCenter(find.byType(ThermionWidget));
TestPointer testPointer = TestPointer(1, PointerDeviceKind.mouse);
// scroll/zoom
diff --git a/example/ios/.gitignore b/examples/flutter/example/ios/.gitignore
similarity index 100%
rename from example/ios/.gitignore
rename to examples/flutter/example/ios/.gitignore
diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/examples/flutter/example/ios/Flutter/AppFrameworkInfo.plist
similarity index 96%
rename from example/ios/Flutter/AppFrameworkInfo.plist
rename to examples/flutter/example/ios/Flutter/AppFrameworkInfo.plist
index 9625e105..7c569640 100644
--- a/example/ios/Flutter/AppFrameworkInfo.plist
+++ b/examples/flutter/example/ios/Flutter/AppFrameworkInfo.plist
@@ -21,6 +21,6 @@
CFBundleVersion
1.0
MinimumOSVersion
- 11.0
+ 12.0
diff --git a/example/ios/Flutter/Debug.xcconfig b/examples/flutter/example/ios/Flutter/Debug.xcconfig
similarity index 100%
rename from example/ios/Flutter/Debug.xcconfig
rename to examples/flutter/example/ios/Flutter/Debug.xcconfig
diff --git a/example/ios/Flutter/Release.xcconfig b/examples/flutter/example/ios/Flutter/Release.xcconfig
similarity index 100%
rename from example/ios/Flutter/Release.xcconfig
rename to examples/flutter/example/ios/Flutter/Release.xcconfig
diff --git a/example/ios/Podfile b/examples/flutter/example/ios/Podfile
similarity index 94%
rename from example/ios/Podfile
rename to examples/flutter/example/ios/Podfile
index 9061ff8f..3e44f9c6 100644
--- a/example/ios/Podfile
+++ b/examples/flutter/example/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-platform :ios, '12.1'
+platform :ios, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
@@ -32,6 +32,9 @@ target 'Runner' do
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
end
post_install do |installer|
diff --git a/examples/flutter/example/ios/Podfile.lock b/examples/flutter/example/ios/Podfile.lock
new file mode 100644
index 00000000..a4335a9c
--- /dev/null
+++ b/examples/flutter/example/ios/Podfile.lock
@@ -0,0 +1,35 @@
+PODS:
+ - Flutter (1.0.0)
+ - integration_test (0.0.1):
+ - Flutter
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - thermion_flutter (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - Flutter (from `Flutter`)
+ - integration_test (from `.symlinks/plugins/integration_test/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - thermion_flutter (from `.symlinks/plugins/thermion_flutter/ios`)
+
+EXTERNAL SOURCES:
+ Flutter:
+ :path: Flutter
+ integration_test:
+ :path: ".symlinks/plugins/integration_test/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ thermion_flutter:
+ :path: ".symlinks/plugins/thermion_flutter/ios"
+
+SPEC CHECKSUMS:
+ Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
+ integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ thermion_flutter: dd8d01cb3b3e6e9a612f5a1061a96be1e1c2f659
+
+PODFILE CHECKSUM: a57f30d18f102dd3ce366b1d62a55ecbef2158e5
+
+COCOAPODS: 1.15.2
diff --git a/examples/flutter/example/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter/example/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..0b85a8de
--- /dev/null
+++ b/examples/flutter/example/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,730 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 18BA9BAB0A3151C581637BC5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 913673949B5C862688BEB411 /* Pods_Runner.framework */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 44B597F813CB15F7F7362D7F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3E559449EFA9688E4362535A /* Pods_RunnerTests.framework */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 24862DEBD358E9187AF1957F /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 28E01474E257DCB9E5A9F16D /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 34F6152C42E578942239D66E /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 3E559449EFA9688E4362535A /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 71B8727E9D9717E2EC7D0632 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 913673949B5C862688BEB411 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ C4E435CCE2B189B896F861F8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ FA604CE866685A80B2F7D1EA /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 18BA9BAB0A3151C581637BC5 /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ E5F93109740F1CF8EAB7C740 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 44B597F813CB15F7F7362D7F /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 3762816736B339B0521FA963 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ FA604CE866685A80B2F7D1EA /* Pods-Runner.debug.xcconfig */,
+ C4E435CCE2B189B896F861F8 /* Pods-Runner.release.xcconfig */,
+ 24862DEBD358E9187AF1957F /* Pods-Runner.profile.xcconfig */,
+ 34F6152C42E578942239D66E /* Pods-RunnerTests.debug.xcconfig */,
+ 28E01474E257DCB9E5A9F16D /* Pods-RunnerTests.release.xcconfig */,
+ 71B8727E9D9717E2EC7D0632 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ 3762816736B339B0521FA963 /* Pods */,
+ F604EC48BBC88B9D456C52C9 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ F604EC48BBC88B9D456C52C9 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 913673949B5C862688BEB411 /* Pods_Runner.framework */,
+ 3E559449EFA9688E4362535A /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 966EE0BC7D8B7994F46B60D0 /* [CP] Check Pods Manifest.lock */,
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ E5F93109740F1CF8EAB7C740 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ F7EDF8FA795C5CA2175B4CDF /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ ED098149A1804FAFC41C252E /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 966EE0BC7D8B7994F46B60D0 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+ ED098149A1804FAFC41C252E /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ F7EDF8FA795C5CA2175B4CDF /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = TM2B4SJXNJ;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "app.flutter-filament.example";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 34F6152C42E578942239D66E /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 28E01474E257DCB9E5A9F16D /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 71B8727E9D9717E2EC7D0632 /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = TM2B4SJXNJ;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "app.flutter-filament.example";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = TM2B4SJXNJ;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = "app.flutter-filament.example";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to examples/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to examples/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to examples/flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
similarity index 86%
rename from example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
rename to examples/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index a6b826db..8e3ca5df 100644
--- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/examples/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
@@ -24,6 +26,8 @@
$(FLUTTER_BUILD_NUMBER)
LSRequiresIPhoneOS
+ UIApplicationSupportsIndirectInputEvents
+
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
@@ -41,11 +45,5 @@
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
- UIViewControllerBasedStatusBarAppearance
-
- CADisableMinimumFrameDurationOnPhone
-
- UIApplicationSupportsIndirectInputEvents
-
diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/examples/flutter/example/ios/Runner/Runner-Bridging-Header.h
similarity index 100%
rename from example/ios/Runner/Runner-Bridging-Header.h
rename to examples/flutter/example/ios/Runner/Runner-Bridging-Header.h
diff --git a/examples/flutter/example/ios/RunnerTests/RunnerTests.swift b/examples/flutter/example/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..86a7c3b1
--- /dev/null
+++ b/examples/flutter/example/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/examples/flutter/example/lib/camera_matrix_overlay.dart b/examples/flutter/example/lib/camera_matrix_overlay.dart
new file mode 100644
index 00000000..a2c4c17d
--- /dev/null
+++ b/examples/flutter/example/lib/camera_matrix_overlay.dart
@@ -0,0 +1,139 @@
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:vector_math/vector_math_64.dart' as v;
+import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
+
+class CameraMatrixOverlay extends StatefulWidget {
+ final ThermionViewer controller;
+ final bool showProjectionMatrices;
+
+ const CameraMatrixOverlay(
+ {super.key,
+ required this.controller,
+ required this.showProjectionMatrices});
+
+ @override
+ State createState() => _CameraMatrixOverlayState();
+}
+
+class _CameraMatrixOverlayState extends State {
+ Timer? _cameraTimer;
+ String? _cameraPosition;
+ String? _cameraRotation;
+
+ String? _cameraProjectionMatrix;
+ String? _cameraCullingProjectionMatrix;
+
+ void _tick(Timer timer) async {
+ var cameraPosition = await widget.controller.getCameraPosition();
+ var cameraRotation = await widget.controller.getCameraRotation();
+
+ _cameraPosition =
+ "${cameraPosition.storage.map((v) => v.toStringAsFixed(2))}";
+ _cameraRotation =
+ "${cameraRotation.storage.map((v) => v.toStringAsFixed(2))}";
+
+ if (widget.showProjectionMatrices) {
+ var projMatrix = await widget.controller.getCameraProjectionMatrix();
+ var cullingMatrix =
+ await widget.controller.getCameraCullingProjectionMatrix();
+
+ _cameraProjectionMatrix =
+ projMatrix.storage.map((v) => v.toStringAsFixed(2)).join(",");
+ _cameraCullingProjectionMatrix =
+ cullingMatrix.storage.map((v) => v.toStringAsFixed(2)).join(",");
+ _getFrustum();
+ }
+
+ setState(() {});
+ }
+
+ void _updateTimer() async {
+ _cameraTimer?.cancel();
+ await widget.controller.initialized;
+ }
+
+ v.Frustum? _frustum;
+
+ void _getFrustum() async {
+ _frustum = await widget.controller.getCameraFrustum();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _updateTimer();
+ }
+
+ @override
+ void didUpdateWidget(CameraMatrixOverlay oldWidget) {
+ super.didUpdateWidget(oldWidget);
+ setState(() {});
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ _cameraTimer?.cancel();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ decoration: BoxDecoration(
+ color: Colors.black.withOpacity(0.5),
+ borderRadius: BorderRadius.circular(29)),
+ padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Text("Camera : $_cameraPosition $_cameraRotation",
+ style:
+ const TextStyle(color: Colors.white, fontSize: 10)),
+ // widget.showProjectionMatrices
+ // ? Text("Projection matrix : $_cameraProjectionMatrix",
+ // style: const TextStyle(color: Colors.white, fontSize: 12))
+ // : Container(),
+ // widget.showProjectionMatrices
+ // ? Text("Culling matrix : $_cameraCullingProjectionMatrix",
+ // style: const TextStyle(color: Colors.white, fontSize: 12))
+ // : Container(),
+ widget.showProjectionMatrices
+ ? const Text("Frustum matrix",
+ style: TextStyle(color: Colors.white, fontSize: 10))
+ : Container()
+ ] +
+ (_frustum == null
+ ? []
+ : [
+ _frustum!.plane0,
+ _frustum!.plane1,
+ _frustum!.plane2,
+ _frustum!.plane3,
+ _frustum!.plane4,
+ _frustum!.plane5
+ ]
+ .map((plane) => Row(
+ children: [
+ plane.normal.x,
+ plane.normal.y,
+ plane.normal.z,
+ plane.constant
+ ]
+ .map((v) => Text(
+ v.toStringAsFixed(2) + " ",
+ style: const TextStyle(
+ color: Colors.white,
+ fontSize: 10),
+ textAlign: TextAlign.center,
+ ))
+ .cast()
+ .toList()))
+ .cast()
+ .toList())));
+ }
+}
diff --git a/examples/flutter/example/lib/example_viewport.dart b/examples/flutter/example/lib/example_viewport.dart
new file mode 100644
index 00000000..4b48ea6c
--- /dev/null
+++ b/examples/flutter/example/lib/example_viewport.dart
@@ -0,0 +1,37 @@
+import 'package:flutter/widgets.dart';
+import 'package:thermion_flutter/filament/widgets/camera/entity_controller_mouse_widget.dart';
+import 'package:thermion_flutter/filament/widgets/camera/gestures/filament_gesture_detector.dart';
+import 'package:thermion_flutter/filament/widgets/filament_widget.dart';
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:thermion_dart/thermion_dart/entities/entity_transform_controller.dart';
+
+
+class ExampleViewport extends StatelessWidget {
+ final ThermionFlutterPlugin? controller;
+ final EntityTransformController? entityTransformController;
+ final EdgeInsets padding;
+ final FocusNode keyboardFocusNode;
+
+ const ExampleViewport(
+ {super.key,
+ required this.controller,
+ required this.padding,
+ required this.keyboardFocusNode,
+ this.entityTransformController});
+
+ @override
+ Widget build(BuildContext context) {
+ return controller != null
+ ? Padding(
+ padding: padding,
+ child: EntityTransformMouseControllerWidget(
+ transformController: entityTransformController,
+ child: FilamentGestureDetector(
+ showControlOverlay: true,
+ controller: controller!.viewer,
+ child: ThermionWidget(
+ plugin: controller!,
+ ))))
+ : Container();
+ }
+}
diff --git a/examples/flutter/example/lib/main.dart b/examples/flutter/example/lib/main.dart
new file mode 100644
index 00000000..b5cbf62c
--- /dev/null
+++ b/examples/flutter/example/lib/main.dart
@@ -0,0 +1,203 @@
+import 'dart:async';
+import 'package:flutter/material.dart';
+import 'package:thermion_flutter/filament/widgets/debug/entity_list_widget.dart';
+import 'package:thermion_flutter_example/camera_matrix_overlay.dart';
+import 'package:thermion_flutter_example/menus/controller_menu.dart';
+import 'package:thermion_flutter_example/example_viewport.dart';
+import 'package:thermion_dart/thermion_dart/entities/entity_transform_controller.dart';
+import 'package:thermion_flutter_example/menus/scene_menu.dart';
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:thermion_flutter_example/picker_result_widget.dart';
+
+
+const loadDefaultScene = bool.hasEnvironment('--load-default-scene');
+
+void main() async {
+ runApp(const MyApp());
+}
+
+class MyApp extends StatefulWidget {
+ const MyApp({Key? key}) : super(key: key);
+
+ @override
+ State createState() => _MyAppState();
+}
+
+class _MyAppState extends State with SingleTickerProviderStateMixin {
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ theme: ThemeData(
+ useMaterial3: true,
+ textTheme: const TextTheme(
+ labelLarge: TextStyle(fontSize: 12),
+ displayMedium: TextStyle(fontSize: 12),
+ headlineMedium: const TextStyle(fontSize: 12),
+ titleMedium: TextStyle(fontSize: 12),
+ bodyLarge: TextStyle(fontSize: 14),
+ bodyMedium: TextStyle(fontSize: 12))),
+ // showPerformanceOverlay: true,
+ home: const Scaffold(
+ backgroundColor: Color(0x00000000),
+ body: ExampleWidget()));
+ }
+}
+
+class ExampleWidget extends StatefulWidget {
+ const ExampleWidget({super.key});
+
+ @override
+ State createState() {
+ return ExampleWidgetState();
+ }
+}
+
+enum MenuType { controller, assets, camera, misc }
+
+class ExampleWidgetState extends State {
+ final _plugin = ThermionFlutterPlugin();
+
+ EdgeInsets _viewportMargin = EdgeInsets.zero;
+
+ // these are all the options that can be set via the menu
+ // we store them here
+ static bool rendering = false;
+ static bool recording = false;
+ static int framerate = 60;
+ static bool postProcessing = false;
+ static bool antiAliasingMsaa = false;
+ static bool antiAliasingTaa = false;
+ static bool antiAliasingFxaa = false;
+ static bool frustumCulling = true;
+
+ static double zoomSpeed = 0.01;
+ static double orbitSpeedX = 0.01;
+ static double orbitSpeedY = 0.01;
+
+ static bool hasSkybox = false;
+ static bool coneHidden = false;
+
+ static bool loop = false;
+ static final showProjectionMatrices = ValueNotifier(false);
+
+ late StreamSubscription _listener;
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ _listener.cancel();
+ }
+
+ EntityTransformController? _transformController;
+
+ final _sharedFocusNode = FocusNode();
+
+ @override
+ Widget build(BuildContext context) {
+ return FutureBuilder(
+ future: _plugin.initialized,
+ builder: (_, AsyncSnapshot initialized) {
+ var isInitialized = initialized.data == true;
+
+ return Stack(
+ fit: StackFit.expand,
+ children: [
+ if (isInitialized)
+ Positioned.fill(
+ child: ExampleViewport(
+ controller: isInitialized ? _plugin : null,
+ entityTransformController: _transformController,
+ padding: _viewportMargin,
+ keyboardFocusNode: _sharedFocusNode),
+ ),
+ Positioned(
+ bottom: 30,
+ left: 0,
+ right: 10,
+ height: 30,
+ child: Container(
+ height: 30,
+ decoration: BoxDecoration(
+ borderRadius: BorderRadius.circular(30),
+ color: Colors.white.withOpacity(0.25),
+ ),
+ padding: const EdgeInsets.symmetric(horizontal: 10),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ ControllerMenu(
+ sharedFocusNode: _sharedFocusNode,
+ controller: _plugin,
+ onToggleViewport: () {
+ setState(() {
+ _viewportMargin =
+ (_viewportMargin == EdgeInsets.zero)
+ ? const EdgeInsets.all(30)
+ : EdgeInsets.zero;
+ });
+ },
+ onControllerDestroyed: () {},
+ onControllerCreated: () {}),
+ SceneMenu(
+ sharedFocusNode: _sharedFocusNode,
+ controller: _plugin,
+ ),
+ GestureDetector(
+ onTap: () async {
+ await _plugin.viewer.loadGlb(
+ 'assets/shapes/shapes.glb',
+ numInstances: 1);
+ },
+ child: Container(
+ color: Colors.transparent,
+ child: const Text("shapes.glb"))),
+ const SizedBox(width: 5),
+ GestureDetector(
+ onTap: () async {
+ await _plugin.viewer.loadGlb('assets/1.glb');
+ },
+ child: Container(
+ color: Colors.transparent,
+ child: const Text("1.glb"))),
+ const SizedBox(width: 5),
+ GestureDetector(
+ onTap: () async {
+ await _plugin.viewer.loadGlb('assets/2.glb');
+ },
+ child: Container(
+ color: Colors.transparent,
+ child: const Text("2.glb"))),
+ const SizedBox(width: 5),
+ GestureDetector(
+ onTap: () async {
+ await _plugin.viewer.loadGlb('assets/3.glb');
+ },
+ child: Container(
+ color: Colors.transparent,
+ child: const Text("3.glb"))),
+ Expanded(child: Container()),
+ ]))),
+ if (isInitialized) ...[
+ Positioned(top:10, left:10, width:200, height:200, child:Container(
+ child:EntityListWidget(controller: _plugin.viewer))),
+ // Padding(
+ // padding: const EdgeInsets.only(top: 10, left: 20, right: 20),
+ // child: ValueListenableBuilder(
+ // valueListenable: showProjectionMatrices,
+ // builder: (ctx, value, child) => CameraMatrixOverlay(
+ // controller: _plugin.viewer, showProjectionMatrices: value)),
+ // ),
+ // Align(
+ // alignment: Alignment.topRight,
+ // child: PickerResultWidget(controller: _plugin.viewer),
+ // )
+ ]
+ ]);
+ });
+ }
+}
diff --git a/examples/flutter/example/lib/menus/asset_submenu.dart b/examples/flutter/example/lib/menus/asset_submenu.dart
new file mode 100644
index 00000000..3ddc3d08
--- /dev/null
+++ b/examples/flutter/example/lib/menus/asset_submenu.dart
@@ -0,0 +1,263 @@
+import 'dart:math';
+
+import 'package:flutter/material.dart';
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:animation_tools_dart/animation_tools_dart.dart';
+import 'package:thermion_flutter_example/main.dart';
+import 'package:vector_math/vector_math_64.dart' as v;
+import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
+
+class AssetSubmenu extends StatefulWidget {
+ final ThermionFlutterPlugin controller;
+ const AssetSubmenu({super.key, required this.controller});
+
+ @override
+ State createState() => _AssetSubmenuState();
+}
+
+class _AssetSubmenuState extends State {
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ Widget _shapesSubmenu() {
+ var children = [
+ MenuItemButton(
+ closeOnActivate: false,
+ onPressed: () async {
+ var entity = await widget.controller.viewer.getChildEntity(
+ widget.controller.viewer.scene.listEntities().last, "Cylinder");
+ await showDialog(
+ context: context,
+ builder: (BuildContext context) {
+ return Center(
+ child: Container(
+ color: Colors.white, child: Text(entity.toString())));
+ });
+ },
+ child: const Text('Find Cylinder entity by name')),
+ MenuItemButton(
+ onPressed: () async {
+ widget.controller.viewer.setPosition(
+ widget.controller.viewer.scene.listEntities().last,
+ 1.0,
+ 1.0,
+ -1.0);
+ },
+ child: const Text('Set position to 1, 1, -1'),
+ ),
+ MenuItemButton(
+ onPressed: () async {
+ final color = Colors.purple;
+ widget.controller.viewer.setMaterialColor(
+ widget.controller.viewer.scene.listEntities().last,
+ "Cone",
+ 0,
+ color.red / 255.0,
+ color.green / 255.0,
+ color.blue / 255.0,
+ 1.0);
+ },
+ child: const Text("Set cone material color to purple")),
+ ];
+
+ return SubmenuButton(menuChildren: children, child: const Text("Shapes"));
+ }
+
+ Widget _geometrySubmenu() {
+ return SubmenuButton(
+ menuChildren: [
+ MenuItemButton(
+ onPressed: () async {
+ var verts = [
+ -1.0,
+ 0.0,
+ -1.0,
+ -1.0,
+ 0.0,
+ 1.0,
+ 1.0,
+ 0.0,
+ 1.0,
+ 1.0,
+ 0.0,
+ -1.0,
+ ];
+ var indices = [0, 1, 2, 2, 3, 0];
+ var geom = await widget.controller.viewer.createGeometry(
+ verts, indices,
+ materialPath: "asset://assets/solidcolor.filamat");
+ },
+ child: const Text("Quad")),
+ MenuItemButton(
+ onPressed: () async {
+ await widget.controller.viewer.createGeometry([
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ ], [
+ 0,
+ 1
+ ], primitiveType: PrimitiveType.LINES);
+ },
+ child: const Text("Line"))
+ ],
+ child: const Text("Custom Geometry"),
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return SubmenuButton(
+ menuChildren: [
+ _shapesSubmenu(),
+ _geometrySubmenu(),
+ MenuItemButton(
+ onPressed: () async {
+ await widget.controller.viewer.addLight(
+ LightType.DIRECTIONAL, 6500, 100000, 0, 1, 0, 0, -1, 0);
+ },
+ child: const Text("Add directional light"),
+ ),
+ MenuItemButton(
+ onPressed: () async {
+ await widget.controller.viewer.addLight(
+ LightType.POINT, 6500, 100000, 0, 1, 0, 0, -1, 0,
+ falloffRadius: 1.0);
+ },
+ child: const Text("Add point light"),
+ ),
+ MenuItemButton(
+ onPressed: () async {
+ await widget.controller.viewer.addLight(
+ LightType.SPOT, 6500, 1000000, 0, 0, 0, 0, 1, 0,
+ spotLightConeInner: 0.1,
+ spotLightConeOuter: 0.4,
+ falloffRadius: 100.0);
+ },
+ child: const Text("Add spot light"),
+ ),
+ MenuItemButton(
+ onPressed: () async {
+ await widget.controller.viewer.clearLights();
+ },
+ child: const Text("Clear lights"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ final color = const Color(0xAA73C9FA);
+ widget.controller.viewer.setBackgroundColor(color.red / 255.0,
+ color.green / 255.0, color.blue / 255.0, 1.0);
+ },
+ child: const Text("Set background color")),
+ MenuItemButton(
+ onPressed: () {
+ widget.controller.viewer
+ .setBackgroundImage('assets/background.ktx');
+ },
+ child: const Text("Load background image")),
+ MenuItemButton(
+ onPressed: () {
+ widget.controller.viewer.setBackgroundImage(
+ 'assets/background.ktx',
+ fillHeight: true);
+ },
+ child: const Text("Load background image (fill height)")),
+ MenuItemButton(
+ onPressed: () {
+ if (ExampleWidgetState.hasSkybox) {
+ widget.controller.viewer.removeSkybox();
+ } else {
+ widget.controller.viewer
+ .loadSkybox('assets/default_env/default_env_skybox.ktx');
+ }
+ ExampleWidgetState.hasSkybox = !ExampleWidgetState.hasSkybox;
+ },
+ child: Text(ExampleWidgetState.hasSkybox
+ ? 'Remove skybox'
+ : 'Load skybox')),
+ MenuItemButton(
+ onPressed: () {
+ widget.controller.viewer
+ .loadIbl('assets/default_env/default_env_ibl.ktx');
+ },
+ child: const Text('Load IBL')),
+ MenuItemButton(
+ onPressed: () {
+ widget.controller.viewer.removeIbl();
+ },
+ child: const Text('Remove IBL')),
+ MenuItemButton(
+ onPressed: () async {
+ await widget.controller.viewer.clearEntities();
+ },
+ child: const Text('Clear assets')),
+ ],
+ child: const Text("Assets"),
+ );
+ }
+}
+
+// _item(() async {
+// var frameData = Float32List.fromList(
+// List.generate(120, (i) => i / 120).expand((x) {
+// var vals = List.filled(7, x);
+// vals[3] = 1.0;
+// // vals[4] = 0;
+// vals[5] = 0;
+// vals[6] = 0;
+// return vals;
+// }).toList());
+
+// widget.controller!.setBoneAnimation(
+// _shapes!,
+// BoneAnimationData(
+// "Bone.001", ["Cube.001"], frameData, 1000.0 / 60.0));
+// // ,
+// // "Bone.001",
+// // "Cube.001",
+// // BoneTransform([Vec3(x: 0, y: 0.0, z: 0.0)],
+// // [Quaternion(x: 1, y: 1, z: 1, w: 1)]));
+// }, 'construct bone animation'),
+
+// _item(() async {
+// var morphs = await widget.controller!
+// .getMorphTargetNames(_shapes!, "Cylinder");
+// final animation = AnimationBuilder(
+// availableMorphs: morphs,
+// framerate: 30,
+// meshName: "Cylinder")
+// .setDuration(4)
+// .setMorphTargets(["Key 1", "Key 2"])
+// .interpolateMorphWeights(0, 4, 0, 1)
+// .build();
+// widget.controller!.setMorphAnimationData(_shapes!, animation);
+// }, "animate cylinder morph weights #1 and #2"),
+// _item(() async {
+// var morphs = await widget.controller!
+// .getMorphTargetNames(_shapes!, "Cylinder");
+// final animation = AnimationBuilder(
+// availableMorphs: morphs,
+// framerate: 30,
+// meshName: "Cylinder")
+// .setDuration(4)
+// .setMorphTargets(["Key 3", "Key 4"])
+// .interpolateMorphWeights(0, 4, 0, 1)
+// .build();
+// widget.controller!.setMorphAnimationData(_shapes!, animation);
+// }, "animate cylinder morph weights #3 and #4"),
+// _item(() async {
+// var morphs = await widget.controller!
+// .getMorphTargetNames(_shapes!, "Cube");
+// final animation = AnimationBuilder(
+// availableMorphs: morphs, framerate: 30, meshName: "Cube")
+// .setDuration(4)
+// .setMorphTargets(["Key 1", "Key 2"])
+// .interpolateMorphWeights(0, 4, 0, 1)
+// .build();
+// widget.controller!.setMorphAnimationData(_shapes!, animation);
+// }, "animate shapes morph weights #1 and #2"),
diff --git a/example/lib/menus/camera_submenu.dart b/examples/flutter/example/lib/menus/camera_submenu.dart
similarity index 65%
rename from example/lib/menus/camera_submenu.dart
rename to examples/flutter/example/lib/menus/camera_submenu.dart
index 8ce199b8..5113264e 100644
--- a/example/lib/menus/camera_submenu.dart
+++ b/examples/flutter/example/lib/menus/camera_submenu.dart
@@ -2,12 +2,13 @@ import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
-
-import 'package:flutter_filament/filament_controller.dart';
-import 'package:flutter_filament_example/main.dart';
+import 'package:vector_math/vector_math_64.dart' as v;
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
+import 'package:thermion_flutter_example/main.dart';
class CameraSubmenu extends StatefulWidget {
- final FilamentController controller;
+ final ThermionFlutterPlugin controller;
const CameraSubmenu({super.key, required this.controller});
@override
@@ -15,8 +16,22 @@ class CameraSubmenu extends StatefulWidget {
}
class _CameraSubmenuState extends State {
- double _near = 0.05;
- double _far = 1000.0;
+ double? _near;
+ double? _far;
+
+ @override
+ void initState() {
+ super.initState();
+ widget.controller.viewer.initialized.then((_) {
+ widget.controller.viewer.getCameraCullingNear().then((v) {
+ _near = v;
+ widget.controller.viewer.getCameraCullingFar().then((v) {
+ _far = v;
+ setState(() {});
+ });
+ });
+ });
+ }
final _menuController = MenuController();
@@ -30,7 +45,7 @@ class _CameraSubmenuState extends State {
print("Set to ${ExampleWidgetState.showProjectionMatrices}");
},
child: Text(
- '${ExampleWidgetState.showProjectionMatrices.value ? "Hide" : "Display"} camera projection/culling projection matrices',
+ '${ExampleWidgetState.showProjectionMatrices.value ? "Hide" : "Display"} camera frustum',
style: TextStyle(
fontWeight: ExampleWidgetState.showProjectionMatrices.value
? FontWeight.bold
@@ -41,7 +56,7 @@ class _CameraSubmenuState extends State {
menuChildren: [1.0, 7.0, 14.0, 28.0, 56.0]
.map((v) => MenuItemButton(
onPressed: () {
- widget.controller.setCameraFocalLength(v);
+ widget.controller.viewer.setCameraFocalLength(v);
},
child: Text(
v.toStringAsFixed(2),
@@ -54,7 +69,9 @@ class _CameraSubmenuState extends State {
.map((v) => MenuItemButton(
onPressed: () {
_near = v;
- widget.controller.setCameraCulling(_near, _far);
+ print("Setting camera culling to $_near $_far!");
+
+ widget.controller.viewer.setCameraCulling(_near!, _far!);
},
child: Text(
v.toStringAsFixed(2),
@@ -67,7 +84,8 @@ class _CameraSubmenuState extends State {
.map((v) => MenuItemButton(
onPressed: () {
_far = v;
- widget.controller.setCameraCulling(_near, _far);
+ print("Setting camera culling to $_near! $_far");
+ widget.controller.viewer.setCameraCulling(_near!, _far!);
},
child: Text(
v.toStringAsFixed(2),
@@ -77,31 +95,22 @@ class _CameraSubmenuState extends State {
child: const Text("Set far")),
MenuItemButton(
onPressed: () async {
- widget.controller.setCameraPosition(1.0, 1.0, -1.0);
+ widget.controller.viewer.setCameraPosition(1.0, 1.0, -1.0);
},
- child: const Text('Move to 1, 1, -1'),
+ child: const Text('Set position to 1, 1, -1 (leave rotation as-is)'),
),
MenuItemButton(
- onPressed: ExampleWidgetState.last == null
- ? null
- : () async {
- await widget.controller
- .setCamera(ExampleWidgetState.last!, null);
- },
- child: const Text('Set to first camera in last added asset'),
- ),
- MenuItemButton(
- onPressed: ExampleWidgetState.last == null
- ? null
- : () async {
- await widget.controller
- .moveCameraToAsset(ExampleWidgetState.last!);
- },
- child: const Text("Move to last added asset"),
+ onPressed: () async {
+ widget.controller.viewer.setCameraPosition(0.0, 0.0, 0.0);
+ widget.controller.viewer.setCameraRotation(
+ v.Quaternion.axisAngle(v.Vector3(0, 0.0, 1.0), 0.0));
+ },
+ child: const Text('Move to 0,0,0, facing towards 0,0,-1'),
),
MenuItemButton(
onPressed: () {
- widget.controller.setCameraRotation(pi / 4, 0.0, 1.0, 0.0);
+ widget.controller.viewer.setCameraRotation(
+ v.Quaternion.axisAngle(v.Vector3(0, 1, 0), pi / 4));
},
child: const Text("Rotate camera 45 degrees around y axis"),
),
@@ -109,7 +118,7 @@ class _CameraSubmenuState extends State {
onPressed: () {
ExampleWidgetState.frustumCulling =
!ExampleWidgetState.frustumCulling;
- widget.controller
+ widget.controller.viewer
.setViewFrustumCulling(ExampleWidgetState.frustumCulling);
},
child: Text(
@@ -119,7 +128,7 @@ class _CameraSubmenuState extends State {
closeOnActivate: false,
onPressed: () async {
var projMatrix =
- await widget.controller.getCameraProjectionMatrix();
+ await widget.controller.viewer.getCameraProjectionMatrix();
await showDialog(
context: context,
builder: (ctx) {
@@ -134,45 +143,12 @@ class _CameraSubmenuState extends State {
});
},
child: const Text("Get projection matrix")),
- MenuItemButton(
- closeOnActivate: false,
- onPressed: () async {
- var frustum = await widget.controller.getCameraFrustum();
- var normalString = [
- frustum.plane0,
- frustum.plane1,
- frustum.plane2,
- frustum.plane3,
- frustum.plane4,
- frustum.plane5
- ]
- .map((plane) =>
- plane.normal.storage
- .map((v) => v.toStringAsFixed(2))
- .join(",") +
- ",${plane.constant}")
- .join("\n");
- showDialog(
- context: context,
- builder: (ctx) {
- return Center(
- child: Container(
- height: 300,
- width: 300,
- color: Colors.white,
- child:
- Text("Frustum plane normals : $normalString ")));
- });
- _menuController.close();
- },
- child: const Text("Get frustum")),
SubmenuButton(
menuChildren: ManipulatorMode.values.map((mm) {
return MenuItemButton(
onPressed: () {
- ExampleWidgetState.cameraManipulatorMode = mm;
- widget.controller.setCameraManipulatorOptions(
- mode: ExampleWidgetState.cameraManipulatorMode,
+ widget.controller.viewer.setCameraManipulatorOptions(
+ mode: mm,
orbitSpeedX: ExampleWidgetState.orbitSpeedX,
orbitSpeedY: ExampleWidgetState.orbitSpeedY,
zoomSpeed: ExampleWidgetState.zoomSpeed);
@@ -180,9 +156,10 @@ class _CameraSubmenuState extends State {
child: Text(
mm.name,
style: TextStyle(
- fontWeight: ExampleWidgetState.cameraManipulatorMode == mm
- ? FontWeight.bold
- : FontWeight.normal),
+ // fontWeight: ExampleWidgetState.cameraManipulatorMode == mm
+ // ? FontWeight.bold
+ // : FontWeight.normal
+ ),
),
);
}).toList(),
@@ -192,8 +169,7 @@ class _CameraSubmenuState extends State {
return MenuItemButton(
onPressed: () {
ExampleWidgetState.zoomSpeed = speed;
- widget.controller.setCameraManipulatorOptions(
- mode: ExampleWidgetState.cameraManipulatorMode,
+ widget.controller.viewer.setCameraManipulatorOptions(
orbitSpeedX: ExampleWidgetState.orbitSpeedX,
orbitSpeedY: ExampleWidgetState.orbitSpeedY,
zoomSpeed: ExampleWidgetState.zoomSpeed);
@@ -215,8 +191,7 @@ class _CameraSubmenuState extends State {
onPressed: () {
ExampleWidgetState.orbitSpeedX = speed;
ExampleWidgetState.orbitSpeedY = speed;
- widget.controller.setCameraManipulatorOptions(
- mode: ExampleWidgetState.cameraManipulatorMode,
+ widget.controller.viewer.setCameraManipulatorOptions(
orbitSpeedX: ExampleWidgetState.orbitSpeedX,
orbitSpeedY: ExampleWidgetState.orbitSpeedY,
zoomSpeed: ExampleWidgetState.zoomSpeed);
@@ -237,6 +212,9 @@ class _CameraSubmenuState extends State {
@override
Widget build(BuildContext context) {
+ // if (_near == null || _far == null) {
+ // return Container();
+ // }
return SubmenuButton(
controller: _menuController,
menuChildren: _cameraMenu(),
diff --git a/examples/flutter/example/lib/menus/controller_menu.dart b/examples/flutter/example/lib/menus/controller_menu.dart
new file mode 100644
index 00000000..2ba71624
--- /dev/null
+++ b/examples/flutter/example/lib/menus/controller_menu.dart
@@ -0,0 +1,106 @@
+import 'dart:io';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+
+import 'package:thermion_flutter/thermion_flutter.dart';
+
+class ControllerMenu extends StatefulWidget {
+ final ThermionFlutterPlugin controller;
+ final void Function() onToggleViewport;
+ final void Function() onControllerCreated;
+ final void Function() onControllerDestroyed;
+ final FocusNode sharedFocusNode;
+
+
+ ControllerMenu(
+ {required this.controller,
+ required this.onControllerCreated,
+ required this.onControllerDestroyed,
+ required this.sharedFocusNode,
+ required this.onToggleViewport});
+
+ @override
+ State createState() => _ControllerMenuState();
+}
+
+class _ControllerMenuState extends State {
+ void _createController({String? uberArchivePath}) async {
+ widget.controller.initialize(uberArchivePath: uberArchivePath);
+ widget.onControllerCreated();
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ }
+
+ @override
+ void didUpdateWidget(ControllerMenu oldWidget) {
+ super.didUpdateWidget(oldWidget);
+ }
+
+ bool _initialized = false;
+ @override
+ Widget build(BuildContext context) {
+ var items = [];
+ if (!_initialized) {
+ items.addAll([
+ MenuItemButton(
+ child:
+ const Text("Create ThermionFlutterPlugin (default ubershader)"),
+ onPressed: () {
+ _createController();
+ },
+ ),
+ MenuItemButton(
+ child: const Text(
+ "Create ThermionFlutterPlugin (custom ubershader - lit opaque only)"),
+ onPressed: () {
+ _createController(
+ uberArchivePath: Platform.isWindows
+ ? "assets/lit_opaque_32.uberz"
+ : Platform.isMacOS
+ ? "assets/lit_opaque_43.uberz"
+ : Platform.isIOS
+ ? "assets/lit_opaque_43.uberz"
+ : "assets/lit_opaque_43_gles.uberz");
+ },
+ )
+ ]);
+ } else {
+ items.addAll([
+ MenuItemButton(
+ child: const Text("Destroy viewer"),
+ onPressed: () async {
+ widget.controller.dispose();
+ widget.onControllerDestroyed();
+ setState(() {});
+ },
+ )
+ ]);
+ }
+ return MenuAnchor(
+ childFocusNode: widget.sharedFocusNode,
+ menuChildren: items +
+ [
+ TextButton(
+ child: const Text("Toggle viewport size"),
+ onPressed: widget.onToggleViewport,
+ )
+ ],
+ builder:
+ (BuildContext context, MenuController controller, Widget? child) {
+ return TextButton(
+ onPressed: () {
+ if (controller.isOpen) {
+ controller.close();
+ } else {
+ controller.open();
+ }
+ },
+ child: const Text("Controller / Viewer"),
+ );
+ });
+ }
+}
diff --git a/examples/flutter/example/lib/menus/rendering_submenu.dart b/examples/flutter/example/lib/menus/rendering_submenu.dart
new file mode 100644
index 00000000..0a6ced87
--- /dev/null
+++ b/examples/flutter/example/lib/menus/rendering_submenu.dart
@@ -0,0 +1,95 @@
+import 'package:flutter/material.dart';
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:thermion_flutter_example/main.dart';
+import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
+
+class RenderingSubmenu extends StatefulWidget {
+ final ThermionFlutterPlugin controller;
+
+ const RenderingSubmenu({super.key, required this.controller});
+
+ @override
+ State createState() => _RenderingSubmenuState();
+}
+
+class _RenderingSubmenuState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return SubmenuButton(
+ menuChildren: [
+ MenuItemButton(
+ onPressed: () {
+ widget.controller.viewer.render();
+ },
+ child: const Text("Render single frame"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ ExampleWidgetState.rendering = !ExampleWidgetState.rendering;
+ widget.controller.viewer.setRendering(ExampleWidgetState.rendering);
+ },
+ child: Text(
+ "Set continuous rendering to ${!ExampleWidgetState.rendering}"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ ExampleWidgetState.framerate =
+ ExampleWidgetState.framerate == 60 ? 30 : 60;
+ widget.controller.viewer.setFrameRate(ExampleWidgetState.framerate);
+ },
+ child: Text(
+ "Toggle framerate (currently ${ExampleWidgetState.framerate}) "),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ widget.controller.viewer.setToneMapping(ToneMapper.LINEAR);
+ },
+ child: const Text("Set tone mapping to linear"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ ExampleWidgetState.postProcessing =
+ !ExampleWidgetState.postProcessing;
+ widget.controller.viewer
+ .setPostProcessing(ExampleWidgetState.postProcessing);
+ },
+ child: Text(
+ "${ExampleWidgetState.postProcessing ? "Disable" : "Enable"} postprocessing"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ ExampleWidgetState.antiAliasingMsaa =
+ !ExampleWidgetState.antiAliasingMsaa;
+ widget.controller.viewer.setAntiAliasing(
+ ExampleWidgetState.antiAliasingMsaa,
+ ExampleWidgetState.antiAliasingFxaa,
+ ExampleWidgetState.antiAliasingTaa);
+ },
+ child: Text(
+ "${ExampleWidgetState.antiAliasingMsaa ? "Disable" : "Enable"} MSAA antialiasing"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ ExampleWidgetState.antiAliasingFxaa =
+ !ExampleWidgetState.antiAliasingFxaa;
+ widget.controller.viewer.setAntiAliasing(
+ ExampleWidgetState.antiAliasingMsaa,
+ ExampleWidgetState.antiAliasingFxaa,
+ ExampleWidgetState.antiAliasingTaa);
+ },
+ child: Text(
+ "${ExampleWidgetState.antiAliasingFxaa ? "Disable" : "Enable"} FXAA antialiasing"),
+ ),
+ MenuItemButton(
+ onPressed: () {
+ ExampleWidgetState.recording = !ExampleWidgetState.recording;
+ widget.controller.viewer.setRecording(ExampleWidgetState.recording);
+ },
+ child: Text(
+ "Turn recording ${ExampleWidgetState.recording ? "OFF" : "ON"}) "),
+ ),
+ ],
+ child: const Text("Rendering"),
+ );
+ }
+}
diff --git a/examples/flutter/example/lib/menus/scene_menu.dart b/examples/flutter/example/lib/menus/scene_menu.dart
new file mode 100644
index 00000000..fbd1bf71
--- /dev/null
+++ b/examples/flutter/example/lib/menus/scene_menu.dart
@@ -0,0 +1,62 @@
+import 'package:flutter/material.dart';
+
+import 'package:thermion_flutter/thermion_flutter.dart';
+import 'package:thermion_flutter_example/menus/asset_submenu.dart';
+import 'package:thermion_flutter_example/menus/camera_submenu.dart';
+import 'package:thermion_flutter_example/menus/rendering_submenu.dart';
+
+class SceneMenu extends StatefulWidget {
+ final ThermionFlutterPlugin? controller;
+ final FocusNode sharedFocusNode;
+
+ const SceneMenu(
+ {super.key, required this.controller, required this.sharedFocusNode});
+
+ @override
+ State createState() {
+ return _SceneMenuState();
+ }
+}
+
+class _SceneMenuState extends State {
+ @override
+ void didUpdateWidget(SceneMenu oldWidget) {
+ super.didUpdateWidget(oldWidget);
+ if (widget.controller != null &&
+ (widget.controller != oldWidget.controller)) {
+ setState(() {});
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return MenuAnchor(
+ onClose: () {},
+ childFocusNode: widget.sharedFocusNode,
+ menuChildren: widget.controller == null
+ ? []
+ : [
+ RenderingSubmenu(
+ controller: widget.controller!,
+ ),
+ AssetSubmenu(controller: widget.controller!),
+ CameraSubmenu(
+ controller: widget.controller!,
+ ),
+ ],
+ builder:
+ (BuildContext context, MenuController controller, Widget? child) {
+ return TextButton(
+ onPressed: () {
+ if (controller.isOpen) {
+ controller.close();
+ } else {
+ controller.open();
+ }
+ },
+ child: const Text("Scene"),
+ );
+ },
+ );
+ }
+}
diff --git a/example/lib/picker_result_widget.dart b/examples/flutter/example/lib/picker_result_widget.dart
similarity index 60%
rename from example/lib/picker_result_widget.dart
rename to examples/flutter/example/lib/picker_result_widget.dart
index 01544d46..692c4fc6 100644
--- a/example/lib/picker_result_widget.dart
+++ b/examples/flutter/example/lib/picker_result_widget.dart
@@ -1,19 +1,16 @@
import 'package:flutter/material.dart';
-import 'package:flutter_filament/filament_controller.dart';
+import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
class PickerResultWidget extends StatelessWidget {
- final FilamentController controller;
+ final ThermionViewer controller;
const PickerResultWidget({required this.controller, super.key});
@override
Widget build(BuildContext context) {
return StreamBuilder(
- stream: controller.pickResult.map((FilamentEntity? entityId) {
- if (entityId == null) {
- return null;
- }
- return controller.getNameForEntity(entityId);
+ stream: controller.pickResult.map((result) {
+ return controller.getNameForEntity(result.entity);
}),
builder: (ctx, snapshot) => snapshot.data == null
? Container()
diff --git a/example/linux/.gitignore b/examples/flutter/example/linux/.gitignore
similarity index 100%
rename from example/linux/.gitignore
rename to examples/flutter/example/linux/.gitignore
diff --git a/example/linux/CMakeLists.txt b/examples/flutter/example/linux/CMakeLists.txt
similarity index 98%
rename from example/linux/CMakeLists.txt
rename to examples/flutter/example/linux/CMakeLists.txt
index 9465b20e..8e014c4d 100644
--- a/example/linux/CMakeLists.txt
+++ b/examples/flutter/example/linux/CMakeLists.txt
@@ -4,10 +4,10 @@ project(runner LANGUAGES CXX)
# The name of the executable created for the application. Change this to change
# the on-disk name of your application.
-set(BINARY_NAME "flutter_filament_example")
+set(BINARY_NAME "thermion_flutter_example")
# The unique GTK application identifier for this application. See:
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
-set(APPLICATION_ID "app.polyvox.flutter_filament")
+set(APPLICATION_ID "app.polyvox.thermion_flutter")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.
diff --git a/example/linux/flutter/CMakeLists.txt b/examples/flutter/example/linux/flutter/CMakeLists.txt
similarity index 100%
rename from example/linux/flutter/CMakeLists.txt
rename to examples/flutter/example/linux/flutter/CMakeLists.txt
diff --git a/examples/flutter/example/linux/flutter/generated_plugin_registrant.cc b/examples/flutter/example/linux/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..01193c10
--- /dev/null
+++ b/examples/flutter/example/linux/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include
+
+void fl_register_plugins(FlPluginRegistry* registry) {
+ g_autoptr(FlPluginRegistrar) thermion_flutter_registrar =
+ fl_plugin_registry_get_registrar_for_plugin(registry, "ThermionFlutterPlugin");
+ thermion_flutter_plugin_register_with_registrar(thermion_flutter_registrar);
+}
diff --git a/example/linux/flutter/generated_plugin_registrant.h b/examples/flutter/example/linux/flutter/generated_plugin_registrant.h
similarity index 100%
rename from example/linux/flutter/generated_plugin_registrant.h
rename to examples/flutter/example/linux/flutter/generated_plugin_registrant.h
diff --git a/example/linux/flutter/generated_plugins.cmake b/examples/flutter/example/linux/flutter/generated_plugins.cmake
similarity index 97%
rename from example/linux/flutter/generated_plugins.cmake
rename to examples/flutter/example/linux/flutter/generated_plugins.cmake
index 75876d76..274b5f60 100644
--- a/example/linux/flutter/generated_plugins.cmake
+++ b/examples/flutter/example/linux/flutter/generated_plugins.cmake
@@ -3,7 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
- flutter_filament
+ thermion_flutter
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
diff --git a/example/linux/main.cc b/examples/flutter/example/linux/main.cc
similarity index 100%
rename from example/linux/main.cc
rename to examples/flutter/example/linux/main.cc
diff --git a/example/linux/my_application.cc b/examples/flutter/example/linux/my_application.cc
similarity index 96%
rename from example/linux/my_application.cc
rename to examples/flutter/example/linux/my_application.cc
index aafe4dd9..75722485 100644
--- a/example/linux/my_application.cc
+++ b/examples/flutter/example/linux/my_application.cc
@@ -40,11 +40,11 @@ static void my_application_activate(GApplication* application) {
if (use_header_bar) {
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
gtk_widget_show(GTK_WIDGET(header_bar));
- gtk_header_bar_set_title(header_bar, "flutter_filament_example");
+ gtk_header_bar_set_title(header_bar, "thermion_flutter_example");
gtk_header_bar_set_show_close_button(header_bar, TRUE);
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
} else {
- gtk_window_set_title(window, "flutter_filament_example");
+ gtk_window_set_title(window, "thermion_flutter_example");
}
gtk_window_set_default_size(window, 1280, 720);
diff --git a/example/linux/my_application.h b/examples/flutter/example/linux/my_application.h
similarity index 100%
rename from example/linux/my_application.h
rename to examples/flutter/example/linux/my_application.h
diff --git a/example/macos/.gitignore b/examples/flutter/example/macos/.gitignore
similarity index 100%
rename from example/macos/.gitignore
rename to examples/flutter/example/macos/.gitignore
diff --git a/example/macos/Flutter/Flutter-Debug.xcconfig b/examples/flutter/example/macos/Flutter/Flutter-Debug.xcconfig
similarity index 100%
rename from example/macos/Flutter/Flutter-Debug.xcconfig
rename to examples/flutter/example/macos/Flutter/Flutter-Debug.xcconfig
diff --git a/example/macos/Flutter/Flutter-Release.xcconfig b/examples/flutter/example/macos/Flutter/Flutter-Release.xcconfig
similarity index 100%
rename from example/macos/Flutter/Flutter-Release.xcconfig
rename to examples/flutter/example/macos/Flutter/Flutter-Release.xcconfig
diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/flutter/example/macos/Flutter/GeneratedPluginRegistrant.swift
similarity index 67%
rename from example/macos/Flutter/GeneratedPluginRegistrant.swift
rename to examples/flutter/example/macos/Flutter/GeneratedPluginRegistrant.swift
index bb5362df..93683cf5 100644
--- a/example/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/examples/flutter/example/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -5,10 +5,10 @@
import FlutterMacOS
import Foundation
-import flutter_filament
import path_provider_foundation
+import thermion_flutter
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
- SwiftFlutterFilamentPlugin.register(with: registry.registrar(forPlugin: "SwiftFlutterFilamentPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
+ SwiftThermionFlutterPlugin.register(with: registry.registrar(forPlugin: "SwiftThermionFlutterPlugin"))
}
diff --git a/example/macos/Podfile b/examples/flutter/example/macos/Podfile
similarity index 98%
rename from example/macos/Podfile
rename to examples/flutter/example/macos/Podfile
index b5174a8d..90de47d4 100644
--- a/example/macos/Podfile
+++ b/examples/flutter/example/macos/Podfile
@@ -1,4 +1,4 @@
-platform :osx, '13'
+platform :osx, '13.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/example/macos/Podfile.lock b/examples/flutter/example/macos/Podfile.lock
similarity index 56%
rename from example/macos/Podfile.lock
rename to examples/flutter/example/macos/Podfile.lock
index b5155056..94fb2021 100644
--- a/example/macos/Podfile.lock
+++ b/examples/flutter/example/macos/Podfile.lock
@@ -1,29 +1,29 @@
PODS:
- - flutter_filament (0.0.1):
- - FlutterMacOS
- FlutterMacOS (1.0.0)
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
+ - thermion_flutter (0.0.1):
+ - FlutterMacOS
DEPENDENCIES:
- - flutter_filament (from `Flutter/ephemeral/.symlinks/plugins/flutter_filament/macos`)
- FlutterMacOS (from `Flutter/ephemeral`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
+ - thermion_flutter (from `Flutter/ephemeral/.symlinks/plugins/thermion_flutter/macos`)
EXTERNAL SOURCES:
- flutter_filament:
- :path: Flutter/ephemeral/.symlinks/plugins/flutter_filament/macos
FlutterMacOS:
:path: Flutter/ephemeral
path_provider_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
+ thermion_flutter:
+ :path: Flutter/ephemeral/.symlinks/plugins/thermion_flutter/macos
SPEC CHECKSUMS:
- flutter_filament: ddf9db01d70cce6c8f3a34f414562ebdb43c7f36
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
- path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ thermion_flutter: e4895ade6b14d9efb6e17ed2436e89dbb87fa998
-PODFILE CHECKSUM: 9cc8fc8fc62b1d9a89fd6f974ad4157b35254030
+PODFILE CHECKSUM: 1888651be91a8ad58692c1add9ce24279fd4e950
-COCOAPODS: 1.12.1
+COCOAPODS: 1.15.2
diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/examples/flutter/example/macos/Runner.xcodeproj/project.pbxproj
similarity index 91%
rename from example/macos/Runner.xcodeproj/project.pbxproj
rename to examples/flutter/example/macos/Runner.xcodeproj/project.pbxproj
index 518377f0..6eba66ee 100644
--- a/example/macos/Runner.xcodeproj/project.pbxproj
+++ b/examples/flutter/example/macos/Runner.xcodeproj/project.pbxproj
@@ -27,8 +27,8 @@
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
- 7D1392D8A76BD085A2EACCCA /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67E2BAAB9A1F121079BF72BA /* Pods_RunnerTests.framework */; };
- 8C809D64151E1E580729D80C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C522586E642B13803E84A1 /* Pods_Runner.framework */; };
+ 73983334E7E3D03A0E12661E /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8E0CF9C3C7800C07C9845FC /* Pods_RunnerTests.framework */; };
+ C522DC3C60A9E9D8A157D709 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A43AAD1E638EA0D1719DBA3 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -62,7 +62,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 1C6D0D90A342B362D149A35C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 07D325EB165BDBD20CA1B50D /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
@@ -79,15 +79,15 @@
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
- 5CF03DE655862183459429BD /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
- 5DAC190752838B8100F59394 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
- 67E2BAAB9A1F121079BF72BA /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 7A39537BBD94CD705E51B003 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 5A43AAD1E638EA0D1719DBA3 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 750CFF70D61D26C0BECD5590 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 8A325254C21887E4CBDE8294 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
- A9C522586E642B13803E84A1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- B79A02483CBED7850CF820CC /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
- CB600D560A980353C316D9E3 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ C29827A08E11D88646BFBE93 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ D8E0CF9C3C7800C07C9845FC /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ DEA954DCA916B6FC51B8D22B /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ F0328BD31CA3A8DD85456972 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -95,7 +95,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 7D1392D8A76BD085A2EACCCA /* Pods_RunnerTests.framework in Frameworks */,
+ 73983334E7E3D03A0E12661E /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -103,7 +103,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 8C809D64151E1E580729D80C /* Pods_Runner.framework in Frameworks */,
+ C522DC3C60A9E9D8A157D709 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -137,7 +137,7 @@
331C80D6294CF71000263BE5 /* RunnerTests */,
33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */,
- D02080FF87F750C48907FD9A /* Pods */,
+ A1BEA79574E5550EED38B897 /* Pods */,
);
sourceTree = "";
};
@@ -185,15 +185,15 @@
path = Runner;
sourceTree = "";
};
- D02080FF87F750C48907FD9A /* Pods */ = {
+ A1BEA79574E5550EED38B897 /* Pods */ = {
isa = PBXGroup;
children = (
- 5DAC190752838B8100F59394 /* Pods-Runner.debug.xcconfig */,
- 1C6D0D90A342B362D149A35C /* Pods-Runner.release.xcconfig */,
- 7A39537BBD94CD705E51B003 /* Pods-Runner.profile.xcconfig */,
- 5CF03DE655862183459429BD /* Pods-RunnerTests.debug.xcconfig */,
- B79A02483CBED7850CF820CC /* Pods-RunnerTests.release.xcconfig */,
- CB600D560A980353C316D9E3 /* Pods-RunnerTests.profile.xcconfig */,
+ C29827A08E11D88646BFBE93 /* Pods-Runner.debug.xcconfig */,
+ F0328BD31CA3A8DD85456972 /* Pods-Runner.release.xcconfig */,
+ 8A325254C21887E4CBDE8294 /* Pods-Runner.profile.xcconfig */,
+ DEA954DCA916B6FC51B8D22B /* Pods-RunnerTests.debug.xcconfig */,
+ 750CFF70D61D26C0BECD5590 /* Pods-RunnerTests.release.xcconfig */,
+ 07D325EB165BDBD20CA1B50D /* Pods-RunnerTests.profile.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -201,8 +201,8 @@
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
isa = PBXGroup;
children = (
- A9C522586E642B13803E84A1 /* Pods_Runner.framework */,
- 67E2BAAB9A1F121079BF72BA /* Pods_RunnerTests.framework */,
+ 5A43AAD1E638EA0D1719DBA3 /* Pods_Runner.framework */,
+ D8E0CF9C3C7800C07C9845FC /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -214,7 +214,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
- 7F1E06FCC65DB724329B04B3 /* [CP] Check Pods Manifest.lock */,
+ 210FEE2628F42B7BDFED20C4 /* [CP] Check Pods Manifest.lock */,
331C80D1294CF70F00263BE5 /* Sources */,
331C80D2294CF70F00263BE5 /* Frameworks */,
331C80D3294CF70F00263BE5 /* Resources */,
@@ -233,13 +233,13 @@
isa = PBXNativeTarget;
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- AE8AFEA5652762748393D9A7 /* [CP] Check Pods Manifest.lock */,
+ B67C6085C13299F59758F7CC /* [CP] Check Pods Manifest.lock */,
33CC10E92044A3C60003C045 /* Sources */,
33CC10EA2044A3C60003C045 /* Frameworks */,
33CC10EB2044A3C60003C045 /* Resources */,
33CC110E2044A8840003C045 /* Bundle Framework */,
3399D490228B24CF009A79C7 /* ShellScript */,
- 828781F99DBC51FED1472F5D /* [CP] Embed Pods Frameworks */,
+ D8E4D2DE64C21B53086793F8 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -257,8 +257,9 @@
33CC10E52044A3C60003C045 /* Project object */ = {
isa = PBXProject;
attributes = {
+ BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 0920;
- LastUpgradeCheck = 1430;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C80D4294CF70F00263BE5 = {
@@ -321,6 +322,28 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ 210FEE2628F42B7BDFED20C4 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
3399D490228B24CF009A79C7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -359,46 +382,7 @@
shellPath = /bin/sh;
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
};
- 7F1E06FCC65DB724329B04B3 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
- };
- 828781F99DBC51FED1472F5D /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
- );
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
- };
- AE8AFEA5652762748393D9A7 /* [CP] Check Pods Manifest.lock */ = {
+ B67C6085C13299F59758F7CC /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -420,6 +404,23 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
+ D8E4D2DE64C21B53086793F8 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -471,7 +472,7 @@
/* Begin XCBuildConfiguration section */
331C80DB294CF71000263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 5CF03DE655862183459429BD /* Pods-RunnerTests.debug.xcconfig */;
+ baseConfigurationReference = DEA954DCA916B6FC51B8D22B /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -486,7 +487,7 @@
};
331C80DC294CF71000263BE5 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = B79A02483CBED7850CF820CC /* Pods-RunnerTests.release.xcconfig */;
+ baseConfigurationReference = 750CFF70D61D26C0BECD5590 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -501,7 +502,7 @@
};
331C80DD294CF71000263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = CB600D560A980353C316D9E3 /* Pods-RunnerTests.profile.xcconfig */;
+ baseConfigurationReference = 07D325EB165BDBD20CA1B50D /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -519,6 +520,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -542,9 +544,11 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -574,8 +578,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
- MACOSX_DEPLOYMENT_TARGET = 13;
- ONLY_ACTIVE_ARCH = YES;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
};
@@ -594,6 +597,7 @@
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -617,9 +621,11 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -647,6 +653,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -670,9 +677,11 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -702,7 +711,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
- MACOSX_DEPLOYMENT_TARGET = 13;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -723,8 +732,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
- MACOSX_DEPLOYMENT_TARGET = 13;
- ONLY_ACTIVE_ARCH = YES;
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
};
diff --git a/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to examples/flutter/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
similarity index 99%
rename from example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
rename to examples/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index 397f3d33..15368ecc 100644
--- a/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/examples/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
Bool {
return true
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
diff --git a/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
similarity index 100%
rename from example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
rename to examples/flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
diff --git a/example/macos/Runner/Base.lproj/MainMenu.xib b/examples/flutter/example/macos/Runner/Base.lproj/MainMenu.xib
similarity index 100%
rename from example/macos/Runner/Base.lproj/MainMenu.xib
rename to examples/flutter/example/macos/Runner/Base.lproj/MainMenu.xib
diff --git a/example/macos/Runner/Configs/AppInfo.xcconfig b/examples/flutter/example/macos/Runner/Configs/AppInfo.xcconfig
similarity index 89%
rename from example/macos/Runner/Configs/AppInfo.xcconfig
rename to examples/flutter/example/macos/Runner/Configs/AppInfo.xcconfig
index 16dee77d..322ba235 100644
--- a/example/macos/Runner/Configs/AppInfo.xcconfig
+++ b/examples/flutter/example/macos/Runner/Configs/AppInfo.xcconfig
@@ -11,4 +11,4 @@ PRODUCT_NAME = example
PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example
// The copyright displayed in application information
-PRODUCT_COPYRIGHT = Copyright © 2023 app.polyvox. All rights reserved.
+PRODUCT_COPYRIGHT = Copyright © 2024 app.polyvox. All rights reserved.
diff --git a/example/macos/Runner/Configs/Debug.xcconfig b/examples/flutter/example/macos/Runner/Configs/Debug.xcconfig
similarity index 100%
rename from example/macos/Runner/Configs/Debug.xcconfig
rename to examples/flutter/example/macos/Runner/Configs/Debug.xcconfig
diff --git a/example/macos/Runner/Configs/Release.xcconfig b/examples/flutter/example/macos/Runner/Configs/Release.xcconfig
similarity index 100%
rename from example/macos/Runner/Configs/Release.xcconfig
rename to examples/flutter/example/macos/Runner/Configs/Release.xcconfig
diff --git a/example/macos/Runner/Configs/Warnings.xcconfig b/examples/flutter/example/macos/Runner/Configs/Warnings.xcconfig
similarity index 100%
rename from example/macos/Runner/Configs/Warnings.xcconfig
rename to examples/flutter/example/macos/Runner/Configs/Warnings.xcconfig
diff --git a/example/macos/Runner/DebugProfile.entitlements b/examples/flutter/example/macos/Runner/DebugProfile.entitlements
similarity index 97%
rename from example/macos/Runner/DebugProfile.entitlements
rename to examples/flutter/example/macos/Runner/DebugProfile.entitlements
index 9f56413f..dddb8a30 100644
--- a/example/macos/Runner/DebugProfile.entitlements
+++ b/examples/flutter/example/macos/Runner/DebugProfile.entitlements
@@ -3,7 +3,7 @@
com.apple.security.app-sandbox
-
+
com.apple.security.cs.allow-jit
com.apple.security.network.server
diff --git a/example/macos/Runner/Info.plist b/examples/flutter/example/macos/Runner/Info.plist
similarity index 95%
rename from example/macos/Runner/Info.plist
rename to examples/flutter/example/macos/Runner/Info.plist
index 75d20137..4789daa6 100644
--- a/example/macos/Runner/Info.plist
+++ b/examples/flutter/example/macos/Runner/Info.plist
@@ -28,7 +28,5 @@
MainMenu
NSPrincipalClass
NSApplication
- com.apple.security.app-sandbox
-
diff --git a/example/macos/Runner/MainFlutterWindow.swift b/examples/flutter/example/macos/Runner/MainFlutterWindow.swift
similarity index 100%
rename from example/macos/Runner/MainFlutterWindow.swift
rename to examples/flutter/example/macos/Runner/MainFlutterWindow.swift
diff --git a/example/macos/Runner/Release.entitlements b/examples/flutter/example/macos/Runner/Release.entitlements
similarity index 100%
rename from example/macos/Runner/Release.entitlements
rename to examples/flutter/example/macos/Runner/Release.entitlements
diff --git a/example/macos/RunnerTests/RunnerTests.swift b/examples/flutter/example/macos/RunnerTests/RunnerTests.swift
similarity index 100%
rename from example/macos/RunnerTests/RunnerTests.swift
rename to examples/flutter/example/macos/RunnerTests/RunnerTests.swift
index 5418c9f5..61f3bd1f 100644
--- a/example/macos/RunnerTests/RunnerTests.swift
+++ b/examples/flutter/example/macos/RunnerTests/RunnerTests.swift
@@ -1,5 +1,5 @@
-import FlutterMacOS
import Cocoa
+import FlutterMacOS
import XCTest
class RunnerTests: XCTestCase {
diff --git a/examples/flutter/example/pubspec.yaml b/examples/flutter/example/pubspec.yaml
new file mode 100644
index 00000000..1985ba79
--- /dev/null
+++ b/examples/flutter/example/pubspec.yaml
@@ -0,0 +1,39 @@
+name: thermion_flutter_example
+description: Demonstrates how to use the thermion_flutter plugin.
+
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter pub publish`. This is preferred for private packages.
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
+
+environment:
+ sdk: ">=3.3.0 <4.0.0"
+
+dependencies:
+ flutter:
+ sdk: flutter
+ path_provider:
+ thermion_flutter:
+ path: ../../../thermion_flutter/thermion_flutter
+ cupertino_icons: ^1.0.2
+ web:
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ integration_test:
+ sdk: flutter
+ flutter_lints: ^1.0.0
+ crypto:
+ image_compare: ^1.1.2
+
+# The following section is specific to Flutter.
+flutter:
+ uses-material-design: true
+ assets:
+ - assets/
+ - assets/shapes/
+ - assets/default_env/
+ - assets/BusterDrone/
+ - assets/BusterDrone/textures/
+ - assets/FlightHelmet/
+
\ No newline at end of file
diff --git a/example/test/widget_test.dart b/examples/flutter/example/test/widget_test.dart
similarity index 94%
rename from example/test/widget_test.dart
rename to examples/flutter/example/test/widget_test.dart
index 78b385b9..c0873888 100644
--- a/example/test/widget_test.dart
+++ b/examples/flutter/example/test/widget_test.dart
@@ -8,7 +8,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
-import 'package:flutter_filament_example/main.dart';
+import 'package:thermion_flutter_example/main.dart';
void main() {
testWidgets('Verify Platform version', (WidgetTester tester) async {
diff --git a/example/compare_goldens.sh b/examples/flutter/example/test_driver/compare_goldens.sh
similarity index 100%
rename from example/compare_goldens.sh
rename to examples/flutter/example/test_driver/compare_goldens.sh
diff --git a/example/test_driver/integration_test.dart b/examples/flutter/example/test_driver/integration_test.dart
similarity index 100%
rename from example/test_driver/integration_test.dart
rename to examples/flutter/example/test_driver/integration_test.dart
diff --git a/example/test_driver/integration_test_update_goldens.dart b/examples/flutter/example/test_driver/integration_test_update_goldens.dart
similarity index 100%
rename from example/test_driver/integration_test_update_goldens.dart
rename to examples/flutter/example/test_driver/integration_test_update_goldens.dart
diff --git a/example/regenerate_goldens.sh b/examples/flutter/example/test_driver/regenerate_goldens.sh
similarity index 100%
rename from example/regenerate_goldens.sh
rename to examples/flutter/example/test_driver/regenerate_goldens.sh
diff --git a/example/web/favicon.png b/examples/flutter/example/web/favicon.png
similarity index 100%
rename from example/web/favicon.png
rename to examples/flutter/example/web/favicon.png
diff --git a/example/web/icons/Icon-192.png b/examples/flutter/example/web/icons/Icon-192.png
similarity index 100%
rename from example/web/icons/Icon-192.png
rename to examples/flutter/example/web/icons/Icon-192.png
diff --git a/example/web/icons/Icon-512.png b/examples/flutter/example/web/icons/Icon-512.png
similarity index 100%
rename from example/web/icons/Icon-512.png
rename to examples/flutter/example/web/icons/Icon-512.png
diff --git a/example/web/icons/Icon-maskable-192.png b/examples/flutter/example/web/icons/Icon-maskable-192.png
similarity index 100%
rename from example/web/icons/Icon-maskable-192.png
rename to examples/flutter/example/web/icons/Icon-maskable-192.png
diff --git a/example/web/icons/Icon-maskable-512.png b/examples/flutter/example/web/icons/Icon-maskable-512.png
similarity index 100%
rename from example/web/icons/Icon-maskable-512.png
rename to examples/flutter/example/web/icons/Icon-maskable-512.png
diff --git a/examples/flutter/example/web/index.html b/examples/flutter/example/web/index.html
new file mode 100644
index 00000000..afc3b66e
--- /dev/null
+++ b/examples/flutter/example/web/index.html
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ thermion_flutter_example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/example/web/main.dart b/examples/flutter/example/web/main.dart
new file mode 100644
index 00000000..91a2b0f9
--- /dev/null
+++ b/examples/flutter/example/web/main.dart
@@ -0,0 +1,53 @@
+
+// import 'package:polyvox_engine/app/app.dart';
+// import 'package:polyvox_engine/app/states/states.dart';
+// import 'package:polyvox_engine/services/asr_service.dart';
+// import 'package:polyvox_web/error_handler.dart';
+// import 'package:polyvox_web/services/web_asr_service.dart';
+// import 'package:polyvox_web/services/web_asset_repository.dart';
+// import 'package:polyvox_web/services/web_audio_service.dart';
+// import 'package:polyvox_web/services/web_auth_service.dart';
+// import 'package:polyvox_web/services/web_data_provider.dart';
+// import 'package:polyvox_web/services/web_purchase_service.dart';
+// import 'package:polyvox_web/services/web_scoring_service.dart';
+// import 'package:polyvox_web/web_canvas.dart';
+import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';
+import 'package:thermion_dart/thermion_dart/compatibility/web/compatibility.dart';
+import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart';
+import 'package:thermion_dart/thermion_dart/compatibility/web/interop/thermion_dart_js_export_type.dart';
+import 'package:thermion_dart/thermion_dart/compatibility/web/interop/thermion_dart_js_extension_type.dart';
+import 'package:web/web.dart';
+
+void main(List arguments) async {
+ var viewer = await WebViewer.initialize();
+
+ ThermionDartJSExportViewer.initializeBindings(viewer);
+
+ print("Set wrapper, running!");
+
+ while (true) {
+ await Future.delayed(Duration(milliseconds: 16));
+ }
+ print("Finisehd!");
+}
+
+class WebViewer {
+ static Future initialize() async {
+ var fc = FooChar();
+ final canvas = document.getElementById("canvas") as HTMLCanvasElement;
+ canvas.width = window.innerWidth;
+ canvas.height = window.innerHeight;
+
+ var resourceLoader = thermion_dart_web_get_resource_loader_wrapper();
+
+ var viewer = ThermionViewerFFI(resourceLoader: resourceLoader);
+
+ await viewer.initialized;
+ var width = window.innerWidth;
+ var height = window.innerHeight;
+ await viewer.createSwapChain(width.toDouble(), height.toDouble());
+ await viewer.updateViewportAndCameraProjection(
+ width.toDouble(), height.toDouble());
+ return viewer;
+ }
+}
diff --git a/examples/flutter/example/web/main.mjs b/examples/flutter/example/web/main.mjs
new file mode 100644
index 00000000..559c241f
--- /dev/null
+++ b/examples/flutter/example/web/main.mjs
@@ -0,0 +1,358 @@
+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 = {
+
+_11: x0 => new Array(x0),
+_12: x0 => new Promise(x0),
+_17: (o,s,v) => o[s] = v,
+_18: f => finalizeWrapper(f,x0 => dartInstance.exports._18(f,x0)),
+_19: f => finalizeWrapper(f,x0 => dartInstance.exports._19(f,x0)),
+_20: (x0,x1,x2) => x0.call(x1,x2),
+_21: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._21(f,x0,x1)),
+_22: (x0,x1) => x0.call(x1),
+_23: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._23(f,x0,x1)),
+_44: () => Symbol("jsBoxedDartObjectProperty"),
+_75: (x0,x1) => x0.getElementById(x1),
+_1495: (x0,x1) => x0.width = x1,
+_1497: (x0,x1) => x0.height = x1,
+_1874: () => globalThis.window,
+_1916: x0 => x0.innerWidth,
+_1917: x0 => x0.innerHeight,
+_6850: () => globalThis.document,
+_12719: () => globalThis.createVoidCallback(),
+_12720: () => globalThis.createVoidPointerCallback(),
+_12721: () => globalThis.createBoolCallback(),
+_12722: () => globalThis.createBoolCallback(),
+_12724: v => stringToDartString(v.toString()),
+_12740: () => {
+ 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');
+ },
+_12759: s => stringToDartString(JSON.stringify(stringFromDartString(s))),
+_12760: s => printToConsole(stringFromDartString(s)),
+_12761: f => finalizeWrapper(f,() => dartInstance.exports._12761(f)),
+_12762: f => finalizeWrapper(f,() => dartInstance.exports._12762(f)),
+_12763: f => finalizeWrapper(f,x0 => dartInstance.exports._12763(f,x0)),
+_12764: f => finalizeWrapper(f,() => dartInstance.exports._12764(f)),
+_12765: f => finalizeWrapper(f,x0 => dartInstance.exports._12765(f,x0)),
+_12766: f => finalizeWrapper(f,() => dartInstance.exports._12766(f)),
+_12767: f => finalizeWrapper(f,x0 => dartInstance.exports._12767(f,x0)),
+_12768: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12768(f,x0,x1)),
+_12769: f => finalizeWrapper(f,() => dartInstance.exports._12769(f)),
+_12770: f => finalizeWrapper(f,(x0,x1,x2,x3) => dartInstance.exports._12770(f,x0,x1,x2,x3)),
+_12771: f => finalizeWrapper(f,x0 => dartInstance.exports._12771(f,x0)),
+_12772: f => finalizeWrapper(f,() => dartInstance.exports._12772(f)),
+_12773: f => finalizeWrapper(f,x0 => dartInstance.exports._12773(f,x0)),
+_12774: f => finalizeWrapper(f,x0 => dartInstance.exports._12774(f,x0)),
+_12775: f => finalizeWrapper(f,() => dartInstance.exports._12775(f)),
+_12776: f => finalizeWrapper(f,(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9) => dartInstance.exports._12776(f,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)),
+_12777: f => finalizeWrapper(f,x0 => dartInstance.exports._12777(f,x0)),
+_12778: f => finalizeWrapper(f,() => dartInstance.exports._12778(f)),
+_12779: f => finalizeWrapper(f,x0 => dartInstance.exports._12779(f,x0)),
+_12780: f => finalizeWrapper(f,x0 => dartInstance.exports._12780(f,x0)),
+_12781: f => finalizeWrapper(f,x0 => dartInstance.exports._12781(f,x0)),
+_12782: f => finalizeWrapper(f,x0 => dartInstance.exports._12782(f,x0)),
+_12783: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12783(f,x0,x1)),
+_12784: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12784(f,x0,x1)),
+_12785: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12785(f,x0,x1)),
+_12786: f => finalizeWrapper(f,() => dartInstance.exports._12786(f)),
+_12787: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12787(f,x0,x1)),
+_12788: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12788(f,x0,x1)),
+_12789: f => finalizeWrapper(f,() => dartInstance.exports._12789(f)),
+_12790: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12790(f,x0,x1)),
+_12791: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12791(f,x0,x1)),
+_12792: f => finalizeWrapper(f,x0 => dartInstance.exports._12792(f,x0)),
+_12793: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12793(f,x0,x1)),
+_12794: f => finalizeWrapper(f,(x0,x1,x2,x3,x4) => dartInstance.exports._12794(f,x0,x1,x2,x3,x4)),
+_12795: f => finalizeWrapper(f,x0 => dartInstance.exports._12795(f,x0)),
+_12796: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12796(f,x0,x1)),
+_12797: f => finalizeWrapper(f,x0 => dartInstance.exports._12797(f,x0)),
+_12798: f => finalizeWrapper(f,() => dartInstance.exports._12798(f)),
+_12799: f => finalizeWrapper(f,() => dartInstance.exports._12799(f)),
+_12800: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12800(f,x0,x1,x2)),
+_12801: f => finalizeWrapper(f,() => dartInstance.exports._12801(f)),
+_12802: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12802(f,x0,x1)),
+_12803: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12803(f,x0,x1)),
+_12804: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12804(f,x0,x1,x2)),
+_12805: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12805(f,x0,x1)),
+_12806: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12806(f,x0,x1)),
+_12807: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12807(f,x0,x1)),
+_12808: f => finalizeWrapper(f,() => dartInstance.exports._12808(f)),
+_12809: f => finalizeWrapper(f,() => dartInstance.exports._12809(f)),
+_12810: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12810(f,x0,x1,x2)),
+_12811: f => finalizeWrapper(f,x0 => dartInstance.exports._12811(f,x0)),
+_12812: f => finalizeWrapper(f,x0 => dartInstance.exports._12812(f,x0)),
+_12813: f => finalizeWrapper(f,x0 => dartInstance.exports._12813(f,x0)),
+_12814: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12814(f,x0,x1)),
+_12815: f => finalizeWrapper(f,() => dartInstance.exports._12815(f)),
+_12816: f => finalizeWrapper(f,() => dartInstance.exports._12816(f)),
+_12817: f => finalizeWrapper(f,x0 => dartInstance.exports._12817(f,x0)),
+_12818: f => finalizeWrapper(f,() => dartInstance.exports._12818(f)),
+_12819: f => finalizeWrapper(f,() => dartInstance.exports._12819(f)),
+_12820: f => finalizeWrapper(f,() => dartInstance.exports._12820(f)),
+_12821: f => finalizeWrapper(f,() => dartInstance.exports._12821(f)),
+_12822: f => finalizeWrapper(f,() => dartInstance.exports._12822(f)),
+_12823: f => finalizeWrapper(f,() => dartInstance.exports._12823(f)),
+_12824: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12824(f,x0,x1,x2)),
+_12825: f => finalizeWrapper(f,() => dartInstance.exports._12825(f)),
+_12826: f => finalizeWrapper(f,x0 => dartInstance.exports._12826(f,x0)),
+_12827: f => finalizeWrapper(f,x0 => dartInstance.exports._12827(f,x0)),
+_12828: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12828(f,x0,x1,x2)),
+_12829: f => finalizeWrapper(f,x0 => dartInstance.exports._12829(f,x0)),
+_12830: f => finalizeWrapper(f,x0 => dartInstance.exports._12830(f,x0)),
+_12831: f => finalizeWrapper(f,(x0,x1,x2,x3,x4,x5,x6) => dartInstance.exports._12831(f,x0,x1,x2,x3,x4,x5,x6)),
+_12832: f => finalizeWrapper(f,x0 => dartInstance.exports._12832(f,x0)),
+_12833: f => finalizeWrapper(f,(x0,x1,x2,x3) => dartInstance.exports._12833(f,x0,x1,x2,x3)),
+_12834: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12834(f,x0,x1)),
+_12835: f => finalizeWrapper(f,(x0,x1,x2,x3,x4) => dartInstance.exports._12835(f,x0,x1,x2,x3,x4)),
+_12836: f => finalizeWrapper(f,(x0,x1,x2,x3,x4) => dartInstance.exports._12836(f,x0,x1,x2,x3,x4)),
+_12837: f => finalizeWrapper(f,(x0,x1,x2,x3,x4,x5) => dartInstance.exports._12837(f,x0,x1,x2,x3,x4,x5)),
+_12838: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12838(f,x0,x1,x2)),
+_12839: f => finalizeWrapper(f,x0 => dartInstance.exports._12839(f,x0)),
+_12840: f => finalizeWrapper(f,(x0,x1,x2) => dartInstance.exports._12840(f,x0,x1,x2)),
+_12841: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12841(f,x0,x1)),
+_12842: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12842(f,x0,x1)),
+_12843: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12843(f,x0,x1)),
+_12844: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12844(f,x0,x1)),
+_12845: f => finalizeWrapper(f,x0 => dartInstance.exports._12845(f,x0)),
+_12846: f => finalizeWrapper(f,() => dartInstance.exports._12846(f)),
+_12847: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12847(f,x0,x1)),
+_12848: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12848(f,x0,x1)),
+_12849: f => finalizeWrapper(f,(x0,x1) => dartInstance.exports._12849(f,x0,x1)),
+_12850: f => finalizeWrapper(f,x0 => dartInstance.exports._12850(f,x0)),
+_12851: f => finalizeWrapper(f,x0 => dartInstance.exports._12851(f,x0)),
+_12852: f => finalizeWrapper(f,x0 => dartInstance.exports._12852(f,x0)),
+_12853: f => finalizeWrapper(f,x0 => dartInstance.exports._12853(f,x0)),
+_12854: f => finalizeWrapper(f,() => dartInstance.exports._12854(f)),
+_12868: (ms, c) =>
+ setTimeout(() => dartInstance.exports.$invokeCallback(c),ms),
+_12872: (c) =>
+ queueMicrotask(() => dartInstance.exports.$invokeCallback(c)),
+_12874: (a, i) => a.push(i),
+_12885: a => a.length,
+_12887: (a, i) => a[i],
+_12888: (a, i, v) => a[i] = v,
+_12890: a => a.join(''),
+_12900: (s, p, i) => s.indexOf(p, i),
+_12903: (o, start, length) => new Uint8Array(o.buffer, o.byteOffset + start, length),
+_12904: (o, start, length) => new Int8Array(o.buffer, o.byteOffset + start, length),
+_12905: (o, start, length) => new Uint8ClampedArray(o.buffer, o.byteOffset + start, length),
+_12906: (o, start, length) => new Uint16Array(o.buffer, o.byteOffset + start, length),
+_12907: (o, start, length) => new Int16Array(o.buffer, o.byteOffset + start, length),
+_12908: (o, start, length) => new Uint32Array(o.buffer, o.byteOffset + start, length),
+_12909: (o, start, length) => new Int32Array(o.buffer, o.byteOffset + start, length),
+_12912: (o, start, length) => new Float32Array(o.buffer, o.byteOffset + start, length),
+_12913: (o, start, length) => new Float64Array(o.buffer, o.byteOffset + start, length),
+_12918: (o) => new DataView(o.buffer, o.byteOffset, o.byteLength),
+_12922: Function.prototype.call.bind(Object.getOwnPropertyDescriptor(DataView.prototype, 'byteLength').get),
+_12923: (b, o) => new DataView(b, o),
+_12925: Function.prototype.call.bind(DataView.prototype.getUint8),
+_12927: Function.prototype.call.bind(DataView.prototype.getInt8),
+_12929: Function.prototype.call.bind(DataView.prototype.getUint16),
+_12931: Function.prototype.call.bind(DataView.prototype.getInt16),
+_12933: Function.prototype.call.bind(DataView.prototype.getUint32),
+_12935: Function.prototype.call.bind(DataView.prototype.getInt32),
+_12941: Function.prototype.call.bind(DataView.prototype.getFloat32),
+_12943: Function.prototype.call.bind(DataView.prototype.getFloat64),
+_12962: (x0,x1,x2) => x0[x1] = x2,
+_12964: o => o === undefined,
+_12965: o => typeof o === 'boolean',
+_12966: o => typeof o === 'number',
+_12968: o => typeof o === 'string',
+_12971: o => o instanceof Int8Array,
+_12972: o => o instanceof Uint8Array,
+_12973: o => o instanceof Uint8ClampedArray,
+_12974: o => o instanceof Int16Array,
+_12975: o => o instanceof Uint16Array,
+_12976: o => o instanceof Int32Array,
+_12977: o => o instanceof Uint32Array,
+_12978: o => o instanceof Float32Array,
+_12979: o => o instanceof Float64Array,
+_12980: o => o instanceof ArrayBuffer,
+_12981: o => o instanceof DataView,
+_12982: o => o instanceof Array,
+_12983: o => typeof o === 'function' && o[jsWrappedDartFunctionSymbol] === true,
+_12987: (l, r) => l === r,
+_12988: o => o,
+_12989: o => o,
+_12990: o => o,
+_12991: b => !!b,
+_12992: o => o.length,
+_12995: (o, i) => o[i],
+_12996: f => f.dartFunction,
+_12997: l => arrayFromDartList(Int8Array, l),
+_12998: l => arrayFromDartList(Uint8Array, l),
+_12999: l => arrayFromDartList(Uint8ClampedArray, l),
+_13000: l => arrayFromDartList(Int16Array, l),
+_13001: l => arrayFromDartList(Uint16Array, l),
+_13002: l => arrayFromDartList(Int32Array, l),
+_13003: l => arrayFromDartList(Uint32Array, l),
+_13004: l => arrayFromDartList(Float32Array, l),
+_13005: l => arrayFromDartList(Float64Array, l),
+_13006: (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;
+ },
+_13007: l => arrayFromDartList(Array, l),
+_13008: stringFromDartString,
+_13009: stringToDartString,
+_13010: () => ({}),
+_13012: l => new Array(l),
+_13013: () => globalThis,
+_13014: (constructor, args) => {
+ const factoryFunction = constructor.bind.apply(
+ constructor, [null, ...args]);
+ return new factoryFunction();
+ },
+_13016: (o, p) => o[p],
+_13018: (o, m, a) => o[m].apply(o, a),
+_13020: o => String(o),
+_13021: (p, s, f) => p.then(s, f),
+_13040: (o, p) => o[p],
+_13041: (o, p, v) => o[p] = v
+ };
+
+ 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/examples/flutter/example/web/main.unopt.wasm b/examples/flutter/example/web/main.unopt.wasm
new file mode 100644
index 00000000..a27decf0
Binary files /dev/null and b/examples/flutter/example/web/main.unopt.wasm differ
diff --git a/examples/flutter/example/web/main.wasm b/examples/flutter/example/web/main.wasm
new file mode 100644
index 00000000..d38184ee
Binary files /dev/null and b/examples/flutter/example/web/main.wasm differ
diff --git a/example/web/manifest.json b/examples/flutter/example/web/manifest.json
similarity index 84%
rename from example/web/manifest.json
rename to examples/flutter/example/web/manifest.json
index 48eb01be..ce87a996 100644
--- a/example/web/manifest.json
+++ b/examples/flutter/example/web/manifest.json
@@ -1,11 +1,11 @@
{
- "name": "flutter_filament_example",
- "short_name": "flutter_filament_example",
+ "name": "thermion_flutter_example",
+ "short_name": "thermion_flutter_example",
"start_url": ".",
"display": "standalone",
"background_color": "#0175C2",
"theme_color": "#0175C2",
- "description": "Demonstrates how to use the flutter_filament plugin.",
+ "description": "Demonstrates how to use the thermion_flutter plugin.",
"orientation": "portrait-primary",
"prefer_related_applications": false,
"icons": [
diff --git a/examples/flutter/example/web/thermion_dart.js b/examples/flutter/example/web/thermion_dart.js
new file mode 120000
index 00000000..941603ed
--- /dev/null
+++ b/examples/flutter/example/web/thermion_dart.js
@@ -0,0 +1 @@
+../../../../dart_filament/native/web/build/build/out/dart_filament.js
\ No newline at end of file
diff --git a/examples/flutter/example/web/thermion_dart.wasm b/examples/flutter/example/web/thermion_dart.wasm
new file mode 120000
index 00000000..9aab600a
--- /dev/null
+++ b/examples/flutter/example/web/thermion_dart.wasm
@@ -0,0 +1 @@
+../../../../dart_filament/native/web/build/build/out/dart_filament.wasm
\ No newline at end of file
diff --git a/examples/flutter/example/web/thermion_dart.worker.js b/examples/flutter/example/web/thermion_dart.worker.js
new file mode 120000
index 00000000..6f8be374
--- /dev/null
+++ b/examples/flutter/example/web/thermion_dart.worker.js
@@ -0,0 +1 @@
+../../../../dart_filament/native/web/build/build/out/dart_filament.worker.js
\ No newline at end of file
diff --git a/example/windows/.gitignore b/examples/flutter/example/windows/.gitignore
similarity index 100%
rename from example/windows/.gitignore
rename to examples/flutter/example/windows/.gitignore
diff --git a/example/windows/CMakeLists.txt b/examples/flutter/example/windows/CMakeLists.txt
similarity index 97%
rename from example/windows/CMakeLists.txt
rename to examples/flutter/example/windows/CMakeLists.txt
index 99c90863..f80d4678 100644
--- a/example/windows/CMakeLists.txt
+++ b/examples/flutter/example/windows/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.14)
-project(flutter_filament_example LANGUAGES CXX)
+project(thermion_flutter_example LANGUAGES CXX)
-set(BINARY_NAME "flutter_filament_example")
+set(BINARY_NAME "thermion_flutter_example")
cmake_policy(SET CMP0063 NEW)
diff --git a/example/windows/flutter/CMakeLists.txt b/examples/flutter/example/windows/flutter/CMakeLists.txt
similarity index 100%
rename from example/windows/flutter/CMakeLists.txt
rename to examples/flutter/example/windows/flutter/CMakeLists.txt
diff --git a/examples/flutter/example/windows/flutter/generated_plugin_registrant.cc b/examples/flutter/example/windows/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..64919ad2
--- /dev/null
+++ b/examples/flutter/example/windows/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,14 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include
+
+void RegisterPlugins(flutter::PluginRegistry* registry) {
+ ThermionFlutterPluginCApiRegisterWithRegistrar(
+ registry->GetRegistrarForPlugin("ThermionFlutterPluginCApi"));
+}
diff --git a/example/windows/flutter/generated_plugin_registrant.h b/examples/flutter/example/windows/flutter/generated_plugin_registrant.h
similarity index 100%
rename from example/windows/flutter/generated_plugin_registrant.h
rename to examples/flutter/example/windows/flutter/generated_plugin_registrant.h
diff --git a/example/windows/flutter/generated_plugins.cmake b/examples/flutter/example/windows/flutter/generated_plugins.cmake
similarity index 93%
rename from example/windows/flutter/generated_plugins.cmake
rename to examples/flutter/example/windows/flutter/generated_plugins.cmake
index e1dea286..55f1a93d 100644
--- a/example/windows/flutter/generated_plugins.cmake
+++ b/examples/flutter/example/windows/flutter/generated_plugins.cmake
@@ -3,8 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
- flutter_filament
- permission_handler_windows
+ thermion_flutter
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST
diff --git a/example/windows/runner/CMakeLists.txt b/examples/flutter/example/windows/runner/CMakeLists.txt
similarity index 100%
rename from example/windows/runner/CMakeLists.txt
rename to examples/flutter/example/windows/runner/CMakeLists.txt
diff --git a/example/windows/runner/Runner.rc b/examples/flutter/example/windows/runner/Runner.rc
similarity index 91%
rename from example/windows/runner/Runner.rc
rename to examples/flutter/example/windows/runner/Runner.rc
index b85a561d..efe6dc2b 100644
--- a/example/windows/runner/Runner.rc
+++ b/examples/flutter/example/windows/runner/Runner.rc
@@ -90,12 +90,12 @@ BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "app.polyvox" "\0"
- VALUE "FileDescription", "flutter_filament_example" "\0"
+ VALUE "FileDescription", "thermion_flutter_example" "\0"
VALUE "FileVersion", VERSION_AS_STRING "\0"
- VALUE "InternalName", "flutter_filament_example" "\0"
+ VALUE "InternalName", "thermion_flutter_example" "\0"
VALUE "LegalCopyright", "Copyright (C) 2022 app.polyvox. All rights reserved." "\0"
- VALUE "OriginalFilename", "flutter_filament_example.exe" "\0"
- VALUE "ProductName", "flutter_filament_example" "\0"
+ VALUE "OriginalFilename", "thermion_flutter_example.exe" "\0"
+ VALUE "ProductName", "thermion_flutter_example" "\0"
VALUE "ProductVersion", VERSION_AS_STRING "\0"
END
END
diff --git a/example/windows/runner/flutter_window.cpp b/examples/flutter/example/windows/runner/flutter_window.cpp
similarity index 100%
rename from example/windows/runner/flutter_window.cpp
rename to examples/flutter/example/windows/runner/flutter_window.cpp
diff --git a/example/windows/runner/flutter_window.h b/examples/flutter/example/windows/runner/flutter_window.h
similarity index 100%
rename from example/windows/runner/flutter_window.h
rename to examples/flutter/example/windows/runner/flutter_window.h
diff --git a/example/windows/runner/main.cpp b/examples/flutter/example/windows/runner/main.cpp
similarity index 95%
rename from example/windows/runner/main.cpp
rename to examples/flutter/example/windows/runner/main.cpp
index 9a6e00b8..97489729 100644
--- a/example/windows/runner/main.cpp
+++ b/examples/flutter/example/windows/runner/main.cpp
@@ -27,7 +27,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
FlutterWindow window(project);
Win32Window::Point origin(10, 10);
Win32Window::Size size(1280, 720);
- if (!window.CreateAndShow(L"flutter_filament_example", origin, size)) {
+ if (!window.CreateAndShow(L"thermion_flutter_example", origin, size)) {
return EXIT_FAILURE;
}
window.SetQuitOnClose(true);
diff --git a/example/windows/runner/resource.h b/examples/flutter/example/windows/runner/resource.h
similarity index 100%
rename from example/windows/runner/resource.h
rename to examples/flutter/example/windows/runner/resource.h
diff --git a/example/windows/runner/resources/app_icon.ico b/examples/flutter/example/windows/runner/resources/app_icon.ico
similarity index 100%
rename from example/windows/runner/resources/app_icon.ico
rename to examples/flutter/example/windows/runner/resources/app_icon.ico
diff --git a/example/windows/runner/runner.exe.manifest b/examples/flutter/example/windows/runner/runner.exe.manifest
similarity index 100%
rename from example/windows/runner/runner.exe.manifest
rename to examples/flutter/example/windows/runner/runner.exe.manifest
diff --git a/example/windows/runner/utils.cpp b/examples/flutter/example/windows/runner/utils.cpp
similarity index 100%
rename from example/windows/runner/utils.cpp
rename to examples/flutter/example/windows/runner/utils.cpp
diff --git a/example/windows/runner/utils.h b/examples/flutter/example/windows/runner/utils.h
similarity index 100%
rename from example/windows/runner/utils.h
rename to examples/flutter/example/windows/runner/utils.h
diff --git a/example/windows/runner/win32_window.cpp b/examples/flutter/example/windows/runner/win32_window.cpp
similarity index 100%
rename from example/windows/runner/win32_window.cpp
rename to examples/flutter/example/windows/runner/win32_window.cpp
diff --git a/example/windows/runner/win32_window.h b/examples/flutter/example/windows/runner/win32_window.h
similarity index 100%
rename from example/windows/runner/win32_window.h
rename to examples/flutter/example/windows/runner/win32_window.h
diff --git a/examples/flutter/quickstart/.gitignore b/examples/flutter/quickstart/.gitignore
new file mode 100644
index 00000000..29a3a501
--- /dev/null
+++ b/examples/flutter/quickstart/.gitignore
@@ -0,0 +1,43 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/examples/flutter/quickstart/.metadata b/examples/flutter/quickstart/.metadata
new file mode 100644
index 00000000..62c6c8ef
--- /dev/null
+++ b/examples/flutter/quickstart/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: "7b6d667701e38c1d9d700e2bcc29bc7a06598c59"
+ channel: "master"
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ - platform: android
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ - platform: ios
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ - platform: linux
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ - platform: macos
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ - platform: web
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ - platform: windows
+ create_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+ base_revision: 7b6d667701e38c1d9d700e2bcc29bc7a06598c59
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/examples/flutter/quickstart/README.md b/examples/flutter/quickstart/README.md
new file mode 100644
index 00000000..3cc63a86
--- /dev/null
+++ b/examples/flutter/quickstart/README.md
@@ -0,0 +1,16 @@
+# quickstart
+
+A new Flutter project.
+
+## Getting Started
+
+This project is a starting point for a Flutter application.
+
+A few resources to get you started if this is your first Flutter project:
+
+- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
+- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
+
+For help getting started with Flutter development, view the
+[online documentation](https://docs.flutter.dev/), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
diff --git a/examples/flutter/quickstart/analysis_options.yaml b/examples/flutter/quickstart/analysis_options.yaml
new file mode 100644
index 00000000..0d290213
--- /dev/null
+++ b/examples/flutter/quickstart/analysis_options.yaml
@@ -0,0 +1,28 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at https://dart.dev/lints.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/examples/flutter/quickstart/android/.gitignore b/examples/flutter/quickstart/android/.gitignore
new file mode 100644
index 00000000..6f568019
--- /dev/null
+++ b/examples/flutter/quickstart/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/examples/flutter/quickstart/android/app/build.gradle b/examples/flutter/quickstart/android/app/build.gradle
new file mode 100644
index 00000000..6519d2f7
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/build.gradle
@@ -0,0 +1,44 @@
+plugins {
+ id "com.android.application"
+ id "kotlin-android"
+ // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
+ id "dev.flutter.flutter-gradle-plugin"
+}
+
+android {
+ namespace = "com.example.quickstart"
+ compileSdk = flutter.compileSdkVersion
+ ndkVersion = flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId = "com.example.quickstart"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
+ minSdk = flutter.minSdkVersion
+ targetSdk = flutter.targetSdkVersion
+ versionCode = flutter.versionCode
+ versionName = flutter.versionName
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig = signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source = "../.."
+}
diff --git a/examples/flutter/quickstart/android/app/src/debug/AndroidManifest.xml b/examples/flutter/quickstart/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000..399f6981
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/examples/flutter/quickstart/android/app/src/main/AndroidManifest.xml b/examples/flutter/quickstart/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..d6b5b601
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/android/app/src/main/kotlin/com/example/quickstart/MainActivity.kt b/examples/flutter/quickstart/android/app/src/main/kotlin/com/example/quickstart/MainActivity.kt
new file mode 100644
index 00000000..067e280a
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/main/kotlin/com/example/quickstart/MainActivity.kt
@@ -0,0 +1,5 @@
+package com.example.quickstart
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity()
diff --git a/examples/flutter/quickstart/android/app/src/main/res/drawable-v21/launch_background.xml b/examples/flutter/quickstart/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 00000000..f74085f3
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/android/app/src/main/res/drawable/launch_background.xml b/examples/flutter/quickstart/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000..304732f8
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/flutter/quickstart/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..db77bb4b
Binary files /dev/null and b/examples/flutter/quickstart/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/examples/flutter/quickstart/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/flutter/quickstart/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..17987b79
Binary files /dev/null and b/examples/flutter/quickstart/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/examples/flutter/quickstart/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/flutter/quickstart/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..09d43914
Binary files /dev/null and b/examples/flutter/quickstart/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/examples/flutter/quickstart/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/flutter/quickstart/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..d5f1c8d3
Binary files /dev/null and b/examples/flutter/quickstart/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/examples/flutter/quickstart/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/flutter/quickstart/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..4d6372ee
Binary files /dev/null and b/examples/flutter/quickstart/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/examples/flutter/quickstart/android/app/src/main/res/values-night/styles.xml b/examples/flutter/quickstart/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 00000000..06952be7
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/android/app/src/main/res/values/styles.xml b/examples/flutter/quickstart/android/app/src/main/res/values/styles.xml
new file mode 100644
index 00000000..cb1ef880
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/android/app/src/profile/AndroidManifest.xml b/examples/flutter/quickstart/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 00000000..399f6981
--- /dev/null
+++ b/examples/flutter/quickstart/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/examples/flutter/quickstart/android/build.gradle b/examples/flutter/quickstart/android/build.gradle
new file mode 100644
index 00000000..d2ffbffa
--- /dev/null
+++ b/examples/flutter/quickstart/android/build.gradle
@@ -0,0 +1,18 @@
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = "../build"
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/examples/flutter/quickstart/android/gradle.properties b/examples/flutter/quickstart/android/gradle.properties
new file mode 100644
index 00000000..25971708
--- /dev/null
+++ b/examples/flutter/quickstart/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/examples/flutter/quickstart/android/gradle/wrapper/gradle-wrapper.properties b/examples/flutter/quickstart/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..e1ca574e
--- /dev/null
+++ b/examples/flutter/quickstart/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip
diff --git a/examples/flutter/quickstart/android/settings.gradle b/examples/flutter/quickstart/android/settings.gradle
new file mode 100644
index 00000000..536165d3
--- /dev/null
+++ b/examples/flutter/quickstart/android/settings.gradle
@@ -0,0 +1,25 @@
+pluginManagement {
+ def flutterSdkPath = {
+ def properties = new Properties()
+ file("local.properties").withInputStream { properties.load(it) }
+ def flutterSdkPath = properties.getProperty("flutter.sdk")
+ assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+ return flutterSdkPath
+ }()
+
+ includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+
+plugins {
+ id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+ id "com.android.application" version "7.3.0" apply false
+ id "org.jetbrains.kotlin.android" version "1.7.10" apply false
+}
+
+include ":app"
diff --git a/examples/flutter/quickstart/assets/cube.glb b/examples/flutter/quickstart/assets/cube.glb
new file mode 100644
index 00000000..c8df3114
Binary files /dev/null and b/examples/flutter/quickstart/assets/cube.glb differ
diff --git a/examples/flutter/quickstart/assets/default_env_ibl.ktx b/examples/flutter/quickstart/assets/default_env_ibl.ktx
new file mode 100644
index 00000000..0765d521
Binary files /dev/null and b/examples/flutter/quickstart/assets/default_env_ibl.ktx differ
diff --git a/examples/flutter/quickstart/assets/default_env_skybox.ktx b/examples/flutter/quickstart/assets/default_env_skybox.ktx
new file mode 100644
index 00000000..9d72e5a0
Binary files /dev/null and b/examples/flutter/quickstart/assets/default_env_skybox.ktx differ
diff --git a/examples/flutter/quickstart/ios/.gitignore b/examples/flutter/quickstart/ios/.gitignore
new file mode 100644
index 00000000..7a7f9873
--- /dev/null
+++ b/examples/flutter/quickstart/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/examples/flutter/quickstart/ios/Flutter/AppFrameworkInfo.plist b/examples/flutter/quickstart/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 00000000..7c569640
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 12.0
+
+
diff --git a/examples/flutter/quickstart/ios/Flutter/Debug.xcconfig b/examples/flutter/quickstart/ios/Flutter/Debug.xcconfig
new file mode 100644
index 00000000..ec97fc6f
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/examples/flutter/quickstart/ios/Flutter/Release.xcconfig b/examples/flutter/quickstart/ios/Flutter/Release.xcconfig
new file mode 100644
index 00000000..c4855bfe
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/examples/flutter/quickstart/ios/Podfile b/examples/flutter/quickstart/ios/Podfile
new file mode 100644
index 00000000..d97f17e2
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '12.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.pbxproj
similarity index 79%
rename from example/ios/Runner.xcodeproj/project.pbxproj
rename to examples/flutter/quickstart/ios/Runner.xcodeproj/project.pbxproj
index a88aead4..8f6ac5fd 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.pbxproj
@@ -8,14 +8,24 @@
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
- EE85ADA13CE47012212956FB /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A258321425FD15835C0E85C8 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
@@ -30,14 +40,14 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 0E69A8E4F4FBCA8CA51688D8 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 887CF3E1D8F177CD306AEE91 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -45,8 +55,6 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- A258321425FD15835C0E85C8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- E540D86FF0BEABF308A14DBB /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -54,19 +62,18 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- EE85ADA13CE47012212956FB /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 359B21BE5E35E51F8685F431 /* Frameworks */ = {
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
- A258321425FD15835C0E85C8 /* Pods_Runner.framework */,
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
);
- name = Frameworks;
+ path = RunnerTests;
sourceTree = "";
};
9740EEB11CF90186004384FC /* Flutter */ = {
@@ -86,8 +93,7 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
- D3880C741B2115E941EC88CD /* Pods */,
- 359B21BE5E35E51F8685F431 /* Frameworks */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
);
sourceTree = "";
};
@@ -95,6 +101,7 @@
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "";
@@ -114,31 +121,36 @@
path = Runner;
sourceTree = "";
};
- D3880C741B2115E941EC88CD /* Pods */ = {
- isa = PBXGroup;
- children = (
- 0E69A8E4F4FBCA8CA51688D8 /* Pods-Runner.debug.xcconfig */,
- 887CF3E1D8F177CD306AEE91 /* Pods-Runner.release.xcconfig */,
- E540D86FF0BEABF308A14DBB /* Pods-Runner.profile.xcconfig */,
- );
- path = Pods;
- sourceTree = "";
- };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- 2ED3154DB81A6C5E50B63848 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- F9FAB8A67CF505858CCDA424 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -155,9 +167,14 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1430;
+ BuildIndependentTargetsInParallel = YES;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
@@ -178,11 +195,19 @@
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -197,28 +222,6 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
- 2ED3154DB81A6C5E50B63848 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
- };
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -250,26 +253,17 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
- F9FAB8A67CF505858CCDA424 /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
- );
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
- };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -281,6 +275,14 @@
};
/* End PBXSourcesBuildPhase section */
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
@@ -305,7 +307,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD)";
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -325,7 +327,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -336,6 +337,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -357,11 +359,9 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = TM2B4SJXNJ;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -369,23 +369,66 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- ONLY_ACTIVE_ARCH = YES;
- OTHER_CFLAGS = "-fvisibility=default";
- PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart;
PRODUCT_NAME = "$(TARGET_NAME)";
- STRIP_INSTALLED_PRODUCT = NO;
- STRIP_STYLE = "non-global";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD)";
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -405,7 +448,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -416,6 +458,7 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -442,7 +485,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ARCHS = "$(ARCHS_STANDARD)";
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -462,7 +505,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -473,6 +515,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -496,11 +539,9 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = TM2B4SJXNJ;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -508,12 +549,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- ONLY_ACTIVE_ARCH = YES;
- OTHER_CFLAGS = "-fvisibility=default";
- PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart;
PRODUCT_NAME = "$(TARGET_NAME)";
- STRIP_INSTALLED_PRODUCT = NO;
- STRIP_STYLE = "non-global";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@@ -525,11 +562,9 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
- ARCHS = "$(ARCHS_STANDARD)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- DEAD_CODE_STRIPPING = NO;
DEVELOPMENT_TEAM = TM2B4SJXNJ;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
@@ -537,12 +572,8 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- ONLY_ACTIVE_ARCH = YES;
- OTHER_CFLAGS = "-fvisibility=default";
- PRODUCT_BUNDLE_IDENTIFIER = app.polyvox.example;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart;
PRODUCT_NAME = "$(TARGET_NAME)";
- STRIP_INSTALLED_PRODUCT = NO;
- STRIP_STYLE = "non-global";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@@ -552,6 +583,16 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..919434a6
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter/quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..8e3ca5df
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/flutter/quickstart/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..1d526a16
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/quickstart/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/flutter/quickstart/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000..f9b0d7c5
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner/AppDelegate.swift b/examples/flutter/quickstart/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000..62666446
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import Flutter
+import UIKit
+
+@main
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..d36b1fab
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000..dc9ada47
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000..7353c41e
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000..797d452e
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000..6ed2d933
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000..4cd7b009
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000..fe730945
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000..321773cd
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000..797d452e
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000..502f463a
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000..0ec30343
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000..0ec30343
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000..e9f5fea2
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000..84ac32ae
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000..8953cba0
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000..0467bf12
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000..0bedcf2f
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 00000000..9da19eac
Binary files /dev/null and b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000..89c2725b
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/examples/flutter/quickstart/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/flutter/quickstart/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000..f2e259c7
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner/Base.lproj/Main.storyboard b/examples/flutter/quickstart/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000..f3c28516
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner/Info.plist b/examples/flutter/quickstart/ios/Runner/Info.plist
new file mode 100644
index 00000000..82ca91c3
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Info.plist
@@ -0,0 +1,49 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Quickstart
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ quickstart
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/examples/flutter/quickstart/ios/Runner/Runner-Bridging-Header.h b/examples/flutter/quickstart/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000..308a2a56
--- /dev/null
+++ b/examples/flutter/quickstart/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/examples/flutter/quickstart/ios/RunnerTests/RunnerTests.swift b/examples/flutter/quickstart/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..86a7c3b1
--- /dev/null
+++ b/examples/flutter/quickstart/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/examples/flutter/quickstart/lib/main.dart b/examples/flutter/quickstart/lib/main.dart
new file mode 100644
index 00000000..9c8f5473
--- /dev/null
+++ b/examples/flutter/quickstart/lib/main.dart
@@ -0,0 +1,74 @@
+import 'package:flutter/material.dart';
+import 'package:thermion_flutter/thermion_flutter.dart';
+
+import 'package:vector_math/vector_math_64.dart' as v;
+import 'dart:math';
+
+
+void main() {
+ runApp(const MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ const MyApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: 'Flutter Demo',
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
+ useMaterial3: true,
+ ),
+ home: const MyHomePage(title: 'Flutter Demo Home Page'),
+ );
+ }
+}
+
+class MyHomePage extends StatefulWidget {
+ const MyHomePage({super.key, required this.title});
+ final String title;
+
+ @override
+ State createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State {
+ bool _loaded = false;
+ late ThermionFlutterPlugin _thermionFlutterPlugin;
+ late Future _thermionViewer;
+
+ @override
+ void initState() {
+ super.initState();
+ _thermionFlutterPlugin = ThermionFlutterPlugin();
+ _thermionViewer = _thermionFlutterPlugin.initialize();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Stack(children: [
+ Positioned.fill(child: ThermionWidget(plugin: _thermionFlutterPlugin)),
+ if (!_loaded)
+ Center(
+ child: ElevatedButton(
+ child: const Text("Load"),
+ onPressed: () async {
+ var viewer = await _thermionViewer;
+ await viewer.loadSkybox("assets/default_env_skybox.ktx");
+ await viewer.loadGlb("assets/cube.glb");
+
+ await viewer.setCameraPosition(0, 1, 10);
+ await viewer.setCameraRotation(v.Quaternion.axisAngle(
+ v.Vector3(1, 0, 0), -30 / 180 * pi) *
+ v.Quaternion.axisAngle(
+ v.Vector3(0, 1, 0), 15 / 180 * pi));
+ await viewer.addLight(
+ LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1);
+ await viewer.setRendering(true);
+ _loaded = true;
+ setState(() {});
+ }))
+ ]);
+ }
+}
diff --git a/examples/flutter/quickstart/linux/.gitignore b/examples/flutter/quickstart/linux/.gitignore
new file mode 100644
index 00000000..d3896c98
--- /dev/null
+++ b/examples/flutter/quickstart/linux/.gitignore
@@ -0,0 +1 @@
+flutter/ephemeral
diff --git a/examples/flutter/quickstart/linux/CMakeLists.txt b/examples/flutter/quickstart/linux/CMakeLists.txt
new file mode 100644
index 00000000..f4a5227f
--- /dev/null
+++ b/examples/flutter/quickstart/linux/CMakeLists.txt
@@ -0,0 +1,145 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.10)
+project(runner LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "quickstart")
+# The unique GTK application identifier for this application. See:
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
+set(APPLICATION_ID "com.example.quickstart")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(SET CMP0063 NEW)
+
+# Load bundled libraries from the lib/ directory relative to the binary.
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Root filesystem for cross-building.
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
+ set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+endif()
+
+# Define build configuration options.
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+endif()
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_14)
+ target_compile_options(${TARGET} PRIVATE -Wall -Werror)
+ target_compile_options(${TARGET} PRIVATE "$<$>:-O3>")
+ target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
+
+# Define the application target. To change its name, change BINARY_NAME above,
+# not the value here, or `flutter run` will no longer work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME}
+ "main.cc"
+ "my_application.cc"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add dependency libraries. Add any application-specific dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
+
+# Only the install-generated bundle's copy of the executable will launch
+# correctly, since the resources must in the right relative locations. To avoid
+# people trying to run the unbundled copy, put it in a subdirectory instead of
+# the default top-level location.
+set_target_properties(${BINARY_NAME}
+ PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
+)
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# By default, "installing" just makes a relocatable bundle in the build
+# directory.
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+# Start with a clean build bundle directory every time.
+install(CODE "
+ file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
+ " COMPONENT Runtime)
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
+ install(FILES "${bundled_library}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endforeach(bundled_library)
+
+# Copy the native assets provided by the build.dart from all packages.
+set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
+install(DIRECTORY "${NATIVE_ASSETS_DIR}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
+ install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
diff --git a/examples/flutter/quickstart/linux/flutter/CMakeLists.txt b/examples/flutter/quickstart/linux/flutter/CMakeLists.txt
new file mode 100644
index 00000000..d5bd0164
--- /dev/null
+++ b/examples/flutter/quickstart/linux/flutter/CMakeLists.txt
@@ -0,0 +1,88 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.10)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
+# which isn't available in 3.10.
+function(list_prepend LIST_NAME PREFIX)
+ set(NEW_LIST "")
+ foreach(element ${${LIST_NAME}})
+ list(APPEND NEW_LIST "${PREFIX}${element}")
+ endforeach(element)
+ set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
+endfunction()
+
+# === Flutter Library ===
+# System-level dependencies.
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
+
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "fl_basic_message_channel.h"
+ "fl_binary_codec.h"
+ "fl_binary_messenger.h"
+ "fl_dart_project.h"
+ "fl_engine.h"
+ "fl_json_message_codec.h"
+ "fl_json_method_codec.h"
+ "fl_message_codec.h"
+ "fl_method_call.h"
+ "fl_method_channel.h"
+ "fl_method_codec.h"
+ "fl_method_response.h"
+ "fl_plugin_registrar.h"
+ "fl_plugin_registry.h"
+ "fl_standard_message_codec.h"
+ "fl_standard_method_codec.h"
+ "fl_string_codec.h"
+ "fl_value.h"
+ "fl_view.h"
+ "flutter_linux.h"
+)
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
+target_link_libraries(flutter INTERFACE
+ PkgConfig::GTK
+ PkgConfig::GLIB
+ PkgConfig::GIO
+)
+add_dependencies(flutter flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CMAKE_CURRENT_BINARY_DIR}/_phony_
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
+ ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+)
diff --git a/examples/flutter/quickstart/linux/flutter/generated_plugin_registrant.cc b/examples/flutter/quickstart/linux/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..01193c10
--- /dev/null
+++ b/examples/flutter/quickstart/linux/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include
+
+void fl_register_plugins(FlPluginRegistry* registry) {
+ g_autoptr(FlPluginRegistrar) thermion_flutter_registrar =
+ fl_plugin_registry_get_registrar_for_plugin(registry, "ThermionFlutterPlugin");
+ thermion_flutter_plugin_register_with_registrar(thermion_flutter_registrar);
+}
diff --git a/examples/flutter/quickstart/linux/flutter/generated_plugin_registrant.h b/examples/flutter/quickstart/linux/flutter/generated_plugin_registrant.h
new file mode 100644
index 00000000..e0f0a47b
--- /dev/null
+++ b/examples/flutter/quickstart/linux/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void fl_register_plugins(FlPluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/examples/flutter/quickstart/linux/flutter/generated_plugins.cmake b/examples/flutter/quickstart/linux/flutter/generated_plugins.cmake
new file mode 100644
index 00000000..274b5f60
--- /dev/null
+++ b/examples/flutter/quickstart/linux/flutter/generated_plugins.cmake
@@ -0,0 +1,24 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+ thermion_flutter
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/examples/flutter/quickstart/linux/main.cc b/examples/flutter/quickstart/linux/main.cc
new file mode 100644
index 00000000..e7c5c543
--- /dev/null
+++ b/examples/flutter/quickstart/linux/main.cc
@@ -0,0 +1,6 @@
+#include "my_application.h"
+
+int main(int argc, char** argv) {
+ g_autoptr(MyApplication) app = my_application_new();
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}
diff --git a/examples/flutter/quickstart/linux/my_application.cc b/examples/flutter/quickstart/linux/my_application.cc
new file mode 100644
index 00000000..3901953a
--- /dev/null
+++ b/examples/flutter/quickstart/linux/my_application.cc
@@ -0,0 +1,124 @@
+#include "my_application.h"
+
+#include
+#ifdef GDK_WINDOWING_X11
+#include
+#endif
+
+#include "flutter/generated_plugin_registrant.h"
+
+struct _MyApplication {
+ GtkApplication parent_instance;
+ char** dart_entrypoint_arguments;
+};
+
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
+
+// Implements GApplication::activate.
+static void my_application_activate(GApplication* application) {
+ MyApplication* self = MY_APPLICATION(application);
+ GtkWindow* window =
+ GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
+
+ // Use a header bar when running in GNOME as this is the common style used
+ // by applications and is the setup most users will be using (e.g. Ubuntu
+ // desktop).
+ // If running on X and not using GNOME then just use a traditional title bar
+ // in case the window manager does more exotic layout, e.g. tiling.
+ // If running on Wayland assume the header bar will work (may need changing
+ // if future cases occur).
+ gboolean use_header_bar = TRUE;
+#ifdef GDK_WINDOWING_X11
+ GdkScreen* screen = gtk_window_get_screen(window);
+ if (GDK_IS_X11_SCREEN(screen)) {
+ const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
+ if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
+ use_header_bar = FALSE;
+ }
+ }
+#endif
+ if (use_header_bar) {
+ GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
+ gtk_widget_show(GTK_WIDGET(header_bar));
+ gtk_header_bar_set_title(header_bar, "quickstart");
+ gtk_header_bar_set_show_close_button(header_bar, TRUE);
+ gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
+ } else {
+ gtk_window_set_title(window, "quickstart");
+ }
+
+ gtk_window_set_default_size(window, 1280, 720);
+ gtk_widget_show(GTK_WIDGET(window));
+
+ g_autoptr(FlDartProject) project = fl_dart_project_new();
+ fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
+
+ FlView* view = fl_view_new(project);
+ gtk_widget_show(GTK_WIDGET(view));
+ gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
+
+ fl_register_plugins(FL_PLUGIN_REGISTRY(view));
+
+ gtk_widget_grab_focus(GTK_WIDGET(view));
+}
+
+// Implements GApplication::local_command_line.
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
+ MyApplication* self = MY_APPLICATION(application);
+ // Strip out the first argument as it is the binary name.
+ self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
+
+ g_autoptr(GError) error = nullptr;
+ if (!g_application_register(application, nullptr, &error)) {
+ g_warning("Failed to register: %s", error->message);
+ *exit_status = 1;
+ return TRUE;
+ }
+
+ g_application_activate(application);
+ *exit_status = 0;
+
+ return TRUE;
+}
+
+// Implements GApplication::startup.
+static void my_application_startup(GApplication* application) {
+ //MyApplication* self = MY_APPLICATION(object);
+
+ // Perform any actions required at application startup.
+
+ G_APPLICATION_CLASS(my_application_parent_class)->startup(application);
+}
+
+// Implements GApplication::shutdown.
+static void my_application_shutdown(GApplication* application) {
+ //MyApplication* self = MY_APPLICATION(object);
+
+ // Perform any actions required at application shutdown.
+
+ G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);
+}
+
+// Implements GObject::dispose.
+static void my_application_dispose(GObject* object) {
+ MyApplication* self = MY_APPLICATION(object);
+ g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
+ G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
+}
+
+static void my_application_class_init(MyApplicationClass* klass) {
+ G_APPLICATION_CLASS(klass)->activate = my_application_activate;
+ G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
+ G_APPLICATION_CLASS(klass)->startup = my_application_startup;
+ G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
+ G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
+}
+
+static void my_application_init(MyApplication* self) {}
+
+MyApplication* my_application_new() {
+ return MY_APPLICATION(g_object_new(my_application_get_type(),
+ "application-id", APPLICATION_ID,
+ "flags", G_APPLICATION_NON_UNIQUE,
+ nullptr));
+}
diff --git a/examples/flutter/quickstart/linux/my_application.h b/examples/flutter/quickstart/linux/my_application.h
new file mode 100644
index 00000000..72271d5e
--- /dev/null
+++ b/examples/flutter/quickstart/linux/my_application.h
@@ -0,0 +1,18 @@
+#ifndef FLUTTER_MY_APPLICATION_H_
+#define FLUTTER_MY_APPLICATION_H_
+
+#include
+
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
+ GtkApplication)
+
+/**
+ * my_application_new:
+ *
+ * Creates a new Flutter-based application.
+ *
+ * Returns: a new #MyApplication.
+ */
+MyApplication* my_application_new();
+
+#endif // FLUTTER_MY_APPLICATION_H_
diff --git a/examples/flutter/quickstart/macos/.gitignore b/examples/flutter/quickstart/macos/.gitignore
new file mode 100644
index 00000000..746adbb6
--- /dev/null
+++ b/examples/flutter/quickstart/macos/.gitignore
@@ -0,0 +1,7 @@
+# Flutter-related
+**/Flutter/ephemeral/
+**/Pods/
+
+# Xcode-related
+**/dgph
+**/xcuserdata/
diff --git a/examples/flutter/quickstart/macos/Flutter/Flutter-Debug.xcconfig b/examples/flutter/quickstart/macos/Flutter/Flutter-Debug.xcconfig
new file mode 100644
index 00000000..4b81f9b2
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Flutter/Flutter-Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/examples/flutter/quickstart/macos/Flutter/Flutter-Release.xcconfig b/examples/flutter/quickstart/macos/Flutter/Flutter-Release.xcconfig
new file mode 100644
index 00000000..5caa9d15
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Flutter/Flutter-Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "ephemeral/Flutter-Generated.xcconfig"
diff --git a/examples/flutter/quickstart/macos/Flutter/GeneratedPluginRegistrant.swift b/examples/flutter/quickstart/macos/Flutter/GeneratedPluginRegistrant.swift
new file mode 100644
index 00000000..b6c27f96
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -0,0 +1,12 @@
+//
+// Generated file. Do not edit.
+//
+
+import FlutterMacOS
+import Foundation
+
+import thermion_flutter
+
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ SwiftThermionFlutterPlugin.register(with: registry.registrar(forPlugin: "SwiftThermionFlutterPlugin"))
+}
diff --git a/examples/flutter/quickstart/macos/Podfile b/examples/flutter/quickstart/macos/Podfile
new file mode 100644
index 00000000..90de47d4
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Podfile
@@ -0,0 +1,43 @@
+platform :osx, '13.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_macos_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_macos_build_settings(target)
+ end
+end
diff --git a/examples/flutter/quickstart/macos/Podfile.lock b/examples/flutter/quickstart/macos/Podfile.lock
new file mode 100644
index 00000000..7b2ae237
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Podfile.lock
@@ -0,0 +1,22 @@
+PODS:
+ - FlutterMacOS (1.0.0)
+ - thermion_flutter (0.0.1):
+ - FlutterMacOS
+
+DEPENDENCIES:
+ - FlutterMacOS (from `Flutter/ephemeral`)
+ - thermion_flutter (from `Flutter/ephemeral/.symlinks/plugins/thermion_flutter/macos`)
+
+EXTERNAL SOURCES:
+ FlutterMacOS:
+ :path: Flutter/ephemeral
+ thermion_flutter:
+ :path: Flutter/ephemeral/.symlinks/plugins/thermion_flutter/macos
+
+SPEC CHECKSUMS:
+ FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
+ thermion_flutter: e4895ade6b14d9efb6e17ed2436e89dbb87fa998
+
+PODFILE CHECKSUM: 1888651be91a8ad58692c1add9ce24279fd4e950
+
+COCOAPODS: 1.15.2
diff --git a/examples/flutter/quickstart/macos/Runner.xcodeproj/project.pbxproj b/examples/flutter/quickstart/macos/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000..a3932134
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,803 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
+ buildPhases = (
+ 33CC111E2044C6BF0003C045 /* ShellScript */,
+ );
+ dependencies = (
+ );
+ name = "Flutter Assemble";
+ productName = FLX;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
+ 56F02897B820ADA2DE043C9B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93162ABED09E78126BD3CDE5 /* Pods_Runner.framework */; };
+ 62AA8D6F0977DC04C5F3E47D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9491FF37DFB0425E4EA0B397 /* Pods_RunnerTests.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC10EC2044A3C60003C045;
+ remoteInfo = Runner;
+ };
+ 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 33CC111A2044C6BA0003C045;
+ remoteInfo = FLX;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 33CC110E2044A8840003C045 /* Bundle Framework */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Bundle Framework";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; };
+ 33CC10ED2044A3C60003C045 /* quickstart.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = quickstart.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; };
+ 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
+ 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; };
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; };
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; };
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; };
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; };
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
+ 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
+ 4DE9521732D230B91BB45C73 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 5C2B9597C21FB64F23F75F32 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ 61CABADBE923C1C839256779 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
+ 89306E3842C70B544B3CD9C8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 914F20B2B6A55F4538F4FECA /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 93162ABED09E78126BD3CDE5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9491FF37DFB0425E4EA0B397 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
+ E5EDF04F05E94A7EC21CBB16 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 331C80D2294CF70F00263BE5 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 62AA8D6F0977DC04C5F3E47D /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EA2044A3C60003C045 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 56F02897B820ADA2DE043C9B /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 0AD0DB307687B659B7995D8A /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 4DE9521732D230B91BB45C73 /* Pods-Runner.debug.xcconfig */,
+ 89306E3842C70B544B3CD9C8 /* Pods-Runner.release.xcconfig */,
+ 61CABADBE923C1C839256779 /* Pods-Runner.profile.xcconfig */,
+ 914F20B2B6A55F4538F4FECA /* Pods-RunnerTests.debug.xcconfig */,
+ 5C2B9597C21FB64F23F75F32 /* Pods-RunnerTests.release.xcconfig */,
+ E5EDF04F05E94A7EC21CBB16 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 331C80D6294CF71000263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C80D7294CF71000263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 33BA886A226E78AF003329D5 /* Configs */ = {
+ isa = PBXGroup;
+ children = (
+ 33E5194F232828860026EE4D /* AppInfo.xcconfig */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
+ );
+ path = Configs;
+ sourceTree = "";
+ };
+ 33CC10E42044A3C60003C045 = {
+ isa = PBXGroup;
+ children = (
+ 33FAB671232836740065AC1E /* Runner */,
+ 33CEB47122A05771004F2AC0 /* Flutter */,
+ 331C80D6294CF71000263BE5 /* RunnerTests */,
+ 33CC10EE2044A3C60003C045 /* Products */,
+ D73912EC22F37F3D000D13A0 /* Frameworks */,
+ 0AD0DB307687B659B7995D8A /* Pods */,
+ );
+ sourceTree = "";
+ };
+ 33CC10EE2044A3C60003C045 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10ED2044A3C60003C045 /* quickstart.app */,
+ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 33CC11242044D66E0003C045 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F22044A3C60003C045 /* Assets.xcassets */,
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */,
+ 33CC10F72044A3C60003C045 /* Info.plist */,
+ );
+ name = Resources;
+ path = ..;
+ sourceTree = "";
+ };
+ 33CEB47122A05771004F2AC0 /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
+ 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
+ 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
+ 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
+ );
+ path = Flutter;
+ sourceTree = "";
+ };
+ 33FAB671232836740065AC1E /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 33CC10F02044A3C60003C045 /* AppDelegate.swift */,
+ 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
+ 33E51913231747F40026EE4D /* DebugProfile.entitlements */,
+ 33E51914231749380026EE4D /* Release.entitlements */,
+ 33CC11242044D66E0003C045 /* Resources */,
+ 33BA886A226E78AF003329D5 /* Configs */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 93162ABED09E78126BD3CDE5 /* Pods_Runner.framework */,
+ 9491FF37DFB0425E4EA0B397 /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C80D4294CF70F00263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 465FA95FF24452F333D1C1C1 /* [CP] Check Pods Manifest.lock */,
+ 331C80D1294CF70F00263BE5 /* Sources */,
+ 331C80D2294CF70F00263BE5 /* Frameworks */,
+ 331C80D3294CF70F00263BE5 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 33CC10EC2044A3C60003C045 /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ ED773E1A7DA74470DCD044C6 /* [CP] Check Pods Manifest.lock */,
+ 33CC10E92044A3C60003C045 /* Sources */,
+ 33CC10EA2044A3C60003C045 /* Frameworks */,
+ 33CC10EB2044A3C60003C045 /* Resources */,
+ 33CC110E2044A8840003C045 /* Bundle Framework */,
+ 3399D490228B24CF009A79C7 /* ShellScript */,
+ CB1E43C40756BBF229674223 /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */,
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 33CC10ED2044A3C60003C045 /* quickstart.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 33CC10E52044A3C60003C045 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = YES;
+ LastSwiftUpdateCheck = 0920;
+ LastUpgradeCheck = 1510;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C80D4294CF70F00263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 33CC10EC2044A3C60003C045;
+ };
+ 33CC10EC2044A3C60003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ LastSwiftMigration = 1100;
+ ProvisioningStyle = Automatic;
+ SystemCapabilities = {
+ com.apple.Sandbox = {
+ enabled = 1;
+ };
+ };
+ };
+ 33CC111A2044C6BA0003C045 = {
+ CreatedOnToolsVersion = 9.2;
+ ProvisioningStyle = Manual;
+ };
+ };
+ };
+ buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 33CC10E42044A3C60003C045;
+ productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 33CC10EC2044A3C60003C045 /* Runner */,
+ 331C80D4294CF70F00263BE5 /* RunnerTests */,
+ 33CC111A2044C6BA0003C045 /* Flutter Assemble */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C80D3294CF70F00263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10EB2044A3C60003C045 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
+ 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3399D490228B24CF009A79C7 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
+ };
+ 33CC111E2044C6BF0003C045 /* ShellScript */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ Flutter/ephemeral/FlutterInputs.xcfilelist,
+ );
+ inputPaths = (
+ Flutter/ephemeral/tripwire,
+ );
+ outputFileListPaths = (
+ Flutter/ephemeral/FlutterOutputs.xcfilelist,
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
+ };
+ 465FA95FF24452F333D1C1C1 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ CB1E43C40756BBF229674223 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+ ED773E1A7DA74470DCD044C6 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C80D1294CF70F00263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 33CC10E92044A3C60003C045 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
+ 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
+ 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC10EC2044A3C60003C045 /* Runner */;
+ targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
+ };
+ 33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
+ targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 33CC10F52044A3C60003C045 /* Base */,
+ );
+ name = MainMenu.xib;
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 331C80DB294CF71000263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 914F20B2B6A55F4538F4FECA /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quickstart.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/quickstart";
+ };
+ name = Debug;
+ };
+ 331C80DC294CF71000263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5C2B9597C21FB64F23F75F32 /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quickstart.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/quickstart";
+ };
+ name = Release;
+ };
+ 331C80DD294CF71000263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = E5EDF04F05E94A7EC21CBB16 /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quickstart.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/quickstart";
+ };
+ name = Profile;
+ };
+ 338D0CE9231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Profile;
+ };
+ 338D0CEA231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Profile;
+ };
+ 338D0CEB231458BD00FA5F75 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Profile;
+ };
+ 33CC10F92044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = macosx;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 33CC10FA2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CODE_SIGN_IDENTITY = "-";
+ COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ MACOSX_DEPLOYMENT_TARGET = 10.14;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = macosx;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ };
+ name = Release;
+ };
+ 33CC10FC2044A3C60003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Debug;
+ };
+ 33CC10FD2044A3C60003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ COMBINE_HIDPI_IMAGES = YES;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/../Frameworks",
+ );
+ MACOSX_DEPLOYMENT_TARGET = 13.0;
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SWIFT_VERSION = 5.0;
+ };
+ name = Release;
+ };
+ 33CC111C2044C6BA0003C045 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Manual;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Debug;
+ };
+ 33CC111D2044C6BA0003C045 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ CODE_SIGN_STYLE = Automatic;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C80DB294CF71000263BE5 /* Debug */,
+ 331C80DC294CF71000263BE5 /* Release */,
+ 331C80DD294CF71000263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10F92044A3C60003C045 /* Debug */,
+ 33CC10FA2044A3C60003C045 /* Release */,
+ 338D0CE9231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC10FC2044A3C60003C045 /* Debug */,
+ 33CC10FD2044A3C60003C045 /* Release */,
+ 338D0CEA231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 33CC111C2044C6BA0003C045 /* Debug */,
+ 33CC111D2044C6BA0003C045 /* Release */,
+ 338D0CEB231458BD00FA5F75 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 33CC10E52044A3C60003C045 /* Project object */;
+}
diff --git a/examples/flutter/quickstart/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/quickstart/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/flutter/quickstart/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/flutter/quickstart/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000..c9a58906
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/macos/Runner.xcworkspace/contents.xcworkspacedata b/examples/flutter/quickstart/macos/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000..21a3cc14
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/flutter/quickstart/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000..18d98100
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/flutter/quickstart/macos/Runner/AppDelegate.swift b/examples/flutter/quickstart/macos/Runner/AppDelegate.swift
new file mode 100644
index 00000000..8e02df28
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/AppDelegate.swift
@@ -0,0 +1,9 @@
+import Cocoa
+import FlutterMacOS
+
+@main
+class AppDelegate: FlutterAppDelegate {
+ override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
+ return true
+ }
+}
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000..a2ec33f1
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,68 @@
+{
+ "images" : [
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_16.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "16x16",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_32.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "32x32",
+ "idiom" : "mac",
+ "filename" : "app_icon_64.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_128.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "128x128",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_256.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "256x256",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_512.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "512x512",
+ "idiom" : "mac",
+ "filename" : "app_icon_1024.png",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
new file mode 100644
index 00000000..82b6f9d9
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
new file mode 100644
index 00000000..13b35eba
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
new file mode 100644
index 00000000..0a3f5fa4
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
new file mode 100644
index 00000000..bdb57226
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
new file mode 100644
index 00000000..f083318e
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
new file mode 100644
index 00000000..326c0e72
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
new file mode 100644
index 00000000..2f1632cf
Binary files /dev/null and b/examples/flutter/quickstart/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png differ
diff --git a/examples/flutter/quickstart/macos/Runner/Base.lproj/MainMenu.xib b/examples/flutter/quickstart/macos/Runner/Base.lproj/MainMenu.xib
new file mode 100644
index 00000000..80e867a4
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Base.lproj/MainMenu.xib
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/macos/Runner/Configs/AppInfo.xcconfig b/examples/flutter/quickstart/macos/Runner/Configs/AppInfo.xcconfig
new file mode 100644
index 00000000..b638164d
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Configs/AppInfo.xcconfig
@@ -0,0 +1,14 @@
+// Application-level settings for the Runner target.
+//
+// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the
+// future. If not, the values below would default to using the project name when this becomes a
+// 'flutter create' template.
+
+// The application's name. By default this is also the title of the Flutter window.
+PRODUCT_NAME = quickstart
+
+// The application's bundle identifier
+PRODUCT_BUNDLE_IDENTIFIER = com.example.quickstart
+
+// The copyright displayed in application information
+PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved.
diff --git a/examples/flutter/quickstart/macos/Runner/Configs/Debug.xcconfig b/examples/flutter/quickstart/macos/Runner/Configs/Debug.xcconfig
new file mode 100644
index 00000000..36b0fd94
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Configs/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Debug.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/examples/flutter/quickstart/macos/Runner/Configs/Release.xcconfig b/examples/flutter/quickstart/macos/Runner/Configs/Release.xcconfig
new file mode 100644
index 00000000..dff4f495
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Configs/Release.xcconfig
@@ -0,0 +1,2 @@
+#include "../../Flutter/Flutter-Release.xcconfig"
+#include "Warnings.xcconfig"
diff --git a/examples/flutter/quickstart/macos/Runner/Configs/Warnings.xcconfig b/examples/flutter/quickstart/macos/Runner/Configs/Warnings.xcconfig
new file mode 100644
index 00000000..42bcbf47
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Configs/Warnings.xcconfig
@@ -0,0 +1,13 @@
+WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings
+GCC_WARN_UNDECLARED_SELECTOR = YES
+CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES
+CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE
+CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
+CLANG_WARN_PRAGMA_PACK = YES
+CLANG_WARN_STRICT_PROTOTYPES = YES
+CLANG_WARN_COMMA = YES
+GCC_WARN_STRICT_SELECTOR_MATCH = YES
+CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES
+GCC_WARN_SHADOW = YES
+CLANG_WARN_UNREACHABLE_CODE = YES
diff --git a/examples/flutter/quickstart/macos/Runner/DebugProfile.entitlements b/examples/flutter/quickstart/macos/Runner/DebugProfile.entitlements
new file mode 100644
index 00000000..dddb8a30
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/DebugProfile.entitlements
@@ -0,0 +1,12 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.cs.allow-jit
+
+ com.apple.security.network.server
+
+
+
diff --git a/examples/flutter/quickstart/macos/Runner/Info.plist b/examples/flutter/quickstart/macos/Runner/Info.plist
new file mode 100644
index 00000000..4789daa6
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Info.plist
@@ -0,0 +1,32 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSMinimumSystemVersion
+ $(MACOSX_DEPLOYMENT_TARGET)
+ NSHumanReadableCopyright
+ $(PRODUCT_COPYRIGHT)
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/examples/flutter/quickstart/macos/Runner/MainFlutterWindow.swift b/examples/flutter/quickstart/macos/Runner/MainFlutterWindow.swift
new file mode 100644
index 00000000..3cc05eb2
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/MainFlutterWindow.swift
@@ -0,0 +1,15 @@
+import Cocoa
+import FlutterMacOS
+
+class MainFlutterWindow: NSWindow {
+ override func awakeFromNib() {
+ let flutterViewController = FlutterViewController()
+ let windowFrame = self.frame
+ self.contentViewController = flutterViewController
+ self.setFrame(windowFrame, display: true)
+
+ RegisterGeneratedPlugins(registry: flutterViewController)
+
+ super.awakeFromNib()
+ }
+}
diff --git a/examples/flutter/quickstart/macos/Runner/Release.entitlements b/examples/flutter/quickstart/macos/Runner/Release.entitlements
new file mode 100644
index 00000000..852fa1a4
--- /dev/null
+++ b/examples/flutter/quickstart/macos/Runner/Release.entitlements
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+
diff --git a/examples/flutter/quickstart/macos/RunnerTests/RunnerTests.swift b/examples/flutter/quickstart/macos/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000..61f3bd1f
--- /dev/null
+++ b/examples/flutter/quickstart/macos/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Cocoa
+import FlutterMacOS
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/examples/flutter/quickstart/pubspec.yaml b/examples/flutter/quickstart/pubspec.yaml
new file mode 100644
index 00000000..73825cd9
--- /dev/null
+++ b/examples/flutter/quickstart/pubspec.yaml
@@ -0,0 +1,49 @@
+name: quickstart
+description: "A new Flutter project."
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter pub publish`. This is preferred for private packages.
+publish_to: 'none' # Remove this line if you wish to publish to pub.dev
+
+# The following defines the version and build number for your application.
+# A version number is three numbers separated by dots, like 1.2.43
+# followed by an optional build number separated by a +.
+# Both the version and the builder number may be overridden in flutter
+# build by specifying --build-name and --build-number, respectively.
+# In Android, build-name is used as versionName while build-number used as versionCode.
+# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
+# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
+# Read more about iOS versioning at
+# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
+# In Windows, build-name is used as the major, minor, and patch parts
+# of the product and file versions while build-number is used as the build suffix.
+version: 1.0.0+1
+
+environment:
+ sdk: '>=3.5.0-250.0.dev <4.0.0'
+
+# Dependencies specify other packages that your package needs in order to work.
+# To automatically upgrade your package dependencies to the latest versions
+# consider running `flutter pub upgrade --major-versions`. Alternatively,
+# dependencies can be manually updated by changing the version numbers below to
+# the latest version available on pub.dev. To see which dependencies have newer
+# versions available, run `flutter pub outdated`.
+dependencies:
+ flutter:
+ sdk: flutter
+ thermion_flutter:
+ path: ../../../thermion_flutter/thermion_flutter
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^1.0.8
+ vector_math: ^2.1.4
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ flutter_lints: ^4.0.0
+
+flutter:
+ uses-material-design: true
+ assets:
+ - assets/
diff --git a/examples/flutter/quickstart/test/widget_test.dart b/examples/flutter/quickstart/test/widget_test.dart
new file mode 100644
index 00000000..fe677c1e
--- /dev/null
+++ b/examples/flutter/quickstart/test/widget_test.dart
@@ -0,0 +1,30 @@
+// This is a basic Flutter widget test.
+//
+// To perform an interaction with a widget in your test, use the WidgetTester
+// utility in the flutter_test package. For example, you can send tap and scroll
+// gestures. You can also use WidgetTester to find child widgets in the widget
+// tree, read text, and verify that the values of widget properties are correct.
+
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import 'package:quickstart/main.dart';
+
+void main() {
+ testWidgets('Counter increments smoke test', (WidgetTester tester) async {
+ // Build our app and trigger a frame.
+ await tester.pumpWidget(const MyApp());
+
+ // Verify that our counter starts at 0.
+ expect(find.text('0'), findsOneWidget);
+ expect(find.text('1'), findsNothing);
+
+ // Tap the '+' icon and trigger a frame.
+ await tester.tap(find.byIcon(Icons.add));
+ await tester.pump();
+
+ // Verify that our counter has incremented.
+ expect(find.text('0'), findsNothing);
+ expect(find.text('1'), findsOneWidget);
+ });
+}
diff --git a/examples/flutter/quickstart/web/favicon.png b/examples/flutter/quickstart/web/favicon.png
new file mode 100644
index 00000000..8aaa46ac
Binary files /dev/null and b/examples/flutter/quickstart/web/favicon.png differ
diff --git a/examples/flutter/quickstart/web/icons/Icon-192.png b/examples/flutter/quickstart/web/icons/Icon-192.png
new file mode 100644
index 00000000..b749bfef
Binary files /dev/null and b/examples/flutter/quickstart/web/icons/Icon-192.png differ
diff --git a/examples/flutter/quickstart/web/icons/Icon-512.png b/examples/flutter/quickstart/web/icons/Icon-512.png
new file mode 100644
index 00000000..88cfd48d
Binary files /dev/null and b/examples/flutter/quickstart/web/icons/Icon-512.png differ
diff --git a/examples/flutter/quickstart/web/icons/Icon-maskable-192.png b/examples/flutter/quickstart/web/icons/Icon-maskable-192.png
new file mode 100644
index 00000000..eb9b4d76
Binary files /dev/null and b/examples/flutter/quickstart/web/icons/Icon-maskable-192.png differ
diff --git a/examples/flutter/quickstart/web/icons/Icon-maskable-512.png b/examples/flutter/quickstart/web/icons/Icon-maskable-512.png
new file mode 100644
index 00000000..d69c5669
Binary files /dev/null and b/examples/flutter/quickstart/web/icons/Icon-maskable-512.png differ
diff --git a/examples/flutter/quickstart/web/index.html b/examples/flutter/quickstart/web/index.html
new file mode 100644
index 00000000..4b963a54
--- /dev/null
+++ b/examples/flutter/quickstart/web/index.html
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ quickstart
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/web/manifest.json b/examples/flutter/quickstart/web/manifest.json
new file mode 100644
index 00000000..1dd1a2f1
--- /dev/null
+++ b/examples/flutter/quickstart/web/manifest.json
@@ -0,0 +1,35 @@
+{
+ "name": "quickstart",
+ "short_name": "quickstart",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#0175C2",
+ "theme_color": "#0175C2",
+ "description": "A new Flutter project.",
+ "orientation": "portrait-primary",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icons/Icon-192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ },
+ {
+ "src": "icons/Icon-maskable-192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "icons/Icon-maskable-512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ]
+}
diff --git a/examples/flutter/quickstart/windows/.gitignore b/examples/flutter/quickstart/windows/.gitignore
new file mode 100644
index 00000000..d492d0d9
--- /dev/null
+++ b/examples/flutter/quickstart/windows/.gitignore
@@ -0,0 +1,17 @@
+flutter/ephemeral/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/examples/flutter/quickstart/windows/CMakeLists.txt b/examples/flutter/quickstart/windows/CMakeLists.txt
new file mode 100644
index 00000000..21862f80
--- /dev/null
+++ b/examples/flutter/quickstart/windows/CMakeLists.txt
@@ -0,0 +1,108 @@
+# Project-level configuration.
+cmake_minimum_required(VERSION 3.14)
+project(quickstart LANGUAGES CXX)
+
+# The name of the executable created for the application. Change this to change
+# the on-disk name of your application.
+set(BINARY_NAME "quickstart")
+
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
+# versions of CMake.
+cmake_policy(VERSION 3.14...3.25)
+
+# Define build configuration option.
+get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(IS_MULTICONFIG)
+ set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
+ CACHE STRING "" FORCE)
+else()
+ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+ set(CMAKE_BUILD_TYPE "Debug" CACHE
+ STRING "Flutter build mode" FORCE)
+ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+ "Debug" "Profile" "Release")
+ endif()
+endif()
+# Define settings for the Profile build mode.
+set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
+set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
+
+# Use Unicode for all projects.
+add_definitions(-DUNICODE -D_UNICODE)
+
+# Compilation settings that should be applied to most targets.
+#
+# Be cautious about adding new options here, as plugins use this function by
+# default. In most cases, you should add new options to specific targets instead
+# of modifying this function.
+function(APPLY_STANDARD_SETTINGS TARGET)
+ target_compile_features(${TARGET} PUBLIC cxx_std_17)
+ target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
+ target_compile_options(${TARGET} PRIVATE /EHsc)
+ target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
+ target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>")
+endfunction()
+
+# Flutter library and tool build rules.
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# Application build; see runner/CMakeLists.txt.
+add_subdirectory("runner")
+
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# Support files are copied into place next to the executable, so that it can
+# run in place. This is done instead of making a separate bundle (as on Linux)
+# so that building and running from within Visual Studio will work.
+set(BUILD_BUNDLE_DIR "$")
+# Make the "install" step default, as it's required to run.
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+ set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+if(PLUGIN_BUNDLED_LIBRARIES)
+ install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+endif()
+
+# Copy the native assets provided by the build.dart from all packages.
+set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/")
+install(DIRECTORY "${NATIVE_ASSETS_DIR}"
+ DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+ COMPONENT Runtime)
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+ file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+ " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+ DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+ CONFIGURATIONS Profile;Release
+ COMPONENT Runtime)
diff --git a/examples/flutter/quickstart/windows/flutter/CMakeLists.txt b/examples/flutter/quickstart/windows/flutter/CMakeLists.txt
new file mode 100644
index 00000000..903f4899
--- /dev/null
+++ b/examples/flutter/quickstart/windows/flutter/CMakeLists.txt
@@ -0,0 +1,109 @@
+# This file controls Flutter-level build steps. It should not be edited.
+cmake_minimum_required(VERSION 3.14)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
+
+# Set fallback configurations for older versions of the flutter tool.
+if (NOT DEFINED FLUTTER_TARGET_PLATFORM)
+ set(FLUTTER_TARGET_PLATFORM "windows-x64")
+endif()
+
+# === Flutter Library ===
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+ "flutter_export.h"
+ "flutter_windows.h"
+ "flutter_messenger.h"
+ "flutter_plugin_registrar.h"
+ "flutter_texture_registrar.h"
+)
+list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+ "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
+add_dependencies(flutter flutter_assemble)
+
+# === Wrapper ===
+list(APPEND CPP_WRAPPER_SOURCES_CORE
+ "core_implementations.cc"
+ "standard_codec.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
+ "plugin_registrar.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_APP
+ "flutter_engine.cc"
+ "flutter_view_controller.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
+
+# Wrapper sources needed for a plugin.
+add_library(flutter_wrapper_plugin STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+)
+apply_standard_settings(flutter_wrapper_plugin)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ POSITION_INDEPENDENT_CODE ON)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+ CXX_VISIBILITY_PRESET hidden)
+target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
+target_include_directories(flutter_wrapper_plugin PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_plugin flutter_assemble)
+
+# Wrapper sources needed for the runner.
+add_library(flutter_wrapper_app STATIC
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
+apply_standard_settings(flutter_wrapper_app)
+target_link_libraries(flutter_wrapper_app PUBLIC flutter)
+target_include_directories(flutter_wrapper_app PUBLIC
+ "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_app flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
+set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
+add_custom_command(
+ OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+ ${PHONY_OUTPUT}
+ COMMAND ${CMAKE_COMMAND} -E env
+ ${FLUTTER_TOOL_ENVIRONMENT}
+ "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
+ ${FLUTTER_TARGET_PLATFORM} $
+ VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+ "${FLUTTER_LIBRARY}"
+ ${FLUTTER_LIBRARY_HEADERS}
+ ${CPP_WRAPPER_SOURCES_CORE}
+ ${CPP_WRAPPER_SOURCES_PLUGIN}
+ ${CPP_WRAPPER_SOURCES_APP}
+)
diff --git a/examples/flutter/quickstart/windows/flutter/generated_plugin_registrant.cc b/examples/flutter/quickstart/windows/flutter/generated_plugin_registrant.cc
new file mode 100644
index 00000000..64919ad2
--- /dev/null
+++ b/examples/flutter/quickstart/windows/flutter/generated_plugin_registrant.cc
@@ -0,0 +1,14 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#include "generated_plugin_registrant.h"
+
+#include
+
+void RegisterPlugins(flutter::PluginRegistry* registry) {
+ ThermionFlutterPluginCApiRegisterWithRegistrar(
+ registry->GetRegistrarForPlugin("ThermionFlutterPluginCApi"));
+}
diff --git a/examples/flutter/quickstart/windows/flutter/generated_plugin_registrant.h b/examples/flutter/quickstart/windows/flutter/generated_plugin_registrant.h
new file mode 100644
index 00000000..dc139d85
--- /dev/null
+++ b/examples/flutter/quickstart/windows/flutter/generated_plugin_registrant.h
@@ -0,0 +1,15 @@
+//
+// Generated file. Do not edit.
+//
+
+// clang-format off
+
+#ifndef GENERATED_PLUGIN_REGISTRANT_
+#define GENERATED_PLUGIN_REGISTRANT_
+
+#include
+
+// Registers Flutter plugins.
+void RegisterPlugins(flutter::PluginRegistry* registry);
+
+#endif // GENERATED_PLUGIN_REGISTRANT_
diff --git a/examples/flutter/quickstart/windows/flutter/generated_plugins.cmake b/examples/flutter/quickstart/windows/flutter/generated_plugins.cmake
new file mode 100644
index 00000000..55f1a93d
--- /dev/null
+++ b/examples/flutter/quickstart/windows/flutter/generated_plugins.cmake
@@ -0,0 +1,24 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+ thermion_flutter
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
+ target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES $)
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+ add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+ list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/examples/flutter/quickstart/windows/runner/CMakeLists.txt b/examples/flutter/quickstart/windows/runner/CMakeLists.txt
new file mode 100644
index 00000000..394917c0
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 3.14)
+project(runner LANGUAGES CXX)
+
+# Define the application target. To change its name, change BINARY_NAME in the
+# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
+# work.
+#
+# Any new source files that you add to the application should be added here.
+add_executable(${BINARY_NAME} WIN32
+ "flutter_window.cpp"
+ "main.cpp"
+ "utils.cpp"
+ "win32_window.cpp"
+ "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+ "Runner.rc"
+ "runner.exe.manifest"
+)
+
+# Apply the standard set of build settings. This can be removed for applications
+# that need different build settings.
+apply_standard_settings(${BINARY_NAME})
+
+# Add preprocessor definitions for the build version.
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}")
+target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}")
+
+# Disable Windows macros that collide with C++ standard library functions.
+target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
+
+# Add dependency libraries and include directories. Add any application-specific
+# dependencies here.
+target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib")
+target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+
+# Run the Flutter tool portions of the build. This must not be removed.
+add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/examples/flutter/quickstart/windows/runner/Runner.rc b/examples/flutter/quickstart/windows/runner/Runner.rc
new file mode 100644
index 00000000..fb14283d
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON ICON "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD)
+#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD
+#else
+#define VERSION_AS_NUMBER 1,0,0,0
+#endif
+
+#if defined(FLUTTER_VERSION)
+#define VERSION_AS_STRING FLUTTER_VERSION
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904e4"
+ BEGIN
+ VALUE "CompanyName", "com.example" "\0"
+ VALUE "FileDescription", "quickstart" "\0"
+ VALUE "FileVersion", VERSION_AS_STRING "\0"
+ VALUE "InternalName", "quickstart" "\0"
+ VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0"
+ VALUE "OriginalFilename", "quickstart.exe" "\0"
+ VALUE "ProductName", "quickstart" "\0"
+ VALUE "ProductVersion", VERSION_AS_STRING "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1252
+ END
+END
+
+#endif // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
diff --git a/examples/flutter/quickstart/windows/runner/flutter_window.cpp b/examples/flutter/quickstart/windows/runner/flutter_window.cpp
new file mode 100644
index 00000000..955ee303
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/flutter_window.cpp
@@ -0,0 +1,71 @@
+#include "flutter_window.h"
+
+#include
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+ : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+ if (!Win32Window::OnCreate()) {
+ return false;
+ }
+
+ RECT frame = GetClientArea();
+
+ // The size here must match the window dimensions to avoid unnecessary surface
+ // creation / destruction in the startup path.
+ flutter_controller_ = std::make_unique(
+ frame.right - frame.left, frame.bottom - frame.top, project_);
+ // Ensure that basic setup of the controller was successful.
+ if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+ return false;
+ }
+ RegisterPlugins(flutter_controller_->engine());
+ SetChildContent(flutter_controller_->view()->GetNativeWindow());
+
+ flutter_controller_->engine()->SetNextFrameCallback([&]() {
+ this->Show();
+ });
+
+ // Flutter can complete the first frame before the "show window" callback is
+ // registered. The following call ensures a frame is pending to ensure the
+ // window is shown. It is a no-op if the first frame hasn't completed yet.
+ flutter_controller_->ForceRedraw();
+
+ return true;
+}
+
+void FlutterWindow::OnDestroy() {
+ if (flutter_controller_) {
+ flutter_controller_ = nullptr;
+ }
+
+ Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ // Give Flutter, including plugins, an opportunity to handle window messages.
+ if (flutter_controller_) {
+ std::optional result =
+ flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+ lparam);
+ if (result) {
+ return *result;
+ }
+ }
+
+ switch (message) {
+ case WM_FONTCHANGE:
+ flutter_controller_->engine()->ReloadSystemFonts();
+ break;
+ }
+
+ return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/examples/flutter/quickstart/windows/runner/flutter_window.h b/examples/flutter/quickstart/windows/runner/flutter_window.h
new file mode 100644
index 00000000..6da0652f
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/flutter_window.h
@@ -0,0 +1,33 @@
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include
+#include
+
+#include
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+ // Creates a new FlutterWindow hosting a Flutter view running |project|.
+ explicit FlutterWindow(const flutter::DartProject& project);
+ virtual ~FlutterWindow();
+
+ protected:
+ // Win32Window:
+ bool OnCreate() override;
+ void OnDestroy() override;
+ LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+ LPARAM const lparam) noexcept override;
+
+ private:
+ // The project to run.
+ flutter::DartProject project_;
+
+ // The Flutter instance hosted by this window.
+ std::unique_ptr flutter_controller_;
+};
+
+#endif // RUNNER_FLUTTER_WINDOW_H_
diff --git a/examples/flutter/quickstart/windows/runner/main.cpp b/examples/flutter/quickstart/windows/runner/main.cpp
new file mode 100644
index 00000000..b7fd16b9
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/main.cpp
@@ -0,0 +1,43 @@
+#include
+#include
+#include
+
+#include "flutter_window.h"
+#include "utils.h"
+
+int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
+ _In_ wchar_t *command_line, _In_ int show_command) {
+ // Attach to console when present (e.g., 'flutter run') or create a
+ // new console when running with a debugger.
+ if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+ CreateAndAttachConsole();
+ }
+
+ // Initialize COM, so that it is available for use in the library and/or
+ // plugins.
+ ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+
+ flutter::DartProject project(L"data");
+
+ std::vector command_line_arguments =
+ GetCommandLineArguments();
+
+ project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
+
+ FlutterWindow window(project);
+ Win32Window::Point origin(10, 10);
+ Win32Window::Size size(1280, 720);
+ if (!window.Create(L"quickstart", origin, size)) {
+ return EXIT_FAILURE;
+ }
+ window.SetQuitOnClose(true);
+
+ ::MSG msg;
+ while (::GetMessage(&msg, nullptr, 0, 0)) {
+ ::TranslateMessage(&msg);
+ ::DispatchMessage(&msg);
+ }
+
+ ::CoUninitialize();
+ return EXIT_SUCCESS;
+}
diff --git a/examples/flutter/quickstart/windows/runner/resource.h b/examples/flutter/quickstart/windows/runner/resource.h
new file mode 100644
index 00000000..66a65d1e
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/resource.h
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Runner.rc
+//
+#define IDI_APP_ICON 101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/examples/flutter/quickstart/windows/runner/resources/app_icon.ico b/examples/flutter/quickstart/windows/runner/resources/app_icon.ico
new file mode 100644
index 00000000..c04e20ca
Binary files /dev/null and b/examples/flutter/quickstart/windows/runner/resources/app_icon.ico differ
diff --git a/examples/flutter/quickstart/windows/runner/runner.exe.manifest b/examples/flutter/quickstart/windows/runner/runner.exe.manifest
new file mode 100644
index 00000000..153653e8
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/runner.exe.manifest
@@ -0,0 +1,14 @@
+
+
+
+
+ PerMonitorV2
+
+
+
+
+
+
+
+
+
diff --git a/examples/flutter/quickstart/windows/runner/utils.cpp b/examples/flutter/quickstart/windows/runner/utils.cpp
new file mode 100644
index 00000000..3a0b4651
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/utils.cpp
@@ -0,0 +1,65 @@
+#include "utils.h"
+
+#include
+#include
+#include
+#include
+
+#include
+
+void CreateAndAttachConsole() {
+ if (::AllocConsole()) {
+ FILE *unused;
+ if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
+ _dup2(_fileno(stdout), 1);
+ }
+ if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
+ _dup2(_fileno(stdout), 2);
+ }
+ std::ios::sync_with_stdio();
+ FlutterDesktopResyncOutputStreams();
+ }
+}
+
+std::vector GetCommandLineArguments() {
+ // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
+ int argc;
+ wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
+ if (argv == nullptr) {
+ return std::vector();
+ }
+
+ std::vector command_line_arguments;
+
+ // Skip the first argument as it's the binary name.
+ for (int i = 1; i < argc; i++) {
+ command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
+ }
+
+ ::LocalFree(argv);
+
+ return command_line_arguments;
+}
+
+std::string Utf8FromUtf16(const wchar_t* utf16_string) {
+ if (utf16_string == nullptr) {
+ return std::string();
+ }
+ unsigned int target_length = ::WideCharToMultiByte(
+ CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+ -1, nullptr, 0, nullptr, nullptr)
+ -1; // remove the trailing null character
+ int input_length = (int)wcslen(utf16_string);
+ std::string utf8_string;
+ if (target_length == 0 || target_length > utf8_string.max_size()) {
+ return utf8_string;
+ }
+ utf8_string.resize(target_length);
+ int converted_length = ::WideCharToMultiByte(
+ CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string,
+ input_length, utf8_string.data(), target_length, nullptr, nullptr);
+ if (converted_length == 0) {
+ return std::string();
+ }
+ return utf8_string;
+}
diff --git a/examples/flutter/quickstart/windows/runner/utils.h b/examples/flutter/quickstart/windows/runner/utils.h
new file mode 100644
index 00000000..3879d547
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/utils.h
@@ -0,0 +1,19 @@
+#ifndef RUNNER_UTILS_H_
+#define RUNNER_UTILS_H_
+
+#include
+#include
+
+// Creates a console for the process, and redirects stdout and stderr to
+// it for both the runner and the Flutter library.
+void CreateAndAttachConsole();
+
+// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
+// encoded in UTF-8. Returns an empty std::string on failure.
+std::string Utf8FromUtf16(const wchar_t* utf16_string);
+
+// Gets the command line arguments passed in as a std::vector,
+// encoded in UTF-8. Returns an empty std::vector on failure.
+std::vector GetCommandLineArguments();
+
+#endif // RUNNER_UTILS_H_
diff --git a/examples/flutter/quickstart/windows/runner/win32_window.cpp b/examples/flutter/quickstart/windows/runner/win32_window.cpp
new file mode 100644
index 00000000..60608d0f
--- /dev/null
+++ b/examples/flutter/quickstart/windows/runner/win32_window.cpp
@@ -0,0 +1,288 @@
+#include "win32_window.h"
+
+#include
+#include
+
+#include "resource.h"
+
+namespace {
+
+/// Window attribute that enables dark mode window decorations.
+///
+/// Redefined in case the developer's machine has a Windows SDK older than
+/// version 10.0.22000.0.
+/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
+#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
+#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
+#endif
+
+constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
+
+/// Registry key for app theme preference.
+///
+/// A value of 0 indicates apps should use dark mode. A non-zero or missing
+/// value indicates apps should use light mode.
+constexpr const wchar_t kGetPreferredBrightnessRegKey[] =
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize";
+constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme";
+
+// The number of Win32Window objects that currently exist.
+static int g_active_window_count = 0;
+
+using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
+
+// Scale helper to convert logical scaler values to physical using passed in
+// scale factor
+int Scale(int source, double scale_factor) {
+ return static_cast(source * scale_factor);
+}
+
+// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
+// This API is only needed for PerMonitor V1 awareness mode.
+void EnableFullDpiSupportIfAvailable(HWND hwnd) {
+ HMODULE user32_module = LoadLibraryA("User32.dll");
+ if (!user32_module) {
+ return;
+ }
+ auto enable_non_client_dpi_scaling =
+ reinterpret_cast(
+ GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
+ if (enable_non_client_dpi_scaling != nullptr) {
+ enable_non_client_dpi_scaling(hwnd);
+ }
+ FreeLibrary(user32_module);
+}
+
+} // namespace
+
+// Manages the Win32Window's window class registration.
+class WindowClassRegistrar {
+ public:
+ ~WindowClassRegistrar() = default;
+
+ // Returns the singleton registrar instance.
+ static WindowClassRegistrar* GetInstance() {
+ if (!instance_) {
+ instance_ = new WindowClassRegistrar();
+ }
+ return instance_;
+ }
+
+ // Returns the name of the window class, registering the class if it hasn't
+ // previously been registered.
+ const wchar_t* GetWindowClass();
+
+ // Unregisters the window class. Should only be called if there are no
+ // instances of the window.
+ void UnregisterWindowClass();
+
+ private:
+ WindowClassRegistrar() = default;
+
+ static WindowClassRegistrar* instance_;
+
+ bool class_registered_ = false;
+};
+
+WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
+
+const wchar_t* WindowClassRegistrar::GetWindowClass() {
+ if (!class_registered_) {
+ WNDCLASS window_class{};
+ window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
+ window_class.lpszClassName = kWindowClassName;
+ window_class.style = CS_HREDRAW | CS_VREDRAW;
+ window_class.cbClsExtra = 0;
+ window_class.cbWndExtra = 0;
+ window_class.hInstance = GetModuleHandle(nullptr);
+ window_class.hIcon =
+ LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
+ window_class.hbrBackground = 0;
+ window_class.lpszMenuName = nullptr;
+ window_class.lpfnWndProc = Win32Window::WndProc;
+ RegisterClass(&window_class);
+ class_registered_ = true;
+ }
+ return kWindowClassName;
+}
+
+void WindowClassRegistrar::UnregisterWindowClass() {
+ UnregisterClass(kWindowClassName, nullptr);
+ class_registered_ = false;
+}
+
+Win32Window::Win32Window() {
+ ++g_active_window_count;
+}
+
+Win32Window::~Win32Window() {
+ --g_active_window_count;
+ Destroy();
+}
+
+bool Win32Window::Create(const std::wstring& title,
+ const Point& origin,
+ const Size& size) {
+ Destroy();
+
+ const wchar_t* window_class =
+ WindowClassRegistrar::GetInstance()->GetWindowClass();
+
+ const POINT target_point = {static_cast(origin.x),
+ static_cast(origin.y)};
+ HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
+ UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
+ double scale_factor = dpi / 96.0;
+
+ HWND window = CreateWindow(
+ window_class, title.c_str(), WS_OVERLAPPEDWINDOW,
+ Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
+ Scale(size.width, scale_factor), Scale(size.height, scale_factor),
+ nullptr, nullptr, GetModuleHandle(nullptr), this);
+
+ if (!window) {
+ return false;
+ }
+
+ UpdateTheme(window);
+
+ return OnCreate();
+}
+
+bool Win32Window::Show() {
+ return ShowWindow(window_handle_, SW_SHOWNORMAL);
+}
+
+// static
+LRESULT CALLBACK Win32Window::WndProc(HWND const window,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ if (message == WM_NCCREATE) {
+ auto window_struct = reinterpret_cast(lparam);
+ SetWindowLongPtr(window, GWLP_USERDATA,
+ reinterpret_cast(window_struct->lpCreateParams));
+
+ auto that = static_cast(window_struct->lpCreateParams);
+ EnableFullDpiSupportIfAvailable(window);
+ that->window_handle_ = window;
+ } else if (Win32Window* that = GetThisFromHandle(window)) {
+ return that->MessageHandler(window, message, wparam, lparam);
+ }
+
+ return DefWindowProc(window, message, wparam, lparam);
+}
+
+LRESULT
+Win32Window::MessageHandler(HWND hwnd,
+ UINT const message,
+ WPARAM const wparam,
+ LPARAM const lparam) noexcept {
+ switch (message) {
+ case WM_DESTROY:
+ window_handle_ = nullptr;
+ Destroy();
+ if (quit_on_close_) {
+ PostQuitMessage(0);
+ }
+ return 0;
+
+ case WM_DPICHANGED: {
+ auto newRectSize = reinterpret_cast