use ffi-native for generated bindings

This commit is contained in:
Nick Fisher
2023-11-07 13:15:12 +08:00
parent 60ed8443b2
commit b5fffe617e
3 changed files with 1174 additions and 2391 deletions

View File

@@ -28,8 +28,6 @@ class FilamentControllerFFI extends FilamentController {
late Pointer<Void>? _assetManager; late Pointer<Void>? _assetManager;
late NativeLibrary _lib;
Pointer<Void>? _viewer; Pointer<Void>? _viewer;
final String? uberArchivePath; final String? uberArchivePath;
@@ -80,7 +78,7 @@ class FilamentControllerFFI extends FilamentController {
} else { } else {
dl = DynamicLibrary.open("libflutter_filament_android.so"); dl = DynamicLibrary.open("libflutter_filament_android.so");
} }
_lib = NativeLibrary(dl);
if (Platform.isWindows) { if (Platform.isWindows) {
_channel.invokeMethod("usesBackingWindow").then((result) { _channel.invokeMethod("usesBackingWindow").then((result) {
_usesBackingWindow = result; _usesBackingWindow = result;
@@ -98,7 +96,7 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_rendering = render; _rendering = render;
_lib.set_rendering_ffi(_viewer!, render); set_rendering_ffi(_viewer!, render);
} }
@override @override
@@ -106,12 +104,12 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.render_ffi(_viewer!); render_ffi(_viewer!);
} }
@override @override
Future setFrameRate(int framerate) async { Future setFrameRate(int framerate) async {
_lib.set_frame_interval_ffi(1.0 / framerate); set_frame_interval_ffi(1.0 / framerate);
} }
@override @override
@@ -137,7 +135,7 @@ class FilamentControllerFFI extends FilamentController {
_viewer = null; _viewer = null;
_assetManager = null; _assetManager = null;
_lib.destroy_filament_viewer_ffi(viewer!); destroy_filament_viewer_ffi(viewer!);
hasViewer.value = false; hasViewer.value = false;
} }
@@ -190,7 +188,7 @@ class FilamentControllerFFI extends FilamentController {
dev.log("Got rendering surface"); dev.log("Got rendering surface");
_viewer = _lib.create_filament_viewer_ffi( _viewer = create_filament_viewer_ffi(
Pointer<Void>.fromAddress(renderingSurface.sharedContext), Pointer<Void>.fromAddress(renderingSurface.sharedContext),
_driver, _driver,
uberArchivePath?.toNativeUtf8().cast<Char>() ?? nullptr, uberArchivePath?.toNativeUtf8().cast<Char>() ?? nullptr,
@@ -202,15 +200,15 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("Failed to create viewer. Check logs for details"); throw Exception("Failed to create viewer. Check logs for details");
} }
_assetManager = _lib.get_asset_manager(_viewer!); _assetManager = get_asset_manager(_viewer!);
_lib.create_swap_chain_ffi(_viewer!, renderingSurface.surface, create_swap_chain_ffi(_viewer!, renderingSurface.surface,
rect.value!.width.toInt(), rect.value!.height.toInt()); rect.value!.width.toInt(), rect.value!.height.toInt());
dev.log("Created swap chain"); dev.log("Created swap chain");
if (renderingSurface.textureHandle != 0) { if (renderingSurface.textureHandle != 0) {
dev.log( dev.log(
"Creating render target from native texture ${renderingSurface.textureHandle}"); "Creating render target from native texture ${renderingSurface.textureHandle}");
_lib.create_render_target_ffi(_viewer!, renderingSurface.textureHandle, create_render_target_ffi(_viewer!, renderingSurface.textureHandle,
rect.value!.width.toInt(), rect.value!.height.toInt()); rect.value!.width.toInt(), rect.value!.height.toInt());
} }
@@ -219,7 +217,7 @@ class FilamentControllerFFI extends FilamentController {
width: rect.value!.width.toInt(), width: rect.value!.width.toInt(),
height: rect.value!.height.toInt()); height: rect.value!.height.toInt());
dev.log("texture details ${textureDetails.value}"); dev.log("texture details ${textureDetails.value}");
_lib.update_viewport_and_camera_projection_ffi( update_viewport_and_camera_projection_ffi(
_viewer!, rect.value!.width.toInt(), rect.value!.height.toInt(), 1.0); _viewer!, rect.value!.width.toInt(), rect.value!.height.toInt(), 1.0);
hasViewer.value = true; hasViewer.value = true;
} }
@@ -310,10 +308,10 @@ class FilamentControllerFFI extends FilamentController {
_resizing = true; _resizing = true;
_lib.set_rendering_ffi(_viewer!, false); set_rendering_ffi(_viewer!, false);
if (!_usesBackingWindow) { if (!_usesBackingWindow) {
_lib.destroy_swap_chain_ffi(_viewer!); destroy_swap_chain_ffi(_viewer!);
} }
if (requiresTextureWidget) { if (requiresTextureWidget) {
@@ -337,17 +335,17 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("Failed to create viewer. Check logs for details"); throw Exception("Failed to create viewer. Check logs for details");
} }
_assetManager = _lib.get_asset_manager(_viewer!); _assetManager = get_asset_manager(_viewer!);
if (!_usesBackingWindow) { if (!_usesBackingWindow) {
_lib.create_swap_chain_ffi(_viewer!, renderingSurface.surface, create_swap_chain_ffi(_viewer!, renderingSurface.surface,
rect.value!.width.toInt(), rect.value!.height.toInt()); rect.value!.width.toInt(), rect.value!.height.toInt());
} }
if (renderingSurface.textureHandle != 0) { if (renderingSurface.textureHandle != 0) {
dev.log( dev.log(
"Creating render target from native texture ${renderingSurface.textureHandle}"); "Creating render target from native texture ${renderingSurface.textureHandle}");
_lib.create_render_target_ffi(_viewer!, renderingSurface.textureHandle, create_render_target_ffi(_viewer!, renderingSurface.textureHandle,
rect.value!.width.toInt(), rect.value!.height.toInt()); rect.value!.width.toInt(), rect.value!.height.toInt());
} }
@@ -356,7 +354,7 @@ class FilamentControllerFFI extends FilamentController {
width: rect.value!.width.toInt(), width: rect.value!.width.toInt(),
height: rect.value!.height.toInt()); height: rect.value!.height.toInt());
_lib.update_viewport_and_camera_projection_ffi( update_viewport_and_camera_projection_ffi(
_viewer!, rect.value!.width.toInt(), rect.value!.height.toInt(), 1.0); _viewer!, rect.value!.width.toInt(), rect.value!.height.toInt(), 1.0);
await setRendering(_rendering); await setRendering(_rendering);
@@ -369,7 +367,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.clear_background_image_ffi(_viewer!); clear_background_image_ffi(_viewer!);
} }
@override @override
@@ -377,7 +375,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_background_image_ffi( set_background_image_ffi(
_viewer!, path.toNativeUtf8().cast<Char>(), fillHeight); _viewer!, path.toNativeUtf8().cast<Char>(), fillHeight);
} }
@@ -386,7 +384,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_background_color_ffi( set_background_color_ffi(
_viewer!, _viewer!,
color.red.toDouble() / 255.0, color.red.toDouble() / 255.0,
color.green.toDouble() / 255.0, color.green.toDouble() / 255.0,
@@ -400,7 +398,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_background_image_position_ffi(_viewer!, x, y, clamp); set_background_image_position_ffi(_viewer!, x, y, clamp);
} }
@override @override
@@ -408,7 +406,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.load_skybox_ffi(_viewer!, skyboxPath.toNativeUtf8().cast<Char>()); load_skybox_ffi(_viewer!, skyboxPath.toNativeUtf8().cast<Char>());
} }
@override @override
@@ -416,8 +414,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.load_ibl_ffi( load_ibl_ffi(_viewer!, lightingPath.toNativeUtf8().cast<Char>(), intensity);
_viewer!, lightingPath.toNativeUtf8().cast<Char>(), intensity);
} }
@override @override
@@ -425,7 +422,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.remove_skybox_ffi(_viewer!); remove_skybox_ffi(_viewer!);
} }
@override @override
@@ -433,7 +430,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.remove_ibl_ffi(_viewer!); remove_ibl_ffi(_viewer!);
} }
@override @override
@@ -451,8 +448,8 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var entity = _lib.add_light_ffi(_viewer!, type, colour, intensity, posX, var entity = add_light_ffi(_viewer!, type, colour, intensity, posX, posY,
posY, posZ, dirX, dirY, dirZ, castShadows); posZ, dirX, dirY, dirZ, castShadows);
return entity; return entity;
} }
@@ -461,7 +458,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.remove_light_ffi(_viewer!, light); remove_light_ffi(_viewer!, light);
} }
@override @override
@@ -469,7 +466,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.clear_lights_ffi(_viewer!); clear_lights_ffi(_viewer!);
} }
@override @override
@@ -480,8 +477,8 @@ class FilamentControllerFFI extends FilamentController {
if (unlit) { if (unlit) {
throw Exception("Not yet implemented"); throw Exception("Not yet implemented");
} }
var asset = _lib.load_glb_ffi( var asset =
_assetManager!, path.toNativeUtf8().cast<Char>(), unlit); load_glb_ffi(_assetManager!, path.toNativeUtf8().cast<Char>(), unlit);
if (asset == _FILAMENT_ASSET_ERROR) { if (asset == _FILAMENT_ASSET_ERROR) {
throw Exception("An error occurred loading the asset at $path"); throw Exception("An error occurred loading the asset at $path");
} }
@@ -498,9 +495,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var asset = _lib.load_gltf_ffi( var asset = load_gltf_ffi(_assetManager!, path.toNativeUtf8().cast<Char>(),
_assetManager!,
path.toNativeUtf8().cast<Char>(),
relativeResourcePath.toNativeUtf8().cast<Char>()); relativeResourcePath.toNativeUtf8().cast<Char>());
if (asset == _FILAMENT_ASSET_ERROR) { if (asset == _FILAMENT_ASSET_ERROR) {
throw Exception("An error occurred loading the asset at $path"); throw Exception("An error occurred loading the asset at $path");
@@ -513,7 +508,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, true); grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, true);
} }
@override @override
@@ -521,7 +516,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.grab_update(_viewer!, x * _pixelRatio, y * _pixelRatio); grab_update(_viewer!, x * _pixelRatio, y * _pixelRatio);
} }
@override @override
@@ -529,7 +524,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.grab_end(_viewer!); grab_end(_viewer!);
} }
@override @override
@@ -537,7 +532,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, false); grab_begin(_viewer!, x * _pixelRatio, y * _pixelRatio, false);
} }
@override @override
@@ -545,7 +540,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.grab_update(_viewer!, x * _pixelRatio, y * _pixelRatio); grab_update(_viewer!, x * _pixelRatio, y * _pixelRatio);
} }
@override @override
@@ -553,7 +548,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.grab_end(_viewer!); grab_end(_viewer!);
} }
@override @override
@@ -567,7 +562,7 @@ class FilamentControllerFFI extends FilamentController {
for (int i = 0; i < weights.length; i++) { for (int i = 0; i < weights.length; i++) {
weightsPtr.elementAt(i).value = weights[i]; weightsPtr.elementAt(i).value = weights[i];
} }
_lib.set_morph_target_weights_ffi(_assetManager!, entity, set_morph_target_weights_ffi(_assetManager!, entity,
meshName.toNativeUtf8().cast<Char>(), weightsPtr, weights.length); meshName.toNativeUtf8().cast<Char>(), weightsPtr, weights.length);
calloc.free(weightsPtr); calloc.free(weightsPtr);
} }
@@ -579,11 +574,11 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var names = <String>[]; var names = <String>[];
var count = _lib.get_morph_target_name_count_ffi( var count = get_morph_target_name_count_ffi(
_assetManager!, entity, meshName.toNativeUtf8().cast<Char>()); _assetManager!, entity, meshName.toNativeUtf8().cast<Char>());
var outPtr = calloc<Char>(255); var outPtr = calloc<Char>(255);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
_lib.get_morph_target_name(_assetManager!, entity, get_morph_target_name(_assetManager!, entity,
meshName.toNativeUtf8().cast<Char>(), outPtr, i); meshName.toNativeUtf8().cast<Char>(), outPtr, i);
names.add(outPtr.cast<Utf8>().toDartString()); names.add(outPtr.cast<Utf8>().toDartString());
} }
@@ -596,11 +591,11 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var animationCount = _lib.get_animation_count(_assetManager!, entity); var animationCount = get_animation_count(_assetManager!, entity);
var names = <String>[]; var names = <String>[];
var outPtr = calloc<Char>(255); var outPtr = calloc<Char>(255);
for (int i = 0; i < animationCount; i++) { for (int i = 0; i < animationCount; i++) {
_lib.get_animation_name_ffi(_assetManager!, entity, outPtr, i); get_animation_name_ffi(_assetManager!, entity, outPtr, i);
names.add(outPtr.cast<Utf8>().toDartString()); names.add(outPtr.cast<Utf8>().toDartString());
} }
@@ -614,7 +609,7 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var duration = var duration =
_lib.get_animation_duration(_assetManager!, entity, animationIndex); get_animation_duration(_assetManager!, entity, animationIndex);
return duration; return duration;
} }
@@ -649,7 +644,7 @@ class FilamentControllerFFI extends FilamentController {
idxPtr.elementAt(i).value = index; idxPtr.elementAt(i).value = index;
} }
_lib.set_morph_animation( set_morph_animation(
_assetManager!, _assetManager!,
entity, entity,
animation.meshName.toNativeUtf8().cast<Char>(), animation.meshName.toNativeUtf8().cast<Char>(),
@@ -705,7 +700,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.remove_asset_ffi(_viewer!, entity); remove_asset_ffi(_viewer!, entity);
} }
@override @override
@@ -713,7 +708,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.clear_assets_ffi(_viewer!); clear_assets_ffi(_viewer!);
} }
@override @override
@@ -721,7 +716,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.scroll_begin(_viewer!); scroll_begin(_viewer!);
} }
@override @override
@@ -729,7 +724,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.scroll_update(_viewer!, x, y, z); scroll_update(_viewer!, x, y, z);
} }
@override @override
@@ -737,7 +732,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.scroll_end(_viewer!); scroll_end(_viewer!);
} }
@override @override
@@ -749,7 +744,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.play_animation_ffi( play_animation_ffi(
_assetManager!, entity, index, loop, reverse, replaceActive, crossfade); _assetManager!, entity, index, loop, reverse, replaceActive, crossfade);
} }
@@ -759,7 +754,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_animation_frame(_assetManager!, entity, index, animationFrame); set_animation_frame(_assetManager!, entity, index, animationFrame);
} }
@override @override
@@ -767,7 +762,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.stop_animation(_assetManager!, entity, animationIndex); stop_animation(_assetManager!, entity, animationIndex);
} }
@override @override
@@ -775,7 +770,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var result = _lib.set_camera( var result = set_camera(
_viewer!, entity, name?.toNativeUtf8().cast<Char>() ?? nullptr); _viewer!, entity, name?.toNativeUtf8().cast<Char>() ?? nullptr);
if (!result) { if (!result) {
throw Exception("Failed to set camera"); throw Exception("Failed to set camera");
@@ -788,7 +783,7 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_tone_mapping_ffi(_viewer!, mapper.index); set_tone_mapping_ffi(_viewer!, mapper.index);
} }
@override @override
@@ -797,7 +792,7 @@ class FilamentControllerFFI extends FilamentController {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_post_processing_ffi(_viewer!, enabled); set_post_processing_ffi(_viewer!, enabled);
} }
@override @override
@@ -805,7 +800,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_bloom_ffi(_viewer!, bloom); set_bloom_ffi(_viewer!, bloom);
} }
@override @override
@@ -813,7 +808,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_camera_focal_length(_viewer!, focalLength); set_camera_focal_length(_viewer!, focalLength);
} }
@override @override
@@ -821,7 +816,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_camera_focus_distance(_viewer!, focusDistance); set_camera_focus_distance(_viewer!, focusDistance);
} }
@override @override
@@ -829,7 +824,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_camera_position(_viewer!, x, y, z); set_camera_position(_viewer!, x, y, z);
} }
@override @override
@@ -837,7 +832,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.move_camera_to_asset(_viewer!, entity); move_camera_to_asset(_viewer!, entity);
} }
@override @override
@@ -845,7 +840,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_view_frustum_culling(_viewer!, enabled); set_view_frustum_culling(_viewer!, enabled);
} }
@override @override
@@ -854,7 +849,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_camera_exposure(_viewer!, aperture, shutterSpeed, sensitivity); set_camera_exposure(_viewer!, aperture, shutterSpeed, sensitivity);
} }
@override @override
@@ -862,7 +857,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_camera_rotation(_viewer!, rads, x, y, z); set_camera_rotation(_viewer!, rads, x, y, z);
} }
@override @override
@@ -875,7 +870,7 @@ class FilamentControllerFFI extends FilamentController {
for (int i = 0; i < 16; i++) { for (int i = 0; i < 16; i++) {
ptr.elementAt(i).value = matrix[i]; ptr.elementAt(i).value = matrix[i];
} }
_lib.set_camera_model_matrix(_viewer!, ptr); set_camera_model_matrix(_viewer!, ptr);
calloc.free(ptr); calloc.free(ptr);
} }
@@ -885,7 +880,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
var result = _lib.set_material_color( var result = set_material_color(
_assetManager!, _assetManager!,
entity, entity,
meshName.toNativeUtf8().cast<Char>(), meshName.toNativeUtf8().cast<Char>(),
@@ -904,7 +899,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.transform_to_unit_cube(_assetManager!, entity); transform_to_unit_cube(_assetManager!, entity);
} }
@override @override
@@ -913,7 +908,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_position(_assetManager!, entity, x, y, z); set_position(_assetManager!, entity, x, y, z);
} }
@override @override
@@ -921,7 +916,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_scale(_assetManager!, entity, scale); set_scale(_assetManager!, entity, scale);
} }
@override @override
@@ -930,7 +925,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
_lib.set_rotation(_assetManager!, entity, rads, x, y, z); set_rotation(_assetManager!, entity, rads, x, y, z);
} }
@override @override
@@ -938,7 +933,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
if (_lib.hide_mesh( if (hide_mesh(
_assetManager!, entity, meshName.toNativeUtf8().cast<Char>()) != _assetManager!, entity, meshName.toNativeUtf8().cast<Char>()) !=
1) {} 1) {}
} }
@@ -948,7 +943,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available, ignoring"); throw Exception("No viewer available, ignoring");
} }
if (_lib.reveal_mesh( if (reveal_mesh(
_assetManager!, entity, meshName.toNativeUtf8().cast<Char>()) != _assetManager!, entity, meshName.toNativeUtf8().cast<Char>()) !=
1) { 1) {
throw Exception("Failed to reveal mesh $meshName"); throw Exception("Failed to reveal mesh $meshName");
@@ -957,7 +952,7 @@ class FilamentControllerFFI extends FilamentController {
@override @override
String? getNameForEntity(FilamentEntity entity) { String? getNameForEntity(FilamentEntity entity) {
final result = _lib.get_name_for_entity(_assetManager!, entity); final result = get_name_for_entity(_assetManager!, entity);
if (result == nullptr) { if (result == nullptr) {
return null; return null;
} }
@@ -972,7 +967,7 @@ class FilamentControllerFFI extends FilamentController {
final outPtr = calloc<EntityId>(1); final outPtr = calloc<EntityId>(1);
outPtr.value = 0; outPtr.value = 0;
_lib.pick_ffi(_viewer!, x, textureDetails.value!.height - y, outPtr); pick_ffi(_viewer!, x, textureDetails.value!.height - y, outPtr);
int wait = 0; int wait = 0;
while (outPtr.value == 0) { while (outPtr.value == 0) {
await Future.delayed(const Duration(milliseconds: 32)); await Future.delayed(const Duration(milliseconds: 32));
@@ -992,7 +987,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available"); throw Exception("No viewer available");
} }
var arrayPtr = _lib.get_camera_view_matrix(_viewer!); var arrayPtr = get_camera_view_matrix(_viewer!);
var viewMatrix = Matrix4.fromList(arrayPtr.asTypedList(16)); var viewMatrix = Matrix4.fromList(arrayPtr.asTypedList(16));
calloc.free(arrayPtr); calloc.free(arrayPtr);
return viewMatrix; return viewMatrix;
@@ -1003,7 +998,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available"); throw Exception("No viewer available");
} }
var arrayPtr = _lib.get_camera_model_matrix(_viewer!); var arrayPtr = get_camera_model_matrix(_viewer!);
var modelMatrix = Matrix4.fromList(arrayPtr.asTypedList(16)); var modelMatrix = Matrix4.fromList(arrayPtr.asTypedList(16));
calloc.free(arrayPtr); calloc.free(arrayPtr);
return modelMatrix; return modelMatrix;
@@ -1014,7 +1009,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available"); throw Exception("No viewer available");
} }
var arrayPtr = _lib.get_camera_model_matrix(_viewer!); var arrayPtr = get_camera_model_matrix(_viewer!);
var doubleList = arrayPtr.asTypedList(16); var doubleList = arrayPtr.asTypedList(16);
var modelMatrix = Matrix4.fromFloat64List(doubleList); var modelMatrix = Matrix4.fromFloat64List(doubleList);
@@ -1029,7 +1024,7 @@ class FilamentControllerFFI extends FilamentController {
if (_viewer == null) { if (_viewer == null) {
throw Exception("No viewer available"); throw Exception("No viewer available");
} }
var arrayPtr = _lib.get_camera_model_matrix(_viewer!); var arrayPtr = get_camera_model_matrix(_viewer!);
var doubleList = arrayPtr.asTypedList(16); var doubleList = arrayPtr.asTypedList(16);
var modelMatrix = Matrix4.fromFloat64List(doubleList); var modelMatrix = Matrix4.fromFloat64List(doubleList);
var rotationMatrix = Matrix3.identity(); var rotationMatrix = Matrix3.identity();
@@ -1050,7 +1045,7 @@ class FilamentControllerFFI extends FilamentController {
if (mode != ManipulatorMode.ORBIT) { if (mode != ManipulatorMode.ORBIT) {
throw Exception("Manipulator mode $mode not yet implemented"); throw Exception("Manipulator mode $mode not yet implemented");
} }
_lib.set_camera_manipulator_options( set_camera_manipulator_options(
_viewer!, mode.index, orbitSpeedX, orbitSpeedX, zoomSpeed); _viewer!, mode.index, orbitSpeedX, orbitSpeedX, zoomSpeed);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -28,7 +28,8 @@ ffigen:
headers: headers:
entry-points: entry-points:
- 'ios/include/FlutterFilamentFFIApi.h' - 'ios/include/FlutterFilamentFFIApi.h'
ffi-native:
asset: 'libflutter_filament'
flutter: flutter:
plugin: plugin:
platforms: platforms: