mirror of
https://github.com/ApfelTeeSaft/vb01.git
synced 2026-08-26 19:33:45 +00:00
97 lines
2.8 KiB
C++
97 lines
2.8 KiB
C++
#include "animationController.h"
|
|
#include "animationChannel.h"
|
|
#include "skeleton.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace vb01{
|
|
AnimationController::AnimationController(Skeleton *skeleton){
|
|
this->skeleton = skeleton;
|
|
}
|
|
|
|
AnimationController::~AnimationController(){
|
|
}
|
|
|
|
void AnimationController::update(){
|
|
for(AnimationChannel *channel : channels){
|
|
Animation *animation = skeleton->getAnimationController()->getAnimation(channel->getAnimationName());
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|
|
|
|
Animation* AnimationController::getAnimation(string name){
|
|
Animation *anim = nullptr;
|
|
for(Animation *a : animations)
|
|
if(a->getName() == name){
|
|
anim = a;
|
|
break;
|
|
}
|
|
return anim;
|
|
}
|
|
}
|