Split time and position path
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user