Made Camera Paths take the shortest way between two head rotation values (instead of spinning unnecessarily often)

This commit is contained in:
CrushedPixel
2015-05-09 16:57:16 +02:00
parent c95e66efbc
commit 5fda527cb0
3 changed files with 59 additions and 31 deletions

View File

@@ -170,40 +170,42 @@ public class GuiReplayOverlay extends Gui {
this.drawModalRectWithCustomSizedTexture(ppButtonX, ppButtonY, x, y, 20, 20, 64, 64);
//When hurrying, no Timeline jumping etc. is possible
if(Mouse.isButtonDown(0) && FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class) && !ReplayMod.replaySender.isHurrying()) { //clicking the Button
speedSlider.mousePressed(mc, mouseX, mouseY);
if(!mouseDown) {
mouseDown = true;
if(hover) {
boolean paused = !ReplayMod.replaySender.paused();
if(paused) {
ReplayMod.replaySender.setReplaySpeed(0);
} else {
ReplayMod.replaySender.setReplaySpeed(speedSlider.getSliderValue());
if(Mouse.isButtonDown(0) && FMLClientHandler.instance().isGUIOpen(GuiMouseInput.class)) { //clicking the Button
if(!ReplayMod.replaySender.isHurrying()) {
speedSlider.mousePressed(mc, mouseX, mouseY);
if(!mouseDown) {
mouseDown = true;
if(hover) {
boolean paused = !ReplayMod.replaySender.paused();
if(paused) {
ReplayMod.replaySender.setReplaySpeed(0);
} else {
ReplayMod.replaySender.setReplaySpeed(speedSlider.getSliderValue());
}
} else if(mouseX >= exportButtonX && mouseX <= exportButtonX + 20 && mouseY >= exportButtonY && exportButtonY <= exportButtonY + 20) {
ReplayHandler.startPath(true);
}
} else if(mouseX >= exportButtonX && mouseX <= exportButtonX + 20 && mouseY >= exportButtonY && exportButtonY <= exportButtonY + 20) {
ReplayHandler.startPath(true);
}
if(mouseX >= timelineX + 4 && mouseX <= width - 18 && mouseY >= 11 && mouseY <= 29) {
double tot = (width - 18) - (timelineX + 4);
double perc = (mouseX - (timelineX + 4)) / tot;
double time = perc * (double) ReplayMod.replaySender.replayLength();
if(mouseX >= timelineX + 4 && mouseX <= width - 18 && mouseY >= 11 && mouseY <= 29) {
double tot = (width - 18) - (timelineX + 4);
double perc = (mouseX - (timelineX + 4)) / tot;
double time = perc * (double) ReplayMod.replaySender.replayLength();
if(time < ReplayMod.replaySender.currentTimeStamp()) {
mc.displayGuiScreen(null);
}
if(time < ReplayMod.replaySender.currentTimeStamp()) {
mc.displayGuiScreen(null);
CameraEntity cam = ReplayHandler.getCameraEntity();
if(cam != null) {
ReplayHandler.setLastPosition(new Position(cam.posX, cam.posY, cam.posZ, cam.rotationPitch, cam.rotationYaw));
} else {
ReplayHandler.setLastPosition(null);
}
if((int) time != ReplayMod.replaySender.getDesiredTimestamp())
ReplayMod.replaySender.jumpToTime((int) time);
}
CameraEntity cam = ReplayHandler.getCameraEntity();
if(cam != null) {
ReplayHandler.setLastPosition(new Position(cam.posX, cam.posY, cam.posZ, cam.rotationPitch, cam.rotationYaw));
} else {
ReplayHandler.setLastPosition(null);
}
if((int) time != ReplayMod.replaySender.getDesiredTimestamp())
ReplayMod.replaySender.jumpToTime((int) time);
}
}
@@ -658,7 +660,7 @@ public class GuiReplayOverlay extends Gui {
private void addPlaceKeyframe() {
Entity cam = mc.getRenderViewEntity();
if(cam == null) return;
ReplayHandler.addKeyframe(new PositionKeyframe(ReplayHandler.getRealTimelineCursor(), new Position(cam.posX, cam.posY, cam.posZ, cam.rotationPitch, cam.rotationYaw, ReplayHandler.getCameraTilt())));
ReplayHandler.addKeyframe(new PositionKeyframe(ReplayHandler.getRealTimelineCursor(), new Position(cam.posX, cam.posY, cam.posZ, cam.rotationPitch, cam.rotationYaw % 360, ReplayHandler.getCameraTilt())));
}
private void addTimeKeyframe() {

View File

@@ -4,7 +4,7 @@ import org.apache.commons.lang3.builder.HashCodeBuilder;
public class PositionKeyframe extends Keyframe {
private final Position position;
private Position position;
public PositionKeyframe(int realTime, Position position) {
super(realTime);
@@ -15,6 +15,8 @@ public class PositionKeyframe extends Keyframe {
return position;
}
public void setPosition(Position position) { this.position = position; }
@Override
public boolean equals(Object o2) {
if(o2 == null) return false;

View File

@@ -123,6 +123,30 @@ public class ReplayHandler {
public static void addKeyframe(Keyframe keyframe) {
keyframes.add(keyframe);
selectKeyframe(keyframe);
if(keyframe instanceof PositionKeyframe) {
Float a = null;
Float b;
for(Keyframe kf : keyframes) {
if(!(kf instanceof PositionKeyframe)) continue;
PositionKeyframe pkf = (PositionKeyframe)kf;
Position pos = pkf.getPosition();
b = pos.getYaw() % 360;
System.out.println(a+" "+b);
if(a != null) {
float diff = b-a;
if(Math.abs(diff) > 180) {
b = a - (360 - diff) % 360;
System.out.println(b);
pos.setYaw(b);
pkf.setPosition(pos);
}
}
a = b;
}
}
}
public static void removeKeyframe(Keyframe keyframe) {