mirror of
https://github.com/devZoGok/vb01.git
synced 2026-08-26 19:43:30 +00:00
first drivers variant
remade shape keys separated keyframe channels
This commit is contained in:
+6
-32
@@ -14,55 +14,29 @@ namespace vb01{
|
||||
void AnimationController::update(){
|
||||
for(AnimationChannel *channel : channels){
|
||||
channel->update();
|
||||
|
||||
transform(channel);
|
||||
}
|
||||
}
|
||||
|
||||
Keyframe AnimationController::findKeyframe(AnimationChannel *channel, KeyframeChannel keyframeChannel, bool last){
|
||||
int pastKeyframeId = -1;
|
||||
for(int i = 0; i < keyframeChannel.keyframes.size(); i++){
|
||||
Keyframe keyframe = keyframeChannel.keyframes[i];
|
||||
if(channel->getCurrentFrame() >= keyframe.frame){
|
||||
pastKeyframeId = i;
|
||||
}
|
||||
}
|
||||
return keyframeChannel.keyframes[pastKeyframeId + (last ? 0 : 1)];
|
||||
}
|
||||
|
||||
void AnimationController::transform(AnimationChannel *channel){
|
||||
Animation *animation = getAnimation(channel->getAnimationName());
|
||||
for(Animatable *animatable : channel->getAnimatables()){
|
||||
vector<KeyframeChannel> keyframeChannels = animation->getKeyframeChannelsByAnimatable(animatable);
|
||||
for(KeyframeChannel keyframeChannel : keyframeChannels){
|
||||
Keyframe pastKeyframe = findKeyframe(channel, keyframeChannel, true);
|
||||
Keyframe nextKeyframe = findKeyframe(channel, keyframeChannel, false);
|
||||
int currentFrame = channel->getCurrentFrame();
|
||||
Keyframe pastKeyframe = KeyframeChannel::findKeyframe(currentFrame, keyframeChannel, true);
|
||||
Keyframe nextKeyframe = KeyframeChannel::findKeyframe(currentFrame, keyframeChannel, false);
|
||||
int pastFrame = pastKeyframe.frame;
|
||||
int nextFrame = nextKeyframe.frame;
|
||||
float ratio = (float)(max(0, channel->getCurrentFrame() - pastFrame)) / (nextFrame - pastFrame);
|
||||
|
||||
float ratio = (float)(max(0, currentFrame - pastFrame)) / (nextFrame - pastFrame);
|
||||
Keyframe::Interpolation interp = pastKeyframe.interpolation;
|
||||
float value = interpolate(pastKeyframe.value, nextKeyframe.value, interp, ratio);
|
||||
float value = KeyframeChannel::interpolate(pastKeyframe.value, nextKeyframe.value, interp, ratio);
|
||||
animatable->animate(value, keyframeChannel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float AnimationController::interpolate(float pastValue, float nextValue, Keyframe::Interpolation mode, float ratio){
|
||||
float currentValue;
|
||||
switch(mode){
|
||||
case Keyframe::CONSTANT:
|
||||
currentValue = pastValue;
|
||||
break;
|
||||
case Keyframe::LINEAR:
|
||||
currentValue = pastValue + (nextValue - pastValue) * ratio;
|
||||
break;
|
||||
case Keyframe::BEZIER:
|
||||
currentValue = pastValue + (nextValue - pastValue) * ratio;
|
||||
break;
|
||||
}
|
||||
return currentValue;
|
||||
}
|
||||
|
||||
Animation* AnimationController::getAnimation(string name){
|
||||
Animation *anim = nullptr;
|
||||
for(Animation *a : animations)
|
||||
|
||||
Reference in New Issue
Block a user