From 6ec9fc298817a57bce99b3f9ab16a35836a3e8bd Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 23 Apr 2023 11:33:23 +0800 Subject: [PATCH] iOS fixes --- ios/Classes/SwiftPolyvoxFilamentPlugin.swift | 15 ++++----------- ios/include/ResourceBuffer.hpp | 20 +++++++++++++------- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift index 223ed89b..23a2e6cc 100644 --- a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -25,10 +25,6 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture static var messenger : FlutterBinaryMessenger? = nil; - var loadResourcePtr: UnsafeMutableRawPointer? = nil - var freeResourcePtr: UnsafeMutableRawPointer? = nil - - var loadResource : @convention(c) (UnsafePointer?, UnsafeMutableRawPointer?) -> ResourceBuffer = { uri, resourcesPtr in let instance:SwiftPolyvoxFilamentPlugin = Unmanaged.fromOpaque(resourcesPtr!).takeUnretainedValue() @@ -130,9 +126,9 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture } @objc func doRender() { - + } - + func createDisplayLink() { displayLink = CADisplayLink(target: self, selector: #selector(doRender)) @@ -141,9 +137,8 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture public func copyPixelBuffer() -> Unmanaged? { if(pixelBuffer == nil) { - print("empty") return nil; - } + } return Unmanaged.passRetained(pixelBuffer!); } @@ -186,9 +181,8 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "createTexture": let args = call.arguments as! Array createPixelBuffer(width:Int(args[0]), height:Int(args[1])) - createDisplayLink() +// we no longer need to call createDisplayLink() because we drive our render ticker from the Dart side, not the platform side result(self.flutterTextureId) - // print("texture id \(pixelBufferflutterTextureId)") case "getResourceLoader": let callback = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque()) result(unsafeBitCast(callback, to:Int64.self)) @@ -197,7 +191,6 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "getSurface": var pixelBufferTextureId = Int64(Int(bitPattern:unsafeBitCast(pixelBuffer!, to: UnsafeMutableRawPointer.self))) result(pixelBufferTextureId) - case "getContext": result(0) //nullptr case "resize": diff --git a/ios/include/ResourceBuffer.hpp b/ios/include/ResourceBuffer.hpp index 12d59412..b904acce 100644 --- a/ios/include/ResourceBuffer.hpp +++ b/ios/include/ResourceBuffer.hpp @@ -46,10 +46,16 @@ extern "C" { typedef void (*FreeResource)(ResourceBuffer); typedef void (*FreeResourceFromOwner)(ResourceBuffer, void* const owner); + // this may be compiled as either C or C++, depending on which compiler is being invoked (e.g. binding to Swift will compile as C). + // the former does not allow default initialization to be specified inline), so we need to explicitly set the unused members to nullptr struct ResourceLoaderWrapper { #if defined(__cplusplus) - ResourceLoaderWrapper(LoadResource loader, FreeResource freeResource) : mLoadResource(loader), mFreeResource(freeResource) {}; - ResourceLoaderWrapper(LoadResourceFromOwner loader, FreeResourceFromOwner freeResource, void* const owner) : mOwner(owner), mLoadResourceFromOwner(loader), mFreeResourceFromOwner(freeResource) {}; + ResourceLoaderWrapper(LoadResource loader, FreeResource freeResource) : mLoadResource(loader), mFreeResource(freeResource), mLoadResourceFromOwner(nullptr), mFreeResourceFromOwner(nullptr), + mOwner(nullptr) {} + + ResourceLoaderWrapper(LoadResourceFromOwner loader, FreeResourceFromOwner freeResource, void* const owner) : mLoadResource(nullptr), mFreeResource(nullptr), mLoadResourceFromOwner(loader), mFreeResourceFromOwner(freeResource), mOwner(owner) { + + }; ResourceBuffer load(const char* uri) { if(mLoadResourceFromOwner) { @@ -66,11 +72,11 @@ extern "C" { } } #endif - void* mOwner = nullptr; - LoadResource mLoadResource = nullptr; - FreeResource mFreeResource = nullptr; - LoadResourceFromOwner mLoadResourceFromOwner = nullptr; - FreeResourceFromOwner mFreeResourceFromOwner = nullptr; + LoadResource mLoadResource; + FreeResource mFreeResource; + LoadResourceFromOwner mLoadResourceFromOwner; + FreeResourceFromOwner mFreeResourceFromOwner; + void* mOwner; }; typedef struct ResourceLoaderWrapper ResourceLoaderWrapper;