From fb53881183f95cddf208c1613189aa7f09abfe6e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 8 Aug 2023 14:19:17 +0800 Subject: [PATCH] fix setMorphTargetAnimation --- ios/Classes/SwiftPolyvoxFilamentPlugin.swift | 34 ++++++++++++-------- lib/filament_controller.dart | 17 ++-------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift index f83fcee0..d41794e7 100644 --- a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -372,32 +372,40 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture // apply_weights(assetManager, asset, entityName, UnsafeMutablePointer(&weights), Int32(count)) result(true) case "setMorphTargetWeights": - guard let args = call.arguments as? [Any], args.count == 4, + guard let args = call.arguments as? [Any], args.count == 7, let assetManager = args[0] as? Int64, let asset = args[1] as? EntityId, let entityName = args[2] as? String, - let morphData = args[3] as? [Float], - let numWeights = args[4] as? Int else { - result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_morph_target_weights", details: nil)) + let morphData = args[3] as? FlutterStandardTypedData, + let numMorphWeights = args[4] as? Int else { + result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_morph_animation", details: nil)) return } - // set_morph_target_weights(assetManager, asset, entityName, UnsafeMutablePointer(&morphData), numWeights) - result(true) + let success = morphData.data.withUnsafeBytes { buffer in + buffer.withMemoryRebound(to: Float.self) { + set_morph_target_weights(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, entityName, $0.baseAddress, Int32(numMorphWeights)) + } + } + result(success) case "setMorphAnimation": guard let args = call.arguments as? [Any], args.count == 7, let assetManager = args[0] as? Int64, let asset = args[1] as? EntityId, let entityName = args[2] as? String, - let morphData = args[3] as? [Float], + let morphData = args[3] as? FlutterStandardTypedData, let numMorphWeights = args[4] as? Int, let numFrames = args[5] as? Int, - let frameLengthInMs = args[6] as? Float else { + let frameLengthInMs = args[6] as? Double else { result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_morph_animation", details: nil)) return } - // let success = set_morph_animation(assetManager, asset, entityName, UnsafeMutablePointer(&morphData), numMorphWeights, numFrames, frameLengthInMs) - result(-1) + let success = morphData.data.withUnsafeBytes { buffer in + buffer.withMemoryRebound(to: Float.self) { + set_morph_animation(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, entityName, $0.baseAddress, Int32(numMorphWeights), Int32(numFrames), Float(frameLengthInMs)) + } + } + result(success) case "setBoneAnimation": guard let args = call.arguments as? [Any], args.count == 9, let assetManager = args[0] as? Int64, @@ -552,12 +560,12 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture result(true) case "setCamera": guard let args = call.arguments as? [Any], args.count == 2, - let asset = args[0] as? Int64, - let nodeName = args[1] as? String else { + 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, Int32(asset), nodeName) + let success = set_camera(viewer, asset, nodeName) result(success) case "setCameraPosition": diff --git a/lib/filament_controller.dart b/lib/filament_controller.dart index 0a059953..52892309 100644 --- a/lib/filament_controller.dart +++ b/lib/filament_controller.dart @@ -229,14 +229,8 @@ class FilamentController { void setMorphTargetWeights( FilamentEntity asset, String meshName, List weights) async { - var weightPtr = calloc(weights.length); - for (int i = 0; i < weights.length; i++) { - weightPtr[i] = weights[i]; - } - await _channel.invokeMethod("setMorphTargetWeights", - [_assetManager, asset, meshName, weightPtr, weights.length]); - calloc.free(weightPtr); + [_assetManager, asset, meshName, weights, weights.length]); } Future> getMorphTargetNames( @@ -259,20 +253,15 @@ class FilamentController { /// void setMorphAnimationData( FilamentEntity asset, MorphAnimationData animation) async { - var data = calloc(animation.data.length); - for (int i = 0; i < animation.data.length; i++) { - data.elementAt(i).value = animation.data[i]; - } await _channel.invokeMethod("setMorphAnimation", [ _assetManager, asset, animation.meshName, - data, + animation.data, animation.numMorphWeights, animation.numFrames, animation.frameLengthInMs ]); - calloc.free(data); } /// @@ -359,7 +348,7 @@ class FilamentController { } void setCamera(FilamentEntity asset, String? name) async { - if (await _channel.invokeMethod("setCamera", [asset, name]) != 1) { + if (await _channel.invokeMethod("setCamera", [asset, name]) != true) { throw Exception("Failed to set camera"); } }