From 9f032a8392b5e0bc6a01313faaf62508b7ae7bf8 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 15 Dec 2022 23:15:22 +0800 Subject: [PATCH] update to animation structures --- ios/include/SceneResources.hpp | 18 ++++++------- ios/src/SceneAsset.cpp | 38 +++++++++++++-------------- lib/animations/animation_builder.dart | 38 ++++++++++++++++++++------- lib/animations/animations.dart | 6 +++++ lib/filament_controller.dart | 10 +++---- 5 files changed, 67 insertions(+), 43 deletions(-) diff --git a/ios/include/SceneResources.hpp b/ios/include/SceneResources.hpp index a86d8c67..aa49fe97 100644 --- a/ios/include/SceneResources.hpp +++ b/ios/include/SceneResources.hpp @@ -90,16 +90,16 @@ namespace polyvox { memcpy(mMorphFrameData, morphData, morphSize); } - if(numBones > 0) { - size_t boneSize = numBones * numFrames * 7 * sizeof(float); - mBoneFrameData = (float*)malloc(boneSize); - memcpy(mBoneFrameData, boneData, boneSize); - } + // if(numBones > 0) { + // size_t boneSize = numBones * numFrames * 7 * sizeof(float); + // mBoneFrameData = (float*)malloc(boneSize); + // memcpy(mBoneFrameData, boneData, boneSize); + // } - for(int i =0; i < numBones; i++) { - mBoneNames.push_back(string(boneNames[i])); - mMeshNames.push_back(string(meshNames[i])); - } + // for(int i =0; i < numBones; i++) { + // mBoneNames.push_back(string(boneNames[i])); + // mMeshNames.push_back(string(meshNames[i])); + // } } ~RuntimeAnimation() { diff --git a/ios/src/SceneAsset.cpp b/ios/src/SceneAsset.cpp index 9e377469..c9e99458 100644 --- a/ios/src/SceneAsset.cpp +++ b/ios/src/SceneAsset.cpp @@ -105,29 +105,29 @@ void SceneAsset::updateRuntimeAnimation() { if (frameIndex > _runtimeAnimationBuffer->frameIndex) { _runtimeAnimationBuffer->frameIndex = frameIndex; if(_runtimeAnimationBuffer->mMorphFrameData) { - auto morphFramePtrOffset = frameIndex * _runtimeAnimationBuffer->mNumMorphWeights; - setMorphTargetWeights(_runtimeAnimationBuffer->mMorphFrameData + morphFramePtrOffset, - _runtimeAnimationBuffer->mNumMorphWeights); + // auto morphFramePtrOffset = frameIndex * _runtimeAnimationBuffer->mNumMorphWeights; + // setMorphTargetWeights(_runtimeAnimationBuffer->mMorphFrameData + morphFramePtrOffset, + // _runtimeAnimationBuffer->mNumMorphWeights); } - if(_runtimeAnimationBuffer->mBoneFrameData) { + // if(_runtimeAnimationBuffer->mBoneFrameData) { - for(int i = 0; i < _runtimeAnimationBuffer->mNumBones; i++) { - auto boneFramePtrOffset = (frameIndex * _runtimeAnimationBuffer->mNumBones * 7) + (i*7); - const char* boneName = _runtimeAnimationBuffer->mBoneNames[i].c_str(); - const char* meshName = _runtimeAnimationBuffer->mMeshNames[i].c_str(); - float* frame = _runtimeAnimationBuffer->mBoneFrameData + boneFramePtrOffset; + // for(int i = 0; i < _runtimeAnimationBuffer->mNumBones; i++) { + // auto boneFramePtrOffset = (frameIndex * _runtimeAnimationBuffer->mNumBones * 7) + (i*7); + // const char* boneName = _runtimeAnimationBuffer->mBoneNames[i].c_str(); + // const char* meshName = _runtimeAnimationBuffer->mMeshNames[i].c_str(); + // float* frame = _runtimeAnimationBuffer->mBoneFrameData + boneFramePtrOffset; - float transX = frame[0]; - float transY = frame[1]; - float transZ = frame[2]; - float quatX = frame[3]; - float quatY = frame[4]; - float quatZ = frame[5]; - float quatW = frame[6]; - setBoneTransform(boneName, meshName, transX, transY, transZ, quatX, quatY, quatZ, quatW); - } - } + // float transX = frame[0]; + // float transY = frame[1]; + // float transZ = frame[2]; + // float quatX = frame[3]; + // float quatY = frame[4]; + // float quatZ = frame[5]; + // float quatW = frame[6]; + // setBoneTransform(boneName, meshName, transX, transY, transZ, quatX, quatY, quatZ, quatW); + // } + // } } } diff --git a/lib/animations/animation_builder.dart b/lib/animations/animation_builder.dart index 49e8f987..4c9a4889 100644 --- a/lib/animations/animation_builder.dart +++ b/lib/animations/animation_builder.dart @@ -3,19 +3,37 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; class Animation { - final Float32List morphWeights; + late final Float32List? morphData; final int numMorphWeights; final int numFrames; final double frameLengthInMs; - final List boneNames; - final List meshNames; + final List? boneNames; + final List? meshNames; - final Float32List boneTransforms; + final Float32List? boneTransforms; - Animation(this.morphWeights, this.numMorphWeights, this.boneTransforms, + Animation(this.morphData, this.numMorphWeights, this.boneTransforms, this.boneNames, this.meshNames, this.numFrames, this.frameLengthInMs); + + Animation.from( + {required List> morphData, + required this.numMorphWeights, + this.boneTransforms, + this.boneNames, + this.meshNames, + required this.numFrames, + required this.frameLengthInMs}) { + if (morphData.length != numFrames) { + throw Exception("Mismatched animation data with frame length"); + } + this.morphData = Float32List(numMorphWeights * numFrames); + for (int i = 0; i < numFrames; i++) { + this.morphData!.setRange((i * numMorphWeights), + (i * numMorphWeights) + numMorphWeights, morphData[i]); + } + } } class AnimationBuilder { @@ -39,7 +57,7 @@ class AnimationBuilder { int numFrames = _duration * 1000 ~/ _frameLengthInMs; - final _morphWeights = Float32List((numFrames * _numMorphWeights).toInt()); + final morphData = Float32List((numFrames * _numMorphWeights).toInt()); var frameStart = (_interpMorphStart! * 1000) ~/ _frameLengthInMs; var frameEnd = (_interpMorphEnd! * 1000) ~/ _frameLengthInMs; @@ -50,12 +68,12 @@ class AnimationBuilder { var val = ((1 - linear) * _interpMorphStartValue!) + (linear * _interpMorphEndValue!); for (int j = 0; j < _numMorphWeights; j++) { - _morphWeights[(i * _numMorphWeights) + j] = val; + morphData[(i * _numMorphWeights) + j] = val; } } print( - "Created morphWeights of size ${_morphWeights.length} (${_morphWeights.lengthInBytes} for ${numFrames} frames"); + "Created morphWeights of size ${morphData.length} (${morphData.lengthInBytes} for ${numFrames} frames"); final boneTransforms = Float32List(numFrames * _boneTransforms.length * 7); print( @@ -71,8 +89,8 @@ class AnimationBuilder { "frameData for frame $i ${boneTransforms.sublist(i * _boneTransforms.length * 7, (i * _boneTransforms.length * 7) + 7)}"); } - return Animation(_morphWeights, _numMorphWeights, boneTransforms, - _boneNames, _meshNames, numFrames, _frameLengthInMs); + return Animation(morphData, _numMorphWeights, boneTransforms, _boneNames, + _meshNames, numFrames, _frameLengthInMs); } AnimationBuilder setFramerate(int framerate) { diff --git a/lib/animations/animations.dart b/lib/animations/animations.dart index 6f833454..402c6143 100644 --- a/lib/animations/animations.dart +++ b/lib/animations/animations.dart @@ -4,6 +4,9 @@ class Vec3 { final double z; Vec3({this.x = 0, this.y = 0, this.z = 0}); + + factory Vec3.from(List vals) => + Vec3(x: vals[0], y: vals[1], z: vals[2]); } class Quaternion { @@ -13,6 +16,9 @@ class Quaternion { double w = 1; Quaternion({this.x = 0, this.y = 0, this.z = 0, this.w = 1.0}); + + factory Quaternion.from(List vals) => + Quaternion(x: vals[0], y: vals[1], z: vals[2], w: vals[3]); } class BoneTransform { diff --git a/lib/filament_controller.dart b/lib/filament_controller.dart index 02e3e74b..e6107d5e 100644 --- a/lib/filament_controller.dart +++ b/lib/filament_controller.dart @@ -222,7 +222,6 @@ class PolyvoxFilamentController extends FilamentController { Future loadGlb(String path) async { print("Loading GLB at $path "); var asset = await _channel.invokeMethod("loadGlb", path); - print("Got asset : $asset "); return asset as FilamentAsset; } @@ -283,13 +282,14 @@ class PolyvoxFilamentController extends FilamentController { } Future setAnimation(FilamentAsset asset, Animation animation) async { + print("Frmael en ${animation.frameLengthInMs}"); await _channel.invokeMethod("setAnimation", [ asset, - animation.morphWeights, + animation.morphData!, animation.numMorphWeights, - animation.boneTransforms, - animation.boneNames, - animation.meshNames, + animation.boneTransforms ?? Float32List(0), + animation.boneNames ?? [], + animation.meshNames ?? [], animation.numFrames, animation.frameLengthInMs ]);