diff --git a/thermion_dart/lib/src/bindings/src/ffi.dart b/thermion_dart/lib/src/bindings/src/ffi.dart index 2fbb0256..c0af1e25 100644 --- a/thermion_dart/lib/src/bindings/src/ffi.dart +++ b/thermion_dart/lib/src/bindings/src/ffi.dart @@ -11,6 +11,10 @@ const FILAMENT_SINGLE_THREADED = false; const FILAMENT_WASM = false; bool get IS_WINDOWS => Platform.isWindows; +Int32List makeInt32List(int length) { + return Int32List(length); +} + class NativeLibrary { static void initBindings(String name) { throw Exception(); @@ -93,8 +97,8 @@ void _voidCallbackHandler(int requestId) { _requests[requestId]!.complete(); } -late NativeCallable - _voidCallbackNativeCallable = NativeCallable.listener(_voidCallbackHandler); +late NativeCallable _voidCallbackNativeCallable = + NativeCallable.listener(_voidCallbackHandler); Future withVoidCallback( Function(int, Pointer>) func) async { @@ -102,8 +106,9 @@ Future withVoidCallback( _requestId++; final completer = Completer(); _requests[requestId] = completer; - - _voidCallbackNativeCallable = NativeCallable.listener(_voidCallbackHandler); + + _voidCallbackNativeCallable = + NativeCallable.listener(_voidCallbackHandler); func.call(requestId, _voidCallbackNativeCallable.nativeFunction.cast()); await completer.future; diff --git a/thermion_dart/lib/src/bindings/src/js_interop.dart b/thermion_dart/lib/src/bindings/src/js_interop.dart index dee62df9..3e027d01 100644 --- a/thermion_dart/lib/src/bindings/src/js_interop.dart +++ b/thermion_dart/lib/src/bindings/src/js_interop.dart @@ -10,6 +10,12 @@ const FILAMENT_SINGLE_THREADED = true; const FILAMENT_WASM = true; const IS_WINDOWS = false; +Int32List makeInt32List(int length) { + var ptr = malloc(length * 4); + var buf = _NativeLibrary.instance._emscripten_make_int32_buffer(ptr, length); + return buf.toDart; +} + extension type _NativeLibrary(JSObject _) implements JSObject { static _NativeLibrary get instance => NativeLibrary.instance as _NativeLibrary; @@ -157,8 +163,9 @@ extension UInt32ListExtension on Uint32List { return nullptr; } final ptr = getPointer(this, this.toJS); - final bar = Uint32ArrayWrapper(NativeLibrary.instance.HEAPU8, ptr, length) - as JSUint32Array; + final bar = + Uint32ArrayWrapper(NativeLibrary.instance.HEAPU8.buffer, ptr, length) + as JSUint32Array; bar.toDart.setRange(0, length, this); return ptr; } @@ -169,11 +176,17 @@ extension Int32ListExtension on Int32List { if (this.lengthInBytes == 0) { return nullptr; } - final ptr = getPointer(this, this.toJS); - final bar = Int32ArrayWrapper(NativeLibrary.instance.HEAPU8, ptr, length) - as JSInt32Array; - bar.toDart.setRange(0, length, this); - return ptr; + try { + this.buffer.asUint8List(this.offsetInBytes); + final ptr = getPointer(this, this.toJS); + final bar = + Int32ArrayWrapper(NativeLibrary.instance.HEAPU8.buffer, ptr, length) + as JSInt32Array; + bar.toDart.setRange(0, length, this); + return ptr; + } catch (_) { + return Pointer(this.offsetInBytes); + } } } @@ -242,7 +255,7 @@ class CallbackHolder { extension DPCF on DartPickCallbackFunction { CallbackHolder asCallback() { - final ptr = addFunction(this.toJS, "viidddd"); + final ptr = addFunction(this.toJS, "viiffff"); final cbh = CallbackHolder(ptr); return cbh; } @@ -270,8 +283,7 @@ void Function(int) _voidCallback = (int requestId) { final _voidCallbackPtr = _voidCallback.addFunction(); - - Future withVoidCallback( +Future withVoidCallback( Function(int, Pointer>) func) async { final completer = Completer(); final requestId = _completers.length; diff --git a/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart b/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart index fd48f6ac..f5a98cae 100644 --- a/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart +++ b/thermion_dart/lib/src/filament/src/implementation/ffi_asset.dart @@ -1,5 +1,6 @@ import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:logging/logging.dart'; +import 'package:thermion_dart/src/bindings/src/js_interop.dart'; import 'package:thermion_dart/src/utils/src/matrix.dart'; import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart'; import 'package:thermion_dart/src/filament/src/implementation/ffi_material.dart'; @@ -56,10 +57,10 @@ class FFIAsset extends ThermionAsset { Future> getChildEntities() async { if (_childEntities == null) { var count = SceneAsset_getChildEntityCount(asset); - var childEntities = Int32List(count); + var childEntities = makeInt32List(count); late Pointer stackPtr; if (FILAMENT_WASM) { - //stackPtr = stackSave(); + stackPtr = stackSave(); } if (count > 0) { SceneAsset_getChildEntities(asset, childEntities.address); @@ -67,7 +68,7 @@ class FFIAsset extends ThermionAsset { _childEntities = Int32List.fromList(childEntities); childEntities.free(); if (FILAMENT_WASM) { - //stackRestore(stackPtr); + stackRestore(stackPtr); } }