From 3f88598498e575ade8b6e12dc00608f9937c2b58 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sat, 15 Jun 2024 21:24:42 +0800 Subject: [PATCH] doc update --- docs/examples.mdx | 8 + .../Screenshot 2024-06-15 at 8.57.19 PM.png | Bin 0 -> 51581 bytes docs/index.mdx | 18 ++- docs/quickstart.mdx | 145 ++++++++++++++++++ 4 files changed, 165 insertions(+), 6 deletions(-) create mode 100644 docs/examples.mdx create mode 100644 docs/images/Screenshot 2024-06-15 at 8.57.19 PM.png create mode 100644 docs/quickstart.mdx diff --git a/docs/examples.mdx b/docs/examples.mdx new file mode 100644 index 00000000..c6ccb62b --- /dev/null +++ b/docs/examples.mdx @@ -0,0 +1,8 @@ +# Examples +Thermion is a package for creating 3D applications with Dart and/or Flutter. + +## Polyvox + +iOS app + +## Nick Fisher (Personal Website) \ No newline at end of file diff --git a/docs/images/Screenshot 2024-06-15 at 8.57.19 PM.png b/docs/images/Screenshot 2024-06-15 at 8.57.19 PM.png new file mode 100644 index 0000000000000000000000000000000000000000..121bdbf4ef1faf82c5c37f17affca66b07376e3b GIT binary patch literal 51581 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 KwTvr9-v0;EBZI{N literal 0 HcmV?d00001 diff --git a/docs/index.mdx b/docs/index.mdx index 026af7a3..ba36cd7a 100644 --- a/docs/index.mdx +++ b/docs/index.mdx @@ -1,11 +1,17 @@ -# Thermion -Thermion is a package for creating 3D applications with Dart and/or Flutter. +![Thermion Logo](logo.png) + +Thermion is a framework for creating cross-platform 3D applications with Dart and/or Flutter. ## Overview ### Packages  -The two most relevant Thermion packages are:- [thermion_dart], which contains all the code needed to create a viewer, - [thermion_flutter], which is a Flutter-only package that contains all the logic necessary to create/embed a rendering surface inside a Flutter app.  -By decoupling the Flutter-specific components from the Dart-only components, Thermion can be used for rendering in both Flutter and non-Flutter applications. As far as the latter is concerned, Thermion ships with examples for  Javascript/WASM/HTML, and for CLI/headless mode on MacOS.  +Thermion packages are: +- [thermion_dart], which contains all the code needed to create a viewer,  +- [thermion_flutter], which is a Flutter-only package that contains all the logic necessary to create/embed a rendering surface inside a Flutter app.  + +By decoupling the Flutter-specific components from the Dart-only components, Thermion can be used for rendering in both Flutter and non-Flutter applications. + +As far as the latter is concerned, Thermion ships with examples for  Javascript/WASM/HTML, and for CLI/headless mode on MacOS.  ### pubspec.yaml If you are creating a Flutter application, add [thermion_flutter] as a dependency to your `pubspec.yaml`. @@ -27,9 +33,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/docs/quickstart.mdx b/docs/quickstart.mdx new file mode 100644 index 00000000..a14f37ed --- /dev/null +++ b/docs/quickstart.mdx @@ -0,0 +1,145 @@ +## Quickstart (Flutter) + +> You can find the entire project below in the [examples/flutter/quickstart](examples/flutter/quickstart) folder of the repository. + +1. Switch to Flutter master channel + +```bash +$ flutter channel master +``` + +2. Add [thermion_flutter] as a dependency to your `pubspec.yaml`. + +```bash +$ cd /path/to/your/flutter/project$ flutter pub add thermion_flutter``` +``` + +3. If running on MacOS, change the minimum deployment targetr to OSX 13 + +In `Podfile` +``` +platform :osx, '13.0' +``` + +Then open XCode: +``` +open macos/Runner.xcworkspace +``` + +and change the minimum deployment target to 13.0 + +2. Add a folder containing your assets (glTF model + skybox ktx) to your `pubspec.yaml` asset list + +```yaml +... +flutter + uses-material-design: true + assets: + - assets/ +``` + +2. Create an instance of `ThermionFlutterPlugin` in your app. + +```dart +import 'package:thermion_flutter/thermion_flutter.dart'; +... + +class _MyAppState extends State { +  late ThermionFlutterPlugin _thermionFlutterPlugin;  + late Future _thermionViewer; +  void initState() {    + _thermionFlutterPlugin = ThermionFlutterPlugin();    + _thermionViewer = _thermionFlutterPlugin.createViewer();  + } +}``` + +3. Add a `ThermionWidget` to your widget hierarchy + +```dart +class _MyAppState extends State { + + late ThermionFlutterPlugin _thermionFlutterPlugin;  + late Future _thermionViewer; + void initState() {    + _thermionFlutterPlugin = ThermionFlutterPlugin(); + _thermionViewer = _thermionFlutterPlugin.createViewer(); + }    + + Widget build(BuildContext context) { + return Stack(children:[ +     Positioned.fill( + child:ThermionWidget( + plugin:_thermionFlutterPlugin +         )  +     ) +     ]);  +}}``` + +4. Add a button to load the model when pressed + +```dart +class _MyAppState extends State { + + late ThermionFlutterPlugin _thermionFlutterPlugin;  + late Future _thermionViewer; + void initState() {    + _thermionFlutterPlugin = ThermionFlutterPlugin(); + _thermionViewer = _thermionFlutterPlugin.createViewer(); + }    + + Widget build(BuildContext context) { + return Stack(children:[ +     Positioned.fill( + child:ThermionWidget( + plugin:_thermionFlutterPlugin +         )  +     ), + Center(child:ElevatedButton(child:Text("Load"), onPressed:() { + // TODO + })) +     ]);  +}}``` + +5. Load a skybox and the glb asset +``` + Center(child:ElevatedButton(child:Text("Load"), onPressed:() { + var viewer = await _thermionViewer; + await viewer.loadSkybox("assets/default_env_skybox.ktx"); + await viewer.loadGlb("assets/cube.glb"); + })) +``` + +(Note - "skybox" refers to the background (cube) image rendered behind all other elements in the scene). + +Anything added to the scene is referred to as an "entity". + +Entities are always added to the scene at position (0,0,0). + +The default scene camera is located at (0,0,0) (and is looking at -Z, or "into" the screen), so by adding a cube at (0,0,0), the camera will now be inside the cube. + +We need to move the camera outside the cube so it's visible. + +6. Change the camera orientation +```dart + var viewer = await _thermionViewer; + await viewer.loadSkybox("assets/default_env_skybox.ktx"); + await viewer.loadGlb("assets/cube.glb"); + + await viewer.setCameraPosition(0, 1, 10); + await viewer.setCameraRotation(v.Quaternion.axisAngle( + v.Vector3(1, 0, 0), -30 / 180 * pi) * + v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi)); +``` + +The cube still won't be visible until we add a light to the scene and tell Thermion to start rendering. + +7. Add a light and turn rendering on +```dart + ... + await viewer.addLight( + LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1); + await viewer.setRendering(true); + ... +```` + +Your first Thermion project is complete! \ No newline at end of file