Merge branch 'stable' into develop

This commit is contained in:
Jonas Herzig
2020-09-27 18:45:05 +02:00
18 changed files with 129 additions and 40 deletions

View File

@@ -66,6 +66,7 @@ import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Date;
import java.util.UUID;
import java.util.function.Consumer;
@@ -350,6 +351,10 @@ public class Utils {
super(container);
setBackgroundColor(Colors.DARK_TRANSPARENT);
ProtocolVersion latestVersion = ProtocolVersion.getProtocols()
.stream()
.max(Comparator.comparing(ProtocolVersion::getId))
.orElseThrow(RuntimeException::new);
getInfo().addElements(new VerticalLayout.Data(0.5),
new GuiLabel()
.setColor(Colors.BLACK)
@@ -357,10 +362,7 @@ public class Utils {
new GuiLabel()
.setColor(Colors.BLACK)
.setI18nText("replaymod.gui.minimalmode.supportedversion",
ProtocolVersion.v1_7_6.getName()
+ " - "
+ Iterables.getLast(ProtocolVersion.getProtocols()).getName()
));
"1.7.10 - " + latestVersion.getName()));
open();
}

View File

@@ -127,6 +127,9 @@ public class MarkerProcessor {
List<Pair<Path, ReplayMetaData>> outputPaths = new ArrayList<>();
Path inputPath = path.resolveSibling("raw").resolve(path.getFileName());
for (int i = 1; Files.exists(inputPath); i++) {
inputPath = inputPath.resolveSibling(replayName + "." + i + ".mcpr");
}
Files.createDirectories(inputPath.getParent());
Files.move(path, inputPath);

View File

@@ -97,6 +97,7 @@ public class GuiCreateScreenshot extends GuiRenderSettings implements Loadable {
protected File generateOutputFile(RenderSettings.EncodingPreset encodingPreset) {
DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
File screenshotFolder = new File(getMinecraft().runDirectory, "screenshots");
screenshotFolder.mkdirs();
String baseName = DATE_FORMAT.format(new Date());
for (int i = 1; ; i++) {
File screenshotFile = new File(screenshotFolder, baseName + (i == 1 ? "" : "_" + i) + ".png");
@@ -106,6 +107,11 @@ public class GuiCreateScreenshot extends GuiRenderSettings implements Loadable {
}
}
@Override
public void load(RenderSettings settings) {
super.load(settings.withEncodingPreset(RenderSettings.EncodingPreset.PNG));
}
@Override
protected Path getSettingsPath() {
return getMinecraft().runDirectory.toPath().resolve("config/replaymod-screenshotsettings.json");

View File

@@ -212,6 +212,30 @@ public class RenderSettings {
this.highPerformance = highPerformance;
}
public RenderSettings withEncodingPreset(EncodingPreset encodingPreset) {
return new RenderSettings(
renderMethod,
encodingPreset,
videoWidth,
videoHeight,
framesPerSecond,
bitRate,
outputFile,
renderNameTags,
stabilizeYaw,
stabilizePitch,
stabilizeRoll,
chromaKeyingColor,
sphericalFovX,
sphericalFovY,
injectSphericalMetadata,
antiAliasing,
exportCommand,
exportArguments,
highPerformance
);
}
/**
* @return the width of the output video during rendering, including the upscale for Anti-Aliasing.
*/

View File

@@ -141,6 +141,5 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
@Override
public void close() throws IOException {
worldRenderer.close();
}
}

View File

@@ -2,6 +2,7 @@ package com.replaymod.render.rendering;
import com.replaymod.core.mixin.MinecraftAccessor;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.capturer.WorldRenderer;
import net.minecraft.client.MinecraftClient;
import net.minecraft.util.crash.CrashReport;
import net.minecraft.util.crash.CrashException;
@@ -23,6 +24,7 @@ import static com.replaymod.core.versions.MCVer.getWindow;
public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
private final WorldRenderer worldRenderer;
private final FrameCapturer<R> capturer;
private final FrameProcessor<R, P> processor;
private int consumerNextFrame;
@@ -31,7 +33,8 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
private volatile boolean abort;
public Pipeline(FrameCapturer<R> capturer, FrameProcessor<R, P> processor, FrameConsumer<P> consumer) {
public Pipeline(WorldRenderer worldRenderer, FrameCapturer<R> capturer, FrameProcessor<R, P> processor, FrameConsumer<P> consumer) {
this.worldRenderer = worldRenderer;
this.capturer = capturer;
this.processor = processor;
this.consumer = consumer;
@@ -81,6 +84,7 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
}
try {
worldRenderer.close();
capturer.close();
processor.close();
consumer.close();

View File

@@ -10,6 +10,7 @@ import com.replaymod.render.capturer.SimpleOpenGlFrameCapturer;
import com.replaymod.render.capturer.SimplePboOpenGlFrameCapturer;
import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer;
import com.replaymod.render.capturer.StereoscopicPboOpenGlFrameCapturer;
import com.replaymod.render.capturer.WorldRenderer;
import com.replaymod.render.frame.CubicOpenGlFrame;
import com.replaymod.render.frame.ODSOpenGlFrame;
import com.replaymod.render.frame.OpenGlFrame;
@@ -45,66 +46,72 @@ public class Pipelines {
public static Pipeline<OpenGlFrame, RGBFrame> newDefaultPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings();
WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo);
FrameCapturer<OpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new SimplePboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
capturer = new SimplePboOpenGlFrameCapturer(worldRenderer, renderInfo);
} else {
capturer = new SimpleOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
capturer = new SimpleOpenGlFrameCapturer(worldRenderer, renderInfo);
}
return new Pipeline<>(capturer, new OpenGlToRGBProcessor(), consumer);
return new Pipeline<>(worldRenderer, capturer, new OpenGlToRGBProcessor(), consumer);
}
public static Pipeline<StereoscopicOpenGlFrame, RGBFrame> newStereoscopicPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings();
WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo);
FrameCapturer<StereoscopicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new StereoscopicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
capturer = new StereoscopicPboOpenGlFrameCapturer(worldRenderer, renderInfo);
} else {
capturer = new StereoscopicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
capturer = new StereoscopicOpenGlFrameCapturer(worldRenderer, renderInfo);
}
return new Pipeline<>(capturer, new StereoscopicToRGBProcessor(), consumer);
return new Pipeline<>(worldRenderer, capturer, new StereoscopicToRGBProcessor(), consumer);
}
public static Pipeline<CubicOpenGlFrame, RGBFrame> newCubicPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings();
WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo);
FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
capturer = new CubicPboOpenGlFrameCapturer(worldRenderer, renderInfo, settings.getVideoWidth() / 4);
} else {
capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, settings.getVideoWidth() / 4);
capturer = new CubicOpenGlFrameCapturer(worldRenderer, renderInfo, settings.getVideoWidth() / 4);
}
return new Pipeline<>(capturer, new CubicToRGBProcessor(), consumer);
return new Pipeline<>(worldRenderer, capturer, new CubicToRGBProcessor(), consumer);
}
public static Pipeline<CubicOpenGlFrame, RGBFrame> newEquirectangularPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings();
WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo);
EquirectangularToRGBProcessor processor = new EquirectangularToRGBProcessor(settings.getVideoWidth(),
settings.getVideoHeight(), settings.getSphericalFovX());
FrameCapturer<CubicOpenGlFrame> capturer;
if (PixelBufferObject.SUPPORTED) {
capturer = new CubicPboOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, processor.getFrameSize());
capturer = new CubicPboOpenGlFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize());
} else {
capturer = new CubicOpenGlFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, processor.getFrameSize());
capturer = new CubicOpenGlFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize());
}
return new Pipeline<>(capturer, processor, consumer);
return new Pipeline<>(worldRenderer, capturer, processor, consumer);
}
public static Pipeline<ODSOpenGlFrame, RGBFrame> newODSPipeline(RenderInfo renderInfo, FrameConsumer<RGBFrame> consumer) {
RenderSettings settings = renderInfo.getRenderSettings();
WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo);
ODSToRGBProcessor processor = new ODSToRGBProcessor(settings.getVideoWidth(),
settings.getVideoHeight(), settings.getSphericalFovX());
FrameCapturer<ODSOpenGlFrame> capturer =
new ODSFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo, processor.getFrameSize());
return new Pipeline<>(capturer, processor, consumer);
new ODSFrameCapturer(worldRenderer, renderInfo, processor.getFrameSize());
return new Pipeline<>(worldRenderer, capturer, processor, consumer);
}
public static Pipeline<RGBFrame, RGBFrame> newBlendPipeline(RenderInfo renderInfo) {
RenderSettings settings = renderInfo.getRenderSettings();
FrameCapturer<RGBFrame> capturer = new BlendFrameCapturer(new EntityRendererHandler(settings, renderInfo), renderInfo);
WorldRenderer worldRenderer = new EntityRendererHandler(settings, renderInfo);
FrameCapturer<RGBFrame> capturer = new BlendFrameCapturer(worldRenderer, renderInfo);
FrameConsumer<RGBFrame> consumer = new FrameConsumer<RGBFrame>() {
@Override
public void consume(RGBFrame frame) {
@@ -114,6 +121,6 @@ public class Pipelines {
public void close() {
}
};
return new Pipeline<>(capturer, new DummyProcessor<>(), consumer);
return new Pipeline<>(worldRenderer, capturer, new DummyProcessor<>(), consumer);
}
}

View File

@@ -729,10 +729,12 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
final PlayerPositionLookS2CPacket ppl = (PlayerPositionLookS2CPacket) p;
if(!hasWorldLoaded) hasWorldLoaded = true;
if (mc.currentScreen instanceof DownloadingTerrainScreen) {
// Close the world loading screen manually in case we swallow the packet
mc.openScreen(null);
}
ReplayMod.instance.runLater(() -> {
if (mc.currentScreen instanceof DownloadingTerrainScreen) {
// Close the world loading screen manually in case we swallow the packet
mc.openScreen(null);
}
});
if(replayHandler.shouldSuppressCameraMovements()) return null;

View File

@@ -519,10 +519,6 @@ public class ReplayHandler {
return spectating;
}
public void setTargetPosition(Location pos) {
targetCameraPosition = pos;
}
public void moveCameraToTargetPosition() {
CameraEntity cam = getCameraEntity();
if (cam != null && targetCameraPosition != null) {
@@ -592,7 +588,7 @@ public class ReplayHandler {
}
}
long diff = targetTime - replaySender.getDesiredTimestamp();
long diff = targetTime - (replaySender.isHurrying() ? replaySender.getDesiredTimestamp() : replaySender.currentTimeStamp());
if (diff != 0) {
if (diff > 0 && diff < 5000) { // Small difference and no time travel
replaySender.jumpToTime(targetTime);

View File

@@ -74,11 +74,13 @@ import net.minecraft.util.Hand;
//#if MC>=10800
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.render.entity.PlayerModelPart;
//#else
//$$ import net.minecraft.client.entity.EntityClientPlayerMP;
//$$ import net.minecraft.util.Session;
//#endif
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
@@ -98,6 +100,8 @@ public class CameraEntity
//$$ extends EntityClientPlayerMP
//#endif
{
private static final UUID CAMERA_UUID = UUID.nameUUIDFromBytes("ReplayModCamera".getBytes(StandardCharsets.UTF_8));
/**
* Roll of this camera in degrees.
*/
@@ -154,6 +158,11 @@ public class CameraEntity
, false
//#endif
);
//#if MC>=10900
setUuid(CAMERA_UUID);
//#else
//$$ entityUniqueID = CAMERA_UUID;
//#endif
eventHandler.register();
if (ReplayModReplay.instance.getReplayHandler().getSpectatedUUID() == null) {
cameraController = ReplayModReplay.instance.createCameraController(this);
@@ -423,6 +432,15 @@ public class CameraEntity
}
return super.getModel();
}
@Override
public boolean isPartVisible(PlayerModelPart modelPart) {
Entity view = getRenderViewEntity(this.client);
if (view != this && view instanceof PlayerEntity) {
return ((PlayerEntity) view).isPartVisible(modelPart);
}
return super.isPartVisible(modelPart);
}
//#endif
@Override

View File

@@ -4,6 +4,7 @@ import com.replaymod.core.ReplayMod;
import com.replaymod.core.versions.MCVer.Keyboard;
import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.camera.CameraEntity;
import com.replaymod.replaystudio.data.Marker;
import com.replaymod.replaystudio.util.Location;
import de.johni0702.minecraft.gui.GuiRenderer;
@@ -168,11 +169,14 @@ public class GuiMarkerTimeline extends AbstractGuiTimeline<GuiMarkerTimeline> im
} else if (button == 1) { // Right click
selectedMarker = null;
if (replayHandler != null) {
replayHandler.setTargetPosition(new Location(
marker.getX(), marker.getY(), marker.getZ(),
marker.getPitch(), marker.getYaw()
));
replayHandler.doJump(marker.getTime(), false);
CameraEntity cameraEntity = replayHandler.getCameraEntity();
if (cameraEntity != null) {
cameraEntity.setCameraPosRot(new Location(
marker.getX(), marker.getY(), marker.getZ(),
marker.getYaw(), marker.getPitch()
));
}
replayHandler.doJump(marker.getTime(), true);
} else {
setCursorPosition(marker.getTime());
}

View File

@@ -0,0 +1,20 @@
//#if MC>=11600
package com.replaymod.replay.mixin;
import net.minecraft.client.gui.screen.TitleScreen;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
@Mixin(TitleScreen.class)
public abstract class Mixin_MoveRealmsButton {
@ModifyArg(
method = "init",
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;init(Lnet/minecraft/client/MinecraftClient;II)V"),
index = 2
)
private int adjustRealmsButton(int height) {
return height - 24 * 4;
}
}
//#endif

View File

@@ -5,6 +5,9 @@
"mixins": [],
"server": [],
"client": [
//#if MC>=11600
"Mixin_MoveRealmsButton",
//#endif
//#if MC>=11400
"MixinCamera",
"MixinInGameHud",