From c6c918907acd02afba104765c2379f15ae16302c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Wed, 19 Jun 2024 18:25:38 +0800 Subject: [PATCH] rename web interop classes --- .../compatibility/web/compatibility_ffi.dart | 118 ++++++++++++++++++ ....dart => thermion_viewer_dart_bridge.dart} | 6 +- ...viewer_js.dart => thermion_viewer_js.dart} | 6 +- ...er_wasm.dart => thermion_viewer_wasm.dart} | 15 ++- 4 files changed, 131 insertions(+), 14 deletions(-) create mode 100644 thermion_dart/lib/thermion_dart/compatibility/web/compatibility_ffi.dart rename thermion_dart/lib/thermion_dart/compatibility/web/interop/{filament_viewer_js_dart_bridge.dart => thermion_viewer_dart_bridge.dart} (99%) rename thermion_dart/lib/thermion_dart/compatibility/web/interop/{filament_viewer_js.dart => thermion_viewer_js.dart} (99%) rename thermion_dart/lib/thermion_dart/compatibility/web/interop/{filament_viewer_wasm.dart => thermion_viewer_wasm.dart} (99%) diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/compatibility_ffi.dart b/thermion_dart/lib/thermion_dart/compatibility/web/compatibility_ffi.dart new file mode 100644 index 00000000..f8da247c --- /dev/null +++ b/thermion_dart/lib/thermion_dart/compatibility/web/compatibility_ffi.dart @@ -0,0 +1,118 @@ +import 'dart:async'; +import 'dart:js_interop'; +import 'package:thermion_dart/thermion_dart/compatibility/web/interop.dart'; + +import "allocator.dart"; + +export "allocator.dart"; +export "thermion_dart.g.dart"; + +export 'package:ffi/ffi.dart' hide StringUtf8Pointer, Utf8Pointer; +export 'dart:ffi' + hide + Uint8Pointer, + FloatPointer, + DoublePointer, + Int32Pointer, + Int64Pointer, + PointerPointer, + Allocator; + +const allocator = Allocator(); + +@AbiSpecificIntegerMapping({ + Abi.androidArm: Uint8(), + Abi.androidArm64: Uint8(), + Abi.androidIA32: Int8(), + Abi.androidX64: Int8(), + Abi.androidRiscv64: Uint8(), + Abi.fuchsiaArm64: Uint8(), + Abi.fuchsiaX64: Int8(), + Abi.fuchsiaRiscv64: Uint8(), + Abi.iosArm: Int8(), + Abi.iosArm64: Int8(), + Abi.iosX64: Int8(), + Abi.linuxArm: Uint8(), + Abi.linuxArm64: Uint8(), + Abi.linuxIA32: Int8(), + Abi.linuxX64: Int8(), + Abi.linuxRiscv32: Uint8(), + Abi.linuxRiscv64: Uint8(), + Abi.macosArm64: Int8(), + Abi.macosX64: Int8(), + Abi.windowsArm64: Int8(), + Abi.windowsIA32: Int8(), + Abi.windowsX64: Int8(), +}) +final class FooChar extends AbiSpecificInteger { + const FooChar(); +} + +class Compatibility { + final _foo = FooChar(); +} + +Future withVoidCallback( + Function(Pointer>) func) async { + JSArray retVal = createVoidCallback(); + var promise = retVal.toDart[0] as JSPromise; + var fnPtrAddress = retVal.toDart[1] as JSNumber; + var fnPtr = Pointer>.fromAddress( + fnPtrAddress.toDartInt); + func(fnPtr); + await promise.toDart; +} + +Future withVoidPointerCallback( + void Function(Pointer)>>) + func) async { + JSArray retVal = createVoidPointerCallback(); + var promise = retVal.toDart[0] as JSPromise; + + var fnPtrAddress = retVal.toDart[1] as JSNumber; + var fnPtr = Pointer)>>.fromAddress( + fnPtrAddress.toDartInt); + func(fnPtr); + final addr = await promise.toDart; + return addr.toDartInt; +} + +Future withBoolCallback( + Function(Pointer>) func) async { + JSArray retVal = createBoolCallback(); + var promise = retVal.toDart[0] as JSPromise; + + var fnPtrAddress = retVal.toDart[1] as JSNumber; + var fnPtr = Pointer>.fromAddress( + fnPtrAddress.toDartInt); + func(fnPtr); + final addr = await promise.toDart; + return addr.toDart; +} + +Future withIntCallback( + Function(Pointer>) func) async { + JSArray retVal = createBoolCallback(); + var promise = retVal.toDart[0] as JSPromise; + + var fnPtrAddress = retVal.toDart[1] as JSNumber; + var fnPtr = Pointer>.fromAddress( + fnPtrAddress.toDartInt); + func(fnPtr); + final addr = await promise.toDart; + return addr.toDartInt; +} + +Future withCharPtrCallback( + Function(Pointer)>>) + func) async { + JSArray retVal = createVoidPointerCallback(); + var promise = retVal.toDart[0] as JSPromise; + + var fnPtrAddress = retVal.toDart[1] as JSNumber; + var fnPtr = Pointer)>>.fromAddress( + fnPtrAddress.toDartInt); + func(fnPtr); + final addr = await promise.toDart; + return Pointer.fromAddress(addr.toDartInt).toDartString(); +} 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/thermion_viewer_dart_bridge.dart similarity index 99% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js_dart_bridge.dart rename to thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_dart_bridge.dart index edffe64c..d3ed6db2 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/thermion_viewer_dart_bridge.dart @@ -20,14 +20,14 @@ import 'package:vector_math/vector_math_64.dart'; /// the browser console). /// @JSExport() -class ThermionViewerFFIJSDartBridge { +class ThermionViewerJSDartBridge { final ThermionViewer viewer; - ThermionViewerFFIJSDartBridge(this.viewer); + ThermionViewerJSDartBridge(this.viewer); void bind( {String globalPropertyName = "filamentViewer"}) { - var wrapper = createJSInteropWrapper(this) + var wrapper = createJSInteropWrapper(this) as ThermionViewerJSShim; globalContext.setProperty(globalPropertyName.toJS, wrapper); } diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart similarity index 99% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart rename to thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart index 928b3bcf..fbd47777 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_js.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_js.dart @@ -14,15 +14,15 @@ import 'shims/thermion_viewer_js_shim.dart'; /// An [ThermionViewer] implementation that forwards calls to /// a corresponding Javascript shim implementation (see [ThermionViewerJSShim]). /// -class ThermionViewerFFIJS implements ThermionViewer { +class ThermionViewerJS implements ThermionViewer { late final ThermionViewerJSShim _shim; - ThermionViewerFFIJS.fromGlobalProperty(String globalPropertyName) { + ThermionViewerJS.fromGlobalProperty(String globalPropertyName) { this._shim = globalContext.getProperty(globalPropertyName.toJS) as ThermionViewerJSShim; } - ThermionViewerFFIJS(this._shim); + ThermionViewerJS(this._shim); @override Future get initialized async { diff --git a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart similarity index 99% rename from thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart rename to thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart index e0921ed7..46d2341b 100644 --- a/thermion_dart/lib/thermion_dart/compatibility/web/interop/filament_viewer_wasm.dart +++ b/thermion_dart/lib/thermion_dart/compatibility/web/interop/thermion_viewer_wasm.dart @@ -34,20 +34,19 @@ extension type _EmscriptenModule(JSObject _) implements JSObject { /// An [ThermionViewer] implementation that forwards calls to /// the (Emscripten-generated) ThermionDart JS module. /// -class ThermionViewerFFIWasm implements ThermionViewer { +class ThermionViewerWasm implements ThermionViewer { late _EmscriptenModule _module; bool _initialized = false; bool _rendering = false; - ThermionViewerFFIWasm() { - _module = window.getProperty<_EmscriptenModule>("df".toJS); + ThermionViewerWasm({String moduleName="thermion_dart"}) { + _module = window.getProperty<_EmscriptenModule>(moduleName.toJS); } - JSBigInt? _viewer; - JSBigInt? _sceneManager; + JSNumber? _viewer; + JSNumber? _sceneManager; - @override Future initialize(int width, int height, {String? uberArchivePath}) async { final context = _module.ccall("thermion_dart_web_create_gl_context", "int", [].toJS, [].toJS, null); @@ -62,11 +61,11 @@ class ThermionViewerFFIWasm implements ThermionViewer { "void*", ["void*".toJS, "void*".toJS, "void*".toJS, "string".toJS].toJS, [context, loader, null, uberArchivePath?.toJS].toJS, - null) as JSBigInt; + null) as JSNumber; await createSwapChain(width, height); _updateViewportAndCameraProjection(width, height, 1.0); _sceneManager = _module.ccall("get_scene_manager", "void*", - ["void*".toJS].toJS, [_viewer!].toJS, null) as JSBigInt; + ["void*".toJS].toJS, [_viewer!].toJS, null) as JSNumber; _initialized = true; }