mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
112 lines
2.6 KiB
Java
112 lines
2.6 KiB
Java
package com.hbm.render.anim;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import com.hbm.render.anim.BusAnimationKeyframe.InterpolationType;
|
|
|
|
//the actual bus, a sequence of keyframes with their own behavior and such
|
|
public class BusAnimationSequence {
|
|
|
|
//not actually useful for anything since the renderer usually handles
|
|
//this part, but it's nice to have for distinction just in case
|
|
public static enum EnumTransformation {
|
|
UNDEFINED,
|
|
ROTATION,
|
|
TRANSLATION,
|
|
SCALE
|
|
}
|
|
|
|
private List<BusAnimationKeyframe> keyframes = new ArrayList();
|
|
public EnumTransformation transformationType;
|
|
|
|
//appends a keyframe at the end of the sequence
|
|
public BusAnimationSequence addKeyframe(BusAnimationKeyframe keyframe) {
|
|
|
|
keyframes.add(keyframe);
|
|
|
|
return this;
|
|
}
|
|
|
|
//all transformation data is absolute, additive transformations have not yet been implemented
|
|
public double[] getTransformation(int millis) {
|
|
|
|
BusAnimationKeyframe frame = getFrameAtTime(millis);
|
|
|
|
if(frame == null)
|
|
return null;
|
|
|
|
//if no interpolation type is set, just return the new coords
|
|
if(frame.interpolationType == InterpolationType.NONE)
|
|
return frame.toArray();
|
|
|
|
//if this is the first frame, the "previous" values are 0
|
|
double[] previous = new double[] {0, 0, 0};
|
|
|
|
BusAnimationKeyframe lastFrame = getPreviousFrame(frame);
|
|
|
|
if(lastFrame != null)
|
|
previous = lastFrame.toArray();
|
|
|
|
//the time elapsed during the frame is the total current time minus the starting timie of the current frame
|
|
int frameTime = millis - getStartingTime(frame);
|
|
double interpolation = (double)frameTime / (double)frame.duration;
|
|
|
|
double interX = (frame.x - previous[0]) * interpolation + previous[0];
|
|
double interY = (frame.y - previous[1]) * interpolation + previous[1];
|
|
double interZ = (frame.z - previous[2]) * interpolation + previous[2];
|
|
|
|
return new double[] {interX, interY, interZ};
|
|
}
|
|
|
|
public BusAnimationKeyframe getFrameAtTime(int millis) {
|
|
|
|
int time = 0;
|
|
|
|
for(BusAnimationKeyframe frame : keyframes) {
|
|
time += frame.duration;
|
|
|
|
if(millis < time)
|
|
return frame;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public BusAnimationKeyframe getPreviousFrame(BusAnimationKeyframe frame) {
|
|
|
|
int index = keyframes.indexOf(frame);
|
|
|
|
if(index == 0)
|
|
return null;
|
|
|
|
return keyframes.get(index - 1);
|
|
}
|
|
|
|
public int getStartingTime(BusAnimationKeyframe start) {
|
|
|
|
int time = 0;
|
|
|
|
for(BusAnimationKeyframe frame : keyframes) {
|
|
|
|
if(frame == start)
|
|
break;
|
|
|
|
time += frame.duration;
|
|
}
|
|
|
|
return time;
|
|
}
|
|
|
|
public int getTotalTime() {
|
|
|
|
int time = 0;
|
|
|
|
for(BusAnimationKeyframe frame : keyframes) {
|
|
time += frame.duration;
|
|
}
|
|
|
|
return time;
|
|
}
|
|
}
|