From 6095aef3d1f462b409f1a3df6297f17b3462dce5 Mon Sep 17 00:00:00 2001 From: johni0702 Date: Sat, 28 Jan 2017 10:33:45 +0100 Subject: [PATCH] Fix loading and storing of default interpolator with settings --- .../replaymod/simplepathing/SPTimeline.java | 22 ++++++++++++++++++- .../simplepathing/gui/GuiEditKeyframe.java | 15 ++++++++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/replaymod/simplepathing/SPTimeline.java b/src/main/java/com/replaymod/simplepathing/SPTimeline.java index 26442b66..49558272 100644 --- a/src/main/java/com/replaymod/simplepathing/SPTimeline.java +++ b/src/main/java/com/replaymod/simplepathing/SPTimeline.java @@ -5,7 +5,6 @@ import com.google.common.collect.Iterables; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import com.replaymod.pathing.properties.CameraProperties; -import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; import com.replaymod.pathing.properties.SpectatorProperty; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.replaystudio.pathing.PathingRegistry; @@ -25,6 +24,7 @@ import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.property.Property; import com.replaymod.replaystudio.util.EntityPositionTracker; import com.replaymod.replaystudio.util.Location; +import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; import lombok.Getter; import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; @@ -108,6 +108,26 @@ public class SPTimeline implements PathingRegistry { } } + public Change setDefaultInterpolator(Interpolator interpolator) { + Preconditions.checkState(defaultInterpolatorType != null, "Default interpolator type not set."); + Validate.isInstanceOf(defaultInterpolatorType.getInterpolatorClass(), interpolator); + + registerPositionInterpolatorProperties(interpolator); + + Change change = CombinedChange.create( + positionPath.getSegments().stream() + // Ignore explicitly set segments + .filter(s -> !s.getStartKeyframe().getValue(ExplicitInterpolationProperty.PROPERTY).isPresent()) + // Ignore spectator segments + .filter(s -> !isSpectatorSegment(s)) + // Update interpolator for every remaining segment + // This will create a fragmented interpolator which is split by the updateInterpolators call + .map(s -> SetInterpolator.create(s, interpolator)).toArray(Change[]::new) + ); + change.apply(timeline); + return CombinedChange.createFromApplied(change, updateInterpolators()); + } + public boolean isTimeKeyframe(long time) { return timePath.getKeyframe(time) != null; } diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java index 9cabba88..6f3a8577 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiEditKeyframe.java @@ -1,7 +1,6 @@ package com.replaymod.simplepathing.gui; import com.replaymod.pathing.properties.CameraProperties; -import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.replay.ReplayModReplay; import com.replaymod.replaystudio.pathing.change.Change; @@ -16,6 +15,7 @@ import com.replaymod.simplepathing.InterpolatorType; import com.replaymod.simplepathing.SPTimeline; import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.Setting; +import com.replaymod.simplepathing.properties.ExplicitInterpolationProperty; import de.johni0702.minecraft.gui.container.AbstractGuiContainer; import de.johni0702.minecraft.gui.container.GuiPanel; import de.johni0702.minecraft.gui.element.GuiButton; @@ -251,10 +251,11 @@ public abstract class GuiEditKeyframe> extends Abst xField.getDouble(), yField.getDouble(), zField.getDouble(), yawField.getFloat(), pitchField.getFloat(), rollField.getFloat() ); + Interpolator interpolator = interpolationPanel.getSettingsPanel().createInterpolator(); if (interpolationPanel.getInterpolatorType() == InterpolatorType.DEFAULT) { - return CombinedChange.createFromApplied(positionChange, timeline.setInterpolatorToDefault(time)); + return CombinedChange.createFromApplied(positionChange, timeline.setInterpolatorToDefault(time), + timeline.setDefaultInterpolator(interpolator)); } else { - Interpolator interpolator = interpolationPanel.getSettingsPanel().createInterpolator(); return CombinedChange.createFromApplied(positionChange, timeline.setInterpolator(time, interpolator)); } } @@ -295,13 +296,17 @@ public abstract class GuiEditKeyframe> extends Abst Optional segment = path.getSegments().stream() .filter(s -> s.getStartKeyframe() == keyframe).findFirst(); if (segment.isPresent()) { + Interpolator interpolator = segment.get().getInterpolator(); + InterpolatorType type = InterpolatorType.fromClass(interpolator.getClass()); if (keyframe.getValue(ExplicitInterpolationProperty.PROPERTY).isPresent()) { - Interpolator interpolator = segment.get().getInterpolator(); - InterpolatorType type = InterpolatorType.fromClass(interpolator.getClass()); dropdown.setSelected(type); // trigger the callback once to display settings panel } else { setSettingsPanel(InterpolatorType.DEFAULT); } + if (getInterpolatorTypeNoDefault(type).getInterpolatorClass().isInstance(interpolator)) { + //noinspection unchecked + settingsPanel.loadSettings(interpolator); + } } else { // Disable dropdown if this is the last keyframe dropdown.setDisabled();