diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md index 026af7a3..484c8e74 100644 --- a/GETTING_STARTED.md +++ b/GETTING_STARTED.md @@ -27,9 +27,9 @@ On most platforms[0], [ThermionWidget] is the widget where your rendered content [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 FilamentWidget constructor.on the second frame, FilamentWidget will pass its dimensions/pixel ratio to the FilamentController +- 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 FilamentViewer and an AssetManager, which will allow you to load assets/cameras/lighting/etc via the FilamentControllerafter an indeterminate number of frames, FilamentController will notify FilamentWidget when a rendering surface is available the viewportFilamentWidget 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. + 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/README.md b/README.md index 95591803..6b24ed46 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,33 @@ -# Flutter Filament +![Thermion Logo](logo.png) -Cross-platform, 3D PBR rendering and animation for [Flutter](https://github.com/google/filament). +

+ Quickstart (Flutter) • + Documentation • + Playground • + Showcase • + Discord +

+## Cross-platform 3D engine for Dart and Flutter. + +pub +github +discord +contributors + +### 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 + +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. + +(https://github.com/google/filament) Wraps the [the Filament rendering library](https://github.com/google/filament). Powers the [Polyvox](https://polyvox.app) and [odd-io](https://github.com/odd-io/) engines. @@ -11,19 +37,6 @@ This is still in beta: bugs/missing features are to be expected. https://github.com/nmfisher/thermion_flutter/assets/7238578/abaed1c8-c97b-4999-97b2-39e85e0fa7dd -|Feature|Supported| -|---|---| -|Platforms|✅ iOS (arm64)
✅ MacOS (arm64)
✅ Android (arm64)
✅ Windows (x64) (>= 10)
⚠️ Linux (x64 - broken)
⚠️ Web (planned)| -|Formats|✅ glb
⚠️ glTF (partial - see Known Issues)| -|Texture support|✅ PNG
✅ JPEG
✅ KTX
⚠️ KTX2 (planned)| -|Camera movement|✅ Desktop (mouse)
✅ Mobile (swipe/pinch)| -|Animation|✅ Embedded glTF skinning animations
✅ Embedded glTF morph animations
✅ Runtime/dynamic morph animations
⚠️ Runtime/dynamic skinning animations
-|Entity manipulation|✅ Viewport selection
⚠️ Entity/transform parenting (planned)
⚠️ Transform manipulation (mouse/gesture to rotate/translate/scale object) (partial)
⚠️ Runtime material changes (planned)| - -Special thanks to [odd-io](https://github.com/odd-io/) for sponsoring work on supporting Windows, raycasting, testing and documentation. - -PRs are welcome but please create a placeholder PR to discuss before writing any code. This will help with feature planning, avoid clashes with existing work and keep the project structure consistent. - ## Getting Started This package requires Flutter >= `3.16.0-0.2.pre`, so you will need to first switch to the `beta` channel: @@ -84,7 +97,7 @@ class MyApp extends StatelessWidget { 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`. +Next, create an instance of `ThermionWidget` 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 `ThermionWidget`. ``` class MyApp extends StatelessWidget { @@ -97,24 +110,24 @@ class MyApp extends StatelessWidget { 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.fill(top:100, left:100child:ThermionWidget(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` +When a `ThermionWidget` 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 `ThermionWidget` constructor. +2) on the second frame, `ThermionWidget` will pass its dimensions/pixel ratio to the `FilamentController` 3) You can then call `createViewer` to create: * the rendering surface (on most platforms, a backing texture that will be registered with Flutter for use in a `Texture` widget) * a rendering thread - * a `FilamentViewer` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController` -4) after an indeterminate number of frames, `FilamentController` will notify `FilamentWidget` when a rendering surface is available the viewport -5) `FilamentWidget` will replace the default `initial` Widget with the viewport (which will initially be solid black or white, depending on your platform). + * a `ThermionViewerFFI` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController` +4) after an indeterminate number of frames, `FilamentController` will notify `ThermionWidget` when a rendering surface is available the viewport +5) `ThermionWidget` 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. +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. @@ -172,12 +185,12 @@ You can also pass a URI to indicate that the glTF file should be loaded from the 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: +The return type `ThermionEntity` is simply an integer handle that be used to manipulate the entity in the scene. For example, to remove the asset: ``` await _filamentController.removeEntity(entity); entity = null; ``` -> Removing an entity from the scene will invalidate the corresponding `FilamentEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `FilamentEntity` does not invalidate/change any other `FilamentEntity` handles; you can continue to safely manipulate these via the `FilamentController`. +> Removing an entity from the scene will invalidate the corresponding `ThermionEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `ThermionEntity` does not invalidate/change any other `ThermionEntity` handles; you can continue to safely manipulate these via the `FilamentController`. ### Lighting @@ -202,11 +215,11 @@ To set the world space position of the asset: _filamentController.setPositon(entity, 1.0, 1.0, 1.0); ``` -On desktop, you can also click any renderable object in the viewport to retrieve its associated FilamentEntity (see below). +On desktop, you can also click any renderable object in the viewport to retrieve its associated ThermionEntity (see below). ### Camera movement -To enable mouse/swipe navigation through the scene, wrap the `FilamentWidget` inside a `FilamentGestureDetector`: +To enable mouse/swipe navigation through the scene, wrap the `ThermionWidget` inside a `FilamentGestureDetector`: ``` class MyApp extends StatelessWidget { @@ -220,7 +233,7 @@ class MyApp extends StatelessWidget { home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[ Positioned.fill(child:FilamentGestureDetector( controller: _filamentController, - child:FilamentWidget( + child:ThermionWidget( controller:_filamentController ))), Positioned(right:0, bottom:0, child:Container(color:Colors.purple, height:100, width:100)) @@ -253,7 +266,7 @@ await _filamentController.setCamera(asset, null); // pass null to load the first ### 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). +On desktop, left-clicking an object in the viewport will retrieve the ThermionEntity 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. @@ -269,7 +282,7 @@ class _MyAppState extends State { @override void initState() { - _filamentController.pickResult.listen((FilamentEntity filamentEntity) async { + _filamentController.pickResult.listen((ThermionEntity filamentEntity) async { var entityName = _filamentController.getNameForEntity(filamentEntity); await showDialog(builder:(ctx) { return Container(child:Text("You clicked $entityName")); @@ -284,7 +297,7 @@ class _MyAppState extends State { home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[ Positioned.fill(child:FilamentGestureDetector( controller: _filamentController, - child:FilamentWidget( + child:ThermionWidget( controller:_filamentController ))), ]))); diff --git a/examples/dart/cli_macos/bin/example_cli.dart b/examples/dart/cli_macos/bin/example_cli.dart index 2cff43e4..e56c3400 100644 --- a/examples/dart/cli_macos/bin/example_cli.dart +++ b/examples/dart/cli_macos/bin/example_cli.dart @@ -23,7 +23,7 @@ void main() async { DartResourceLoader.freeResource); resourceLoader.ref.freeResource = freeResource.nativeFunction; - var viewer = FilamentViewer(resourceLoader: resourceLoader.cast()); + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); await viewer.initialized; await viewer.createSwapChain(500, 500); diff --git a/examples/dart/cli_wasm/bin/example_cli.dart b/examples/dart/cli_wasm/bin/example_cli.dart index 95aefb5e..7e5f0a1f 100644 --- a/examples/dart/cli_wasm/bin/example_cli.dart +++ b/examples/dart/cli_wasm/bin/example_cli.dart @@ -4,7 +4,7 @@ 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 = FilamentViewer(resourceLoader: resourceLoader.cast()); + 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"); diff --git a/examples/dart/web_wasm/bin/example_web.dart b/examples/dart/web_wasm/bin/example_web.dart index 2075d3fe..37e35c1a 100644 --- a/examples/dart/web_wasm/bin/example_web.dart +++ b/examples/dart/web_wasm/bin/example_web.dart @@ -1,7 +1,7 @@ import 'dart:js_interop'; import 'dart:js_interop_unsafe'; import 'package:thermion_dart/thermion_dart/compatibility/compatibility.dart'; -import 'package:thermion_dart/thermion_dart/filament_viewer_impl.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; import 'package:web/web.dart'; void main(List arguments) async { @@ -13,7 +13,7 @@ void main(List arguments) async { var resourceLoader = thermion_dart_web_get_resource_loader_wrapper(); - var viewer = FilamentViewer(resourceLoader: resourceLoader); + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader); var mousedown = (JSObject event) { var x = event.getProperty("clientX".toJS) as JSNumber; diff --git a/examples/flutter/example/integration_test/plugin_integration_test.dart b/examples/flutter/example/integration_test/plugin_integration_test.dart index 87acac3f..d1a921f0 100644 --- a/examples/flutter/example/integration_test/plugin_integration_test.dart +++ b/examples/flutter/example/integration_test/plugin_integration_test.dart @@ -91,7 +91,7 @@ void main() { await tap(tester, "Controller / Viewer"); 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/examples/flutter/example/lib/camera_matrix_overlay.dart b/examples/flutter/example/lib/camera_matrix_overlay.dart index fdc2ff08..a2c4c17d 100644 --- a/examples/flutter/example/lib/camera_matrix_overlay.dart +++ b/examples/flutter/example/lib/camera_matrix_overlay.dart @@ -4,10 +4,10 @@ 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/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; class CameraMatrixOverlay extends StatefulWidget { - final AbstractFilamentViewer controller; + final ThermionViewer controller; final bool showProjectionMatrices; const CameraMatrixOverlay( diff --git a/examples/flutter/example/lib/example_viewport.dart b/examples/flutter/example/lib/example_viewport.dart index bd29a434..4b48ea6c 100644 --- a/examples/flutter/example/lib/example_viewport.dart +++ b/examples/flutter/example/lib/example_viewport.dart @@ -29,7 +29,7 @@ class ExampleViewport extends StatelessWidget { child: FilamentGestureDetector( showControlOverlay: true, controller: controller!.viewer, - child: FilamentWidget( + child: ThermionWidget( plugin: controller!, )))) : Container(); diff --git a/examples/flutter/example/lib/menus/asset_submenu.dart b/examples/flutter/example/lib/menus/asset_submenu.dart index 04fa70a2..3ddc3d08 100644 --- a/examples/flutter/example/lib/menus/asset_submenu.dart +++ b/examples/flutter/example/lib/menus/asset_submenu.dart @@ -5,7 +5,7 @@ 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/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; class AssetSubmenu extends StatefulWidget { final ThermionFlutterPlugin controller; diff --git a/examples/flutter/example/lib/menus/camera_submenu.dart b/examples/flutter/example/lib/menus/camera_submenu.dart index 83b6edd4..5113264e 100644 --- a/examples/flutter/example/lib/menus/camera_submenu.dart +++ b/examples/flutter/example/lib/menus/camera_submenu.dart @@ -4,7 +4,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:vector_math/vector_math_64.dart' as v; import 'package:thermion_flutter/thermion_flutter.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_flutter_example/main.dart'; class CameraSubmenu extends StatefulWidget { diff --git a/examples/flutter/example/lib/menus/rendering_submenu.dart b/examples/flutter/example/lib/menus/rendering_submenu.dart index 33550615..0a6ced87 100644 --- a/examples/flutter/example/lib/menus/rendering_submenu.dart +++ b/examples/flutter/example/lib/menus/rendering_submenu.dart @@ -1,7 +1,7 @@ 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/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; class RenderingSubmenu extends StatefulWidget { final ThermionFlutterPlugin controller; diff --git a/examples/flutter/example/lib/picker_result_widget.dart b/examples/flutter/example/lib/picker_result_widget.dart index e8d9ab40..692c4fc6 100644 --- a/examples/flutter/example/lib/picker_result_widget.dart +++ b/examples/flutter/example/lib/picker_result_widget.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; class PickerResultWidget extends StatelessWidget { - final AbstractFilamentViewer controller; + final ThermionViewer controller; const PickerResultWidget({required this.controller, super.key}); diff --git a/examples/flutter/example/web/main.dart b/examples/flutter/example/web/main.dart index 2af080c4..91a2b0f9 100644 --- a/examples/flutter/example/web/main.dart +++ b/examples/flutter/example/web/main.dart @@ -11,9 +11,9 @@ // 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/abstract_filament_viewer.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/filament_viewer_impl.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'; @@ -32,7 +32,7 @@ void main(List arguments) async { } class WebViewer { - static Future initialize() async { + static Future initialize() async { var fc = FooChar(); final canvas = document.getElementById("canvas") as HTMLCanvasElement; canvas.width = window.innerWidth; @@ -40,7 +40,7 @@ class WebViewer { var resourceLoader = thermion_dart_web_get_resource_loader_wrapper(); - var viewer = FilamentViewer(resourceLoader: resourceLoader); + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader); await viewer.initialized; var width = window.innerWidth; 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/examples/flutter/quickstart/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..8f6ac5fd --- /dev/null +++ b/examples/flutter/quickstart/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,619 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* 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 */; }; +/* 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 = ""; }; + 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 = ""; }; + 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + 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 */, + ); + 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 = ""; + }; +/* 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 = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + 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"; + }; + 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"; + }; +/* 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 = com.example.quickstart; + 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; + 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; + 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 = com.example.quickstart; + 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 = com.example.quickstart; + 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/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..95486104 --- /dev/null +++ b/examples/flutter/quickstart/lib/main.dart @@ -0,0 +1,73 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion/widgets/thermion_widget.dart'; +import 'package:thermion_flutter/thermion_flutter.dart'; +import 'package:vector_math/vector_math_64.dart' as v; + +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.lock b/examples/flutter/quickstart/pubspec.lock new file mode 100644 index 00000000..d1f76116 --- /dev/null +++ b/examples/flutter/quickstart/pubspec.lock @@ -0,0 +1,391 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + animation_tools_dart: + dependency: transitive + description: + name: animation_tools_dart + sha256: b81591311683566ad020928015fb0c6e312ff780f712df8ff29c18f152519c8f + url: "https://pub.dev" + source: hosted + version: "0.0.4" + archive: + dependency: transitive + description: + name: archive + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d + url: "https://pub.dev" + source: hosted + version: "3.6.1" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + 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" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.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" + crypto: + dependency: transitive + 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: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + 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: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + 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_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + 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" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + native_assets_cli: + dependency: transitive + description: + path: "pkgs/native_assets_cli" + ref: "99020084c4687be4c58c7115a167088c0441d1de" + resolved-ref: "99020084c4687be4c58c7115a167088c0441d1de" + url: "git@github.com:nmfisher/native.git" + source: git + version: "0.6.1-wip" + native_toolchain_c: + dependency: transitive + description: + path: "pkgs/native_toolchain_c" + ref: "99020084c4687be4c58c7115a167088c0441d1de" + resolved-ref: "99020084c4687be4c58c7115a167088c0441d1de" + url: "git@github.com:nmfisher/native.git" + source: git + version: "0.4.2" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + 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" + 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: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + thermion_dart: + dependency: transitive + description: + path: "../../../thermion_dart" + relative: true + source: path + version: "0.5.0" + thermion_flutter: + dependency: "direct main" + description: + path: "../../../thermion_flutter/thermion_flutter" + relative: true + source: path + version: "0.7.0" + thermion_flutter_ffi: + dependency: transitive + description: + path: "../../../thermion_flutter/thermion_flutter_ffi" + relative: true + source: path + version: "0.0.1" + thermion_flutter_platform_interface: + dependency: transitive + description: + path: "../../../thermion_flutter/thermion_flutter_platform_interface" + relative: true + source: path + version: "0.0.1" + thermion_flutter_web: + dependency: transitive + description: + path: "../../../thermion_flutter/thermion_flutter_web" + relative: true + source: path + version: "0.0.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" + vector_math: + dependency: "direct main" + 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: "360c4271613beb44db559547d02f8b0dc044741d0eeb9aa6ccdb47e8ec54c63a" + url: "https://pub.dev" + source: hosted + version: "14.2.3" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.5.0-250.0.dev <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" 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(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/examples/flutter/quickstart/windows/runner/win32_window.h b/examples/flutter/quickstart/windows/runner/win32_window.h new file mode 100644 index 00000000..e901dde6 --- /dev/null +++ b/examples/flutter/quickstart/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/logo.png b/logo.png new file mode 100644 index 00000000..ee357758 Binary files /dev/null and b/logo.png differ diff --git a/thermion_dart/ARCHITECTURE.md b/thermion_dart/ARCHITECTURE.md index 8b952df9..85cec869 100644 --- a/thermion_dart/ARCHITECTURE.md +++ b/thermion_dart/ARCHITECTURE.md @@ -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/thermion_dart/CHANGELOG.md b/thermion_dart/CHANGELOG.md index adffb3d5..fe49ebe8 100644 --- a/thermion_dart/CHANGELOG.md +++ b/thermion_dart/CHANGELOG.md @@ -10,7 +10,7 @@ * added support for parenting one entity to another * added basic collision detection + callbacks * added keyboard/mouse widgets + controls -* `createViewer` now `awaits` the insertion of `FilamentWidget` so you no longer need to manually defer calling until after FilamentWidget has been rendered +* `createViewer` now `awaits` the insertion of `ThermionWidget` so you no longer need to manually defer calling until after ThermionWidget has been rendered * `setCameraRotation` now accepts a quaternion instead of an axis/angle * instancing is now supported. * `setBoneTransform` has been removed. To set the transform for a bone, just `addBoneAnimation` with a single frame. @@ -20,7 +20,7 @@ ## 0.6.0 -* `createViewer` is no longer called by `FilamentWidget` and must be called manually at least one frame after a FilamentWidget has been inserted into the widget hierarchy. +* `createViewer` is no longer called by `ThermionWidget` and must be called manually at least one frame after a ThermionWidget has been inserted into the widget hierarchy. ## 0.5.0 diff --git a/thermion_dart/README.md b/thermion_dart/README.md index 511c5dd5..d737b10b 100644 --- a/thermion_dart/README.md +++ b/thermion_dart/README.md @@ -84,7 +84,7 @@ class MyApp extends StatelessWidget { 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`. +Next, create an instance of `ThermionWidget` 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 `ThermionWidget`. ``` class MyApp extends StatelessWidget { @@ -97,24 +97,24 @@ class MyApp extends StatelessWidget { 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.fill(top:100, left:100child:ThermionWidget(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` +When a `ThermionWidget` 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 `ThermionWidget` constructor. +2) on the second frame, `ThermionWidget` will pass its dimensions/pixel ratio to the `FilamentController` 3) You can then call `createViewer` to create: * the rendering surface (on most platforms, a backing texture that will be registered with Flutter for use in a `Texture` widget) * a rendering thread - * a `FilamentViewer` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController` -4) after an indeterminate number of frames, `FilamentController` will notify `FilamentWidget` when a rendering surface is available the viewport -5) `FilamentWidget` will replace the default `initial` Widget with the viewport (which will initially be solid black or white, depending on your platform). + * a `ThermionViewerFFI` and an `SceneManager`, which will allow you to load assets/cameras/lighting/etc via the `FilamentController` +4) after an indeterminate number of frames, `FilamentController` will notify `ThermionWidget` when a rendering surface is available the viewport +5) `ThermionWidget` 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. +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. @@ -172,12 +172,12 @@ You can also pass a URI to indicate that the glTF file should be loaded from the 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: +The return type `ThermionEntity` is simply an integer handle that be used to manipulate the entity in the scene. For example, to remove the asset: ``` await _filamentController.removeEntity(entity); entity = null; ``` -> Removing an entity from the scene will invalidate the corresponding `FilamentEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `FilamentEntity` does not invalidate/change any other `FilamentEntity` handles; you can continue to safely manipulate these via the `FilamentController`. +> Removing an entity from the scene will invalidate the corresponding `ThermionEntity` handle, so ensure you don't retain any references to it after calling `removeEntity` or `clearEntities`. Removing one `ThermionEntity` does not invalidate/change any other `ThermionEntity` handles; you can continue to safely manipulate these via the `FilamentController`. ### Lighting @@ -202,11 +202,11 @@ To set the world space position of the asset: _filamentController.setPositon(entity, 1.0, 1.0, 1.0); ``` -On desktop, you can also click any renderable object in the viewport to retrieve its associated FilamentEntity (see below). +On desktop, you can also click any renderable object in the viewport to retrieve its associated ThermionEntity (see below). ### Camera movement -To enable mouse/swipe navigation through the scene, wrap the `FilamentWidget` inside a `FilamentGestureDetector`: +To enable mouse/swipe navigation through the scene, wrap the `ThermionWidget` inside a `FilamentGestureDetector`: ``` class MyApp extends StatelessWidget { @@ -220,7 +220,7 @@ class MyApp extends StatelessWidget { home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[ Positioned.fill(child:FilamentGestureDetector( controller: _filamentController, - child:FilamentWidget( + child:ThermionWidget( controller:_filamentController ))), Positioned(right:0, bottom:0, child:Container(color:Colors.purple, height:100, width:100)) @@ -253,7 +253,7 @@ await _filamentController.setCamera(asset, null); // pass null to load the first ### 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). +On desktop, left-clicking an object in the viewport will retrieve the ThermionEntity 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. @@ -269,7 +269,7 @@ class _MyAppState extends State { @override void initState() { - _filamentController.pickResult.listen((FilamentEntity filamentEntity) async { + _filamentController.pickResult.listen((ThermionEntity filamentEntity) async { var entityName = _filamentController.getNameForEntity(filamentEntity); await showDialog(builder:(ctx) { return Container(child:Text("You clicked $entityName")); @@ -284,7 +284,7 @@ class _MyAppState extends State { home: Scaffold(backgroundColor: Colors.white, body: Stack(children:[ Positioned.fill(child:FilamentGestureDetector( controller: _filamentController, - child:FilamentWidget( + child:ThermionWidget( controller:_filamentController ))), ]))); diff --git a/thermion_dart/lib/thermion_dart.dart b/thermion_dart/lib/thermion_dart.dart index 877c5856..9e72b1f1 100644 --- a/thermion_dart/lib/thermion_dart.dart +++ b/thermion_dart/lib/thermion_dart.dart @@ -1,6 +1,6 @@ library filament_dart; export 'thermion_dart/entities/filament_entity.dart'; -export 'thermion_dart/abstract_filament_viewer.dart'; -export 'thermion_dart/filament_viewer_impl.dart'; +export 'thermion_dart/thermion_viewer.dart'; +export 'thermion_dart/thermion_viewer_ffi.dart'; export 'thermion_dart/entities/entity_transform_controller.dart'; diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart index b676d5cc..e7319d0a 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart @@ -3,25 +3,25 @@ import 'dart:js_interop_unsafe'; import 'dart:math'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:vector_math/vector_math_64.dart'; -import 'shims/abstract_filament_viewer_js_shim.dart'; +import 'shims/thermion_viewer_js_shim.dart'; /// -/// An [AbstractFilamentViewer] implementation that forwards calls to -/// a corresponding Javascript shim implementation (see [AbstractFilamentViewerJSShim]). +/// An [ThermionViewer] implementation that forwards calls to +/// a corresponding Javascript shim implementation (see [ThermionViewerJSShim]). /// -class FilamentViewerJS implements AbstractFilamentViewer { - late final AbstractFilamentViewerJSShim _shim; +class ThermionViewerFFIJS implements ThermionViewer { + late final ThermionViewerJSShim _shim; - FilamentViewerJS.fromGlobalProperty(String globalPropertyName) { + ThermionViewerFFIJS.fromGlobalProperty(String globalPropertyName) { this._shim = globalContext.getProperty(globalPropertyName.toJS) - as AbstractFilamentViewerJSShim; + as ThermionViewerJSShim; } - FilamentViewerJS(this._shim); + ThermionViewerFFIJS(this._shim); @override Future get initialized async { @@ -109,7 +109,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future addLight( + Future addLight( LightType type, double colour, double intensity, @@ -149,7 +149,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future removeLight(FilamentEntity light) async { + Future removeLight(ThermionEntity light) async { await _shim.removeLight(light).toDart; } @@ -159,41 +159,41 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future loadGlb(String path, {int numInstances = 1}) async { + Future loadGlb(String path, {int numInstances = 1}) async { var entity = (await _shim.loadGlb(path, numInstances).toDart).toDartInt; scene.registerEntity(entity); return entity; } @override - Future createInstance(FilamentEntity entity) async { + Future createInstance(ThermionEntity entity) async { return (await _shim.createInstance(entity).toDart).toDartInt; } @override - Future getInstanceCount(FilamentEntity entity) async { + Future getInstanceCount(ThermionEntity entity) async { return (await _shim.getInstanceCount(entity).toDart).toDartInt; } @override - Future> getInstances(FilamentEntity entity) async { + Future> getInstances(ThermionEntity entity) async { throw UnimplementedError(); // final List jsInstances = // await _shim.getInstances(entity).toDart; // return jsInstances - // .map((js) => FilamentEntity._fromJSObject(js)) + // .map((js) => ThermionEntity._fromJSObject(js)) // .toList() // .toDart; } @override - Future loadGltf(String path, String relativeResourcePath, + Future loadGltf(String path, String relativeResourcePath, {bool force = false}) async { throw UnimplementedError(); - // final FilamentEntity jsEntity = await _shim + // final ThermionEntity jsEntity = await _shim // .loadGltf(path, relativeResourcePath, force: force) // .toDart; - // return FilamentEntity._fromJSObject(jsEntity).toDart; + // return ThermionEntity._fromJSObject(jsEntity).toDart; } @override @@ -228,7 +228,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { @override Future setMorphTargetWeights( - FilamentEntity entity, List weights) async { + ThermionEntity entity, List weights) async { var jsWeights = weights.map((x) => x.toJS).cast().toList().toJS; var promise = _shim.setMorphTargetWeights(entity, jsWeights); await promise.toDart; @@ -236,13 +236,13 @@ class FilamentViewerJS implements AbstractFilamentViewer { @override Future> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity) async { + ThermionEntity entity, ThermionEntity childEntity) async { var result = await _shim.getMorphTargetNames(entity, childEntity).toDart; return result.toDart.map((r) => r.toDart).toList(); } @override - Future> getAnimationNames(FilamentEntity entity) async { + Future> getAnimationNames(ThermionEntity entity) async { var names = (await (_shim.getAnimationNames(entity).toDart)) .toDart .map((x) => x.toDart) @@ -252,14 +252,14 @@ class FilamentViewerJS implements AbstractFilamentViewer { @override Future getAnimationDuration( - FilamentEntity entity, int animationIndex) async { + ThermionEntity entity, int animationIndex) async { return (await _shim.getAnimationDuration(entity, animationIndex).toDart) .toDartDouble; } @override Future setMorphAnimationData( - FilamentEntity entity, MorphAnimationData animation, + ThermionEntity entity, MorphAnimationData animation, {List? targetMeshNames}) async { try { var animationDataJs = animation.data @@ -285,13 +285,13 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future resetBones(FilamentEntity entity) async { + Future resetBones(ThermionEntity entity) async { await _shim.resetBones(entity).toDart; } @override Future addBoneAnimation( - FilamentEntity entity, BoneAnimationData animation, + ThermionEntity entity, BoneAnimationData animation, {int skinIndex = 0, double fadeInInSecs = 0.0, double fadeOutInSecs = 0.0, @@ -328,7 +328,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future removeEntity(FilamentEntity entity) async { + Future removeEntity(ThermionEntity entity) async { await _shim.removeEntity(entity).toDart; } @@ -353,7 +353,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future playAnimation(FilamentEntity entity, int index, + Future playAnimation(ThermionEntity entity, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -364,7 +364,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future playAnimationByName(FilamentEntity entity, String name, + Future playAnimationByName(ThermionEntity entity, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -377,22 +377,22 @@ class FilamentViewerJS implements AbstractFilamentViewer { @override Future setAnimationFrame( - FilamentEntity entity, int index, int animationFrame) async { + ThermionEntity entity, int index, int animationFrame) async { await _shim.setAnimationFrame(entity, index, animationFrame).toDart; } @override - Future stopAnimation(FilamentEntity entity, int animationIndex) async { + Future stopAnimation(ThermionEntity entity, int animationIndex) async { await _shim.stopAnimation(entity, animationIndex).toDart; } @override - Future stopAnimationByName(FilamentEntity entity, String name) async { + Future stopAnimationByName(ThermionEntity entity, String name) async { await _shim.stopAnimationByName(entity, name).toDart; } @override - Future setCamera(FilamentEntity entity, String? name) async { + Future setCamera(ThermionEntity entity, String? name) async { await _shim.setCamera(entity, name).toDart; } @@ -402,10 +402,10 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future getMainCamera() async { + Future getMainCamera() async { throw UnimplementedError(); - // final FilamentEntity jsEntity = await _shim.getMainCamera().toDart; - // return FilamentEntity._fromJSObject(jsEntity).toDart; + // final ThermionEntity jsEntity = await _shim.getMainCamera().toDart; + // return ThermionEntity._fromJSObject(jsEntity).toDart; } @override @@ -506,7 +506,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future moveCameraToAsset(FilamentEntity entity) async { + Future moveCameraToAsset(ThermionEntity entity) async { await _shim.moveCameraToAsset(entity).toDart; } @@ -541,7 +541,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future setMaterialColor(FilamentEntity entity, String meshName, + Future setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a) async { await _shim .setMaterialColor(entity, meshName, materialIndex, r, g, b, a) @@ -549,43 +549,43 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future transformToUnitCube(FilamentEntity entity) async { + Future transformToUnitCube(ThermionEntity entity) async { await _shim.transformToUnitCube(entity).toDart; } @override Future setPosition( - FilamentEntity entity, double x, double y, double z) async { + ThermionEntity entity, double x, double y, double z) async { await _shim.setPosition(entity, x, y, z).toDart; } @override - Future setScale(FilamentEntity entity, double scale) async { + Future setScale(ThermionEntity entity, double scale) async { await _shim.setScale(entity, scale).toDart; } @override Future setRotation( - FilamentEntity entity, double rads, double x, double y, double z) async { + ThermionEntity entity, double rads, double x, double y, double z) async { await _shim.setRotation(entity, rads, x, y, z).toDart; } @override Future queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, + ThermionEntity entity, double x, double y, double z, {bool relative = false}) async { await _shim.queuePositionUpdate(entity, x, y, z, relative).toDart; } @override Future queueRotationUpdate( - FilamentEntity entity, double rads, double x, double y, double z, + ThermionEntity entity, double rads, double x, double y, double z, {bool relative = false}) async { await _shim.queueRotationUpdate(entity, rads, x, y, z, relative).toDart; } @override - Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat, + Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat, {bool relative = false}) async { throw UnimplementedError(); @@ -607,20 +607,20 @@ class FilamentViewerJS implements AbstractFilamentViewer { @override Future setRotationQuat( - FilamentEntity entity, Quaternion rotation) async { + ThermionEntity entity, Quaternion rotation) async { throw UnimplementedError(); // final JSQuaternion jsRotation = rotation.toJSQuaternion().toDart; // await _shim.setRotationQuat(entity, jsRotation).toDart; } @override - Future reveal(FilamentEntity entity, String? meshName) async { + Future reveal(ThermionEntity entity, String? meshName) async { throw UnimplementedError(); // await _shim.reveal(entity, meshName).toDart; } @override - Future hide(FilamentEntity entity, String? meshName) async { + Future hide(ThermionEntity entity, String? meshName) async { throw UnimplementedError(); // await _shim.hide(entity, meshName).toDart; } @@ -632,7 +632,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - String? getNameForEntity(FilamentEntity entity) { + String? getNameForEntity(ThermionEntity entity) { return _shim.getNameForEntity(entity); } @@ -649,24 +649,24 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future> getChildEntities( - FilamentEntity parent, bool renderableOnly) async { + Future> getChildEntities( + ThermionEntity parent, bool renderableOnly) async { final children = await _shim.getChildEntities(parent, renderableOnly).toDart; return children.toDart .map((js) => js.toDartInt) - .cast() + .cast() .toList(); } @override - Future getChildEntity( - FilamentEntity parent, String childName) async { + Future getChildEntity( + ThermionEntity parent, String childName) async { return (await _shim.getChildEntity(parent, childName).toDart).toDartInt; } @override - Future> getChildEntityNames(FilamentEntity entity, + Future> getChildEntityNames(ThermionEntity entity, {bool renderableOnly = true}) async { var names = await _shim.getChildEntityNames(entity, renderableOnly).toDart; return names.toDart.map((x) => x.toDart).toList(); @@ -684,12 +684,12 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future addAnimationComponent(FilamentEntity entity) async { + Future addAnimationComponent(ThermionEntity entity) async { await _shim.addAnimationComponent(entity).toDart; } @override - Future addCollisionComponent(FilamentEntity entity, + Future addCollisionComponent(ThermionEntity entity, {void Function(int entityId1, int entityId2)? callback, bool affectsTransform = false}) async { throw UnimplementedError(); @@ -705,35 +705,35 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future removeCollisionComponent(FilamentEntity entity) async { + Future removeCollisionComponent(ThermionEntity entity) async { await _shim.removeCollisionComponent(entity).toDart; } @override - Future createGeometry( + Future createGeometry( List vertices, List indices, {String? materialPath, PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async { throw UnimplementedError(); - // final FilamentEntity jsEntity = await _shim + // final ThermionEntity jsEntity = await _shim // .createGeometry(vertices, indices, // materialPath: materialPath, primitiveType: primitiveType.index) // .toDart; - // return FilamentEntity._fromJSObject(jsEntity).toDart; + // return ThermionEntity._fromJSObject(jsEntity).toDart; } @override - Future setParent(FilamentEntity child, FilamentEntity parent) async { + Future setParent(ThermionEntity child, ThermionEntity parent) async { await _shim.setParent(child, parent).toDart; } @override - Future testCollisions(FilamentEntity entity) async { + Future testCollisions(ThermionEntity entity) async { await _shim.testCollisions(entity).toDart; } @override - Future setPriority(FilamentEntity entityId, int priority) async { + Future setPriority(ThermionEntity entityId, int priority) async { await _shim.setPriority(entityId, priority).toDart; } @@ -748,52 +748,52 @@ class FilamentViewerJS implements AbstractFilamentViewer { AbstractGizmo? get gizmo => null; @override - Future> getBoneNames(FilamentEntity entity, + Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}) async { var result = await _shim.getBoneNames(entity, skinIndex).toDart; return result.toDart.map((n) => n.toDart).toList(); } @override - Future getBone(FilamentEntity entity, int boneIndex, + Future getBone(ThermionEntity entity, int boneIndex, {int skinIndex = 0}) async { var result = await _shim.getBone(entity, boneIndex, skinIndex).toDart; return result.toDartInt; } @override - Future getInverseBindMatrix(FilamentEntity parent, int boneIndex, + Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, {int skinIndex = 0}) { // TODO: implement getInverseBindMatrix throw UnimplementedError(); } @override - Future getLocalTransform(FilamentEntity entity) async { + Future getLocalTransform(ThermionEntity entity) async { var result = await _shim.getLocalTransform(entity).toDart; return Matrix4.fromList(result.toDart.map((v) => v.toDartDouble).toList()); } @override - Future getParent(FilamentEntity child) async { + Future getParent(ThermionEntity child) async { var result = await _shim.getParent(child).toDart; return result.toDartInt; } @override - Future getWorldTransform(FilamentEntity entity) async { + Future getWorldTransform(ThermionEntity entity) async { var result = await _shim.getLocalTransform(entity).toDart; return Matrix4.fromList(result.toDart.map((v) => v.toDartDouble).toList()); } @override - Future removeAnimationComponent(FilamentEntity entity) { + Future removeAnimationComponent(ThermionEntity entity) { return _shim.removeAnimationComponent(entity).toDart; } @override Future setBoneTransform( - FilamentEntity entity, int boneIndex, Matrix4 transform, + ThermionEntity entity, int boneIndex, Matrix4 transform, {int skinIndex = 0}) { return _shim .setBoneTransform(entity, boneIndex, @@ -802,7 +802,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future setTransform(FilamentEntity entity, Matrix4 transform) { + Future setTransform(ThermionEntity entity, Matrix4 transform) { return _shim .setTransform( entity, transform.storage.map((v) => v.toJS).toList().toJS) @@ -810,7 +810,7 @@ class FilamentViewerJS implements AbstractFilamentViewer { } @override - Future updateBoneMatrices(FilamentEntity entity) { + Future updateBoneMatrices(ThermionEntity entity) { return _shim.updateBoneMatrices(entity).toDart; } } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js_dart_bridge.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js_dart_bridge.dart index 1368b7fa..1d99b723 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js_dart_bridge.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js_dart_bridge.dart @@ -2,33 +2,33 @@ library thermion_flutter_js; import 'dart:js_interop'; -import 'package:thermion_dart/thermion_dart/compatibility/web/interop/shims/abstract_filament_viewer_js_shim.dart'; +import 'package:thermion_dart/thermion_dart/compatibility/web/interop/shims/thermion_viewer_js_shim.dart'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:vector_math/vector_math_64.dart' as v64; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'dart:js_interop_unsafe'; import 'package:vector_math/vector_math_64.dart'; /// -/// A (Dart) class that wraps a (Dart) instance of [AbstractFilamentViewer], +/// A (Dart) class that wraps a (Dart) instance of [ThermionViewer], /// but exported to JS by binding to a global property. -/// This is effectively an implementation of [AbstractFilamentViewerJSShim]; -/// allowing users to interact with an instance of [AbstractFilamentViewer] +/// This is effectively an implementation of [ThermionViewerJSShim]; +/// allowing users to interact with an instance of [ThermionViewer] /// (presumably compiled to WASM) from any Javascript context (including /// the browser console). /// @JSExport() -class FilamentViewerJSDartBridge { - final AbstractFilamentViewer viewer; +class ThermionViewerFFIJSDartBridge { + final ThermionViewer viewer; - FilamentViewerJSDartBridge(this.viewer); + ThermionViewerFFIJSDartBridge(this.viewer); void bind( {String globalPropertyName = "filamentViewer"}) { - var wrapper = createJSInteropWrapper(this) - as AbstractFilamentViewerJSShim; + var wrapper = createJSInteropWrapper(this) + as ThermionViewerJSShim; globalContext.setProperty(globalPropertyName.toJS, wrapper); } @@ -124,7 +124,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise removeLight(FilamentEntity light) => viewer.removeLight(light).toJS; + JSPromise removeLight(ThermionEntity light) => viewer.removeLight(light).toJS; @JSExport() JSPromise clearLights() => viewer.clearLights().toJS; @@ -138,16 +138,16 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise createInstance(FilamentEntity entity) { + JSPromise createInstance(ThermionEntity entity) { return viewer.createInstance(entity).then((instance) => instance.toJS).toJS; } @JSExport() - JSPromise getInstanceCount(FilamentEntity entity) => + JSPromise getInstanceCount(ThermionEntity entity) => viewer.getInstanceCount(entity).then((v) => v.toJS).toJS; @JSExport() - JSPromise> getInstances(FilamentEntity entity) { + JSPromise> getInstances(ThermionEntity entity) { return viewer .getInstances(entity) .then((instances) => @@ -184,14 +184,14 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise setMorphTargetWeights( - FilamentEntity entity, JSArray weights) { + ThermionEntity entity, JSArray weights) { var dartWeights = weights.toDart.map((w) => w.toDartDouble).toList(); return viewer.setMorphTargetWeights(entity, dartWeights).toJS; } @JSExport() JSPromise> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity) { + ThermionEntity entity, ThermionEntity childEntity) { var morphTargetNames = viewer .getMorphTargetNames(entity, childEntity) .then((v) => v.map((s) => s.toJS).toList().toJS); @@ -200,7 +200,7 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise> getBoneNames( - FilamentEntity entity, int skinIndex) { + ThermionEntity entity, int skinIndex) { return viewer .getBoneNames(entity, skinIndex: skinIndex) .then((v) => v.map((s) => s.toJS).toList().toJS) @@ -208,7 +208,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise> getAnimationNames(FilamentEntity entity) => + JSPromise> getAnimationNames(ThermionEntity entity) => viewer .getAnimationNames(entity) .then((v) => v.map((s) => s.toJS).toList().toJS) @@ -216,7 +216,7 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise getAnimationDuration( - FilamentEntity entity, int animationIndex) => + ThermionEntity entity, int animationIndex) => viewer .getAnimationDuration(entity, animationIndex) .then((v) => v.toJS) @@ -224,7 +224,7 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise setMorphAnimationData( - FilamentEntity entity, + ThermionEntity entity, JSArray> animation, JSArray morphTargets, JSArray? targetMeshNames, @@ -263,11 +263,11 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise resetBones(FilamentEntity entity) => viewer.resetBones(entity).toJS; + JSPromise resetBones(ThermionEntity entity) => viewer.resetBones(entity).toJS; @JSExport() JSPromise addBoneAnimation( - FilamentEntity entity, + ThermionEntity entity, JSArray bones, JSArray>> frameData, JSNumber frameLengthInMs, @@ -307,7 +307,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise removeEntity(FilamentEntity entity) => + JSPromise removeEntity(ThermionEntity entity) => viewer.removeEntity(entity).toJS; @JSExport() @@ -326,7 +326,7 @@ class FilamentViewerJSDartBridge { JSPromise zoomEnd() => viewer.zoomEnd().toJS; @JSExport() - JSPromise playAnimation(FilamentEntity entity, int index, + JSPromise playAnimation(ThermionEntity entity, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -343,7 +343,7 @@ class FilamentViewerJSDartBridge { .toJS; @JSExport() - JSPromise playAnimationByName(FilamentEntity entity, String name, + JSPromise playAnimationByName(ThermionEntity entity, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -361,7 +361,7 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise setAnimationFrame( - FilamentEntity entity, int index, int animationFrame) => + ThermionEntity entity, int index, int animationFrame) => viewer .setAnimationFrame( entity, @@ -371,15 +371,15 @@ class FilamentViewerJSDartBridge { .toJS; @JSExport() - JSPromise stopAnimation(FilamentEntity entity, int animationIndex) => + JSPromise stopAnimation(ThermionEntity entity, int animationIndex) => viewer.stopAnimation(entity, animationIndex).toJS; @JSExport() - JSPromise stopAnimationByName(FilamentEntity entity, String name) => + JSPromise stopAnimationByName(ThermionEntity entity, String name) => viewer.stopAnimationByName(entity, name).toJS; @JSExport() - JSPromise setCamera(FilamentEntity entity, String? name) => + JSPromise setCamera(ThermionEntity entity, String? name) => viewer.setCamera(entity, name).toJS; @JSExport() @@ -469,7 +469,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise moveCameraToAsset(FilamentEntity entity) => + JSPromise moveCameraToAsset(ThermionEntity entity) => throw UnimplementedError(); // viewer.moveCameraToAsset(entity)).toJS; @@ -502,7 +502,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise setMaterialColor(FilamentEntity entity, String meshName, + JSPromise setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a) => throw UnimplementedError(); // viewer.setMaterialColor( @@ -515,21 +515,21 @@ class FilamentViewerJSDartBridge { // a, // ).toJS; @JSExport() - JSPromise transformToUnitCube(FilamentEntity entity) => + JSPromise transformToUnitCube(ThermionEntity entity) => viewer.transformToUnitCube(entity).toJS; @JSExport() - JSPromise setPosition(FilamentEntity entity, double x, double y, double z) => + JSPromise setPosition(ThermionEntity entity, double x, double y, double z) => viewer.setPosition(entity, x, y, z).toJS; @JSExport() - JSPromise setScale(FilamentEntity entity, double scale) => + JSPromise setScale(ThermionEntity entity, double scale) => viewer.setScale(entity, scale).toJS; @JSExport() JSPromise setRotation( - FilamentEntity entity, double rads, double x, double y, double z) => + ThermionEntity entity, double rads, double x, double y, double z) => viewer.setRotation(entity, rads, x, y, z).toJS; @JSExport() JSPromise queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, bool relative) => + ThermionEntity entity, double x, double y, double z, bool relative) => viewer .queuePositionUpdate( entity, @@ -540,7 +540,7 @@ class FilamentViewerJSDartBridge { ) .toJS; @JSExport() - JSPromise queueRotationUpdate(FilamentEntity entity, double rads, double x, + JSPromise queueRotationUpdate(ThermionEntity entity, double rads, double x, double y, double z, bool relative) => viewer .queueRotationUpdate( @@ -554,7 +554,7 @@ class FilamentViewerJSDartBridge { .toJS; @JSExport() JSPromise queueRotationUpdateQuat( - FilamentEntity entity, JSArray quat, JSBoolean relative) => + ThermionEntity entity, JSArray quat, JSBoolean relative) => throw UnimplementedError(); // viewer.queueRotationUpdateQuat( // entity, @@ -572,22 +572,22 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise setRotationQuat( - FilamentEntity entity, JSArray rotation) => + ThermionEntity entity, JSArray rotation) => throw UnimplementedError(); @JSExport() - JSPromise reveal(FilamentEntity entity, String? meshName) => + JSPromise reveal(ThermionEntity entity, String? meshName) => viewer.reveal(entity, meshName).toJS; @JSExport() - JSPromise hide(FilamentEntity entity, String? meshName) => + JSPromise hide(ThermionEntity entity, String? meshName) => viewer.hide(entity, meshName).toJS; @JSExport() void pick(int x, int y) => viewer.pick(x, y); @JSExport() - String? getNameForEntity(FilamentEntity entity) => + String? getNameForEntity(ThermionEntity entity) => viewer.getNameForEntity(entity); @JSExport() @@ -608,7 +608,7 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise> getChildEntities( - FilamentEntity parent, bool renderableOnly) { + ThermionEntity parent, bool renderableOnly) { return viewer .getChildEntities( parent, @@ -622,7 +622,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise getChildEntity(FilamentEntity parent, String childName) { + JSPromise getChildEntity(ThermionEntity parent, String childName) { return viewer .getChildEntity( parent, @@ -637,7 +637,7 @@ class FilamentViewerJSDartBridge { @JSExport() JSPromise> getChildEntityNames( - FilamentEntity entity, bool renderableOnly) => + ThermionEntity entity, bool renderableOnly) => viewer .getChildEntityNames( entity, @@ -654,23 +654,23 @@ class FilamentViewerJSDartBridge { viewer.setRecordingOutputDirectory(outputDirectory).toJS; @JSExport() - JSPromise addAnimationComponent(FilamentEntity entity) => + JSPromise addAnimationComponent(ThermionEntity entity) => viewer.addAnimationComponent(entity).toJS; @JSExport() - JSPromise removeAnimationComponent(FilamentEntity entity) => + JSPromise removeAnimationComponent(ThermionEntity entity) => viewer.removeAnimationComponent(entity).toJS; @JSExport() - JSPromise getParent(FilamentEntity entity) => + JSPromise getParent(ThermionEntity entity) => viewer.removeAnimationComponent(entity).toJS; @JSExport() - JSPromise getBone(FilamentEntity entity, int boneIndex, int skinIndex) => + JSPromise getBone(ThermionEntity entity, int boneIndex, int skinIndex) => viewer.getBone(entity, boneIndex, skinIndex: skinIndex).toJS; @JSExport() - JSPromise> getLocalTransform(FilamentEntity entity) { + JSPromise> getLocalTransform(ThermionEntity entity) { return viewer .getLocalTransform(entity) .then((t) => t.storage.map((v) => v.toJS).toList().toJS) @@ -678,7 +678,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise> getWorldTransform(FilamentEntity entity) { + JSPromise> getWorldTransform(ThermionEntity entity) { return viewer .getWorldTransform(entity) .then((t) => t.storage.map((v) => v.toJS).toList().toJS) @@ -686,7 +686,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise setTransform(FilamentEntity entity, JSArray transform) { + JSPromise setTransform(ThermionEntity entity, JSArray transform) { return viewer .setTransform( entity, @@ -696,12 +696,12 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise updateBoneMatrices(FilamentEntity entity) { + JSPromise updateBoneMatrices(ThermionEntity entity) { return viewer.updateBoneMatrices(entity).toJS; } @JSExport() - JSPromise setBoneTransform(FilamentEntity entity, int boneIndex, + JSPromise setBoneTransform(ThermionEntity entity, int boneIndex, JSArray transform, int skinIndex) { return viewer .setBoneTransform( @@ -714,7 +714,7 @@ class FilamentViewerJSDartBridge { } @JSExport() - JSPromise addCollisionComponent(FilamentEntity entity, + JSPromise addCollisionComponent(ThermionEntity entity, {JSFunction? callback, bool affectsTransform = false}) { throw UnimplementedError(); } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart index a03a9578..00183940 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart @@ -5,12 +5,12 @@ import 'dart:typed_data' as td; import 'dart:typed_data'; import 'package:web/web.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/compatibility/web/interop/shims/thermion_dart_api_js_shim.dart'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:vector_math/vector_math_64.dart'; -import 'shims/abstract_filament_viewer_js_shim.dart'; +import 'shims/thermion_viewer_js_shim.dart'; extension type _EmscriptenModule(JSObject _) implements JSObject { external JSAny? ccall(String name, String returnType, @@ -34,16 +34,16 @@ extension type _EmscriptenModule(JSObject _) implements JSObject { } /// -/// An [AbstractFilamentViewer] implementation that forwards calls to +/// An [ThermionViewer] implementation that forwards calls to /// the (Emscripten-generated) ThermionDart JS module. /// -class FilamentViewerWasm implements AbstractFilamentViewer { +class ThermionViewerFFIWasm implements ThermionViewer { late _EmscriptenModule _module; bool _initialized = false; bool _rendering = false; - FilamentViewerWasm() { + ThermionViewerFFIWasm() { _module = window.getProperty<_EmscriptenModule>("df".toJS); } @@ -132,7 +132,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future addAnimationComponent(FilamentEntity entity) async { + Future addAnimationComponent(ThermionEntity entity) async { _module.ccall( "add_animation_component", "bool", @@ -152,7 +152,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future> getRestLocalTransforms(FilamentEntity entity, + Future> getRestLocalTransforms(ThermionEntity entity, {int skinIndex = 0}) async { var boneCountJS = _module.ccall( "get_bone_count", @@ -178,7 +178,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future getBone(FilamentEntity parent, int boneIndex, + Future getBone(ThermionEntity parent, int boneIndex, {int skinIndex = 0}) async { final boneId = _module.ccall( "get_bone", @@ -192,7 +192,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { return boneId.toDartInt; } - Future> getBones(FilamentEntity entity, + Future> getBones(ThermionEntity entity, {int skinIndex = 0}) async { final boneNames = await getBoneNames(entity); final bones = await Future.wait(List.generate( @@ -201,7 +201,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation, + Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, {int skinIndex = 0, double fadeInInSecs = 0.0, double fadeOutInSecs = 0.0, @@ -289,7 +289,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future addCollisionComponent(FilamentEntity entity, + Future addCollisionComponent(ThermionEntity entity, {void Function(int entityId1, int entityId2)? callback, bool affectsTransform = false}) { // TODO: implement addCollisionComponent @@ -297,7 +297,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future addLight( + Future addLight( LightType type, double colour, double intensity, @@ -390,26 +390,26 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future createInstance(FilamentEntity entity) { + Future createInstance(ThermionEntity entity) { // TODO: implement createInstance throw UnimplementedError(); } @override Future getAnimationDuration( - FilamentEntity entity, int animationIndex) { + ThermionEntity entity, int animationIndex) { // TODO: implement getAnimationDuration throw UnimplementedError(); } @override - Future> getAnimationNames(FilamentEntity entity) { + Future> getAnimationNames(ThermionEntity entity) { // TODO: implement getAnimationNames throw UnimplementedError(); } @override - Future> getBoneNames(FilamentEntity entity, + Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}) async { var boneCountJS = _module.ccall( "get_bone_count", @@ -498,8 +498,8 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future> getChildEntities( - FilamentEntity parent, bool renderableOnly) async { + Future> getChildEntities( + ThermionEntity parent, bool renderableOnly) async { var entityCountJS = _module.ccall( "get_entity_count", "int", @@ -507,7 +507,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { [_sceneManager!, parent.toJS, renderableOnly.toJS].toJS, null) as JSNumber; var entityCount = entityCountJS.toDartInt; - var entities = []; + var entities = []; var buf = _module._malloc(entityCount * 4) as JSNumber; _module.ccall( @@ -526,8 +526,8 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future getChildEntity( - FilamentEntity parent, String childName) async { + Future getChildEntity( + ThermionEntity parent, String childName) async { final entityId = _module.ccall( "find_child_entity_by_name", "int", @@ -541,7 +541,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future> getChildEntityNames(FilamentEntity entity, + Future> getChildEntityNames(ThermionEntity entity, {bool renderableOnly = true}) async { var entityCountJS = _module.ccall( "get_entity_count", @@ -564,32 +564,32 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future getInstanceCount(FilamentEntity entity) { + Future getInstanceCount(ThermionEntity entity) { // TODO: implement getInstanceCount throw UnimplementedError(); } @override - Future> getInstances(FilamentEntity entity) { + Future> getInstances(ThermionEntity entity) { // TODO: implement getInstances throw UnimplementedError(); } @override - Future getInverseBindMatrix(FilamentEntity parent, int boneIndex, + Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, {int skinIndex = 0}) { // TODO: implement getInverseBindMatrix throw UnimplementedError(); } @override - Future getLocalTransform(FilamentEntity entity) { + Future getLocalTransform(ThermionEntity entity) { // TODO: implement getLocalTransform throw UnimplementedError(); } @override - Future getMainCamera() async { + Future getMainCamera() async { final entityId = _module.ccall( "get_main_camera", "int", ["void*".toJS].toJS, [_viewer].toJS, null) as JSNumber; @@ -601,7 +601,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity) async { + ThermionEntity entity, ThermionEntity childEntity) async { var morphTargetCountJS = _module.ccall( "get_morph_target_name_count", "int", @@ -631,7 +631,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - String? getNameForEntity(FilamentEntity entity) { + String? getNameForEntity(ThermionEntity entity) { final namePtr = _module.ccall( "get_name_for_entity", "char*", @@ -645,7 +645,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future getParent(FilamentEntity child) async { + Future getParent(ThermionEntity child) async { final parentId = _module.ccall( "get_parent", "int", @@ -659,7 +659,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future getWorldTransform(FilamentEntity entity) async { + Future getWorldTransform(ThermionEntity entity) async { final matrixPtr = _module._malloc(16 * 4) as JSNumber; _module.ccall( "get_world_transform", @@ -677,7 +677,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { AbstractGizmo? get gizmo => throw UnimplementedError(); @override - Future hide(FilamentEntity entity, String? meshName) async { + Future hide(ThermionEntity entity, String? meshName) async { if (meshName != null) { final result = _module.ccall( "hide_mesh", @@ -695,7 +695,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } } - Future loadGlbFromBuffer(Uint8List data, + Future loadGlbFromBuffer(Uint8List data, {int numInstances = 1}) async { if (numInstances != 1) { throw Exception("TODO"); @@ -718,7 +718,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future loadGlb(String path, {int numInstances = 1}) async { + Future loadGlb(String path, {int numInstances = 1}) async { final promise = _module.ccall( "load_glb", "int", @@ -733,7 +733,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future loadGltf(String path, String relativeResourcePath, + Future loadGltf(String path, String relativeResourcePath, {bool force = false}) async { final promise = _module.ccall( "load_gltf", @@ -771,7 +771,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future moveCameraToAsset(FilamentEntity entity) { + Future moveCameraToAsset(ThermionEntity entity) { // TODO: implement moveCameraToAsset throw UnimplementedError(); } @@ -800,7 +800,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future playAnimation(FilamentEntity entity, int index, + Future playAnimation(ThermionEntity entity, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -830,7 +830,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future playAnimationByName(FilamentEntity entity, String name, + Future playAnimationByName(ThermionEntity entity, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -841,7 +841,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, + ThermionEntity entity, double x, double y, double z, {bool relative = false}) { // TODO: implement queuePositionUpdate throw UnimplementedError(); @@ -849,33 +849,33 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future queueRotationUpdate( - FilamentEntity entity, double rads, double x, double y, double z, + ThermionEntity entity, double rads, double x, double y, double z, {bool relative = false}) { // TODO: implement queueRotationUpdate throw UnimplementedError(); } @override - Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat, + Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat, {bool relative = false}) { // TODO: implement queueRotationUpdateQuat throw UnimplementedError(); } @override - Future removeAnimationComponent(FilamentEntity entity) { + Future removeAnimationComponent(ThermionEntity entity) { // TODO: implement removeAnimationComponent throw UnimplementedError(); } @override - Future removeCollisionComponent(FilamentEntity entity) { + Future removeCollisionComponent(ThermionEntity entity) { // TODO: implement removeCollisionComponent throw UnimplementedError(); } @override - Future removeEntity(FilamentEntity entity) { + Future removeEntity(ThermionEntity entity) { // TODO: implement removeEntity throw UnimplementedError(); } @@ -887,7 +887,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future removeLight(FilamentEntity light) { + Future removeLight(ThermionEntity light) { // TODO: implement removeLight throw UnimplementedError(); } @@ -924,13 +924,13 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future resetBones(FilamentEntity entity) { + Future resetBones(ThermionEntity entity) { // TODO: implement resetBones throw UnimplementedError(); } @override - Future reveal(FilamentEntity entity, String? meshName) { + Future reveal(ThermionEntity entity, String? meshName) { // TODO: implement reveal throw UnimplementedError(); } @@ -965,7 +965,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future setAnimationFrame( - FilamentEntity entity, int index, int animationFrame) { + ThermionEntity entity, int index, int animationFrame) { // TODO: implement setAnimationFrame throw UnimplementedError(); } @@ -1000,14 +1000,14 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future setBoneTransform( - FilamentEntity entity, int boneIndex, Matrix4 transform, + ThermionEntity entity, int boneIndex, Matrix4 transform, {int skinIndex = 0}) { // TODO: implement setBoneTransform throw UnimplementedError(); } @override - Future setCamera(FilamentEntity entity, String? name) { + Future setCamera(ThermionEntity entity, String? name) { // TODO: implement setCamera throw UnimplementedError(); } @@ -1099,7 +1099,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future setMaterialColor(FilamentEntity entity, String meshName, + Future setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a) { // TODO: implement setMaterialColor throw UnimplementedError(); @@ -1107,7 +1107,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { // @override // Future setMorphAnimationData( - // FilamentEntity entity, MorphAnimationData animation, + // ThermionEntity entity, MorphAnimationData animation, // {List? targetMeshNames}) async { // final morphTargetNames = await getMorphTargetNames(entity, entity); @@ -1162,7 +1162,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future setMorphAnimationData( - FilamentEntity entity, MorphAnimationData animation, + ThermionEntity entity, MorphAnimationData animation, {List? targetMeshNames, bool useNextEntity = false}) async { var meshNames = await getChildEntityNames(entity, renderableOnly: false); if (targetMeshNames != null) { @@ -1272,20 +1272,20 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future setMorphTargetWeights(FilamentEntity entity, List weights) { + Future setMorphTargetWeights(ThermionEntity entity, List weights) { // TODO: implement setMorphTargetWeights throw UnimplementedError(); } @override - Future setParent(FilamentEntity child, FilamentEntity parent) { + Future setParent(ThermionEntity child, ThermionEntity parent) { // TODO: implement setParent throw UnimplementedError(); } @override Future setPosition( - FilamentEntity entity, double x, double y, double z) async { + ThermionEntity entity, double x, double y, double z) async { _module.ccall( "set_position", "void", @@ -1302,7 +1302,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future setPriority(FilamentEntity entityId, int priority) { + Future setPriority(ThermionEntity entityId, int priority) { // TODO: implement setPriority throw UnimplementedError(); } @@ -1327,7 +1327,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { @override Future setRotation( - FilamentEntity entity, double rads, double x, double y, double z) async { + ThermionEntity entity, double rads, double x, double y, double z) async { var quaternion = Quaternion.axisAngle(Vector3(x, y, z), rads); _module.ccall( "set_rotation", @@ -1353,7 +1353,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future setRotationQuat(FilamentEntity entity, Quaternion rotation) async { + Future setRotationQuat(ThermionEntity entity, Quaternion rotation) async { _module.ccall( "set_rotation", "void", @@ -1378,7 +1378,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future setScale(FilamentEntity entity, double scale) { + Future setScale(ThermionEntity entity, double scale) { // TODO: implement setScale throw UnimplementedError(); } @@ -1390,7 +1390,7 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future setTransform(FilamentEntity entity, Matrix4 transform) { + Future setTransform(ThermionEntity entity, Matrix4 transform) { // TODO: implement setTransform throw UnimplementedError(); } @@ -1402,31 +1402,31 @@ class FilamentViewerWasm implements AbstractFilamentViewer { } @override - Future stopAnimation(FilamentEntity entity, int animationIndex) { + Future stopAnimation(ThermionEntity entity, int animationIndex) { // TODO: implement stopAnimation throw UnimplementedError(); } @override - Future stopAnimationByName(FilamentEntity entity, String name) { + Future stopAnimationByName(ThermionEntity entity, String name) { // TODO: implement stopAnimationByName throw UnimplementedError(); } @override - Future testCollisions(FilamentEntity entity) { + Future testCollisions(ThermionEntity entity) { // TODO: implement testCollisions throw UnimplementedError(); } @override - Future transformToUnitCube(FilamentEntity entity) { + Future transformToUnitCube(ThermionEntity entity) { // TODO: implement transformToUnitCube throw UnimplementedError(); } @override - Future updateBoneMatrices(FilamentEntity entity) { + Future updateBoneMatrices(ThermionEntity entity) { // TODO: implement updateBoneMatrices throw UnimplementedError(); } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/abstract_filament_viewer_js_shim.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/abstract_filament_viewer_js_shim.dart index 32df6ca0..81e1264e 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/abstract_filament_viewer_js_shim.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/abstract_filament_viewer_js_shim.dart @@ -3,13 +3,13 @@ library thermion_flutter_js; import 'dart:js_interop'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; /// /// An extension type on [JSObject] that represents a -/// Javascript shim implementation of the [AbstractFilamentViewer] interface. +/// Javascript shim implementation of the [ThermionViewer] interface. /// -extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { +extension type ThermionViewerJSShim(JSObject _) implements JSObject { @JS('initialized') external JSPromise get initialized; @@ -77,7 +77,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { bool castShadows); @JS('removeLight') - external JSPromise removeLight(FilamentEntity light); + external JSPromise removeLight(ThermionEntity light); @JS('clearLights') external JSPromise clearLights(); @@ -86,13 +86,13 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { external JSPromise loadGlb(String path, int numInstances); @JS('createInstance') - external JSPromise createInstance(FilamentEntity entity); + external JSPromise createInstance(ThermionEntity entity); @JS('getInstanceCount') - external JSPromise getInstanceCount(FilamentEntity entity); + external JSPromise getInstanceCount(ThermionEntity entity); @JS('getInstances') - external JSPromise> getInstances(FilamentEntity entity); + external JSPromise> getInstances(ThermionEntity entity); @JS('loadGltf') external JSPromise loadGltf( @@ -118,38 +118,38 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { @JS('setMorphTargetWeights') external JSPromise setMorphTargetWeights( - FilamentEntity entity, JSArray weights); + ThermionEntity entity, JSArray weights); @JS('getMorphTargetNames') external JSPromise> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity); + ThermionEntity entity, ThermionEntity childEntity); @JS('getBoneNames') external JSPromise> getBoneNames( - FilamentEntity entity, int skinIndex); + ThermionEntity entity, int skinIndex); @JS('getAnimationNames') external JSPromise> getAnimationNames( - FilamentEntity entity); + ThermionEntity entity); @JS('getAnimationDuration') external JSPromise getAnimationDuration( - FilamentEntity entity, int animationIndex); + ThermionEntity entity, int animationIndex); @JS('setMorphAnimationData') external JSPromise setMorphAnimationData( - FilamentEntity entity, + ThermionEntity entity, JSArray> animation, JSArray morphTargets, JSArray? targetMeshNames, double frameLengthInMs); @JS('resetBones') - external JSPromise resetBones(FilamentEntity entity); + external JSPromise resetBones(ThermionEntity entity); @JS('addBoneAnimation') external JSPromise addBoneAnimation( - FilamentEntity entity, + ThermionEntity entity, JSArray bones, JSArray>> frameData, JSNumber frameLengthInMs, @@ -160,7 +160,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { JSNumber maxDelta); @JS('removeEntity') - external JSPromise removeEntity(FilamentEntity entity); + external JSPromise removeEntity(ThermionEntity entity); @JS('clearEntities') external JSPromise clearEntities(); @@ -176,7 +176,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { @JS('playAnimation') external JSPromise playAnimation( - FilamentEntity entity, + ThermionEntity entity, int index, bool loop, bool reverse, @@ -186,7 +186,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { @JS('playAnimationByName') external JSPromise playAnimationByName( - FilamentEntity entity, + ThermionEntity entity, String name, bool loop, bool reverse, @@ -196,16 +196,16 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { @JS('setAnimationFrame') external JSPromise setAnimationFrame( - FilamentEntity entity, int index, int animationFrame); + ThermionEntity entity, int index, int animationFrame); @JS('stopAnimation') - external JSPromise stopAnimation(FilamentEntity entity, int animationIndex); + external JSPromise stopAnimation(ThermionEntity entity, int animationIndex); @JS('stopAnimationByName') - external JSPromise stopAnimationByName(FilamentEntity entity, String name); + external JSPromise stopAnimationByName(ThermionEntity entity, String name); @JS('setCamera') - external JSPromise setCamera(FilamentEntity entity, String? name); + external JSPromise setCamera(ThermionEntity entity, String? name); @JS('setMainCamera') external JSPromise setMainCamera(); @@ -262,7 +262,7 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { external JSPromise> getCameraRotation(); @JS('moveCameraToAsset') - external JSPromise moveCameraToAsset(FilamentEntity entity); + external JSPromise moveCameraToAsset(ThermionEntity entity); @JS('setViewFrustumCulling') external JSPromise setViewFrustumCulling(JSBoolean enabled); @@ -278,34 +278,34 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { external JSPromise setCameraModelMatrix(JSArray matrix); @JS('setMaterialColor') - external JSPromise setMaterialColor(FilamentEntity entity, String meshName, + external JSPromise setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a); @JS('transformToUnitCube') - external JSPromise transformToUnitCube(FilamentEntity entity); + external JSPromise transformToUnitCube(ThermionEntity entity); @JS('setPosition') external JSPromise setPosition( - FilamentEntity entity, double x, double y, double z); + ThermionEntity entity, double x, double y, double z); @JS('setScale') - external JSPromise setScale(FilamentEntity entity, double scale); + external JSPromise setScale(ThermionEntity entity, double scale); @JS('setRotation') external JSPromise setRotation( - FilamentEntity entity, double rads, double x, double y, double z); + ThermionEntity entity, double rads, double x, double y, double z); @JS('queuePositionUpdate') external JSPromise queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, bool relative); + ThermionEntity entity, double x, double y, double z, bool relative); @JS('queueRotationUpdate') - external JSPromise queueRotationUpdate(FilamentEntity entity, double rads, + external JSPromise queueRotationUpdate(ThermionEntity entity, double rads, double x, double y, double z, bool relative); @JS('queueRotationUpdateQuat') external JSPromise queueRotationUpdateQuat( - FilamentEntity entity, JSArray quat, bool relative); + ThermionEntity entity, JSArray quat, bool relative); @JS('setPostProcessing') external JSPromise setPostProcessing(bool enabled); @@ -315,19 +315,19 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { @JS('setRotationQuat') external JSPromise setRotationQuat( - FilamentEntity entity, JSArray rotation); + ThermionEntity entity, JSArray rotation); @JS('reveal') - external JSPromise reveal(FilamentEntity entity, String? meshName); + external JSPromise reveal(ThermionEntity entity, String? meshName); @JS('hide') - external JSPromise hide(FilamentEntity entity, String? meshName); + external JSPromise hide(ThermionEntity entity, String? meshName); @JS('pick') external void pick(int x, int y); @JS('getNameForEntity') - external String? getNameForEntity(FilamentEntity entity); + external String? getNameForEntity(ThermionEntity entity); @JS('setCameraManipulatorOptions') external JSPromise setCameraManipulatorOptions( @@ -339,15 +339,15 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { @JS('getChildEntities') external JSPromise> getChildEntities( - FilamentEntity parent, bool renderableOnly); + ThermionEntity parent, bool renderableOnly); @JS('getChildEntity') external JSPromise getChildEntity( - FilamentEntity parent, String childName); + ThermionEntity parent, String childName); @JS('getChildEntityNames') external JSPromise> getChildEntityNames( - FilamentEntity entity, bool renderableOnly); + ThermionEntity entity, bool renderableOnly); @JS('setRecording') external JSPromise setRecording(JSBoolean recording); @@ -356,54 +356,54 @@ extension type AbstractFilamentViewerJSShim(JSObject _) implements JSObject { external JSPromise setRecordingOutputDirectory(String outputDirectory); @JS('addAnimationComponent') - external JSPromise addAnimationComponent(FilamentEntity entity); + external JSPromise addAnimationComponent(ThermionEntity entity); @JS('removeAnimationComponent') - external JSPromise removeAnimationComponent(FilamentEntity entity); + external JSPromise removeAnimationComponent(ThermionEntity entity); @JS('addCollisionComponent') - external JSPromise addCollisionComponent(FilamentEntity entity); + external JSPromise addCollisionComponent(ThermionEntity entity); @JS('removeCollisionComponent') - external JSPromise removeCollisionComponent(FilamentEntity entity); + external JSPromise removeCollisionComponent(ThermionEntity entity); @JS('createGeometry') external JSPromise createGeometry(JSArray vertices, JSArray indices, String? materialPath, int primitiveType); @JS('setParent') - external JSPromise setParent(FilamentEntity child, FilamentEntity parent); + external JSPromise setParent(ThermionEntity child, ThermionEntity parent); @JS('getParent') - external JSPromise getParent(FilamentEntity child); + external JSPromise getParent(ThermionEntity child); @JS('getParent') external JSPromise getBone( - FilamentEntity child, int boneIndex, int skinIndex); + ThermionEntity child, int boneIndex, int skinIndex); @JS('testCollisions') - external JSPromise testCollisions(FilamentEntity entity); + external JSPromise testCollisions(ThermionEntity entity); @JS('setPriority') - external JSPromise setPriority(FilamentEntity entityId, int priority); + external JSPromise setPriority(ThermionEntity entityId, int priority); @JS('getLocalTransform') external JSPromise> getLocalTransform( - FilamentEntity entity); + ThermionEntity entity); @JS('getWorldTransform') external JSPromise> getWorldTransform( - FilamentEntity entity); + ThermionEntity entity); @JS('updateBoneMatrices') - external JSPromise updateBoneMatrices(FilamentEntity entity); + external JSPromise updateBoneMatrices(ThermionEntity entity); @JS('setTransform') external JSPromise setTransform( - FilamentEntity entity, JSArray transform); + ThermionEntity entity, JSArray transform); @JS('setBoneTransform') external JSPromise setBoneTransform( - FilamentEntity entity, int boneIndex, JSArray transform, int skinIndex); + ThermionEntity entity, int boneIndex, JSArray transform, int skinIndex); } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/thermion_dart_api_js_shim.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/thermion_dart_api_js_shim.dart index 102a6068..7ebfb934 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/thermion_dart_api_js_shim.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/shims/thermion_dart_api_js_shim.dart @@ -3,11 +3,11 @@ library thermion_flutter_js; import 'dart:js_interop'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; /// /// An extension type on [JSObject] that represents a -/// Javascript shim implementation for the [AbstractFilamentViewer] interface. +/// Javascript shim implementation for the [ThermionViewer] interface. /// extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @@ -71,7 +71,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { bool castShadows); @JS('removeLight') - external JSPromise removeLight(FilamentEntity light); + external JSPromise removeLight(ThermionEntity light); @JS('clearLights') external JSPromise clearLights(); @@ -80,13 +80,13 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { external JSPromise loadGlb(String path, int numInstances); @JS('createInstance') - external JSPromise createInstance(FilamentEntity entity); + external JSPromise createInstance(ThermionEntity entity); @JS('getInstanceCount') - external JSPromise getInstanceCount(FilamentEntity entity); + external JSPromise getInstanceCount(ThermionEntity entity); @JS('getInstances') - external JSPromise> getInstances(FilamentEntity entity); + external JSPromise> getInstances(ThermionEntity entity); @JS('loadGltf') external JSPromise loadGltf( @@ -112,38 +112,38 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @JS('setMorphTargetWeights') external JSPromise setMorphTargetWeights( - FilamentEntity entity, JSArray weights); + ThermionEntity entity, JSArray weights); @JS('getMorphTargetNames') external JSPromise> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity); + ThermionEntity entity, ThermionEntity childEntity); @JS('getBoneNames') external JSPromise> getBoneNames( - FilamentEntity entity, int skinIndex); + ThermionEntity entity, int skinIndex); @JS('getAnimationNames') external JSPromise> getAnimationNames( - FilamentEntity entity); + ThermionEntity entity); @JS('getAnimationDuration') external JSPromise getAnimationDuration( - FilamentEntity entity, int animationIndex); + ThermionEntity entity, int animationIndex); @JS('setMorphAnimationData') external JSPromise setMorphAnimationData( - FilamentEntity entity, + ThermionEntity entity, JSArray> animation, JSArray morphTargets, JSArray? targetMeshNames, double frameLengthInMs); @JS('resetBones') - external JSPromise resetBones(FilamentEntity entity); + external JSPromise resetBones(ThermionEntity entity); @JS('addBoneAnimation') external JSPromise addBoneAnimation( - FilamentEntity entity, + ThermionEntity entity, JSArray bones, JSArray>> frameData, JSNumber frameLengthInMs, @@ -154,7 +154,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { JSNumber maxDelta); @JS('removeEntity') - external JSPromise removeEntity(FilamentEntity entity); + external JSPromise removeEntity(ThermionEntity entity); @JS('clearEntities') external JSPromise clearEntities(); @@ -170,7 +170,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @JS('playAnimation') external JSPromise playAnimation( - FilamentEntity entity, + ThermionEntity entity, int index, bool loop, bool reverse, @@ -180,7 +180,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @JS('playAnimationByName') external JSPromise playAnimationByName( - FilamentEntity entity, + ThermionEntity entity, String name, bool loop, bool reverse, @@ -190,16 +190,16 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @JS('setAnimationFrame') external JSPromise setAnimationFrame( - FilamentEntity entity, int index, int animationFrame); + ThermionEntity entity, int index, int animationFrame); @JS('stopAnimation') - external JSPromise stopAnimation(FilamentEntity entity, int animationIndex); + external JSPromise stopAnimation(ThermionEntity entity, int animationIndex); @JS('stopAnimationByName') - external JSPromise stopAnimationByName(FilamentEntity entity, String name); + external JSPromise stopAnimationByName(ThermionEntity entity, String name); @JS('setCamera') - external JSPromise setCamera(FilamentEntity entity, String? name); + external JSPromise setCamera(ThermionEntity entity, String? name); @JS('setMainCamera') external JSPromise setMainCamera(); @@ -256,7 +256,7 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { external JSPromise> getCameraRotation(); @JS('moveCameraToAsset') - external JSPromise moveCameraToAsset(FilamentEntity entity); + external JSPromise moveCameraToAsset(ThermionEntity entity); @JS('setViewFrustumCulling') external JSPromise setViewFrustumCulling(JSBoolean enabled); @@ -272,34 +272,34 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { external JSPromise setCameraModelMatrix(JSArray matrix); @JS('setMaterialColor') - external JSPromise setMaterialColor(FilamentEntity entity, String meshName, + external JSPromise setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a); @JS('transformToUnitCube') - external JSPromise transformToUnitCube(FilamentEntity entity); + external JSPromise transformToUnitCube(ThermionEntity entity); @JS('setPosition') external JSPromise setPosition( - FilamentEntity entity, double x, double y, double z); + ThermionEntity entity, double x, double y, double z); @JS('setScale') - external JSPromise setScale(FilamentEntity entity, double scale); + external JSPromise setScale(ThermionEntity entity, double scale); @JS('setRotation') external JSPromise setRotation( - FilamentEntity entity, double rads, double x, double y, double z); + ThermionEntity entity, double rads, double x, double y, double z); @JS('queuePositionUpdate') external JSPromise queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, bool relative); + ThermionEntity entity, double x, double y, double z, bool relative); @JS('queueRotationUpdate') - external JSPromise queueRotationUpdate(FilamentEntity entity, double rads, + external JSPromise queueRotationUpdate(ThermionEntity entity, double rads, double x, double y, double z, bool relative); @JS('queueRotationUpdateQuat') external JSPromise queueRotationUpdateQuat( - FilamentEntity entity, JSArray quat, bool relative); + ThermionEntity entity, JSArray quat, bool relative); @JS('setPostProcessing') external JSPromise setPostProcessing(bool enabled); @@ -309,19 +309,19 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @JS('setRotationQuat') external JSPromise setRotationQuat( - FilamentEntity entity, JSArray rotation); + ThermionEntity entity, JSArray rotation); @JS('reveal') - external JSPromise reveal(FilamentEntity entity, String? meshName); + external JSPromise reveal(ThermionEntity entity, String? meshName); @JS('hide') - external JSPromise hide(FilamentEntity entity, String? meshName); + external JSPromise hide(ThermionEntity entity, String? meshName); @JS('pick') external void pick(int x, int y); @JS('getNameForEntity') - external String? getNameForEntity(FilamentEntity entity); + external String? getNameForEntity(ThermionEntity entity); @JS('setCameraManipulatorOptions') external JSPromise setCameraManipulatorOptions( @@ -333,15 +333,15 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { @JS('getChildEntities') external JSPromise> getChildEntities( - FilamentEntity parent, bool renderableOnly); + ThermionEntity parent, bool renderableOnly); @JS('getChildEntity') external JSPromise getChildEntity( - FilamentEntity parent, String childName); + ThermionEntity parent, String childName); @JS('getChildEntityNames') external JSPromise> getChildEntityNames( - FilamentEntity entity, bool renderableOnly); + ThermionEntity entity, bool renderableOnly); @JS('setRecording') external JSPromise setRecording(JSBoolean recording); @@ -350,54 +350,54 @@ extension type ThermionDartAPIJSShim(JSObject _) implements JSObject { external JSPromise setRecordingOutputDirectory(String outputDirectory); @JS('addAnimationComponent') - external JSPromise addAnimationComponent(FilamentEntity entity); + external JSPromise addAnimationComponent(ThermionEntity entity); @JS('removeAnimationComponent') - external JSPromise removeAnimationComponent(FilamentEntity entity); + external JSPromise removeAnimationComponent(ThermionEntity entity); @JS('addCollisionComponent') - external JSPromise addCollisionComponent(FilamentEntity entity); + external JSPromise addCollisionComponent(ThermionEntity entity); @JS('removeCollisionComponent') - external JSPromise removeCollisionComponent(FilamentEntity entity); + external JSPromise removeCollisionComponent(ThermionEntity entity); @JS('createGeometry') external JSPromise createGeometry(JSArray vertices, JSArray indices, String? materialPath, int primitiveType); @JS('setParent') - external JSPromise setParent(FilamentEntity child, FilamentEntity parent); + external JSPromise setParent(ThermionEntity child, ThermionEntity parent); @JS('getParent') - external JSPromise getParent(FilamentEntity child); + external JSPromise getParent(ThermionEntity child); @JS('getParent') external JSPromise getBone( - FilamentEntity child, int boneIndex, int skinIndex); + ThermionEntity child, int boneIndex, int skinIndex); @JS('testCollisions') - external JSPromise testCollisions(FilamentEntity entity); + external JSPromise testCollisions(ThermionEntity entity); @JS('setPriority') - external JSPromise setPriority(FilamentEntity entityId, int priority); + external JSPromise setPriority(ThermionEntity entityId, int priority); @JS('getLocalTransform') external JSPromise> getLocalTransform( - FilamentEntity entity); + ThermionEntity entity); @JS('getWorldTransform') external JSPromise> getWorldTransform( - FilamentEntity entity); + ThermionEntity entity); @JS('updateBoneMatrices') - external JSPromise updateBoneMatrices(FilamentEntity entity); + external JSPromise updateBoneMatrices(ThermionEntity entity); @JS('setTransform') external JSPromise setTransform( - FilamentEntity entity, JSArray transform); + ThermionEntity entity, JSArray transform); @JS('setBoneTransform') external JSPromise setBoneTransform( - FilamentEntity entity, int boneIndex, JSArray transform, int skinIndex); + ThermionEntity entity, int boneIndex, JSArray transform, int skinIndex); } diff --git a/thermion_dart/lib/thermion_dart/entities/entity_transform_controller.dart b/thermion_dart/lib/thermion_dart/entities/entity_transform_controller.dart index d7000a5a..90471a8e 100644 --- a/thermion_dart/lib/thermion_dart/entities/entity_transform_controller.dart +++ b/thermion_dart/lib/thermion_dart/entities/entity_transform_controller.dart @@ -2,12 +2,12 @@ import 'dart:async'; import 'dart:math'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:vector_math/vector_math_64.dart' as v; class EntityTransformController { - final AbstractFilamentViewer controller; - final FilamentEntity _entity; + final ThermionViewer controller; + final ThermionEntity _entity; late Timer _ticker; diff --git a/thermion_dart/lib/thermion_dart/entities/filament_entity.dart b/thermion_dart/lib/thermion_dart/entities/filament_entity.dart index ad0f16c5..014461c8 100644 --- a/thermion_dart/lib/thermion_dart/entities/filament_entity.dart +++ b/thermion_dart/lib/thermion_dart/entities/filament_entity.dart @@ -1,2 +1,2 @@ // a handle that can be safely passed back to the rendering layer to manipulate an Entity -typedef FilamentEntity = int; +typedef ThermionEntity = int; diff --git a/thermion_dart/lib/thermion_dart/entities/gizmo.dart b/thermion_dart/lib/thermion_dart/entities/gizmo.dart index a8c81056..da32721d 100644 --- a/thermion_dart/lib/thermion_dart/entities/gizmo.dart +++ b/thermion_dart/lib/thermion_dart/entities/gizmo.dart @@ -1,25 +1,25 @@ import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:vector_math/vector_math_64.dart'; -import '../abstract_filament_viewer.dart'; +import '../thermion_viewer.dart'; class Gizmo extends AbstractGizmo { - final FilamentEntity x; + final ThermionEntity x; Vector3 _x = Vector3(0.1, 0, 0); - final FilamentEntity y; + final ThermionEntity y; Vector3 _y = Vector3(0.0, 0.1, 0); - final FilamentEntity z; + final ThermionEntity z; Vector3 _z = Vector3(0.0, 0.0, 0.1); - final AbstractFilamentViewer controller; + final ThermionViewer controller; - FilamentEntity? _activeAxis; - FilamentEntity? _activeEntity; + ThermionEntity? _activeAxis; + ThermionEntity? _activeEntity; bool get isActive => _activeAxis != null; - final Set ignore; + final Set ignore; Gizmo(this.x, this.y, this.z, this.controller, - {this.ignore = const {}}) { + {this.ignore = const {}}) { controller.pickResult.listen(_onPickResult); } @@ -59,7 +59,7 @@ class Gizmo extends AbstractGizmo { } } - void attach(FilamentEntity entity) async { + void attach(ThermionEntity entity) async { _activeAxis = null; _activeEntity = entity; await _reveal(); diff --git a/thermion_dart/lib/thermion_dart/scene.dart b/thermion_dart/lib/thermion_dart/scene.dart index 58013a56..fe5750d1 100644 --- a/thermion_dart/lib/thermion_dart/scene.dart +++ b/thermion_dart/lib/thermion_dart/scene.dart @@ -1,41 +1,41 @@ import 'dart:async'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; -import 'abstract_filament_viewer.dart'; +import 'thermion_viewer.dart'; /// /// For now, this class just holds the entities that have been loaded (though not necessarily visible in the Filament Scene). /// class SceneImpl extends Scene { - AbstractFilamentViewer controller; + ThermionViewer controller; SceneImpl(this.controller); @override - FilamentEntity? selected; + ThermionEntity? selected; final _onUpdatedController = StreamController.broadcast(); @override Stream get onUpdated => _onUpdatedController.stream; - final _onLoadController = StreamController.broadcast(); + final _onLoadController = StreamController.broadcast(); @override - Stream get onLoad => _onLoadController.stream; + Stream get onLoad => _onLoadController.stream; - final _onUnloadController = StreamController.broadcast(); + final _onUnloadController = StreamController.broadcast(); @override - Stream get onUnload => _onUnloadController.stream; + Stream get onUnload => _onUnloadController.stream; - final _lights = {}; - final _entities = {}; + final _lights = {}; + final _entities = {}; - void registerLight(FilamentEntity entity) { + void registerLight(ThermionEntity entity) { _lights.add(entity); _onLoadController.sink.add(entity); _onUpdatedController.add(true); } - void unregisterLight(FilamentEntity entity) async { + void unregisterLight(ThermionEntity entity) async { var children = await controller.getChildEntities(entity, true); if (selected == entity || children.contains(selected)) { selected = null; @@ -46,7 +46,7 @@ class SceneImpl extends Scene { _onUpdatedController.add(true); } - void unregisterEntity(FilamentEntity entity) async { + void unregisterEntity(ThermionEntity entity) async { var children = await controller.getChildEntities(entity, true); if (selected == entity || children.contains(selected)) { selected = null; @@ -58,7 +58,7 @@ class SceneImpl extends Scene { _onUpdatedController.add(true); } - void registerEntity(FilamentEntity entity) { + void registerEntity(ThermionEntity entity) { _entities.add(entity); _onLoadController.sink.add(entity); _onUpdatedController.add(true); @@ -92,16 +92,16 @@ class SceneImpl extends Scene { /// /// Lists all entities currently loaded (not necessarily active in the scene). /// - Iterable listLights() { + Iterable listLights() { return _lights; } @override - Iterable listEntities() { + Iterable listEntities() { return _entities; } - void registerSelected(FilamentEntity entity) { + void registerSelected(ThermionEntity entity) { selected = entity; _onUpdatedController.add(true); } @@ -112,7 +112,7 @@ class SceneImpl extends Scene { } @override - void select(FilamentEntity entity) { + void select(ThermionEntity entity) { selected = entity; controller.gizmo?.attach(entity); _onUpdatedController.add(true); diff --git a/thermion_dart/lib/thermion_dart/abstract_filament_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart similarity index 84% rename from thermion_dart/lib/thermion_dart/abstract_filament_viewer.dart rename to thermion_dart/lib/thermion_dart/thermion_viewer.dart index fc433c1b..d491edab 100644 --- a/thermion_dart/lib/thermion_dart/abstract_filament_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -6,7 +6,7 @@ import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; // "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates. -typedef FilamentPickResult = ({FilamentEntity entity, double x, double y}); +typedef FilamentPickResult = ({ThermionEntity entity, double x, double y}); enum LightType { SUN, //!< Directional light that also draws a sun's disk in the sky. @@ -43,7 +43,7 @@ class TextureDetails { {required this.textureId, required this.width, required this.height}); } -abstract class AbstractFilamentViewer { +abstract class ThermionViewer { Future get initialized; @@ -135,7 +135,7 @@ abstract class AbstractFilamentViewer { /// Note that [sunAngularRadius] is in degrees, /// whereas [spotLightConeInner] and [spotLightConeOuter] are in radians /// - Future addLight( + Future addLight( LightType type, double colour, double intensity, @@ -153,7 +153,7 @@ abstract class AbstractFilamentViewer { double sunHaloFallof = 80.0, bool castShadows = true}); - Future removeLight(FilamentEntity light); + Future removeLight(ThermionEntity light); /// /// Remove all lights (excluding IBL) from the scene. @@ -163,29 +163,29 @@ abstract class AbstractFilamentViewer { /// /// Load the .glb asset at the given path and insert into the scene. /// - Future loadGlb(String path, {int numInstances = 1}); + Future loadGlb(String path, {int numInstances = 1}); /// /// Create a new instance of [entity]. /// - Future createInstance(FilamentEntity entity); + Future createInstance(ThermionEntity entity); /// /// Returns the number of instances of the asset associated with [entity]. /// - Future getInstanceCount(FilamentEntity entity); + Future getInstanceCount(ThermionEntity entity); /// /// Returns all instances of [entity]. /// - Future> getInstances(FilamentEntity entity); + Future> getInstances(ThermionEntity entity); /// /// Load the .gltf asset at the given path and insert into the scene. /// [relativeResourcePath] is the folder path where the glTF resources are stored; /// this is usually the parent directory of the .gltf file itself. /// - Future loadGltf(String path, String relativeResourcePath, + Future loadGltf(String path, String relativeResourcePath, {bool force = false}); /// @@ -222,32 +222,32 @@ abstract class AbstractFilamentViewer { /// Set the weights for all morph targets in [entity] to [weights]. /// Note that [weights] must contain values for ALL morph targets, but no exception will be thrown if you don't do so (you'll just get incorrect results). /// If you only want to set one value, set all others to zero (check [getMorphTargetNames] if you need the get a list of all morph targets). - /// IMPORTANT - this accepts the actual FilamentEntity with the relevant morph targets (unlike [getMorphTargetNames], which uses the parent entity and the child mesh name). + /// IMPORTANT - this accepts the actual ThermionEntity with the relevant morph targets (unlike [getMorphTargetNames], which uses the parent entity and the child mesh name). /// Use [getChildEntityByName] if you are setting the weights for a child mesh. /// - Future setMorphTargetWeights(FilamentEntity entity, List weights); + Future setMorphTargetWeights(ThermionEntity entity, List weights); /// /// Gets the names of all morph targets for the child renderable [childEntity] under [entity]. /// Future> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity); + ThermionEntity entity, ThermionEntity childEntity); /// /// Gets the names of all bones for the armature at [skinIndex] under the specified [entity]. /// - Future> getBoneNames(FilamentEntity entity, {int skinIndex = 0}); + Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}); /// /// Gets the names of all glTF animations embedded in the specified entity. /// - Future> getAnimationNames(FilamentEntity entity); + Future> getAnimationNames(ThermionEntity entity); /// /// Returns the length (in seconds) of the animation at the given index. /// Future getAnimationDuration( - FilamentEntity entity, int animationIndex); + ThermionEntity entity, int animationIndex); /// /// Animate the morph targets in [entity]. See [MorphTargetAnimation] for an explanation as to how to construct the animation frame data. @@ -256,14 +256,14 @@ abstract class AbstractFilamentViewer { /// It is permissible for [animation] to omit any targets that do exist under [meshName]; these simply won't be animated. /// Future setMorphAnimationData( - FilamentEntity entity, MorphAnimationData animation, + ThermionEntity entity, MorphAnimationData animation, {List? targetMeshNames}); /// /// Resets all bones in the given entity to their rest pose. /// This should be done before every call to addBoneAnimation. /// - Future resetBones(FilamentEntity entity); + Future resetBones(ThermionEntity entity); /// /// Enqueues and plays the [animation] for the specified bone(s). @@ -283,7 +283,7 @@ abstract class AbstractFilamentViewer { /// This will be applied in reverse after [fadeOutInSecs]. /// /// - Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation, + Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, {int skinIndex = 0, double fadeInInSecs = 0.0, double fadeOutInSecs = 0.0, @@ -293,58 +293,58 @@ abstract class AbstractFilamentViewer { /// Gets the entity representing the bone at [boneIndex]/[skinIndex]. /// The returned entity is only intended for use with [getWorldTransform]. /// - Future getBone(FilamentEntity parent, int boneIndex, + Future getBone(ThermionEntity parent, int boneIndex, {int skinIndex = 0}); /// /// Gets the local (relative to parent) transform for [entity]. /// - Future getLocalTransform(FilamentEntity entity); + Future getLocalTransform(ThermionEntity entity); /// /// Gets the world transform for [entity]. /// - Future getWorldTransform(FilamentEntity entity); + Future getWorldTransform(ThermionEntity entity); /// /// Gets the inverse bind (pose) matrix for the bone. - /// Note that [parent] must be the FilamentEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc). + /// Note that [parent] must be the ThermionEntity returned by [loadGlb/loadGltf], not any other method ([getChildEntity] etc). /// This is because all joint information is internally stored with the parent entity. /// - Future getInverseBindMatrix(FilamentEntity parent, int boneIndex, + Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, {int skinIndex = 0}); /// /// Sets the transform (relative to its parent) for [entity]. /// - Future setTransform(FilamentEntity entity, Matrix4 transform); + Future setTransform(ThermionEntity entity, Matrix4 transform); /// - /// Updates the bone matrices for [entity] (which must be the FilamentEntity + /// Updates the bone matrices for [entity] (which must be the ThermionEntity /// returned by [loadGlb/loadGltf]). /// Under the hood, this just calls [updateBoneMatrices] on the Animator /// instance of the relevant FilamentInstance (which uses the local /// bone transform and the inverse bind matrix to set the bone matrix). /// - Future updateBoneMatrices(FilamentEntity entity); + Future updateBoneMatrices(ThermionEntity entity); /// /// Directly set the bone matrix for the bone at the given index. /// Don't call this manually unless you know what you're doing. /// Future setBoneTransform( - FilamentEntity entity, int boneIndex, Matrix4 transform, + ThermionEntity entity, int boneIndex, Matrix4 transform, {int skinIndex = 0}); /// /// Removes/destroys the specified entity from the scene. /// [entity] will no longer be a valid handle after this method is called; ensure you immediately discard all references once this method is complete. /// - Future removeEntity(FilamentEntity entity); + Future removeEntity(ThermionEntity entity); /// /// Removes/destroys all renderable entities from the scene (including cameras). - /// All [FilamentEntity] handles will no longer be valid after this method is called; ensure you immediately discard all references to all entities once this method is complete. + /// All [ThermionEntity] handles will no longer be valid after this method is called; ensure you immediately discard all references to all entities once this method is complete. /// Future clearEntities(); @@ -366,7 +366,7 @@ abstract class AbstractFilamentViewer { /// /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. /// - Future playAnimation(FilamentEntity entity, int index, + Future playAnimation(ThermionEntity entity, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -375,22 +375,22 @@ abstract class AbstractFilamentViewer { /// /// Schedules the glTF animation at [index] in [entity] to start playing on the next frame. /// - Future playAnimationByName(FilamentEntity entity, String name, + Future playAnimationByName(ThermionEntity entity, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, double crossfade = 0.0}); Future setAnimationFrame( - FilamentEntity entity, int index, int animationFrame); + ThermionEntity entity, int index, int animationFrame); - Future stopAnimation(FilamentEntity entity, int animationIndex); - Future stopAnimationByName(FilamentEntity entity, String name); + Future stopAnimation(ThermionEntity entity, int animationIndex); + Future stopAnimationByName(ThermionEntity entity, String name); /// /// Sets the current scene camera to the glTF camera under [name] in [entity]. /// - Future setCamera(FilamentEntity entity, String? name); + Future setCamera(ThermionEntity entity, String? name); /// /// Sets the current scene camera to the main camera (which is always available and added to every scene by default). @@ -400,7 +400,7 @@ abstract class AbstractFilamentViewer { /// /// Returns the entity associated with the main camera. /// - Future getMainCamera(); + Future getMainCamera(); /// /// Sets the current scene camera to the glTF camera under [name] in [entity]. @@ -486,7 +486,7 @@ abstract class AbstractFilamentViewer { /// /// Repositions the camera to the last vertex of the bounding box of [entity], looking at the penultimate vertex. /// - Future moveCameraToAsset(FilamentEntity entity); + Future moveCameraToAsset(ThermionEntity entity); /// /// Enables/disables frustum culling. Currently we don't expose a method for manipulating the camera projection/culling matrices so this is your only option to deal with unwanted near/far clipping. @@ -512,36 +512,36 @@ abstract class AbstractFilamentViewer { /// /// Sets the `baseColorFactor` property for the material at index [materialIndex] in [entity] under node [meshName] to [color]. /// - Future setMaterialColor(FilamentEntity entity, String meshName, + Future setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a); /// /// Scale [entity] to fit within the unit cube. /// - Future transformToUnitCube(FilamentEntity entity); + Future transformToUnitCube(ThermionEntity entity); /// /// Directly sets the world space position for [entity] to the given coordinates, skipping all collision detection. /// - Future setPosition(FilamentEntity entity, double x, double y, double z); + Future setPosition(ThermionEntity entity, double x, double y, double z); /// /// Directly sets the scale for [entity], skipping all collision detection. /// - Future setScale(FilamentEntity entity, double scale); + Future setScale(ThermionEntity entity, double scale); /// /// Directly sets the rotation for [entity] to [rads] around the axis {x,y,z}, skipping all collision detection. /// Future setRotation( - FilamentEntity entity, double rads, double x, double y, double z); + ThermionEntity entity, double rads, double x, double y, double z); /// /// Queues an update to the worldspace position for [entity] to {x,y,z}. /// The actual update will occur on the next frame, and will be subject to collision detection. /// Future queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, + ThermionEntity entity, double x, double y, double z, {bool relative = false}); /// @@ -549,13 +549,13 @@ abstract class AbstractFilamentViewer { /// The actual update will occur on the next frame, and will be subject to collision detection. /// Future queueRotationUpdate( - FilamentEntity entity, double rads, double x, double y, double z, + ThermionEntity entity, double rads, double x, double y, double z, {bool relative = false}); /// /// Same as [queueRotationUpdate]. /// - Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat, + Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion quat, {bool relative = false}); /// @@ -571,31 +571,31 @@ abstract class AbstractFilamentViewer { /// /// Sets the rotation for [entity] to the specified quaternion. /// - Future setRotationQuat(FilamentEntity entity, Quaternion rotation); + Future setRotationQuat(ThermionEntity entity, Quaternion rotation); /// /// Reveal the node [meshName] under [entity]. Only applicable if [hide] had previously been called; this is a no-op otherwise. /// - Future reveal(FilamentEntity entity, String? meshName); + Future reveal(ThermionEntity entity, String? meshName); /// /// If [meshName] is provided, hide the node [meshName] under [entity], otherwise hide the root node for [entity]. /// The entity still exists in memory, but is no longer being rendered into the scene. Call [reveal] to re-commence rendering. /// - Future hide(FilamentEntity entity, String? meshName); + Future hide(ThermionEntity entity, String? meshName); /// /// Used to select the entity in the scene at the given viewport coordinates. /// Called by `FilamentGestureDetector` on a mouse/finger down event. You probably don't want to call this yourself. /// This is asynchronous and will require 2-3 frames to complete - subscribe to the [pickResult] stream to receive the results of this method. - /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the FilamentWidget). + /// [x] and [y] must be in local logical coordinates (i.e. where 0,0 is at top-left of the ThermionWidget). /// void pick(int x, int y); /// - /// Retrieves the name assigned to the given FilamentEntity (usually corresponds to the glTF mesh name). + /// Retrieves the name assigned to the given ThermionEntity (usually corresponds to the glTF mesh name). /// - String? getNameForEntity(FilamentEntity entity); + String? getNameForEntity(ThermionEntity entity); /// /// Sets the options for manipulating the camera via the viewport. @@ -610,20 +610,20 @@ abstract class AbstractFilamentViewer { /// /// Returns all child entities under [parent]. /// - Future> getChildEntities( - FilamentEntity parent, bool renderableOnly); + Future> getChildEntities( + ThermionEntity parent, bool renderableOnly); /// /// Finds the child entity named [childName] associated with the given parent. /// Usually, [parent] will be the return value from [loadGlb]/[loadGltf] and [childName] will be the name of a node/mesh. /// - Future getChildEntity( - FilamentEntity parent, String childName); + Future getChildEntity( + ThermionEntity parent, String childName); /// /// List the name of all child entities under the given entity. /// - Future> getChildEntityNames(FilamentEntity entity, + Future> getChildEntityNames(ThermionEntity entity, {bool renderableOnly = true}); /// @@ -641,26 +641,26 @@ abstract class AbstractFilamentViewer { /// An [entity] will only be animatable after an animation component is attached. /// Any calls to [playAnimation]/[setBoneAnimation]/[setMorphAnimation] will have no visual effect until [addAnimationComponent] has been called on the instance. /// - Future addAnimationComponent(FilamentEntity entity); + Future addAnimationComponent(ThermionEntity entity); /// /// Removes an animation component from [entity]. /// - Future removeAnimationComponent(FilamentEntity entity); + Future removeAnimationComponent(ThermionEntity entity); /// /// Makes [entity] collidable. /// This allows you to call [testCollisions] with any other entity ("entity B") to see if [entity] has collided with entity B. The callback will be invoked if so. /// Alternatively, if [affectsTransform] is true and this entity collides with another entity, any queued position updates to the latter entity will be ignored. /// - Future addCollisionComponent(FilamentEntity entity, + Future addCollisionComponent(ThermionEntity entity, {void Function(int entityId1, int entityId2)? callback, bool affectsTransform = false}); /// /// Removes the collision component from [entity], meaning this will no longer be tested when [testCollisions] or [queuePositionUpdate] is called with another entity. /// - Future removeCollisionComponent(FilamentEntity entity); + Future removeCollisionComponent(ThermionEntity entity); /// /// Creates a (renderable) entity with the specified geometry and adds to the scene. @@ -672,23 +672,23 @@ abstract class AbstractFilamentViewer { /// /// Gets the parent transform of [child]. /// - Future getParent(FilamentEntity child); + Future getParent(ThermionEntity child); /// /// Sets the parent transform of [child] to [parent]. /// - Future setParent(FilamentEntity child, FilamentEntity parent); + Future setParent(ThermionEntity child, ThermionEntity parent); /// /// Test all collidable entities against this entity to see if any have collided. /// This method returns void; the relevant callback passed to [addCollisionComponent] will be fired if a collision is detected. /// - Future testCollisions(FilamentEntity entity); + Future testCollisions(ThermionEntity entity); /// /// Sets the draw priority for the given entity. See RenderableManager.h for more details. /// - Future setPriority(FilamentEntity entityId, int priority); + Future setPriority(ThermionEntity entityId, int priority); /// /// The Scene holds all loaded entities/lights. @@ -707,7 +707,7 @@ abstract class AbstractFilamentViewer { abstract class Scene { /// /// The last entity clicked/tapped in the viewport (internally, the result of calling pick); - FilamentEntity? selected; + ThermionEntity? selected; /// /// A Stream updated whenever an entity is added/removed from the scene. @@ -715,35 +715,35 @@ abstract class Scene { Stream get onUpdated; /// - /// A Stream containing every FilamentEntity added to the scene (i.e. via [loadGlb], [loadGltf] or [addLight]). - /// This is provided for convenience so you can set listeners in front-end widgets that can respond to entity loads without manually passing around the FilamentEntity returned from those methods. + /// A Stream containing every ThermionEntity added to the scene (i.e. via [loadGlb], [loadGltf] or [addLight]). + /// This is provided for convenience so you can set listeners in front-end widgets that can respond to entity loads without manually passing around the ThermionEntity returned from those methods. /// - Stream get onLoad; + Stream get onLoad; /// - /// A Stream containing every FilamentEntity removed from the scene (i.e. via [removeEntity], [clearEntities], [removeLight] or [clearLights]). + /// A Stream containing every ThermionEntity removed from the scene (i.e. via [removeEntity], [clearEntities], [removeLight] or [clearLights]). - Stream get onUnload; + Stream get onUnload; /// /// Lists all light entities currently loaded (not necessarily active in the scene). Does not account for instances. /// - Iterable listLights(); + Iterable listLights(); /// /// Lists all entities currently loaded (not necessarily active in the scene). Does not account for instances. /// - Iterable listEntities(); + Iterable listEntities(); /// /// Attach the gizmo to the specified entity. /// - void select(FilamentEntity entity); + void select(ThermionEntity entity); /// /// /// - void registerEntity(FilamentEntity entity); + void registerEntity(ThermionEntity entity); } abstract class AbstractGizmo { @@ -753,7 +753,7 @@ abstract class AbstractGizmo { void reset(); - void attach(FilamentEntity entity); + void attach(ThermionEntity entity); void detach(); } diff --git a/thermion_dart/lib/thermion_dart/filament_viewer_impl.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart similarity index 91% rename from thermion_dart/lib/thermion_dart/filament_viewer_impl.dart rename to thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index ff1aaf60..1d232017 100644 --- a/thermion_dart/lib/thermion_dart/filament_viewer_impl.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -7,16 +7,16 @@ import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:thermion_dart/thermion_dart/entities/gizmo.dart'; import 'package:vector_math/vector_math_64.dart'; -import 'abstract_filament_viewer.dart'; +import 'thermion_viewer.dart'; import 'scene.dart'; import 'compatibility/compatibility.dart'; // ignore: constant_identifier_names -const FilamentEntity _FILAMENT_ASSET_ERROR = 0; +const ThermionEntity _FILAMENT_ASSET_ERROR = 0; typedef RenderCallback = Pointer)>>; -class FilamentViewer extends AbstractFilamentViewer { +class ThermionViewerFFI extends ThermionViewer { final _compat = Compatibility(); late SceneImpl _scene; @@ -56,7 +56,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// This controller uses platform channels to bridge Dart with the C/C++ code for the Filament API. /// Setting up the context/texture (since this is platform-specific) and the render ticker are platform-specific; all other methods are passed through by the platform channel to the methods specified in ThermionFlutterApi.h. /// - FilamentViewer( + ThermionViewerFFI( {RenderCallback? renderCallback, Pointer? renderCallbackOwner, required this.resourceLoader, @@ -277,7 +277,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future addLight( + Future addLight( LightType type, double colour, double intensity, @@ -325,7 +325,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future removeLight(FilamentEntity entity) async { + Future removeLight(ThermionEntity entity) async { _scene.unregisterLight(entity); remove_light_ffi(_viewer!, entity); } @@ -344,7 +344,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future createInstance(FilamentEntity entity) async { + Future createInstance(ThermionEntity entity) async { var created = await withIntCallback( (callback) => create_instance(_sceneManager!, entity)); if (created == _FILAMENT_ASSET_ERROR) { @@ -357,7 +357,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future getInstanceCount(FilamentEntity entity) async { + Future getInstanceCount(ThermionEntity entity) async { return get_instance_count(_sceneManager!, entity); } @@ -365,11 +365,11 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future> getInstances(FilamentEntity entity) async { + Future> getInstances(ThermionEntity entity) async { var count = await getInstanceCount(entity); var out = allocator(count); get_instances(_sceneManager!, entity, out); - var instances = []; + var instances = []; for (int i = 0; i < count; i++) { instances.add(out[i]); } @@ -381,7 +381,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future loadGlb(String path, + Future loadGlb(String path, {bool unlit = false, int numInstances = 1}) async { if (unlit) { throw Exception("Not yet implemented"); @@ -402,7 +402,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future loadGltf(String path, String relativeResourcePath, + Future loadGltf(String path, String relativeResourcePath, {bool force = false}) async { // if (Platform.isWindows && !force) { // throw Exception( @@ -477,7 +477,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future setMorphTargetWeights( - FilamentEntity entity, List weights) async { + ThermionEntity entity, List weights) async { if (weights.isEmpty) { throw Exception("Weights must not be empty"); } @@ -503,7 +503,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future> getMorphTargetNames( - FilamentEntity entity, FilamentEntity childEntity) async { + ThermionEntity entity, ThermionEntity childEntity) async { var names = []; var count = await withIntCallback((callback) => @@ -518,7 +518,7 @@ class FilamentViewer extends AbstractFilamentViewer { return names.cast(); } - Future> getBoneNames(FilamentEntity entity, + Future> getBoneNames(ThermionEntity entity, {int skinIndex = 0}) async { var count = get_bone_count(_sceneManager!, entity, skinIndex); var out = allocator>(count); @@ -539,7 +539,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future> getAnimationNames(FilamentEntity entity) async { + Future> getAnimationNames(ThermionEntity entity) async { var animationCount = get_animation_count(_sceneManager!, entity); var names = []; var outPtr = allocator(255); @@ -557,7 +557,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future getAnimationDuration( - FilamentEntity entity, int animationIndex) async { + ThermionEntity entity, int animationIndex) async { var duration = get_animation_duration(_sceneManager!, entity, animationIndex); @@ -569,7 +569,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future getAnimationDurationByName( - FilamentEntity entity, String name) async { + ThermionEntity entity, String name) async { var animations = await getAnimationNames(entity); var index = animations.indexOf(name); if (index == -1) { @@ -583,7 +583,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future setMorphAnimationData( - FilamentEntity entity, MorphAnimationData animation, + ThermionEntity entity, MorphAnimationData animation, {List? targetMeshNames}) async { var meshNames = await getChildEntityNames(entity, renderableOnly: true); if (targetMeshNames != null) { @@ -673,7 +673,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// Currently, scale is not supported. /// @override - Future addBoneAnimation(FilamentEntity entity, BoneAnimationData animation, + Future addBoneAnimation(ThermionEntity entity, BoneAnimationData animation, {int skinIndex = 0, double fadeOutInSecs = 0.0, double fadeInInSecs = 0.0, @@ -703,7 +703,7 @@ class FilamentViewer extends AbstractFilamentViewer { var data = allocator(numFrames * 16); - var bones = await Future.wait(List>.generate( + var bones = await Future.wait(List>.generate( boneNames.length, (i) => getBone(entity, i))); for (int i = 0; i < animation.bones.length; i++) { @@ -767,7 +767,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future getLocalTransform(FilamentEntity entity) async { + Future getLocalTransform(ThermionEntity entity) async { final ptr = allocator(16); get_local_transform(_sceneManager!, entity, ptr); @@ -782,7 +782,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future getWorldTransform(FilamentEntity entity) async { + Future getWorldTransform(ThermionEntity entity) async { final ptr = allocator(16); get_world_transform(_sceneManager!, entity, ptr); @@ -797,7 +797,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future setTransform(FilamentEntity entity, Matrix4 transform) async { + Future setTransform(ThermionEntity entity, Matrix4 transform) async { final ptr = allocator(16); for (int i = 0; i < 16; i++) { ptr[i] = transform[i]; @@ -809,7 +809,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future updateBoneMatrices(FilamentEntity entity) async { + Future updateBoneMatrices(ThermionEntity entity) async { var result = await withBoolCallback((cb) { update_bone_matrices_ffi(_sceneManager!, entity, cb); }); @@ -821,7 +821,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future getInverseBindMatrix(FilamentEntity parent, int boneIndex, + Future getInverseBindMatrix(ThermionEntity parent, int boneIndex, {int skinIndex = 0}) async { final ptr = allocator(16); @@ -837,7 +837,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future getBone(FilamentEntity parent, int boneIndex, + Future getBone(ThermionEntity parent, int boneIndex, {int skinIndex = 0}) async { if (skinIndex != 0) { throw UnimplementedError("TOOD"); @@ -850,7 +850,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future setBoneTransform( - FilamentEntity entity, int boneIndex, Matrix4 transform, + ThermionEntity entity, int boneIndex, Matrix4 transform, {int skinIndex = 0}) async { if (skinIndex != 0) { throw UnimplementedError("TOOD"); @@ -877,7 +877,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future resetBones(FilamentEntity entity) async { + Future resetBones(ThermionEntity entity) async { if (_viewer == nullptr) { throw Exception("No viewer available, ignoring"); } @@ -893,7 +893,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future removeEntity(FilamentEntity entity) async { + Future removeEntity(ThermionEntity entity) async { _scene.unregisterEntity(entity); await withVoidCallback( @@ -945,7 +945,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future playAnimation(FilamentEntity entity, int index, + Future playAnimation(ThermionEntity entity, int index, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -958,7 +958,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future stopAnimation(FilamentEntity entity, int animationIndex) async { + Future stopAnimation(ThermionEntity entity, int animationIndex) async { stop_animation(_sceneManager!, entity, animationIndex); } @@ -966,7 +966,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future stopAnimationByName(FilamentEntity entity, String name) async { + Future stopAnimationByName(ThermionEntity entity, String name) async { var animations = await getAnimationNames(entity); await stopAnimation(entity, animations.indexOf(name)); } @@ -975,7 +975,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future playAnimationByName(FilamentEntity entity, String name, + Future playAnimationByName(ThermionEntity entity, String name, {bool loop = false, bool reverse = false, bool replaceActive = true, @@ -1000,7 +1000,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future setAnimationFrame( - FilamentEntity entity, int index, int animationFrame) async { + ThermionEntity entity, int index, int animationFrame) async { set_animation_frame(_sceneManager!, entity, index, animationFrame); } @@ -1012,7 +1012,7 @@ class FilamentViewer extends AbstractFilamentViewer { set_main_camera(_viewer!); } - Future getMainCamera() async { + Future getMainCamera() async { return get_main_camera(_viewer!); } @@ -1020,7 +1020,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future setCamera(FilamentEntity entity, String? name) async { + Future setCamera(ThermionEntity entity, String? name) async { var cameraNamePtr = name?.toNativeUtf8(allocator: allocator).cast() ?? nullptr; var result = set_camera(_viewer!, entity, cameraNamePtr); @@ -1122,7 +1122,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future moveCameraToAsset(FilamentEntity entity) async { + Future moveCameraToAsset(ThermionEntity entity) async { move_camera_to_asset(_viewer!, entity); } @@ -1170,7 +1170,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future setMaterialColor(FilamentEntity entity, String meshName, + Future setMaterialColor(ThermionEntity entity, String meshName, int materialIndex, double r, double g, double b, double a) async { var meshNamePtr = meshName.toNativeUtf8(allocator: allocator).cast(); var result = set_material_color( @@ -1185,7 +1185,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future transformToUnitCube(FilamentEntity entity) async { + Future transformToUnitCube(ThermionEntity entity) async { transform_to_unit_cube(_sceneManager!, entity); } @@ -1194,7 +1194,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future setPosition( - FilamentEntity entity, double x, double y, double z) async { + ThermionEntity entity, double x, double y, double z) async { set_position(_sceneManager!, entity, x, y, z); } @@ -1202,7 +1202,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future setRotationQuat(FilamentEntity entity, Quaternion rotation, + Future setRotationQuat(ThermionEntity entity, Quaternion rotation, {bool relative = false}) async { set_rotation(_sceneManager!, entity, rotation.radians, rotation.x, rotation.y, rotation.z, rotation.w); @@ -1213,7 +1213,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future setRotation( - FilamentEntity entity, double rads, double x, double y, double z) async { + ThermionEntity entity, double rads, double x, double y, double z) async { var quat = Quaternion.axisAngle(Vector3(x, y, z), rads); await setRotationQuat(entity, quat); } @@ -1222,11 +1222,11 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future setScale(FilamentEntity entity, double scale) async { + Future setScale(ThermionEntity entity, double scale) async { set_scale(_sceneManager!, entity, scale); } - Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion rotation, + Future queueRotationUpdateQuat(ThermionEntity entity, Quaternion rotation, {bool relative = false}) async { queue_rotation_update(_sceneManager!, entity, rotation.radians, rotation.x, rotation.y, rotation.z, rotation.w, relative); @@ -1237,7 +1237,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future queueRotationUpdate( - FilamentEntity entity, double rads, double x, double y, double z, + ThermionEntity entity, double rads, double x, double y, double z, {bool relative = false}) async { var quat = Quaternion.axisAngle(Vector3(x, y, z), rads); await queueRotationUpdateQuat(entity, quat, relative: relative); @@ -1248,7 +1248,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// @override Future queuePositionUpdate( - FilamentEntity entity, double x, double y, double z, + ThermionEntity entity, double x, double y, double z, {bool relative = false}) async { queue_position_update(_sceneManager!, entity, x, y, z, relative); } @@ -1257,7 +1257,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future hide(FilamentEntity entity, String? meshName) async { + Future hide(ThermionEntity entity, String? meshName) async { final meshNamePtr = meshName?.toNativeUtf8(allocator: allocator).cast() ?? nullptr; if (hide_mesh(_sceneManager!, entity, meshNamePtr) != 1) {} @@ -1268,7 +1268,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future reveal(FilamentEntity entity, String? meshName) async { + Future reveal(ThermionEntity entity, String? meshName) async { final meshNamePtr = meshName?.toNativeUtf8(allocator: allocator).cast() ?? nullptr; final result = reveal_mesh(_sceneManager!, entity, meshNamePtr) == 1; @@ -1282,7 +1282,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - String? getNameForEntity(FilamentEntity entity) { + String? getNameForEntity(ThermionEntity entity) { final result = get_name_for_entity(_sceneManager!, entity); if (result == nullptr) { return null; @@ -1290,7 +1290,7 @@ class FilamentViewer extends AbstractFilamentViewer { return result.cast().toDartString(); } - void _onPickResult(FilamentEntity entityId, int x, int y) { + void _onPickResult(ThermionEntity entityId, int x, int y) { _pickResultController.add(( entity: entityId, x: (x / _pixelRatio).toDouble(), @@ -1474,8 +1474,8 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future getChildEntity( - FilamentEntity parent, String childName) async { + Future getChildEntity( + ThermionEntity parent, String childName) async { var childNamePtr = childName.toNativeUtf8(allocator: allocator).cast(); @@ -1489,13 +1489,13 @@ class FilamentViewer extends AbstractFilamentViewer { return childEntity; } - Future> getChildEntities( - FilamentEntity parent, bool renderableOnly) async { + Future> getChildEntities( + ThermionEntity parent, bool renderableOnly) async { var count = get_entity_count(_sceneManager!, parent, renderableOnly); var out = allocator(count); get_entities(_sceneManager!, parent, renderableOnly, out); var outList = - List.generate(count, (index) => out[index]).cast(); + List.generate(count, (index) => out[index]).cast(); allocator.free(out); return outList; } @@ -1504,7 +1504,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future> getChildEntityNames(FilamentEntity entity, + Future> getChildEntityNames(ThermionEntity entity, {bool renderableOnly = false}) async { var count = get_entity_count(_sceneManager!, entity, renderableOnly); var names = []; @@ -1536,13 +1536,13 @@ class FilamentViewer extends AbstractFilamentViewer { allocator.free(pathPtr); } - final _collisions = {}; + final _collisions = {}; /// /// /// @override - Future addCollisionComponent(FilamentEntity entity, + Future addCollisionComponent(ThermionEntity entity, {void Function(int entityId1, int entityId2)? callback, bool affectsTransform = false}) async { if (_sceneManager == null) { @@ -1566,7 +1566,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future removeCollisionComponent(FilamentEntity entity) async { + Future removeCollisionComponent(ThermionEntity entity) async { remove_collision_component(_sceneManager!, entity); } @@ -1574,7 +1574,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future addAnimationComponent(FilamentEntity entity) async { + Future addAnimationComponent(ThermionEntity entity) async { if (!add_animation_component(_sceneManager!, entity)) { throw Exception("Failed to add animation component"); } @@ -1583,7 +1583,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// /// - Future removeAnimationComponent(FilamentEntity entity) async { + Future removeAnimationComponent(ThermionEntity entity) async { remove_animation_component(_sceneManager!, entity); } @@ -1591,7 +1591,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future createGeometry( + Future createGeometry( List vertices, List indices, {String? materialPath, PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async { @@ -1637,7 +1637,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future setParent(FilamentEntity child, FilamentEntity parent) async { + Future setParent(ThermionEntity child, ThermionEntity parent) async { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } @@ -1648,7 +1648,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future getParent(FilamentEntity child) async { + Future getParent(ThermionEntity child) async { if (_sceneManager == null) { throw Exception("Asset manager must be non-null"); } @@ -1663,7 +1663,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future testCollisions(FilamentEntity entity) async { + Future testCollisions(ThermionEntity entity) async { test_collisions(_sceneManager!, entity); } @@ -1671,7 +1671,7 @@ class FilamentViewer extends AbstractFilamentViewer { /// /// @override - Future setPriority(FilamentEntity entityId, int priority) async { + Future setPriority(ThermionEntity entityId, int priority) async { set_priority(_sceneManager!, entityId, priority); } } diff --git a/thermion_dart/native/include/FilamentViewer.hpp b/thermion_dart/native/include/FilamentViewer.hpp index 468befaf..52cc7ff6 100644 --- a/thermion_dart/native/include/FilamentViewer.hpp +++ b/thermion_dart/native/include/FilamentViewer.hpp @@ -36,7 +36,7 @@ #include "SceneManager.hpp" #include "ThreadPool.hpp" -namespace thermion_flutter +namespace thermion_filament { typedef std::chrono::time_point time_point_t; @@ -167,7 +167,7 @@ namespace thermion_flutter Scene *_scene = nullptr; View *_view = nullptr; Engine *_engine = nullptr; - thermion_flutter::ThreadPool *_tp = nullptr; + thermion_filament::ThreadPool *_tp = nullptr; Renderer *_renderer = nullptr; RenderTarget *_rt = nullptr; Texture *_rtColor = nullptr; diff --git a/thermion_dart/native/include/ResourceBuffer.hpp b/thermion_dart/native/include/ResourceBuffer.hpp index cee6d0ec..57c68bda 100644 --- a/thermion_dart/native/include/ResourceBuffer.hpp +++ b/thermion_dart/native/include/ResourceBuffer.hpp @@ -9,7 +9,7 @@ using namespace std::chrono_literals; #endif -namespace thermion_flutter +namespace thermion_filament { struct ResourceLoaderWrapperImpl : public ResourceLoaderWrapper diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 7aabc878..f9f6efaa 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -23,7 +23,7 @@ #include "tsl/robin_map.h" -namespace thermion_flutter +namespace thermion_filament { typedef int32_t EntityId; diff --git a/thermion_dart/native/include/StreamBufferAdapter.hpp b/thermion_dart/native/include/StreamBufferAdapter.hpp index a80cb6d3..e76a9fda 100644 --- a/thermion_dart/native/include/StreamBufferAdapter.hpp +++ b/thermion_dart/native/include/StreamBufferAdapter.hpp @@ -5,7 +5,7 @@ #include #include -namespace thermion_flutter { +namespace thermion_filament { // diff --git a/thermion_dart/native/include/ThreadPool.hpp b/thermion_dart/native/include/ThreadPool.hpp index 22695a2e..1f1e27fb 100644 --- a/thermion_dart/native/include/ThreadPool.hpp +++ b/thermion_dart/native/include/ThreadPool.hpp @@ -15,7 +15,7 @@ #ifndef _THREADPOOL_HPP #define _THREADPOOL_HPP -namespace thermion_flutter { +namespace thermion_filament { class ThreadPool { std::vector pool; diff --git a/thermion_dart/native/include/components/AnimationComponentManager.hpp b/thermion_dart/native/include/components/AnimationComponentManager.hpp index 9b148c08..c182ef85 100644 --- a/thermion_dart/native/include/components/AnimationComponentManager.hpp +++ b/thermion_dart/native/include/components/AnimationComponentManager.hpp @@ -24,7 +24,7 @@ #include template class std::vector; -namespace thermion_flutter +namespace thermion_filament { using namespace filament; using namespace filament::gltfio; diff --git a/thermion_dart/native/include/components/CollisionComponentManager.hpp b/thermion_dart/native/include/components/CollisionComponentManager.hpp index d259b2b6..b7e62ab1 100644 --- a/thermion_dart/native/include/components/CollisionComponentManager.hpp +++ b/thermion_dart/native/include/components/CollisionComponentManager.hpp @@ -8,7 +8,7 @@ #include "gltfio/FilamentInstance.h" #include "Log.hpp" -namespace thermion_flutter +namespace thermion_filament { typedef void(*CollisionCallback)(int32_t entityId1, int32_t entityId2) ; diff --git a/thermion_dart/native/include/material/FileMaterialProvider.hpp b/thermion_dart/native/include/material/FileMaterialProvider.hpp index e4a18257..00b76859 100644 --- a/thermion_dart/native/include/material/FileMaterialProvider.hpp +++ b/thermion_dart/native/include/material/FileMaterialProvider.hpp @@ -11,7 +11,7 @@ #include #include "Log.hpp" -namespace thermion_flutter { +namespace thermion_filament { class FileMaterialProvider : public filament::gltfio::MaterialProvider { diff --git a/thermion_dart/native/src/FilamentViewer.cpp b/thermion_dart/native/src/FilamentViewer.cpp index f8417273..653d009b 100644 --- a/thermion_dart/native/src/FilamentViewer.cpp +++ b/thermion_dart/native/src/FilamentViewer.cpp @@ -103,7 +103,7 @@ namespace filament class LightManager; } // namespace filament -namespace thermion_flutter +namespace thermion_filament { using namespace filament; @@ -469,7 +469,7 @@ namespace thermion_flutter void FilamentViewer::loadPngTexture(string path, ResourceBuffer rb) { - thermion_flutter::StreamBufferAdapter sb((char *)rb.data, (char *)rb.data + rb.size); + thermion_filament::StreamBufferAdapter sb((char *)rb.data, (char *)rb.data + rb.size); std::istream inputStream(&sb); @@ -1204,7 +1204,7 @@ namespace thermion_flutter // std::lock_guard lock(_recordingMutex); if (recording) { - _tp = new thermion_flutter::ThreadPool(16); + _tp = new thermion_filament::ThreadPool(16); _recordingStartTime = std::chrono::high_resolution_clock::now(); } else @@ -1559,4 +1559,4 @@ namespace thermion_flutter return Entity::smuggle(renderable); } -} // namespace thermion_flutter +} // namespace thermion_filament diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index aedf09e3..c75a6f4d 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -33,7 +33,7 @@ extern "C" #include "material/image.h" } -namespace thermion_flutter +namespace thermion_filament { using namespace std::chrono; @@ -2113,4 +2113,4 @@ namespace thermion_flutter out[2] = Entity::smuggle(_gizmoZ); } -} // namespace thermion_flutter +} // namespace thermion_filament diff --git a/thermion_dart/native/src/StreamBufferAdapter.cpp b/thermion_dart/native/src/StreamBufferAdapter.cpp index e31087cc..8d51faaa 100644 --- a/thermion_dart/native/src/StreamBufferAdapter.cpp +++ b/thermion_dart/native/src/StreamBufferAdapter.cpp @@ -3,7 +3,7 @@ #include #include -namespace thermion_flutter { +namespace thermion_filament { class StreamBufferAdapter : public std::streambuf { diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 332ada7b..a11cde46 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -13,7 +13,7 @@ #include #include -using namespace thermion_flutter; +using namespace thermion_filament; #ifdef __EMSCRIPTEN__ #include @@ -753,7 +753,7 @@ extern "C" Log("Dummy called"); } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_free(void *ptr) + EMSCRIPTEN_KEEPALIVE void thermion_filament_free(void *ptr) { free(ptr); } diff --git a/thermion_dart/native/src/ThermionDartFFIApi.cpp b/thermion_dart/native/src/ThermionDartFFIApi.cpp index f0b3ad57..5791738a 100644 --- a/thermion_dart/native/src/ThermionDartFFIApi.cpp +++ b/thermion_dart/native/src/ThermionDartFFIApi.cpp @@ -19,7 +19,6 @@ extern "C" #endif #include "ThermionDartFFIApi.h" - #include "FilamentViewer.hpp" #include "Log.hpp" #include "ThreadPool.hpp" @@ -30,7 +29,7 @@ extern "C" #include #include -using namespace thermion_flutter; +using namespace thermion_filament; using namespace std::chrono_literals; #include diff --git a/thermion_dart/native/web/CMakeLists.txt b/thermion_dart/native/web/CMakeLists.txt index abaf3e8d..f9587ffe 100644 --- a/thermion_dart/native/web/CMakeLists.txt +++ b/thermion_dart/native/web/CMakeLists.txt @@ -49,7 +49,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY build/out) add_executable(${MODULE_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/../src/SceneManager.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/../src/FilamentViewer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionViewerFFI.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartApi.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/ThermionDartFFIApi.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/StreamBufferAdapter.cpp" diff --git a/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp b/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp index 33de4955..a55270ca 100644 --- a/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp +++ b/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp @@ -60,56 +60,56 @@ extern "C" // return 0; // } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_load_resource_callback(void* data, int32_t length, void* context) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_load_resource_callback(void* data, int32_t length, void* context) { ((PendingCall*)context)->HandleResponse(data, length); } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set(char* ptr, int32_t offset, int32_t val) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set(char* ptr, int32_t offset, int32_t val) { memset(ptr+offset, val, 1); } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_float(float* ptr, int32_t offset, float val) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_float(float* ptr, int32_t offset, float val) { ptr[offset] = val; } - EMSCRIPTEN_KEEPALIVE float thermion_flutter_web_get_float(float* ptr, int32_t offset) { + EMSCRIPTEN_KEEPALIVE float thermion_filament_web_get_float(float* ptr, int32_t offset) { return ptr[offset]; } - EMSCRIPTEN_KEEPALIVE double thermion_flutter_web_get_double(double* ptr, int32_t offset) { + EMSCRIPTEN_KEEPALIVE double thermion_filament_web_get_double(double* ptr, int32_t offset) { return ptr[offset]; } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_double(double* ptr, int32_t offset, double value) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_double(double* ptr, int32_t offset, double value) { ptr[offset] = value; } - EMSCRIPTEN_KEEPALIVE int32_t thermion_flutter_web_get_int32(int32_t* ptr, int32_t offset) { + EMSCRIPTEN_KEEPALIVE int32_t thermion_filament_web_get_int32(int32_t* ptr, int32_t offset) { return ptr[offset]; } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_int32(int32_t* ptr, int32_t offset, int32_t value) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_int32(int32_t* ptr, int32_t offset, int32_t value) { ptr[offset] = value; } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_set_pointer(void** ptr, int32_t offset, void* val) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_set_pointer(void** ptr, int32_t offset, void* val) { ptr[offset] = val; } - EMSCRIPTEN_KEEPALIVE void* thermion_flutter_web_get_pointer(void** ptr, int32_t offset) { + EMSCRIPTEN_KEEPALIVE void* thermion_filament_web_get_pointer(void** ptr, int32_t offset) { return ptr[offset]; } - EMSCRIPTEN_KEEPALIVE char thermion_flutter_web_get(char* ptr, int32_t offset) { + EMSCRIPTEN_KEEPALIVE char thermion_filament_web_get(char* ptr, int32_t offset) { return ptr[offset]; } - EMSCRIPTEN_KEEPALIVE void* thermion_flutter_web_allocate(int32_t size) { + EMSCRIPTEN_KEEPALIVE void* thermion_filament_web_allocate(int32_t size) { void* allocated = (void*)calloc(size, 1); return allocated; } - EMSCRIPTEN_KEEPALIVE long thermion_flutter_web_get_address(void** out) { + EMSCRIPTEN_KEEPALIVE long thermion_filament_web_get_address(void** out) { return (long)*out; } @@ -149,7 +149,7 @@ extern "C" int _lastResourceId = 0; - ResourceBuffer thermion_flutter_web_load_resource(const char* path) + ResourceBuffer thermion_filament_web_load_resource(const char* path) { // ideally we should bounce the call to Flutter then wait for callback // this isn't working for large assets though - seems like it's deadlocked @@ -212,19 +212,19 @@ extern "C" return ResourceBuffer { data, numBytes, _lastResourceId } ; } - void thermion_flutter_web_free_resource(ResourceBuffer rb) { + void thermion_filament_web_free_resource(ResourceBuffer rb) { free((void*)rb.data); } - EMSCRIPTEN_KEEPALIVE void thermion_flutter_web_free(void* ptr) { + EMSCRIPTEN_KEEPALIVE void thermion_filament_web_free(void* ptr) { free(ptr); } EMSCRIPTEN_KEEPALIVE void* thermion_dart_web_get_resource_loader_wrapper() { ResourceLoaderWrapper *rlw = (ResourceLoaderWrapper *)malloc(sizeof(ResourceLoaderWrapper)); - rlw->loadResource = thermion_flutter_web_load_resource; + rlw->loadResource = thermion_filament_web_load_resource; rlw->loadFromOwner = nullptr; - rlw->freeResource = thermion_flutter_web_free_resource; + rlw->freeResource = thermion_filament_web_free_resource; rlw->freeFromOwner = nullptr; rlw->loadToOut = nullptr; rlw->owner = nullptr; diff --git a/thermion_dart/test/integration_test.dart b/thermion_dart/test/integration_test.dart index c9efeabb..3822561f 100644 --- a/thermion_dart/test/integration_test.dart +++ b/thermion_dart/test/integration_test.dart @@ -66,7 +66,7 @@ void main() async { DartResourceLoader.freeResource); resourceLoader.ref.freeResource = freeResource.nativeFunction; - var viewer = FilamentViewer(resourceLoader: resourceLoader.cast()); + var viewer = ThermionViewerFFI(resourceLoader: resourceLoader.cast()); await viewer.initialized; await viewer.createSwapChain(500, 500); diff --git a/thermion_flutter/thermion_flutter/docs/drawing.svg b/thermion_flutter/thermion_flutter/docs/drawing.svg index 01e3f92b..33f58053 100644 --- a/thermion_flutter/thermion_flutter/docs/drawing.svg +++ b/thermion_flutter/thermion_flutter/docs/drawing.svg @@ -211,7 +211,7 @@ id="tspan396-8-1" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Arial;-inkscape-font-specification:Arial;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.32292" x="578.62885" - y="60.701408">FilamentViewer / Filament Engine (etc) + y="60.701408">ThermionViewerFFI / Filament Engine (etc) ThermionFlutterPlatform.instance.viewer; + bool _wasRenderingOnInactive = false; void _handleStateChange(AppLifecycleState state) async { @@ -19,50 +21,51 @@ class ThermionFlutterPlugin { case AppLifecycleState.detached: print("Detached"); if (!_wasRenderingOnInactive) { - _wasRenderingOnInactive = viewer.rendering; + _wasRenderingOnInactive = _viewer.rendering; } - await viewer.setRendering(false); + await _viewer.setRendering(false); break; case AppLifecycleState.hidden: print("Hidden"); if (!_wasRenderingOnInactive) { - _wasRenderingOnInactive = viewer.rendering; + _wasRenderingOnInactive = _viewer.rendering; } - await viewer.setRendering(false); + await _viewer.setRendering(false); break; case AppLifecycleState.inactive: print("Inactive"); if (!_wasRenderingOnInactive) { - _wasRenderingOnInactive = viewer.rendering; + _wasRenderingOnInactive = _viewer.rendering; } // on Windows in particular, restoring a window after minimizing stalls the renderer (and the whole application) for a considerable length of time. // disabling rendering on minimize seems to fix the issue (so I wonder if there's some kind of command buffer that's filling up while the window is minimized). - await viewer.setRendering(false); + await _viewer.setRendering(false); break; case AppLifecycleState.paused: print("Paused"); if (!_wasRenderingOnInactive) { - _wasRenderingOnInactive = viewer.rendering; + _wasRenderingOnInactive = _viewer.rendering; } - await viewer.setRendering(false); + await _viewer.setRendering(false); break; case AppLifecycleState.resumed: print("Resumed"); - await viewer.setRendering(_wasRenderingOnInactive); + await _viewer.setRendering(_wasRenderingOnInactive); break; } } AppLifecycleListener? _appLifecycleListener; - AbstractFilamentViewer get viewer => ThermionFlutterPlatform.instance.viewer; - final _initialized = Completer(); Future get initialized => _initialized.future; - Future initialize({String? uberArchivePath}) async { + bool _initializing = false; + + Future initialize({String? uberArchivePath}) async { + _initializing = true; if (_initialized.isCompleted) { - throw Exception("Instance already initialized"); + return ThermionFlutterPlatform.instance.viewer; } await ThermionFlutterPlatform.instance .initialize(uberArchivePath: uberArchivePath); @@ -70,9 +73,10 @@ class ThermionFlutterPlugin { _appLifecycleListener = AppLifecycleListener( onStateChange: _handleStateChange, ); + _viewer.initialized; _initialized.complete(true); - - await viewer.initialized; + _initializing = false; + return ThermionFlutterPlatform.instance.viewer; } Future createTexture( diff --git a/thermion_flutter/thermion_flutter/lib/filament/utils/camera_orientation.dart b/thermion_flutter/thermion_flutter/lib/thermion/utils/camera_orientation.dart similarity index 100% rename from thermion_flutter/thermion_flutter/lib/filament/utils/camera_orientation.dart rename to thermion_flutter/thermion_flutter/lib/thermion/utils/camera_orientation.dart diff --git a/thermion_flutter/thermion_flutter/lib/filament/utils/hardware_keyboard_listener.dart b/thermion_flutter/thermion_flutter/lib/thermion/utils/hardware_keyboard_listener.dart similarity index 100% rename from thermion_flutter/thermion_flutter/lib/filament/utils/hardware_keyboard_listener.dart rename to thermion_flutter/thermion_flutter/lib/thermion/utils/hardware_keyboard_listener.dart diff --git a/thermion_flutter/thermion_flutter/lib/filament/utils/hardware_keyboard_poll.dart b/thermion_flutter/thermion_flutter/lib/thermion/utils/hardware_keyboard_poll.dart similarity index 100% rename from thermion_flutter/thermion_flutter/lib/filament/utils/hardware_keyboard_poll.dart rename to thermion_flutter/thermion_flutter/lib/thermion/utils/hardware_keyboard_poll.dart diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/camera_options_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart similarity index 97% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/camera/camera_options_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart index f17007b4..2d90e0ba 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/camera_options_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/camera_options_widget.dart @@ -1,5 +1,5 @@ import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart';import 'package:flutter/material.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart';import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import '../../utils/camera_orientation.dart'; @@ -7,9 +7,9 @@ import 'dart:math'; import 'package:vector_math/vector_math_64.dart' as v64; class CameraOptionsWidget extends StatefulWidget { - final AbstractFilamentViewer controller; + final ThermionViewer controller; final CameraOrientation cameraOrientation; - final List<({FilamentEntity entity, String name})> cameras; + final List<({ThermionEntity entity, String name})> cameras; CameraOptionsWidget( {super.key, diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/entity_controller_mouse_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/entity_controller_mouse_widget.dart similarity index 100% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/camera/entity_controller_mouse_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/entity_controller_mouse_widget.dart diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector.dart similarity index 91% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector.dart index 0e2b9d26..a02b19b3 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector.dart @@ -1,6 +1,6 @@ import 'dart:io'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'filament_gesture_detector_desktop.dart'; @@ -14,15 +14,15 @@ enum GestureType { rotateCamera, panCamera, panBackground } class FilamentGestureDetector extends StatelessWidget { /// /// The content to display below the gesture detector/listener widget. - /// This will usually be a FilamentWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. + /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. /// final Widget? child; /// - /// The [controller] attached to the [FilamentWidget] you wish to control. + /// The [controller] attached to the [ThermionWidget] you wish to control. /// - final AbstractFilamentViewer controller; + final ThermionViewer controller; /// /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector_desktop.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector_desktop.dart similarity index 96% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector_desktop.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector_desktop.dart index 43504339..dd511c3a 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector_desktop.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector_desktop.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -10,15 +10,15 @@ import 'package:flutter/material.dart'; class FilamentGestureDetectorDesktop extends StatefulWidget { /// /// The content to display below the gesture detector/listener widget. - /// This will usually be a FilamentWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. + /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. /// final Widget? child; /// - /// The [controller] attached to the [FilamentWidget] you wish to control. + /// The [controller] attached to the [ThermionWidget] you wish to control. /// - final AbstractFilamentViewer controller; + final ThermionViewer controller; /// /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector_mobile.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector_mobile.dart similarity index 96% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector_mobile.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector_mobile.dart index adc42f0e..9d15643a 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/camera/gestures/filament_gesture_detector_mobile.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/camera/gestures/filament_gesture_detector_mobile.dart @@ -1,5 +1,5 @@ import 'dart:async'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:flutter/material.dart'; enum GestureType { rotateCamera, panCamera, panBackground } @@ -10,15 +10,15 @@ enum GestureType { rotateCamera, panCamera, panBackground } class FilamentGestureDetectorMobile extends StatefulWidget { /// /// The content to display below the gesture detector/listener widget. - /// This will usually be a FilamentWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. + /// This will usually be a ThermionWidget (so you can navigate by directly interacting with the viewport), but this is not necessary. /// It is equally possible to render the viewport/gesture controls elsewhere in the widget hierarchy. The only requirement is that they share the same [FilamentController]. /// final Widget? child; /// - /// The [controller] attached to the [FilamentWidget] you wish to control. + /// The [controller] attached to the [ThermionWidget] you wish to control. /// - final AbstractFilamentViewer controller; + final ThermionViewer controller; /// /// If true, an overlay will be shown with buttons to toggle whether pointer movements are interpreted as: diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/debug/child_renderable_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/child_renderable_widget.dart similarity index 95% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/debug/child_renderable_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/child_renderable_widget.dart index c318d3ea..ec9cbd8b 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/debug/child_renderable_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/child_renderable_widget.dart @@ -1,18 +1,18 @@ import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:flutter/material.dart'; import 'package:thermion_flutter/filament/widgets/debug/skeleton_menu_item_widget.dart'; import 'dart:math'; class ChildRenderableWidget extends StatelessWidget { - final AbstractFilamentViewer controller; - final FilamentEntity entity; + final ThermionViewer controller; + final ThermionEntity entity; const ChildRenderableWidget( {super.key, required this.controller, required this.entity}); - Widget _childRenderable(FilamentEntity childEntity) { + Widget _childRenderable(ThermionEntity childEntity) { var name = controller.getNameForEntity(childEntity) ?? ""; var names = controller.getMorphTargetNames(entity, childEntity); diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/debug/entity_list_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/entity_list_widget.dart similarity index 97% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/debug/entity_list_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/entity_list_widget.dart index 2028fbc3..afa48635 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/debug/entity_list_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/entity_list_widget.dart @@ -1,11 +1,11 @@ -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; import 'package:thermion_flutter/filament/widgets/debug/child_renderable_widget.dart'; import 'package:flutter/material.dart'; import 'package:thermion_flutter/filament/widgets/debug/skeleton_menu_item_widget.dart'; class EntityListWidget extends StatefulWidget { - final AbstractFilamentViewer? controller; + final ThermionViewer? controller; const EntityListWidget({super.key, required this.controller}); @@ -19,7 +19,7 @@ class _EntityListWidget extends State { super.didUpdateWidget(oldWidget); } - Widget _entity(FilamentEntity entity) { + Widget _entity(ThermionEntity entity) { return FutureBuilder( future: widget.controller!.getAnimationNames(entity), builder: (_, animations) { @@ -108,7 +108,7 @@ class _EntityListWidget extends State { }); } - Widget _light(FilamentEntity entity) { + Widget _light(ThermionEntity entity) { final controller = MenuController(); return Row(children: [ GestureDetector( diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/debug/skeleton_menu_item_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/skeleton_menu_item_widget.dart similarity index 99% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/debug/skeleton_menu_item_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/skeleton_menu_item_widget.dart index 61691850..1c676310 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/debug/skeleton_menu_item_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/debug/skeleton_menu_item_widget.dart @@ -1,15 +1,15 @@ import 'dart:math'; import 'package:thermion_dart/thermion_dart.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:vector_math/vector_math_64.dart'; class SkeletonMenuItemWidget extends StatelessWidget { - final AbstractFilamentViewer controller; - final FilamentEntity entity; + final ThermionViewer controller; + final ThermionEntity entity; const SkeletonMenuItemWidget( {super.key, required this.controller, required this.entity}); diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/lights/ibl_rotation_slider.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/ibl_rotation_slider.dart similarity index 87% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/lights/ibl_rotation_slider.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/ibl_rotation_slider.dart index 3b48cc74..51d320a8 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/lights/ibl_rotation_slider.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/ibl_rotation_slider.dart @@ -1,10 +1,10 @@ import 'dart:math'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:flutter/material.dart'; import 'package:vector_math/vector_math_64.dart' as v; class IblRotationSliderWidget extends StatefulWidget { - final AbstractFilamentViewer controller; + final ThermionViewer controller; const IblRotationSliderWidget({super.key, required this.controller}); @override diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/lights/light_slider.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart similarity index 98% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/lights/light_slider.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart index d5840206..596f9aa0 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/lights/light_slider.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/lights/light_slider.dart @@ -1,5 +1,5 @@ import 'package:thermion_dart/thermion_dart/entities/filament_entity.dart'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_dart/thermion_dart/utils/light_options.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; @@ -7,7 +7,7 @@ import 'package:flutter/widgets.dart'; import 'package:vector_math/vector_math_64.dart' as v; class LightSliderWidget extends StatefulWidget { - final AbstractFilamentViewer controller; + final ThermionViewer controller; final LightOptions options; final bool showControls; @@ -22,7 +22,7 @@ class LightSliderWidget extends StatefulWidget { } class _LightSliderWidgetState extends State { - FilamentEntity? _light; + ThermionEntity? _light; @override void initState() { diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/resize_observer.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/resize_observer.dart similarity index 100% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/resize_observer.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/resize_observer.dart diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/filament_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart similarity index 92% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/filament_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart index 113f0fbe..2c0ee3a2 100644 --- a/thermion_flutter/thermion_flutter/lib/filament/widgets/filament_widget.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion/widgets/thermion_widget.dart @@ -8,7 +8,7 @@ import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dar import 'package:thermion_flutter/thermion_flutter.dart'; import 'resize_observer.dart'; -class FilamentWidget extends StatefulWidget { +class ThermionWidget extends StatefulWidget { final ThermionFlutterPlugin plugin; /// @@ -17,20 +17,20 @@ class FilamentWidget extends StatefulWidget { /// final Widget? initial; - const FilamentWidget({Key? key, this.initial, required this.plugin}) + const ThermionWidget({Key? key, this.initial, required this.plugin}) : super(key: key); @override - _FilamentWidgetState createState() => _FilamentWidgetState(); + _ThermionWidgetState createState() => _ThermionWidgetState(); } -class _FilamentWidgetState extends State { - +class _ThermionWidgetState extends State { ThermionFlutterTexture? _texture; @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { + await widget.plugin.initialized; var dpr = MediaQuery.of(context).devicePixelRatio; var size = ((context.findRenderObject()) as RenderBox).size; var width = (dpr * size.width).ceil(); @@ -72,14 +72,12 @@ class _FilamentWidgetState extends State { @override Widget build(BuildContext context) { - if (_texture?.usesBackingWindow == true) { return Stack(children: [ Positioned.fill(child: CustomPaint(painter: TransparencyPainter())) ]); } - if (_texture == null || _resizing) { return widget.initial ?? Container(color: kIsWeb ? Colors.transparent : Colors.red); @@ -107,7 +105,6 @@ class _FilamentWidgetState extends State { } } - class TransparencyPainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { @@ -121,4 +118,4 @@ class TransparencyPainter extends CustomPainter { @override bool shouldRepaint(covariant CustomPainter oldDelegate) => false; -} \ No newline at end of file +} diff --git a/thermion_flutter/thermion_flutter/lib/filament/widgets/transparent_filament_widget.dart b/thermion_flutter/thermion_flutter/lib/thermion/widgets/transparent_filament_widget.dart similarity index 100% rename from thermion_flutter/thermion_flutter/lib/filament/widgets/transparent_filament_widget.dart rename to thermion_flutter/thermion_flutter/lib/thermion/widgets/transparent_filament_widget.dart diff --git a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart index ea454a46..2f1b5e4d 100644 --- a/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart +++ b/thermion_flutter/thermion_flutter/lib/thermion_flutter.dart @@ -1,4 +1,4 @@ library thermion_flutter; -export 'filament/thermion_flutter_plugin.dart'; - +export 'thermion/thermion_flutter_plugin.dart'; +export 'package:thermion_dart/thermion_dart.dart'; diff --git a/thermion_flutter/thermion_flutter/linux/CMakeLists.txt b/thermion_flutter/thermion_flutter/linux/CMakeLists.txt index 973e14b3..fa82db75 100644 --- a/thermion_flutter/thermion_flutter/linux/CMakeLists.txt +++ b/thermion_flutter/thermion_flutter/linux/CMakeLists.txt @@ -30,7 +30,7 @@ add_library(${PLUGIN_NAME} SHARED "filament_texture.cc" "filament_pb_texture.cc" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/SceneManager.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/FilamentViewer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/ThermionViewerFFI.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/ThermionFlutterApi.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/StreamBufferAdapter.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ios/src/TimeIt.cpp" diff --git a/thermion_flutter/thermion_flutter/linux/thermion_flutter_plugin.cc b/thermion_flutter/thermion_flutter/linux/thermion_flutter_plugin.cc index 140dcdef..aa786fee 100644 --- a/thermion_flutter/thermion_flutter/linux/thermion_flutter_plugin.cc +++ b/thermion_flutter/thermion_flutter/linux/thermion_flutter_plugin.cc @@ -20,7 +20,7 @@ #include "include/thermion_flutter/filament_pb_texture.h" #include "include/thermion_flutter/resource_loader.hpp" -#include "FilamentViewer.hpp" +#include "ThermionDartApi.h" #include "Log.hpp" extern "C" { @@ -43,7 +43,7 @@ struct _ThermionFlutterPlugin { double width = 0; double height = 0; bool rendering = false; - thermion_flutter::FilamentViewer* viewer; + thermion_flutter::ThermionViewerFFI* viewer; }; G_DEFINE_TYPE(ThermionFlutterPlugin, thermion_flutter_plugin, g_object_get_type()) @@ -71,7 +71,7 @@ static FlMethodResponse* _create_filament_viewer(ThermionFlutterPlugin* self, Fl self->height = height; auto context = glXGetCurrentContext(); - self->viewer = (thermion_flutter::FilamentViewer*)create_filament_viewer( + self->viewer = (thermion_flutter::ThermionViewerFFI*)create_filament_viewer( (void*)context, callback ); @@ -718,7 +718,7 @@ static void thermion_flutter_plugin_handle_method_call( const gchar* method = fl_method_call_get_name(method_call); - if(strcmp(method, "createFilamentViewer") == 0) { + if(strcmp(method, "createThermionViewerFFI") == 0) { response = _create_filament_viewer(self, method_call); } else if(strcmp(method, "createTexture") == 0) { response = _create_texture(self, method_call); diff --git a/thermion_flutter/thermion_flutter/macos/include/ResourceBuffer.hpp b/thermion_flutter/thermion_flutter/macos/include/ResourceBuffer.hpp index b5594eac..97822546 100644 --- a/thermion_flutter/thermion_flutter/macos/include/ResourceBuffer.hpp +++ b/thermion_flutter/thermion_flutter/macos/include/ResourceBuffer.hpp @@ -38,7 +38,7 @@ typedef struct ResourceLoaderWrapper ResourceLoaderWrapper; #if defined(__cplusplus) -namespace thermion_flutter { +namespace thermion_filament { struct ResourceLoaderWrapperImpl : public ResourceLoaderWrapper { diff --git a/thermion_flutter/thermion_flutter/test/cpp/test.cpp b/thermion_flutter/thermion_flutter/test/cpp/test.cpp index 2d56fe3e..b046dff0 100644 --- a/thermion_flutter/thermion_flutter/test/cpp/test.cpp +++ b/thermion_flutter/thermion_flutter/test/cpp/test.cpp @@ -14,7 +14,7 @@ #include "ResourceBuffer.hpp" using namespace filament; -using namespace thermion_flutter; +using namespace thermion_filament; using namespace std; int _i = 0; diff --git a/thermion_flutter/thermion_flutter/windows/backing_window.cpp b/thermion_flutter/thermion_flutter/windows/backing_window.cpp index b98daed9..b7b2f989 100644 --- a/thermion_flutter/thermion_flutter/windows/backing_window.cpp +++ b/thermion_flutter/thermion_flutter/windows/backing_window.cpp @@ -12,7 +12,7 @@ #pragma comment(lib, "dwmapi.lib") #pragma comment(lib, "comctl32.lib") -namespace thermion_flutter { +namespace thermion_filament { static constexpr auto kClassName = L"FLUTTER_FILAMENT_WINDOW"; static constexpr auto kWindowName = L"thermion_flutter_window"; @@ -354,4 +354,4 @@ void BackingWindow::Resize(int width, int height, int left, int top) { } HWND BackingWindow::GetHandle() { return _windowHandle; } -} // namespace thermion_flutter +} // namespace thermion_filament diff --git a/thermion_flutter/thermion_flutter/windows/backing_window.h b/thermion_flutter/thermion_flutter/windows/backing_window.h index bf2cf0e7..e58a9d07 100644 --- a/thermion_flutter/thermion_flutter/windows/backing_window.h +++ b/thermion_flutter/thermion_flutter/windows/backing_window.h @@ -5,7 +5,7 @@ #include #include -namespace thermion_flutter { +namespace thermion_filament { class BackingWindow { public: diff --git a/thermion_flutter/thermion_flutter/windows/egl_context.cpp b/thermion_flutter/thermion_flutter/windows/egl_context.cpp index a766fa36..3933f543 100644 --- a/thermion_flutter/thermion_flutter/windows/egl_context.cpp +++ b/thermion_flutter/thermion_flutter/windows/egl_context.cpp @@ -7,7 +7,7 @@ #pragma comment(lib, "dwmapi.lib") #pragma comment(lib, "comctl32.lib") -namespace thermion_flutter { +namespace thermion_filament { FlutterEGLContext::FlutterEGLContext( flutter::PluginRegistrarWindows* pluginRegistrar, diff --git a/thermion_flutter/thermion_flutter/windows/egl_context.h b/thermion_flutter/thermion_flutter/windows/egl_context.h index b6b056bc..59cf0a24 100644 --- a/thermion_flutter/thermion_flutter/windows/egl_context.h +++ b/thermion_flutter/thermion_flutter/windows/egl_context.h @@ -12,7 +12,7 @@ #include "backend/platforms/PlatformEGL.h" #include "flutter_render_context.h" -namespace thermion_flutter { +namespace thermion_filament { class FlutterEGLContext : public FlutterRenderContext { public: diff --git a/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.cpp b/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.cpp index 75465f55..e443c1b2 100644 --- a/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.cpp +++ b/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.cpp @@ -7,7 +7,7 @@ #include -namespace thermion_flutter { +namespace thermion_filament { static void logEglError(const char *name) noexcept { const char *err; @@ -240,4 +240,4 @@ FlutterAngleTexture::FlutterAngleTexture( result->Success(resultList); } -} // namespace thermion_flutter \ No newline at end of file +} // namespace thermion_filament \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.h b/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.h index 0612c516..ea449f69 100644 --- a/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.h +++ b/thermion_flutter/thermion_flutter/windows/flutter_angle_texture.h @@ -26,7 +26,7 @@ typedef uint32_t GLuint; -namespace thermion_flutter { +namespace thermion_filament { class FlutterAngleTexture : public FlutterTextureBuffer { public: diff --git a/thermion_flutter/thermion_flutter/windows/flutter_render_context.h b/thermion_flutter/thermion_flutter/windows/flutter_render_context.h index c582d349..88157ae1 100644 --- a/thermion_flutter/thermion_flutter/windows/flutter_render_context.h +++ b/thermion_flutter/thermion_flutter/windows/flutter_render_context.h @@ -8,7 +8,7 @@ #include "flutter_texture_buffer.h" -namespace thermion_flutter { +namespace thermion_filament { class FlutterRenderContext { public: diff --git a/thermion_flutter/thermion_flutter/windows/flutter_texture_buffer.h b/thermion_flutter/thermion_flutter/windows/flutter_texture_buffer.h index 40ee244f..f12c8541 100644 --- a/thermion_flutter/thermion_flutter/windows/flutter_texture_buffer.h +++ b/thermion_flutter/thermion_flutter/windows/flutter_texture_buffer.h @@ -7,7 +7,7 @@ #include -namespace thermion_flutter { +namespace thermion_filament { class FlutterTextureBuffer { public: diff --git a/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.cpp b/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.cpp index 7142846e..dbaca0ab 100644 --- a/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.cpp +++ b/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.cpp @@ -7,7 +7,7 @@ #include -namespace thermion_flutter { +namespace thermion_filament { void _release_callback(void *releaseContext) { // ((OpenGLTextureBuffer*)releaseContext)->unlock(); @@ -141,4 +141,4 @@ OpenGLTextureBuffer::~OpenGLTextureBuffer() { wglMakeCurrent(NULL, NULL); } -} // namespace thermion_flutter \ No newline at end of file +} // namespace thermion_filament \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.h b/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.h index 16f59e4f..df17c02c 100644 --- a/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.h +++ b/thermion_flutter/thermion_flutter/windows/opengl_texture_buffer.h @@ -20,7 +20,7 @@ typedef uint32_t GLuint; -namespace thermion_flutter { +namespace thermion_filament { class OpenGLTextureBuffer : public FlutterTextureBuffer { public: diff --git a/thermion_flutter/thermion_flutter/windows/test/thermion_flutter_plugin_test.cpp b/thermion_flutter/thermion_flutter/windows/test/thermion_flutter_plugin_test.cpp index 3ebaf4da..38f05c58 100644 --- a/thermion_flutter/thermion_flutter/windows/test/thermion_flutter_plugin_test.cpp +++ b/thermion_flutter/thermion_flutter/windows/test/thermion_flutter_plugin_test.cpp @@ -10,7 +10,7 @@ #include "thermion_flutter_plugin.h" -namespace thermion_flutter { +namespace thermion_filament { namespace test { namespace { @@ -40,4 +40,4 @@ TEST(ThermionFlutterPlugin, GetPlatformVersion) { } } // namespace test -} // namespace thermion_flutter +} // namespace thermion_filament diff --git a/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.cpp b/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.cpp index 8e4521b0..6e870225 100644 --- a/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.cpp +++ b/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.cpp @@ -35,7 +35,7 @@ #include "wgl_context.h" #endif -namespace thermion_flutter { +namespace thermion_filament { using namespace std::chrono_literals; @@ -275,4 +275,4 @@ void ThermionFlutterPlugin::HandleMethodCall( } } -} // namespace thermion_flutter +} // namespace thermion_filament diff --git a/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.h b/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.h index ad91e547..712e2182 100644 --- a/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.h +++ b/thermion_flutter/thermion_flutter/windows/thermion_flutter_plugin.h @@ -22,7 +22,7 @@ #include "wgl_context.h" #endif -namespace thermion_flutter { +namespace thermion_filament { class ThermionFlutterPlugin : public flutter::Plugin { public: @@ -66,6 +66,6 @@ public: #endif }; -} // namespace thermion_flutter +} // namespace thermion_filament #endif // FLUTTER_PLUGIN_FLUTTER_FILAMENT_PLUGIN_H_ diff --git a/thermion_flutter/thermion_flutter/windows/wgl_context.cpp b/thermion_flutter/thermion_flutter/windows/wgl_context.cpp index 68bbaebd..cb5485a3 100644 --- a/thermion_flutter/thermion_flutter/windows/wgl_context.cpp +++ b/thermion_flutter/thermion_flutter/windows/wgl_context.cpp @@ -6,7 +6,7 @@ #include "flutter_texture_buffer.h" -namespace thermion_flutter { +namespace thermion_filament { WGLContext::WGLContext(flutter::PluginRegistrarWindows *pluginRegistrar, flutter::TextureRegistrar *textureRegistrar) @@ -143,4 +143,4 @@ void WGLContext::CreateRenderingSurface( void *WGLContext::GetSharedContext() { return (void *)_context; } -} // namespace thermion_flutter +} // namespace thermion_filament diff --git a/thermion_flutter/thermion_flutter/windows/wgl_context.h b/thermion_flutter/thermion_flutter/windows/wgl_context.h index 0968bf41..46b8bc77 100644 --- a/thermion_flutter/thermion_flutter/windows/wgl_context.h +++ b/thermion_flutter/thermion_flutter/windows/wgl_context.h @@ -7,7 +7,7 @@ #if WGL_USE_BACKING_WINDOW #include "backing_window.h" #endif -namespace thermion_flutter { +namespace thermion_filament { class WGLContext : public FlutterRenderContext { public: diff --git a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart index 0fdb88af..d7de63e9 100644 --- a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart +++ b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart @@ -6,13 +6,13 @@ import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_in import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; /// -/// A subclass of [FilamentViewer] that uses Flutter platform channels +/// A subclass of [ThermionViewerFFI] that uses Flutter platform channels /// to create rendering contexts, callbacks and surfaces (either backing texture(s). /// class ThermionFlutterFFI extends ThermionFlutterPlatform { final _channel = const MethodChannel("app.polyvox.filament/event"); - late final FilamentViewer viewer; + late final ThermionViewerFFI viewer; static void registerWith() { ThermionFlutterPlatform.instance = ThermionFlutterFFI(); @@ -46,7 +46,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { ? nullptr : Pointer.fromAddress(sharedContext); - viewer = FilamentViewer( + viewer = ThermionViewerFFI( resourceLoader: resourceLoader, renderCallback: renderCallback, renderCallbackOwner: renderCallbackOwner, @@ -73,7 +73,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { /// /// Create a backing surface for rendering. - /// This is called by [FilamentWidget]; don't call this yourself. + /// This is called by [ThermionWidget]; don't call this yourself. /// /// The name here is slightly misleading because we only create /// a texture render target on macOS and iOS; on Android, we render into @@ -81,7 +81,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { /// a HWND. /// /// Currently, this only supports a single "texture" (aka rendering surface) - /// at any given time. If a [FilamentWidget] is disposed, it will call + /// at any given time. If a [ThermionWidget] is disposed, it will call /// [destroyTexture]; if it is resized, it will call [resizeTexture]. /// /// In future, we probably want to be able to create multiple distinct @@ -92,13 +92,13 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { /// Future createTexture( int width, int height, int offsetLeft, int offsetRight) async { - // when a FilamentWidget is inserted, disposed then immediately reinserted + // when a ThermionWidget is inserted, disposed then immediately reinserted // into the widget hierarchy (e.g. rebuilding due to setState(() {}) being called in an ancestor widget) // the first call to createTexture may not have completed before the second. // add a loop here to wait (max 500ms) for the first call to complete await _waitForTextureCreationToComplete(); - // note that when [FilamentWidget] is disposed, we don't destroy the + // note that when [ThermionWidget] is disposed, we don't destroy the // texture; instead, we keep it around in case a subsequent call requests // a texture of the same size. @@ -152,7 +152,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { } /// - /// Called by [FilamentWidget] to destroy a texture. Don't call this yourself. + /// Called by [ThermionWidget] to destroy a texture. Don't call this yourself. /// Future destroyTexture(ThermionFlutterTexture texture) async { await _channel.invokeMethod("destroyTexture", texture.flutterTextureId); @@ -162,7 +162,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { bool _resizing = false; /// - /// Called by [FilamentWidget] to resize a texture. Don't call this yourself. + /// Called by [ThermionWidget] to resize a texture. Don't call this yourself. /// @override Future resizeTexture(ThermionFlutterTexture texture, diff --git a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart index a1ccd5ba..71ed5585 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart +++ b/thermion_flutter/thermion_flutter_platform_interface/lib/thermion_flutter_platform_interface.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'thermion_flutter_texture.dart'; @@ -18,7 +18,7 @@ abstract class ThermionFlutterPlatform extends PlatformInterface { _instance = instance; } - AbstractFilamentViewer get viewer; + ThermionViewer get viewer; Future initialize({String? uberArchivePath}); diff --git a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart index 95146667..c5a20055 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart @@ -1,4 +1,4 @@ -import 'package:thermion_dart/thermion_dart/abstract_filament_viewer.dart'; +import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; @@ -25,7 +25,7 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { @override Future initialize({String? uberArchivePath}) async { print("Creating viewer in web plugin"); - viewer = JsInteropFilamentViewer("filamentViewer"); + viewer = JsInteropThermionViewerFFI("filamentViewer"); print("Waiting for initialized"); await viewer.initialized; print("int complete"); @@ -37,5 +37,5 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { @override // TODO: implement viewer - late final AbstractFilamentViewer viewer; + late final ThermionViewer viewer; }