diff --git a/lib/filament_controller_ffi.dart b/lib/filament_controller_ffi.dart index f62f273b..7ef5b074 100644 --- a/lib/filament_controller_ffi.dart +++ b/lib/filament_controller_ffi.dart @@ -14,6 +14,7 @@ import 'package:flutter_filament/filament_controller.dart'; import 'package:flutter_filament/animations/animation_data.dart'; import 'package:flutter_filament/generated_bindings.dart'; +import 'package:flutter_filament/generated_bindings.dart' as gb; import 'package:flutter_filament/hardware/hardware_keyboard_listener.dart'; import 'package:flutter_filament/rendering_surface.dart'; @@ -114,6 +115,9 @@ class FilamentControllerFFI extends FilamentController { _usesBackingWindow = result; }); } + _onPickResultCallable = + NativeCallable.listener( + _onPickResult); } bool _rendering = false; @@ -312,7 +316,6 @@ class FilamentControllerFFI extends FilamentController { var renderCallbackOwner = Pointer.fromAddress(renderCallbackResult[1]); - print("Got rendering surface"); final uberarchivePtr = @@ -883,8 +886,7 @@ class FilamentControllerFFI extends FilamentController { var names = []; var outPtr = allocator(255); for (int i = 0; i < animationCount; i++) { - await _withVoidCallback((callback) => - get_animation_name_ffi(_sceneManager!, entity, outPtr, i, callback)); + get_animation_name(_sceneManager!, entity, outPtr, i); names.add(outPtr.cast().toDartString()); } allocator.free(outPtr); @@ -1073,7 +1075,7 @@ class FilamentControllerFFI extends FilamentController { if (_viewer == null) { throw Exception("No viewer available, ignoring"); } - play_animation_ffi( + play_animation( _sceneManager!, entity, index, loop, reverse, replaceActive, crossfade); } @@ -1394,29 +1396,30 @@ class FilamentControllerFFI extends FilamentController { return result.cast().toDartString(); } + final _pick = >{}; + + void _onPickResult(FilamentEntity entityId, int x, int y) { + _pickResultController.add(( + entity: entityId, + x: (x / _pixelRatio).toDouble(), + y: (textureDetails.value!.height - y) / _pixelRatio + )); + } + + late NativeCallable + _onPickResultCallable; + @override void pick(int x, int y) async { if (_viewer == null) { throw Exception("No viewer available, ignoring"); } - final outPtr = allocator(1); - outPtr.value = 0; - pick_ffi(_viewer!, (x * _pixelRatio).toInt(), - textureDetails.value!.height - (y * _pixelRatio).toInt(), outPtr); - int wait = 0; - while (outPtr.value == 0) { - await Future.delayed(const Duration(milliseconds: 16)); - wait++; - if (wait > 10) { - allocator.free(outPtr); - throw Exception("Failed to get picking result"); - } - } - var entityId = outPtr.value; - _pickResultController - .add((entity: entityId, x: x.toDouble(), y: y.toDouble())); - allocator.free(outPtr); + gb.pick( + _viewer!, + (x * _pixelRatio).toInt(), + textureDetails.value!.height - (y * _pixelRatio).toInt(), + _onPickResultCallable.nativeFunction); } @override