animation controller and channels (beginning)

This commit is contained in:
devZoGok
2021-10-19 19:06:41 +03:00
parent dd9ad38a34
commit 1bcfc39b90
9 changed files with 165 additions and 23 deletions
+85 -1
View File
@@ -1,12 +1,96 @@
#include "animationController.h"
#include "animationChannel.h"
#include "skeleton.h"
using namespace std;
namespace vb01{
AnimationController::AnimationController(){
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;
}
}