diff --git a/dart_filament/lib/dart_filament.dart b/dart_filament/lib/dart_filament.dart index 40d70d35..1ace6852 100644 --- a/dart_filament/lib/dart_filament.dart +++ b/dart_filament/lib/dart_filament.dart @@ -4,5 +4,4 @@ export 'dart_filament/entities/filament_entity.dart'; export 'dart_filament/abstract_filament_viewer.dart'; export 'dart_filament/filament_viewer_impl.dart'; export 'dart_filament/dart_filament.g.dart'; - export 'dart_filament/entities/entity_transform_controller.dart'; diff --git a/dart_filament/lib/dart_filament/compatibility/compatibility.dart b/dart_filament/lib/dart_filament/compatibility/compatibility.dart new file mode 100644 index 00000000..55e1f5e0 --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/compatibility.dart @@ -0,0 +1,3 @@ +export 'web/compatibility.dart' if (dart.library.io) 'native/compatibility.dart'; + + diff --git a/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart b/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart new file mode 100644 index 00000000..b14b0fba --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart @@ -0,0 +1,6 @@ +import 'package:ffi/ffi.dart'; +export 'package:ffi/ffi.dart'; + +final allocator = calloc; + +class Compatibility {} diff --git a/dart_filament/lib/dart_filament/dart_filament.g.dart b/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart similarity index 100% rename from dart_filament/lib/dart_filament/dart_filament.g.dart rename to dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart diff --git a/dart_filament/lib/dart_filament/compatibility/web/allocator.dart b/dart_filament/lib/dart_filament/compatibility/web/allocator.dart new file mode 100644 index 00000000..e69de29b diff --git a/dart_filament/lib/dart_filament/compatibility/web/compatibility.dart b/dart_filament/lib/dart_filament/compatibility/web/compatibility.dart new file mode 100644 index 00000000..319420ad --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/web/compatibility.dart @@ -0,0 +1,254 @@ +import 'dart:ffi'; +export "allocator.dart"; +export "dart_filament.g.dart"; + +import 'dart:convert'; +import 'dart:ffi' as ffi hide Uint8Pointer, FloatPointer; +import 'dart:typed_data'; + +import 'package:dart_filament/dart_filament/compatibility/web/dart_filament.g.dart'; + +import 'package:ffi/ffi.dart'; +export 'package:ffi/ffi.dart' hide StringUtf8Pointer, Utf8Pointer; +export 'dart:ffi' + hide + Uint8Pointer, + FloatPointer, + DoublePointer, + Int32Pointer, + Int64Pointer; + +class _Allocator implements ffi.Allocator { + const _Allocator(); + @override + ffi.Pointer allocate(int byteCount, + {int? alignment}) { + return flutter_filament_web_allocate(byteCount).cast(); + } + + @override + void free(ffi.Pointer pointer) { + flutter_filament_web_free(pointer.cast()); + } +} + +const allocator = _Allocator(); + +extension CharPointer on ffi.Pointer { + int get value { + return flutter_filament_web_get(this, 0); + } + + set value(int value) { + flutter_filament_web_set(this, 0, value); + } + + void operator []=(int index, int value) { + this.elementAt(index).value = value; + } + + ffi.Pointer elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +extension IntPointer on ffi.Pointer { + int get value { + return flutter_filament_web_get_int32(this.cast(), 0); + } + + set value(int value) { + flutter_filament_web_set_int32(this.cast(), 0, value); + } + + void operator []=(int index, int value) { + this.elementAt(index).value = value; + } + + int operator [](int index) { + return this.elementAt(index).value; + } + + ffi.Pointer elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +extension Int32Pointer on ffi.Pointer { + int get value { + return flutter_filament_web_get_int32(this, 0); + } + + set value(int value) { + flutter_filament_web_set_int32(this, 0, value); + } + + void operator []=(int index, int value) { + this.elementAt(index).value = value; + } + + int operator [](int index) { + return this.elementAt(index).value; + } + + ffi.Pointer elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +extension UInt8Pointer on ffi.Pointer { + int get value { + return flutter_filament_web_get(this.cast(), 0); + } + + set value(int value) { + flutter_filament_web_set(this.cast(), 0, value); + } + + void operator []=(int index, int value) { + this.elementAt(index).value = value; + } + + int operator [](int index) { + return this.elementAt(index).value; + } + + ffi.Pointer elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +extension PointerPointer + on ffi.Pointer> { + ffi.Pointer get value { + return flutter_filament_web_get_pointer(cast>(), 0) + .cast(); + } + + set value(ffi.Pointer value) { + flutter_filament_web_set_pointer( + cast>(), 0, value.cast()); + } + + void operator []=(int index, ffi.Pointer value) { + this.elementAt(index).value = value; + } + + ffi.Pointer> elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +extension FloatPointer on ffi.Pointer { + double get value { + return flutter_filament_web_get_float(this, 0); + } + + set value(double value) { + flutter_filament_web_set_float(this, 0, value); + } + + void operator []=(int index, double value) { + this.elementAt(index).value = value; + } + + ffi.Pointer elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +extension StringConversion on String { + ffi.Pointer toNativeUtf8({ffi.Allocator? allocator}) { + final units = utf8.encode(this); + final ffi.Pointer result = + allocator!(units.length + 1); + for (int i = 0; i < units.length; i++) { + result.elementAt(i).value = units[i]; + } + result.elementAt(units.length).value = 0; + return result.cast(); + } +} + +extension StringUtf8Pointer on ffi.Pointer { + + + static int _length(ffi.Pointer codeUnits) { + var length = 0; + while (codeUnits[length] != 0) { + length++; + } + return length; + } + + String toDartString({int? length}) { + final codeUnits = this.cast(); + final list = []; + + if (length != null) { + RangeError.checkNotNegative(length, 'length'); + } else { + length = _length(codeUnits); + } + for (int i = 0; i < length; i++) { + list.add(codeUnits.elementAt(i).value); + } + return utf8.decode(list); + } +} + +extension DoublePointer on ffi.Pointer { + double get value { + return flutter_filament_web_get_double(this, 0); + } + + set value(double value) { + return flutter_filament_web_set_double(this, 0, value); + } + + Float64List asTypedList(int length) { + var list = Float64List(length); + + for (int i = 0; i < length; i++) { + list[i] = elementAt(i).value; + } + return list; + } + + double operator [](int index) { + return elementAt(index).value; + } + + void operator []=(int index, double value) { + elementAt(index).value = value; + } + + ffi.Pointer elementAt(int index) => + ffi.Pointer.fromAddress(address + ffi.sizeOf() * index); +} + +@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(); +} diff --git a/dart_filament/lib/dart_filament/compatibility/web/dart_filament.g.dart b/dart_filament/lib/dart_filament/compatibility/web/dart_filament.g.dart new file mode 100644 index 00000000..b4ec8764 --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/web/dart_filament.g.dart @@ -0,0 +1,1839 @@ +// AUTO GENERATED FILE, DO NOT EDIT. +// +// Generated by `package:ffigen`. +// ignore_for_file: type=lint +import 'dart:ffi' as ffi; + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Int32, ffi.Pointer)>( + symbol: 'flutter_filament_web_load_resource_callback', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_load_resource_callback( + ffi.Pointer data, + int length, + ffi.Pointer context, +); + +@ffi.Native, ffi.Int32)>( + symbol: 'flutter_filament_web_get', + assetId: 'package:dart_filament/dart_filament.dart') +external int flutter_filament_web_get( + ffi.Pointer ptr, + int offset, +); + +@ffi.Native, ffi.Int32)>( + symbol: 'flutter_filament_web_get_float', + assetId: 'package:dart_filament/dart_filament.dart') +external double flutter_filament_web_get_float( + ffi.Pointer ptr, + int offset, +); + +@ffi.Native, ffi.Int32)>( + symbol: 'flutter_filament_web_get_double', + assetId: 'package:dart_filament/dart_filament.dart') +external double flutter_filament_web_get_double( + ffi.Pointer ptr, + int offset, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer>, ffi.Int32)>( + symbol: 'flutter_filament_web_get_pointer', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer flutter_filament_web_get_pointer( + ffi.Pointer> ptr, + int offset, +); + +@ffi.Native, ffi.Int32, ffi.Int32)>( + symbol: 'flutter_filament_web_set', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_set( + ffi.Pointer ptr, + int offset, + int val, +); + +@ffi.Native, ffi.Int32, ffi.Float)>( + symbol: 'flutter_filament_web_set_float', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_set_float( + ffi.Pointer ptr, + int offset, + double val, +); + +@ffi.Native, ffi.Int32, ffi.Double)>( + symbol: 'flutter_filament_web_set_double', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_set_double( + ffi.Pointer ptr, + int offset, + double val, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer>, ffi.Int32, + ffi.Pointer)>( + symbol: 'flutter_filament_web_set_pointer', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_set_pointer( + ffi.Pointer> ptr, + int offset, + ffi.Pointer val, +); + +@ffi.Native, ffi.Int32)>( + symbol: 'flutter_filament_web_get_int32', + assetId: 'package:dart_filament/dart_filament.dart') +external int flutter_filament_web_get_int32( + ffi.Pointer ptr, + int offset, +); + +@ffi.Native, ffi.Int32, ffi.Int32)>( + symbol: 'flutter_filament_web_set_int32', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_set_int32( + ffi.Pointer ptr, + int offset, + int value, +); + +@ffi.Native>)>( + symbol: 'flutter_filament_web_get_address', + assetId: 'package:dart_filament/dart_filament.dart') +external int flutter_filament_web_get_address( + ffi.Pointer> out, +); + +@ffi.Native Function(ffi.Int32)>( + symbol: 'flutter_filament_web_allocate', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer flutter_filament_web_allocate( + int size, +); + +@ffi.Native)>( + symbol: 'flutter_filament_web_free', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_web_free( + ffi.Pointer ptr, +); + +@ffi.Native( + symbol: 'flutter_filament_web_create_gl_context', + assetId: 'package:dart_filament/dart_filament.dart') +external int flutter_filament_web_create_gl_context(); + +@ffi.Native Function()>( + symbol: 'flutter_filament_web_get_resource_loader_wrapper', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer + flutter_filament_web_get_resource_loader_wrapper(); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>( + symbol: 'create_filament_viewer', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer create_filament_viewer( + ffi.Pointer context, + ffi.Pointer loader, + ffi.Pointer platform, + ffi.Pointer uberArchivePath, +); + +@ffi.Native)>( + symbol: 'destroy_filament_viewer', + assetId: 'package:dart_filament/dart_filament.dart') +external void destroy_filament_viewer( + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer)>( + symbol: 'get_scene_manager', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_scene_manager( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>( + symbol: 'create_render_target', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_render_target( + ffi.Pointer viewer, + int texture, + int width, + int height, +); + +@ffi.Native)>( + symbol: 'clear_background_image', + assetId: 'package:dart_filament/dart_filament.dart') +external void clear_background_image( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Bool)>( + symbol: 'set_background_image', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_background_image( + ffi.Pointer viewer, + ffi.Pointer path, + bool fillHeight, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>( + symbol: 'set_background_image_position', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_background_image_position( + ffi.Pointer viewer, + double x, + double y, + bool clamp, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_background_color', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_background_color( + ffi.Pointer viewer, + double r, + double g, + double b, + double a, +); + +@ffi.Native, ffi.Int)>( + symbol: 'set_tone_mapping', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_tone_mapping( + ffi.Pointer viewer, + int toneMapping, +); + +@ffi.Native, ffi.Float)>( + symbol: 'set_bloom', assetId: 'package:dart_filament/dart_filament.dart') +external void set_bloom( + ffi.Pointer viewer, + double strength, +); + +@ffi.Native, ffi.Pointer)>( + symbol: 'load_skybox', assetId: 'package:dart_filament/dart_filament.dart') +external void load_skybox( + ffi.Pointer viewer, + ffi.Pointer skyboxPath, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Float)>( + symbol: 'load_ibl', assetId: 'package:dart_filament/dart_filament.dart') +external void load_ibl( + ffi.Pointer viewer, + ffi.Pointer iblPath, + double intensity, +); + +@ffi.Native, ffi.Pointer)>( + symbol: 'rotate_ibl', assetId: 'package:dart_filament/dart_filament.dart') +external void rotate_ibl( + ffi.Pointer viewer, + ffi.Pointer rotationMatrix, +); + +@ffi.Native)>( + symbol: 'remove_skybox', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_skybox( + ffi.Pointer viewer, +); + +@ffi.Native)>( + symbol: 'remove_ibl', assetId: 'package:dart_filament/dart_filament.dart') +external void remove_ibl( + ffi.Pointer viewer, +); + +@ffi.Native< + EntityId Function( + ffi.Pointer, + ffi.Uint8, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Bool)>( + symbol: 'add_light', assetId: 'package:dart_filament/dart_filament.dart') +external int add_light( + ffi.Pointer viewer, + int type, + double colour, + double intensity, + double posX, + double posY, + double posZ, + double dirX, + double dirY, + double dirZ, + bool shadows, +); + +@ffi.Native, EntityId)>( + symbol: 'remove_light', assetId: 'package:dart_filament/dart_filament.dart') +external void remove_light( + ffi.Pointer viewer, + int entityId, +); + +@ffi.Native)>( + symbol: 'clear_lights', assetId: 'package:dart_filament/dart_filament.dart') +external void clear_lights( + ffi.Pointer viewer, +); + +@ffi.Native< + EntityId Function( + ffi.Pointer, ffi.Pointer, ffi.Int)>( + symbol: 'load_glb', assetId: 'package:dart_filament/dart_filament.dart') +external int load_glb( + ffi.Pointer sceneManager, + ffi.Pointer assetPath, + int numInstances, +); + +@ffi.Native< + EntityId Function( + ffi.Pointer, ffi.Pointer, ffi.Size)>( + symbol: 'load_glb_from_buffer', + assetId: 'package:dart_filament/dart_filament.dart') +external int load_glb_from_buffer( + ffi.Pointer sceneManager, + ffi.Pointer data, + int length, +); + +@ffi.Native< + EntityId Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>( + symbol: 'load_gltf', assetId: 'package:dart_filament/dart_filament.dart') +external int load_gltf( + ffi.Pointer sceneManager, + ffi.Pointer assetPath, + ffi.Pointer relativePath, +); + +@ffi.Native, EntityId)>( + symbol: 'create_instance', + assetId: 'package:dart_filament/dart_filament.dart') +external int create_instance( + ffi.Pointer sceneManager, + int id, +); + +@ffi.Native, EntityId)>( + symbol: 'get_instance_count', + assetId: 'package:dart_filament/dart_filament.dart') +external int get_instance_count( + ffi.Pointer sceneManager, + int entityId, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer)>( + symbol: 'get_instances', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_instances( + ffi.Pointer sceneManager, + int entityId, + ffi.Pointer out, +); + +@ffi.Native)>( + symbol: 'set_main_camera', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_main_camera( + ffi.Pointer viewer, +); + +@ffi.Native)>( + symbol: 'get_main_camera', + assetId: 'package:dart_filament/dart_filament.dart') +external int get_main_camera( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, EntityId, ffi.Pointer)>( + symbol: 'set_camera', assetId: 'package:dart_filament/dart_filament.dart') +external bool set_camera( + ffi.Pointer viewer, + int asset, + ffi.Pointer nodeName, +); + +@ffi.Native, ffi.Bool)>( + symbol: 'set_view_frustum_culling', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_view_frustum_culling( + ffi.Pointer viewer, + bool enabled, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Uint64, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer buf, ffi.Size size, + ffi.Pointer data)>>, + ffi.Pointer)>( + symbol: 'render', assetId: 'package:dart_filament/dart_filament.dart') +external void render( + ffi.Pointer viewer, + int frameTimeInNanos, + ffi.Pointer pixelBuffer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer buf, ffi.Size size, + ffi.Pointer data)>> + callback, + ffi.Pointer data, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Uint32, ffi.Uint32)>( + symbol: 'create_swap_chain', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_swap_chain( + ffi.Pointer viewer, + ffi.Pointer window, + int width, + int height, +); + +@ffi.Native)>( + symbol: 'destroy_swap_chain', + assetId: 'package:dart_filament/dart_filament.dart') +external void destroy_swap_chain( + ffi.Pointer viewer, +); + +@ffi.Native, ffi.Float)>( + symbol: 'set_frame_interval', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_frame_interval( + ffi.Pointer viewer, + double interval, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float)>( + symbol: 'update_viewport_and_camera_projection', + assetId: 'package:dart_filament/dart_filament.dart') +external void update_viewport_and_camera_projection( + ffi.Pointer viewer, + int width, + int height, + double scaleFactor, +); + +@ffi.Native)>( + symbol: 'scroll_begin', assetId: 'package:dart_filament/dart_filament.dart') +external void scroll_begin( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'scroll_update', + assetId: 'package:dart_filament/dart_filament.dart') +external void scroll_update( + ffi.Pointer viewer, + double x, + double y, + double z, +); + +@ffi.Native)>( + symbol: 'scroll_end', assetId: 'package:dart_filament/dart_filament.dart') +external void scroll_end( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>( + symbol: 'grab_begin', assetId: 'package:dart_filament/dart_filament.dart') +external void grab_begin( + ffi.Pointer viewer, + double x, + double y, + bool pan, +); + +@ffi.Native, ffi.Float, ffi.Float)>( + symbol: 'grab_update', assetId: 'package:dart_filament/dart_filament.dart') +external void grab_update( + ffi.Pointer viewer, + double x, + double y, +); + +@ffi.Native)>( + symbol: 'grab_end', assetId: 'package:dart_filament/dart_filament.dart') +external void grab_end( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Pointer, ffi.Int)>( + symbol: 'apply_weights', + assetId: 'package:dart_filament/dart_filament.dart') +external void apply_weights( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer entityName, + ffi.Pointer weights, + int count, +); + +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>( + symbol: 'set_morph_target_weights', + assetId: 'package:dart_filament/dart_filament.dart') +external bool set_morph_target_weights( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer morphData, + int numWeights, +); + +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Float)>( + symbol: 'set_morph_animation', + assetId: 'package:dart_filament/dart_filament.dart') +external bool set_morph_animation( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer morphData, + ffi.Pointer morphIndices, + int numMorphTargets, + int numFrames, + double frameLengthInMs, +); + +@ffi.Native, EntityId)>( + symbol: 'reset_to_rest_pose', + assetId: 'package:dart_filament/dart_filament.dart') +external void reset_to_rest_pose( + ffi.Pointer sceneManager, + int asset, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Float, + ffi.Bool)>( + symbol: 'add_bone_animation', + assetId: 'package:dart_filament/dart_filament.dart') +external void add_bone_animation( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer frameData, + int numFrames, + ffi.Pointer boneName, + ffi.Pointer> meshNames, + int numMeshTargets, + double frameLengthInMs, + bool isModelSpace, +); + +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>( + symbol: 'set_bone_transform', + assetId: 'package:dart_filament/dart_filament.dart') +external bool set_bone_transform( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer entityName, + ffi.Pointer transform, + ffi.Pointer boneName, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Float)>( + symbol: 'play_animation', + assetId: 'package:dart_filament/dart_filament.dart') +external void play_animation( + ffi.Pointer sceneManager, + int asset, + int index, + bool loop, + bool reverse, + bool replaceActive, + double crossfade, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( + symbol: 'set_animation_frame', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_animation_frame( + ffi.Pointer sceneManager, + int asset, + int animationIndex, + int animationFrame, +); + +@ffi.Native, EntityId, ffi.Int)>( + symbol: 'stop_animation', + assetId: 'package:dart_filament/dart_filament.dart') +external void stop_animation( + ffi.Pointer sceneManager, + int asset, + int index, +); + +@ffi.Native, EntityId)>( + symbol: 'get_animation_count', + assetId: 'package:dart_filament/dart_filament.dart') +external int get_animation_count( + ffi.Pointer sceneManager, + int asset, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>( + symbol: 'get_animation_name', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_animation_name( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer outPtr, + int index, +); + +@ffi.Native, EntityId, ffi.Int)>( + symbol: 'get_animation_duration', + assetId: 'package:dart_filament/dart_filament.dart') +external double get_animation_duration( + ffi.Pointer sceneManager, + int asset, + int index, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Pointer, ffi.Int)>( + symbol: 'get_morph_target_name', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_morph_target_name( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, + ffi.Pointer outPtr, + int index, +); + +@ffi.Native< + ffi.Int Function( + ffi.Pointer, EntityId, ffi.Pointer)>( + symbol: 'get_morph_target_name_count', + assetId: 'package:dart_filament/dart_filament.dart') +external int get_morph_target_name_count( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, +); + +@ffi.Native, EntityId)>( + symbol: 'remove_entity', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_entity( + ffi.Pointer viewer, + int asset, +); + +@ffi.Native)>( + symbol: 'clear_entities', + assetId: 'package:dart_filament/dart_filament.dart') +external void clear_entities( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float)>( + symbol: 'set_material_color', + assetId: 'package:dart_filament/dart_filament.dart') +external bool set_material_color( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, + int materialIndex, + double r, + double g, + double b, + double a, +); + +@ffi.Native, EntityId)>( + symbol: 'transform_to_unit_cube', + assetId: 'package:dart_filament/dart_filament.dart') +external void transform_to_unit_cube( + ffi.Pointer sceneManager, + int asset, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Bool)>( + symbol: 'queue_position_update', + assetId: 'package:dart_filament/dart_filament.dart') +external void queue_position_update( + ffi.Pointer sceneManager, + int asset, + double x, + double y, + double z, + bool relative, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>( + symbol: 'queue_rotation_update', + assetId: 'package:dart_filament/dart_filament.dart') +external void queue_rotation_update( + ffi.Pointer sceneManager, + int asset, + double rads, + double x, + double y, + double z, + double w, + bool relative, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_position', assetId: 'package:dart_filament/dart_filament.dart') +external void set_position( + ffi.Pointer sceneManager, + int asset, + double x, + double y, + double z, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_rotation', assetId: 'package:dart_filament/dart_filament.dart') +external void set_rotation( + ffi.Pointer sceneManager, + int asset, + double rads, + double x, + double y, + double z, + double w, +); + +@ffi.Native, EntityId, ffi.Float)>( + symbol: 'set_scale', assetId: 'package:dart_filament/dart_filament.dart') +external void set_scale( + ffi.Pointer sceneManager, + int asset, + double scale, +); + +@ffi.Native, EntityId)>( + symbol: 'move_camera_to_asset', + assetId: 'package:dart_filament/dart_filament.dart') +external void move_camera_to_asset( + ffi.Pointer viewer, + int asset, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_camera_exposure', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_exposure( + ffi.Pointer viewer, + double aperture, + double shutterSpeed, + double sensitivity, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_camera_position', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_position( + ffi.Pointer viewer, + double x, + double y, + double z, +); + +@ffi.Native)>( + symbol: 'get_camera_position', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_camera_position( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_camera_rotation', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_rotation( + ffi.Pointer viewer, + double w, + double x, + double y, + double z, +); + +@ffi.Native, ffi.Pointer)>( + symbol: 'set_camera_model_matrix', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_model_matrix( + ffi.Pointer viewer, + ffi.Pointer matrix, +); + +@ffi.Native Function(ffi.Pointer)>( + symbol: 'get_camera_model_matrix', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_camera_model_matrix( + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer)>( + symbol: 'get_camera_view_matrix', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_camera_view_matrix( + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer)>( + symbol: 'get_camera_projection_matrix', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_camera_projection_matrix( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double, ffi.Double)>( + symbol: 'set_camera_projection_matrix', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_projection_matrix( + ffi.Pointer viewer, + ffi.Pointer matrix, + double near, + double far, +); + +@ffi.Native, ffi.Double, ffi.Double)>( + symbol: 'set_camera_culling', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_culling( + ffi.Pointer viewer, + double near, + double far, +); + +@ffi.Native)>( + symbol: 'get_camera_culling_near', + assetId: 'package:dart_filament/dart_filament.dart') +external double get_camera_culling_near( + ffi.Pointer viewer, +); + +@ffi.Native)>( + symbol: 'get_camera_culling_far', + assetId: 'package:dart_filament/dart_filament.dart') +external double get_camera_culling_far( + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer)>( + symbol: 'get_camera_culling_projection_matrix', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_camera_culling_projection_matrix( + ffi.Pointer viewer, +); + +@ffi.Native Function(ffi.Pointer)>( + symbol: 'get_camera_frustum', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_camera_frustum( + ffi.Pointer viewer, +); + +@ffi.Native, ffi.Float, ffi.Float)>( + symbol: 'set_camera_fov', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_fov( + ffi.Pointer viewer, + double fovInDegrees, + double aspect, +); + +@ffi.Native, ffi.Float)>( + symbol: 'set_camera_focal_length', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_focal_length( + ffi.Pointer viewer, + double focalLength, +); + +@ffi.Native, ffi.Float)>( + symbol: 'set_camera_focus_distance', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_focus_distance( + ffi.Pointer viewer, + double focusDistance, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, _ManipulatorMode, ffi.Double, + ffi.Double, ffi.Double)>( + symbol: 'set_camera_manipulator_options', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_manipulator_options( + ffi.Pointer viewer, + int mode, + double orbitSpeedX, + double orbitSpeedY, + double zoomSpeed, +); + +@ffi.Native< + ffi.Int Function( + ffi.Pointer, EntityId, ffi.Pointer)>( + symbol: 'hide_mesh', assetId: 'package:dart_filament/dart_filament.dart') +external int hide_mesh( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, +); + +@ffi.Native< + ffi.Int Function( + ffi.Pointer, EntityId, ffi.Pointer)>( + symbol: 'reveal_mesh', assetId: 'package:dart_filament/dart_filament.dart') +external int reveal_mesh( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, +); + +@ffi.Native, ffi.Bool)>( + symbol: 'set_post_processing', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_post_processing( + ffi.Pointer viewer, + bool enabled, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>( + symbol: 'set_antialiasing', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_antialiasing( + ffi.Pointer viewer, + bool msaa, + bool fxaa, + bool taa, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + EntityId entityId, ffi.Int x, ffi.Int y)>>)>( + symbol: 'filament_pick', + assetId: 'package:dart_filament/dart_filament.dart') +external void filament_pick( + ffi.Pointer viewer, + int x, + int y, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>> + callback, +); + +@ffi.Native Function(ffi.Pointer, EntityId)>( + symbol: 'get_name_for_entity', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_name_for_entity( + ffi.Pointer sceneManager, + int entityId, +); + +@ffi.Native< + EntityId Function( + ffi.Pointer, EntityId, ffi.Pointer)>( + symbol: 'find_child_entity_by_name', + assetId: 'package:dart_filament/dart_filament.dart') +external int find_child_entity_by_name( + ffi.Pointer sceneManager, + int parent, + ffi.Pointer name, +); + +@ffi.Native, EntityId, ffi.Bool)>( + symbol: 'get_entity_count', + assetId: 'package:dart_filament/dart_filament.dart') +external int get_entity_count( + ffi.Pointer sceneManager, + int target, + bool renderableOnly, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>( + symbol: 'get_entities', assetId: 'package:dart_filament/dart_filament.dart') +external void get_entities( + ffi.Pointer sceneManager, + int target, + bool renderableOnly, + ffi.Pointer out, +); + +@ffi.Native< + ffi.Pointer Function( + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>( + symbol: 'get_entity_name_at', + assetId: 'package:dart_filament/dart_filament.dart') +external ffi.Pointer get_entity_name_at( + ffi.Pointer sceneManager, + int target, + int index, + bool renderableOnly, +); + +@ffi.Native, ffi.Bool)>( + symbol: 'set_recording', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_recording( + ffi.Pointer viewer, + bool recording, +); + +@ffi.Native, ffi.Pointer)>( + symbol: 'set_recording_output_directory', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_recording_output_directory( + ffi.Pointer viewer, + ffi.Pointer outputDirectory, +); + +@ffi.Native( + symbol: 'ios_dummy', assetId: 'package:dart_filament/dart_filament.dart') +external void ios_dummy(); + +@ffi.Native)>( + symbol: 'flutter_filament_free', + assetId: 'package:dart_filament/dart_filament.dart') +external void flutter_filament_free( + ffi.Pointer ptr, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId1, EntityId entityId2)>>, + ffi.Bool)>( + symbol: 'add_collision_component', + assetId: 'package:dart_filament/dart_filament.dart') +external void add_collision_component( + ffi.Pointer sceneManager, + int entityId, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId1, EntityId entityId2)>> + callback, + bool affectsCollidingTransform, +); + +@ffi.Native, EntityId)>( + symbol: 'remove_collision_component', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_collision_component( + ffi.Pointer sceneManager, + int entityId, +); + +@ffi.Native, EntityId)>( + symbol: 'add_animation_component', + assetId: 'package:dart_filament/dart_filament.dart') +external bool add_animation_component( + ffi.Pointer sceneManager, + int entityId, +); + +@ffi.Native< + EntityId Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer)>( + symbol: 'create_geometry', + assetId: 'package:dart_filament/dart_filament.dart') +external int create_geometry( + ffi.Pointer viewer, + ffi.Pointer vertices, + int numVertices, + ffi.Pointer indices, + int numIndices, + int primitiveType, + ffi.Pointer materialPath, +); + +@ffi.Native, EntityId, EntityId)>( + symbol: 'set_parent', assetId: 'package:dart_filament/dart_filament.dart') +external void set_parent( + ffi.Pointer sceneManager, + int child, + int parent, +); + +@ffi.Native, EntityId)>( + symbol: 'test_collisions', + assetId: 'package:dart_filament/dart_filament.dart') +external void test_collisions( + ffi.Pointer sceneManager, + int entity, +); + +@ffi.Native, EntityId, ffi.Int)>( + symbol: 'set_priority', assetId: 'package:dart_filament/dart_filament.dart') +external void set_priority( + ffi.Pointer sceneManager, + int entityId, + int priority, +); + +@ffi.Native, ffi.Pointer)>( + symbol: 'get_gizmo', assetId: 'package:dart_filament/dart_filament.dart') +external void get_gizmo( + ffi.Pointer sceneManager, + ffi.Pointer out, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi + .Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer renderCallbackOwner)>>, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer viewer)>>)>( + symbol: 'create_filament_viewer_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_filament_viewer_ffi( + ffi.Pointer context, + ffi.Pointer platform, + ffi.Pointer uberArchivePath, + ffi.Pointer loader, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer renderCallbackOwner)>> + renderCallback, + ffi.Pointer renderCallbackOwner, + ffi.Pointer< + ffi.NativeFunction viewer)>> + callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Uint32, + ffi.Uint32, + ffi.Pointer>)>( + symbol: 'create_swap_chain_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_swap_chain_ffi( + ffi.Pointer viewer, + ffi.Pointer surface, + int width, + int height, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, + ffi.Pointer>)>( + symbol: 'destroy_swap_chain_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void destroy_swap_chain_ffi( + ffi.Pointer viewer, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, + ffi.Uint32, ffi.Pointer>)>( + symbol: 'create_render_target_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_render_target_ffi( + ffi.Pointer viewer, + int nativeTextureId, + int width, + int height, + ffi.Pointer> onComplete, +); + +@ffi.Native)>( + symbol: 'destroy_filament_viewer_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void destroy_filament_viewer_ffi( + ffi.Pointer viewer, +); + +@ffi.Native)>( + symbol: 'render_ffi', assetId: 'package:dart_filament/dart_filament.dart') +external void render_ffi( + ffi.Pointer viewer, +); + +@ffi.Native( + symbol: 'make_render_callback_fn_pointer', + assetId: 'package:dart_filament/dart_filament.dart') +external FilamentRenderCallback make_render_callback_fn_pointer( + FilamentRenderCallback arg0, +); + +@ffi.Native, ffi.Bool)>( + symbol: 'set_rendering_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_rendering_ffi( + ffi.Pointer viewer, + bool rendering, +); + +@ffi.Native, ffi.Float)>( + symbol: 'set_frame_interval_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_frame_interval_ffi( + ffi.Pointer viewer, + double frameInterval, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, + ffi.Float, ffi.Pointer>)>( + symbol: 'update_viewport_and_camera_projection_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void update_viewport_and_camera_projection_ffi( + ffi.Pointer viewer, + int width, + int height, + double scaleFactor, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>( + symbol: 'set_background_color_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_background_color_ffi( + ffi.Pointer viewer, + double r, + double g, + double b, + double a, +); + +@ffi.Native)>( + symbol: 'clear_background_image_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void clear_background_image_ffi( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Bool, ffi.Pointer>)>( + symbol: 'set_background_image_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_background_image_ffi( + ffi.Pointer viewer, + ffi.Pointer path, + bool fillHeight, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>( + symbol: 'set_background_image_position_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_background_image_position_ffi( + ffi.Pointer viewer, + double x, + double y, + bool clamp, +); + +@ffi.Native, ffi.Int)>( + symbol: 'set_tone_mapping_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_tone_mapping_ffi( + ffi.Pointer viewer, + int toneMapping, +); + +@ffi.Native, ffi.Float)>( + symbol: 'set_bloom_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_bloom_ffi( + ffi.Pointer viewer, + double strength, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>( + symbol: 'load_skybox_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void load_skybox_ffi( + ffi.Pointer viewer, + ffi.Pointer skyboxPath, + ffi.Pointer> onComplete, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Float)>( + symbol: 'load_ibl_ffi', assetId: 'package:dart_filament/dart_filament.dart') +external void load_ibl_ffi( + ffi.Pointer viewer, + ffi.Pointer iblPath, + double intensity, +); + +@ffi.Native)>( + symbol: 'remove_skybox_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_skybox_ffi( + ffi.Pointer viewer, +); + +@ffi.Native)>( + symbol: 'remove_ibl_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_ibl_ffi( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Uint8, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Bool, + ffi.Pointer>)>( + symbol: 'add_light_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void add_light_ffi( + ffi.Pointer viewer, + int type, + double colour, + double intensity, + double posX, + double posY, + double posZ, + double dirX, + double dirY, + double dirZ, + bool shadows, + ffi.Pointer> callback, +); + +@ffi.Native, EntityId)>( + symbol: 'remove_light_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_light_ffi( + ffi.Pointer viewer, + int entityId, +); + +@ffi.Native)>( + symbol: 'clear_lights_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void clear_lights_ffi( + ffi.Pointer viewer, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Pointer>)>( + symbol: 'load_glb_ffi', assetId: 'package:dart_filament/dart_filament.dart') +external void load_glb_ffi( + ffi.Pointer sceneManager, + ffi.Pointer assetPath, + int numInstances, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Size, + ffi.Int, + ffi.Pointer>)>( + symbol: 'load_glb_from_buffer_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void load_glb_from_buffer_ffi( + ffi.Pointer sceneManager, + ffi.Pointer data, + int length, + int numInstances, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>( + symbol: 'load_gltf_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void load_gltf_ffi( + ffi.Pointer sceneManager, + ffi.Pointer assetPath, + ffi.Pointer relativePath, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>( + symbol: 'create_instance_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_instance_ffi( + ffi.Pointer sceneManager, + int entityId, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>( + symbol: 'remove_entity_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void remove_entity_ffi( + ffi.Pointer viewer, + int asset, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, + ffi.Pointer>)>( + symbol: 'clear_entities_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void clear_entities_ffi( + ffi.Pointer viewer, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer>)>( + symbol: 'set_camera_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_camera_ffi( + ffi.Pointer viewer, + int asset, + ffi.Pointer nodeName, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer, ffi.Pointer, ffi.Int)>( + symbol: 'apply_weights_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void apply_weights_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer entityName, + ffi.Pointer weights, + int count, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Float)>( + symbol: 'play_animation_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void play_animation_ffi( + ffi.Pointer sceneManager, + int asset, + int index, + bool loop, + bool reverse, + bool replaceActive, + double crossfade, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( + symbol: 'set_animation_frame_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_animation_frame_ffi( + ffi.Pointer sceneManager, + int asset, + int animationIndex, + int animationFrame, +); + +@ffi.Native, EntityId, ffi.Int)>( + symbol: 'stop_animation_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void stop_animation_ffi( + ffi.Pointer sceneManager, + int asset, + int index, +); + +@ffi.Native< + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>( + symbol: 'get_animation_count_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_animation_count_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>( + symbol: 'get_animation_name_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_animation_name_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer outPtr, + int index, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>( + symbol: 'get_morph_target_name_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_morph_target_name_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, + ffi.Pointer outPtr, + int index, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer>)>( + symbol: 'get_morph_target_name_count_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void get_morph_target_name_count_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer meshName, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>( + symbol: 'set_morph_target_weights_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_morph_target_weights_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer morphData, + int numWeights, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>( + symbol: 'set_bone_transform_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_bone_transform_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer entityName, + ffi.Pointer transform, + ffi.Pointer boneName, + ffi.Pointer> callback, +); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Float, + ffi.Bool)>( + symbol: 'add_bone_animation_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void add_bone_animation_ffi( + ffi.Pointer sceneManager, + int asset, + ffi.Pointer frameData, + int numFrames, + ffi.Pointer boneName, + ffi.Pointer> meshNames, + int numMeshTargets, + double frameLengthInMs, + bool isModelSpace, +); + +@ffi.Native, ffi.Bool)>( + symbol: 'set_post_processing_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void set_post_processing_ffi( + ffi.Pointer viewer, + bool enabled, +); + +@ffi.Native, EntityId)>( + symbol: 'reset_to_rest_pose_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void reset_to_rest_pose_ffi( + ffi.Pointer sceneManager, + int entityId, +); + +@ffi.Native( + symbol: 'ios_dummy_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void ios_dummy_ffi(); + +@ffi.Native< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Pointer>)>( + symbol: 'create_geometry_ffi', + assetId: 'package:dart_filament/dart_filament.dart') +external void create_geometry_ffi( + ffi.Pointer viewer, + ffi.Pointer vertices, + int numVertices, + ffi.Pointer indices, + int numIndices, + int primitiveType, + ffi.Pointer materialPath, + ffi.Pointer> callback, +); + +final class ResourceLoaderWrapper extends ffi.Struct { + external LoadFilamentResource loadResource; + + external FreeFilamentResource freeResource; + + external LoadFilamentResourceFromOwner loadFromOwner; + + external FreeFilamentResourceFromOwner freeFromOwner; + + external ffi.Pointer owner; + + external LoadFilamentResourceIntoOutPointer loadToOut; +} + +typedef LoadFilamentResource + = ffi.Pointer>; +typedef LoadFilamentResourceFunction = ResourceBuffer Function( + ffi.Pointer uri); + +final class ResourceBuffer extends ffi.Struct { + external ffi.Pointer data; + + @ffi.Int32() + external int size; + + @ffi.Int32() + external int id; +} + +typedef FreeFilamentResource + = ffi.Pointer>; +typedef FreeFilamentResourceFunction = ffi.Void Function(ResourceBuffer); +typedef DartFreeFilamentResourceFunction = void Function(ResourceBuffer); +typedef LoadFilamentResourceFromOwner + = ffi.Pointer>; +typedef LoadFilamentResourceFromOwnerFunction = ResourceBuffer Function( + ffi.Pointer, ffi.Pointer); +typedef FreeFilamentResourceFromOwner + = ffi.Pointer>; +typedef FreeFilamentResourceFromOwnerFunction = ffi.Void Function( + ResourceBuffer, ffi.Pointer); +typedef DartFreeFilamentResourceFromOwnerFunction = void Function( + ResourceBuffer, ffi.Pointer); +typedef LoadFilamentResourceIntoOutPointer = ffi + .Pointer>; +typedef LoadFilamentResourceIntoOutPointerFunction = ffi.Void Function( + ffi.Pointer uri, ffi.Pointer out); +typedef DartLoadFilamentResourceIntoOutPointerFunction = void Function( + ffi.Pointer uri, ffi.Pointer out); + +/// This header replicates most of the methods in FlutterFilamentApi.h, and is only intended to be used to generate client FFI bindings. +/// The intention is that calling one of these methods will call its respective method in FlutterFilamentApi.h, but wrapped in some kind of thread runner to ensure thread safety. +typedef EntityId = ffi.Int32; +typedef DartEntityId = int; +typedef _ManipulatorMode = ffi.Int32; +typedef Dart_ManipulatorMode = int; +typedef FilamentRenderCallback + = ffi.Pointer>; +typedef FilamentRenderCallbackFunction = ffi.Void Function( + ffi.Pointer owner); +typedef DartFilamentRenderCallbackFunction = void Function( + ffi.Pointer owner); + +const int __bool_true_false_are_defined = 1; + +const int true1 = 1; + +const int false1 = 0; diff --git a/dart_filament/lib/dart_filament/filament_viewer_impl.dart b/dart_filament/lib/dart_filament/filament_viewer_impl.dart index 96c7f0e9..8bad3171 100644 --- a/dart_filament/lib/dart_filament/filament_viewer_impl.dart +++ b/dart_filament/lib/dart_filament/filament_viewer_impl.dart @@ -2,20 +2,21 @@ import 'dart:async'; import 'dart:ffi'; import 'dart:io'; import 'package:animation_tools_dart/animation_tools_dart.dart'; -import 'package:dart_filament/dart_filament/dart_filament.g.dart'; -import 'package:dart_filament/dart_filament/dart_filament.g.dart' as gb; import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; -import 'package:ffi/ffi.dart'; - import 'package:vector_math/vector_math_64.dart'; import 'abstract_filament_viewer.dart'; import 'scene.dart'; +import 'compatibility/compatibility.dart'; + +import 'dart:ffi'; // ignore: constant_identifier_names const FilamentEntity _FILAMENT_ASSET_ERROR = 0; class FilamentViewer extends AbstractFilamentViewer { + final _compat = Compatibility(); + late SceneImpl _scene; Scene get scene => _scene; @@ -37,8 +38,6 @@ class FilamentViewer extends AbstractFilamentViewer { final _pickResultController = StreamController.broadcast(); - final allocator = calloc; - final Pointer resourceLoader; var _driver = nullptr.cast(); @@ -920,7 +919,7 @@ class FilamentViewer extends AbstractFilamentViewer { void pick(int x, int y) async { _scene.unregisterSelected(); - gb.pick( + filament_pick( _viewer!, (x * _pixelRatio).toInt(), (viewportDimensions.$2 - (y * _pixelRatio)).toInt(),