rename web interop classes

This commit is contained in:
Nick Fisher
2024-06-19 18:25:38 +08:00
parent d3891e481e
commit c6c918907a
4 changed files with 131 additions and 14 deletions

View File

@@ -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<void> withVoidCallback(
Function(Pointer<NativeFunction<Void Function()>>) func) async {
JSArray retVal = createVoidCallback();
var promise = retVal.toDart[0] as JSPromise<JSNumber>;
var fnPtrAddress = retVal.toDart[1] as JSNumber;
var fnPtr = Pointer<NativeFunction<Void Function()>>.fromAddress(
fnPtrAddress.toDartInt);
func(fnPtr);
await promise.toDart;
}
Future<int> withVoidPointerCallback(
void Function(Pointer<NativeFunction<Void Function(Pointer<Void>)>>)
func) async {
JSArray retVal = createVoidPointerCallback();
var promise = retVal.toDart[0] as JSPromise<JSNumber>;
var fnPtrAddress = retVal.toDart[1] as JSNumber;
var fnPtr = Pointer<NativeFunction<Void Function(Pointer<Void>)>>.fromAddress(
fnPtrAddress.toDartInt);
func(fnPtr);
final addr = await promise.toDart;
return addr.toDartInt;
}
Future<bool> withBoolCallback(
Function(Pointer<NativeFunction<Void Function(Bool)>>) func) async {
JSArray retVal = createBoolCallback();
var promise = retVal.toDart[0] as JSPromise<JSBoolean>;
var fnPtrAddress = retVal.toDart[1] as JSNumber;
var fnPtr = Pointer<NativeFunction<Void Function(Bool)>>.fromAddress(
fnPtrAddress.toDartInt);
func(fnPtr);
final addr = await promise.toDart;
return addr.toDart;
}
Future<int> withIntCallback(
Function(Pointer<NativeFunction<Void Function(Int32)>>) func) async {
JSArray retVal = createBoolCallback();
var promise = retVal.toDart[0] as JSPromise<JSNumber>;
var fnPtrAddress = retVal.toDart[1] as JSNumber;
var fnPtr = Pointer<NativeFunction<Void Function(Int32)>>.fromAddress(
fnPtrAddress.toDartInt);
func(fnPtr);
final addr = await promise.toDart;
return addr.toDartInt;
}
Future<String> withCharPtrCallback(
Function(Pointer<NativeFunction<Void Function(Pointer<Char>)>>)
func) async {
JSArray retVal = createVoidPointerCallback();
var promise = retVal.toDart[0] as JSPromise<JSNumber>;
var fnPtrAddress = retVal.toDart[1] as JSNumber;
var fnPtr = Pointer<NativeFunction<Void Function(Pointer<Char>)>>.fromAddress(
fnPtrAddress.toDartInt);
func(fnPtr);
final addr = await promise.toDart;
return Pointer<Utf8>.fromAddress(addr.toDartInt).toDartString();
}

View File

@@ -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<ThermionViewerFFIJSDartBridge>(this)
var wrapper = createJSInteropWrapper<ThermionViewerJSDartBridge>(this)
as ThermionViewerJSShim;
globalContext.setProperty(globalPropertyName.toJS, wrapper);
}

View File

@@ -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<bool> get initialized async {

View File

@@ -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",
<JSString>[].toJS, <JSAny>[].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;
}