From 14b0b674c57e0a3d89ef8b46d541d58248bb11e0 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 30 Apr 2024 14:14:54 +0800 Subject: [PATCH] fix iOS --- dart_filament/hook/build.dart | 39 +- .../dart_filament/filament_viewer_impl.dart | 12 +- dart_filament/native/include/ResourceBuffer.h | 46 + .../native/include/ResourceBuffer.hpp | 44 +- flutter_filament/.gitignore | 4 +- .../ios/Flutter/AppFrameworkInfo.plist | 2 +- flutter_filament/example/ios/Podfile | 2 +- flutter_filament/example/ios/Podfile.lock | 16 +- .../ios/Runner.xcodeproj/project.pbxproj | 23 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../example/ios/Runner/AppDelegate.swift | 2 +- .../ios/Classes/FlutterFilamentPlugin.h | 4 - .../ios/Classes/FlutterFilamentPlugin.m | 18 - .../ios/Classes/FlutterFilamentTexture.swift | 48 + flutter_filament/ios/Classes/ResourceBuffer.c | 10 + .../Classes/SwiftFlutterFilamentPlugin.swift | 65 +- flutter_filament/ios/flutter_filament.podspec | 16 +- flutter_filament/ios/include/ResourceBuffer.h | 1 + .../ios/include/ResourceBuffer.h_ | 1 + ...iftFlutterFilamentPlugin-Bridging-Header.h | 6 + .../lib/filament/flutter_filament_plugin.dart | 51 +- .../filament/flutter_filament_texture.dart | 13 +- .../lib/filament/generated_bindings_web.dart | 1573 ----------------- .../macos/Classes/DartFilamentTexture.swift | 11 +- .../Classes/FlutterFilamentTexture.swift | 33 + .../Classes/SwiftFlutterFilamentPlugin.swift | 34 +- .../macos/include/ResourceBuffer.hpp | 117 ++ ...iftFlutterFilamentPlugin-Bridging-Header.h | 17 + 28 files changed, 423 insertions(+), 1787 deletions(-) create mode 100644 dart_filament/native/include/ResourceBuffer.h delete mode 100644 flutter_filament/ios/Classes/FlutterFilamentPlugin.h delete mode 100644 flutter_filament/ios/Classes/FlutterFilamentPlugin.m create mode 100644 flutter_filament/ios/Classes/FlutterFilamentTexture.swift create mode 100644 flutter_filament/ios/Classes/ResourceBuffer.c create mode 120000 flutter_filament/ios/include/ResourceBuffer.h create mode 120000 flutter_filament/ios/include/ResourceBuffer.h_ create mode 100644 flutter_filament/ios/include/SwiftFlutterFilamentPlugin-Bridging-Header.h delete mode 100644 flutter_filament/lib/filament/generated_bindings_web.dart create mode 100644 flutter_filament/macos/Classes/FlutterFilamentTexture.swift create mode 100644 flutter_filament/macos/include/ResourceBuffer.hpp create mode 100644 flutter_filament/macos/include/SwiftFlutterFilamentPlugin-Bridging-Header.h diff --git a/dart_filament/hook/build.dart b/dart_filament/hook/build.dart index a32bd0c6..88e8cc4a 100644 --- a/dart_filament/hook/build.dart +++ b/dart_filament/hook/build.dart @@ -25,6 +25,29 @@ void main(List args) async { "${config.packageRoot.toFilePath()}/native/include/material/image.c", ]); + var frameworks = []; + + if (platform == "ios") { + frameworks.addAll([ + 'Foundation', + 'CoreGraphics', + 'QuartzCore', + 'GLKit', + "Metal", + 'CoreVideo', + 'OpenGLES' + ]); + } else if (platform == "macos") { + frameworks.addAll([ + 'Foundation', + 'CoreVideo', + 'Cocoa', + "Metal", + ]); + } + + frameworks = frameworks.expand((f) => ["-framework", f]).toList(); + final cbuilder = CBuilder.library( name: packageName, language: Language.cpp, @@ -32,16 +55,10 @@ void main(List args) async { sources: sources, includes: ['native/include', 'native/include/filament'], flags: [ - '-mmacosx-version-min=13.0', + if (platform == "macos") '-mmacosx-version-min=13.0', + if (platform == "ios") '-mios-version-min=13.0', + ...frameworks, '-std=c++17', - '-framework', - 'Foundation', - '-framework', - 'CoreVideo', - '-framework', - 'Cocoa', - '-framework', - 'Metal', "-lfilament", "-lbackend", "-lfilameshio", @@ -68,8 +85,8 @@ void main(List args) async { "-luberarchive", "-lzstd", "-lstdc++", - "-lbluegl", - "-lbluevk", + if (platform == "macos") "-lbluegl", + if (platform == "macos") "-lbluevk", "-lbasis_transcoder", "-L$libDir", "-force_load", diff --git a/dart_filament/lib/dart_filament/filament_viewer_impl.dart b/dart_filament/lib/dart_filament/filament_viewer_impl.dart index 627cff07..44555b0a 100644 --- a/dart_filament/lib/dart_filament/filament_viewer_impl.dart +++ b/dart_filament/lib/dart_filament/filament_viewer_impl.dart @@ -48,8 +48,6 @@ class FilamentViewer extends AbstractFilamentViewer { var _sharedContext = nullptr.cast(); - late final Pointer _surface; - /// /// This controller uses platform channels to bridge Dart with the C/C++ code for the Filament API. /// Setting up the context/texture (since this is platform-specific) and the render ticker are platform-specific; all other methods are passed through by the platform channel to the methods specified in FlutterFilamentApi.h. @@ -57,14 +55,12 @@ class FilamentViewer extends AbstractFilamentViewer { FilamentViewer( {RenderCallback? renderCallback, Pointer? renderCallbackOwner, - Pointer? surface, required this.resourceLoader, Pointer? driver, Pointer? sharedContext, this.uberArchivePath}) { this._renderCallbackOwner = renderCallbackOwner ?? nullptr; this._renderCallback = renderCallback ?? nullptr; - this._surface = surface ?? nullptr; this._driver = driver ?? nullptr; this._sharedContext = sharedContext ?? nullptr; @@ -87,11 +83,11 @@ class FilamentViewer extends AbstractFilamentViewer { }); } - Future createSwapChain(double width, double height) async { + Future createSwapChain(double width, double height, + {Pointer? surface}) async { await _withVoidCallback((callback) { - print("VIEWER IS $_viewer"); - create_swap_chain_ffi( - _viewer!, _surface, width.toInt(), height.toInt(), callback); + create_swap_chain_ffi(_viewer!, surface ?? nullptr, width.toInt(), + height.toInt(), callback); }); } diff --git a/dart_filament/native/include/ResourceBuffer.h b/dart_filament/native/include/ResourceBuffer.h new file mode 100644 index 00000000..1314fa1f --- /dev/null +++ b/dart_filament/native/include/ResourceBuffer.h @@ -0,0 +1,46 @@ +#ifndef RESOURCE_BUFFER_H +#define RESOURCE_BUFFER_H + +#include +#include + +// +// A ResourceBuffer is a unified interface for working with +// binary assets across various platforms. +// This is simply: +// 1) a pointer to some data +// 2) the length of the data +// 3) an ID that can be passed back to the native platform to release the underlying asset when needed. +// +struct ResourceBuffer +{ + const void *const data; + const int32_t size; + const int32_t id; + +#if defined(__cplusplus) + ResourceBuffer(void *const data, int32_t size, int32_t id) : data(data), size(size), id(id) {} +#endif +}; + +typedef struct ResourceBuffer ResourceBuffer; +typedef void (*LoadFilamentResourceIntoOutPointer)(const char *uri, ResourceBuffer *out); +typedef ResourceBuffer (*LoadFilamentResource)(const char *uri); +typedef ResourceBuffer (*LoadFilamentResourceFromOwner)(const char *const, void *const owner); +typedef void (*FreeFilamentResource)(ResourceBuffer); +typedef void (*FreeFilamentResourceFromOwner)(ResourceBuffer, void *const owner); + +struct ResourceLoaderWrapper +{ + LoadFilamentResource loadResource; + FreeFilamentResource freeResource; + LoadFilamentResourceFromOwner loadFromOwner; + FreeFilamentResourceFromOwner freeFromOwner; + void *owner; + LoadFilamentResourceIntoOutPointer loadToOut; +}; +typedef struct ResourceLoaderWrapper ResourceLoaderWrapper; + +ResourceLoaderWrapper *make_resource_loader(LoadFilamentResourceFromOwner loadFn, FreeFilamentResourceFromOwner freeFn, void *const owner); + +#endif diff --git a/dart_filament/native/include/ResourceBuffer.hpp b/dart_filament/native/include/ResourceBuffer.hpp index 5fc6eaa0..0b546990 100644 --- a/dart_filament/native/include/ResourceBuffer.hpp +++ b/dart_filament/native/include/ResourceBuffer.hpp @@ -1,45 +1,7 @@ -#ifndef RESOURCE_BUFFER_H -#define RESOURCE_BUFFER_H +#ifndef RESOURCE_BUFFER_HPP +#define RESOURCE_BUFFER_HPP -#include -#include - -// -// A ResourceBuffer is a unified interface for working with -// binary assets across various platforms. -// This is simply: -// 1) a pointer to some data -// 2) the length of the data -// 3) an ID that can be passed back to the native platform to release the underlying asset when needed. -// -struct ResourceBuffer -{ - const void *const data; - const int32_t size; - const int32_t id; - -#if defined(__cplusplus) - ResourceBuffer(void *const data, int32_t size, int32_t id) : data(data), size(size), id(id) {} -#endif -}; - -typedef struct ResourceBuffer ResourceBuffer; -typedef void (*LoadFilamentResourceIntoOutPointer)(const char *uri, ResourceBuffer *out); -typedef ResourceBuffer (*LoadFilamentResource)(const char *uri); -typedef ResourceBuffer (*LoadFilamentResourceFromOwner)(const char *const, void *const owner); -typedef void (*FreeFilamentResource)(ResourceBuffer); -typedef void (*FreeFilamentResourceFromOwner)(ResourceBuffer, void *const owner); - -struct ResourceLoaderWrapper -{ - LoadFilamentResource loadResource; - FreeFilamentResource freeResource; - LoadFilamentResourceFromOwner loadFromOwner; - FreeFilamentResourceFromOwner freeFromOwner; - void *owner; - LoadFilamentResourceIntoOutPointer loadToOut; -}; -typedef struct ResourceLoaderWrapper ResourceLoaderWrapper; +#include "ResourceBuffer.h" #if defined(__cplusplus) diff --git a/flutter_filament/.gitignore b/flutter_filament/.gitignore index 9dcd4503..a0f0e538 100644 --- a/flutter_filament/.gitignore +++ b/flutter_filament/.gitignore @@ -1,4 +1,2 @@ .vscode -macos/src -macos/include -.DS_Store \ No newline at end of file +.DS_Store diff --git a/flutter_filament/example/ios/Flutter/AppFrameworkInfo.plist b/flutter_filament/example/ios/Flutter/AppFrameworkInfo.plist index 9625e105..7c569640 100644 --- a/flutter_filament/example/ios/Flutter/AppFrameworkInfo.plist +++ b/flutter_filament/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/flutter_filament/example/ios/Podfile b/flutter_filament/example/ios/Podfile index 9061ff8f..18b956ee 100644 --- a/flutter_filament/example/ios/Podfile +++ b/flutter_filament/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '12.1' +platform :ios, '13.1' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/flutter_filament/example/ios/Podfile.lock b/flutter_filament/example/ios/Podfile.lock index 30bedf6c..4588f1cd 100644 --- a/flutter_filament/example/ios/Podfile.lock +++ b/flutter_filament/example/ios/Podfile.lock @@ -7,7 +7,7 @@ PODS: - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - - permission_handler_apple (9.1.1): + - permission_handler_apple (9.3.0): - Flutter DEPENDENCIES: @@ -30,12 +30,12 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/permission_handler_apple/ios" SPEC CHECKSUMS: - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - flutter_filament: 9d744e795935e0fc5308e46a0c5947cb91714848 - integration_test: 13825b8a9334a850581300559b8839134b124670 - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_filament: 931482c60f0020743ef1a87350e0620079c22b61 + integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 + path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c + permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 -PODFILE CHECKSUM: 7adbc9d59f05e1b01f554ea99b6c79e97f2214a2 +PODFILE CHECKSUM: a4605dec2dc7bf1ddcfc6f5f4cb7515785c9865e -COCOAPODS: 1.12.1 +COCOAPODS: 1.15.2 diff --git a/flutter_filament/example/ios/Runner.xcodeproj/project.pbxproj b/flutter_filament/example/ios/Runner.xcodeproj/project.pbxproj index a88aead4..bfb819a8 100644 --- a/flutter_filament/example/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter_filament/example/ios/Runner.xcodeproj/project.pbxproj @@ -139,6 +139,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, F9FAB8A67CF505858CCDA424 /* [CP] Embed Pods Frameworks */, + 55F3237D47F23FE63525E002 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -155,7 +156,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -235,6 +236,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 55F3237D47F23FE63525E002 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -365,6 +383,7 @@ DEVELOPMENT_TEAM = TM2B4SJXNJ; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -504,6 +523,7 @@ DEVELOPMENT_TEAM = TM2B4SJXNJ; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -533,6 +553,7 @@ DEVELOPMENT_TEAM = TM2B4SJXNJ; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/flutter_filament/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter_filament/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a6b826db..5e31d3d3 100644 --- a/flutter_filament/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/flutter_filament/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - -@interface FlutterFilamentPlugin : NSObject -@end diff --git a/flutter_filament/ios/Classes/FlutterFilamentPlugin.m b/flutter_filament/ios/Classes/FlutterFilamentPlugin.m deleted file mode 100644 index c041c8e0..00000000 --- a/flutter_filament/ios/Classes/FlutterFilamentPlugin.m +++ /dev/null @@ -1,18 +0,0 @@ -#import "FlutterFilamentPlugin.h" -#if __has_include() -#import -#else -// Support project import fallback if the generated compatibility header -// is not copied when this plugin is created as a library. -// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 -#import "flutter_filament-Swift.h" -#endif - -#include "FlutterFilamentApi.h" - -@implementation FlutterFilamentPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftFlutterFilamentPlugin registerWithRegistrar:registrar]; - ios_dummy(); -} -@end diff --git a/flutter_filament/ios/Classes/FlutterFilamentTexture.swift b/flutter_filament/ios/Classes/FlutterFilamentTexture.swift new file mode 100644 index 00000000..637b8ace --- /dev/null +++ b/flutter_filament/ios/Classes/FlutterFilamentTexture.swift @@ -0,0 +1,48 @@ +import Foundation +import GLKit +import Flutter + +public class FlutterFilamentTexture : NSObject, FlutterTexture { + + public var pixelBuffer: CVPixelBuffer? + + var pixelBufferAttrs = [ + kCVPixelBufferPixelFormatTypeKey: NSNumber(value: kCVPixelFormatType_32BGRA), + kCVPixelBufferOpenGLCompatibilityKey: kCFBooleanTrue, + kCVPixelBufferOpenGLESCompatibilityKey: kCFBooleanTrue, + kCVPixelBufferIOSurfacePropertiesKey: [:] + ] as CFDictionary + + var flutterTextureId: Int64 = -1 + var registry: FlutterTextureRegistry? + + init(width:Int64, height:Int64, registry:FlutterTextureRegistry) { + self.registry = registry + + super.init() + + if(CVPixelBufferCreate(kCFAllocatorDefault, Int(width), Int(height), + kCVPixelFormatType_32BGRA, pixelBufferAttrs, &pixelBuffer) != kCVReturnSuccess) { + print("Error allocating pixel buffer") + } else { + self.flutterTextureId = registry.register(self) + } + } + + public func copyPixelBuffer() -> Unmanaged? { + return Unmanaged.passRetained(pixelBuffer!); + } + + public func onTextureUnregistered(_ texture:FlutterTexture) { + print("Texture unregistered") + } + + public func destroy() { + if(self.flutterTextureId != -1) { + self.registry!.unregisterTexture(self.flutterTextureId) + } + + self.pixelBuffer = nil + } + +} diff --git a/flutter_filament/ios/Classes/ResourceBuffer.c b/flutter_filament/ios/Classes/ResourceBuffer.c new file mode 100644 index 00000000..f2ec5e00 --- /dev/null +++ b/flutter_filament/ios/Classes/ResourceBuffer.c @@ -0,0 +1,10 @@ +#include "ResourceBuffer.h" + +ResourceLoaderWrapper *make_resource_loader(LoadFilamentResourceFromOwner loadFn, FreeFilamentResourceFromOwner freeFn, void *const owner) +{ + ResourceLoaderWrapper *rlw = (ResourceLoaderWrapper *)malloc(sizeof(ResourceLoaderWrapper)); + rlw->loadFromOwner = loadFn; + rlw->freeFromOwner = freeFn; + rlw->owner = owner; + return rlw; +} diff --git a/flutter_filament/ios/Classes/SwiftFlutterFilamentPlugin.swift b/flutter_filament/ios/Classes/SwiftFlutterFilamentPlugin.swift index f1a71237..495bc76f 100644 --- a/flutter_filament/ios/Classes/SwiftFlutterFilamentPlugin.swift +++ b/flutter_filament/ios/Classes/SwiftFlutterFilamentPlugin.swift @@ -2,23 +2,14 @@ import Flutter import UIKit import GLKit -public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture { +public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin { var registrar : FlutterPluginRegistrar - var flutterTextureId: Int64? var registry: FlutterTextureRegistry - - var pixelBuffer: CVPixelBuffer?; - + var texture: FlutterFilamentTexture? + var createdAt = Date() - - var pixelBufferAttrs = [ - kCVPixelBufferPixelFormatTypeKey: NSNumber(value: kCVPixelFormatType_32BGRA), - kCVPixelBufferOpenGLCompatibilityKey: kCFBooleanTrue, - kCVPixelBufferOpenGLESCompatibilityKey: kCFBooleanTrue, - kCVPixelBufferIOSurfacePropertiesKey: [:] - ] as CFDictionary - + var resources:NSMutableDictionary = [:] static var messenger : FlutterBinaryMessenger? = nil; @@ -127,19 +118,11 @@ public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture var markTextureFrameAvailable : @convention(c) (UnsafeMutableRawPointer?) -> () = { instancePtr in let instance:SwiftFlutterFilamentPlugin = Unmanaged.fromOpaque(instancePtr!).takeUnretainedValue() - instance.registry.textureFrameAvailable(instance.flutterTextureId!) - } - - public func copyPixelBuffer() -> Unmanaged? { - if(pixelBuffer == nil) { - return nil; + if(instance.texture != nil) { + instance.registry.textureFrameAvailable(instance.texture!.flutterTextureId) } - return Unmanaged.passRetained(pixelBuffer!); - } - - public func onTextureUnregistered(_ texture:FlutterTexture) { - print("Texture unregistered") } + public static func register(with registrar: FlutterPluginRegistrar) { let _messenger = registrar.messenger(); @@ -153,15 +136,6 @@ public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture self.registry = textureRegistry; self.registrar = registrar } - - private func createPixelBuffer(width:Int, height:Int) { - if(CVPixelBufferCreate(kCFAllocatorDefault, Int(width), Int(height), - kCVPixelFormatType_32BGRA, pixelBufferAttrs, &pixelBuffer) != kCVReturnSuccess) { - print("Error allocating pixel buffer") - } - self.flutterTextureId = self.registry.register(self) - } - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { let methodName = call.method; @@ -173,20 +147,25 @@ public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture let renderCallback = markTextureFrameAvailable result([ unsafeBitCast(renderCallback, to:Int64.self), unsafeBitCast(Unmanaged.passUnretained(self), to:UInt64.self)]) - case "getDriverPlatfrom": + case "getDriverPlatform": + result(nil) + case "getSharedContext": result(nil) case "createTexture": - let args = call.arguments as! Array - createPixelBuffer(width:Int(args[0]), height:Int(args[1])) - let pixelBufferPtr = unsafeBitCast(pixelBuffer!, to:UnsafeRawPointer.self) + let args = call.arguments as! [Any] + let width = args[0] as! Int64 + let height = args[1] as! Int64 + + self.texture = FlutterFilamentTexture(width: width, height: height, registry: registry) + let pixelBufferPtr = unsafeBitCast(self.texture!.pixelBuffer, to:UnsafeRawPointer.self) let pixelBufferAddress = Int(bitPattern:pixelBufferPtr); - result([self.flutterTextureId, pixelBufferAddress, nil, nil]) + + result([self.texture!.flutterTextureId as Any, nil, pixelBufferAddress]) case "destroyTexture": - if(self.flutterTextureId != nil) { - self.registry.unregisterTexture(self.flutterTextureId!) - } - self.flutterTextureId = nil - self.pixelBuffer = nil + let texture = self.texture + self.texture = nil + texture?.destroy() + result(true) default: result(FlutterMethodNotImplemented) diff --git a/flutter_filament/ios/flutter_filament.podspec b/flutter_filament/ios/flutter_filament.podspec index 76aeadae..b2d2b2b8 100644 --- a/flutter_filament/ios/flutter_filament.podspec +++ b/flutter_filament/ios/flutter_filament.podspec @@ -13,33 +13,21 @@ A new flutter plugin project. s.license = { :file => '../LICENSE' } s.author = { 'Your Company' => 'email@example.com' } s.source = { :path => '.' } - s.source_files = 'Classes/*', 'src/*', "src/camutils/*", 'src/ios/*', 'include/filament/*', 'include/*', 'include/material/*.c' - s.public_header_files = 'include/SwiftFlutterFilamentPlugin-Bridging-Header.h', 'include/FlutterFilamentApi.h', 'include/FlutterFilamentFFIApi.h', 'include/ResourceBuffer.hpp', 'include/Log.hpp' + s.source_files = 'Classes/*', 'include/SwiftFlutterFilamentPlugin-Bridging-Header.h', 'include/ResourceBuffer.h' + s.public_header_files = 'include/SwiftFlutterFilamentPlugin-Bridging-Header.h', 'include/ResourceBuffer.h' s.dependency 'Flutter' s.platform = :ios, '13.0' s.static_framework = true - s.vendored_libraries = "lib/*.a" s.user_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386', "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", 'OTHER_CFLAGS' => '"-fvisibility=default" "$(inherited)"', - 'USER_HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/include" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/include/filament" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/src" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/src/image" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/src/shaders" "$(inherited)"', - 'ALWAYS_SEARCH_USER_PATHS' => 'YES', - "OTHER_LDFLAGS" => '-lfilament -lbackend -lfilameshio -lviewer -lfilamat -lgeometry -lutils -lfilabridge -lgltfio_core -lfilament-iblprefilter -limage -limageio -ltinyexr -lgltfio_core -lfilaflat -ldracodec -libl -lktxreader -lpng -lpng16 -lz -lstb -luberzlib -lsmol-v -luberarchive -lzstd -lstdc++', - 'LIBRARY_SEARCH_PATHS' => '"${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/lib" "$(inherited)"', } s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386', - "CLANG_CXX_LANGUAGE_STANDARD" => "c++17", - 'OTHER_CXXFLAGS' => '"--std=c++17" "-fmodules" "-fcxx-modules" "-fvisibility=default" "$(inherited)"', - 'OTHER_CFLAGS' => '"-fvisibility=default" "$(inherited)"', - 'USER_HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/include" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/include/filament" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/src" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/src/image" "${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/src/shaders" "$(inherited)"', - 'ALWAYS_SEARCH_USER_PATHS' => 'YES', - "OTHER_LDFLAGS" => '-lfilament -lbackend -lfilameshio -lviewer -lfilamat -lgeometry -lutils -lfilabridge -lgltfio_core -lfilament-iblprefilter -limage -limageio -ltinyexr -lgltfio_core -lfilaflat -ldracodec -libl -lktxreader -lpng -lpng16 -lz -lstb -luberzlib -lsmol-v -luberarchive -lzstd -lstdc++', - 'LIBRARY_SEARCH_PATHS' => '"${PODS_ROOT}/../.symlinks/plugins/flutter_filament/ios/lib" "$(inherited)"', } s.swift_version = '5.0' diff --git a/flutter_filament/ios/include/ResourceBuffer.h b/flutter_filament/ios/include/ResourceBuffer.h new file mode 120000 index 00000000..5375d4ad --- /dev/null +++ b/flutter_filament/ios/include/ResourceBuffer.h @@ -0,0 +1 @@ +../../../dart_filament/native/include/ResourceBuffer.h \ No newline at end of file diff --git a/flutter_filament/ios/include/ResourceBuffer.h_ b/flutter_filament/ios/include/ResourceBuffer.h_ new file mode 120000 index 00000000..5375d4ad --- /dev/null +++ b/flutter_filament/ios/include/ResourceBuffer.h_ @@ -0,0 +1 @@ +../../../dart_filament/native/include/ResourceBuffer.h \ No newline at end of file diff --git a/flutter_filament/ios/include/SwiftFlutterFilamentPlugin-Bridging-Header.h b/flutter_filament/ios/include/SwiftFlutterFilamentPlugin-Bridging-Header.h new file mode 100644 index 00000000..c3548735 --- /dev/null +++ b/flutter_filament/ios/include/SwiftFlutterFilamentPlugin-Bridging-Header.h @@ -0,0 +1,6 @@ +#ifndef SwiftFlutterFilamentPlugin_Bridging_Header_h +#define SwiftFlutterFilamentPlugin_Bridging_Header_h + +#include "ResourceBuffer.h" + +#endif diff --git a/flutter_filament/lib/filament/flutter_filament_plugin.dart b/flutter_filament/lib/filament/flutter_filament_plugin.dart index 5633dffa..37a419e1 100644 --- a/flutter_filament/lib/filament/flutter_filament_plugin.dart +++ b/flutter_filament/lib/filament/flutter_filament_plugin.dart @@ -10,14 +10,12 @@ import 'package:flutter_filament/filament/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 FlutterFilamentPlugin extends FilamentViewer { final MethodChannel _channel; FlutterFilamentPlugin._(this._channel, {super.renderCallback, super.renderCallbackOwner, - super.surface, required super.resourceLoader, super.driver, super.sharedContext, @@ -50,14 +48,9 @@ class FlutterFilamentPlugin extends FilamentViewer { ? nullptr : Pointer.fromAddress(sharedContext); - var window = await channel.invokeMethod("getWindow"); - var windowPtr = - window == null ? nullptr : Pointer.fromAddress(window); - return FlutterFilamentPlugin._(channel, renderCallback: renderCallback, renderCallbackOwner: renderCallbackOwner, - surface: windowPtr, resourceLoader: resourceLoader, driver: driverPtr, sharedContext: sharedContextPtr, @@ -69,14 +62,22 @@ class FlutterFilamentPlugin extends FilamentViewer { var result = await _channel .invokeMethod("createTexture", [width, height, offsetLeft, offsetLeft]); if (result == null) { - return null; + throw Exception("Failed to create texture"); } viewportDimensions = (width.toDouble(), height.toDouble()); - var texture = FlutterFilamentTexture(result[0], result[1], width, height); - await createSwapChain(width.toDouble(), height.toDouble()); + var texture = + FlutterFilamentTexture(result[0], result[1], width, height, result[2]); - var renderTarget = await createRenderTarget( - width.toDouble(), height.toDouble(), texture.hardwareTextureId); + await createSwapChain(width.toDouble(), height.toDouble(), + surface: texture.surface); + + if (texture.hardwareTextureId != null) { + var renderTarget = await createRenderTarget( + width.toDouble(), height.toDouble(), texture.hardwareTextureId!); + } + await updateViewportAndCameraProjection( + width.toDouble(), height.toDouble()); + this.render(); return texture; } @@ -85,19 +86,35 @@ class FlutterFilamentPlugin extends FilamentViewer { } @override - Future resizeTexture(FlutterFilamentTexture texture, int width, int height, - int offsetLeft, int offsetRight) async { + Future resizeTexture(FlutterFilamentTexture texture, + int width, int height, int offsetLeft, int offsetRight) async { + if ((width - viewportDimensions.$1).abs() < 0.001 || + (height - viewportDimensions.$2).abs() < 0.001) { + return texture; + } + bool wasRendering = rendering; + await setRendering(false); await destroySwapChain(); await destroyTexture(texture); - await createSwapChain(width.toDouble(), height.toDouble()); var newTexture = await createTexture(width, height, offsetLeft, offsetRight); - await createRenderTarget( - width.toDouble(), height.toDouble(), newTexture!.hardwareTextureId); + if (newTexture == null) { + throw Exception("Failed to create texture"); + } + await createSwapChain(width.toDouble(), height.toDouble(), + surface: newTexture.surface!); + + if (newTexture!.hardwareTextureId != null) { + await createRenderTarget( + width.toDouble(), height.toDouble(), newTexture!.hardwareTextureId!); + } await updateViewportAndCameraProjection( width.toDouble(), height.toDouble()); viewportDimensions = (width.toDouble(), height.toDouble()); + if (wasRendering) { + await setRendering(true); + } return newTexture; // await _channel.invokeMethod("resizeTexture", // [texture.flutterTextureId, width, height, offsetLeft, offsetRight]); diff --git a/flutter_filament/lib/filament/flutter_filament_texture.dart b/flutter_filament/lib/filament/flutter_filament_texture.dart index c979e5a9..6993bd6c 100644 --- a/flutter_filament/lib/filament/flutter_filament_texture.dart +++ b/flutter_filament/lib/filament/flutter_filament_texture.dart @@ -1,9 +1,16 @@ +import 'dart:ffi'; + class FlutterFilamentTexture { final int width; final int height; final int flutterTextureId; - final int hardwareTextureId; + final int? hardwareTextureId; + Pointer? surface; - FlutterFilamentTexture( - this.flutterTextureId, this.hardwareTextureId, this.width, this.height); + FlutterFilamentTexture(this.flutterTextureId, this.hardwareTextureId, + this.width, this.height, int? surfaceAddress) { + if (surfaceAddress != null) { + surface = Pointer.fromAddress(surfaceAddress!); + } + } } diff --git a/flutter_filament/lib/filament/generated_bindings_web.dart b/flutter_filament/lib/filament/generated_bindings_web.dart deleted file mode 100644 index b6effd76..00000000 --- a/flutter_filament/lib/filament/generated_bindings_web.dart +++ /dev/null @@ -1,1573 +0,0 @@ -// // AUTO GENERATED FILE, DO NOT EDIT. -// // -// // Generated by `package:ffigen`. -// // ignore_for_file: type=lint -// import 'dart:ffi' as ffi; - -// class NativeLibrary { -// /// Holds the symbol lookup function. -// final ffi.Pointer Function(String symbolName) -// _lookup; - -// /// The symbols are looked up in [dynamicLibrary]. -// NativeLibrary(ffi.DynamicLibrary dynamicLibrary) -// : _lookup = dynamicLibrary.lookup; - -// /// The symbols are looked up with [lookup]. -// NativeLibrary.fromLookup( -// ffi.Pointer Function(String symbolName) -// lookup) -// : _lookup = lookup; - -// ffi.Pointer create_filament_viewer( -// ffi.Pointer context, -// ffi.Pointer loader, -// ) { -// return _create_filament_viewer( -// context, -// loader, -// ); -// } - -// late final _create_filament_viewerPtr = _lookup< -// ffi.NativeFunction< -// ffi.Pointer Function(ffi.Pointer, -// ffi.Pointer)>>('create_filament_viewer'); -// late final _create_filament_viewer = _create_filament_viewerPtr.asFunction< -// ffi.Pointer Function( -// ffi.Pointer, ffi.Pointer)>(); - -// ffi.Pointer make_resource_loader( -// LoadFilamentResourceFromOwner loadFn, -// FreeFilamentResourceFromOwner freeFn, -// ffi.Pointer owner, -// ) { -// return _make_resource_loader( -// loadFn, -// freeFn, -// owner, -// ); -// } - -// late final _make_resource_loaderPtr = _lookup< -// ffi.NativeFunction< -// ffi.Pointer Function( -// LoadFilamentResourceFromOwner, -// FreeFilamentResourceFromOwner, -// ffi.Pointer)>>('make_resource_loader'); -// late final _make_resource_loader = _make_resource_loaderPtr.asFunction< -// ffi.Pointer Function(LoadFilamentResourceFromOwner, -// FreeFilamentResourceFromOwner, ffi.Pointer)>(); - -// void destroy_filament_viewer( -// ffi.Pointer viewer, -// ) { -// return _destroy_filament_viewer( -// viewer, -// ); -// } - -// late final _destroy_filament_viewerPtr = -// _lookup)>>( -// 'destroy_filament_viewer'); -// late final _destroy_filament_viewer = _destroy_filament_viewerPtr -// .asFunction)>(); - -// ffi.Pointer get_asset_manager( -// ffi.Pointer viewer, -// ) { -// return _get_asset_manager( -// viewer, -// ); -// } - -// late final _get_asset_managerPtr = _lookup< -// ffi.NativeFunction< -// ffi.Pointer Function( -// ffi.Pointer)>>('get_asset_manager'); -// late final _get_asset_manager = _get_asset_managerPtr -// .asFunction Function(ffi.Pointer)>(); - -// void create_render_target( -// ffi.Pointer viewer, -// int textureId, -// int width, -// int height, -// ) { -// return _create_render_target( -// viewer, -// textureId, -// width, -// height, -// ); -// } - -// late final _create_render_targetPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, -// ffi.Uint32)>>('create_render_target'); -// late final _create_render_target = _create_render_targetPtr -// .asFunction, int, int, int)>(); - -// void clear_background_image( -// ffi.Pointer viewer, -// ) { -// return _clear_background_image( -// viewer, -// ); -// } - -// late final _clear_background_imagePtr = -// _lookup)>>( -// 'clear_background_image'); -// late final _clear_background_image = _clear_background_imagePtr -// .asFunction)>(); - -// void set_background_image( -// ffi.Pointer viewer, -// ffi.Pointer path, -// int fillHeight, -// ) { -// return _set_background_image( -// viewer, -// path, -// fillHeight, -// ); -// } - -// late final _set_background_imagePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Pointer, -// ffi.Int)>>('set_background_image'); -// late final _set_background_image = _set_background_imagePtr.asFunction< -// void Function(ffi.Pointer, ffi.Pointer, int)>(); - -// void set_background_image_position( -// ffi.Pointer viewer, -// double x, -// double y, -// int clamp, -// ) { -// return _set_background_image_position( -// viewer, -// x, -// y, -// clamp, -// ); -// } - -// late final _set_background_image_positionPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Int)>>('set_background_image_position'); -// late final _set_background_image_position = _set_background_image_positionPtr -// .asFunction, double, double, int)>(); - -// void set_background_color( -// ffi.Pointer viewer, -// double r, -// double g, -// double b, -// double a, -// ) { -// return _set_background_color( -// viewer, -// r, -// g, -// b, -// a, -// ); -// } - -// late final _set_background_colorPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Float, ffi.Float)>>('set_background_color'); -// late final _set_background_color = _set_background_colorPtr.asFunction< -// void Function(ffi.Pointer, double, double, double, double)>(); - -// void set_tone_mapping( -// ffi.Pointer viewer, -// int toneMapping, -// ) { -// return _set_tone_mapping( -// viewer, -// toneMapping, -// ); -// } - -// late final _set_tone_mappingPtr = _lookup< -// ffi -// .NativeFunction, ffi.Int)>>( -// 'set_tone_mapping'); -// late final _set_tone_mapping = _set_tone_mappingPtr -// .asFunction, int)>(); - -// void set_bloom( -// ffi.Pointer viewer, -// double strength, -// ) { -// return _set_bloom( -// viewer, -// strength, -// ); -// } - -// late final _set_bloomPtr = _lookup< -// ffi -// .NativeFunction, ffi.Float)>>( -// 'set_bloom'); -// late final _set_bloom = -// _set_bloomPtr.asFunction, double)>(); - -// void load_skybox( -// ffi.Pointer viewer, -// ffi.Pointer skyboxPath, -// ) { -// return _load_skybox( -// viewer, -// skyboxPath, -// ); -// } - -// late final _load_skyboxPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, ffi.Pointer)>>('load_skybox'); -// late final _load_skybox = _load_skyboxPtr.asFunction< -// void Function(ffi.Pointer, ffi.Pointer)>(); - -// void load_ibl( -// ffi.Pointer viewer, -// ffi.Pointer iblPath, -// double intensity, -// ) { -// return _load_ibl( -// viewer, -// iblPath, -// intensity, -// ); -// } - -// late final _load_iblPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Pointer, -// ffi.Float)>>('load_ibl'); -// late final _load_ibl = _load_iblPtr.asFunction< -// void Function(ffi.Pointer, ffi.Pointer, double)>(); - -// void remove_skybox( -// ffi.Pointer viewer, -// ) { -// return _remove_skybox( -// viewer, -// ); -// } - -// late final _remove_skyboxPtr = -// _lookup)>>( -// 'remove_skybox'); -// late final _remove_skybox = -// _remove_skyboxPtr.asFunction)>(); - -// void remove_ibl( -// ffi.Pointer viewer, -// ) { -// return _remove_ibl( -// viewer, -// ); -// } - -// late final _remove_iblPtr = -// _lookup)>>( -// 'remove_ibl'); -// late final _remove_ibl = -// _remove_iblPtr.asFunction)>(); - -// int add_light( -// ffi.Pointer viewer, -// int type, -// double colour, -// double intensity, -// double posX, -// double posY, -// double posZ, -// double dirX, -// double dirY, -// double dirZ, -// int shadows, -// ) { -// return _add_light( -// viewer, -// type, -// colour, -// intensity, -// posX, -// posY, -// posZ, -// dirX, -// dirY, -// dirZ, -// shadows, -// ); -// } - -// late final _add_lightPtr = _lookup< -// ffi.NativeFunction< -// EntityId Function( -// ffi.Pointer, -// ffi.Uint8, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Int)>>('add_light'); -// late final _add_light = _add_lightPtr.asFunction< -// int Function(ffi.Pointer, int, double, double, double, double, -// double, double, double, double, int)>(); - -// void remove_light( -// ffi.Pointer viewer, -// int entityId, -// ) { -// return _remove_light( -// viewer, -// entityId, -// ); -// } - -// late final _remove_lightPtr = _lookup< -// ffi -// .NativeFunction, EntityId)>>( -// 'remove_light'); -// late final _remove_light = -// _remove_lightPtr.asFunction, int)>(); - -// void clear_lights( -// ffi.Pointer viewer, -// ) { -// return _clear_lights( -// viewer, -// ); -// } - -// late final _clear_lightsPtr = -// _lookup)>>( -// 'clear_lights'); -// late final _clear_lights = -// _clear_lightsPtr.asFunction)>(); - -// int load_glb( -// ffi.Pointer assetManager, -// ffi.Pointer assetPath, -// int unlit, -// ) { -// return _load_glb( -// assetManager, -// assetPath, -// unlit, -// ); -// } - -// late final _load_glbPtr = _lookup< -// ffi.NativeFunction< -// EntityId Function(ffi.Pointer, ffi.Pointer, -// ffi.Int)>>('load_glb'); -// late final _load_glb = _load_glbPtr.asFunction< -// int Function(ffi.Pointer, ffi.Pointer, int)>(); - -// int load_gltf( -// ffi.Pointer assetManager, -// ffi.Pointer assetPath, -// ffi.Pointer relativePath, -// ) { -// return _load_gltf( -// assetManager, -// assetPath, -// relativePath, -// ); -// } - -// late final _load_gltfPtr = _lookup< -// ffi.NativeFunction< -// EntityId Function(ffi.Pointer, ffi.Pointer, -// ffi.Pointer)>>('load_gltf'); -// late final _load_gltf = _load_gltfPtr.asFunction< -// int Function(ffi.Pointer, ffi.Pointer, -// ffi.Pointer)>(); - -// int set_camera( -// ffi.Pointer viewer, -// int asset, -// ffi.Pointer nodeName, -// ) { -// return _set_camera( -// viewer, -// asset, -// nodeName, -// ); -// } - -// late final _set_cameraPtr = _lookup< -// ffi.NativeFunction< -// ffi.Int Function(ffi.Pointer, EntityId, -// ffi.Pointer)>>('set_camera'); -// late final _set_camera = _set_cameraPtr.asFunction< -// int Function(ffi.Pointer, int, ffi.Pointer)>(); - -// void render( -// ffi.Pointer viewer, -// int frameTimeInNanos, -// ) { -// return _render( -// viewer, -// frameTimeInNanos, -// ); -// } - -// late final _renderPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Uint64)>>('render'); -// late final _render = -// _renderPtr.asFunction, int)>(); - -// void create_swap_chain( -// ffi.Pointer viewer, -// ffi.Pointer surface, -// int width, -// int height, -// ) { -// return _create_swap_chain( -// viewer, -// surface, -// width, -// height, -// ); -// } - -// late final _create_swap_chainPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Pointer, -// ffi.Uint32, ffi.Uint32)>>('create_swap_chain'); -// late final _create_swap_chain = _create_swap_chainPtr.asFunction< -// void Function(ffi.Pointer, ffi.Pointer, int, int)>(); - -// void destroy_swap_chain( -// ffi.Pointer viewer, -// ) { -// return _destroy_swap_chain( -// viewer, -// ); -// } - -// late final _destroy_swap_chainPtr = -// _lookup)>>( -// 'destroy_swap_chain'); -// late final _destroy_swap_chain = -// _destroy_swap_chainPtr.asFunction)>(); - -// void set_frame_interval( -// ffi.Pointer viewer, -// double interval, -// ) { -// return _set_frame_interval( -// viewer, -// interval, -// ); -// } - -// late final _set_frame_intervalPtr = _lookup< -// ffi -// .NativeFunction, ffi.Float)>>( -// 'set_frame_interval'); -// late final _set_frame_interval = _set_frame_intervalPtr -// .asFunction, double)>(); - -// void update_viewport_and_camera_projection( -// ffi.Pointer viewer, -// int width, -// int height, -// double scaleFactor, -// ) { -// return _update_viewport_and_camera_projection( -// viewer, -// width, -// height, -// scaleFactor, -// ); -// } - -// late final _update_viewport_and_camera_projectionPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Uint32, ffi.Uint32, -// ffi.Float)>>('update_viewport_and_camera_projection'); -// late final _update_viewport_and_camera_projection = -// _update_viewport_and_camera_projectionPtr -// .asFunction, int, int, double)>(); - -// void scroll_begin( -// ffi.Pointer viewer, -// ) { -// return _scroll_begin( -// viewer, -// ); -// } - -// late final _scroll_beginPtr = -// _lookup)>>( -// 'scroll_begin'); -// late final _scroll_begin = -// _scroll_beginPtr.asFunction)>(); - -// void scroll_update( -// ffi.Pointer viewer, -// double x, -// double y, -// double z, -// ) { -// return _scroll_update( -// viewer, -// x, -// y, -// z, -// ); -// } - -// late final _scroll_updatePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Float)>>('scroll_update'); -// late final _scroll_update = _scroll_updatePtr.asFunction< -// void Function(ffi.Pointer, double, double, double)>(); - -// void scroll_end( -// ffi.Pointer viewer, -// ) { -// return _scroll_end( -// viewer, -// ); -// } - -// late final _scroll_endPtr = -// _lookup)>>( -// 'scroll_end'); -// late final _scroll_end = -// _scroll_endPtr.asFunction)>(); - -// void grab_begin( -// ffi.Pointer viewer, -// double x, -// double y, -// int pan, -// ) { -// return _grab_begin( -// viewer, -// x, -// y, -// pan, -// ); -// } - -// late final _grab_beginPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Int)>>('grab_begin'); -// late final _grab_begin = _grab_beginPtr -// .asFunction, double, double, int)>(); - -// void grab_update( -// ffi.Pointer viewer, -// double x, -// double y, -// ) { -// return _grab_update( -// viewer, -// x, -// y, -// ); -// } - -// late final _grab_updatePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, ffi.Float, ffi.Float)>>('grab_update'); -// late final _grab_update = _grab_updatePtr -// .asFunction, double, double)>(); - -// void grab_end( -// ffi.Pointer viewer, -// ) { -// return _grab_end( -// viewer, -// ); -// } - -// late final _grab_endPtr = -// _lookup)>>( -// 'grab_end'); -// late final _grab_end = -// _grab_endPtr.asFunction)>(); - -// void apply_weights( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer entityName, -// ffi.Pointer weights, -// int count, -// ) { -// return _apply_weights( -// assetManager, -// asset, -// entityName, -// weights, -// count, -// ); -// } - -// late final _apply_weightsPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, -// EntityId, -// ffi.Pointer, -// ffi.Pointer, -// ffi.Int)>>('apply_weights'); -// late final _apply_weights = _apply_weightsPtr.asFunction< -// void Function(ffi.Pointer, int, ffi.Pointer, -// ffi.Pointer, int)>(); - -// void set_morph_target_weights( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer entityName, -// ffi.Pointer morphData, -// int numWeights, -// ) { -// return _set_morph_target_weights( -// assetManager, -// asset, -// entityName, -// morphData, -// numWeights, -// ); -// } - -// late final _set_morph_target_weightsPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, -// EntityId, -// ffi.Pointer, -// ffi.Pointer, -// ffi.Int)>>('set_morph_target_weights'); -// late final _set_morph_target_weights = -// _set_morph_target_weightsPtr.asFunction< -// void Function(ffi.Pointer, int, ffi.Pointer, -// ffi.Pointer, int)>(); - -// int set_morph_animation( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer entityName, -// ffi.Pointer morphData, -// ffi.Pointer morphIndices, -// int numMorphTargets, -// int numFrames, -// double frameLengthInMs, -// ) { -// return _set_morph_animation( -// assetManager, -// asset, -// entityName, -// morphData, -// morphIndices, -// numMorphTargets, -// numFrames, -// frameLengthInMs, -// ); -// } - -// late final _set_morph_animationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Int Function( -// ffi.Pointer, -// EntityId, -// ffi.Pointer, -// ffi.Pointer, -// ffi.Pointer, -// ffi.Int, -// ffi.Int, -// ffi.Float)>>('set_morph_animation'); -// late final _set_morph_animation = _set_morph_animationPtr.asFunction< -// int Function(ffi.Pointer, int, ffi.Pointer, -// ffi.Pointer, ffi.Pointer, int, int, double)>(); - -// void set_bone_animation( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer frameData, -// int numFrames, -// int numBones, -// ffi.Pointer> boneNames, -// ffi.Pointer> meshName, -// int numMeshTargets, -// double frameLengthInMs, -// ) { -// return _set_bone_animation( -// assetManager, -// asset, -// frameData, -// numFrames, -// numBones, -// boneNames, -// meshName, -// numMeshTargets, -// frameLengthInMs, -// ); -// } - -// late final _set_bone_animationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, -// EntityId, -// ffi.Pointer, -// ffi.Int, -// ffi.Int, -// ffi.Pointer>, -// ffi.Pointer>, -// ffi.Int, -// ffi.Float)>>('set_bone_animation'); -// late final _set_bone_animation = _set_bone_animationPtr.asFunction< -// void Function( -// ffi.Pointer, -// int, -// ffi.Pointer, -// int, -// int, -// ffi.Pointer>, -// ffi.Pointer>, -// int, -// double)>(); - -// void play_animation( -// ffi.Pointer assetManager, -// int asset, -// int index, -// int loop, -// int reverse, -// int replaceActive, -// double crossfade, -// ) { -// return _play_animation( -// assetManager, -// asset, -// index, -// loop, -// reverse, -// replaceActive, -// crossfade, -// ); -// } - -// late final _play_animationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, ffi.Int, -// ffi.Int, ffi.Int, ffi.Float)>>('play_animation'); -// late final _play_animation = _play_animationPtr.asFunction< -// void Function(ffi.Pointer, int, int, int, int, int, double)>(); - -// void set_animation_frame( -// ffi.Pointer assetManager, -// int asset, -// int animationIndex, -// int animationFrame, -// ) { -// return _set_animation_frame( -// assetManager, -// asset, -// animationIndex, -// animationFrame, -// ); -// } - -// late final _set_animation_framePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, EntityId, ffi.Int, -// ffi.Int)>>('set_animation_frame'); -// late final _set_animation_frame = _set_animation_framePtr -// .asFunction, int, int, int)>(); - -// void stop_animation( -// ffi.Pointer assetManager, -// int asset, -// int index, -// ) { -// return _stop_animation( -// assetManager, -// asset, -// index, -// ); -// } - -// late final _stop_animationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, EntityId, ffi.Int)>>('stop_animation'); -// late final _stop_animation = _stop_animationPtr -// .asFunction, int, int)>(); - -// int get_animation_count( -// ffi.Pointer assetManager, -// int asset, -// ) { -// return _get_animation_count( -// assetManager, -// asset, -// ); -// } - -// late final _get_animation_countPtr = _lookup< -// ffi -// .NativeFunction, EntityId)>>( -// 'get_animation_count'); -// late final _get_animation_count = _get_animation_countPtr -// .asFunction, int)>(); - -// void get_animation_name( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer outPtr, -// int index, -// ) { -// return _get_animation_name( -// assetManager, -// asset, -// outPtr, -// index, -// ); -// } - -// late final _get_animation_namePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, EntityId, -// ffi.Pointer, ffi.Int)>>('get_animation_name'); -// late final _get_animation_name = _get_animation_namePtr.asFunction< -// void Function(ffi.Pointer, int, ffi.Pointer, int)>(); - -// double get_animation_duration( -// ffi.Pointer assetManager, -// int asset, -// int index, -// ) { -// return _get_animation_duration( -// assetManager, -// asset, -// index, -// ); -// } - -// late final _get_animation_durationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Float Function(ffi.Pointer, EntityId, -// ffi.Int)>>('get_animation_duration'); -// late final _get_animation_duration = _get_animation_durationPtr -// .asFunction, int, int)>(); - -// void get_morph_target_name( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer meshName, -// ffi.Pointer outPtr, -// int index, -// ) { -// return _get_morph_target_name( -// assetManager, -// asset, -// meshName, -// outPtr, -// index, -// ); -// } - -// late final _get_morph_target_namePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, -// EntityId, -// ffi.Pointer, -// ffi.Pointer, -// ffi.Int)>>('get_morph_target_name'); -// late final _get_morph_target_name = _get_morph_target_namePtr.asFunction< -// void Function(ffi.Pointer, int, ffi.Pointer, -// ffi.Pointer, int)>(); - -// int get_morph_target_name_count( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer meshName, -// ) { -// return _get_morph_target_name_count( -// assetManager, -// asset, -// meshName, -// ); -// } - -// late final _get_morph_target_name_countPtr = _lookup< -// ffi.NativeFunction< -// ffi.Int Function(ffi.Pointer, EntityId, -// ffi.Pointer)>>('get_morph_target_name_count'); -// late final _get_morph_target_name_count = -// _get_morph_target_name_countPtr.asFunction< -// int Function(ffi.Pointer, int, ffi.Pointer)>(); - -// void remove_asset( -// ffi.Pointer viewer, -// int asset, -// ) { -// return _remove_asset( -// viewer, -// asset, -// ); -// } - -// late final _remove_assetPtr = _lookup< -// ffi -// .NativeFunction, EntityId)>>( -// 'remove_asset'); -// late final _remove_asset = -// _remove_assetPtr.asFunction, int)>(); - -// void clear_assets( -// ffi.Pointer viewer, -// ) { -// return _clear_assets( -// viewer, -// ); -// } - -// late final _clear_assetsPtr = -// _lookup)>>( -// 'clear_assets'); -// late final _clear_assets = -// _clear_assetsPtr.asFunction)>(); - -// void load_texture( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer assetPath, -// int renderableIndex, -// ) { -// return _load_texture( -// assetManager, -// asset, -// assetPath, -// renderableIndex, -// ); -// } - -// late final _load_texturePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, EntityId, -// ffi.Pointer, ffi.Int)>>('load_texture'); -// late final _load_texture = _load_texturePtr.asFunction< -// void Function(ffi.Pointer, int, ffi.Pointer, int)>(); - -// void set_texture( -// ffi.Pointer assetManager, -// int asset, -// ) { -// return _set_texture( -// assetManager, -// asset, -// ); -// } - -// late final _set_texturePtr = _lookup< -// ffi -// .NativeFunction, EntityId)>>( -// 'set_texture'); -// late final _set_texture = -// _set_texturePtr.asFunction, int)>(); - -// int set_material_color( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer meshName, -// int materialIndex, -// double r, -// double g, -// double b, -// double a, -// ) { -// return _set_material_color( -// assetManager, -// asset, -// meshName, -// materialIndex, -// r, -// g, -// b, -// a, -// ); -// } - -// late final _set_material_colorPtr = _lookup< -// ffi.NativeFunction< -// ffi.Int Function( -// ffi.Pointer, -// EntityId, -// ffi.Pointer, -// ffi.Int, -// ffi.Float, -// ffi.Float, -// ffi.Float, -// ffi.Float)>>('set_material_color'); -// late final _set_material_color = _set_material_colorPtr.asFunction< -// int Function(ffi.Pointer, int, ffi.Pointer, int, -// double, double, double, double)>(); - -// void transform_to_unit_cube( -// ffi.Pointer assetManager, -// int asset, -// ) { -// return _transform_to_unit_cube( -// assetManager, -// asset, -// ); -// } - -// late final _transform_to_unit_cubePtr = _lookup< -// ffi -// .NativeFunction, EntityId)>>( -// 'transform_to_unit_cube'); -// late final _transform_to_unit_cube = _transform_to_unit_cubePtr -// .asFunction, int)>(); - -// void set_position( -// ffi.Pointer assetManager, -// int asset, -// double x, -// double y, -// double z, -// ) { -// return _set_position( -// assetManager, -// asset, -// x, -// y, -// z, -// ); -// } - -// late final _set_positionPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, -// ffi.Float, ffi.Float)>>('set_position'); -// late final _set_position = _set_positionPtr.asFunction< -// void Function(ffi.Pointer, int, double, double, double)>(); - -// void set_rotation( -// ffi.Pointer assetManager, -// int asset, -// double rads, -// double x, -// double y, -// double z, -// ) { -// return _set_rotation( -// assetManager, -// asset, -// rads, -// x, -// y, -// z, -// ); -// } - -// late final _set_rotationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, EntityId, ffi.Float, -// ffi.Float, ffi.Float, ffi.Float)>>('set_rotation'); -// late final _set_rotation = _set_rotationPtr.asFunction< -// void Function( -// ffi.Pointer, int, double, double, double, double)>(); - -// void set_scale( -// ffi.Pointer assetManager, -// int asset, -// double scale, -// ) { -// return _set_scale( -// assetManager, -// asset, -// scale, -// ); -// } - -// late final _set_scalePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function( -// ffi.Pointer, EntityId, ffi.Float)>>('set_scale'); -// late final _set_scale = _set_scalePtr -// .asFunction, int, double)>(); - -// void set_camera_exposure( -// ffi.Pointer viewer, -// double aperture, -// double shutterSpeed, -// double sensitivity, -// ) { -// return _set_camera_exposure( -// viewer, -// aperture, -// shutterSpeed, -// sensitivity, -// ); -// } - -// late final _set_camera_exposurePtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Float)>>('set_camera_exposure'); -// late final _set_camera_exposure = _set_camera_exposurePtr.asFunction< -// void Function(ffi.Pointer, double, double, double)>(); - -// void set_camera_position( -// ffi.Pointer viewer, -// double x, -// double y, -// double z, -// ) { -// return _set_camera_position( -// viewer, -// x, -// y, -// z, -// ); -// } - -// late final _set_camera_positionPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Float)>>('set_camera_position'); -// late final _set_camera_position = _set_camera_positionPtr.asFunction< -// void Function(ffi.Pointer, double, double, double)>(); - -// void set_camera_rotation( -// ffi.Pointer viewer, -// double rads, -// double x, -// double y, -// double z, -// ) { -// return _set_camera_rotation( -// viewer, -// rads, -// x, -// y, -// z, -// ); -// } - -// late final _set_camera_rotationPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, ffi.Float, ffi.Float, -// ffi.Float, ffi.Float)>>('set_camera_rotation'); -// late final _set_camera_rotation = _set_camera_rotationPtr.asFunction< -// void Function(ffi.Pointer, double, double, double, double)>(); - -// void set_camera_model_matrix( -// ffi.Pointer viewer, -// ffi.Pointer matrix, -// ) { -// return _set_camera_model_matrix( -// viewer, -// matrix, -// ); -// } - -// late final _set_camera_model_matrixPtr = _lookup< -// ffi.NativeFunction< -// ffi.Void Function(ffi.Pointer, -// ffi.Pointer)>>('set_camera_model_matrix'); -// late final _set_camera_model_matrix = _set_camera_model_matrixPtr.asFunction< -// void Function(ffi.Pointer, ffi.Pointer)>(); - -// void set_camera_focal_length( -// ffi.Pointer viewer, -// double focalLength, -// ) { -// return _set_camera_focal_length( -// viewer, -// focalLength, -// ); -// } - -// late final _set_camera_focal_lengthPtr = _lookup< -// ffi -// .NativeFunction, ffi.Float)>>( -// 'set_camera_focal_length'); -// late final _set_camera_focal_length = _set_camera_focal_lengthPtr -// .asFunction, double)>(); - -// void set_camera_focus_distance( -// ffi.Pointer viewer, -// double focusDistance, -// ) { -// return _set_camera_focus_distance( -// viewer, -// focusDistance, -// ); -// } - -// late final _set_camera_focus_distancePtr = _lookup< -// ffi -// .NativeFunction, ffi.Float)>>( -// 'set_camera_focus_distance'); -// late final _set_camera_focus_distance = _set_camera_focus_distancePtr -// .asFunction, double)>(); - -// int hide_mesh( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer meshName, -// ) { -// return _hide_mesh( -// assetManager, -// asset, -// meshName, -// ); -// } - -// late final _hide_meshPtr = _lookup< -// ffi.NativeFunction< -// ffi.Int Function(ffi.Pointer, EntityId, -// ffi.Pointer)>>('hide_mesh'); -// late final _hide_mesh = _hide_meshPtr.asFunction< -// int Function(ffi.Pointer, int, ffi.Pointer)>(); - -// int reveal_mesh( -// ffi.Pointer assetManager, -// int asset, -// ffi.Pointer meshName, -// ) { -// return _reveal_mesh( -// assetManager, -// asset, -// meshName, -// ); -// } - -// late final _reveal_meshPtr = _lookup< -// ffi.NativeFunction< -// ffi.Int Function(ffi.Pointer, EntityId, -// ffi.Pointer)>>('reveal_mesh'); -// late final _reveal_mesh = _reveal_meshPtr.asFunction< -// int Function(ffi.Pointer, int, ffi.Pointer)>(); - -// void ios_dummy() { -// return _ios_dummy(); -// } - -// late final _ios_dummyPtr = -// _lookup>('ios_dummy'); -// late final _ios_dummy = _ios_dummyPtr.asFunction(); -// } - -// class __mbstate_t extends ffi.Union { -// @ffi.Array.multi([128]) -// external ffi.Array __mbstate8; - -// @ffi.LongLong() -// external int _mbstateL; -// } - -// class __darwin_pthread_handler_rec extends ffi.Struct { -// external ffi -// .Pointer)>> -// __routine; - -// external ffi.Pointer __arg; - -// external ffi.Pointer<__darwin_pthread_handler_rec> __next; -// } - -// class _opaque_pthread_attr_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([56]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_cond_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([40]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_condattr_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([8]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_mutex_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([56]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_mutexattr_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([8]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_once_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([8]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_rwlock_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([192]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_rwlockattr_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// @ffi.Array.multi([16]) -// external ffi.Array __opaque; -// } - -// class _opaque_pthread_t extends ffi.Struct { -// @ffi.Long() -// external int __sig; - -// external ffi.Pointer<__darwin_pthread_handler_rec> __cleanup_stack; - -// @ffi.Array.multi([8176]) -// external ffi.Array __opaque; -// } - -// class ResourceBuffer extends ffi.Struct { -// external ffi.Pointer data; - -// @ffi.Uint32() -// external int size; - -// @ffi.Uint32() -// external int id; -// } - -// class ResourceLoaderWrapper extends ffi.Struct { -// external LoadResource mLoadResource; - -// external FreeResource mFreeResource; - -// external LoadFilamentResourceFromOwner mLoadFilamentResourceFromOwner; - -// external FreeFilamentResourceFromOwner mFreeFilamentResourceFromOwner; - -// external ffi.Pointer mOwner; -// } - -// typedef LoadResource = ffi.Pointer< -// ffi.NativeFunction uri)>>; -// typedef FreeResource -// = ffi.Pointer>; -// typedef LoadFilamentResourceFromOwner = ffi.Pointer< -// ffi.NativeFunction< -// ResourceBuffer Function(ffi.Pointer, ffi.Pointer)>>; -// typedef FreeFilamentResourceFromOwner = ffi.Pointer< -// ffi -// .NativeFunction)>>; -// typedef EntityId = ffi.Int32; - -// const int __WORDSIZE = 64; - -// const int __DARWIN_ONLY_64_BIT_INO_T = 1; - -// const int __DARWIN_ONLY_UNIX_CONFORMANCE = 1; - -// const int __DARWIN_ONLY_VERS_1050 = 1; - -// const int __DARWIN_UNIX03 = 1; - -// const int __DARWIN_64_BIT_INO_T = 1; - -// const int __DARWIN_VERS_1050 = 1; - -// const int __DARWIN_NON_CANCELABLE = 0; - -// const String __DARWIN_SUF_EXTSN = '\$DARWIN_EXTSN'; - -// const int __DARWIN_C_ANSI = 4096; - -// const int __DARWIN_C_FULL = 900000; - -// const int __DARWIN_C_LEVEL = 900000; - -// const int __STDC_WANT_LIB_EXT1__ = 1; - -// const int __DARWIN_NO_LONG_LONG = 0; - -// const int _DARWIN_FEATURE_64_BIT_INODE = 1; - -// const int _DARWIN_FEATURE_ONLY_64_BIT_INODE = 1; - -// const int _DARWIN_FEATURE_ONLY_VERS_1050 = 1; - -// const int _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE = 1; - -// const int _DARWIN_FEATURE_UNIX_CONFORMANCE = 3; - -// const int __has_ptrcheck = 0; - -// const int __DARWIN_NULL = 0; - -// const int __PTHREAD_SIZE__ = 8176; - -// const int __PTHREAD_ATTR_SIZE__ = 56; - -// const int __PTHREAD_MUTEXATTR_SIZE__ = 8; - -// const int __PTHREAD_MUTEX_SIZE__ = 56; - -// const int __PTHREAD_CONDATTR_SIZE__ = 8; - -// const int __PTHREAD_COND_SIZE__ = 40; - -// const int __PTHREAD_ONCE_SIZE__ = 8; - -// const int __PTHREAD_RWLOCK_SIZE__ = 192; - -// const int __PTHREAD_RWLOCKATTR_SIZE__ = 16; - -// const int USER_ADDR_NULL = 0; - -// const int INT8_MAX = 127; - -// const int INT16_MAX = 32767; - -// const int INT32_MAX = 2147483647; - -// const int INT64_MAX = 9223372036854775807; - -// const int INT8_MIN = -128; - -// const int INT16_MIN = -32768; - -// const int INT32_MIN = -2147483648; - -// const int INT64_MIN = -9223372036854775808; - -// const int UINT8_MAX = 255; - -// const int UINT16_MAX = 65535; - -// const int UINT32_MAX = 4294967295; - -// const int UINT64_MAX = -1; - -// const int INT_LEAST8_MIN = -128; - -// const int INT_LEAST16_MIN = -32768; - -// const int INT_LEAST32_MIN = -2147483648; - -// const int INT_LEAST64_MIN = -9223372036854775808; - -// const int INT_LEAST8_MAX = 127; - -// const int INT_LEAST16_MAX = 32767; - -// const int INT_LEAST32_MAX = 2147483647; - -// const int INT_LEAST64_MAX = 9223372036854775807; - -// const int UINT_LEAST8_MAX = 255; - -// const int UINT_LEAST16_MAX = 65535; - -// const int UINT_LEAST32_MAX = 4294967295; - -// const int UINT_LEAST64_MAX = -1; - -// const int INT_FAST8_MIN = -128; - -// const int INT_FAST16_MIN = -32768; - -// const int INT_FAST32_MIN = -2147483648; - -// const int INT_FAST64_MIN = -9223372036854775808; - -// const int INT_FAST8_MAX = 127; - -// const int INT_FAST16_MAX = 32767; - -// const int INT_FAST32_MAX = 2147483647; - -// const int INT_FAST64_MAX = 9223372036854775807; - -// const int UINT_FAST8_MAX = 255; - -// const int UINT_FAST16_MAX = 65535; - -// const int UINT_FAST32_MAX = 4294967295; - -// const int UINT_FAST64_MAX = -1; - -// const int INTPTR_MAX = 9223372036854775807; - -// const int INTPTR_MIN = -9223372036854775808; - -// const int UINTPTR_MAX = -1; - -// const int INTMAX_MAX = 9223372036854775807; - -// const int UINTMAX_MAX = -1; - -// const int INTMAX_MIN = -9223372036854775808; - -// const int PTRDIFF_MIN = -9223372036854775808; - -// const int PTRDIFF_MAX = 9223372036854775807; - -// const int SIZE_MAX = -1; - -// const int RSIZE_MAX = 9223372036854775807; - -// const int WCHAR_MAX = 2147483647; - -// const int WCHAR_MIN = -2147483648; - -// const int WINT_MIN = -2147483648; - -// const int WINT_MAX = 2147483647; - -// const int SIG_ATOMIC_MIN = -2147483648; - -// const int SIG_ATOMIC_MAX = 2147483647; diff --git a/flutter_filament/macos/Classes/DartFilamentTexture.swift b/flutter_filament/macos/Classes/DartFilamentTexture.swift index 324780ca..d101e258 100644 --- a/flutter_filament/macos/Classes/DartFilamentTexture.swift +++ b/flutter_filament/macos/Classes/DartFilamentTexture.swift @@ -1,16 +1,15 @@ import Foundation -import Foundation import GLKit @objc public class DartFilamentTexture : NSObject { - var pixelBuffer: CVPixelBuffer? + public var pixelBuffer: CVPixelBuffer? var pixelBufferAttrs = [ kCVPixelBufferPixelFormatTypeKey: NSNumber(value: kCVPixelFormatType_32ABGR ), - // kCVPixelBufferOpenGLCompatibilityKey: kCFBooleanTrue!, - kCVPixelBufferIOSurfacePropertiesKey: [:] as CFDictionary - ] as CFDictionary + kCVPixelBufferOpenGLCompatibilityKey: kCFBooleanFalse!, +// kCVPixelBufferIOSurfacePropertiesKey: [Any:Any] as CFDictionary + ] as [CFString : Any] as CFDictionary @objc public var cvMetalTextureCache:CVMetalTextureCache? @objc public var cvMetalTexture:CVMetalTexture? @@ -19,7 +18,7 @@ import GLKit @objc public var metalTextureAddress:Int = -1 @objc override public init() { - print("VAnilla init") + } @objc public init(width:Int64, height:Int64) { diff --git a/flutter_filament/macos/Classes/FlutterFilamentTexture.swift b/flutter_filament/macos/Classes/FlutterFilamentTexture.swift new file mode 100644 index 00000000..2b38d7bf --- /dev/null +++ b/flutter_filament/macos/Classes/FlutterFilamentTexture.swift @@ -0,0 +1,33 @@ +import Foundation +import GLKit +import FlutterMacOS + +public class FlutterFilamentTexture : NSObject, FlutterTexture { + + var texture:DartFilamentTexture + var flutterTextureId: Int64 = -1 + var registry: FlutterTextureRegistry + + init(registry:FlutterTextureRegistry, texture:DartFilamentTexture) { + self.texture = texture + self.registry = registry + super.init() + + self.flutterTextureId = registry.register(self) + + } + + public func copyPixelBuffer() -> Unmanaged? { + return Unmanaged.passRetained(texture.pixelBuffer!); + } + + public func onTextureUnregistered(_ texture:FlutterTexture) { + print("Texture unregistered") + } + + public func destroy() { + self.registry.unregisterTexture(self.flutterTextureId) + self.texture.destroyTexture() + } + +} \ No newline at end of file diff --git a/flutter_filament/macos/Classes/SwiftFlutterFilamentPlugin.swift b/flutter_filament/macos/Classes/SwiftFlutterFilamentPlugin.swift index 058132bb..fa05ffef 100644 --- a/flutter_filament/macos/Classes/SwiftFlutterFilamentPlugin.swift +++ b/flutter_filament/macos/Classes/SwiftFlutterFilamentPlugin.swift @@ -1,36 +1,6 @@ import FlutterMacOS import GLKit -public class FlutterFilamentTexture : NSObject, FlutterTexture { - - var texture:DartFilamentTexture - var flutterTextureId: Int64 = -1 - var registry: FlutterTextureRegistry - - init(registry:FlutterTextureRegistry, texture:DartFilamentTexture) { - self.texture = texture - self.registry = registry - super.init() - - self.flutterTextureId = registry.register(self) - - } - - public func copyPixelBuffer() -> Unmanaged? { - return Unmanaged.passRetained(texture.pixelBuffer!); - } - - public func onTextureUnregistered(_ texture:FlutterTexture) { - print("Texture unregistered") - } - - public func destroy() { - self.registry.unregisterTexture(self.flutterTextureId) - self.texture.destroyTexture() - } - -} - public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin { var registrar : FlutterPluginRegistrar @@ -121,8 +91,6 @@ public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin { result(nil) case "getSharedContext": result(nil) - case "getWindow": - result(nil) case "createTexture": let args = call.arguments as! [Any] let width = args[0] as! Int64 @@ -131,7 +99,7 @@ public class SwiftFlutterFilamentPlugin: NSObject, FlutterPlugin { let texture = DartFilamentTexture(width: width, height: height) self.texture = FlutterFilamentTexture(registry: registry, texture: texture) - result([self.texture!.flutterTextureId as Any, texture.metalTextureAddress]) + result([self.texture!.flutterTextureId as Any, texture.metalTextureAddress, nil]) case "destroyTexture": self.texture?.destroy() self.texture = nil diff --git a/flutter_filament/macos/include/ResourceBuffer.hpp b/flutter_filament/macos/include/ResourceBuffer.hpp new file mode 100644 index 00000000..8ae27f18 --- /dev/null +++ b/flutter_filament/macos/include/ResourceBuffer.hpp @@ -0,0 +1,117 @@ +#ifndef RESOURCE_BUFFER_H +#define RESOURCE_BUFFER_H + +#include +#include + +// +// A ResourceBuffer is a unified interface for working with +// binary assets across various platforms. +// This is simply: +// 1) a pointer to some data +// 2) the length of the data +// 3) an ID that can be passed back to the native platform to release the underlying asset when needed. +// +struct ResourceBuffer +{ + const void *const data; + const int32_t size; + const int32_t id; +}; + +typedef struct ResourceBuffer ResourceBuffer; +typedef ResourceBuffer (*LoadFilamentResource)(const char *uri); +typedef ResourceBuffer (*LoadFilamentResourceFromOwner)(const char *const, void *const owner); +typedef void (*FreeFilamentResource)(ResourceBuffer); +typedef void (*FreeFilamentResourceFromOwner)(ResourceBuffer, void *const owner); + +struct ResourceLoaderWrapper +{ + LoadFilamentResource loadResource; + FreeFilamentResource freeResource; + LoadFilamentResourceFromOwner loadFromOwner; + FreeFilamentResourceFromOwner freeFromOwner; + void *owner; +}; +typedef struct ResourceLoaderWrapper ResourceLoaderWrapper; + + +#if defined(__cplusplus) + +namespace flutter_filament { + +// struct ResourceBufferImpl : public ResourceBuffer +// { + +// ResourceBufferImpl(const void *const mData, const int32_t mSize, const int32_t mId) +// { +// data = mData; +// size = mSize; +// id = mId; +// }; + +// ResourceBufferImpl(const ResourceBufferImpl &rb) +// { +// (void *)data = rb.data; +// size = rb.size; +// id = rb.id; +// }; + +// ResourceBufferImpl(const ResourceBufferImpl &&rb) noexcept +// { +// data = rb.data; +// size = rb.size; +// id = rb.id; +// }; +// ResourceBufferImpl &operator=(const ResourceBufferImpl &other) = delete; +// }; + +struct ResourceLoaderWrapperImpl : public ResourceLoaderWrapper +{ + + ResourceLoaderWrapperImpl(LoadFilamentResource loader, FreeFilamentResource freeResource) + { + loadFromOwner = nullptr; + freeFromOwner = nullptr; + loadResource = loader; + freeResource = freeResource; + owner = nullptr; + } + + ResourceLoaderWrapperImpl(LoadFilamentResourceFromOwner loader, FreeFilamentResourceFromOwner freeResource, void * owner) + { + loadResource = nullptr; + freeResource = nullptr; + loadFromOwner = loader; + freeFromOwner = freeResource; + owner = owner; + } + + ResourceBuffer load(const char *uri) const + { + if (loadFromOwner) + { + auto rb = loadFromOwner(uri, owner); + return rb; + } + auto rb = loadResource(uri); + return rb; + } + + void free(ResourceBuffer rb) const + { + if (freeFromOwner) + { + freeFromOwner(rb, owner); + } + else + { + freeResource(rb); + } + } +}; + +} +#endif + +#endif diff --git a/flutter_filament/macos/include/SwiftFlutterFilamentPlugin-Bridging-Header.h b/flutter_filament/macos/include/SwiftFlutterFilamentPlugin-Bridging-Header.h new file mode 100644 index 00000000..e1af2872 --- /dev/null +++ b/flutter_filament/macos/include/SwiftFlutterFilamentPlugin-Bridging-Header.h @@ -0,0 +1,17 @@ +#ifndef SwiftFlutterFilamentPlugin_Bridging_Header_h +#define SwiftFlutterFilamentPlugin_Bridging_Header_h + +#include + +#include "ResourceBuffer.hpp" + +ResourceLoaderWrapper *make_resource_loader(LoadFilamentResourceFromOwner loadFn, FreeFilamentResourceFromOwner freeFn, void *const owner) +{ + ResourceLoaderWrapper *rlw = (ResourceLoaderWrapper *)malloc(sizeof(ResourceLoaderWrapper)); + rlw->loadFromOwner = loadFn; + rlw->freeFromOwner = freeFn; + rlw->owner = owner; + return rlw; +} + +#endif