From ce71e09f65221399c4f863c794df9c0e9996b4d9 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 4 Jul 2024 16:29:08 +0800 Subject: [PATCH 01/11] fix: shadow JS<->WASM bridge methods --- .../interop/thermion_viewer_dart_bridge.dart | 20 +++++++++++++++++-- .../web/interop/thermion_viewer_js.dart | 2 +- .../web/interop/thermion_viewer_js_shim.dart | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart index 85db072c..4878e0fa 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart @@ -135,8 +135,8 @@ class ThermionViewerJSDartBridge { .loadGlb(path, numInstances: numInstances) .then((entity) => entity.toJS) .catchError((err) { - print("Error: $err"); - }).toJS; + print("Error: $err"); + }).toJS; } @JSExport() @@ -720,4 +720,20 @@ class ThermionViewerJSDartBridge { {JSFunction? callback, bool affectsTransform = false}) { throw UnimplementedError(); } + + @JSExport() + JSPromise setShadowsEnabled(bool enabled) { + return viewer.setShadowsEnabled(enabled).toJS; + } + + @JSExport() + JSPromise setShadowType(int shadowType) { + return viewer.setShadowType(ShadowType.values[shadowType]).toJS; + } + + @JSExport() + JSPromise setSoftShadowOptions( + double penumbraScale, double penumbraRatioScale) { + return viewer.setSoftShadowOptions(penumbraScale, penumbraRatioScale).toJS; + } } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart index 6c924179..18acf36c 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart @@ -829,7 +829,7 @@ class ThermionViewerJS implements ThermionViewer { @override Future setShadowType(ShadowType shadowType) { - return _shim.setShadowType(shadowType).toDart; + return _shim.setShadowType(shadowType.index).toDart; } @override diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart index b7492b4a..3b4fadfd 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart @@ -412,7 +412,7 @@ extension type ThermionViewerJSShim(JSObject _) implements JSObject { @JS('setShadowType') external JSPromise setShadowType( - ShadowType shadowType); + int shadowType); @JS('setSoftShadowOptions') external JSPromise setSoftShadowOptions( From 7418fb867d05a4ec39d3648b49d15c94ec7ba6d9 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 4 Jul 2024 16:29:56 +0800 Subject: [PATCH 02/11] feat: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths --- .../web/interop/thermion_viewer_wasm.dart | 62 ++++++++++++------- .../native/web/src/cpp/ThermionDartWebApi.cpp | 44 ++----------- .../lib/thermion_flutter_web.dart | 2 +- 3 files changed, 47 insertions(+), 61 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index ad867119..7fcaec32 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -35,10 +35,9 @@ extension type _EmscriptenModule(JSObject _) implements JSObject { typedef ThermionViewerImpl = ThermionViewerWasm; - /// -/// A [ThermionViewer] implementation that forwards calls to -/// the (Emscripten-generated) ThermionDart JS module. +/// A [ThermionViewer] implementation that forwards calls to the +/// (Emscripten-generated) ThermionDart JS module. /// class ThermionViewerWasm implements ThermionViewer { late _EmscriptenModule _module; @@ -46,8 +45,36 @@ class ThermionViewerWasm implements ThermionViewer { bool _initialized = false; bool _rendering = false; - ThermionViewerWasm({JSObject? module, String moduleName = "thermion_dart"}) { - _module = module as _EmscriptenModule? ?? window.getProperty<_EmscriptenModule>(moduleName.toJS); + /// + /// Construct an instance of this class by explicitly passing the + /// module instance via the [module] property, or by specifying [moduleName], + /// being the name of the window property where the module has already been + /// loaded. + /// + /// Pass [assetPathPrefix] if you need to prepend a path to all asset paths + /// (e.g. on Flutter where the asset directory /foo is actually shipped under + /// the directory /assets/foo, you would construct this as: + /// + /// final viewer = ThermionViewerWasm(assetPathPrefix:"/assets/") + /// + ThermionViewerWasm( + {JSObject? module, + String moduleName = "thermion_dart", + String? assetPathPrefix}) { + _module = module as _EmscriptenModule? ?? + window.getProperty<_EmscriptenModule>(moduleName.toJS); + if (assetPathPrefix != null) { + _setAssetPathPrefix(assetPathPrefix); + } + } + + void _setAssetPathPrefix(String assetPathPrefix) { + _module.ccall( + "thermion_dart_web_set_asset_path_prefix", + "void", + ["string".toJS].toJS, + [assetPathPrefix.toJS].toJS, + null); } JSNumber? _viewer; @@ -1847,29 +1874,22 @@ class ThermionViewerWasm implements ThermionViewer { // TODO: implement zoomUpdate throw UnimplementedError(); } - + @override Future setShadowType(ShadowType shadowType) async { - _module.ccall( - "set_shadow_type", - "void", - ["void*".toJS, "int".toJS].toJS, - [_viewer!, shadowType.index.toJS].toJS, - null); + _module.ccall("set_shadow_type", "void", ["void*".toJS, "int".toJS].toJS, + [_viewer!, shadowType.index.toJS].toJS, null); } - + @override Future setShadowsEnabled(bool enabled) async { - _module.ccall( - "set_shadows_enabled", - "void", - ["void*".toJS, "bool".toJS].toJS, - [_viewer!, enabled.toJS].toJS, - null); + _module.ccall("set_shadows_enabled", "void", + ["void*".toJS, "bool".toJS].toJS, [_viewer!, enabled.toJS].toJS, null); } - + @override - Future setSoftShadowOptions(double penumbraScale, double penumbraRatioScale) async { + Future setSoftShadowOptions( + double penumbraScale, double penumbraRatioScale) async { _module.ccall( "set_soft_shadow_options", "void", diff --git a/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp b/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp index 09de63d9..3cf255af 100644 --- a/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp +++ b/thermion_dart/native/web/src/cpp/ThermionDartWebApi.cpp @@ -15,37 +15,6 @@ #include #include -class PendingCall -{ -public: - PendingCall() - { - } - ~PendingCall() {} - - void Wait() - { - std::future accumulate_future = prom.get_future(); - std::cout << "Loaded asset from Flutter of length " << accumulate_future.get() << std::endl; - } - - void HandleResponse(void* data, int32_t length) - { - this->data = data; - this->length = length; - prom.set_value(length); - } -void* data = nullptr; -int32_t length = 0; - -private: - std::mutex mutex_; - std::condition_variable cv_; - bool notified_ = false; - std::promise prom; - -}; - using emscripten::val; extern "C" @@ -60,8 +29,10 @@ extern "C" // return 0; // } - EMSCRIPTEN_KEEPALIVE void thermion_filament_web_load_resource_callback(void* data, int32_t length, void* context) { - ((PendingCall*)context)->HandleResponse(data, length); + std::string _assetPathPrefix; + + EMSCRIPTEN_KEEPALIVE void thermion_dart_web_set_asset_path_prefix(const char* prefix) { + _assetPathPrefix = std::string(prefix); } EMSCRIPTEN_KEEPALIVE EMSCRIPTEN_WEBGL_CONTEXT_HANDLE thermion_dart_web_create_gl_context() { @@ -160,7 +131,7 @@ extern "C" // memcpy(data, request->data, request->numBytes); // emscripten_fetch_close(request); // return ResourceBuffer { data, (int32_t) request->numBytes, _lastResourceId } ; - auto pathString = std::string(path); + auto pathString = _assetPathPrefix + std::string(path); void* data = nullptr; int32_t numBytes = 0; @@ -199,12 +170,10 @@ extern "C" EM_ASM({ var filename = UTF8ToString($0); var data = new Uint8Array(HEAPU8.subarray($1, $1 + $2)); - console.log('Analyinzg /indexed'); // Ensure the '/indexed' directory exists if (!FS.analyzePath('/indexed').exists) { FS.mkdir('/indexed'); - console.log('Made dir /indexed'); } // Create all parent directories @@ -214,13 +183,10 @@ extern "C" currentPath += '/' + parts[i]; if (!FS.analyzePath(currentPath).exists) { FS.mkdir(currentPath); - console.log("Made dir " + currentPath); } } - console.log('Writing file to /indexed/' + filename); // Write the file FS.writeFile('/indexed/' + filename, data); - console.log('File written, syncing'); FS.syncfs(false, function (err) { if (err) { 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 5cad8d52..4a097bc0 100644 --- a/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart +++ b/thermion_flutter/thermion_flutter_web/lib/thermion_flutter_web.dart @@ -35,7 +35,7 @@ class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { var width = window.innerWidth; var height = window.innerHeight; - var viewer = ThermionViewerWasm(); + var viewer = ThermionViewerWasm(assetPathPrefix: "/assets/"); await viewer.initialize(width, height, uberArchivePath: uberArchivePath); return viewer; } From cde3af08aa574bdcf44864cea4474ba2cc3f7b5f Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 4 Jul 2024 21:49:13 +0800 Subject: [PATCH 03/11] fix: web/JS bool checks need to compare to int --- .../interop/thermion_viewer_dart_bridge.dart | 18 +++--- .../web/interop/thermion_viewer_js.dart | 12 ++-- .../web/interop/thermion_viewer_wasm.dart | 62 +++++++++++-------- .../lib/thermion_flutter_ffi.dart | 4 +- 4 files changed, 56 insertions(+), 40 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart index 4878e0fa..c0687c52 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart @@ -2,6 +2,7 @@ library thermion_flutter_js; import 'dart:js_interop'; +import 'package:logging/logging.dart'; import 'package:thermion_dart/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart'; import 'package:vector_math/vector_math_64.dart' as v64; @@ -21,6 +22,7 @@ import 'package:vector_math/vector_math_64.dart'; /// @JSExport() class ThermionViewerJSDartBridge { + final _logger = Logger("ThermionViewerJSDartBridge"); final ThermionViewer viewer; ThermionViewerJSDartBridge(this.viewer); @@ -76,7 +78,7 @@ class ThermionViewerJSDartBridge { @JSExport() JSPromise loadIbl(String lightingPath, double intensity) { - print("Loading IBL from $lightingPath with intensity $intensity"); + _logger.info("Loading IBL from $lightingPath with intensity $intensity"); return viewer.loadIbl(lightingPath, intensity: intensity).toJS; } @@ -130,12 +132,12 @@ class ThermionViewerJSDartBridge { @JSExport() JSPromise loadGlb(String path, {int numInstances = 1}) { - print("Loading GLB from path $path with numInstances $numInstances"); + _logger.info("Loading GLB from path $path with numInstances $numInstances"); return viewer .loadGlb(path, numInstances: numInstances) .then((entity) => entity.toJS) .catchError((err) { - print("Error: $err"); + _logger.info("Error: $err"); }).toJS; } @@ -253,13 +255,13 @@ class ThermionViewerJSDartBridge { targetMeshNames: targetMeshNamesDart, ) .onError((err, st) { - print("ERROR SETTING MORPH ANIMATION DATA : $err\n$st"); + _logger.severe("ERROR SETTING MORPH ANIMATION DATA : $err\n$st"); return null; }); return result.toJS; } catch (err, st) { - print(err); - print(st); + _logger.severe(err); + _logger.severe(st); rethrow; } } @@ -618,7 +620,7 @@ class ThermionViewerJSDartBridge { ) .then((entities) => entities.map((entity) => entity.toJS).toList().toJS) .onError((e, st) async { - print("Error : $e\n$st"); + _logger.severe("Error : $e\n$st"); return [].toJS; }).toJS; } @@ -632,7 +634,7 @@ class ThermionViewerJSDartBridge { ) .then((entity) => entity.toJS) .onError((e, st) async { - print("Error getChildEntity : $e\n$st"); + _logger.severe("Error getChildEntity : $e\n$st"); return 0.toJS; }).toJS; } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart index 18acf36c..83919eb4 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart @@ -3,6 +3,7 @@ import 'dart:js_interop_unsafe'; import 'dart:math'; import 'package:animation_tools_dart/animation_tools_dart.dart'; +import 'package:logging/logging.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; @@ -15,6 +16,7 @@ import 'thermion_viewer_js_shim.dart'; /// a corresponding Javascript shim implementation (see [ThermionViewerJSShim]). /// class ThermionViewerJS implements ThermionViewer { + final _logger = Logger("ThermionViewerJS"); late final ThermionViewerJSShim _shim; ThermionViewerJS.fromGlobalProperty(String globalPropertyName) { @@ -282,8 +284,8 @@ class ThermionViewerJS implements ThermionViewer { targetMeshNamesJS, animation.frameLengthInMs) .toDart; } catch (err, st) { - print(err); - print(st); + _logger.severe(err); + _logger.severe(st); rethrow; } } @@ -826,17 +828,17 @@ class ThermionViewerJS implements ThermionViewer { void onDispose(Future Function() callback) { _onDispose.add(callback); } - + @override Future setShadowType(ShadowType shadowType) { return _shim.setShadowType(shadowType.index).toDart; } - + @override Future setShadowsEnabled(bool enabled) { return _shim.setShadowsEnabled(enabled).toDart; } - + @override Future setSoftShadowOptions(double penumbraScale, double penumbraRatioScale) { return _shim.setSoftShadowOptions(penumbraScale, penumbraRatioScale).toDart; diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index 7fcaec32..c27d5e40 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -4,6 +4,7 @@ import 'dart:js_interop_unsafe'; import 'dart:math'; import 'dart:typed_data' as td; import 'dart:typed_data'; +import 'package:logging/logging.dart'; import 'package:thermion_dart/thermion_dart/scene.dart'; import 'package:web/web.dart'; import 'package:animation_tools_dart/animation_tools_dart.dart'; @@ -40,6 +41,8 @@ typedef ThermionViewerImpl = ThermionViewerWasm; /// (Emscripten-generated) ThermionDart JS module. /// class ThermionViewerWasm implements ThermionViewer { + final _logger = Logger("ThermionViewerWasm"); + late _EmscriptenModule _module; bool _initialized = false; @@ -812,7 +815,7 @@ class ThermionViewerWasm implements ThermionViewer { var meshEntity = meshEntities[i]; if (targetMeshNames?.contains(meshName) == false) { - // print("Skipping $meshName, not contained in target"); + // _logger.info("Skipping $meshName, not contained in target"); continue; } @@ -820,7 +823,7 @@ class ThermionViewerWasm implements ThermionViewer { var meshMorphTargets = await getMorphTargetNames(entity, meshEntity); - print("Got mesh morph targets ${meshMorphTargets}"); + _logger.info("Got mesh morph targets ${meshMorphTargets}"); var intersection = animation.morphTargets .toSet() @@ -862,35 +865,42 @@ class ThermionViewerWasm implements ThermionViewer { // Copy the morph indices to WASM _module.writeArrayToMemory( idxList.buffer.asUint8List(idxList.offsetInBytes).toJS, idxPtr); - - var result = _module.ccall( - "set_morph_animation", - "bool", - [ - "void*".toJS, - "int".toJS, - "float*".toJS, - "int*".toJS, - "int".toJS, - "int".toJS, - "float".toJS - ].toJS, - [ - _sceneManager!, - meshEntity.toJS, - dataPtr, - idxPtr, - indices.length.toJS, - animation.numFrames.toJS, - animation.frameLengthInMs.toJS - ].toJS, - null) as JSBoolean; + bool result = false; + try { + var jsResult = _module.ccall( + "set_morph_animation", + "bool", + [ + "void*".toJS, + "int".toJS, + "float*".toJS, + "int*".toJS, + "int".toJS, + "int".toJS, + "float".toJS + ].toJS, + [ + _sceneManager!, + meshEntity.toJS, + dataPtr, + idxPtr, + indices.length.toJS, + animation.numFrames.toJS, + animation.frameLengthInMs.toJS + ].toJS, + null); + _logger.info("Got jsResult $jsResult"); + result = (jsResult as JSNumber).toDartInt == 1; + } catch (err, st) { + _logger.severe(err); + _logger.severe(st); + } // Free the memory allocated in WASM _module._free(dataPtr); _module._free(idxPtr); - if (!result.toDart) { + if (!result) { throw Exception("Failed to set morph animation data for ${meshName}"); } } 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 c34e3fea..805fe622 100644 --- a/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart +++ b/thermion_flutter/thermion_flutter_ffi/lib/thermion_flutter_ffi.dart @@ -5,6 +5,7 @@ import 'package:thermion_dart/thermion_dart.dart'; import 'package:thermion_dart/thermion_dart/thermion_viewer_ffi.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dart'; +import 'package:logging/logging.dart'; /// /// An implementation of [ThermionFlutterPlatform] that uses a Flutter platform @@ -13,6 +14,7 @@ import 'package:thermion_flutter_platform_interface/thermion_flutter_texture.dar /// class ThermionFlutterFFI extends ThermionFlutterPlatform { final _channel = const MethodChannel("dev.thermion.flutter/event"); + final _logger = Logger("ThermionFlutterFFI"); ThermionViewerFFI? _viewer; @@ -133,7 +135,7 @@ class ThermionFlutterFFI extends ThermionFlutterPlatform { final hardwareTextureId = result[1] as int?; final surfaceAddress = result[2] as int?; - print( + _logger.info( "Created texture with flutter texture id ${flutterTextureId}, hardwareTextureId $hardwareTextureId and surfaceAddress $surfaceAddress"); _viewer?.viewportDimensions = (width.toDouble(), height.toDouble()); From 7b3ad027bf5dcad5415baf4b6252e0a034621229 Mon Sep 17 00:00:00 2001 From: Paul Ampadu <89813338+payl-ampa@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:59:27 -0700 Subject: [PATCH 04/11] Update quickstart.mdx --- docs/quickstart.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx index 1e00d479..5db09ae4 100644 --- a/docs/quickstart.mdx +++ b/docs/quickstart.mdx @@ -40,7 +40,7 @@ and change the minimum deployment target to 13.0: -See the [/windows](/Windows) page for steps needed to build on Windows. +See the [/windows](/windows) page for steps needed to build on Windows. From 7704a06601dab0d183b4aa776d5671f69dc22767 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 11 Jul 2024 20:50:31 +1000 Subject: [PATCH 05/11] fix: manually remove leading slash for compiler path on Windows when building for Android --- thermion_dart/hook/build.dart | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/thermion_dart/hook/build.dart b/thermion_dart/hook/build.dart index 25a1bad1..830ac0d4 100644 --- a/thermion_dart/hook/build.dart +++ b/thermion_dart/hook/build.dart @@ -176,9 +176,17 @@ void main(List args) async { Architecture.ia32 => "i686-linux-android", _ => throw FormatException('Invalid') }; - var ndkRoot = File(config.cCompiler.compiler!.path).parent.parent.path; + + var compilerPath = config.cCompiler.compiler!.path; + + if(Platform.isWindows && compilerPath.startsWith("/")) { + compilerPath = compilerPath.substring(1); + } + + var ndkRoot = File(compilerPath).parent.parent.uri.toFilePath(windows:true); + var stlPath = - File("$ndkRoot/sysroot/usr/lib/${archExtension}/libc++_shared.so"); + File([ndkRoot, "sysroot", "usr", "lib", archExtension, "libc++_shared.so"].join(Platform.pathSeparator)); output.addAsset(NativeCodeAsset( package: "thermion_dart", name: "libc++_shared.so", From 3597077d397bcd9c1ffac78d71491b82724ce670 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 11 Jul 2024 19:00:36 +0800 Subject: [PATCH 06/11] chore(release): publish packages - thermion_dart@0.1.2 - thermion_flutter_ffi@0.1.0+10 - thermion_flutter_web@0.0.2 - thermion_flutter@0.1.1+11 - thermion_flutter_platform_interface@0.1.0+10 --- CHANGELOG.md | 43 +++++++++++++++++++ thermion_dart/CHANGELOG.md | 7 +++ thermion_dart/pubspec.yaml | 2 +- .../thermion_flutter/CHANGELOG.md | 4 ++ .../thermion_flutter/pubspec.yaml | 10 ++--- .../thermion_flutter_ffi/CHANGELOG.md | 4 ++ .../thermion_flutter_ffi/pubspec.yaml | 6 +-- .../CHANGELOG.md | 4 ++ .../pubspec.yaml | 4 +- .../thermion_flutter_web/CHANGELOG.md | 4 ++ .../thermion_flutter_web/pubspec.yaml | 6 +-- 11 files changed, 80 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f31ef909..ec821d60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,49 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-07-11 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`thermion_dart` - `v0.1.2`](#thermion_dart---v012) + - [`thermion_flutter_ffi` - `v0.1.0+10`](#thermion_flutter_ffi---v01010) + - [`thermion_flutter_web` - `v0.0.2`](#thermion_flutter_web---v002) + - [`thermion_flutter` - `v0.1.1+11`](#thermion_flutter---v01111) + - [`thermion_flutter_platform_interface` - `v0.1.0+10`](#thermion_flutter_platform_interface---v01010) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `thermion_flutter` - `v0.1.1+11` + - `thermion_flutter_platform_interface` - `v0.1.0+10` + +--- + +#### `thermion_dart` - `v0.1.2` + + - **FIX**: manually remove leading slash for compiler path on Windows when building for Android. + - **FIX**: web/JS bool checks need to compare to int. + - **FIX**: shadow JS<->WASM bridge methods. + - **FEAT**: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths. + +#### `thermion_flutter_ffi` - `v0.1.0+10` + + - **FIX**: web/JS bool checks need to compare to int. + +#### `thermion_flutter_web` - `v0.0.2` + + - **FEAT**: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths. + + ## 2024-07-04 ### Changes diff --git a/thermion_dart/CHANGELOG.md b/thermion_dart/CHANGELOG.md index 31b73847..1ee6c0c6 100644 --- a/thermion_dart/CHANGELOG.md +++ b/thermion_dart/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.1.2 + + - **FIX**: manually remove leading slash for compiler path on Windows when building for Android. + - **FIX**: web/JS bool checks need to compare to int. + - **FIX**: shadow JS<->WASM bridge methods. + - **FEAT**: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths. + ## 0.1.1+5 - Bump "thermion_dart" to `0.1.1+5`. diff --git a/thermion_dart/pubspec.yaml b/thermion_dart/pubspec.yaml index f11c65e8..a55f7fed 100644 --- a/thermion_dart/pubspec.yaml +++ b/thermion_dart/pubspec.yaml @@ -1,6 +1,6 @@ name: thermion_dart description: 3D rendering toolkit for Dart. -version: 0.1.1+5 +version: 0.1.2 homepage: https://thermion.dev repository: https://github.com/nmfisher/thermion diff --git a/thermion_flutter/thermion_flutter/CHANGELOG.md b/thermion_flutter/thermion_flutter/CHANGELOG.md index 286ae409..d487a92c 100644 --- a/thermion_flutter/thermion_flutter/CHANGELOG.md +++ b/thermion_flutter/thermion_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.1+11 + + - Update a dependency to the latest release. + ## 0.1.1+10 - Update a dependency to the latest release. diff --git a/thermion_flutter/thermion_flutter/pubspec.yaml b/thermion_flutter/thermion_flutter/pubspec.yaml index d0aafd22..744332b2 100644 --- a/thermion_flutter/thermion_flutter/pubspec.yaml +++ b/thermion_flutter/thermion_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: thermion_flutter description: Flutter plugin for 3D rendering with the Thermion toolkit. -version: 0.1.1+10 +version: 0.1.1+11 homepage: https://thermion.dev repository: https://github.com/nmfisher/thermion @@ -17,10 +17,10 @@ dependencies: plugin_platform_interface: ^2.0.0 ffi: ^2.1.2 animation_tools_dart: ^0.0.4 - thermion_dart: ^0.1.1+5 - thermion_flutter_platform_interface: ^0.1.0+9 - thermion_flutter_ffi: ^0.1.0+9 - thermion_flutter_web: ^0.0.1+9 + thermion_dart: ^0.1.2 + thermion_flutter_platform_interface: ^0.1.0+10 + thermion_flutter_ffi: ^0.1.0+10 + thermion_flutter_web: ^0.0.2 logging: ^1.2.0 dev_dependencies: diff --git a/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md b/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md index e1669ac6..480480f8 100644 --- a/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md +++ b/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0+10 + + - **FIX**: web/JS bool checks need to compare to int. + ## 0.1.0+9 - Update a dependency to the latest release. diff --git a/thermion_flutter/thermion_flutter_ffi/pubspec.yaml b/thermion_flutter/thermion_flutter_ffi/pubspec.yaml index e1510337..13c235c0 100644 --- a/thermion_flutter/thermion_flutter_ffi/pubspec.yaml +++ b/thermion_flutter/thermion_flutter_ffi/pubspec.yaml @@ -1,7 +1,7 @@ name: thermion_flutter_ffi description: An FFI interface for the thermion_flutter plugin (all platforms except web). repository: https://github.com/nmfisher/thermion_flutter/thermion_flutter -version: 0.1.0+9 +version: 0.1.0+10 environment: sdk: ">=3.3.0 <4.0.0" @@ -22,8 +22,8 @@ dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.1.0 - thermion_flutter_platform_interface: ^0.1.0+9 - thermion_dart: ^0.1.1+5 + thermion_flutter_platform_interface: ^0.1.0+10 + thermion_dart: ^0.1.2 dev_dependencies: flutter_test: diff --git a/thermion_flutter/thermion_flutter_platform_interface/CHANGELOG.md b/thermion_flutter/thermion_flutter_platform_interface/CHANGELOG.md index 6dc804a1..5273874b 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/CHANGELOG.md +++ b/thermion_flutter/thermion_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0+10 + + - Update a dependency to the latest release. + ## 0.1.0+9 - Update a dependency to the latest release. diff --git a/thermion_flutter/thermion_flutter_platform_interface/pubspec.yaml b/thermion_flutter/thermion_flutter_platform_interface/pubspec.yaml index 83edaab4..c8f7759d 100644 --- a/thermion_flutter/thermion_flutter_platform_interface/pubspec.yaml +++ b/thermion_flutter/thermion_flutter_platform_interface/pubspec.yaml @@ -1,7 +1,7 @@ name: thermion_flutter_platform_interface description: A common platform interface for the thermion_flutter plugin. repository: https://github.com/nmfisher/thermion_flutter/thermion_flutter -version: 0.1.0+9 +version: 0.1.0+10 environment: sdk: ">=3.3.0 <4.0.0" @@ -11,7 +11,7 @@ dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.1.0 - thermion_dart: ^0.1.1+5 + thermion_dart: ^0.1.2 dev_dependencies: flutter_test: diff --git a/thermion_flutter/thermion_flutter_web/CHANGELOG.md b/thermion_flutter/thermion_flutter_web/CHANGELOG.md index 9db916ef..806af668 100644 --- a/thermion_flutter/thermion_flutter_web/CHANGELOG.md +++ b/thermion_flutter/thermion_flutter_web/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.2 + + - **FEAT**: allow passing assetPathPrefix to ThermionViewerWasm to account for Flutter build asset paths. + ## 0.0.1+9 - Update a dependency to the latest release. diff --git a/thermion_flutter/thermion_flutter_web/pubspec.yaml b/thermion_flutter/thermion_flutter_web/pubspec.yaml index de25ec8f..a6571e4d 100644 --- a/thermion_flutter/thermion_flutter_web/pubspec.yaml +++ b/thermion_flutter/thermion_flutter_web/pubspec.yaml @@ -1,7 +1,7 @@ name: thermion_flutter_web description: A web platform interface for the thermion_flutter plugin. repository: https://github.com/nmfisher/thermion_flutter/thermion_flutter -version: 0.0.1+9 +version: 0.0.2 environment: sdk: ">=3.3.0 <4.0.0" @@ -20,8 +20,8 @@ dependencies: sdk: flutter plugin_platform_interface: ^2.1.0 web: ^0.5.1 - thermion_dart: ^0.1.1+5 - thermion_flutter_platform_interface: ^0.1.0+9 + thermion_dart: ^0.1.2 + thermion_flutter_platform_interface: ^0.1.0+10 flutter_web_plugins: sdk: flutter From 8b413eca52bd412b086a8fde94ddaae4df0b33bf Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 11 Jul 2024 19:03:57 +0800 Subject: [PATCH 07/11] fix: add logging dependency --- thermion_flutter/thermion_flutter_ffi/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/thermion_flutter/thermion_flutter_ffi/pubspec.yaml b/thermion_flutter/thermion_flutter_ffi/pubspec.yaml index 13c235c0..f62ad55e 100644 --- a/thermion_flutter/thermion_flutter_ffi/pubspec.yaml +++ b/thermion_flutter/thermion_flutter_ffi/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: plugin_platform_interface: ^2.1.0 thermion_flutter_platform_interface: ^0.1.0+10 thermion_dart: ^0.1.2 + logging: ^1.2.0 dev_dependencies: flutter_test: From 1df732be7c5a9a199ae97a385efb9e84a7ea8ca9 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 11 Jul 2024 19:04:06 +0800 Subject: [PATCH 08/11] chore(release): publish packages - thermion_flutter_ffi@0.1.0+11 - thermion_flutter@0.1.1+12 --- CHANGELOG.md | 28 +++++++++++++++++++ .../thermion_flutter/CHANGELOG.md | 4 +++ .../thermion_flutter/pubspec.yaml | 4 +-- .../thermion_flutter_ffi/CHANGELOG.md | 4 +++ .../thermion_flutter_ffi/pubspec.yaml | 2 +- 5 files changed, 39 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec821d60..ac928ed6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,34 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2024-07-11 + +### Changes + +--- + +Packages with breaking changes: + + - There are no breaking changes in this release. + +Packages with other changes: + + - [`thermion_flutter_ffi` - `v0.1.0+11`](#thermion_flutter_ffi---v01011) + - [`thermion_flutter` - `v0.1.1+12`](#thermion_flutter---v01112) + +Packages with dependency updates only: + +> Packages listed below depend on other packages in this workspace that have had changes. Their versions have been incremented to bump the minimum dependency versions of the packages they depend upon in this project. + + - `thermion_flutter` - `v0.1.1+12` + +--- + +#### `thermion_flutter_ffi` - `v0.1.0+11` + + - **FIX**: add logging dependency. + + ## 2024-07-11 ### Changes diff --git a/thermion_flutter/thermion_flutter/CHANGELOG.md b/thermion_flutter/thermion_flutter/CHANGELOG.md index d487a92c..60d03535 100644 --- a/thermion_flutter/thermion_flutter/CHANGELOG.md +++ b/thermion_flutter/thermion_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.1+12 + + - Update a dependency to the latest release. + ## 0.1.1+11 - Update a dependency to the latest release. diff --git a/thermion_flutter/thermion_flutter/pubspec.yaml b/thermion_flutter/thermion_flutter/pubspec.yaml index 744332b2..9ba7db35 100644 --- a/thermion_flutter/thermion_flutter/pubspec.yaml +++ b/thermion_flutter/thermion_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: thermion_flutter description: Flutter plugin for 3D rendering with the Thermion toolkit. -version: 0.1.1+11 +version: 0.1.1+12 homepage: https://thermion.dev repository: https://github.com/nmfisher/thermion @@ -19,7 +19,7 @@ dependencies: animation_tools_dart: ^0.0.4 thermion_dart: ^0.1.2 thermion_flutter_platform_interface: ^0.1.0+10 - thermion_flutter_ffi: ^0.1.0+10 + thermion_flutter_ffi: ^0.1.0+11 thermion_flutter_web: ^0.0.2 logging: ^1.2.0 diff --git a/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md b/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md index 480480f8..66fdcac0 100644 --- a/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md +++ b/thermion_flutter/thermion_flutter_ffi/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0+11 + + - **FIX**: add logging dependency. + ## 0.1.0+10 - **FIX**: web/JS bool checks need to compare to int. diff --git a/thermion_flutter/thermion_flutter_ffi/pubspec.yaml b/thermion_flutter/thermion_flutter_ffi/pubspec.yaml index f62ad55e..e29bc0bd 100644 --- a/thermion_flutter/thermion_flutter_ffi/pubspec.yaml +++ b/thermion_flutter/thermion_flutter_ffi/pubspec.yaml @@ -1,7 +1,7 @@ name: thermion_flutter_ffi description: An FFI interface for the thermion_flutter plugin (all platforms except web). repository: https://github.com/nmfisher/thermion_flutter/thermion_flutter -version: 0.1.0+10 +version: 0.1.0+11 environment: sdk: ">=3.3.0 <4.0.0" From d7457126509dabbcd1a5c0caec72d623f6e5117f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Hulterg=C3=A5rd?= Date: Sun, 14 Jul 2024 09:32:51 +0200 Subject: [PATCH 09/11] Add example files that can be parsed by pub.dev --- thermion_dart/example/README.md | 1 + .../thermion_flutter/example/README.md | 96 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 thermion_dart/example/README.md create mode 100644 thermion_flutter/thermion_flutter/example/README.md diff --git a/thermion_dart/example/README.md b/thermion_dart/example/README.md new file mode 100644 index 00000000..b7895dd9 --- /dev/null +++ b/thermion_dart/example/README.md @@ -0,0 +1 @@ +For an example with both pure Dart and Flutter, see the [example repository](https://github.com/nmfisher/thermion_examples). \ No newline at end of file diff --git a/thermion_flutter/thermion_flutter/example/README.md b/thermion_flutter/thermion_flutter/example/README.md new file mode 100644 index 00000000..0ba3c8cd --- /dev/null +++ b/thermion_flutter/thermion_flutter/example/README.md @@ -0,0 +1,96 @@ +For a more thorough example with both Flutter and pure Dart, see the [example repository](https://github.com/nmfisher/thermion_examples). + +[flutter/quickstart/lib/main.dart](https://github.com/nmfisher/thermion_examples/blob/master/flutter/quickstart/lib/main.dart) + +```dart +import 'package:flutter/material.dart'; +import 'package:thermion_flutter/thermion_flutter.dart'; + +import 'package:vector_math/vector_math_64.dart' as v; +import 'dart:math'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + useMaterial3: true, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + bool _loaded = false; + ThermionViewer? _thermionViewer; + + @override + void initState() { + super.initState(); + } + + Future _load() async { + var viewer = await ThermionFlutterPlugin.createViewer(); + _thermionViewer = viewer; + _thermionViewer!.loadSkybox("assets/default_env_skybox.ktx"); + _thermionViewer!.loadGlb("assets/cube.glb"); + + _thermionViewer!.setCameraPosition(0, 1, 10); + _thermionViewer!.setCameraRotation( + v.Quaternion.axisAngle(v.Vector3(1, 0, 0), -30 / 180 * pi) * + v.Quaternion.axisAngle(v.Vector3(0, 1, 0), 15 / 180 * pi)); + _thermionViewer!.addLight(LightType.SUN, 7500, 50000, 0, 0, 0, 1, -1, -1); + _thermionViewer!.setRendering(true); + _loaded = true; + + setState(() {}); + } + + Future _unload() async { + var viewer = _thermionViewer!; + _thermionViewer = null; + setState(() {}); + await viewer.dispose(); + _loaded = false; + setState(() {}); + } + + Widget _loadButton() { + return Center( + child: ElevatedButton(child: const Text("Load"), onPressed: _load)); + } + + Widget _unloadButton() { + return Center( + child: ElevatedButton(child: const Text("Unload"), onPressed: _unload)); + } + + @override + Widget build(BuildContext context) { + return Stack(children: [ + if (_thermionViewer != null) + Positioned.fill(child: ThermionWidget(viewer: _thermionViewer!)), + if (!_loaded) _loadButton(), + if (_loaded) _unloadButton(), + ]); + } +} +``` + From 41bf9ededadee19d648fcbc8c0a9ea156cd7f6f9 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 23 Jul 2024 09:37:08 +0800 Subject: [PATCH 10/11] feat: add clearMorphAnimationData function --- .../compatibility/native/thermion_dart.g.dart | 6 ++++++ .../interop/thermion_viewer_dart_bridge.dart | 5 +++++ .../web/interop/thermion_viewer_js.dart | 5 +++++ .../web/interop/thermion_viewer_js_shim.dart | 21 +++++++++---------- .../web/interop/thermion_viewer_wasm.dart | 21 +++++++++++++++++++ .../lib/thermion_dart/thermion_viewer.dart | 6 ++++++ .../thermion_dart/thermion_viewer_ffi.dart | 12 +++++++++++ .../thermion_dart/thermion_viewer_stub.dart | 11 +++++++--- thermion_dart/native/include/SceneManager.hpp | 3 +++ .../native/include/ThermionDartApi.h | 3 +++ thermion_dart/native/src/SceneManager.cpp | 21 +++++++++++++++++++ thermion_dart/native/src/ThermionDartApi.cpp | 6 +++++- 12 files changed, 105 insertions(+), 15 deletions(-) diff --git a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart index b2822241..b3e31df0 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/native/thermion_dart.g.dart @@ -368,6 +368,12 @@ external bool set_morph_animation( double frameLengthInMs, ); +@ffi.Native, ffi.Int)>() +external void clear_morph_animation( + ffi.Pointer sceneManager, + int entity, +); + @ffi.Native, ffi.Int)>() external void reset_to_rest_pose( ffi.Pointer sceneManager, diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart index c0687c52..1e61f578 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart @@ -226,6 +226,11 @@ class ThermionViewerJSDartBridge { .then((v) => v.toJS) .toJS; + @JSExport() + void clearMorphAnimationData(ThermionEntity entity) { + viewer.clearMorphAnimationData(entity); + } + @JSExport() JSPromise setMorphAnimationData( ThermionEntity entity, diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart index 83919eb4..f9326926 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart @@ -263,6 +263,11 @@ class ThermionViewerJS implements ThermionViewer { .toDartDouble; } + @override + Future clearMorphAnimationData(ThermionEntity entity) async { + _shim.clearMorphAnimationData(entity); + } + @override Future setMorphAnimationData( ThermionEntity entity, MorphAnimationData animation, diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart index 3b4fadfd..b6d5e2ad 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js_shim.dart @@ -6,11 +6,10 @@ import 'dart:js_interop'; import 'package:thermion_dart/thermion_dart/thermion_viewer.dart'; /// -/// An extension type on [JSObject] that represents a +/// An extension type on [JSObject] that represents a /// Javascript shim implementation of the [ThermionViewer] interface. -/// +/// extension type ThermionViewerJSShim(JSObject _) implements JSObject { - @JS('initialized') external JSPromise get initialized; @@ -136,6 +135,9 @@ extension type ThermionViewerJSShim(JSObject _) implements JSObject { external JSPromise getAnimationDuration( ThermionEntity entity, int animationIndex); + @JS('clearMorphAnimationData') + external void clearMorphAnimationData(ThermionEntity entity); + @JS('setMorphAnimationData') external JSPromise setMorphAnimationData( ThermionEntity entity, @@ -403,19 +405,16 @@ extension type ThermionViewerJSShim(JSObject _) implements JSObject { ThermionEntity entity, JSArray transform); @JS('setBoneTransform') - external JSPromise setBoneTransform( - ThermionEntity entity, int boneIndex, JSArray transform, int skinIndex); - + external JSPromise setBoneTransform(ThermionEntity entity, int boneIndex, + JSArray transform, int skinIndex); + @JS('setShadowsEnabled') - external JSPromise setShadowsEnabled( - bool enabled); + external JSPromise setShadowsEnabled(bool enabled); @JS('setShadowType') - external JSPromise setShadowType( - int shadowType); + external JSPromise setShadowType(int shadowType); @JS('setSoftShadowOptions') external JSPromise setSoftShadowOptions( double penumbraScale, double penumbraRatioScale); } - diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index c27d5e40..50edbd25 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -788,6 +788,27 @@ class ThermionViewerWasm implements ThermionViewer { null); } + @override + Future clearMorphAnimationData( + ThermionEntity entity) async { + var meshEntities = await getChildEntities(entity, false); + for(final childEntity in meshEntities) { + _module.ccall( + "clear_morph_animation", + "void", + [ + "void*".toJS, + "int".toJS, + ].toJS, + [ + _sceneManager!, + childEntity.toJS, + ].toJS, + null); + } + + } + @override Future setMorphAnimationData( ThermionEntity entity, MorphAnimationData animation, diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer.dart b/thermion_dart/lib/thermion_dart/thermion_viewer.dart index 6f622bd3..8643c8b9 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer.dart @@ -269,6 +269,12 @@ abstract class ThermionViewer { ThermionEntity entity, MorphAnimationData animation, {List? targetMeshNames}); + /// + /// Clear all current morph animations for [entity]. + /// + Future clearMorphAnimationData( + ThermionEntity entity); + /// /// Resets all bones in the given entity to their rest pose. /// This should be done before every call to addBoneAnimation. diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart index 8aecbc0c..200d2495 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_ffi.dart @@ -599,6 +599,18 @@ class ThermionViewerFFI extends ThermionViewer { return getAnimationDuration(entity, index); } + Future clearMorphAnimationData(ThermionEntity entity) async { + var meshEntities = await getChildEntities(entity, true); + + for(final childEntity in meshEntities) { + clear_morph_animation( + _sceneManager!, + childEntity); + } + + + } + /// /// /// diff --git a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart index cde3d073..754d1f93 100644 --- a/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart +++ b/thermion_dart/lib/thermion_dart/thermion_viewer_stub.dart @@ -586,6 +586,11 @@ class ThermionViewerStub extends ThermionViewer { throw UnimplementedError(); } + @override + Future clearMorphAnimationData(ThermionEntity entity) { + throw UnimplementedError(); + } + @override Future setMorphAnimationData( ThermionEntity entity, MorphAnimationData animation, @@ -726,19 +731,19 @@ class ThermionViewerStub extends ThermionViewer { // TODO: implement zoomUpdate throw UnimplementedError(); } - + @override Future setShadowType(ShadowType shadowType) { // TODO: implement setShadowType throw UnimplementedError(); } - + @override Future setShadowsEnabled(bool enabled) { // TODO: implement setShadowsEnabled throw UnimplementedError(); } - + @override Future setSoftShadowOptions(double penumbraScale, double penumbraRatioScale) { // TODO: implement setSoftShadowOptions diff --git a/thermion_dart/native/include/SceneManager.hpp b/thermion_dart/native/include/SceneManager.hpp index 484b75d2..81a366ed 100644 --- a/thermion_dart/native/include/SceneManager.hpp +++ b/thermion_dart/native/include/SceneManager.hpp @@ -87,6 +87,9 @@ namespace thermion_filament int numFrames, float frameLengthInMs); + void clearMorphAnimationBuffer( + EntityId entityId); + bool setMorphTargetWeights(EntityId entityId, const float *const weights, int count); math::mat4f getLocalTransform(EntityId entityId); diff --git a/thermion_dart/native/include/ThermionDartApi.h b/thermion_dart/native/include/ThermionDartApi.h index 041d342e..66ed4ea5 100644 --- a/thermion_dart/native/include/ThermionDartApi.h +++ b/thermion_dart/native/include/ThermionDartApi.h @@ -136,6 +136,9 @@ extern "C" int numMorphTargets, int numFrames, float frameLengthInMs); + EMSCRIPTEN_KEEPALIVE void clear_morph_animation( + void *sceneManager, + EntityId entity); EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose( void *sceneManager, diff --git a/thermion_dart/native/src/SceneManager.cpp b/thermion_dart/native/src/SceneManager.cpp index 2329492f..8165e204 100644 --- a/thermion_dart/native/src/SceneManager.cpp +++ b/thermion_dart/native/src/SceneManager.cpp @@ -781,6 +781,27 @@ namespace thermion_filament return true; } + void SceneManager::clearMorphAnimationBuffer( + EntityId entityId) + { + std::lock_guard lock(_mutex); + + auto entity = Entity::import(entityId); + + if (entity.isNull()) + { + Log("ERROR: invalid entity %d.", entityId); + return; + } + + auto animationComponentInstance = _animationComponentManager->getInstance(entity); + auto &animationComponent = _animationComponentManager->elementAt<0>(animationComponentInstance); + auto &morphAnimations = animationComponent.morphAnimations; + + morphAnimations.clear(); + return; + } + bool SceneManager::setMaterialColor(EntityId entityId, const char *meshName, int materialIndex, const float r, const float g, const float b, const float a) { diff --git a/thermion_dart/native/src/ThermionDartApi.cpp b/thermion_dart/native/src/ThermionDartApi.cpp index 349adfe2..a1c50ccd 100644 --- a/thermion_dart/native/src/ThermionDartApi.cpp +++ b/thermion_dart/native/src/ThermionDartApi.cpp @@ -405,7 +405,7 @@ extern "C" return ((SceneManager *)sceneManager)->setMorphTargetWeights(asset, weights, numWeights); } - bool set_morph_animation( + EMSCRIPTEN_KEEPALIVE bool set_morph_animation( void *sceneManager, EntityId asset, const float *const morphData, @@ -418,6 +418,10 @@ extern "C" return result; } + EMSCRIPTEN_KEEPALIVE void clear_morph_animation(void* sceneManager, EntityId asset) { + ((SceneManager *)sceneManager)->clearMorphAnimationBuffer(asset); + } + EMSCRIPTEN_KEEPALIVE void reset_to_rest_pose(void *sceneManager, EntityId entityId) { ((SceneManager *)sceneManager)->resetBones(entityId); From fd31b4dcad72d07adfecb81a1be9b7a0558bba07 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 23 Jul 2024 09:37:59 +0800 Subject: [PATCH 11/11] docs: rename examples to showcase --- docs.json | 2 +- docs/{examples.mdx => showcase.mdx} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/{examples.mdx => showcase.mdx} (100%) diff --git a/docs.json b/docs.json index deee03f5..a25b3003 100644 --- a/docs.json +++ b/docs.json @@ -12,7 +12,7 @@ ], ["Misc.", [ ["Playground", "https://dartpad.thermion.dev"], - ["Examples", "/examples"], + ["Showcase", "/showcase"], ["Windows", "/windows"], ["Android", "/android"], ["Contributing", "/contributing"], diff --git a/docs/examples.mdx b/docs/showcase.mdx similarity index 100% rename from docs/examples.mdx rename to docs/showcase.mdx