From 19f2d99ded1f8c8bd3fd9737e7500f176cb9d2f6 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 26 Feb 2023 12:21:36 +0800 Subject: [PATCH 1/3] add setAnimationFrame --- ios/Classes/SwiftPolyvoxFilamentPlugin.swift | 8 +++++++- ios/include/PolyvoxFilamentApi.h | 1 + ios/include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h | 2 -- ios/src/PolyvoxFilamentApi.cpp | 4 ++++ ios/src/SceneAsset.cpp | 6 ++++++ lib/filament_controller.dart | 8 ++++++++ 6 files changed, 26 insertions(+), 3 deletions(-) diff --git a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift index fa6798e7..50da4bd3 100644 --- a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -77,7 +77,6 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture if found != nil { path = found?.path - print("FOUND \(found)") } else { if(uriString.hasPrefix("file://")) { path = String(uriString.dropFirst(7)) @@ -357,6 +356,13 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture let reverse = args[3] as! Bool; play_animation(assetPtr, animationIndex, loop, reverse) result("OK"); + case "setAnimationFrame": + let args = call.arguments as! Array + let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) + let animationIndex = args[1] as! Int32; + let animationFrame = args[2] as! Int32; + set_animation_frame(assetPtr, animationIndex, animationFrame) + result("OK"); case "stopAnimation": let args = call.arguments as! Array let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) diff --git a/ios/include/PolyvoxFilamentApi.h b/ios/include/PolyvoxFilamentApi.h index 80cc80e9..d5c0353c 100644 --- a/ios/include/PolyvoxFilamentApi.h +++ b/ios/include/PolyvoxFilamentApi.h @@ -78,6 +78,7 @@ void set_animation( // ); void play_animation(void* asset, int index, bool loop, bool reverse); +void set_animation_frame(void* asset, int animationIndex, int animationFrame); void stop_animation(void* asset, int index); int get_animation_count(void* asset); diff --git a/ios/include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h b/ios/include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h index aa250e53..2541539a 100644 --- a/ios/include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h +++ b/ios/include/SwiftPolyvoxFilamentPlugin-Bridging-Header.h @@ -1,8 +1,6 @@ #ifndef SwiftPolyvoxFilamentPlugin_Bridging_Header_h #define SwiftPolyvoxFilamentPlugin_Bridging_Header_h -// void* filament_viewer_new_ios(void* texture, void* loadResource, void* freeResource, void* resources); - #import "PolyvoxFilamentIOSApi.h" #import "PolyvoxFilamentApi.h" diff --git a/ios/src/PolyvoxFilamentApi.cpp b/ios/src/PolyvoxFilamentApi.cpp index 314f3c6a..95d68d39 100644 --- a/ios/src/PolyvoxFilamentApi.cpp +++ b/ios/src/PolyvoxFilamentApi.cpp @@ -196,6 +196,10 @@ extern "C" { ((SceneAsset*)asset)->playAnimation(index, loop, reverse); } + void set_animation_frame(void* asset, int animationIndex, int animationFrame) { + ((SceneAsset*)asset)->setAnimationFrame(animationIndex, animationFrame); + } + int get_animation_count(void* asset) { auto names = ((SceneAsset*)asset)->getAnimationNames(); return names->size(); diff --git a/ios/src/SceneAsset.cpp b/ios/src/SceneAsset.cpp index 9e124a5b..ca9c9186 100644 --- a/ios/src/SceneAsset.cpp +++ b/ios/src/SceneAsset.cpp @@ -327,6 +327,12 @@ void SceneAsset::setTexture() { } +void SceneAsset::setAnimationFrame(int animationIndex, int animationFrame) { + auto offset = 60 * animationFrame * 1000; // TODO - don't hardcore 60fps framerate + _animator->applyAnimation(animationIndex, offset); + _animator->updateBoneMatrices(); +} + void SceneAsset::updateEmbeddedAnimations() { auto now = high_resolution_clock::now(); int animationIndex = 0; diff --git a/lib/filament_controller.dart b/lib/filament_controller.dart index d1c834c9..57013760 100644 --- a/lib/filament_controller.dart +++ b/lib/filament_controller.dart @@ -70,6 +70,8 @@ abstract class FilamentController { Future> getAnimationNames(FilamentAsset asset); Future removeAsset(FilamentAsset asset); Future clearAssets(); + Future setAnimationFrame( + FilamentAsset asset, int animationIndex, int animationFrame); Future playAnimation(FilamentAsset asset, int index, {bool loop = false, bool reverse = false}); Future playAnimations(FilamentAsset asset, List indices, @@ -332,6 +334,12 @@ class PolyvoxFilamentController extends FilamentController { await _channel.invokeMethod("playAnimation", [asset, index, loop, reverse]); } + Future setAnimationFrame( + FilamentAsset asset, int index, int animationFrame) async { + await _channel + .invokeMethod("setAnimationFrame", [asset, index, animationFrame]); + } + Future playAnimations(FilamentAsset asset, List indices, {bool loop = false, bool reverse = false}) async { return Future.wait(indices.map((index) { From 2372e5504dbd79596c7afeb05f474094a7a6141e Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 26 Feb 2023 12:22:08 +0800 Subject: [PATCH 2/3] add setAnimationFrame --- ios/include/SceneAsset.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ios/include/SceneAsset.hpp b/ios/include/SceneAsset.hpp index 9028fea6..63415dbf 100644 --- a/ios/include/SceneAsset.hpp +++ b/ios/include/SceneAsset.hpp @@ -60,6 +60,8 @@ namespace polyvox { /// void playAnimation(int index, bool loop, bool reverse); + void setAnimationFrame(int animationIndex, int animationFrame); + /// /// Manually set the weights for all morph targets in the assets to the provided values. /// See [setAnimation] if you want to do the same across a number of frames (and extended to bone transforms). From e511a6f44d097f4e05be3cc7fa06d01f8d79936c Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Sun, 26 Feb 2023 13:09:04 +0800 Subject: [PATCH 3/3] fix Swift bindings for new set animation method --- ios/Classes/SwiftPolyvoxFilamentPlugin.swift | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift index 50da4bd3..2113f325 100644 --- a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -236,12 +236,12 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "setAnimation": let args = call.arguments as! Array let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) + let entityName = args[1] as! String + let morphData = (args[2] as! FlutterStandardTypedData) - let morphData = (args[1] as! FlutterStandardTypedData) + let numMorphWeights = args[3] as! Int - let numMorphWeights = args[2] as! Int - - let boneAnimations = args[3] as! Array> + let boneAnimations = args[4] as! Array> let numBoneAnimations = boneAnimations.count var boneAnimStructs = UnsafeMutableBufferPointer.allocate(capacity: numBoneAnimations) @@ -280,11 +280,12 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture } - let numFrames = args[4] as! Int - let frameLenInMs = args[5] as! Double + let numFrames = args[5] as! Int + let frameLenInMs = args[6] as! Double morphData.data.withUnsafeBytes { (morphDataNative: UnsafePointer) in set_animation( assetPtr, + entityName, morphDataNative, Int32(numMorphWeights), boneAnimStructs.baseAddress, @@ -396,9 +397,11 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "setMorphTargetWeights": let args = call.arguments as! Array let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) - let weights = args[1] as! Array + let entityName = args[1] as! String + let weights = args[2] as! Array + let count = args[3] as! Int weights.map { Float($0) }.withUnsafeBufferPointer { - apply_weights(assetPtr, UnsafeMutablePointer.init(mutating:$0.baseAddress), Int32(weights.count)) + apply_weights(assetPtr, entityName, UnsafeMutablePointer.init(mutating:$0.baseAddress), Int32(count)) } result("OK")