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

File diff suppressed because it is too large Load Diff