mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-26 19:43:30 +00:00
new keyframe structure
This commit is contained in:
+81
-59
@@ -18,68 +18,90 @@ namespace vb01{
|
||||
for(Bone *channelBone : channel->getBones()){
|
||||
Animation::KeyframeGroup *keyframeGroup = animation->getKeyframeGroup(channelBone);
|
||||
int keyframeId = -1;
|
||||
for(int i = 0 ; i < keyframeGroup->keyframes.size(); i++){
|
||||
Animation::KeyframeGroup::Keyframe keyframe = keyframeGroup->keyframes[i];
|
||||
if(keyframe.frame > channel->getCurrentFrame()){
|
||||
keyframeId = i;
|
||||
break;
|
||||
|
||||
Vector3 pastPos, currentPos, nextPos, pastScale, currentScale, nextScale;
|
||||
Quaternion pastRot, currentRot, nextRot;
|
||||
|
||||
for(Animation::KeyframeGroup::KeyframeChannel &animChannel : keyframeGroup->keyframeChannels){
|
||||
for(int i = 0 ; i < animChannel.keyframes.size(); i++){
|
||||
Keyframe keyframe = animChannel.keyframes[i];
|
||||
if(keyframe.frame > channel->getCurrentFrame()){
|
||||
keyframeId = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Keyframe pastKeyframe = animChannel.keyframes[keyframeId - 1];
|
||||
Keyframe nextKeyframe = animChannel.keyframes[keyframeId];
|
||||
int pastFrame = pastKeyframe.frame;
|
||||
int nextFrame = nextKeyframe.frame;
|
||||
float ratio = (float)(channel->getCurrentFrame() - pastFrame) / (nextFrame - pastFrame);
|
||||
|
||||
switch(animChannel.type){
|
||||
case KeyframeChannel::POS_X:
|
||||
pastPos.x = pastKeyframe.value;
|
||||
nextPos.x = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::POS_Y:
|
||||
pastPos.y = pastKeyframe.value;
|
||||
nextPos.y = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::POS_Z:
|
||||
pastPos.z = pastKeyframe.value;
|
||||
nextPos.z = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::ROT_W:
|
||||
pastRot.w = pastKeyframe.value;
|
||||
nextRot.w = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::ROT_X:
|
||||
pastRot.x = pastKeyframe.value;
|
||||
nextRot.x = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::ROT_Y:
|
||||
pastRot.y = pastKeyframe.value;
|
||||
nextRot.y = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::ROT_Z:
|
||||
pastRot.z = pastKeyframe.value;
|
||||
nextRot.z = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::SCALE_X:
|
||||
pastScale.x = pastKeyframe.value;
|
||||
nextScale.x = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::SCALE_Y:
|
||||
pastScale.y = pastKeyframe.value;
|
||||
nextScale.y = nextKeyframe.value;
|
||||
break;
|
||||
case KeyframeChannel::SCALE_Z:
|
||||
pastScale.z = pastKeyframe.value;
|
||||
nextScale.z = nextKeyframe.value;
|
||||
break;
|
||||
}
|
||||
|
||||
switch(pastKeyframe.interpolation){
|
||||
case Keyframe::CONSTANT:
|
||||
currentPos = pastPos;
|
||||
currentRot = pastRot;
|
||||
currentScale = pastScale;
|
||||
break;
|
||||
case Keyframe::LINEAR:
|
||||
currentPos = pastPos + (nextPos - pastPos) * ratio;
|
||||
currentRot = pastRot + (nextRot - pastRot) * ratio;
|
||||
currentScale = pastScale + (nextScale - pastScale) * ratio;
|
||||
break;
|
||||
case Keyframe::BEZIER:
|
||||
currentPos = pastPos + (nextPos - pastPos) * ratio;
|
||||
currentRot = pastRot + (nextRot - pastRot) * ratio;
|
||||
currentScale = pastScale + (nextScale - pastScale) * ratio;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Animation::KeyframeGroup::Keyframe pastKeyframe = keyframeGroup->keyframes[keyframeId - 1];
|
||||
int pastFrame = pastKeyframe.frame;
|
||||
int nextFrame = keyframeGroup->keyframes[keyframeId].frame;
|
||||
float ratio = (float)(channel->getCurrentFrame() - pastFrame) / (nextFrame - pastFrame);
|
||||
|
||||
switch(pastKeyframe.interpolation){
|
||||
case Animation::KeyframeGroup::Keyframe::CONSTANT:
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::LINEAR:
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::BEZIER:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AnimationController::applyBoneTransforms(Animation::KeyframeGroup *keyframeGroup){
|
||||
Bone *bone = keyframeGroup->bone;
|
||||
Vector3 pos, scale;
|
||||
Quaternion rot;
|
||||
for(Animation::KeyframeGroup::Keyframe keyframe : keyframeGroup->keyframes){
|
||||
switch(keyframe.type){
|
||||
case Animation::KeyframeGroup::Keyframe::POS_X:
|
||||
pos.x = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::POS_Y:
|
||||
pos.y = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::POS_Z:
|
||||
pos.z = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::ROT_W:
|
||||
rot.x = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::ROT_X:
|
||||
rot.x = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::ROT_Y:
|
||||
rot.x = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::ROT_Z:
|
||||
rot.x = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::SCALE_X:
|
||||
scale.x = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::SCALE_Y:
|
||||
scale.y = keyframe.value;
|
||||
break;
|
||||
case Animation::KeyframeGroup::Keyframe::SCALE_Z:
|
||||
scale.z = keyframe.value;
|
||||
break;
|
||||
channelBone->setPosePos(currentPos);
|
||||
channelBone->setPoseRot(currentRot);
|
||||
channelBone->setPoseScale(currentScale);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user