diff --git a/src/main/java/com/replaymod/pathing/serialize/LegacyTimelineConverter.java b/src/main/java/com/replaymod/pathing/serialize/LegacyTimelineConverter.java index e0f3f743..61dedd28 100644 --- a/src/main/java/com/replaymod/pathing/serialize/LegacyTimelineConverter.java +++ b/src/main/java/com/replaymod/pathing/serialize/LegacyTimelineConverter.java @@ -56,10 +56,12 @@ public class LegacyTimelineConverter { } private static Timeline convert(PathingRegistry registry, KeyframeSet keyframeSet) { - Path path = registry.createTimeline().createPath(); + Timeline timeline = registry.createTimeline(); + Path timePath = timeline.createPath(); + Path positionPath = timeline.createPath(); for (Keyframe positionKeyframe : keyframeSet.positionKeyframes) { AdvancedPosition value = positionKeyframe.value; - com.replaymod.pathing.path.Keyframe keyframe = getKeyframe(path, positionKeyframe.realTimestamp); + com.replaymod.pathing.path.Keyframe keyframe = getKeyframe(positionPath, positionKeyframe.realTimestamp); keyframe.setValue(CameraProperties.POSITION, Triple.of(value.x, value.y, value.z)); keyframe.setValue(CameraProperties.ROTATION, Triple.of(value.yaw, value.pitch, value.roll)); if (value instanceof SpectatorData) { @@ -68,10 +70,10 @@ public class LegacyTimelineConverter { } for (Keyframe timeKeyframe : keyframeSet.timeKeyframes) { TimestampValue value = timeKeyframe.value; - com.replaymod.pathing.path.Keyframe keyframe = getKeyframe(path, timeKeyframe.realTimestamp); + com.replaymod.pathing.path.Keyframe keyframe = getKeyframe(timePath, timeKeyframe.realTimestamp); keyframe.setValue(TimestampProperty.PROPERTY, (int) value.value); } - return path.getTimeline(); + return timeline; } private static com.replaymod.pathing.path.Keyframe getKeyframe(Path path, long time) { diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index 04af8097..ba7c63ec 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -45,15 +45,23 @@ public class ReplayModSimplePathing implements PathingRegistry { new GuiPathing(core, this, event.getReplayHandler()); } - private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); } - private Keyframe selectedKeyframe; + private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); currentTimeline.createPath(); } + private Keyframe selectedTimeKeyframe, selectedPositionKeyframe; - public Keyframe getSelectedKeyframe() { - return selectedKeyframe; + public Keyframe getSelectedTimeKeyframe() { + return selectedTimeKeyframe; } - public void setSelectedKeyframe(Keyframe selectedKeyframe) { - this.selectedKeyframe = selectedKeyframe; + public Keyframe getSelectedPositionKeyframe() { + return selectedPositionKeyframe; + } + + public void setSelectedPositionKeyframe(Keyframe selectedPositionKeyframe) { + this.selectedPositionKeyframe = selectedPositionKeyframe; + } + + public void setSelectedTimeKeyframe(Keyframe selectedTimeKeyframe) { + this.selectedTimeKeyframe = selectedTimeKeyframe; } public void setCurrentTimeline(Timeline currentTimeline) { diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java index f208716b..6c6af391 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiKeyframeTimeline.java @@ -1,7 +1,10 @@ package com.replaymod.simplepathing.gui; +import com.google.common.base.Function; +import com.google.common.collect.FluentIterable; import com.replaymod.core.ReplayMod; import com.replaymod.pathing.path.Keyframe; +import com.replaymod.pathing.path.Path; import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.simplepathing.ReplayModSimplePathing; @@ -9,6 +12,8 @@ import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline; import org.lwjgl.util.ReadableDimension; +import javax.annotation.Nullable; + public class GuiKeyframeTimeline extends AbstractGuiTimeline { protected static final int KEYFRAME_SIZE = 5; protected static final int KEYFRAME_TEXTURE_X = 74; @@ -32,11 +37,20 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline>() { + @Nullable + @Override + public Iterable apply(@Nullable Path input) { + assert input != null; + return input.getKeyframes(); + } + })) { if (keyframe.getTime() >= startTime && keyframe.getTime() <= endTime) { double relativeTime = keyframe.getTime() - startTime; int positonX = BORDER_LEFT + (int) (relativeTime / visibleTime * visibleWidth) - KEYFRAME_SIZE / 2; - int u = KEYFRAME_TEXTURE_X + (mod.getSelectedKeyframe() == keyframe ? KEYFRAME_SIZE : 0); + int u = KEYFRAME_TEXTURE_X + + (mod.getSelectedTimeKeyframe() == keyframe || mod.getSelectedPositionKeyframe() == keyframe + ? KEYFRAME_SIZE : 0); int v = KEYFRAME_TEXTURE_Y; if (keyframe.getValue(CameraProperties.POSITION).isPresent()) { renderer.drawTexturedRect(positonX, BORDER_TOP, u, v, KEYFRAME_SIZE, KEYFRAME_SIZE); diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index a27d0ed9..4097dd30 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -3,9 +3,7 @@ package com.replaymod.simplepathing.gui; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.replaymod.core.ReplayMod; -import com.replaymod.pathing.change.AddKeyframe; -import com.replaymod.pathing.change.CombinedChange; -import com.replaymod.pathing.change.UpdateKeyframeProperties; +import com.replaymod.pathing.change.*; import com.replaymod.pathing.gui.GuiKeyframeRepository; import com.replaymod.pathing.interpolation.LinearInterpolator; import com.replaymod.pathing.path.Keyframe; @@ -42,6 +40,9 @@ import java.io.IOException; * Gui plug-in to the GuiReplayOverlay for simple pathing. */ public class GuiPathing { + public static final int TIME_PATH = 0; + public static final int POSITION_PATH = 1; + public final GuiTexturedButton playPauseButton = new GuiTexturedButton().setSize(20, 20) .setTexture(ReplayMod.TEXTURE, ReplayMod.TEXTURE_SIZE); @@ -64,7 +65,8 @@ public class GuiPathing { public void run(int time) { timeline.setCursorPosition(time); // TODO: Keyframe selection - mod.setSelectedKeyframe(null); + mod.setSelectedPositionKeyframe(null); + mod.setSelectedTimeKeyframe(null); } }).setSize(Integer.MAX_VALUE, 20).setLength(30 * 60 * 1000).setMarkers(); @@ -182,17 +184,26 @@ public class GuiPathing { player.getFuture().cancel(false); } else { Timeline timeline = mod.getCurrentTimeline(); - Path path = timeline.getPaths().get(0); + Path timePath = timeline.getPaths().get(TIME_PATH); + Path positionPath = timeline.getPaths().get(POSITION_PATH); // TODO Change interpolator via Change class LinearInterpolator interpolator = new LinearInterpolator(); interpolator.registerProperty(TimestampProperty.PROPERTY); interpolator.registerProperty(CameraProperties.POSITION); interpolator.registerProperty(CameraProperties.ROTATION); - for (PathSegment segment : path.getSegments()) { + for (PathSegment segment : timePath.getSegments()) { segment.setInterpolator(interpolator); } - path.updateAll(); + interpolator = new LinearInterpolator(); + interpolator.registerProperty(TimestampProperty.PROPERTY); + interpolator.registerProperty(CameraProperties.POSITION); + interpolator.registerProperty(CameraProperties.ROTATION); + for (PathSegment segment : positionPath.getSegments()) { + segment.setInterpolator(interpolator); + } + timePath.updateAll(); + positionPath.updateAll(); player.start(timeline); } @@ -207,10 +218,8 @@ public class GuiPathing { @Override public int getY() { - Keyframe keyframe = mod.getSelectedKeyframe(); - boolean present = keyframe != null - && keyframe.getValue(CameraProperties.POSITION).isPresent(); - return present ? 60 : 40; + Keyframe keyframe = mod.getSelectedPositionKeyframe(); + return keyframe != null ? 60 : 40; } @Override @@ -232,10 +241,8 @@ public class GuiPathing { @Override public int getY() { - Keyframe keyframe = mod.getSelectedKeyframe(); - boolean present = keyframe != null - && keyframe.getValue(TimestampProperty.PROPERTY).isPresent(); - return present ? 100 : 80; + Keyframe keyframe = mod.getSelectedTimeKeyframe(); + return keyframe != null ? 100 : 80; } @Override @@ -302,42 +309,41 @@ public class GuiPathing { private void updateKeyframe(final boolean isTime) { int time = timeline.getCursorPosition(); Timeline timeline = mod.getCurrentTimeline(); - Path path = timeline.getPaths().get(0); + Path path = timeline.getPaths().get(isTime ? TIME_PATH : POSITION_PATH); - AddKeyframe addChange = null; Keyframe keyframe = path.getKeyframe(time); + Change change; if (keyframe == null) { - addChange = AddKeyframe.create(path, time); - addChange.apply(timeline); + change = AddKeyframe.create(path, time); + change.apply(timeline); keyframe = path.getKeyframe(time); + } else { + change = RemoveKeyframe.create(path, keyframe); + change.apply(timeline); + keyframe = null; } - UpdateKeyframeProperties.Builder builder = UpdateKeyframeProperties.create(path, keyframe); - if (isTime) { - if (keyframe.getValue(TimestampProperty.PROPERTY).isPresent()) { - builder.removeProperty(TimestampProperty.PROPERTY); - } else { + if (keyframe != null) { + UpdateKeyframeProperties.Builder builder = UpdateKeyframeProperties.create(path, keyframe); + if (isTime) { builder.setValue(TimestampProperty.PROPERTY, replayHandler.getReplaySender().currentTimeStamp()); - } - } else { - if (keyframe.getValue(CameraProperties.POSITION).isPresent()) { - builder.removeProperty(CameraProperties.POSITION); - builder.removeProperty(CameraProperties.ROTATION); } else { CameraEntity camera = replayHandler.getCameraEntity(); builder.setValue(CameraProperties.POSITION, Triple.of(camera.posX, camera.posY, camera.posZ)); builder.setValue(CameraProperties.ROTATION, Triple.of(camera.rotationYaw, camera.rotationPitch, camera.roll)); } - } - UpdateKeyframeProperties updateChange = builder.done(); - updateChange.apply(timeline); - if (addChange == null) { - timeline.pushChange(updateChange); + UpdateKeyframeProperties updateChange = builder.done(); + updateChange.apply(timeline); + timeline.pushChange(CombinedChange.createFromApplied(change, updateChange)); } else { - timeline.pushChange(CombinedChange.createFromApplied(addChange, updateChange)); + timeline.pushChange(change); } - mod.setSelectedKeyframe(keyframe); + if (isTime) { + mod.setSelectedTimeKeyframe(keyframe); + } else { + mod.setSelectedPositionKeyframe(keyframe); + } } public ReplayModSimplePathing getMod() {