merge
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user