Split time and position path

This commit is contained in:
johni0702
2016-03-10 13:01:04 +01:00
parent 626429a780
commit 45c411fd90
4 changed files with 78 additions and 48 deletions

View File

@@ -56,10 +56,12 @@ public class LegacyTimelineConverter {
} }
private static Timeline convert(PathingRegistry registry, KeyframeSet keyframeSet) { 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<AdvancedPosition> positionKeyframe : keyframeSet.positionKeyframes) { for (Keyframe<AdvancedPosition> positionKeyframe : keyframeSet.positionKeyframes) {
AdvancedPosition value = positionKeyframe.value; 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.POSITION, Triple.of(value.x, value.y, value.z));
keyframe.setValue(CameraProperties.ROTATION, Triple.of(value.yaw, value.pitch, value.roll)); keyframe.setValue(CameraProperties.ROTATION, Triple.of(value.yaw, value.pitch, value.roll));
if (value instanceof SpectatorData) { if (value instanceof SpectatorData) {
@@ -68,10 +70,10 @@ public class LegacyTimelineConverter {
} }
for (Keyframe<TimestampValue> timeKeyframe : keyframeSet.timeKeyframes) { for (Keyframe<TimestampValue> timeKeyframe : keyframeSet.timeKeyframes) {
TimestampValue value = timeKeyframe.value; 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); keyframe.setValue(TimestampProperty.PROPERTY, (int) value.value);
} }
return path.getTimeline(); return timeline;
} }
private static com.replaymod.pathing.path.Keyframe getKeyframe(Path path, long time) { private static com.replaymod.pathing.path.Keyframe getKeyframe(Path path, long time) {

View File

@@ -45,15 +45,23 @@ public class ReplayModSimplePathing implements PathingRegistry {
new GuiPathing(core, this, event.getReplayHandler()); new GuiPathing(core, this, event.getReplayHandler());
} }
private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); } private Timeline currentTimeline = createTimeline(); { currentTimeline.createPath(); currentTimeline.createPath(); }
private Keyframe selectedKeyframe; private Keyframe selectedTimeKeyframe, selectedPositionKeyframe;
public Keyframe getSelectedKeyframe() { public Keyframe getSelectedTimeKeyframe() {
return selectedKeyframe; return selectedTimeKeyframe;
} }
public void setSelectedKeyframe(Keyframe selectedKeyframe) { public Keyframe getSelectedPositionKeyframe() {
this.selectedKeyframe = selectedKeyframe; return selectedPositionKeyframe;
}
public void setSelectedPositionKeyframe(Keyframe selectedPositionKeyframe) {
this.selectedPositionKeyframe = selectedPositionKeyframe;
}
public void setSelectedTimeKeyframe(Keyframe selectedTimeKeyframe) {
this.selectedTimeKeyframe = selectedTimeKeyframe;
} }
public void setCurrentTimeline(Timeline currentTimeline) { public void setCurrentTimeline(Timeline currentTimeline) {

View File

@@ -1,7 +1,10 @@
package com.replaymod.simplepathing.gui; 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.core.ReplayMod;
import com.replaymod.pathing.path.Keyframe; import com.replaymod.pathing.path.Keyframe;
import com.replaymod.pathing.path.Path;
import com.replaymod.pathing.properties.CameraProperties; import com.replaymod.pathing.properties.CameraProperties;
import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.pathing.properties.TimestampProperty;
import com.replaymod.simplepathing.ReplayModSimplePathing; import com.replaymod.simplepathing.ReplayModSimplePathing;
@@ -9,6 +12,8 @@ import de.johni0702.minecraft.gui.GuiRenderer;
import de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline; import de.johni0702.minecraft.gui.element.advanced.AbstractGuiTimeline;
import org.lwjgl.util.ReadableDimension; import org.lwjgl.util.ReadableDimension;
import javax.annotation.Nullable;
public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline> { public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline> {
protected static final int KEYFRAME_SIZE = 5; protected static final int KEYFRAME_SIZE = 5;
protected static final int KEYFRAME_TEXTURE_X = 74; protected static final int KEYFRAME_TEXTURE_X = 74;
@@ -32,11 +37,20 @@ public class GuiKeyframeTimeline extends AbstractGuiTimeline<GuiKeyframeTimeline
renderer.bindTexture(ReplayMod.TEXTURE); renderer.bindTexture(ReplayMod.TEXTURE);
for (Keyframe keyframe : mod.getCurrentTimeline().getPaths().get(0).getKeyframes()) { for (Keyframe keyframe : FluentIterable.from(mod.getCurrentTimeline().getPaths()).transformAndConcat(new Function<Path, Iterable<Keyframe>>() {
@Nullable
@Override
public Iterable<Keyframe> apply(@Nullable Path input) {
assert input != null;
return input.getKeyframes();
}
})) {
if (keyframe.getTime() >= startTime && keyframe.getTime() <= endTime) { if (keyframe.getTime() >= startTime && keyframe.getTime() <= endTime) {
double relativeTime = keyframe.getTime() - startTime; double relativeTime = keyframe.getTime() - startTime;
int positonX = BORDER_LEFT + (int) (relativeTime / visibleTime * visibleWidth) - KEYFRAME_SIZE / 2; 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; int v = KEYFRAME_TEXTURE_Y;
if (keyframe.getValue(CameraProperties.POSITION).isPresent()) { if (keyframe.getValue(CameraProperties.POSITION).isPresent()) {
renderer.drawTexturedRect(positonX, BORDER_TOP, u, v, KEYFRAME_SIZE, KEYFRAME_SIZE); renderer.drawTexturedRect(positonX, BORDER_TOP, u, v, KEYFRAME_SIZE, KEYFRAME_SIZE);

View File

@@ -3,9 +3,7 @@ package com.replaymod.simplepathing.gui;
import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.Futures;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.pathing.change.AddKeyframe; import com.replaymod.pathing.change.*;
import com.replaymod.pathing.change.CombinedChange;
import com.replaymod.pathing.change.UpdateKeyframeProperties;
import com.replaymod.pathing.gui.GuiKeyframeRepository; import com.replaymod.pathing.gui.GuiKeyframeRepository;
import com.replaymod.pathing.interpolation.LinearInterpolator; import com.replaymod.pathing.interpolation.LinearInterpolator;
import com.replaymod.pathing.path.Keyframe; import com.replaymod.pathing.path.Keyframe;
@@ -42,6 +40,9 @@ import java.io.IOException;
* Gui plug-in to the GuiReplayOverlay for simple pathing. * Gui plug-in to the GuiReplayOverlay for simple pathing.
*/ */
public class GuiPathing { 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) public final GuiTexturedButton playPauseButton = new GuiTexturedButton().setSize(20, 20)
.setTexture(ReplayMod.TEXTURE, ReplayMod.TEXTURE_SIZE); .setTexture(ReplayMod.TEXTURE, ReplayMod.TEXTURE_SIZE);
@@ -64,7 +65,8 @@ public class GuiPathing {
public void run(int time) { public void run(int time) {
timeline.setCursorPosition(time); timeline.setCursorPosition(time);
// TODO: Keyframe selection // TODO: Keyframe selection
mod.setSelectedKeyframe(null); mod.setSelectedPositionKeyframe(null);
mod.setSelectedTimeKeyframe(null);
} }
}).setSize(Integer.MAX_VALUE, 20).setLength(30 * 60 * 1000).setMarkers(); }).setSize(Integer.MAX_VALUE, 20).setLength(30 * 60 * 1000).setMarkers();
@@ -182,17 +184,26 @@ public class GuiPathing {
player.getFuture().cancel(false); player.getFuture().cancel(false);
} else { } else {
Timeline timeline = mod.getCurrentTimeline(); 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 // TODO Change interpolator via Change class
LinearInterpolator interpolator = new LinearInterpolator(); LinearInterpolator interpolator = new LinearInterpolator();
interpolator.registerProperty(TimestampProperty.PROPERTY); interpolator.registerProperty(TimestampProperty.PROPERTY);
interpolator.registerProperty(CameraProperties.POSITION); interpolator.registerProperty(CameraProperties.POSITION);
interpolator.registerProperty(CameraProperties.ROTATION); interpolator.registerProperty(CameraProperties.ROTATION);
for (PathSegment segment : path.getSegments()) { for (PathSegment segment : timePath.getSegments()) {
segment.setInterpolator(interpolator); 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); player.start(timeline);
} }
@@ -207,10 +218,8 @@ public class GuiPathing {
@Override @Override
public int getY() { public int getY() {
Keyframe keyframe = mod.getSelectedKeyframe(); Keyframe keyframe = mod.getSelectedPositionKeyframe();
boolean present = keyframe != null return keyframe != null ? 60 : 40;
&& keyframe.getValue(CameraProperties.POSITION).isPresent();
return present ? 60 : 40;
} }
@Override @Override
@@ -232,10 +241,8 @@ public class GuiPathing {
@Override @Override
public int getY() { public int getY() {
Keyframe keyframe = mod.getSelectedKeyframe(); Keyframe keyframe = mod.getSelectedTimeKeyframe();
boolean present = keyframe != null return keyframe != null ? 100 : 80;
&& keyframe.getValue(TimestampProperty.PROPERTY).isPresent();
return present ? 100 : 80;
} }
@Override @Override
@@ -302,42 +309,41 @@ public class GuiPathing {
private void updateKeyframe(final boolean isTime) { private void updateKeyframe(final boolean isTime) {
int time = timeline.getCursorPosition(); int time = timeline.getCursorPosition();
Timeline timeline = mod.getCurrentTimeline(); 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); Keyframe keyframe = path.getKeyframe(time);
Change change;
if (keyframe == null) { if (keyframe == null) {
addChange = AddKeyframe.create(path, time); change = AddKeyframe.create(path, time);
addChange.apply(timeline); change.apply(timeline);
keyframe = path.getKeyframe(time); keyframe = path.getKeyframe(time);
} else {
change = RemoveKeyframe.create(path, keyframe);
change.apply(timeline);
keyframe = null;
} }
UpdateKeyframeProperties.Builder builder = UpdateKeyframeProperties.create(path, keyframe); if (keyframe != null) {
if (isTime) { UpdateKeyframeProperties.Builder builder = UpdateKeyframeProperties.create(path, keyframe);
if (keyframe.getValue(TimestampProperty.PROPERTY).isPresent()) { if (isTime) {
builder.removeProperty(TimestampProperty.PROPERTY);
} else {
builder.setValue(TimestampProperty.PROPERTY, replayHandler.getReplaySender().currentTimeStamp()); builder.setValue(TimestampProperty.PROPERTY, replayHandler.getReplaySender().currentTimeStamp());
}
} else {
if (keyframe.getValue(CameraProperties.POSITION).isPresent()) {
builder.removeProperty(CameraProperties.POSITION);
builder.removeProperty(CameraProperties.ROTATION);
} else { } else {
CameraEntity camera = replayHandler.getCameraEntity(); CameraEntity camera = replayHandler.getCameraEntity();
builder.setValue(CameraProperties.POSITION, Triple.of(camera.posX, camera.posY, camera.posZ)); builder.setValue(CameraProperties.POSITION, Triple.of(camera.posX, camera.posY, camera.posZ));
builder.setValue(CameraProperties.ROTATION, Triple.of(camera.rotationYaw, camera.rotationPitch, camera.roll)); builder.setValue(CameraProperties.ROTATION, Triple.of(camera.rotationYaw, camera.rotationPitch, camera.roll));
} }
} UpdateKeyframeProperties updateChange = builder.done();
UpdateKeyframeProperties updateChange = builder.done(); updateChange.apply(timeline);
updateChange.apply(timeline); timeline.pushChange(CombinedChange.createFromApplied(change, updateChange));
if (addChange == null) {
timeline.pushChange(updateChange);
} else { } 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() { public ReplayModSimplePathing getMod() {