diff --git a/dart_filament/lib/dart_filament/abstract_filament_viewer.dart b/dart_filament/lib/dart_filament/abstract_filament_viewer.dart index efc98c14..6da53a3d 100644 --- a/dart_filament/lib/dart_filament/abstract_filament_viewer.dart +++ b/dart_filament/lib/dart_filament/abstract_filament_viewer.dart @@ -1,12 +1,7 @@ +import 'package:vector_math/vector_math_64.dart'; import 'dart:async'; -import 'dart:ffi'; import 'package:animation_tools_dart/animation_tools_dart.dart'; import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; -import 'package:dart_filament/dart_filament/entities/gizmo.dart'; - -import 'package:vector_math/vector_math_64.dart'; - -typedef RenderCallback = Pointer)>>; // "picking" means clicking/tapping on the viewport, and unprojecting the X/Y coordinate to determine whether any renderable entities were present at those coordinates. typedef FilamentPickResult = ({FilamentEntity entity, double x, double y}); @@ -39,6 +34,8 @@ class TextureDetails { } abstract class AbstractFilamentViewer { + Future get initialized; + /// /// The result(s) of calling [pick] (see below). /// This may be a broadcast stream, so you should ensure you have subscribed to this stream before calling [pick]. @@ -598,9 +595,14 @@ abstract class AbstractFilamentViewer { Future setPriority(FilamentEntity entityId, int priority); /// - /// The Scene holds the transform gizmo and all loaded entities/lights. + /// The Scene holds all loaded entities/lights. /// Scene get scene; + + /// + /// + /// + AbstractGizmo? get gizmo; } /// @@ -641,9 +643,16 @@ abstract class Scene { /// Attach the gizmo to the specified entity. /// void select(FilamentEntity entity); - - /// - /// The transform gizmo. - /// - Future get gizmo; +} + +abstract class AbstractGizmo { + bool get isActive; + + void translate(double transX, double transY); + + void reset(); + + void attach(FilamentEntity entity); + + void detach(); } diff --git a/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart b/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart index 77ea3688..b8bdacac 100644 --- a/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart +++ b/dart_filament/lib/dart_filament/compatibility/native/compatibility.dart @@ -3,6 +3,7 @@ import 'dart:ffi'; import 'package:ffi/ffi.dart'; export 'package:ffi/ffi.dart'; +export 'dart:ffi'; export 'dart_filament.g.dart'; final allocator = calloc; @@ -20,7 +21,7 @@ Future withVoidCallback( nativeCallable.close(); } -Future> withVoidPointerCallback( +Future withVoidPointerCallback( Function(Pointer)>>) func) async { final completer = Completer>(); @@ -31,9 +32,9 @@ Future> withVoidPointerCallback( final nativeCallable = NativeCallable)>.listener(callback); func.call(nativeCallable.nativeFunction); - await completer.future; + var ptr = await completer.future; nativeCallable.close(); - return completer.future; + return ptr.address; } Future withBoolCallback( diff --git a/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart b/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart index 24425a5c..6921b973 100644 --- a/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart +++ b/dart_filament/lib/dart_filament/compatibility/native/dart_filament.g.dart @@ -2,42 +2,43 @@ // // Generated by `package:ffigen`. // ignore_for_file: type=lint +@ffi.DefaultAsset('package:dart_filament/dart_filament.dart') +library; + import 'dart:ffi' as ffi; @ffi.Native< - ffi.Pointer Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer)>( - symbol: 'create_filament_viewer', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Pointer Function(LoadFilamentResourceFromOwner, + FreeFilamentResourceFromOwner, ffi.Pointer)>() +external ffi.Pointer make_resource_loader( + LoadFilamentResourceFromOwner loadFn, + FreeFilamentResourceFromOwner freeFn, + ffi.Pointer owner, +); + +@ffi.Native< + ffi.Pointer Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>() external ffi.Pointer create_filament_viewer( ffi.Pointer context, - ffi.Pointer loader, + ffi.Pointer loader, ffi.Pointer platform, ffi.Pointer uberArchivePath, ); -@ffi.Native)>( - symbol: 'destroy_filament_viewer', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() external void destroy_filament_viewer( ffi.Pointer viewer, ); -@ffi.Native Function(ffi.Pointer)>( - symbol: 'get_scene_manager', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native Function(ffi.Pointer)>() 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') + ffi.Void Function( + ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32)>() external void create_render_target( ffi.Pointer viewer, int texture, @@ -45,18 +46,13 @@ external void create_render_target( int height, ); -@ffi.Native)>( - symbol: 'clear_background_image', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool)>() external void set_background_image( ffi.Pointer viewer, ffi.Pointer path, @@ -64,10 +60,7 @@ external void set_background_image( ); @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') + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>() external void set_background_image_position( ffi.Pointer viewer, double x, @@ -76,10 +69,8 @@ external void set_background_image_position( ); @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') + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() external void set_background_color( ffi.Pointer viewer, double r, @@ -88,72 +79,62 @@ external void set_background_color( double a, ); -@ffi.Native, ffi.Int)>( - symbol: 'set_tone_mapping', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Int)>() external void set_tone_mapping( ffi.Pointer viewer, int toneMapping, ); -@ffi.Native, ffi.Float)>( - symbol: 'set_bloom', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Float)>() external void set_bloom( ffi.Pointer viewer, double strength, ); -@ffi.Native, ffi.Pointer)>( - symbol: 'load_skybox', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Pointer)>() 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') + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Float)>() 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') +@ffi.Native, ffi.Pointer)>() external void rotate_ibl( ffi.Pointer viewer, ffi.Pointer rotationMatrix, ); -@ffi.Native)>( - symbol: 'remove_skybox', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() external void remove_skybox( ffi.Pointer viewer, ); -@ffi.Native)>( - symbol: 'remove_ibl', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + EntityId Function( + ffi.Pointer, + ffi.Uint8, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Float, + ffi.Bool)>() external int add_light( ffi.Pointer viewer, int type, @@ -168,23 +149,19 @@ external int add_light( bool shadows, ); -@ffi.Native, EntityId)>( - symbol: 'remove_light', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() external void remove_light( ffi.Pointer viewer, int entityId, ); -@ffi.Native)>( - symbol: 'clear_lights', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int)>() external int load_glb( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -192,10 +169,7 @@ external int load_glb( ); @ffi.Native< - EntityId Function( - ffi.Pointer, ffi.Pointer, ffi.Size)>( - symbol: 'load_glb_from_buffer', - assetId: 'package:dart_filament/dart_filament.dart') + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Size)>() external int load_glb_from_buffer( ffi.Pointer sceneManager, ffi.Pointer data, @@ -203,85 +177,68 @@ external int load_glb_from_buffer( ); @ffi.Native< - EntityId Function(ffi.Pointer, ffi.Pointer, - ffi.Pointer)>( - symbol: 'load_gltf', assetId: 'package:dart_filament/dart_filament.dart') + EntityId Function( + ffi.Pointer, ffi.Pointer, ffi.Pointer)>() 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') +@ffi.Native, EntityId)>() external int create_instance( ffi.Pointer sceneManager, int id, ); -@ffi.Native, EntityId)>( - symbol: 'get_instance_count', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() 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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer)>() 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') +@ffi.Native)>() external void set_main_camera( ffi.Pointer viewer, ); -@ffi.Native)>( - symbol: 'get_main_camera', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer)>() 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') +@ffi.Native, ffi.Bool)>() 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') + 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)>() external void render( ffi.Pointer viewer, int frameTimeInNanos, @@ -295,10 +252,8 @@ external void render( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, ffi.Pointer, - ffi.Uint32, ffi.Uint32)>( - symbol: 'create_swap_chain', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Uint32, ffi.Uint32)>() external void create_swap_chain( ffi.Pointer viewer, ffi.Pointer window, @@ -306,26 +261,20 @@ external void create_swap_chain( int height, ); -@ffi.Native)>( - symbol: 'destroy_swap_chain', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() external void destroy_swap_chain( ffi.Pointer viewer, ); -@ffi.Native, ffi.Float)>( - symbol: 'set_frame_interval', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Float)>() 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') + ffi.Void Function( + ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float)>() external void update_viewport_and_camera_projection( ffi.Pointer viewer, int width, @@ -333,17 +282,13 @@ external void update_viewport_and_camera_projection( double scaleFactor, ); -@ffi.Native)>( - symbol: 'scroll_begin', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>() external void scroll_update( ffi.Pointer viewer, double x, @@ -351,16 +296,13 @@ external void scroll_update( double z, ); -@ffi.Native)>( - symbol: 'scroll_end', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>() external void grab_begin( ffi.Pointer viewer, double x, @@ -368,25 +310,21 @@ external void grab_begin( bool pan, ); -@ffi.Native, ffi.Float, ffi.Float)>( - symbol: 'grab_update', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Float, ffi.Float)>() external void grab_update( ffi.Pointer viewer, double x, double y, ); -@ffi.Native)>( - symbol: 'grab_end', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer, ffi.Int)>() external void apply_weights( ffi.Pointer sceneManager, int asset, @@ -396,10 +334,8 @@ external void apply_weights( ); @ffi.Native< - ffi.Bool Function( - ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>( - symbol: 'set_morph_target_weights', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Bool Function( + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>() external bool set_morph_target_weights( ffi.Pointer sceneManager, int asset, @@ -408,16 +344,8 @@ external bool set_morph_target_weights( ); @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') + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer, ffi.Int, ffi.Int, ffi.Float)>() external bool set_morph_animation( ffi.Pointer sceneManager, int asset, @@ -428,27 +356,23 @@ external bool set_morph_animation( double frameLengthInMs, ); -@ffi.Native, EntityId)>( - symbol: 'reset_to_rest_pose', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() 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') + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Float, + ffi.Bool)>() external void add_bone_animation( ffi.Pointer sceneManager, int asset, @@ -462,14 +386,8 @@ external void add_bone_animation( ); @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') + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>() external bool set_bone_transform( ffi.Pointer sceneManager, int asset, @@ -479,10 +397,8 @@ external bool set_bone_transform( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Float)>() external void play_animation( ffi.Pointer sceneManager, int asset, @@ -494,9 +410,7 @@ external void play_animation( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( - symbol: 'set_animation_frame', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() external void set_animation_frame( ffi.Pointer sceneManager, int asset, @@ -504,28 +418,22 @@ external void set_animation_frame( int animationFrame, ); -@ffi.Native, EntityId, ffi.Int)>( - symbol: 'stop_animation', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId, ffi.Int)>() 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') +@ffi.Native, EntityId)>() 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') + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Pointer, ffi.Int)>() external void get_animation_name( ffi.Pointer sceneManager, int asset, @@ -533,9 +441,7 @@ external void get_animation_name( int index, ); -@ffi.Native, EntityId, ffi.Int)>( - symbol: 'get_animation_duration', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId, ffi.Int)>() external double get_animation_duration( ffi.Pointer sceneManager, int asset, @@ -543,10 +449,8 @@ external double get_animation_duration( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer, ffi.Int)>() external void get_morph_target_name( ffi.Pointer sceneManager, int asset, @@ -556,43 +460,27 @@ external void get_morph_target_name( ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: 'get_morph_target_name_count', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() 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') +@ffi.Native, EntityId)>() external void remove_entity( ffi.Pointer viewer, int asset, ); -@ffi.Native)>( - symbol: 'clear_entities', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Bool Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Int, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() external bool set_material_color( ffi.Pointer sceneManager, int asset, @@ -604,19 +492,15 @@ external bool set_material_color( double a, ); -@ffi.Native, EntityId)>( - symbol: 'transform_to_unit_cube', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() 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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Bool)>() external void queue_position_update( ffi.Pointer sceneManager, int asset, @@ -627,10 +511,8 @@ external void queue_position_update( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Float, ffi.Float, ffi.Bool)>() external void queue_rotation_update( ffi.Pointer sceneManager, int asset, @@ -643,9 +525,8 @@ external void queue_rotation_update( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>( - symbol: 'set_position', assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Float, ffi.Float, ffi.Float)>() external void set_position( ffi.Pointer sceneManager, int asset, @@ -655,9 +536,8 @@ external void set_position( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, ffi.Float, + ffi.Float, ffi.Float, ffi.Float)>() external void set_rotation( ffi.Pointer sceneManager, int asset, @@ -668,27 +548,21 @@ external void set_rotation( double w, ); -@ffi.Native, EntityId, ffi.Float)>( - symbol: 'set_scale', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId, ffi.Float)>() 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') +@ffi.Native, EntityId)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>() external void set_camera_exposure( ffi.Pointer viewer, double aperture, @@ -697,10 +571,7 @@ external void set_camera_exposure( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>( - symbol: 'set_camera_position', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Float)>() external void set_camera_position( ffi.Pointer viewer, double x, @@ -708,18 +579,14 @@ external void set_camera_position( double z, ); -@ffi.Native)>( - symbol: 'get_camera_position', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() external void set_camera_rotation( ffi.Pointer viewer, double w, @@ -728,40 +595,30 @@ external void set_camera_rotation( double z, ); -@ffi.Native, ffi.Pointer)>( - symbol: 'set_camera_model_matrix', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Pointer)>() 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') +@ffi.Native Function(ffi.Pointer)>() 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') +@ffi.Native Function(ffi.Pointer)>() 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') +@ffi.Native Function(ffi.Pointer)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double, ffi.Double)>() external void set_camera_projection_matrix( ffi.Pointer viewer, ffi.Pointer matrix, @@ -769,73 +626,55 @@ external void set_camera_projection_matrix( double far, ); -@ffi.Native, ffi.Double, ffi.Double)>( - symbol: 'set_camera_culling', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Double, ffi.Double)>() 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') +@ffi.Native)>() external double get_camera_culling_near( ffi.Pointer viewer, ); -@ffi.Native)>( - symbol: 'get_camera_culling_far', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') +@ffi.Native Function(ffi.Pointer)>() 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') +@ffi.Native Function(ffi.Pointer)>() 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') +@ffi.Native, ffi.Float, ffi.Float)>() 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') +@ffi.Native, ffi.Float)>() 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') +@ffi.Native, ffi.Float)>() 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') + ffi.Void Function(ffi.Pointer, _ManipulatorMode, ffi.Double, + ffi.Double, ffi.Double)>() external void set_camera_manipulator_options( ffi.Pointer viewer, int mode, @@ -845,9 +684,7 @@ external void set_camera_manipulator_options( ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: 'hide_mesh', assetId: 'package:dart_filament/dart_filament.dart') + ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() external int hide_mesh( ffi.Pointer sceneManager, int asset, @@ -855,27 +692,21 @@ external int hide_mesh( ); @ffi.Native< - ffi.Int Function( - ffi.Pointer, EntityId, ffi.Pointer)>( - symbol: 'reveal_mesh', assetId: 'package:dart_filament/dart_filament.dart') + ffi.Int Function(ffi.Pointer, EntityId, ffi.Pointer)>() 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') +@ffi.Native, ffi.Bool)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Bool, ffi.Bool, ffi.Bool)>() external void set_antialiasing( ffi.Pointer viewer, bool msaa, @@ -884,16 +715,14 @@ external void set_antialiasing( ); @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: 'pick', assetId: 'package:dart_filament/dart_filament.dart') -external void pick( + ffi.Void Function( + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId, ffi.Int x, ffi.Int y)>>)>() +external void filament_pick( ffi.Pointer viewer, int x, int y, @@ -903,28 +732,21 @@ external void pick( callback, ); -@ffi.Native Function(ffi.Pointer, EntityId)>( - symbol: 'get_name_for_entity', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native Function(ffi.Pointer, EntityId)>() 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') + EntityId Function(ffi.Pointer, EntityId, ffi.Pointer)>() 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') +@ffi.Native, EntityId, ffi.Bool)>() external int get_entity_count( ffi.Pointer sceneManager, int target, @@ -932,9 +754,8 @@ external int get_entity_count( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>( - symbol: 'get_entities', assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function( + ffi.Pointer, EntityId, ffi.Bool, ffi.Pointer)>() external void get_entities( ffi.Pointer sceneManager, int target, @@ -943,10 +764,8 @@ external void get_entities( ); @ffi.Native< - ffi.Pointer Function( - ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>( - symbol: 'get_entity_name_at', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Pointer Function( + ffi.Pointer, EntityId, ffi.Int, ffi.Bool)>() external ffi.Pointer get_entity_name_at( ffi.Pointer sceneManager, int target, @@ -954,43 +773,34 @@ external ffi.Pointer get_entity_name_at( bool renderableOnly, ); -@ffi.Native, ffi.Bool)>( - symbol: 'set_recording', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Bool)>() 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') +@ffi.Native, ffi.Pointer)>() external void set_recording_output_directory( ffi.Pointer viewer, ffi.Pointer outputDirectory, ); -@ffi.Native( - symbol: 'ios_dummy', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native() external void ios_dummy(); -@ffi.Native)>( - symbol: 'flutter_filament_free', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(EntityId entityId1, EntityId entityId2)>>, + ffi.Bool)>() external void add_collision_component( ffi.Pointer sceneManager, int entityId, @@ -1001,33 +811,21 @@ external void add_collision_component( bool affectsCollidingTransform, ); -@ffi.Native, EntityId)>( - symbol: 'remove_collision_component', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() external void remove_collision_component( ffi.Pointer sceneManager, int entityId, ); -@ffi.Native, EntityId)>( - symbol: 'add_animation_component', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() 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') + EntityId Function(ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Pointer, ffi.Int, ffi.Int, ffi.Pointer)>() external int create_geometry( ffi.Pointer viewer, ffi.Pointer vertices, @@ -1038,59 +836,50 @@ external int create_geometry( ffi.Pointer materialPath, ); -@ffi.Native, EntityId, EntityId)>( - symbol: 'set_parent', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId, EntityId)>() external void set_parent( ffi.Pointer sceneManager, int child, int parent, ); -@ffi.Native, EntityId)>( - symbol: 'test_collisions', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() external void test_collisions( ffi.Pointer sceneManager, int entity, ); -@ffi.Native, EntityId, ffi.Int)>( - symbol: 'set_priority', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId, ffi.Int)>() 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') +@ffi.Native, ffi.Pointer)>() 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') + 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)>>)>() external void create_filament_viewer_ffi( ffi.Pointer context, ffi.Pointer platform, ffi.Pointer uberArchivePath, - ffi.Pointer loader, + ffi.Pointer loader, ffi.Pointer< ffi.NativeFunction< ffi.Void Function(ffi.Pointer renderCallbackOwner)>> @@ -1102,14 +891,8 @@ external void create_filament_viewer_ffi( ); @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') + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Uint32, + ffi.Uint32, ffi.Pointer>)>() external void create_swap_chain_ffi( ffi.Pointer viewer, ffi.Pointer surface, @@ -1119,20 +902,16 @@ external void create_swap_chain_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>( - symbol: 'destroy_swap_chain_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, + ffi.Pointer>)>() 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') + ffi.Void Function(ffi.Pointer, ffi.IntPtr, ffi.Uint32, ffi.Uint32, + ffi.Pointer>)>() external void create_render_target_ffi( ffi.Pointer viewer, int nativeTextureId, @@ -1141,47 +920,36 @@ external void create_render_target_ffi( ffi.Pointer> onComplete, ); -@ffi.Native)>( - symbol: 'destroy_filament_viewer_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() external void destroy_filament_viewer_ffi( ffi.Pointer viewer, ); -@ffi.Native)>( - symbol: 'render_ffi', assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() external void render_ffi( ffi.Pointer viewer, ); -@ffi.Native( - symbol: 'make_render_callback_fn_pointer', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native() external FilamentRenderCallback make_render_callback_fn_pointer( FilamentRenderCallback arg0, ); -@ffi.Native, ffi.Bool)>( - symbol: 'set_rendering_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Bool)>() 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') +@ffi.Native, ffi.Float)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, ffi.Float, + ffi.Pointer>)>() external void update_viewport_and_camera_projection_ffi( ffi.Pointer viewer, int width, @@ -1191,10 +959,8 @@ external void update_viewport_and_camera_projection_ffi( ); @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') + ffi.Void Function( + ffi.Pointer, ffi.Float, ffi.Float, ffi.Float, ffi.Float)>() external void set_background_color_ffi( ffi.Pointer viewer, double r, @@ -1203,18 +969,14 @@ external void set_background_color_ffi( double a, ); -@ffi.Native)>( - symbol: 'clear_background_image_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Bool, + ffi.Pointer>)>() external void set_background_image_ffi( ffi.Pointer viewer, ffi.Pointer path, @@ -1223,10 +985,7 @@ external void set_background_image_ffi( ); @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') + ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, ffi.Bool)>() external void set_background_image_position_ffi( ffi.Pointer viewer, double x, @@ -1234,27 +993,21 @@ external void set_background_image_position_ffi( bool clamp, ); -@ffi.Native, ffi.Int)>( - symbol: 'set_tone_mapping_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Int)>() 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') +@ffi.Native, ffi.Float)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>() external void load_skybox_ffi( ffi.Pointer viewer, ffi.Pointer skyboxPath, @@ -1262,45 +1015,38 @@ external void load_skybox_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, ffi.Pointer, ffi.Float)>( - symbol: 'load_ibl_ffi', assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function( + ffi.Pointer, ffi.Pointer, ffi.Float)>() 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') +@ffi.Native)>() external void remove_skybox_ffi( ffi.Pointer viewer, ); -@ffi.Native)>( - symbol: 'remove_ibl_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + 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>)>() external void add_light_ffi( ffi.Pointer viewer, int type, @@ -1316,25 +1062,20 @@ external void add_light_ffi( ffi.Pointer> callback, ); -@ffi.Native, EntityId)>( - symbol: 'remove_light_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId)>() external void remove_light_ffi( ffi.Pointer viewer, int entityId, ); -@ffi.Native)>( - symbol: 'clear_lights_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native)>() 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') + ffi.Void Function(ffi.Pointer, ffi.Pointer, ffi.Int, + ffi.Pointer>)>() external void load_glb_ffi( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -1343,14 +1084,12 @@ external void load_glb_ffi( ); @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') + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Size, + ffi.Int, + ffi.Pointer>)>() external void load_glb_from_buffer_ffi( ffi.Pointer sceneManager, ffi.Pointer data, @@ -1360,13 +1099,11 @@ external void load_glb_from_buffer_ffi( ); @ffi.Native< - ffi.Void Function( - ffi.Pointer, - ffi.Pointer, - ffi.Pointer, - ffi.Pointer>)>( - symbol: 'load_gltf_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>() external void load_gltf_ffi( ffi.Pointer sceneManager, ffi.Pointer assetPath, @@ -1375,10 +1112,8 @@ external void load_gltf_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: 'create_instance_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>() external void create_instance_ffi( ffi.Pointer sceneManager, int entityId, @@ -1386,10 +1121,8 @@ external void create_instance_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: 'remove_entity_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>() external void remove_entity_ffi( ffi.Pointer viewer, int asset, @@ -1397,23 +1130,16 @@ external void remove_entity_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, - ffi.Pointer>)>( - symbol: 'clear_entities_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, + ffi.Pointer>)>() 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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer>)>() external void set_camera_ffi( ffi.Pointer viewer, int asset, @@ -1422,10 +1148,8 @@ external void set_camera_ffi( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer, ffi.Int)>() external void apply_weights_ffi( ffi.Pointer sceneManager, int asset, @@ -1435,10 +1159,8 @@ external void apply_weights_ffi( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Bool, + ffi.Bool, ffi.Bool, ffi.Float)>() external void play_animation_ffi( ffi.Pointer sceneManager, int asset, @@ -1450,9 +1172,7 @@ external void play_animation_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>( - symbol: 'set_animation_frame_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int)>() external void set_animation_frame_ffi( ffi.Pointer sceneManager, int asset, @@ -1460,9 +1180,7 @@ external void set_animation_frame_ffi( int animationFrame, ); -@ffi.Native, EntityId, ffi.Int)>( - symbol: 'stop_animation_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, EntityId, ffi.Int)>() external void stop_animation_ffi( ffi.Pointer sceneManager, int asset, @@ -1470,10 +1188,8 @@ external void stop_animation_ffi( ); @ffi.Native< - ffi.Void Function(ffi.Pointer, EntityId, - ffi.Pointer>)>( - symbol: 'get_animation_count_ffi', - assetId: 'package:dart_filament/dart_filament.dart') + ffi.Void Function(ffi.Pointer, EntityId, + ffi.Pointer>)>() external void get_animation_count_ffi( ffi.Pointer sceneManager, int asset, @@ -1481,14 +1197,8 @@ external void get_animation_count_ffi( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Int, ffi.Pointer>)>() external void get_animation_name_ffi( ffi.Pointer sceneManager, int asset, @@ -1498,15 +1208,13 @@ external void get_animation_name_ffi( ); @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') + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>() external void get_morph_target_name_ffi( ffi.Pointer sceneManager, int asset, @@ -1517,13 +1225,8 @@ external void get_morph_target_name_ffi( ); @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') + ffi.Void Function(ffi.Pointer, EntityId, ffi.Pointer, + ffi.Pointer>)>() external void get_morph_target_name_count_ffi( ffi.Pointer sceneManager, int asset, @@ -1532,14 +1235,12 @@ external void get_morph_target_name_count_ffi( ); @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') + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer>)>() external void set_morph_target_weights_ffi( ffi.Pointer sceneManager, int asset, @@ -1549,15 +1250,13 @@ external void set_morph_target_weights_ffi( ); @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') + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>() external void set_bone_transform_ffi( ffi.Pointer sceneManager, int asset, @@ -1568,18 +1267,16 @@ external void set_bone_transform_ffi( ); @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') + ffi.Void Function( + ffi.Pointer, + EntityId, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Pointer>, + ffi.Int, + ffi.Float, + ffi.Bool)>() external void add_bone_animation_ffi( ffi.Pointer sceneManager, int asset, @@ -1592,39 +1289,31 @@ external void add_bone_animation_ffi( bool isModelSpace, ); -@ffi.Native, ffi.Bool)>( - symbol: 'set_post_processing_ffi', - assetId: 'package:dart_filament/dart_filament.dart') +@ffi.Native, ffi.Bool)>() 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') +@ffi.Native, EntityId)>() 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') +@ffi.Native() 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') + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int, + ffi.Pointer, + ffi.Int, + ffi.Int, + ffi.Pointer, + ffi.Pointer>)>() external void create_geometry_ffi( ffi.Pointer viewer, ffi.Pointer vertices, @@ -1636,6 +1325,16 @@ external void create_geometry_ffi( ffi.Pointer> callback, ); +final class ResourceBuffer extends ffi.Struct { + external ffi.Pointer data; + + @ffi.Int32() + external int size; + + @ffi.Int32() + external int id; +} + final class ResourceLoaderWrapper extends ffi.Struct { external LoadFilamentResource loadResource; @@ -1654,17 +1353,6 @@ 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); diff --git a/dart_filament/lib/dart_filament/compatibility/web/interop/dart_filament_js_export_type.dart b/dart_filament/lib/dart_filament/compatibility/web/interop/dart_filament_js_export_type.dart new file mode 100644 index 00000000..28faf49f --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/web/interop/dart_filament_js_export_type.dart @@ -0,0 +1,555 @@ +@JS() +library flutter_filament_js; + +import 'dart:js_interop'; + +import 'package:animation_tools_dart/src/morph_animation_data.dart'; +import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart'; +import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; +import 'package:dart_filament/dart_filament/compatibility/web/interop/dart_filament_js_extension_type.dart'; +import 'dart:js_interop_unsafe'; + +@JSExport() +class DartFilamentJSExportViewer { + final AbstractFilamentViewer viewer; + + static void initializeBindings(AbstractFilamentViewer viewer) { + print("Initializing JS bindings"); + var shim = DartFilamentJSExportViewer(viewer); + var wrapper = createJSInteropWrapper(shim) + as DartFilamentJSShim; + globalContext.setProperty("filamentViewer".toJS, wrapper); + print("Set global context property"); + } + + DartFilamentJSExportViewer(this.viewer); + + JSPromise get initialized { + return viewer.initialized.then((v) => v.toJS).toJS; + } + + @JSExport() + JSBoolean get rendering => viewer.rendering.toJS; + + @JSExport() + JSPromise setRendering(bool render) { + return viewer.setRendering(render).toJS; + } + + @JSExport() + JSPromise render() => viewer.render().toJS; + + @JSExport() + JSPromise setFrameRate(int framerate) => viewer.setFrameRate(framerate).toJS; + + @JSExport() + JSPromise dispose() => viewer.dispose().toJS; + + @JSExport() + JSPromise setBackgroundImage(String path, {bool fillHeight = false}) => + viewer.setBackgroundImage(path, fillHeight: fillHeight).toJS; + + @JSExport() + JSPromise setBackgroundImagePosition(double x, double y, + {bool clamp = false}) => + viewer.setBackgroundImagePosition(x, y, clamp: clamp).toJS; + + @JSExport() + JSPromise clearBackgroundImage() => viewer.clearBackgroundImage().toJS; + + @JSExport() + JSPromise setBackgroundColor(double r, double g, double b, double alpha) => + viewer.setBackgroundColor(r, g, b, alpha).toJS; + + @JSExport() + JSPromise loadSkybox(String skyboxPath) => viewer.loadSkybox(skyboxPath).toJS; + + @JSExport() + JSPromise removeSkybox() => viewer.removeSkybox().toJS; + + @JSExport() + JSPromise loadIbl(String lightingPath, {double intensity = 30000}) => + viewer.loadIbl(lightingPath, intensity: intensity).toJS; + + @JSExport() + JSPromise rotateIbl(JSArray rotation) => throw UnimplementedError(); + // viewer.rotateIbl(rotation.toDartMatrix3()).toJS; + + @JSExport() + JSPromise removeIbl() => viewer.removeIbl().toJS; + + @JSExport() + JSPromise addLight( + int type, + double colour, + double intensity, + double posX, + double posY, + double posZ, + double dirX, + double dirY, + double dirZ, + bool castShadows) { + return viewer + .addLight(type, colour, intensity, posX, posY, posZ, dirX, dirY, dirZ, + castShadows) + .then((entity) => entity.toJS) + .toJS; + } + + @JSExport() + JSPromise removeLight(FilamentEntity light) => viewer.removeLight(light).toJS; + + @JSExport() + JSPromise clearLights() => viewer.clearLights().toJS; + + @JSExport() + JSPromise loadGlb(String path, {int numInstances = 1}) { + return viewer + .loadGlb(path, numInstances: numInstances) + .then((entity) => entity.toJS) + .toJS; + } + + @JSExport() + JSPromise createInstance(FilamentEntity entity) { + return viewer.createInstance(entity).then((instance) => instance.toJS).toJS; + } + + @JSExport() + JSPromise getInstanceCount(FilamentEntity entity) => + viewer.getInstanceCount(entity).then((v) => v.toJS).toJS; + + @JSExport() + JSPromise> getInstances(FilamentEntity entity) { + return viewer + .getInstances(entity) + .then((instances) => + instances.map((instance) => instance.toJS).toList().toJS) + .toJS; + } + + @JSExport() + JSPromise loadGltf(String path, String relativeResourcePath, + {bool force = false}) { + return viewer + .loadGltf(path, relativeResourcePath, force: force) + .then((entity) => entity.toJS) + .toJS; + } + + @JSExport() + JSPromise panStart(double x, double y) => viewer.panStart(x, y).toJS; + + @JSExport() + JSPromise panUpdate(double x, double y) => viewer.panUpdate(x, y).toJS; + + @JSExport() + JSPromise panEnd() => viewer.panEnd().toJS; + + @JSExport() + JSPromise rotateStart(double x, double y) => viewer.rotateStart(x, y).toJS; + + @JSExport() + JSPromise rotateUpdate(double x, double y) => viewer.rotateUpdate(x, y).toJS; + + @JSExport() + JSPromise rotateEnd() => viewer.rotateEnd().toJS; + + @JSExport() + JSPromise setMorphTargetWeights( + FilamentEntity entity, List weights) => + viewer.setMorphTargetWeights(entity, weights).toJS; + + @JSExport() + JSPromise> getMorphTargetNames( + FilamentEntity entity, String meshName) => + viewer + .getMorphTargetNames(entity, meshName) + .then((v) => v.map((s) => s.toJS).toList().toJS) + .toJS; + + @JSExport() + JSPromise> getAnimationNames(FilamentEntity entity) => + viewer + .getAnimationNames(entity) + .then((v) => v.map((s) => s.toJS).toList().toJS) + .toJS; + + @JSExport() + JSPromise getAnimationDuration( + FilamentEntity entity, int animationIndex) => + viewer + .getAnimationDuration(entity, animationIndex) + .then((v) => v.toJS) + .toJS; + + @JSExport() + JSPromise setMorphAnimationData( + FilamentEntity entity, + JSArray> animation, + JSArray morphTargets, + JSArray targetMeshNames) => + viewer + .setMorphAnimationData( + entity, + MorphAnimationData( + animation.toDart + .map((x) => x.toDart.map((y) => y.toDartDouble).toList()) + .toList(), + morphTargets.toDart.map((m) => m.toDart).toList()), + targetMeshNames: + targetMeshNames.toDart.map((x) => x.toDart).toList(), + ) + .toJS; + + @JSExport() + JSPromise resetBones(FilamentEntity entity) => viewer.resetBones(entity).toJS; + + @JSExport() + JSPromise addBoneAnimation(FilamentEntity entity, JSObject animation) { + throw Exception(); + } + // viewer + // .addBoneAnimation( + // entity, + // BoneAnimationData._fromJSObject(animation), + // ) + // .toJS; + + @JSExport() + JSPromise removeEntity(FilamentEntity entity) => + viewer.removeEntity(entity).toJS; + + @JSExport() + JSPromise clearEntities() => viewer.clearEntities().toJS; + + @JSExport() + JSPromise zoomBegin() => viewer.zoomBegin().toJS; + + @JSExport() + JSPromise zoomUpdate(double x, double y, double z) => + viewer.zoomUpdate(x, y, z).toJS; + + @JSExport() + JSPromise zoomEnd() => viewer.zoomEnd().toJS; + + @JSExport() + JSPromise playAnimation(FilamentEntity entity, int index, + {bool loop = false, + bool reverse = false, + bool replaceActive = true, + double crossfade = 0.0}) => + viewer + .playAnimation( + entity, + index, + loop: loop, + reverse: reverse, + replaceActive: replaceActive, + crossfade: crossfade, + ) + .toJS; + + @JSExport() + JSPromise playAnimationByName(FilamentEntity entity, String name, + {bool loop = false, + bool reverse = false, + bool replaceActive = true, + double crossfade = 0.0}) => + viewer + .playAnimationByName( + entity, + name, + loop: loop, + reverse: reverse, + replaceActive: replaceActive, + crossfade: crossfade, + ) + .toJS; + + @JSExport() + JSPromise setAnimationFrame( + FilamentEntity entity, int index, int animationFrame) => + viewer + .setAnimationFrame( + entity, + index, + animationFrame, + ) + .toJS; + + @JSExport() + JSPromise stopAnimation(FilamentEntity entity, int animationIndex) => + viewer.stopAnimation(entity, animationIndex).toJS; + + @JSExport() + JSPromise stopAnimationByName(FilamentEntity entity, String name) => + viewer.stopAnimationByName(entity, name).toJS; + + @JSExport() + JSPromise setCamera(FilamentEntity entity, String? name) => + viewer.setCamera(entity, name).toJS; + + @JSExport() + JSPromise setMainCamera() => viewer.setMainCamera().toJS; + + @JSExport() + JSPromise getMainCamera() { + return viewer.getMainCamera().then((camera) => camera.toJS).toJS; + } + + @JSExport() + JSPromise setCameraFov(double degrees, double width, double height) => + viewer.setCameraFov(degrees, width, height).toJS; + + @JSExport() + JSPromise setToneMapping(int mapper) => + viewer.setToneMapping(ToneMapper.values[mapper]).toJS; + + @JSExport() + JSPromise setBloom(double bloom) => viewer.setBloom(bloom).toJS; + + @JSExport() + JSPromise setCameraFocalLength(double focalLength) => + viewer.setCameraFocalLength(focalLength).toJS; + + @JSExport() + JSPromise setCameraCulling(double near, double far) => + viewer.setCameraCulling(near, far).toJS; + + @JSExport() + JSPromise getCameraCullingNear() => + viewer.getCameraCullingNear().then((v) => v.toJS).toJS; + + @JSExport() + JSPromise getCameraCullingFar() => + viewer.getCameraCullingFar().then((v) => v.toJS).toJS; + + @JSExport() + JSPromise setCameraFocusDistance(double focusDistance) => + viewer.setCameraFocusDistance(focusDistance).toJS; + + @JSExport() + JSPromise> getCameraPosition() { + throw UnimplementedError(); + // return viewer.getCameraPosition().then((position) => position.toJS).toJS; + } + + @JSExport() + JSPromise> getCameraModelMatrix() { + throw UnimplementedError(); + // return viewer.getCameraModelMatrix().then((matrix) => matrix.toJSArray()).toJS; + } + + @JSExport() + JSPromise> getCameraViewMatrix() { + throw UnimplementedError(); + // return viewer.getCameraViewMatrix().then((matrix) => matrix.toJSArray()).toJS; + } + + @JSExport() + JSPromise> getCameraProjectionMatrix() { + throw UnimplementedError(); + // return viewer.getCameraProjectionMatrix().then((matrix) => matrix.toJSArray()).toJS; + } + + @JSExport() + JSPromise> getCameraCullingProjectionMatrix() { + throw UnimplementedError(); + // return viewer.getCameraCullingProjectionMatrix().then((matrix) => matrix.toJSArray()).toJS; + } + + @JSExport() + JSPromise getCameraFrustum() { + throw UnimplementedError(); + // return viewer.getCameraFrustum().then((frustum) => frustum.toJS).toJS; + } + + @JSExport() + JSPromise setCameraPosition(double x, double y, double z) => + viewer.setCameraPosition(x, y, z).toJS; + @JSExport() + JSPromise> getCameraRotation() { + return viewer + .getCameraRotation() + .then((rotation) => rotation.storage.map((v) => v.toJS).toList().toJS) + .toJS; + } + + @JSExport() + JSPromise moveCameraToAsset(FilamentEntity entity) => + throw UnimplementedError(); +// viewer.moveCameraToAsset(entity)).toJS; + @JSExport() + JSPromise setViewFrustumCulling(JSBoolean enabled) => + throw UnimplementedError(); +// viewer.setViewFrustumCulling(enabled).toJS; + @JSExport() + JSPromise setCameraExposure( + double aperture, double shutterSpeed, double sensitivity) => + viewer.setCameraExposure(aperture, shutterSpeed, sensitivity).toJS; + @JSExport() + JSPromise setCameraRotation(JSArray quaternion) => + throw UnimplementedError(); +// viewer.setCameraRotation(quaternion.toDartQuaternion()).toJS; + @JSExport() + JSPromise setCameraModelMatrix(List matrix) => + viewer.setCameraModelMatrix(matrix).toJS; + @JSExport() + JSPromise setMaterialColor(FilamentEntity entity, String meshName, + int materialIndex, double r, double g, double b, double a) => + throw UnimplementedError(); +// viewer.setMaterialColor( +// entity), +// meshName, +// materialIndex, +// r, +// g, +// b, +// a, +// ).toJS; + @JSExport() + JSPromise transformToUnitCube(FilamentEntity entity) => + viewer.transformToUnitCube(entity).toJS; + @JSExport() + JSPromise setPosition(FilamentEntity entity, double x, double y, double z) => + viewer.setPosition(entity, x, y, z).toJS; + @JSExport() + JSPromise setScale(FilamentEntity entity, double scale) => + viewer.setScale(entity, scale).toJS; + @JSExport() + JSPromise setRotation( + FilamentEntity entity, double rads, double x, double y, double z) => + viewer.setRotation(entity, rads, x, y, z).toJS; + @JSExport() + JSPromise queuePositionUpdate( + FilamentEntity entity, double x, double y, double z, bool relative) => + viewer + .queuePositionUpdate( + entity, + x, + y, + z, + relative: relative, + ) + .toJS; + @JSExport() + JSPromise queueRotationUpdate(FilamentEntity entity, double rads, double x, + double y, double z, bool relative) => + viewer + .queueRotationUpdate( + entity, + rads, + x, + y, + z, + relative: relative, + ) + .toJS; + @JSExport() + JSPromise queueRotationUpdateQuat( + FilamentEntity entity, JSArray quat, JSBoolean relative) => + throw UnimplementedError(); +// viewer.queueRotationUpdateQuat( +// entity, +// quat.toDartQuaternion(), +// relative: relative, +// ).toJS; + + @JSExport() + JSPromise setPostProcessing(bool enabled) => + viewer.setPostProcessing(enabled).toJS; + @JSExport() + JSPromise setAntiAliasing(bool msaa, bool fxaa, bool taa) => + viewer.setAntiAliasing(msaa, fxaa, taa).toJS; + @JSExport() + JSPromise setRotationQuat( + FilamentEntity entity, JSArray rotation) => + throw UnimplementedError(); +// viewer.setRotationQuat( +// entity, +// rotation.toDartQuaternion(), +// ).toJS; + @JSExport() + JSPromise reveal(FilamentEntity entity, String? meshName) => + viewer.reveal(entity, meshName).toJS; + @JSExport() + JSPromise hide(FilamentEntity entity, String? meshName) => + viewer.hide(entity, meshName).toJS; + @JSExport() + void pick(int x, int y) => viewer.pick(x, y); + @JSExport() + String? getNameForEntity(FilamentEntity entity) => + viewer.getNameForEntity(entity); + @JSExport() + JSPromise setCameraManipulatorOptions({ + int mode = 0, + double orbitSpeedX = 0.01, + double orbitSpeedY = 0.01, + double zoomSpeed = 0.01, + }) => + viewer + .setCameraManipulatorOptions( + mode: ManipulatorMode.values[mode], + orbitSpeedX: orbitSpeedX, + orbitSpeedY: orbitSpeedY, + zoomSpeed: zoomSpeed, + ) + .toJS; + @JSExport() + JSPromise> getChildEntities( + FilamentEntity parent, bool renderableOnly) { + return viewer + .getChildEntities( + parent, + renderableOnly, + ) + .then((entities) => entities.map((entity) => entity.toJS).toList().toJS) + .toJS; + } + + @JSExport() + JSPromise getChildEntity(FilamentEntity parent, String childName) { + return viewer + .getChildEntity( + parent, + childName, + ) + .then((entity) => entity.toJS) + .toJS; + } + + @JSExport() + JSPromise> getChildEntityNames( + FilamentEntity entity, bool renderableOnly) => + viewer + .getChildEntityNames( + entity, + renderableOnly: renderableOnly, + ) + .then((v) => v.map((s) => s.toJS).toList().toJS) + .toJS; + @JSExport() + JSPromise setRecording(bool recording) => viewer.setRecording(recording).toJS; + @JSExport() + JSPromise setRecordingOutputDirectory(String outputDirectory) => + viewer.setRecordingOutputDirectory(outputDirectory).toJS; + @JSExport() + JSPromise addAnimationComponent(FilamentEntity entity) => + viewer.addAnimationComponent(entity).toJS; + + @JSExport() + JSPromise addCollisionComponent(FilamentEntity entity, + {JSFunction? callback, bool affectsTransform = false}) { + throw UnimplementedError(); +// final Function? dartCallback = callback != null +// ? allowInterop((int entityId1, int entityId2) => callback.apply([entityId1, entityId2])) +// : null; +// return viewer.addCollisionComponent( +// entity), +// callback: dartCallback, +// affectsTransform: affectsTransform, +// ).toJs + } +} diff --git a/dart_filament/lib/dart_filament/compatibility/web/interop/dart_filament_js_extension_type.dart b/dart_filament/lib/dart_filament/compatibility/web/interop/dart_filament_js_extension_type.dart new file mode 100644 index 00000000..76878ef6 --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/web/interop/dart_filament_js_extension_type.dart @@ -0,0 +1,330 @@ +@JS() +library flutter_filament_js; +import 'dart:js_interop'; + +import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; +extension type DartFilamentJSShim(JSObject _) implements JSObject { + + @JS('initialized') + external JSPromise get initialized; + + @JS('rendering') + external bool get rendering; + + @JS('setRendering') + external JSPromise setRendering(bool render); + + @JS('render') + external JSPromise render(); + + @JS('setFrameRate') + external JSPromise setFrameRate(int framerate); + + @JS('dispose') + external JSPromise dispose(); + + @JS('setBackgroundImage') + external JSPromise setBackgroundImage(String path, bool fillHeight); + + @JS('setBackgroundImagePosition') + external JSPromise setBackgroundImagePosition(double x, double y, + bool clamp); + + @JS('clearBackgroundImage') + external JSPromise clearBackgroundImage(); + + @JS('setBackgroundColor') + external JSPromise setBackgroundColor( + double r, double g, double b, double alpha); + + @JS('loadSkybox') + external JSPromise loadSkybox(String skyboxPath); + + @JS('removeSkybox') + external JSPromise removeSkybox(); + + @JS('loadIbl') + external JSPromise loadIbl(String lightingPath, double intensity); + + @JS('rotateIbl') + external JSPromise rotateIbl(JSArray rotationMatrix); + + @JS('removeIbl') + external JSPromise removeIbl(); + + @JS('addLight') + external JSPromise addLight( + int type, + double colour, + double intensity, + double posX, + double posY, + double posZ, + double dirX, + double dirY, + double dirZ, + bool castShadows, + ); + + @JS('removeLight') + external JSPromise removeLight(FilamentEntity light); + + @JS('clearLights') + external JSPromise clearLights(); + + @JS('loadGlb') + external JSPromise loadGlb(String path, int numInstances); + + @JS('createInstance') + external JSPromise createInstance(FilamentEntity entity); + + @JS('getInstanceCount') + external JSPromise getInstanceCount(FilamentEntity entity); + + @JS('getInstances') + external JSPromise> getInstances(FilamentEntity entity); + + @JS('loadGltf') + external JSPromise loadGltf( + String path, + String relativeResourcePath + ); + + @JS('panStart') + external JSPromise panStart(double x, double y); + + @JS('panUpdate') + external JSPromise panUpdate(double x, double y); + + @JS('panEnd') + external JSPromise panEnd(); + + @JS('rotateStart') + external JSPromise rotateStart(double x, double y); + + @JS('rotateUpdate') + external JSPromise rotateUpdate(double x, double y); + + @JS('rotateEnd') + external JSPromise rotateEnd(); + + @JS('setMorphTargetWeights') + external JSPromise setMorphTargetWeights( + FilamentEntity entity, JSArray weights); + + @JS('getMorphTargetNames') + external JSPromise> getMorphTargetNames( + FilamentEntity entity, String meshName); + + @JS('getAnimationNames') + external JSPromise> getAnimationNames(FilamentEntity entity); + + @JS('getAnimationDuration') + external JSPromise getAnimationDuration( + FilamentEntity entity, int animationIndex); + + @JS('setMorphAnimationData') + external JSPromise setMorphAnimationData( + FilamentEntity entity, + JSArray> animation, + JSArray morphTargets, + JSArray? targetMeshNames, + ); + + @JS('resetBones') + external JSPromise resetBones(FilamentEntity entity); + + @JS('addBoneAnimation') + external JSPromise addBoneAnimation(FilamentEntity entity, JSObject animation); + + @JS('removeEntity') + external JSPromise removeEntity(FilamentEntity entity); + + @JS('clearEntities') + external JSPromise clearEntities(); + + @JS('zoomBegin') + external JSPromise zoomBegin(); + + @JS('zoomUpdate') + external JSPromise zoomUpdate(double x, double y, double z); + + @JS('zoomEnd') + external JSPromise zoomEnd(); + + @JS('playAnimation') + external JSPromise playAnimation( + FilamentEntity entity, + int index, + bool loop, + bool reverse, + bool replaceActive, + double crossfade, + ); + + @JS('playAnimationByName') + external JSPromise playAnimationByName( + FilamentEntity entity, + String name, + bool loop, + bool reverse, + bool replaceActive, + double crossfade, + ); + + @JS('setAnimationFrame') + external JSPromise setAnimationFrame( + FilamentEntity entity, int index, int animationFrame); + + @JS('stopAnimation') + external JSPromise stopAnimation(FilamentEntity entity, int animationIndex); + + @JS('stopAnimationByName') + external JSPromise stopAnimationByName(FilamentEntity entity, String name); + + @JS('setCamera') + external JSPromise setCamera(FilamentEntity entity, String? name); + + @JS('setMainCamera') + external JSPromise setMainCamera(); + + @JS('getMainCamera') + external JSPromise getMainCamera(); + + @JS('setCameraFov') + external JSPromise setCameraFov(double degrees, double width, double height); + + @JS('setToneMapping') + external JSPromise setToneMapping(int mapper); + + @JS('setBloom') + external JSPromise setBloom(double bloom); + + @JS('setCameraFocalLength') + external JSPromise setCameraFocalLength(double focalLength); + + @JS('setCameraCulling') + external JSPromise setCameraCulling(double near, double far); + + @JS('getCameraCullingNear') + external JSPromise getCameraCullingNear(); + + @JS('getCameraCullingFar') + external JSPromise getCameraCullingFar(); + + @JS('setCameraFocusDistance') + external JSPromise setCameraFocusDistance(double focusDistance); + + @JS('getCameraPosition') + external JSPromise> getCameraPosition(); + + @JS('getCameraModelMatrix') + external JSPromise> getCameraModelMatrix(); + + @JS('getCameraViewMatrix') + external JSPromise> getCameraViewMatrix(); + + @JS('getCameraProjectionMatrix') + external JSPromise> getCameraProjectionMatrix(); + + @JS('getCameraCullingProjectionMatrix') + external JSPromise> getCameraCullingProjectionMatrix(); + + @JS('getCameraFrustum') + external JSPromise getCameraFrustum(); + + @JS('setCameraPosition') + external JSPromise setCameraPosition(double x, double y, double z); + @JS('getCameraRotation') + external JSPromise> getCameraRotation(); + @JS('moveCameraToAsset') + external JSPromise moveCameraToAsset(FilamentEntity entity); + @JS('setViewFrustumCulling') + external JSPromise setViewFrustumCulling(JSBoolean enabled); + @JS('setCameraExposure') + external JSPromise setCameraExposure( + double aperture, double shutterSpeed, double sensitivity); + @JS('setCameraRotation') + external JSPromise setCameraRotation(JSArray quaternion); + @JS('setCameraModelMatrix') + external JSPromise setCameraModelMatrix(JSArray matrix); + @JS('setMaterialColor') + external JSPromise setMaterialColor(FilamentEntity entity, String meshName, + int materialIndex, double r, double g, double b, double a); + @JS('transformToUnitCube') + external JSPromise transformToUnitCube(FilamentEntity entity); + @JS('setPosition') + external JSPromise setPosition(FilamentEntity entity, double x, double y, double z); + @JS('setScale') + external JSPromise setScale(FilamentEntity entity, double scale); + @JS('setRotation') + external JSPromise setRotation( + FilamentEntity entity, double rads, double x, double y, double z); + @JS('queuePositionUpdate') + external JSPromise queuePositionUpdate( + FilamentEntity entity, double x, double y, double z, + bool relative); + @JS('queueRotationUpdate') + external JSPromise queueRotationUpdate( + FilamentEntity entity, double rads, double x, double y, double z, + bool relative); + @JS('queueRotationUpdateQuat') + external JSPromise queueRotationUpdateQuat( + FilamentEntity entity, JSArray quat, + bool relative); + @JS('setPostProcessing') + external JSPromise setPostProcessing(JSBoolean enabled); + @JS('setAntiAliasing') + external JSPromise setAntiAliasing( + JSBoolean msaa, JSBoolean fxaa, JSBoolean taa); + @JS('setRotationQuat') + external JSPromise setRotationQuat( + FilamentEntity entity, JSArray rotation); + @JS('reveal') + external JSPromise reveal(FilamentEntity entity, String? meshName); + @JS('hide') + external JSPromise hide(FilamentEntity entity, String? meshName); + @JS('pick') + external void pick(int x, int y); + @JS('getNameForEntity') + external String? getNameForEntity(FilamentEntity entity); + @JS('setCameraManipulatorOptions') + external JSPromise setCameraManipulatorOptions( + int mode, + double orbitSpeedX , + double orbitSpeedY , + double zoomSpeed , + ); + @JS('getChildEntities') + external JSPromise> getChildEntities( + FilamentEntity parent, bool renderableOnly); + @JS('getChildEntity') + external JSPromise getChildEntity( + FilamentEntity parent, String childName); + @JS('getChildEntityNames') + external JSPromise> getChildEntityNames( + FilamentEntity entity, + bool renderableOnly + ); + @JS('setRecording') + external JSPromise setRecording(JSBoolean recording); + @JS('setRecordingOutputDirectory') + external JSPromise setRecordingOutputDirectory(String outputDirectory); + @JS('addAnimationComponent') + external JSPromise addAnimationComponent(FilamentEntity entity); + @JS('addCollisionComponent') + external JSPromise addCollisionComponent(FilamentEntity entity); + @JS('removeCollisionComponent') + external JSPromise removeCollisionComponent(FilamentEntity entity); + @JS('createGeometry') + external JSPromise createGeometry( + JSArray vertices, JSArray indices, + String? materialPath, int primitiveType); + @JS('setParent') + external JSPromise setParent(FilamentEntity child, FilamentEntity parent); + @JS('testCollisions') + external JSPromise testCollisions(FilamentEntity entity); + @JS('setPriority') + external JSPromise setPriority(FilamentEntity entityId, int priority); + +} diff --git a/dart_filament/lib/dart_filament/compatibility/web/interop/js_interop_filament_viewer.dart b/dart_filament/lib/dart_filament/compatibility/web/interop/js_interop_filament_viewer.dart new file mode 100644 index 00000000..537a7d5a --- /dev/null +++ b/dart_filament/lib/dart_filament/compatibility/web/interop/js_interop_filament_viewer.dart @@ -0,0 +1,692 @@ +import 'dart:js_interop'; +import 'dart:js_interop_unsafe'; + +import 'package:animation_tools_dart/animation_tools_dart.dart'; +import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart'; +import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; +import 'package:dart_filament/dart_filament/scene.dart'; +import 'package:vector_math/vector_math_64.dart'; +import 'dart_filament_js_extension_type.dart'; + +class JsInteropFilamentViewer implements AbstractFilamentViewer { + late final DartFilamentJSShim _jsObject; + + JsInteropFilamentViewer(String globalPropertyName) { + print( + "Initializing interop viewer with global property $globalPropertyName"); + this._jsObject = globalContext.getProperty(globalPropertyName.toJS) + as DartFilamentJSShim; + } + + @override + Future get initialized async { + var inited = _jsObject.initialized; + final JSBoolean result = await inited.toDart; + return result.toDart; + } + + @override + Stream get pickResult { + throw UnimplementedError(); + } + + @override + bool get rendering => _jsObject.rendering; + + @override + Future setRendering(bool render) async { + await _jsObject.setRendering(render).toDart; + } + + @override + Future render() async { + await _jsObject.render().toDart; + } + + @override + Future setFrameRate(int framerate) async { + await _jsObject.setFrameRate(framerate).toDart; + } + + @override + Future dispose() async { + await _jsObject.dispose().toDart; + } + + @override + Future setBackgroundImage(String path, + {bool fillHeight = false}) async { + await _jsObject.setBackgroundImage(path, fillHeight).toDart; + } + + @override + Future setBackgroundImagePosition(double x, double y, + {bool clamp = false}) async { + await _jsObject.setBackgroundImagePosition(x, y, clamp).toDart; + } + + @override + Future clearBackgroundImage() async { + await _jsObject.clearBackgroundImage().toDart; + } + + @override + Future setBackgroundColor( + double r, double g, double b, double alpha) async { + await _jsObject.setBackgroundColor(r, g, b, alpha).toDart; + } + + @override + Future loadSkybox(String skyboxPath) async { + await _jsObject.loadSkybox(skyboxPath).toDart; + } + + @override + Future removeSkybox() async { + await _jsObject.removeSkybox().toDart; + } + + @override + Future loadIbl(String lightingPath, {double intensity = 30000}) async { + await _jsObject.loadIbl(lightingPath, intensity).toDart; + } + + @override + Future rotateIbl(Matrix3 rotation) async { + throw UnimplementedError(); + // final JSMatrix3 jsRotation = rotation.storage; + // await _jsObject.rotateIbl(jsRotation).toDart; + } + + @override + Future removeIbl() async { + await _jsObject.removeIbl().toDart; + } + + @override + Future addLight( + int type, + double colour, + double intensity, + double posX, + double posY, + double posZ, + double dirX, + double dirY, + double dirZ, + bool castShadows) async { + return (await _jsObject + .addLight(type, colour, intensity, posX, posY, posZ, dirX, dirY, + dirZ, castShadows) + .toDart) + .toDartInt; + } + + @override + Future removeLight(FilamentEntity light) async { + await _jsObject.removeLight(light).toDart; + } + + @override + Future clearLights() async { + await _jsObject.clearLights().toDart; + } + + @override + Future loadGlb(String path, {int numInstances = 1}) async { + return (await _jsObject.loadGlb(path, numInstances).toDart).toDartInt; + } + + @override + Future createInstance(FilamentEntity entity) async { + return (await _jsObject.createInstance(entity).toDart).toDartInt; + } + + @override + Future getInstanceCount(FilamentEntity entity) async { + return (await _jsObject.getInstanceCount(entity).toDart).toDartInt; + } + + @override + Future> getInstances(FilamentEntity entity) async { + throw UnimplementedError(); + // final List jsInstances = + // await _jsObject.getInstances(entity).toDart; + // return jsInstances + // .map((js) => FilamentEntity._fromJSObject(js)) + // .toList() + // .toDart; + } + + @override + Future loadGltf(String path, String relativeResourcePath, + {bool force = false}) async { + throw UnimplementedError(); + // final FilamentEntity jsEntity = await _jsObject + // .loadGltf(path, relativeResourcePath, force: force) + // .toDart; + // return FilamentEntity._fromJSObject(jsEntity).toDart; + } + + @override + Future panStart(double x, double y) async { + await _jsObject.panStart(x, y).toDart; + } + + @override + Future panUpdate(double x, double y) async { + await _jsObject.panUpdate(x, y).toDart; + } + + @override + Future panEnd() async { + await _jsObject.panEnd().toDart; + } + + @override + Future rotateStart(double x, double y) async { + await _jsObject.rotateStart(x, y).toDart; + } + + @override + Future rotateUpdate(double x, double y) async { + await _jsObject.rotateUpdate(x, y).toDart; + } + + @override + Future rotateEnd() async { + await _jsObject.rotateEnd().toDart; + } + + @override + Future setMorphTargetWeights( + FilamentEntity entity, List weights) async { + throw UnimplementedError(); + + // JSArray.withLength(weights.length) + // await _jsObject.setMorphTargetWeights(entity, weights.toJSBox as JSArray).toDart; + } + + @override + Future> getMorphTargetNames( + FilamentEntity entity, String meshName) async { + var result = _jsObject.getMorphTargetNames(entity, meshName).toDart; + var dartResult = (await result).toDart; + return dartResult.map((r) => r.toDart).toList(); + } + + @override + Future> getAnimationNames(FilamentEntity entity) async { + var names = (await (_jsObject.getAnimationNames(entity).toDart)) + .toDart + .map((x) => x.toDart) + .toList(); + return names; + } + + @override + Future getAnimationDuration( + FilamentEntity entity, int animationIndex) async { + return (await _jsObject.getAnimationDuration(entity, animationIndex).toDart) + .toDartDouble; + } + + @override + Future setMorphAnimationData( + FilamentEntity entity, MorphAnimationData animation, + {List? targetMeshNames}) async { + await _jsObject + .setMorphAnimationData( + entity, + animation.data + .map((x) => x.map((y) => y.toJS).toList().toJS) + .toList() + .toJS, + animation.morphTargets.map((x) => x.toJS).toList().toJS, + targetMeshNames?.map((x) => x.toJS).toList().toJS) + .toDart; + } + + @override + Future resetBones(FilamentEntity entity) async { + await _jsObject.resetBones(entity).toDart; + } + + @override + Future addBoneAnimation( + FilamentEntity entity, BoneAnimationData animation) async { + throw UnimplementedError(); + // await _jsObject.addBoneAnimation(entity, animation).toDart; + } + + @override + Future removeEntity(FilamentEntity entity) async { + await _jsObject.removeEntity(entity).toDart; + } + + @override + Future clearEntities() async { + await _jsObject.clearEntities().toDart; + } + + @override + Future zoomBegin() async { + await _jsObject.zoomBegin().toDart; + } + + @override + Future zoomUpdate(double x, double y, double z) async { + await _jsObject.zoomUpdate(x, y, z).toDart; + } + + @override + Future zoomEnd() async { + await _jsObject.zoomEnd().toDart; + } + + @override + Future playAnimation(FilamentEntity entity, int index, + {bool loop = false, + bool reverse = false, + bool replaceActive = true, + double crossfade = 0.0}) async { + await _jsObject + .playAnimation(entity, index, loop, reverse, replaceActive, crossfade) + .toDart; + } + + @override + Future playAnimationByName(FilamentEntity entity, String name, + {bool loop = false, + bool reverse = false, + bool replaceActive = true, + double crossfade = 0.0}) async { + await _jsObject + .playAnimationByName( + entity, name, loop, reverse, replaceActive, crossfade) + .toDart; + } + + @override + Future setAnimationFrame( + FilamentEntity entity, int index, int animationFrame) async { + await _jsObject.setAnimationFrame(entity, index, animationFrame).toDart; + } + + @override + Future stopAnimation(FilamentEntity entity, int animationIndex) async { + await _jsObject.stopAnimation(entity, animationIndex).toDart; + } + + @override + Future stopAnimationByName(FilamentEntity entity, String name) async { + await _jsObject.stopAnimationByName(entity, name).toDart; + } + + @override + Future setCamera(FilamentEntity entity, String? name) async { + await _jsObject.setCamera(entity, name).toDart; + } + + @override + Future setMainCamera() async { + await _jsObject.setMainCamera().toDart; + } + + @override + Future getMainCamera() async { + throw UnimplementedError(); + // final FilamentEntity jsEntity = await _jsObject.getMainCamera().toDart; + // return FilamentEntity._fromJSObject(jsEntity).toDart; + } + + @override + Future setCameraFov(double degrees, double width, double height) async { + await _jsObject.setCameraFov(degrees, width, height).toDart; + } + + @override + Future setToneMapping(ToneMapper mapper) async { + await _jsObject.setToneMapping(mapper.index).toDart; + } + + @override + Future setBloom(double bloom) async { + await _jsObject.setBloom(bloom).toDart; + } + + @override + Future setCameraFocalLength(double focalLength) async { + await _jsObject.setCameraFocalLength(focalLength).toDart; + } + + @override + Future setCameraCulling(double near, double far) async { + await _jsObject.setCameraCulling(near, far).toDart; + } + + @override + Future getCameraCullingNear() async { + return (await _jsObject.getCameraCullingNear().toDart).toDartDouble; + } + + @override + Future getCameraCullingFar() async { + return (await _jsObject.getCameraCullingFar().toDart).toDartDouble; + } + + @override + Future setCameraFocusDistance(double focusDistance) async { + await _jsObject.setCameraFocusDistance(focusDistance).toDart; + } + + @override + Future getCameraPosition() async { + final jsPosition = (await _jsObject.getCameraPosition().toDart).toDart; + return Vector3(jsPosition[0].toDartDouble, jsPosition[1].toDartDouble, + jsPosition[2].toDartDouble); + } + + @override + Future getCameraModelMatrix() async { + throw UnimplementedError(); + // final JSMatrix4 jsMatrix = await _jsObject.getCameraModelMatrix().toDart; + // return Matrix4.fromList(jsMatrix.storage).toDart; + } + + @override + Future getCameraViewMatrix() async { + throw UnimplementedError(); + // final JSMatrix4 jsMatrix = await _jsObject.getCameraViewMatrix().toDart; + // return Matrix4.fromList(jsMatrix.storage).toDart; + } + + @override + Future getCameraProjectionMatrix() async { + throw UnimplementedError(); + // final JSMatrix4 jsMatrix = + // await _jsObject.getCameraProjectionMatrix().toDart; + // return Matrix4.fromList(jsMatrix.storage).toDart; + } + + @override + Future getCameraCullingProjectionMatrix() async { + throw UnimplementedError(); + // final JSMatrix4 jsMatrix = + // await _jsObject.getCameraCullingProjectionMatrix().toDart; + // return Matrix4.fromList(jsMatrix.storage).toDart; + } + + @override + Future getCameraFrustum() async { + throw UnimplementedError(); + // final JSObject jsFrustum = await _jsObject.getCameraFrustum().toDart; + // // Assuming Frustum is a class that can be constructed from the JSObject + // return Frustum._fromJSObject(jsFrustum).toDart; + } + + @override + Future setCameraPosition(double x, double y, double z) async { + await _jsObject.setCameraPosition(x, y, z).toDart; + } + + @override + Future getCameraRotation() async { + throw UnimplementedError(); + // final JSMatrix3 jsRotation = await _jsObject.getCameraRotation().toDart; + // return Matrix3.fromList(jsRotation.storage).toDart; + } + + @override + Future moveCameraToAsset(FilamentEntity entity) async { + await _jsObject.moveCameraToAsset(entity).toDart; + } + + @override + Future setViewFrustumCulling(bool enabled) async { + throw UnimplementedError(); + // await _jsObject.setViewFrustumCulling(enabled.toJSBoolean()).toDart; + } + + @override + Future setCameraExposure( + double aperture, double shutterSpeed, double sensitivity) async { + await _jsObject + .setCameraExposure(aperture, shutterSpeed, sensitivity) + .toDart; + } + + @override + Future setCameraRotation(Quaternion quaternion) async { + throw UnimplementedError(); + // final JSQuaternion jsQuaternion = quaternion.toJSQuaternion().toDart; + // await _jsObject.setCameraRotation(jsQuaternion).toDart; + } + + @override + Future setCameraModelMatrix(List matrix) async { + throw UnimplementedError(); + + // await _jsObject.setCameraModelMatrix(matrix.toJSBox).toDart; + } + + @override + Future setMaterialColor(FilamentEntity entity, String meshName, + int materialIndex, double r, double g, double b, double a) async { + await _jsObject + .setMaterialColor(entity, meshName, materialIndex, r, g, b, a) + .toDart; + } + + @override + Future transformToUnitCube(FilamentEntity entity) async { + await _jsObject.transformToUnitCube(entity).toDart; + } + + @override + Future setPosition( + FilamentEntity entity, double x, double y, double z) async { + await _jsObject.setPosition(entity, x, y, z).toDart; + } + + @override + Future setScale(FilamentEntity entity, double scale) async { + await _jsObject.setScale(entity, scale).toDart; + } + + @override + Future setRotation( + FilamentEntity entity, double rads, double x, double y, double z) async { + await _jsObject.setRotation(entity, rads, x, y, z).toDart; + } + + @override + Future queuePositionUpdate( + FilamentEntity entity, double x, double y, double z, + {bool relative = false}) async { + await _jsObject.queuePositionUpdate(entity, x, y, z, relative).toDart; + } + + @override + Future queueRotationUpdate( + FilamentEntity entity, double rads, double x, double y, double z, + {bool relative = false}) async { + await _jsObject.queueRotationUpdate(entity, rads, x, y, z, relative).toDart; + } + + @override + Future queueRotationUpdateQuat(FilamentEntity entity, Quaternion quat, + {bool relative = false}) async { + throw UnimplementedError(); + + // final JSQuaternion jsQuat = quat.toJSQuaternion().toDart; + // await _jsObject + // .queueRotationUpdateQuat(entity, jsQuat, relative: relative) + // .toDart; + } + + @override + Future setPostProcessing(bool enabled) async { + throw UnimplementedError(); + // await _jsObject.setPostProcessing(enabled.toJSBoolean()).toDart; + } + + @override + Future setAntiAliasing(bool msaa, bool fxaa, bool taa) async { + throw UnimplementedError(); + // await _jsObject + // .setAntiAliasing( + // msaa.toJSBoolean(), fxaa.toJSBoolean(), taa.toJSBoolean()) + // .toDart; + } + + @override + Future setRotationQuat( + FilamentEntity entity, Quaternion rotation) async { + throw UnimplementedError(); + // final JSQuaternion jsRotation = rotation.toJSQuaternion().toDart; + // await _jsObject.setRotationQuat(entity, jsRotation).toDart; + } + + @override + Future reveal(FilamentEntity entity, String? meshName) async { + throw UnimplementedError(); + // await _jsObject.reveal(entity, meshName).toDart; + } + + @override + Future hide(FilamentEntity entity, String? meshName) async { + throw UnimplementedError(); + // await _jsObject.hide(entity, meshName).toDart; + } + + @override + void pick(int x, int y) { + throw UnimplementedError(); + // _jsObject.pick(x, y).toDart; + } + + @override + String? getNameForEntity(FilamentEntity entity) { + throw UnimplementedError(); + // return _jsObject.getNameForEntity(entity).toDart; + } + + @override + Future setCameraManipulatorOptions( + {ManipulatorMode mode = ManipulatorMode.ORBIT, + double orbitSpeedX = 0.01, + double orbitSpeedY = 0.01, + double zoomSpeed = 0.01}) async { + throw UnimplementedError(); + // await _jsObject + // .setCameraManipulatorOptions( + // mode: mode.index, + // orbitSpeedX: orbitSpeedX, + // orbitSpeedY: orbitSpeedY, + // zoomSpeed: zoomSpeed) + // .toDart; + } + + @override + Future> getChildEntities( + FilamentEntity parent, bool renderableOnly) async { + throw UnimplementedError(); + // final List jsEntities = await _jsObject + // .getChildEntities(parent, renderableOnly.toJSBoolean()) + // .toDart; + // return jsEntities + // .map((js) => FilamentEntity._fromJSObject(js)) + // .toList() + // .toDart; + } + + @override + Future getChildEntity( + FilamentEntity parent, String childName) async { + return (await _jsObject.getChildEntity(parent, childName).toDart).toDartInt; + } + + @override + Future> getChildEntityNames(FilamentEntity entity, + {bool renderableOnly = true}) async { + var names = + await _jsObject.getChildEntityNames(entity, renderableOnly).toDart; + return names.toDart.map((x) => x.toDart).toList(); + } + + @override + Future setRecording(bool recording) async { + throw UnimplementedError(); + // await _jsObject.setRecording(recording.toJSBoolean()).toDart; + } + + @override + Future setRecordingOutputDirectory(String outputDirectory) async { + await _jsObject.setRecordingOutputDirectory(outputDirectory).toDart; + } + + @override + Future addAnimationComponent(FilamentEntity entity) async { + await _jsObject.addAnimationComponent(entity).toDart; + } + + @override + Future addCollisionComponent(FilamentEntity entity, + {void Function(int entityId1, int entityId2)? callback, + bool affectsTransform = false}) async { + throw UnimplementedError(); + // final JSFunction? jsCallback = callback != null + // ? allowInterop( + // (int entityId1, int entityId2) => callback(entityId1, entityId2)) + // : null; + // await _jsObject + // .addCollisionComponent(entity, + // callback: jsCallback, + // affectsTransform: affectsTransform.toJSBoolean()) + // .toDart; + } + + @override + Future removeCollisionComponent(FilamentEntity entity) async { + await _jsObject.removeCollisionComponent(entity).toDart; + } + + @override + Future createGeometry( + List vertices, List indices, + {String? materialPath, + PrimitiveType primitiveType = PrimitiveType.TRIANGLES}) async { + throw UnimplementedError(); + // final FilamentEntity jsEntity = await _jsObject + // .createGeometry(vertices, indices, + // materialPath: materialPath, primitiveType: primitiveType.index) + // .toDart; + // return FilamentEntity._fromJSObject(jsEntity).toDart; + } + + @override + Future setParent(FilamentEntity child, FilamentEntity parent) async { + await _jsObject.setParent(child, parent).toDart; + } + + @override + Future testCollisions(FilamentEntity entity) async { + await _jsObject.testCollisions(entity).toDart; + } + + @override + Future setPriority(FilamentEntity entityId, int priority) async { + await _jsObject.setPriority(entityId, priority).toDart; + } + + Scene? _scene; + + // @override + Scene get scene { + _scene ??= SceneImpl(this); + return _scene!; + } + + AbstractGizmo? get gizmo => null; +} diff --git a/dart_filament/lib/dart_filament/entities/abstract_gizmo.dart b/dart_filament/lib/dart_filament/entities/abstract_gizmo.dart new file mode 100644 index 00000000..1c0e0a21 --- /dev/null +++ b/dart_filament/lib/dart_filament/entities/abstract_gizmo.dart @@ -0,0 +1,3 @@ +import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; + + diff --git a/dart_filament/lib/dart_filament/entities/entity_transform_controller.dart b/dart_filament/lib/dart_filament/entities/entity_transform_controller.dart index 5e660ecd..bd8021d6 100644 --- a/dart_filament/lib/dart_filament/entities/entity_transform_controller.dart +++ b/dart_filament/lib/dart_filament/entities/entity_transform_controller.dart @@ -3,11 +3,10 @@ import 'dart:math'; import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; import 'package:dart_filament/dart_filament/abstract_filament_viewer.dart'; -import 'package:dart_filament/dart_filament/filament_viewer_impl.dart'; import 'package:vector_math/vector_math_64.dart' as v; class EntityTransformController { - final FilamentViewer controller; + final AbstractFilamentViewer controller; final FilamentEntity _entity; late Timer _ticker; diff --git a/dart_filament/lib/dart_filament/entities/gizmo.dart b/dart_filament/lib/dart_filament/entities/gizmo.dart index 88e86e7b..007caf73 100644 --- a/dart_filament/lib/dart_filament/entities/gizmo.dart +++ b/dart_filament/lib/dart_filament/entities/gizmo.dart @@ -1,10 +1,8 @@ import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; -import 'package:dart_filament/dart_filament/filament_viewer_impl.dart'; import 'package:vector_math/vector_math_64.dart'; - import '../abstract_filament_viewer.dart'; -class Gizmo { +class Gizmo extends AbstractGizmo { final FilamentEntity x; Vector3 _x = Vector3(0.1, 0, 0); final FilamentEntity y; @@ -12,7 +10,7 @@ class Gizmo { final FilamentEntity z; Vector3 _z = Vector3(0.0, 0.0, 0.1); - final FilamentViewer controller; + final AbstractFilamentViewer controller; FilamentEntity? _activeAxis; FilamentEntity? _activeEntity; diff --git a/dart_filament/lib/dart_filament/filament_viewer_impl.dart b/dart_filament/lib/dart_filament/filament_viewer_impl.dart index e1d6d05f..6eaeb8a5 100644 --- a/dart_filament/lib/dart_filament/filament_viewer_impl.dart +++ b/dart_filament/lib/dart_filament/filament_viewer_impl.dart @@ -12,6 +12,8 @@ import 'compatibility/compatibility.dart'; // ignore: constant_identifier_names const FilamentEntity _FILAMENT_ASSET_ERROR = 0; +typedef RenderCallback = Pointer)>>; + class FilamentViewer extends AbstractFilamentViewer { final _compat = Compatibility(); @@ -103,23 +105,16 @@ class FilamentViewer extends AbstractFilamentViewer { create_filament_viewer_ffi(_sharedContext, _driver, uberarchivePtr, resourceLoader, _renderCallback, _renderCallbackOwner, callback); }); - print(viewer); - if (viewer is int) { - _viewer = Pointer.fromAddress(viewer); - } else { - _viewer = (viewer as Pointer); - } - + _viewer = Pointer.fromAddress(viewer); allocator.free(uberarchivePtr); print("Set viewer to $_viewer"); - print("Created viewer ${_viewer!.address}"); if (_viewer!.address == 0) { throw Exception("Failed to create viewer. Check logs for details"); } _sceneManager = get_scene_manager(_viewer!); - _scene = SceneImpl(null, this, _sceneManager!); + _scene = SceneImpl(this); await setCameraManipulatorOptions(zoomSpeed: 10.0); @@ -1139,4 +1134,7 @@ class FilamentViewer extends AbstractFilamentViewer { Future setPriority(FilamentEntity entityId, int priority) async { set_priority(_sceneManager!, entityId, priority); } + + @override + AbstractGizmo? get gizmo => null; } diff --git a/dart_filament/lib/dart_filament/scene.dart b/dart_filament/lib/dart_filament/scene.dart index abbf7409..7531d9a1 100644 --- a/dart_filament/lib/dart_filament/scene.dart +++ b/dart_filament/lib/dart_filament/scene.dart @@ -1,33 +1,15 @@ import 'dart:async'; - import 'package:dart_filament/dart_filament/entities/filament_entity.dart'; -import 'package:dart_filament/dart_filament/filament_viewer_impl.dart'; - -import 'compatibility/compatibility.dart'; - -import 'entities/gizmo.dart'; import 'abstract_filament_viewer.dart'; /// /// For now, this class just holds the entities that have been loaded (though not necessarily visible in the Filament Scene). /// class SceneImpl extends Scene { - Gizmo? _gizmo; - Future get gizmo async { - if (_gizmo == null) { - final out = calloc(3); - get_gizmo(_sceneManager!, out); - _gizmo = Gizmo(out[0], out[1], out[2], controller); - calloc.free(out); - } - return _gizmo!; - } - FilamentViewer controller; + AbstractFilamentViewer controller; - final Pointer _sceneManager; - - SceneImpl(this._gizmo, this.controller, this._sceneManager); + SceneImpl(this.controller); @override FilamentEntity? selected; @@ -57,7 +39,7 @@ class SceneImpl extends Scene { var children = await controller.getChildEntities(entity, true); if (selected == entity || children.contains(selected)) { selected = null; - _gizmo?.detach(); + controller.gizmo?.detach(); } _lights.remove(entity); _onUnloadController.add(entity); @@ -68,7 +50,8 @@ class SceneImpl extends Scene { var children = await controller.getChildEntities(entity, true); if (selected == entity || children.contains(selected)) { selected = null; - _gizmo?.detach(); + + controller.gizmo?.detach(); } _entities.remove(entity); _onUnloadController.add(entity); @@ -86,7 +69,7 @@ class SceneImpl extends Scene { for (final light in _lights) { if (selected == light) { selected = null; - _gizmo?.detach(); + controller.gizmo?.detach(); } _onUnloadController.add(light); } @@ -99,7 +82,7 @@ class SceneImpl extends Scene { for (final entity in _entities) { if (selected == entity) { selected = null; - _gizmo?.detach(); + controller.gizmo?.detach(); } _onUnloadController.add(entity); } @@ -132,7 +115,7 @@ class SceneImpl extends Scene { @override void select(FilamentEntity entity) { selected = entity; - _gizmo?.attach(entity); + controller.gizmo?.attach(entity); _onUpdatedController.add(true); } }