fix setMorphTargetAnimation

This commit is contained in:
Nick Fisher
2023-08-08 14:19:17 +08:00
parent 3e982e2993
commit fb53881183
2 changed files with 24 additions and 27 deletions

View File

@@ -372,32 +372,40 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
// apply_weights(assetManager, asset, entityName, UnsafeMutablePointer(&weights), Int32(count)) // apply_weights(assetManager, asset, entityName, UnsafeMutablePointer(&weights), Int32(count))
result(true) result(true)
case "setMorphTargetWeights": 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 assetManager = args[0] as? Int64,
let asset = args[1] as? EntityId, let asset = args[1] as? EntityId,
let entityName = args[2] as? String, let entityName = args[2] as? String,
let morphData = args[3] as? [Float], let morphData = args[3] as? FlutterStandardTypedData,
let numWeights = args[4] as? Int else { let numMorphWeights = args[4] as? Int else {
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_morph_target_weights", details: nil)) result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_morph_animation", details: nil))
return return
} }
// set_morph_target_weights(assetManager, asset, entityName, UnsafeMutablePointer(&morphData), numWeights) let success = morphData.data.withUnsafeBytes { buffer in
result(true) buffer.withMemoryRebound(to: Float.self) {
set_morph_target_weights(unsafeBitCast(assetManager, to:UnsafeMutableRawPointer.self), asset, entityName, $0.baseAddress, Int32(numMorphWeights))
}
}
result(success)
case "setMorphAnimation": case "setMorphAnimation":
guard let args = call.arguments as? [Any], args.count == 7, guard let args = call.arguments as? [Any], args.count == 7,
let assetManager = args[0] as? Int64, let assetManager = args[0] as? Int64,
let asset = args[1] as? EntityId, let asset = args[1] as? EntityId,
let entityName = args[2] as? String, 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 numMorphWeights = args[4] as? Int,
let numFrames = args[5] 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)) result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected correct arguments for set_morph_animation", details: nil))
return return
} }
// let success = set_morph_animation(assetManager, asset, entityName, UnsafeMutablePointer(&morphData), numMorphWeights, numFrames, frameLengthInMs) let success = morphData.data.withUnsafeBytes { buffer in
result(-1) 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": case "setBoneAnimation":
guard let args = call.arguments as? [Any], args.count == 9, guard let args = call.arguments as? [Any], args.count == 9,
let assetManager = args[0] as? Int64, let assetManager = args[0] as? Int64,
@@ -552,12 +560,12 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture
result(true) result(true)
case "setCamera": case "setCamera":
guard let args = call.arguments as? [Any], args.count == 2, guard let args = call.arguments as? [Any], args.count == 2,
let asset = args[0] as? Int64, let asset = args[0] as? EntityId,
let nodeName = args[1] as? String else { let nodeName = args[1] as? String? else {
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected asset and nodeName for set_camera", details: nil)) result(FlutterError(code: "INVALID_ARGUMENTS", message: "Expected asset and nodeName for set_camera", details: nil))
return return
} }
let success = set_camera(viewer, Int32(asset), nodeName) let success = set_camera(viewer, asset, nodeName)
result(success) result(success)
case "setCameraPosition": case "setCameraPosition":

View File

@@ -229,14 +229,8 @@ class FilamentController {
void setMorphTargetWeights( void setMorphTargetWeights(
FilamentEntity asset, String meshName, List<double> weights) async { FilamentEntity asset, String meshName, List<double> weights) async {
var weightPtr = calloc<Float>(weights.length);
for (int i = 0; i < weights.length; i++) {
weightPtr[i] = weights[i];
}
await _channel.invokeMethod("setMorphTargetWeights", await _channel.invokeMethod("setMorphTargetWeights",
[_assetManager, asset, meshName, weightPtr, weights.length]); [_assetManager, asset, meshName, weights, weights.length]);
calloc.free(weightPtr);
} }
Future<List<String>> getMorphTargetNames( Future<List<String>> getMorphTargetNames(
@@ -259,20 +253,15 @@ class FilamentController {
/// ///
void setMorphAnimationData( void setMorphAnimationData(
FilamentEntity asset, MorphAnimationData animation) async { FilamentEntity asset, MorphAnimationData animation) async {
var data = calloc<Float>(animation.data.length);
for (int i = 0; i < animation.data.length; i++) {
data.elementAt(i).value = animation.data[i];
}
await _channel.invokeMethod("setMorphAnimation", [ await _channel.invokeMethod("setMorphAnimation", [
_assetManager, _assetManager,
asset, asset,
animation.meshName, animation.meshName,
data, animation.data,
animation.numMorphWeights, animation.numMorphWeights,
animation.numFrames, animation.numFrames,
animation.frameLengthInMs animation.frameLengthInMs
]); ]);
calloc.free(data);
} }
/// ///
@@ -359,7 +348,7 @@ class FilamentController {
} }
void setCamera(FilamentEntity asset, String? name) async { 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"); throw Exception("Failed to set camera");
} }
} }