From 5fda527cb0b3b7ad39ef2af929078b5c5d6a708f Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Sat, 9 May 2015 16:57:16 +0200 Subject: [PATCH] Made Camera Paths take the shortest way between two head rotation values (instead of spinning unnecessarily often) --- .../replaymod/events/GuiReplayOverlay.java | 62 ++++++++++--------- .../replaymod/holders/PositionKeyframe.java | 4 +- .../replaymod/replay/ReplayHandler.java | 24 +++++++ 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java index 5560b0d8..1c4da8c9 100755 --- a/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java +++ b/src/main/java/eu/crushedpixel/replaymod/events/GuiReplayOverlay.java @@ -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() { diff --git a/src/main/java/eu/crushedpixel/replaymod/holders/PositionKeyframe.java b/src/main/java/eu/crushedpixel/replaymod/holders/PositionKeyframe.java index 8254be19..d9f46fb3 100755 --- a/src/main/java/eu/crushedpixel/replaymod/holders/PositionKeyframe.java +++ b/src/main/java/eu/crushedpixel/replaymod/holders/PositionKeyframe.java @@ -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; diff --git a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java index 7e2a430d..523517df 100755 --- a/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java +++ b/src/main/java/eu/crushedpixel/replaymod/replay/ReplayHandler.java @@ -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) {