move flutter_filament plugin to federated structure

This commit is contained in:
Nick Fisher
2024-05-15 22:25:46 +08:00
parent 66e5e38324
commit 6b50dc9d36
325 changed files with 32625 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
import 'dart:async';
import 'package:flutter/services.dart';
import 'dart:ffi';
import 'package:dart_filament/dart_filament.dart';
import 'package:flutter_filament_platform_interface/flutter_filament_platform_interface.dart';
import 'package:flutter_filament_platform_interface/flutter_filament_texture.dart';
///
/// A subclass of [FilamentViewer] that uses Flutter platform channels
/// to create rendering contexts, callbacks and surfaces (either backing texture(s).
///
class FlutterFilamentFFI extends FlutterFilamentPlatform {
final _channel = const MethodChannel("app.polyvox.filament/event");
late final FilamentViewer viewer;
static void registerWith() {
FlutterFilamentPlatform.instance = FlutterFilamentFFI();
}
Future initialize({String? uberArchivePath}) async {
var resourceLoader = Pointer<Void>.fromAddress(
await _channel.invokeMethod("getResourceLoaderWrapper"));
if (resourceLoader == nullptr) {
throw Exception("Failed to get resource loader");
}
var renderCallbackResult = await _channel.invokeMethod("getRenderCallback");
var renderCallback =
Pointer<NativeFunction<Void Function(Pointer<Void>)>>.fromAddress(
renderCallbackResult[0]);
var renderCallbackOwner =
Pointer<Void>.fromAddress(renderCallbackResult[1]);
var driverPlatform = await _channel.invokeMethod("getDriverPlatform");
var driverPtr = driverPlatform == null
? nullptr
: Pointer<Void>.fromAddress(driverPlatform);
var sharedContext = await _channel.invokeMethod("getSharedContext");
var sharedContextPtr = sharedContext == null
? nullptr
: Pointer<Void>.fromAddress(sharedContext);
viewer = FilamentViewer(
resourceLoader: resourceLoader,
renderCallback: renderCallback,
renderCallbackOwner: renderCallbackOwner,
driver: driverPtr,
sharedContext: sharedContextPtr,
uberArchivePath: uberArchivePath);
// var plugin = FlutterFilamentFFI._(channel,
// renderCallback: renderCallback,
// renderCallbackOwner: renderCallbackOwner,
// resourceLoader: resourceLoader,
// driver: driverPtr,
// sharedContext: sharedContextPtr,
// uberArchivePath: uberArchivePath);
}
Future<FlutterFilamentTexture?> createTexture(
int width, int height, int offsetLeft, int offsetRight) async {
var result = await _channel
.invokeMethod("createTexture", [width, height, offsetLeft, offsetLeft]);
if (result == null || result[0] == -1) {
throw Exception("Failed to create texture");
}
viewer.viewportDimensions = (width.toDouble(), height.toDouble());
var texture =
FlutterFilamentTexture(result[0], result[1], width, height, result[2]);
await viewer.createSwapChain(width.toDouble(), height.toDouble(),
surface: texture.surfaceAddress == null ? nullptr : Pointer<Void>.fromAddress(texture.surfaceAddress!));
if (texture.hardwareTextureId != null) {
var renderTarget = await viewer.createRenderTarget(
width.toDouble(), height.toDouble(), texture.hardwareTextureId!);
}
await viewer.updateViewportAndCameraProjection(
width.toDouble(), height.toDouble());
viewer.render();
return texture;
}
Future destroyTexture(FlutterFilamentTexture texture) async {
await _channel.invokeMethod("destroyTexture", texture.flutterTextureId);
}
@override
Future<FlutterFilamentTexture?> resizeTexture(FlutterFilamentTexture texture,
int width, int height, int offsetLeft, int offsetRight) async {
if ((width - viewer.viewportDimensions.$1).abs() < 0.001 ||
(height - viewer.viewportDimensions.$2).abs() < 0.001) {
return texture;
}
bool wasRendering = viewer.rendering;
await viewer.setRendering(false);
await viewer.destroySwapChain();
await destroyTexture(texture);
var newTexture =
await createTexture(width, height, offsetLeft, offsetRight);
if (newTexture == null || newTexture.flutterTextureId == -1) {
throw Exception("Failed to create texture");
}
await viewer.createSwapChain(width.toDouble(), height.toDouble(),
surface: Pointer<Void>.fromAddress(newTexture.surfaceAddress!));
if (newTexture!.hardwareTextureId != null) {
await viewer.createRenderTarget(
width.toDouble(), height.toDouble(), newTexture!.hardwareTextureId!);
}
await viewer.updateViewportAndCameraProjection(
width.toDouble(), height.toDouble());
viewer.viewportDimensions = (width.toDouble(), height.toDouble());
if (wasRendering) {
await viewer.setRendering(true);
}
return newTexture;
// await _channel.invokeMethod("resizeTexture",
// [texture.flutterTextureId, width, height, offsetLeft, offsetRight]);
}
@override
void dispose() {
// TODO: implement dispose
}
}