This commit is contained in:
Nick Fisher
2023-08-08 10:45:15 +08:00
5 changed files with 32 additions and 40 deletions

View File

@@ -557,8 +557,6 @@ bool AssetManager::setBoneAnimationBuffer(
frameData + numFrames * numBones * 7 frameData + numFrames * numBones * 7
); );
Log("%d frames for %d bones", numFrames, numBones);
animationBuffer.mFrameLengthInMs = frameLengthInMs; animationBuffer.mFrameLengthInMs = frameLengthInMs;
animationBuffer.mNumFrames = numFrames; animationBuffer.mNumFrames = numFrames;

View File

@@ -51,17 +51,10 @@ class BoneDriver {
return rotation; return rotation;
}).toList(); }).toList();
if (frameNum == 0) {
print(rotations);
}
var result = rotations.fold( var result = rotations.fold(
rotations.first, (Quaternion a, Quaternion b) => a + b); rotations.first, (Quaternion a, Quaternion b) => a + b);
result.w = 1; result.w = 1;
print("RESULT $result");
yield result; yield result;
// .normalized();
// todo - bone translations
} }
} }

View File

@@ -8,7 +8,7 @@ import 'package:polyvox_filament/animations/morph_animation_data.dart';
import 'package:vector_math/vector_math.dart'; import 'package:vector_math/vector_math.dart';
/// ///
/// A class for loading animation data from a single CSV and allocating between morph/bone animation with help. /// A class for loading animation data from a single CSV and allocating between morph/bone animation.
/// ///
class DynamicAnimation { class DynamicAnimation {
final MorphAnimationData? morphAnimation; final MorphAnimationData? morphAnimation;
@@ -22,8 +22,14 @@ class DynamicAnimation {
// create a MorphAnimationData instance from the given CSV // create a MorphAnimationData instance from the given CSV
var llf = _loadLiveLinkFaceCSV(csvPath); var llf = _loadLiveLinkFaceCSV(csvPath);
var frameLengthInMs = 1000 / (framerate ?? 60.0); var frameLengthInMs = 1000 / (framerate ?? 60.0);
var morphNames = llf var morphNames = llf.item1;
.item1; //.where((name) => !boneDrivers.any((element) => element.blendshape == name));
if (boneDrivers != null) {
morphNames = morphNames
.where((name) =>
boneDrivers!.any((element) => element.bone == name) == false)
.toList();
}
var morphAnimationData = MorphAnimationData( var morphAnimationData = MorphAnimationData(
meshName ?? "NULL", llf.item2, morphNames, frameLengthInMs); meshName ?? "NULL", llf.item2, morphNames, frameLengthInMs);
@@ -84,7 +90,9 @@ class DynamicAnimation {
/// ///
/// Load visemes fom a CSV file formatted according to the following header: /// Load visemes fom a CSV file formatted according to the following header:
/// "Timecode,BlendShapeCount,EyeBlinkLeft,EyeLookDownLeft,EyeLookInLeft,EyeLookOutLeft,EyeLookUpLeft,EyeSquintLeft,EyeWideLeft,EyeBlinkRight,EyeLookDownRight,EyeLookInRight,EyeLookOutRight,EyeLookUpRight,EyeSquintRight,EyeWideRight,JawForward,JawRight,JawLeft,JawOpen,MouthClose,MouthFunnel,MouthPucker,MouthRight,MouthLeft,MouthSmileLeft,MouthSmileRight,MouthFrownLeft,MouthFrownRight,MouthDimpleLeft,MouthDimpleRight,MouthStretchLeft,MouthStretchRight,MouthRollLower,MouthRollUpper,MouthShrugLower,MouthShrugUpper,MouthPressLeft,MouthPressRight,MouthLowerDownLeft,MouthLowerDownRight,MouthUpperUpLeft,MouthUpperUpRight,BrowDownLeft,BrowDownRight,BrowInnerUp,BrowOuterUpLeft,BrowOuterUpRight,CheekPuff,CheekSquintLeft,CheekSquintRight,NoseSneerLeft,NoseSneerRight,TongueOut,HeadYaw,HeadPitch,HeadRoll,LeftEyeYaw,LeftEyePitch,LeftEyeRoll,RightEyeYaw,RightEyePitch,RightEyeRoll" /// "Timecode,BlendShapeCount,EyeBlinkLeft,EyeLookDownLeft,EyeLookInLeft,EyeLookOutLeft,EyeLookUpLeft,EyeSquintLeft,EyeWideLeft,EyeBlinkRight,EyeLookDownRight,EyeLookInRight,EyeLookOutRight,EyeLookUpRight,EyeSquintRight,EyeWideRight,JawForward,JawRight,JawLeft,JawOpen,MouthClose,MouthFunnel,MouthPucker,MouthRight,MouthLeft,MouthSmileLeft,MouthSmileRight,MouthFrownLeft,MouthFrownRight,MouthDimpleLeft,MouthDimpleRight,MouthStretchLeft,MouthStretchRight,MouthRollLower,MouthRollUpper,MouthShrugLower,MouthShrugUpper,MouthPressLeft,MouthPressRight,MouthLowerDownLeft,MouthLowerDownRight,MouthUpperUpLeft,MouthUpperUpRight,BrowDownLeft,BrowDownRight,BrowInnerUp,BrowOuterUpLeft,BrowOuterUpRight,CheekPuff,CheekSquintLeft,CheekSquintRight,NoseSneerLeft,NoseSneerRight,TongueOut,HeadYaw,HeadPitch,HeadRoll,LeftEyeYaw,LeftEyePitch,LeftEyeRoll,RightEyeYaw,RightEyePitch,RightEyeRoll"
/// Returns only those specified by [targetNames]. /// Returns two elements:
/// - a list containing the names of each blendshape/morph key
/// - a Float32List of length TxN, where T is the number of frames and N is the number of morph keys (i.e. the length of the list in the first element of the returned tuple).
/// ///
static Tuple2<List<String>, Float32List> _loadLiveLinkFaceCSV(String path) { static Tuple2<List<String>, Float32List> _loadLiveLinkFaceCSV(String path) {
final data = File(path) final data = File(path)

View File

@@ -99,39 +99,37 @@ class _FilamentGestureDetectorState extends State<FilamentGestureDetector> {
}); });
} }
}, },
onPointerPanZoomStart: !widget.enableControls onPointerPanZoomStart: !widget.enableControls ? null : (pzs) {},
? null
: (pzs) {
print("PAN ZOOM START");
},
onPointerDown: !widget.enableControls onPointerDown: !widget.enableControls
? null ? null
: (d) async { : (d) async {
// if (d.buttons == kTertiaryButton || _rotating) { if (d.buttons == kTertiaryButton || _rotating) {
// widget.controller widget.controller
// .rotateStart(d.localPosition.dx, d.localPosition.dy); .rotateStart(d.localPosition.dx, d.localPosition.dy);
// } else { } else {
// widget.controller.panStart(d.focalPoint.dx, d.focalPoint.dy); widget.controller
// } .panStart(d.localPosition.dx, d.localPosition.dy);
}
}, },
onPointerMove: !widget.enableControls onPointerMove: !widget.enableControls
? null ? null
: (PointerMoveEvent d) async { : (PointerMoveEvent d) async {
// if (d.buttons == kTertiaryButton || _rotating) { if (d.buttons == kTertiaryButton || _rotating) {
// widget.controller widget.controller
// .rotateUpdate(d.localPosition.dx, d.localPosition.dy); .rotateUpdate(d.localPosition.dx, d.localPosition.dy);
// } else { } else {
// widget.controller.panUpdate(d.focalPoint.dx, d.focalPoint.dy); widget.controller
// } .panUpdate(d.localPosition.dx, d.localPosition.dy);
}
}, },
onPointerUp: !widget.enableControls onPointerUp: !widget.enableControls
? null ? null
: (d) async { : (d) async {
// if (d.buttons == kTertiaryButton || _rotating) { if (d.buttons == kTertiaryButton || _rotating) {
// widget.controller.rotateEnd(); widget.controller.rotateEnd();
// } else { } else {
// widget.controller.panEnd(d.focalPoint.dx, d.focalPoint.dy); widget.controller.panEnd();
// } }
}, },
child: widget.child); child: widget.child);
} }
@@ -144,7 +142,6 @@ class _FilamentGestureDetectorState extends State<FilamentGestureDetector> {
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onDoubleTap: () { onDoubleTap: () {
_rotating = !_rotating; _rotating = !_rotating;
print("Set rotating to $_rotating");
}, },
onScaleStart: !widget.enableControls onScaleStart: !widget.enableControls
? null ? null

View File

@@ -58,14 +58,10 @@ ResourceBuffer loadResource(const char* name) {
is.read (buffer, length); is.read (buffer, length);
is.close(); is.close();
_file_assets[id] = buffer; _file_assets[id] = buffer;
std::cout << "Loaded!" << std::endl;
return ResourceBuffer(buffer, length, id); return ResourceBuffer(buffer, length, id);
} }
void freeResource(ResourceBuffer rbuf) { void freeResource(ResourceBuffer rbuf) {
std::cout << "Free " << rbuf.id << std::endl;
std::cout << "Freeing resource " << rbuf.id << std::endl;
auto it = _file_assets.find(rbuf.id); auto it = _file_assets.find(rbuf.id);
if (it != _file_assets.end()) { if (it != _file_assets.end()) {
free(it->second); free(it->second);