iOS fixes for direct FFI
This commit is contained in:
@@ -21,12 +21,6 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
|
|
||||||
var resources:NSMutableDictionary = [:]
|
var resources:NSMutableDictionary = [:]
|
||||||
|
|
||||||
var viewer:UnsafeRawPointer? = nil
|
|
||||||
var displayLink:CADisplayLink? = nil
|
|
||||||
var rendering:Bool = false
|
|
||||||
|
|
||||||
var frameInterval:Double = 1 / 60.0
|
|
||||||
|
|
||||||
static var messenger : FlutterBinaryMessenger? = nil;
|
static var messenger : FlutterBinaryMessenger? = nil;
|
||||||
|
|
||||||
var loadResource : @convention(c) (UnsafePointer<Int8>?, UnsafeMutableRawPointer?) -> ResourceBuffer = { uri, resourcesPtr in
|
var loadResource : @convention(c) (UnsafePointer<Int8>?, UnsafeMutableRawPointer?) -> ResourceBuffer = { uri, resourcesPtr in
|
||||||
@@ -117,7 +111,7 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
let nsData = data as NSData
|
let nsData = data as NSData
|
||||||
instance.resources[resId] = nsData
|
instance.resources[resId] = nsData
|
||||||
let rawPtr = nsData.bytes
|
let rawPtr = nsData.bytes
|
||||||
return ResourceBuffer(data:rawPtr, size:UInt32(nsData.count), id:UInt32(resId))
|
return ResourceBuffer(data:rawPtr, size:Int64(nsData.count), id:UInt32(resId))
|
||||||
} catch {
|
} catch {
|
||||||
print("Error opening file: \(error)")
|
print("Error opening file: \(error)")
|
||||||
}
|
}
|
||||||
@@ -129,23 +123,9 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
instance.resources.removeObject(forKey:rbuf.id)
|
instance.resources.removeObject(forKey:rbuf.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
var markTextureFrameAvailable : @convention(c) (UnsafeMutableRawPointer?) -> () = { rbuf, resourcesPtr in
|
var markTextureFrameAvailable : @convention(c) (UnsafeMutableRawPointer?) -> () = { instancePtr in
|
||||||
let instance:SwiftPolyvoxFilamentPlugin = Unmanaged<SwiftPolyvoxFilamentPlugin>.fromOpaque(resourcesPtr!).takeUnretainedValue()
|
let instance:SwiftPolyvoxFilamentPlugin = Unmanaged<SwiftPolyvoxFilamentPlugin>.fromOpaque(instancePtr!).takeUnretainedValue()
|
||||||
instance.registry.textureFrameAvailable(instance.flutterTextureId)
|
instance.registry.textureFrameAvailable(instance.flutterTextureId!)
|
||||||
}
|
|
||||||
|
|
||||||
@objc func doRender() {
|
|
||||||
if(viewer != nil && rendering) {
|
|
||||||
render(viewer, 0)
|
|
||||||
self.registry.textureFrameAvailable(flutterTextureId!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func createDisplayLink() {
|
|
||||||
displayLink = CADisplayLink(target: self,
|
|
||||||
selector: #selector(doRender))
|
|
||||||
displayLink!.add(to: .current, forMode: RunLoop.Mode.default)
|
|
||||||
displayLink!.preferredFramesPerSecond = Int(1 / frameInterval)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func copyPixelBuffer() -> Unmanaged<CVPixelBuffer>? {
|
public func copyPixelBuffer() -> Unmanaged<CVPixelBuffer>? {
|
||||||
@@ -180,526 +160,47 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
|
|||||||
self.flutterTextureId = self.registry.register(self)
|
self.flutterTextureId = self.registry.register(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func resize(width:Int32, height:Int32) {
|
|
||||||
if(self.flutterTextureId != nil) {
|
|
||||||
self.registry.unregisterTexture(self.flutterTextureId!)
|
|
||||||
}
|
|
||||||
createPixelBuffer(width: Int(width), height:Int(height))
|
|
||||||
}
|
|
||||||
|
|
||||||
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
||||||
let methodName = call.method;
|
let methodName = call.method;
|
||||||
switch methodName {
|
switch methodName {
|
||||||
case "createTexture":
|
case "getSharedContext":
|
||||||
let args = call.arguments as! Array<Int32>
|
result(nil)
|
||||||
createPixelBuffer(width:Int(args[0]), height:Int(args[1]))
|
case "getResourceLoaderWrapper":
|
||||||
createDisplayLink()
|
let resourceLoaderWrapper = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque())
|
||||||
result(self.flutterTextureId)
|
result(unsafeBitCast(resourceLoaderWrapper, to:Int64.self))
|
||||||
case "destroyTexture":
|
case "getRenderCallback":
|
||||||
if(viewer != nil) {
|
let renderCallback = markTextureFrameAvailable
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Destroy the viewer before destroying the texture", details: nil))
|
result([
|
||||||
} else {
|
unsafeBitCast(renderCallback, to:Int64.self), unsafeBitCast(Unmanaged.passUnretained(self), to:UInt64.self)])
|
||||||
|
case "createTexture":
|
||||||
|
let args = call.arguments as! Array<Int32>
|
||||||
|
createPixelBuffer(width:Int(args[0]), height:Int(args[1]))
|
||||||
|
let pixelBufferPtr = unsafeBitCast(pixelBuffer!, to:UnsafeRawPointer.self)
|
||||||
|
let pixelBufferAddress = Int(bitPattern:pixelBufferPtr);
|
||||||
|
result([self.flutterTextureId, pixelBufferAddress, nil])
|
||||||
|
case "destroyTexture":
|
||||||
if(self.flutterTextureId != nil) {
|
if(self.flutterTextureId != nil) {
|
||||||
self.registry.unregisterTexture(self.flutterTextureId!)
|
self.registry.unregisterTexture(self.flutterTextureId!)
|
||||||
}
|
}
|
||||||
self.flutterTextureId = nil
|
self.flutterTextureId = nil
|
||||||
self.pixelBuffer = nil
|
self.pixelBuffer = nil
|
||||||
}
|
case "resize":
|
||||||
case "destroyViewer":
|
let args = call.arguments as! [Any]
|
||||||
if(viewer != nil) {
|
let width = UInt32(args[0] as! Int64)
|
||||||
destroy_swap_chain(viewer)
|
let height = UInt32(args[1] as! Int64)
|
||||||
destroy_filament_viewer(viewer)
|
if(self.flutterTextureId != nil) {
|
||||||
viewer = nil
|
self.registry.unregisterTexture(self.flutterTextureId!)
|
||||||
}
|
|
||||||
result(true)
|
|
||||||
case "resize":
|
|
||||||
if(viewer == nil) {
|
|
||||||
print("Error: cannot resize before a viewer has been created")
|
|
||||||
result(nil);
|
|
||||||
}
|
|
||||||
rendering = false
|
|
||||||
destroy_swap_chain(viewer)
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
resize(width:args[0] as! Int32, height:args[1] as! Int32)
|
|
||||||
var pixelBufferTextureId = unsafeBitCast(pixelBuffer!, to: UnsafeRawPointer.self)
|
|
||||||
create_swap_chain(viewer, pixelBufferTextureId, UInt32(args[0] as! Int64), UInt32(args[1] as! Int64))
|
|
||||||
update_viewport_and_camera_projection(viewer, UInt32(args[0] as! Int64), UInt32(args[1] as! Int64), Float(args[2] as! Double))
|
|
||||||
rendering = true
|
|
||||||
print("Resized to \(args[0])x\(args[1])")
|
|
||||||
result(self.flutterTextureId);
|
|
||||||
case "createFilamentViewer":
|
|
||||||
print("createFilamentViewer")
|
|
||||||
if(viewer != nil) {
|
|
||||||
destroy_swap_chain(viewer)
|
|
||||||
destroy_filament_viewer(viewer)
|
|
||||||
viewer = nil
|
|
||||||
}
|
|
||||||
let callback = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque())
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
let width = args[0] as! Int64
|
|
||||||
let height = args[1] as! Int64
|
|
||||||
|
|
||||||
viewer = create_filament_viewer(nil, callback)
|
|
||||||
var pixelBufferTextureId = unsafeBitCast(pixelBuffer!, to: UnsafeRawPointer.self)
|
|
||||||
create_swap_chain(viewer, pixelBufferTextureId, UInt32(width), UInt32(height))
|
|
||||||
update_viewport_and_camera_projection(viewer, UInt32(args[0] as! Int64), UInt32(args[1] as! Int64), 1.0)
|
|
||||||
set_frame_interval(viewer, Float(frameInterval))
|
|
||||||
result(unsafeBitCast(viewer, to:Int64.self))
|
|
||||||
case "textureFrameAvailable":
|
|
||||||
self.registry.textureFrameAvailable(flutterTextureId)
|
|
||||||
result(nil)
|
|
||||||
case "getAssetManager":
|
|
||||||
let assetManager = get_asset_manager(viewer)
|
|
||||||
result(unsafeBitCast(assetManager, to:Int64.self))
|
|
||||||
case "clearBackgroundImage":
|
|
||||||
clear_background_image(viewer)
|
|
||||||
result(true)
|
|
||||||
case "setBackgroundImage":
|
|
||||||
let args = call.arguments as! [Any];
|
|
||||||
|
|
||||||
let path = args[0] as! String
|
|
||||||
let fillHeight = args[1] as! Bool
|
|
||||||
set_background_image(viewer, path, fillHeight)
|
|
||||||
result(true)
|
|
||||||
case "setBackgroundImagePosition":
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
set_background_image_position(viewer, Float(args[0] as! Double), Float(args[1] as! Double), args[2] as! Bool)
|
|
||||||
result(true)
|
|
||||||
case "setBackgroundColor":
|
|
||||||
guard let args = call.arguments as? [Double], args.count == 4 else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected RGBA values for setBackgroundColor", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set_background_color(viewer, Float(args[0]), Float(args[1]), Float(args[2]), Float(args[3]))
|
|
||||||
result(true)
|
|
||||||
case "setToneMapping":
|
|
||||||
guard let args = call.arguments as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected ToneMapping argument for setToneMapping", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set_tone_mapping(viewer, Int32(args));
|
|
||||||
result(true)
|
|
||||||
case "setBloom":
|
|
||||||
guard let args = call.arguments as? Double else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected double argument for setBloom", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set_bloom(viewer, Float(args));
|
|
||||||
result(true)
|
|
||||||
case "loadSkybox":
|
|
||||||
load_skybox(viewer, call.arguments as! String)
|
|
||||||
result(true)
|
|
||||||
case "loadIbl":
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
load_ibl(viewer, args[0] as! String, args[1] as! Float)
|
|
||||||
result(true)
|
|
||||||
case "removeSkybox":
|
|
||||||
remove_skybox(viewer)
|
|
||||||
result(true)
|
|
||||||
case "removeIbl":
|
|
||||||
remove_ibl(viewer)
|
|
||||||
result(true)
|
|
||||||
case "addLight":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 10,
|
|
||||||
let type = args[0] as? Int32,
|
|
||||||
let colour = args[1] as? Double,
|
|
||||||
let intensity = args[2] as? Double,
|
|
||||||
let posX = args[3] as? Double,
|
|
||||||
let posY = args[4] as? Double,
|
|
||||||
let posZ = args[5] as? Double,
|
|
||||||
let dirX = args[6] as? Double,
|
|
||||||
let dirY = args[7] as? Double,
|
|
||||||
let dirZ = args[8] as? Double,
|
|
||||||
let shadows = args[9] as? Bool else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected viewer and light parameters for addLight", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let entityId = add_light(viewer, UInt8(type), Float(colour), Float(intensity),Float(posX), Float(posY), Float(posZ), Float(dirX), Float(dirY), Float(dirZ), shadows)
|
|
||||||
result(entityId)
|
|
||||||
case "removeLight":
|
|
||||||
remove_light(viewer, Int32(call.arguments as! Int64))
|
|
||||||
result(true)
|
|
||||||
case "clearLights":
|
|
||||||
clear_lights(viewer)
|
|
||||||
result(true)
|
|
||||||
case "loadGlb":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let assetPath = args[1] as? String,
|
|
||||||
let unlit = args[2] as? Bool else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected assetManager, assetPath, and unlit for load_glb", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let entityId = load_glb(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), assetPath, unlit)
|
|
||||||
result(entityId)
|
|
||||||
case "loadGltf":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let assetPath = args[1] as? String,
|
|
||||||
let relativePath = args[2] as? String else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected assetManager, assetPath, and relativePath for load_gltf", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let entityId = load_gltf(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), assetPath, relativePath)
|
|
||||||
result(entityId)
|
|
||||||
case "transformToUnitCube":
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
transform_to_unit_cube(unsafeBitCast(args[0] as! Int64, to:UnsafeMutableRawPointer.self), args[1] as! EntityId)
|
|
||||||
result(true)
|
|
||||||
case "render":
|
|
||||||
render(viewer, 0)
|
|
||||||
result(true)
|
|
||||||
case "setRendering":
|
|
||||||
rendering = call.arguments as! Bool
|
|
||||||
result(true)
|
|
||||||
case "setFrameInterval":
|
|
||||||
frameInterval = call.arguments as! Double
|
|
||||||
if(displayLink != nil) {
|
|
||||||
displayLink!.preferredFramesPerSecond = Int(1 / frameInterval)
|
|
||||||
}
|
|
||||||
if(viewer != nil) {
|
|
||||||
set_frame_interval(viewer, Float(frameInterval))
|
|
||||||
}
|
|
||||||
print("Set preferred frame interval to \(frameInterval)")
|
|
||||||
result(true)
|
|
||||||
case "updateViewportAndCameraProjection":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let width = args[0] as? Int,
|
|
||||||
let height = args[1] as? Int,
|
|
||||||
let scaleFactor = args[2] as? Float else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected viewer, width, height, and scaleFactor for update_viewport_and_camera_projection", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
update_viewport_and_camera_projection(viewer, UInt32(width), UInt32(height), scaleFactor)
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "scrollBegin":
|
|
||||||
scroll_begin(viewer)
|
|
||||||
result(true)
|
|
||||||
case "scrollUpdate":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let x = args[0] as? Double,
|
|
||||||
let y = args[1] as? Double,
|
|
||||||
let z = args[2] as? Double else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected viewer, x, y, and z for scroll_update", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
scroll_update(viewer, Float(x), Float(y), Float(z))
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "scrollEnd":
|
|
||||||
scroll_end(viewer)
|
|
||||||
result(true)
|
|
||||||
case "grabBegin":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let x = args[0] as? Double,
|
|
||||||
let y = args[1] as? Double,
|
|
||||||
let pan = args[2] as? Bool else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected viewer, x, y, and pan for grab_begin", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
grab_begin(viewer, Float(x), Float(y), pan)
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "grabUpdate":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 2,
|
|
||||||
let x = args[0] as? Float,
|
|
||||||
let y = args[1] as? Float else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected viewer, x, and y for grab_update", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
grab_update(viewer, x, y)
|
|
||||||
result(true)
|
|
||||||
case "grabEnd":
|
|
||||||
grab_end(viewer)
|
|
||||||
result(true)
|
|
||||||
case "applyWeights":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 5,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let entityName = args[2] as? String,
|
|
||||||
let weights = args[3] as? [Float],
|
|
||||||
let count = args[4] as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for apply_weights", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// apply_weights(assetManager, asset, entityName, UnsafeMutablePointer(&weights), Int32(count))
|
|
||||||
result(true)
|
|
||||||
case "setMorphTargetWeights":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 5,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let entityName = args[2] as? String,
|
|
||||||
let morphData = args[3] as? [Double],
|
|
||||||
let numMorphWeights = args[4] as? Int32 else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for setMorphTargetWeights", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
set_morph_target_weights(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, entityName, morphData.map { Float($0) }, Int32(numMorphWeights))
|
|
||||||
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "setMorphAnimation":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 8,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let entityName = args[2] as? String,
|
|
||||||
let morphData = args[3] as? [Double],
|
|
||||||
let morphIndices = args[4] as? [Int32],
|
|
||||||
let numMorphTargets = args[5] as? Int32,
|
|
||||||
let numFrames = args[6] as? Int32,
|
|
||||||
let frameLengthInMs = args[7] as? Double else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Incorrect arguments provided for setMorphAnimation", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let frameData = morphData.map { Float($0) }
|
|
||||||
let am = unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self)
|
|
||||||
|
|
||||||
let success = set_morph_animation(
|
|
||||||
am,
|
|
||||||
asset,
|
|
||||||
entityName,
|
|
||||||
frameData,
|
|
||||||
morphIndices,
|
|
||||||
Int32(numMorphTargets),
|
|
||||||
Int32(numFrames),
|
|
||||||
Float(frameLengthInMs))
|
|
||||||
result(success)
|
|
||||||
case "setBoneAnimation":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 9,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let frameData = args[2] as? [Float],
|
|
||||||
let numFrames = args[3] as? Int,
|
|
||||||
let numBones = args[4] as? Int,
|
|
||||||
let boneNames = args[5] as? [String],
|
|
||||||
let meshName = args[6] as? [String],
|
|
||||||
let numMeshTargets = args[7] as? Int,
|
|
||||||
let frameLengthInMs = args[8] as? Float else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_bone_animation", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// // Convert boneNames and meshName to C-style strings array.
|
|
||||||
// var cBoneNames: [UnsafePointer<CChar>?] = boneNames.map { $0.cString(using: .utf8) }
|
|
||||||
// var cMeshName: [UnsafePointer<CChar>?] = meshName.map { $0.cString(using: .utf8) }
|
|
||||||
//
|
|
||||||
// set_bone_animation(assetManager, asset, UnsafeMutablePointer(&frameData), numFrames, numBones, &cBoneNames, &cMeshName, numMeshTargets, frameLengthInMs)
|
|
||||||
|
|
||||||
// // Clean up after conversion
|
|
||||||
// for cStr in cBoneNames { free(UnsafeMutablePointer(mutating: cStr)) }
|
|
||||||
// for cStr in cMeshName { free(UnsafeMutablePointer(mutating: cStr)) }
|
|
||||||
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "playAnimation":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 7,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let index = args[2] as? Int,
|
|
||||||
let loop = args[3] as? Bool,
|
|
||||||
let reverse = args[4] as? Bool,
|
|
||||||
let replaceActive = args[5] as? Bool,
|
|
||||||
let crossfade = args[6] as? Double else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for play_animation", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
play_animation(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, Int32(index), loop, reverse, replaceActive, Float(crossfade))
|
|
||||||
result(true)
|
|
||||||
case "getAnimationDuration":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let animationIndex = args[2] as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for getAnimationDuration", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let dur = get_animation_duration(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, Int32(animationIndex))
|
|
||||||
result(dur)
|
|
||||||
|
|
||||||
case "setAnimationFrame":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 4,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let animationIndex = args[2] as? Int,
|
|
||||||
let animationFrame = args[3] as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_animation_frame", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
set_animation_frame(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, Int32(animationIndex), Int32(animationFrame))
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "stopAnimation":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let index = args[2] as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for stop_animation", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
stop_animation(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, Int32(index))
|
|
||||||
result(true)
|
|
||||||
case "getAnimationCount":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 2,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for get_animation_count", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let count = get_animation_count(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset)
|
|
||||||
result(count)
|
|
||||||
case "getAnimationNames":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 2,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for get_animation_name", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var names:[String] = [];
|
|
||||||
var count = get_animation_count(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset)
|
|
||||||
var buffer = [CChar](repeating: 0, count: 256) // Assuming max name length of 256 for simplicity
|
|
||||||
for i in 0...count - 1 {
|
|
||||||
get_animation_name(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, &buffer, Int32(i))
|
|
||||||
let name = String(cString: buffer)
|
|
||||||
names.append(name)
|
|
||||||
}
|
|
||||||
result(names)
|
|
||||||
case "getAnimationName":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let index = args[2] as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for get_animation_name", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var buffer = [CChar](repeating: 0, count: 256) // Assuming max name length of 256 for simplicity
|
|
||||||
get_animation_name(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, &buffer, Int32(index))
|
|
||||||
let name = String(cString: buffer)
|
|
||||||
result(name)
|
|
||||||
|
|
||||||
case "getMorphTargetName":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 4,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let meshName = args[2] as? String,
|
|
||||||
let index = args[3] as? Int else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for get_morph_target_name", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var buffer = [CChar](repeating: 0, count: 256) // Assuming max name length of 256 for simplicity
|
|
||||||
get_morph_target_name(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName, &buffer, Int32(index))
|
|
||||||
let targetName = String(cString: buffer)
|
|
||||||
result(targetName)
|
|
||||||
case "getMorphTargetNames":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let meshName = args[2] as? String else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for get_morph_target_name", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let count = get_morph_target_name_count(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName)
|
|
||||||
var names:[String] = []
|
|
||||||
if count > 0 {
|
|
||||||
for i in 0...count - 1 {
|
|
||||||
var buffer = [CChar](repeating: 0, count: 256) // Assuming max name length of 256 for simplicity
|
|
||||||
get_morph_target_name(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName, &buffer, Int32(i))
|
|
||||||
names.append(String(cString:buffer))
|
|
||||||
}
|
}
|
||||||
}
|
createPixelBuffer(width: Int(width), height:Int(height))
|
||||||
result(names)
|
var pixelBufferTextureId = unsafeBitCast(pixelBuffer!, to: UnsafeRawPointer.self)
|
||||||
case "getMorphTargetNameCount":
|
print("Resized to \(args[0])x\(args[1])")
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
result(self.flutterTextureId);
|
||||||
let assetManager = args[0] as? Int64,
|
case "dummy":
|
||||||
let asset = args[1] as? EntityId,
|
ios_dummy()
|
||||||
let meshName = args[2] as? String else {
|
ios_dummy_ffi()
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for get_morph_target_name_count", details: nil))
|
default:
|
||||||
return
|
result(FlutterMethodNotImplemented)
|
||||||
}
|
|
||||||
|
|
||||||
let count = get_morph_target_name_count(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName)
|
|
||||||
result(count)
|
|
||||||
|
|
||||||
case "removeAsset":
|
|
||||||
remove_asset(viewer, call.arguments as! EntityId)
|
|
||||||
result(true)
|
|
||||||
case "clearAssets":
|
|
||||||
clear_assets(viewer)
|
|
||||||
result(true)
|
|
||||||
case "setCamera":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 2,
|
|
||||||
let asset = args[0] as? EntityId,
|
|
||||||
let nodeName = args[1] as? String? else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected asset and nodeName for set_camera", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let success = set_camera(viewer, asset, nodeName)
|
|
||||||
result(success)
|
|
||||||
case "setCameraPosition":
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
set_camera_position(viewer, Float(args[0] as! Double), Float(args[1] as! Double), Float(args[2] as! Double))
|
|
||||||
result(true)
|
|
||||||
case "setCameraRotation":
|
|
||||||
let args = call.arguments as! [Any]
|
|
||||||
set_camera_rotation(viewer, Float(args[0] as! Double), Float(args[1] as! Double), Float(args[2] as! Double), Float(args[3] as! Double))
|
|
||||||
result(true)
|
|
||||||
case "setCameraModelMatrix":
|
|
||||||
guard let matrix = call.arguments as? [Float], matrix.count == 16 else { // Assuming a 4x4 matrix
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_camera_model_matrix", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set_camera_model_matrix(viewer, matrix)
|
|
||||||
result(true)
|
|
||||||
case "setCameraFocalLength":
|
|
||||||
set_camera_focal_length(viewer, call.arguments as! Float)
|
|
||||||
result(true)
|
|
||||||
case "setCameraFocusDistance":
|
|
||||||
set_camera_focus_distance(viewer, call.arguments as! Float)
|
|
||||||
result(true)
|
|
||||||
case "setMaterialColor":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 5,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let meshName = args[2] as? String,
|
|
||||||
let materialIndex = args[3] as? Int32,
|
|
||||||
let color = args[4] as? [Double] else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for setMaterialColor", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
set_material_color(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName, materialIndex, Float(color[0]), Float(color[1]), Float(color[2]), Float(color[3]))
|
|
||||||
result(true)
|
|
||||||
|
|
||||||
case "hideMesh":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let meshName = args[2] as? String else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for hide_mesh", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let status = hide_mesh(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName)
|
|
||||||
result(status)
|
|
||||||
|
|
||||||
case "revealMesh":
|
|
||||||
guard let args = call.arguments as? [Any], args.count == 3,
|
|
||||||
let assetManager = args[0] as? Int64,
|
|
||||||
let asset = args[1] as? EntityId,
|
|
||||||
let meshName = args[2] as? String else {
|
|
||||||
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for reveal_mesh", details: nil))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let status = reveal_mesh(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, meshName)
|
|
||||||
result(status)
|
|
||||||
default:
|
|
||||||
result(FlutterMethodNotImplemented)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,4 +80,6 @@ float get_animation_duration_ffi(void* const assetManager, EntityId asset, int i
|
|||||||
void get_morph_target_name_ffi(void* const assetManager, EntityId asset, const char *meshName, char *const outPtr, int index);
|
void get_morph_target_name_ffi(void* const assetManager, EntityId asset, const char *meshName, char *const outPtr, int index);
|
||||||
int get_morph_target_name_count_ffi(void* const assetManager, EntityId asset, const char *meshName);
|
int get_morph_target_name_count_ffi(void* const assetManager, EntityId asset, const char *meshName);
|
||||||
|
|
||||||
|
void ios_dummy_ffi();
|
||||||
|
|
||||||
#endif // _POLYVOX_FILAMENT_FFI_API_H
|
#endif // _POLYVOX_FILAMENT_FFI_API_H
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define SwiftPolyvoxFilamentPlugin_Bridging_Header_h
|
#define SwiftPolyvoxFilamentPlugin_Bridging_Header_h
|
||||||
|
|
||||||
#import "PolyvoxFilamentApi.h"
|
#import "PolyvoxFilamentApi.h"
|
||||||
|
#import "PolyvoxFilamentFFIApi.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,7 @@ A new flutter plugin project.
|
|||||||
s.author = { 'Your Company' => 'email@example.com' }
|
s.author = { 'Your Company' => 'email@example.com' }
|
||||||
s.source = { :path => '.' }
|
s.source = { :path => '.' }
|
||||||
s.source_files = 'Classes/*', 'src/*', 'src/ios/*', 'include/filament/*', 'include/*', 'include/material/*.c'
|
s.source_files = 'Classes/*', 'src/*', 'src/ios/*', 'include/filament/*', 'include/*', 'include/material/*.c'
|
||||||
s.public_header_files = 'include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h', 'include/PolyvoxFilamentApi.h', 'include/ResourceBuffer.hpp' #, 'include/filament/*'
|
s.public_header_files = 'include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h', 'include/PolyvoxFilamentApi.h', 'include/PolyvoxFilamentFFIApi.h', 'include/ResourceBuffer.hpp'
|
||||||
# s.header_mappings_dir = 'include'
|
|
||||||
s.dependency 'Flutter'
|
s.dependency 'Flutter'
|
||||||
s.platform = :ios, '12.1'
|
s.platform = :ios, '12.1'
|
||||||
s.static_framework = true
|
s.static_framework = true
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public:
|
|||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(_access);
|
std::unique_lock<std::mutex> lock(_access);
|
||||||
if(_tasks.empty()) {
|
if(_tasks.empty()) {
|
||||||
_cond.wait_for(lock, std::chrono::duration<int, std::milli>(_frameIntervalInMilliseconds));
|
_cond.wait_for(lock, std::chrono::duration<float, std::milli>(_frameIntervalInMilliseconds));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
task = std::move(_tasks.front());
|
task = std::move(_tasks.front());
|
||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
_renderCallback(_renderCallbackOwner);
|
_renderCallback(_renderCallbackOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setFrameIntervalInMilliseconds(int frameIntervalInMilliseconds) {
|
void setFrameIntervalInMilliseconds(float frameIntervalInMilliseconds) {
|
||||||
_frameIntervalInMilliseconds = frameIntervalInMilliseconds;
|
_frameIntervalInMilliseconds = frameIntervalInMilliseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
bool _stop = false;
|
bool _stop = false;
|
||||||
bool _rendering = false;
|
bool _rendering = false;
|
||||||
int _frameIntervalInMilliseconds = 1000 / 60;
|
float _frameIntervalInMilliseconds = 1000.0 / 60.0;
|
||||||
std::mutex _access;
|
std::mutex _access;
|
||||||
FilamentViewer *_viewer = nullptr;
|
FilamentViewer *_viewer = nullptr;
|
||||||
void (*_renderCallback)(void *const) = nullptr;
|
void (*_renderCallback)(void *const) = nullptr;
|
||||||
@@ -152,7 +152,7 @@ extern "C"
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FLUTTER_PLUGIN_EXPORT void set_frame_interval(double frameIntervalInMilliseconds) {
|
FLUTTER_PLUGIN_EXPORT void set_frame_interval_ffi(float frameIntervalInMilliseconds) {
|
||||||
_rl->setFrameIntervalInMilliseconds(frameIntervalInMilliseconds);
|
_rl->setFrameIntervalInMilliseconds(frameIntervalInMilliseconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,4 +377,8 @@ extern "C"
|
|||||||
auto fut = _rl->add_task(lambda);
|
auto fut = _rl->add_task(lambda);
|
||||||
fut.wait();
|
fut.wait();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FLUTTER_PLUGIN_EXPORT void ios_dummy_ffi() {
|
||||||
|
Log("Dummy called");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,8 +109,8 @@ class FilamentControllerFFI extends FilamentController {
|
|||||||
_textureId = flutterTextureId;
|
_textureId = flutterTextureId;
|
||||||
var surfaceAddress = textures[1] as int? ?? 0;
|
var surfaceAddress = textures[1] as int? ?? 0;
|
||||||
|
|
||||||
// void* on iOS/MacOS, GLuid on Android/Windows/Linux
|
// null on iOS, void* on MacOS, GLuid on Android/Windows/Linux
|
||||||
var nativeTexture = textures[2] as int;
|
var nativeTexture = textures[2] as int? ?? 0;
|
||||||
|
|
||||||
var renderCallbackResult = await _channel.invokeMethod("getRenderCallback");
|
var renderCallbackResult = await _channel.invokeMethod("getRenderCallback");
|
||||||
var renderCallback =
|
var renderCallback =
|
||||||
|
|||||||
Reference in New Issue
Block a user