Get render module compiling on 1.13

This commit is contained in:
Jonas Herzig
2019-03-01 15:16:59 +01:00
parent 641014b0d1
commit 344a550dc1
38 changed files with 632 additions and 327 deletions

View File

@@ -8,6 +8,7 @@ import com.replaymod.core.handler.MainMenuHandler;
import com.replaymod.core.utils.OpenGLUtils; import com.replaymod.core.utils.OpenGLUtils;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.recording.ReplayModRecording; import com.replaymod.recording.ReplayModRecording;
import com.replaymod.render.ReplayModRender;
import com.replaymod.replay.ReplayModReplay; import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replaystudio.util.I18n; import com.replaymod.replaystudio.util.I18n;
import de.johni0702.minecraft.gui.container.GuiScreen; import de.johni0702.minecraft.gui.container.GuiScreen;
@@ -163,6 +164,7 @@ public class ReplayMod implements Module {
modules.add(this); modules.add(this);
modules.add(new ReplayModRecording(this)); modules.add(new ReplayModRecording(this));
modules.add(new ReplayModReplay(this)); modules.add(new ReplayModReplay(this));
modules.add(new ReplayModRender(this));
//#if MC>=11300 //#if MC>=11300
settingsRegistry.register(); settingsRegistry.register();

View File

@@ -345,8 +345,7 @@ public class MCVer {
return world.playerEntities; return world.playerEntities;
} }
/* FIXME public static GlStateManager.BooleanState fog() {
public static BooleanState fog() {
//#if MC>=11300 //#if MC>=11300
return GlStateManager.FOG.fog; return GlStateManager.FOG.fog;
//#else //#else
@@ -362,7 +361,7 @@ public class MCVer {
//#endif //#endif
} }
public static void fog(BooleanState fog) { public static void fog(GlStateManager.BooleanState fog) {
//#if MC>=11300 //#if MC>=11300
GlStateManager.FOG.fog = fog; GlStateManager.FOG.fog = fog;
//#else //#else
@@ -378,7 +377,7 @@ public class MCVer {
//#endif //#endif
} }
public static BooleanState texture2DState(int index) { public static GlStateManager.BooleanState texture2DState(int index) {
//#if MC>=11300 //#if MC>=11300
return GlStateManager.TEXTURES[index].texture2DState; return GlStateManager.TEXTURES[index].texture2DState;
//#else //#else
@@ -390,7 +389,7 @@ public class MCVer {
//#endif //#endif
} }
public static void texture2DState(int index, BooleanState texture2DState) { public static void texture2DState(int index, GlStateManager.BooleanState texture2DState) {
//#if MC>=11300 //#if MC>=11300
GlStateManager.TEXTURES[index].texture2DState = texture2DState; GlStateManager.TEXTURES[index].texture2DState = texture2DState;
//#else //#else
@@ -401,7 +400,6 @@ public class MCVer {
//#endif //#endif
//#endif //#endif
} }
*/
public static void ServerList_saveSingleServer(ServerData serverData) { public static void ServerList_saveSingleServer(ServerData serverData) {
//#if MC>=10904 //#if MC>=10904
@@ -612,6 +610,14 @@ public class MCVer {
//#endif //#endif
} }
public static long milliTime() {
//#if MC>=11300
return Util.milliTime();
//#else
//$$ return Minecraft.getSystemTime();
//#endif
}
public static File Minecraft_mcDataDir(Minecraft mc) { public static File Minecraft_mcDataDir(Minecraft mc) {
//#if MC>=11300 //#if MC>=11300
return mc.gameDir; return mc.gameDir;

View File

@@ -1,12 +1,12 @@
package com.replaymod.render; package com.replaymod.render;
import com.replaymod.core.versions.MCVer;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import org.lwjgl.util.ReadableColor;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
@@ -15,11 +15,15 @@ import java.util.Optional;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
//#if MC>=11300
import org.apache.maven.artifact.versioning.ComparableVersion;
//#else
//#if MC>=10800 //#if MC>=10800
import net.minecraftforge.fml.common.versioning.ComparableVersion; //$$ import net.minecraftforge.fml.common.versioning.ComparableVersion;
//#else //#else
//$$ import cpw.mods.fml.common.versioning.ComparableVersion; //$$ import cpw.mods.fml.common.versioning.ComparableVersion;
//#endif //#endif
//#endif
@Data @Data
public class RenderSettings { public class RenderSettings {
@@ -170,7 +174,7 @@ public class RenderSettings {
switch (Util.getOSType()) { switch (Util.getOSType()) {
case WINDOWS: case WINDOWS:
// Allow windows users to unpack the ffmpeg archive into a sub-folder of their .minecraft folder // Allow windows users to unpack the ffmpeg archive into a sub-folder of their .minecraft folder
File inDotMinecraft = new File(Minecraft.getMinecraft().mcDataDir, "ffmpeg/bin/ffmpeg.exe"); File inDotMinecraft = new File(MCVer.mcDataDir(MCVer.getMinecraft()), "ffmpeg/bin/ffmpeg.exe");
if (inDotMinecraft.exists()) { if (inDotMinecraft.exists()) {
LOGGER.debug("FFmpeg found in .minecraft/ffmpeg"); LOGGER.debug("FFmpeg found in .minecraft/ffmpeg");
return inDotMinecraft.getAbsolutePath(); return inDotMinecraft.getAbsolutePath();

View File

@@ -1,65 +1,57 @@
package com.replaymod.render; package com.replaymod.render;
import com.replaymod.core.Module;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.render.utils.RenderJob; import com.replaymod.render.utils.RenderJob;
import com.replaymod.replay.events.ReplayCloseEvent; import com.replaymod.replay.events.ReplayCloseEvent;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException;
import net.minecraftforge.common.config.Configuration;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
//#if MC>=10800 //#if MC>=10800
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; //#if MC>=11300
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
//#endif
//#else //#else
//$$ import cpw.mods.fml.common.Mod; //$$ import cpw.mods.fml.common.Mod;
//$$ import cpw.mods.fml.common.event.FMLPreInitializationEvent;
//$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent; //$$ import cpw.mods.fml.common.eventhandler.SubscribeEvent;
//#endif //#endif
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
@Mod(modid = ReplayModRender.MOD_ID, public class ReplayModRender implements Module {
version = "@MOD_VERSION@", { instance = this; }
acceptedMinecraftVersions = "@MC_VERSION@",
acceptableRemoteVersions = "*",
//#if MC>=10800
clientSideOnly = true,
//#endif
useMetadata = true)
public class ReplayModRender {
public static final String MOD_ID = "replaymod-render";
@Mod.Instance(MOD_ID)
public static ReplayModRender instance; public static ReplayModRender instance;
private ReplayMod core; private ReplayMod core;
public static Logger LOGGER; public static Logger LOGGER = LogManager.getLogger();
private Configuration configuration;
private final List<RenderJob> renderQueue = new ArrayList<>(); private final List<RenderJob> renderQueue = new ArrayList<>();
public ReplayModRender(ReplayMod core) {
this.core = core;
core.getSettingsRegistry().register(Setting.class);
}
public ReplayMod getCore() { public ReplayMod getCore() {
return core; return core;
} }
@Mod.EventHandler @Override
public void preInit(FMLPreInitializationEvent event) { public void initClient() {
LOGGER = event.getModLog();
core = ReplayMod.instance;
configuration = new Configuration(event.getSuggestedConfigurationFile());
FML_BUS.register(this); FML_BUS.register(this);
core.getSettingsRegistry().register(Setting.class);
} }
@SubscribeEvent @SubscribeEvent
@@ -69,17 +61,17 @@ public class ReplayModRender {
public File getVideoFolder() { public File getVideoFolder() {
String path = core.getSettingsRegistry().get(Setting.RENDER_PATH); String path = core.getSettingsRegistry().get(Setting.RENDER_PATH);
File folder = new File(path.startsWith("./") ? core.getMinecraft().mcDataDir : null, path); File folder = new File(path.startsWith("./") ? mcDataDir(core.getMinecraft()) : null, path);
try { try {
FileUtils.forceMkdir(folder); FileUtils.forceMkdir(folder);
} catch (IOException e) { } catch (IOException e) {
throw new ReportedException(CrashReport.makeCrashReport(e, "Cannot create video folder.")); throw newReportedException(CrashReport.makeCrashReport(e, "Cannot create video folder."));
} }
return folder; return folder;
} }
public Configuration getConfiguration() { public Path getRenderSettingsPath() {
return configuration; return mcDataDir(core.getMinecraft()).toPath().resolve("config/replaymod-rendersettings.json");
} }
public List<RenderJob> getRenderQueue() { public List<RenderJob> getRenderQueue() {

View File

@@ -1,18 +1,18 @@
package com.replaymod.render; package com.replaymod.render;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.rendering.FrameConsumer; import com.replaymod.render.rendering.FrameConsumer;
import com.replaymod.render.rendering.VideoRenderer; import com.replaymod.render.rendering.VideoRenderer;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import com.replaymod.render.utils.StreamPipe; import com.replaymod.render.utils.StreamPipe;
import net.minecraft.client.Minecraft; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.CommandLine;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.TeeOutputStream; import org.apache.commons.io.output.TeeOutputStream;
import org.lwjgl.util.ReadableDimension;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
@@ -68,7 +68,7 @@ public class VideoWriter implements FrameConsumer<RGBFrame> {
} catch (IOException e) { } catch (IOException e) {
throw new NoFFmpegException(e); throw new NoFFmpegException(e);
} }
File exportLogFile = new File(Minecraft.getMinecraft().mcDataDir, "export.log"); File exportLogFile = new File(MCVer.mcDataDir(MCVer.getMinecraft()), "export.log");
OutputStream exportLogOut = new TeeOutputStream(new FileOutputStream(exportLogFile), ffmpegLog); OutputStream exportLogOut = new TeeOutputStream(new FileOutputStream(exportLogFile), ffmpegLog);
new StreamPipe(process.getInputStream(), exportLogOut).start(); new StreamPipe(process.getInputStream(), exportLogOut).start();
new StreamPipe(process.getErrorStream(), exportLogOut).start(); new StreamPipe(process.getErrorStream(), exportLogOut).start();
@@ -124,9 +124,9 @@ public class VideoWriter implements FrameConsumer<RGBFrame> {
} }
CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame"); CrashReport report = CrashReport.makeCrashReport(t, "Exporting frame");
CrashReportCategory exportDetails = report.makeCategory("Export details"); CrashReportCategory exportDetails = report.makeCategory("Export details");
exportDetails.addCrashSection("Export command", settings.getExportCommand()); MCVer.addDetail(exportDetails, "Export command", settings::getExportCommand);
exportDetails.addCrashSection("Export args", commandArgs); MCVer.addDetail(exportDetails, "Export args", commandArgs::toString);
Minecraft.getMinecraft().crashed(report); MCVer.getMinecraft().crashed(report);
} }
} }

View File

@@ -1,16 +1,16 @@
package com.replaymod.render.capturer; package com.replaymod.render.capturer;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.CubicOpenGlFrame;
import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.frame.ODSOpenGlFrame;
import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.frame.OpenGlFrame;
import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.rendering.FrameCapturer;
import com.replaymod.render.shader.Program; import com.replaymod.render.shader.Program;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.ReadableDimension;
//#if MC>=10800 //#if MC>=10800
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
@@ -38,7 +38,7 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
private final BooleanState[] previousStates = new BooleanState[3]; private final BooleanState[] previousStates = new BooleanState[3];
private final BooleanState previousFogState; private final BooleanState previousFogState;
private final Minecraft mc = Minecraft.getMinecraft(); private final Minecraft mc = MCVer.getMinecraft();
public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo, int frameSize) { public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo, int frameSize) {
RenderInfo fakeInfo = new RenderInfo() { RenderInfo fakeInfo = new RenderInfo() {
@@ -98,7 +98,7 @@ public class ODSFrameCapturer implements FrameCapturer<ODSOpenGlFrame> {
}); });
shaderProgram.stopUsing(); shaderProgram.stopUsing();
} catch (Exception e) { } catch (Exception e) {
throw new ReportedException(CrashReport.makeCrashReport(e, "Creating ODS shaders")); throw newReportedException(CrashReport.makeCrashReport(e, "Creating ODS shaders"));
} }
} }

View File

@@ -1,16 +1,17 @@
package com.replaymod.render.capturer; package com.replaymod.render.capturer;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.frame.OpenGlFrame;
import com.replaymod.render.rendering.Frame; import com.replaymod.render.rendering.Frame;
import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.rendering.FrameCapturer;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.utils.lwjgl.WritableDimension;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Framebuffer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.WritableDimension;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -30,7 +31,7 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
protected int framesDone; protected int framesDone;
private Framebuffer frameBuffer; private Framebuffer frameBuffer;
private final Minecraft mc = Minecraft.getMinecraft(); private final Minecraft mc = MCVer.getMinecraft();
public OpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo) { public OpenGlFrameCapturer(WorldRenderer worldRenderer, RenderInfo renderInfo) {
this.worldRenderer = worldRenderer; this.worldRenderer = worldRenderer;
@@ -64,7 +65,7 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
protected Framebuffer frameBuffer() { protected Framebuffer frameBuffer() {
if (frameBuffer == null) { if (frameBuffer == null) {
frameBuffer = Minecraft.getMinecraft().getFramebuffer(); frameBuffer = mc.getFramebuffer();
} }
return frameBuffer; return frameBuffer;
} }
@@ -113,13 +114,17 @@ public abstract class OpenGlFrameCapturer<F extends Frame, D extends CaptureData
} }
protected void resize(int width, int height) { protected void resize(int width, int height) {
if (width != mc.displayWidth || height != mc.displayHeight) { //#if MC>=11300
setWindowSize(width, height); Framebuffer fb = mc.getFramebuffer();
if (fb.framebufferWidth != width || fb.framebufferHeight != height) {
fb.createFramebuffer(width, height);
} }
} //#else
//$$ if (width != mc.displayWidth || height != mc.displayHeight) {
private void setWindowSize(int width, int height) { //$$ setWindowSize(width, height);
mc.resize(width, height); //$$ mc.resize(width, height);
//$$ }
//#endif
} }
@Override @Override

View File

@@ -1,7 +1,7 @@
package com.replaymod.render.capturer; package com.replaymod.render.capturer;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import org.lwjgl.util.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
public interface RenderInfo { public interface RenderInfo {
ReadableDimension getFrameSize(); ReadableDimension getFrameSize();

View File

@@ -3,9 +3,9 @@ package com.replaymod.render.capturer;
import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.frame.OpenGlFrame;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import com.replaymod.render.utils.PixelBufferObject; import com.replaymod.render.utils.PixelBufferObject;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.OpenGlHelper;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.util.ReadableDimension;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -5,7 +5,11 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
//#if MC>=10800 //#if MC>=10800
import net.minecraftforge.fml.common.eventhandler.Event; //#if MC>=11300
import net.minecraftforge.eventbus.api.Event;
//#else
//$$ import net.minecraftforge.fml.common.eventhandler.Event;
//#endif
//#else //#else
//$$ import cpw.mods.fml.common.eventhandler.Event; //$$ import cpw.mods.fml.common.eventhandler.Event;
//#endif //#endif

View File

@@ -1,9 +1,9 @@
package com.replaymod.render.frame; package com.replaymod.render.frame;
import com.replaymod.render.rendering.Frame; import com.replaymod.render.rendering.Frame;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.lwjgl.util.ReadableDimension;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -1,9 +1,9 @@
package com.replaymod.render.frame; package com.replaymod.render.frame;
import com.replaymod.render.rendering.Frame; import com.replaymod.render.rendering.Frame;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.lwjgl.util.ReadableDimension;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -13,11 +13,12 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.util.ReportedException;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.Consumer; import java.util.function.Consumer;
import static com.replaymod.core.versions.MCVer.addDetail;
import static com.replaymod.core.versions.MCVer.newReportedException;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
public class GuiExportFailed extends GuiScreen { public class GuiExportFailed extends GuiScreen {
@@ -31,9 +32,9 @@ public class GuiExportFailed extends GuiScreen {
// If they haven't, then this is probably a faulty ffmpeg installation and there's nothing we can do // If they haven't, then this is probably a faulty ffmpeg installation and there's nothing we can do
CrashReport crashReport = CrashReport.makeCrashReport(e, "Exporting video"); CrashReport crashReport = CrashReport.makeCrashReport(e, "Exporting video");
CrashReportCategory details = crashReport.makeCategory("Export details"); CrashReportCategory details = crashReport.makeCategory("Export details");
details.addCrashSection("Settings", settings); addDetail(details, "Settings", settings::toString);
details.addCrashSection("FFmpeg log", e.getLog()); addDetail(details, "FFmpeg log", e::getLog);
throw new ReportedException(crashReport); throw newReportedException(crashReport);
} else { } else {
// If they have, ask them whether it was intentional // If they have, ask them whether it was intentional
GuiExportFailed gui = new GuiExportFailed(e, doRestart); GuiExportFailed gui = new GuiExportFailed(e, doRestart);

View File

@@ -27,10 +27,10 @@ import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.popup.AbstractGuiPopup; import de.johni0702.minecraft.gui.popup.AbstractGuiPopup;
import de.johni0702.minecraft.gui.popup.GuiYesNoPopup; import de.johni0702.minecraft.gui.popup.GuiYesNoPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.gui.GuiErrorScreen; import net.minecraft.client.gui.GuiErrorScreen;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; import java.util.List;

View File

@@ -28,18 +28,21 @@ import de.johni0702.minecraft.gui.popup.GuiFileChooserPopup;
import de.johni0702.minecraft.gui.utils.Colors; import de.johni0702.minecraft.gui.utils.Colors;
import de.johni0702.minecraft.gui.utils.Consumer; import de.johni0702.minecraft.gui.utils.Consumer;
import de.johni0702.minecraft.gui.utils.Utils; import de.johni0702.minecraft.gui.utils.Utils;
import de.johni0702.minecraft.gui.utils.lwjgl.Color;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.gui.GuiErrorScreen; import net.minecraft.client.gui.GuiErrorScreen;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraftforge.common.config.Configuration;
import net.minecraftforge.common.config.Property;
import org.lwjgl.util.Color;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableColor;
import org.lwjgl.util.ReadableDimension;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
@@ -294,7 +297,14 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
this.replayHandler = replayHandler; this.replayHandler = replayHandler;
this.timeline = timeline; this.timeline = timeline;
String json = getConfigProperty(ReplayModRender.instance.getConfiguration()).getString(); Path path = ReplayModRender.instance.getRenderSettingsPath();
String json = "{}";
try {
json = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
} catch (FileNotFoundException ignored) {
} catch (IOException e) {
LOGGER.error("Reading render settings:", e);
}
RenderSettings settings = new GsonBuilder() RenderSettings settings = new GsonBuilder()
.registerTypeAdapter(RenderSettings.class, (InstanceCreator<RenderSettings>) type -> getDefaultRenderSettings()) .registerTypeAdapter(RenderSettings.class, (InstanceCreator<RenderSettings>) type -> getDefaultRenderSettings())
.registerTypeAdapter(ReadableColor.class, new Gson().getAdapter(Color.class)) .registerTypeAdapter(ReadableColor.class, new Gson().getAdapter(Color.class))
@@ -506,14 +516,12 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
public void close() { public void close() {
RenderSettings settings = save(true); RenderSettings settings = save(true);
String json = new Gson().toJson(settings); String json = new Gson().toJson(settings);
Configuration config = ReplayModRender.instance.getConfiguration(); Path path = ReplayModRender.instance.getRenderSettingsPath();
getConfigProperty(config).set(json); try {
config.save(); Files.write(path, json.getBytes(StandardCharsets.UTF_8));
} } catch (IOException e) {
LOGGER.error("Saving render settings:", e);
protected Property getConfigProperty(Configuration configuration) { }
return configuration.get("rendersettings", "settings", "{}",
"Last state of the render settings GUI. Internal use only.");
} }
public ReplayHandler getReplayHandler() { public ReplayHandler getReplayHandler() {

View File

@@ -1,6 +1,7 @@
package com.replaymod.render.gui; package com.replaymod.render.gui;
import com.replaymod.core.SettingsRegistry; import com.replaymod.core.SettingsRegistry;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.ReplayModRender; import com.replaymod.render.ReplayModRender;
import com.replaymod.render.Setting; import com.replaymod.render.Setting;
@@ -13,13 +14,8 @@ import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.layout.VerticalLayout; import de.johni0702.minecraft.gui.layout.VerticalLayout;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.util.Util;
import org.apache.logging.log4j.LogManager;
import org.lwjgl.Sys;
import java.awt.*;
import java.io.File; import java.io.File;
import java.io.IOException;
@RequiredArgsConstructor @RequiredArgsConstructor
public class GuiRenderingDone extends GuiScreen { public class GuiRenderingDone extends GuiScreen {
@@ -34,30 +30,7 @@ public class GuiRenderingDone extends GuiScreen {
public final GuiButton openFolder = new GuiButton().onClick(new Runnable() { public final GuiButton openFolder = new GuiButton().onClick(new Runnable() {
@Override @Override
public void run() { public void run() {
File folder = videoFile.getParentFile(); MCVer.openFile(videoFile.getParentFile());
String path = folder.getAbsolutePath();
// First try OS specific methods
try {
switch (Util.getOSType()) {
case WINDOWS:
Runtime.getRuntime().exec(String.format("cmd.exe /C start \"Open file\" \"%s\"", path));
return;
case OSX:
Runtime.getRuntime().exec(new String[]{"/usr/bin/open", path});
return;
}
} catch (IOException e) {
LogManager.getLogger().error("Cannot open file", e);
}
// Otherwise try the java way
try {
Desktop.getDesktop().browse(folder.toURI());
} catch (Throwable throwable) {
// And if all fails, lwjgl
Sys.openURL("file://" + path);
}
} }
}).setSize(200, 20).setI18nLabel("replaymod.gui.openfolder"); }).setSize(200, 20).setI18nLabel("replaymod.gui.openfolder");

View File

@@ -14,12 +14,13 @@ import de.johni0702.minecraft.gui.element.advanced.GuiProgressBar;
import de.johni0702.minecraft.gui.function.Tickable; import de.johni0702.minecraft.gui.function.Tickable;
import de.johni0702.minecraft.gui.layout.CustomLayout; import de.johni0702.minecraft.gui.layout.CustomLayout;
import de.johni0702.minecraft.gui.layout.HorizontalLayout; import de.johni0702.minecraft.gui.layout.HorizontalLayout;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint;
import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.DynamicTexture;
import net.minecraft.client.renderer.texture.NativeImage;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.lwjgl.util.Dimension;
import org.lwjgl.util.ReadableDimension;
import org.lwjgl.util.ReadablePoint;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -228,7 +229,11 @@ public class GuiVideoRenderer extends GuiScreen implements Tickable {
final int videoHeight = videoSize.getHeight(); final int videoHeight = videoSize.getHeight();
if (previewTexture == null) { if (previewTexture == null) {
previewTexture = new DynamicTexture(videoWidth, videoHeight); //#if MC>=11300
previewTexture = new DynamicTexture(videoWidth, videoHeight, true);
//#else
//$$ previewTexture = new DynamicTexture(videoWidth, videoHeight);
//#endif
} }
if (previewTextureDirty) { if (previewTextureDirty) {
@@ -262,13 +267,24 @@ public class GuiVideoRenderer extends GuiScreen implements Tickable {
ByteBuffer buffer = frame.getByteBuffer(); ByteBuffer buffer = frame.getByteBuffer();
buffer.mark(); buffer.mark();
synchronized (this) { synchronized (this) {
int[] data = previewTexture.getTextureData(); //#if MC>=11300
// Optifine changes the texture data array to be three times as long (for use by shaders), NativeImage data = previewTexture.getTextureData();
// we only want to initialize the first third which is why we use the length of the buffer instead assert data != null;
// of the length of the data array for (int x = 0; x < data.getWidth(); x++) {
for (int i = 0; buffer.remaining() > 0; i++) { for (int y = 0; y < data.getHeight(); y++) {
data[i] = 0xff << 24 | (buffer.get() & 0xff) << 16 | (buffer.get() & 0xff) << 8 | (buffer.get() & 0xff); int value = 0xff << 24 | (buffer.get() & 0xff) << 16 | (buffer.get() & 0xff) << 8 | (buffer.get() & 0xff);
data.setPixelRGBA(x, y, value);
}
} }
//#else
//$$ int[] data = previewTexture.getTextureData();
//$$ // Optifine changes the texture data array to be three times as long (for use by shaders),
//$$ // we only want to initialize the first third which is why we use the length of the buffer instead
//$$ // of the length of the data array
//$$ for (int i = 0; buffer.remaining() > 0; i++) {
//$$ data[i] = 0xff << 24 | (buffer.get() & 0xff) << 16 | (buffer.get() & 0xff) << 8 | (buffer.get() & 0xff);
//$$ }
//#endif
previewTextureDirty = true; previewTextureDirty = true;
} }
buffer.reset(); buffer.reset();

View File

@@ -3,8 +3,6 @@ package com.replaymod.render.hooks;
import com.replaymod.render.utils.JailingQueue; import com.replaymod.render.utils.JailingQueue;
import net.minecraft.client.renderer.RegionRenderCacheBuilder; import net.minecraft.client.renderer.RegionRenderCacheBuilder;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator;
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
import net.minecraft.client.renderer.chunk.ChunkRenderWorker; import net.minecraft.client.renderer.chunk.ChunkRenderWorker;
import net.minecraft.client.renderer.chunk.RenderChunk; import net.minecraft.client.renderer.chunk.RenderChunk;
@@ -12,6 +10,14 @@ import net.minecraft.client.renderer.chunk.RenderChunk;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Iterator; import java.util.Iterator;
//#if MC>=11300
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.renderer.chunk.ChunkRenderTask;
//#else
//$$ import net.minecraft.client.renderer.RenderGlobal;
//$$ import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator;
//#endif
//#if MC>=10904 //#if MC>=10904
import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.PriorityBlockingQueue;
//#else //#else
@@ -22,14 +28,28 @@ import static com.replaymod.core.versions.MCVer.*;
public class ChunkLoadingRenderGlobal { public class ChunkLoadingRenderGlobal {
private final RenderGlobal hooked; //#if MC>=11300
private final WorldRenderer hooked;
//#else
//$$ private final RenderGlobal hooked;
//#endif
private ChunkRenderDispatcher renderDispatcher; private ChunkRenderDispatcher renderDispatcher;
private JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue; //#if MC>=11300
private JailingQueue<ChunkRenderTask> workerJailingQueue;
//#else
//$$ private JailingQueue<ChunkCompileTaskGenerator> workerJailingQueue;
//#endif
private CustomChunkRenderWorker renderWorker; private CustomChunkRenderWorker renderWorker;
private int frame; private int frame;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public ChunkLoadingRenderGlobal(RenderGlobal renderGlobal) { public ChunkLoadingRenderGlobal(
//#if MC>=11300
WorldRenderer renderGlobal
//#else
//$$ RenderGlobal renderGlobal
//#endif
) {
this.hooked = renderGlobal; this.hooked = renderGlobal;
setup(renderGlobal.renderDispatcher); setup(renderGlobal.renderDispatcher);
@@ -51,14 +71,22 @@ public class ChunkLoadingRenderGlobal {
int workerThreads = renderDispatcher.listThreadedWorkers.size(); int workerThreads = renderDispatcher.listThreadedWorkers.size();
//#if MC>=10904 //#if MC>=10904
PriorityBlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates; //#if MC>=11300
PriorityBlockingQueue<ChunkRenderTask> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#else
//$$ PriorityBlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#endif
//#else //#else
//$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates; //$$ BlockingQueue<ChunkCompileTaskGenerator> queueChunkUpdates = renderDispatcher.queueChunkUpdates;
//#endif //#endif
workerJailingQueue = new JailingQueue<>(queueChunkUpdates); workerJailingQueue = new JailingQueue<>(queueChunkUpdates);
renderDispatcher.queueChunkUpdates = workerJailingQueue; renderDispatcher.queueChunkUpdates = workerJailingQueue;
//#if MC>=10904 //#if MC>=10904
ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0); //#if MC>=11300
ChunkRenderTask element = new ChunkRenderTask(null, null, 0);
//#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null, 0);
//#endif
//#else //#else
//$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null); //$$ ChunkCompileTaskGenerator element = new ChunkCompileTaskGenerator(null, null);
//#endif //#endif
@@ -75,7 +103,11 @@ public class ChunkLoadingRenderGlobal {
renderDispatcher.queueChunkUpdates = queueChunkUpdates; renderDispatcher.queueChunkUpdates = queueChunkUpdates;
try { try {
Field hookField = RenderGlobal.class.getField("replayModRender_hook"); //#if MC>=11300
Field hookField = WorldRenderer.class.getField("replayModRender_hook");
//#else
//$$ Field hookField = RenderGlobal.class.getField("replayModRender_hook");
//#endif
hookField.set(hooked, this); hookField.set(hooked, this);
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
throw new Error(e); throw new Error(e);
@@ -119,7 +151,11 @@ public class ChunkLoadingRenderGlobal {
workerJailingQueue.freeAll(); workerJailingQueue.freeAll();
try { try {
Field hookField = RenderGlobal.class.getField("replayModRender_hook"); //#if MC>=11300
Field hookField = WorldRenderer.class.getField("replayModRender_hook");
//#else
//$$ Field hookField = RenderGlobal.class.getField("replayModRender_hook");
//#endif
hookField.set(hooked, null); hookField.set(hooked, null);
} catch (NoSuchFieldException | IllegalAccessException e) { } catch (NoSuchFieldException | IllegalAccessException e) {
throw new Error(e); throw new Error(e);
@@ -139,7 +175,13 @@ public class ChunkLoadingRenderGlobal {
} }
@Override @Override
protected void processTask(ChunkCompileTaskGenerator p_178474_1_) throws InterruptedException { protected void processTask(
//#if MC>=11300
ChunkRenderTask p_178474_1_
//#else
//$$ ChunkCompileTaskGenerator p_178474_1_
//#endif
) throws InterruptedException {
super.processTask(p_178474_1_); super.processTask(p_178474_1_);
} }
} }

View File

@@ -1,5 +1,6 @@
package com.replaymod.render.hooks; package com.replaymod.render.hooks;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CaptureData; import com.replaymod.render.capturer.CaptureData;
import com.replaymod.render.capturer.RenderInfo; import com.replaymod.render.capturer.RenderInfo;
@@ -8,8 +9,12 @@ import lombok.Getter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
//#if MC>=10800 //#if MC>=10800
import net.minecraft.client.renderer.GlStateManager; //#if MC>=11300
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.hooks.BasicEventHooks;
//#else
//$$ import net.minecraft.client.renderer.GlStateManager;
//$$ import net.minecraftforge.fml.common.FMLCommonHandler;
//#endif
//#else //#else
//$$ import com.replaymod.core.versions.MCVer.GlStateManager; //$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//$$ import cpw.mods.fml.common.FMLCommonHandler; //$$ import cpw.mods.fml.common.FMLCommonHandler;
@@ -18,7 +23,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler;
import java.io.IOException; import java.io.IOException;
public class EntityRendererHandler implements WorldRenderer { public class EntityRendererHandler implements WorldRenderer {
public final Minecraft mc = Minecraft.getMinecraft(); public final Minecraft mc = MCVer.getMinecraft();
@Getter @Getter
protected final RenderSettings settings; protected final RenderSettings settings;
@@ -44,21 +49,33 @@ public class EntityRendererHandler implements WorldRenderer {
} }
public void renderWorld(float partialTicks, long finishTimeNano) { public void renderWorld(float partialTicks, long finishTimeNano) {
FMLCommonHandler.instance().onRenderTickStart(partialTicks); //#if MC>=11300
BasicEventHooks.onRenderTickStart(partialTicks);
mc.entityRenderer.updateLightmap(partialTicks); //#else
//$$ FMLCommonHandler.instance().onRenderTickStart(partialTicks);
GlStateManager.enableDepth(); //#endif
GlStateManager.enableAlpha();
GlStateManager.alphaFunc(516, 0.5F);
//#if MC>=11300
mc.entityRenderer.renderWorld(partialTicks, finishTimeNano);
//#else
//$$ mc.entityRenderer.updateLightmap(partialTicks);
//$$
//$$ GlStateManager.enableDepth();
//$$ GlStateManager.enableAlpha();
//$$ GlStateManager.alphaFunc(516, 0.5F);
//$$
//#if MC>=10800 //#if MC>=10800
mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano); //$$ mc.entityRenderer.renderWorldPass(2, partialTicks, finishTimeNano);
//#else //#else
//$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano); //$$ mc.entityRenderer.renderWorld(partialTicks, finishTimeNano);
//#endif //#endif
//#endif
FMLCommonHandler.instance().onRenderTickEnd(partialTicks); //#if MC>=11300
BasicEventHooks.onRenderTickEnd(partialTicks);
//#else
//$$ FMLCommonHandler.instance().onRenderTickEnd(partialTicks);
//#endif
} }
@Override @Override

View File

@@ -5,9 +5,9 @@ import com.coremedia.iso.boxes.*;
import com.google.common.primitives.Bytes; import com.google.common.primitives.Bytes;
import com.googlecode.mp4parser.BasicContainer; import com.googlecode.mp4parser.BasicContainer;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import org.apache.commons.io.FileUtils; import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.lwjgl.util.Dimension;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;

View File

@@ -1,20 +1,17 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.RenderSettings; import com.replaymod.render.RenderSettings;
import com.replaymod.render.capturer.CubicOpenGlFrameCapturer; import com.replaymod.render.capturer.CubicOpenGlFrameCapturer;
import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer; import com.replaymod.render.capturer.StereoscopicOpenGlFrameCapturer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import com.replaymod.replay.camera.CameraEntity; import com.replaymod.replay.camera.CameraEntity;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableColor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.EntityRenderer; import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.settings.GameSettings;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.util.ReadableColor;
import org.lwjgl.util.glu.Project;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -22,6 +19,16 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11300
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.client.GameSettings;
//#else
//$$ import net.minecraft.client.renderer.EntityRenderer;
//$$ import net.minecraft.client.renderer.RenderGlobal;
//$$ import net.minecraft.client.settings.GameSettings;
//#endif
//#if MC>=10904 //#if MC>=10904
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
//#else //#else
@@ -31,12 +38,17 @@ import net.minecraft.util.math.RayTraceResult;
//#if MC>=10800 //#if MC>=10800
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
//#else //#else
//$$ import net.minecraft.entity.EntityLivingBase;
//$$ import com.replaymod.core.versions.MCVer.GlStateManager; //$$ import com.replaymod.core.versions.MCVer.GlStateManager;
//#endif //#endif
import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.core.versions.MCVer.*;
@Mixin(value = EntityRenderer.class) //#if MC>=11300
@Mixin(value = GameRenderer.class)
//#else
//$$ @Mixin(value = EntityRenderer.class)
//#endif
public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective { public abstract class MixinEntityRenderer implements EntityRendererHandler.IEntityRenderer, EntityRendererHandler.GluPerspective {
@Shadow @Shadow
public Minecraft mc; public Minecraft mc;
@@ -75,7 +87,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "orientCamera", at = @At("HEAD")) @Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) { private void replayModRender_resetRotationIfNeeded(float partialTicks, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); Entity entity = getRenderViewEntity(MCVer.getMinecraft());
RenderSettings settings = replayModRender_handler.getSettings(); RenderSettings settings = replayModRender_handler.getSettings();
if (settings.isStabilizeYaw()) { if (settings.isStabilizeYaw()) {
entity.prevRotationYaw = entity.rotationYaw = 0; entity.prevRotationYaw = entity.rotationYaw = 0;
@@ -98,7 +110,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("HEAD")) @Inject(method = "setupCameraTransform", at = @At("HEAD"))
private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_beforeSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); Entity entity = getRenderViewEntity(MCVer.getMinecraft());
orgYaw = entity.rotationYaw; orgYaw = entity.rotationYaw;
orgPitch = entity.rotationPitch; orgPitch = entity.rotationPitch;
orgPrevYaw = entity.prevRotationYaw; orgPrevYaw = entity.prevRotationYaw;
@@ -110,7 +122,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Inject(method = "setupCameraTransform", at = @At("RETURN")) @Inject(method = "setupCameraTransform", at = @At("RETURN"))
private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_afterSetupCameraTransform(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_handler != null) { if (replayModRender_handler != null) {
Entity entity = getRenderViewEntity(Minecraft.getMinecraft()); Entity entity = getRenderViewEntity(MCVer.getMinecraft());
entity.rotationYaw = orgYaw; entity.rotationYaw = orgYaw;
entity.rotationPitch = orgPitch; entity.rotationPitch = orgPitch;
entity.prevRotationYaw = orgPrevYaw; entity.prevRotationYaw = orgPrevYaw;
@@ -128,7 +140,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
ci.cancel(); ci.cancel();
return; // No spectator hands during 360° view, we wouldn't even know where to put it return; // No spectator hands during 360° view, we wouldn't even know where to put it
} }
Entity currentEntity = getRenderViewEntity(Minecraft.getMinecraft()); Entity currentEntity = getRenderViewEntity(MCVer.getMinecraft());
if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) { if (currentEntity instanceof EntityPlayer && !(currentEntity instanceof CameraEntity)) {
if (renderPass == 2) { // Need to update render pass if (renderPass == 2) { // Need to update render pass
renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0; renderPass = replayModRender_handler.data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE ? 1 : 0;
@@ -142,9 +154,13 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
@Shadow @Shadow
public abstract void renderHand(float partialTicks, int renderPass); public abstract void renderHand(float partialTicks, int renderPass);
//#if MC>=11300
@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
private void replayModRender_drawSelectionBox(WorldRenderer instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else
//#if MC>=10904 //#if MC>=10904
@Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V")) //$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/math/RayTraceResult;IF)V"))
private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) { //$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, RayTraceResult rtr, int alwaysZero, float partialTicks) {
//#else //#else
//#if MC>=10800 //#if MC>=10800
//$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) //$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V"))
@@ -152,6 +168,7 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V")) //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;drawSelectionBox(Lnet/minecraft/entity/player/EntityPlayer;Lnet/minecraft/util/MovingObjectPosition;IF)V"))
//#endif //#endif
//$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) { //$$ private void replayModRender_drawSelectionBox(RenderGlobal instance, EntityPlayer player, MovingObjectPosition rtr, int alwaysZero, float partialTicks) {
//#endif
//#endif //#endif
if (replayModRender_handler == null) { if (replayModRender_handler == null) {
instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks); instance.drawSelectionBox(player, rtr, alwaysZero, partialTicks);
@@ -160,38 +177,51 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private int orgRenderDistanceChunks; private int orgRenderDistanceChunks;
//#if MC>=11300
@Inject(method = "updateCameraAndRender", at = @At(value = "JUMP", ordinal = 0))
//#else
//#if MC>=10800 //#if MC>=10800
@Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0)) //$$ @Inject(method = "renderWorldPass", at = @At(value = "JUMP", ordinal = 0))
//#else //#else
//$$ @Inject(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 0, shift = At.Shift.AFTER, //$$ @Inject(method = "renderWorld", at = @At(value = "INVOKE", ordinal = 0, shift = At.Shift.AFTER,
//$$ target = "Lnet/minecraft/client/renderer/culling/ClippingHelperImpl;getInstance()Lnet/minecraft/client/renderer/culling/ClippingHelper;")) //$$ target = "Lnet/minecraft/client/renderer/culling/ClippingHelperImpl;getInstance()Lnet/minecraft/client/renderer/culling/ClippingHelper;"))
//#endif //#endif
//#endif
private void replayModRender_beforeRenderSky(CallbackInfo ci) { private void replayModRender_beforeRenderSky(CallbackInfo ci) {
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
GameSettings settings = Minecraft.getMinecraft().gameSettings; GameSettings settings = MCVer.getMinecraft().gameSettings;
orgRenderDistanceChunks = settings.renderDistanceChunks; orgRenderDistanceChunks = settings.renderDistanceChunks;
settings.renderDistanceChunks = 5; // Set render distance to 5 so we're always rendering sky when chroma keying settings.renderDistanceChunks = 5; // Set render distance to 5 so we're always rendering sky when chroma keying
} }
} }
//#if MC>=11300
@Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/WorldRenderer;renderSky(F)V"))
private void replayModRender_renderSky(WorldRenderer instance, float partialTicks) {
//#else
//#if MC>=10800 //#if MC>=10800
@Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(FI)V")) //$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(FI)V"))
private void replayModRender_renderSky(RenderGlobal instance, float partialTicks, int renderPass) { //$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks, int renderPass) {
//#else //#else
//$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(F)V")) //$$ @Redirect(method = "renderWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/RenderGlobal;renderSky(F)V"))
//$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks) { //$$ private void replayModRender_renderSky(RenderGlobal instance, float partialTicks) {
//#endif
//#endif //#endif
if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) { if (replayModRender_handler != null && replayModRender_handler.getSettings().getChromaKeyingColor() != null) {
Minecraft.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks; MCVer.getMinecraft().gameSettings.renderDistanceChunks = orgRenderDistanceChunks;
ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor(); ReadableColor color = replayModRender_handler.getSettings().getChromaKeyingColor();
GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1); GlStateManager.clearColor(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, 1);
GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT); GlStateManager.clear(GL11.GL_COLOR_BUFFER_BIT);
} else { } else {
//#if MC>=11300
instance.renderSky(partialTicks);
//#else
//#if MC>=10800 //#if MC>=10800
instance.renderSky(partialTicks, renderPass); //$$ instance.renderSky(partialTicks, renderPass);
//#else //#else
//$$ instance.renderSky(partialTicks); //$$ instance.renderSky(partialTicks);
//#endif //#endif
//#endif
} }
} }
@@ -207,9 +237,9 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_setupStereoscopicProjection(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
GlStateManager.translate(0.07, 0, 0); GL11.glTranslatef(0.07f, 0, 0);
} else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) {
GlStateManager.translate(-0.07, 0, 0); GL11.glTranslatef(-0.07f, 0, 0);
} }
} }
} }
@@ -222,9 +252,9 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) { private void replayModRender_setupStereoscopicModelView(float partialTicks, int renderPass, CallbackInfo ci) {
if (replayModRender_getHandler() != null) { if (replayModRender_getHandler() != null) {
if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) { if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.LEFT_EYE) {
GlStateManager.translate(0.1, 0, 0); GL11.glTranslatef(0.1f, 0, 0);
} else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) { } else if (replayModRender_getHandler().data == StereoscopicOpenGlFrameCapturer.Data.RIGHT_EYE) {
GlStateManager.translate(-0.1, 0, 0); GL11.glTranslatef(-0.1f, 0, 0);
} }
} }
} }
@@ -233,63 +263,84 @@ public abstract class MixinEntityRenderer implements EntityRendererHandler.IEnti
* Cubic Renderer * Cubic Renderer
*/ */
@Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) //#if MC>=11300
private void replayModRender_gluPerspective$0(float fovY, float aspect, float zNear, float zFar) { @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)V"))
replayModRender_gluPerspective(fovY, aspect, zNear, zFar); private void replayModRender_gluPerspective$0(double fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective((float) fovY, aspect, zNear, zFar);
} }
//#if MC>=10800 @Redirect(method = "updateCameraAndRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/Matrix4f;perspective(DFFF)V"))
@Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false)) private void replayModRender_gluPerspective$1(double fovY, float aspect, float zNear, float zFar) {
//#else replayModRender_gluPerspective((float) fovY, aspect, zNear, zFar);
//$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//#endif
private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
} }
//#if MC>=10800
@Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) {
replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
}
//#endif
@Override @Override
public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) { public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
fovY = 90; fovY = 90;
aspect = 1; aspect = 1;
} }
Project.gluPerspective(fovY, aspect, zNear, zFar); Matrix4f.perspective(fovY, aspect, zNear, zFar);
} }
//#else
//$$ @Redirect(method = "setupCameraTransform", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//$$ private void replayModRender_gluPerspective$0(float fovY, float aspect, float zNear, float zFar) {
//$$ replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
//$$ }
//$$
//#if MC>=10800
//$$ @Redirect(method = "renderWorldPass", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//#else
//$$ @Redirect(method = "renderHand", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//#endif
//$$ private void replayModRender_gluPerspective$1(float fovY, float aspect, float zNear, float zFar) {
//$$ replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
//$$ }
//$$
//#if MC>=10800
//$$ @Redirect(method = "renderCloudsCheck", at = @At(value = "INVOKE", target = "Lorg/lwjgl/util/glu/Project;gluPerspective(FFFF)V", remap = false))
//$$ private void replayModRender_gluPerspective$2(float fovY, float aspect, float zNear, float zFar) {
//$$ replayModRender_gluPerspective(fovY, aspect, zNear, zFar);
//$$ }
//#endif
//$$
//$$ @Override
//$$ public void replayModRender_gluPerspective(float fovY, float aspect, float zNear, float zFar) {
//$$ if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
//$$ fovY = 90;
//$$ aspect = 1;
//$$ }
//$$ Project.gluPerspective(fovY, aspect, zNear, zFar);
//$$ }
//#endif
@Inject(method = "orientCamera", at = @At("HEAD")) @Inject(method = "orientCamera", at = @At("HEAD"))
private void replayModRender_setupCubicFrameRotation(float partialTicks, CallbackInfo ci) { private void replayModRender_setupCubicFrameRotation(float partialTicks, CallbackInfo ci) {
if (replayModRender_getHandler() != null && replayModRender_getHandler().data instanceof CubicOpenGlFrameCapturer.Data) { if (replayModRender_getHandler() != null && replayModRender_getHandler().data instanceof CubicOpenGlFrameCapturer.Data) {
switch ((CubicOpenGlFrameCapturer.Data) replayModRender_getHandler().data) { switch ((CubicOpenGlFrameCapturer.Data) replayModRender_getHandler().data) {
case FRONT: case FRONT:
GlStateManager.rotate(0, 0.0F, 1.0F, 0.0F); GL11.glRotatef(0, 0.0F, 1.0F, 0.0F);
break; break;
case RIGHT: case RIGHT:
GlStateManager.rotate(90, 0.0F, 1.0F, 0.0F); GL11.glRotatef(90, 0.0F, 1.0F, 0.0F);
break; break;
case BACK: case BACK:
GlStateManager.rotate(180, 0.0F, 1.0F, 0.0F); GL11.glRotatef(180, 0.0F, 1.0F, 0.0F);
break; break;
case LEFT: case LEFT:
GlStateManager.rotate(-90, 0.0F, 1.0F, 0.0F); GL11.glRotatef(-90, 0.0F, 1.0F, 0.0F);
break; break;
case BOTTOM: case BOTTOM:
GlStateManager.rotate(90, 1.0F, 0.0F, 0.0F); GL11.glRotatef(90, 1.0F, 0.0F, 0.0F);
break; break;
case TOP: case TOP:
GlStateManager.rotate(-90, 1.0F, 0.0F, 0.0F); GL11.glRotatef(-90, 1.0F, 0.0F, 0.0F);
break; break;
} }
} }
if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) { if (replayModRender_getHandler() != null && replayModRender_getHandler().omnidirectional) {
// Minecraft goes back a little so we have to revert that // Minecraft goes back a little so we have to revert that
GlStateManager.translate(0.0F, 0.0F, 0.1F); GL11.glTranslatef(0.0F, 0.0F, 0.1F);
} }
} }
} }

View File

@@ -1,7 +1,7 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@@ -21,7 +21,7 @@ import net.minecraft.client.renderer.culling.Frustum;
public abstract class MixinFrustum { public abstract class MixinFrustum {
@Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true) @Inject(method = "isBoxInFrustum", at = @At("HEAD"), cancellable = true)
public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable<Boolean> ci) { public void isBoxInFrustum(double minX, double minY, double minZ, double maxX, double maxY, double maxZ, CallbackInfoReturnable<Boolean> ci) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler != null && handler.omnidirectional && handler.data == null) { if (handler != null && handler.omnidirectional && handler.data == null) {
// Normally the camera is always facing the direction of the omnidirectional image face that is currently // Normally the camera is always facing the direction of the omnidirectional image face that is currently
// getting rendered. With ODS however, the camera is always facing forwards and the turning happens in the // getting rendered. With ODS however, the camera is always facing forwards and the turning happens in the

View File

@@ -1,8 +1,8 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
//#if MC>=10904 //#if MC>=10904
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.ParticleManager; import net.minecraft.client.particle.ParticleManager;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@@ -46,7 +46,7 @@ public abstract class MixinParticleManager {
//$$ private void renderParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks, //$$ private void renderParticle(Particle particle, VertexBuffer vertexBuffer, Entity view, float partialTicks,
//#endif //#endif
float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) { float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler != null && handler.omnidirectional) { if (handler != null && handler.omnidirectional) {
// Align all particles towards the camera // Align all particles towards the camera
double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * partialTicks - view.posX; double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * partialTicks - view.posX;

View File

@@ -1,7 +1,7 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.Render; import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
public abstract class MixinRender { public abstract class MixinRender {
@Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true) @Inject(method = "renderLivingLabel", at = @At("HEAD"), cancellable = true)
private void replayModRender_areAllNamesHidden(Entity entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) { private void replayModRender_areAllNamesHidden(Entity entityIn, String str, double x, double y, double z, int maxDistance, CallbackInfo ci) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler != null && !handler.getSettings().isRenderNameTags()) { if (handler != null && !handler.getSettings().isRenderNameTags()) {
ci.cancel(); ci.cancel();
} }

View File

@@ -2,7 +2,6 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher;
import net.minecraft.client.renderer.culling.ICamera; import net.minecraft.client.renderer.culling.ICamera;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@@ -10,16 +9,25 @@ import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
//#if MC>=11300
import net.minecraft.client.renderer.WorldRenderer;
//#else
//$$ import net.minecraft.client.renderer.RenderGlobal;
//#endif
//#if MC<10904 //#if MC<10904
//$$ import net.minecraft.client.renderer.chunk.RenderChunk; //$$ import net.minecraft.client.renderer.chunk.RenderChunk;
//$$ import net.minecraft.util.BlockPos; //$$ import net.minecraft.util.BlockPos;
//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
//#endif //#endif
@Mixin(RenderGlobal.class) //#if MC>=11300
@Mixin(WorldRenderer.class)
//#else
//$$ @Mixin(RenderGlobal.class)
//#endif
public abstract class MixinRenderGlobal { public abstract class MixinRenderGlobal {
public ChunkLoadingRenderGlobal replayModRender_hook; public ChunkLoadingRenderGlobal replayModRender_hook;
private boolean replayModRender_passThroughSetupTerrain; private boolean replayModRender_passThroughSetupTerrain;

View File

@@ -1,7 +1,7 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -29,7 +29,7 @@ public abstract class MixinRenderManager {
//#else //#else
//$$ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable<Boolean> ci) { //$$ private void replayModRender_reorientForCubicRendering(Entity entity, double dx, double dy, double dz, float iDoNotKnow, float partialTicks, boolean iDoNotCare, CallbackInfoReturnable<Boolean> ci) {
//#endif //#endif
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) Minecraft.getMinecraft().entityRenderer).replayModRender_getHandler(); EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().entityRenderer).replayModRender_getHandler();
if (handler != null && handler.omnidirectional) { if (handler != null && handler.omnidirectional) {
double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz)); double pitch = -Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
double yaw = -Math.atan2(dx, dz); double yaw = -Math.atan2(dx, dz);

View File

@@ -3,7 +3,7 @@ package com.replaymod.render.processor;
import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.CubicOpenGlFrame;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import org.lwjgl.util.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -3,9 +3,9 @@ package com.replaymod.render.processor;
import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.CubicOpenGlFrame;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import lombok.Getter; import lombok.Getter;
import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.Validate;
import org.lwjgl.util.Dimension;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -3,8 +3,8 @@ package com.replaymod.render.processor;
import com.replaymod.render.frame.ODSOpenGlFrame; import com.replaymod.render.frame.ODSOpenGlFrame;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import org.lwjgl.util.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import org.lwjgl.util.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -2,7 +2,7 @@ package com.replaymod.render.processor;
import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.frame.OpenGlFrame;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import org.lwjgl.util.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -3,8 +3,8 @@ package com.replaymod.render.processor;
import com.replaymod.render.frame.RGBFrame; import com.replaymod.render.frame.RGBFrame;
import com.replaymod.render.frame.StereoscopicOpenGlFrame; import com.replaymod.render.frame.StereoscopicOpenGlFrame;
import com.replaymod.render.utils.ByteBufferPool; import com.replaymod.render.utils.ByteBufferPool;
import org.lwjgl.util.Dimension; import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import org.lwjgl.util.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;

View File

@@ -1,16 +1,23 @@
package com.replaymod.render.rendering; package com.replaymod.render.rendering;
import com.replaymod.core.versions.MCVer;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReport;
import net.minecraft.util.ReportedException;
import org.lwjgl.opengl.Display; //#if MC>=11300
import org.lwjgl.glfw.GLFW;
//#else
//$$ import org.lwjgl.opengl.Display;
//#endif
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static com.replaymod.core.versions.MCVer.newReportedException;
public class Pipeline<R extends Frame, P extends Frame> implements Runnable { public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
private final FrameCapturer<R> capturer; private final FrameCapturer<R> capturer;
@@ -48,9 +55,13 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
} }
}, new ThreadPoolExecutor.DiscardPolicy()); }, new ThreadPoolExecutor.DiscardPolicy());
Minecraft mc = Minecraft.getMinecraft(); Minecraft mc = MCVer.getMinecraft();
while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) { while (!capturer.isDone() && !Thread.currentThread().isInterrupted()) {
if (Display.isCloseRequested() || mc.hasCrashed) { //#if MC>=11300
if (GLFW.glfwWindowShouldClose(mc.mainWindow.getHandle()) || mc.hasCrashed) {
//#else
//$$ if (Display.isCloseRequested() || mc.hasCrashed) {
//#endif
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
return; return;
} }
@@ -73,7 +84,7 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
consumer.close(); consumer.close();
} catch (Throwable t) { } catch (Throwable t) {
CrashReport crashReport = CrashReport.makeCrashReport(t, "Cleaning up rendering pipeline"); CrashReport crashReport = CrashReport.makeCrashReport(t, "Cleaning up rendering pipeline");
throw new ReportedException(crashReport); throw newReportedException(crashReport);
} }
} }
@@ -105,7 +116,7 @@ public class Pipeline<R extends Frame, P extends Frame> implements Runnable {
} }
} catch (Throwable t) { } catch (Throwable t) {
CrashReport crashReport = CrashReport.makeCrashReport(t, "Processing frame"); CrashReport crashReport = CrashReport.makeCrashReport(t, "Processing frame");
Minecraft.getMinecraft().crashed(crashReport); MCVer.getMinecraft().crashed(crashReport);
} }
} }
} }

View File

@@ -1,6 +1,7 @@
package com.replaymod.render.rendering; package com.replaymod.render.rendering;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import com.replaymod.core.versions.MCVer;
import com.replaymod.pathing.player.AbstractTimelinePlayer; import com.replaymod.pathing.player.AbstractTimelinePlayer;
import com.replaymod.pathing.player.ReplayTimer; import com.replaymod.pathing.player.ReplayTimer;
import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.pathing.properties.TimestampProperty;
@@ -18,16 +19,19 @@ import com.replaymod.replay.ReplayHandler;
import com.replaymod.replaystudio.pathing.path.Keyframe; import com.replaymod.replaystudio.pathing.path.Keyframe;
import com.replaymod.replaystudio.pathing.path.Path; import com.replaymod.replaystudio.pathing.path.Path;
import com.replaymod.replaystudio.pathing.path.Timeline; import com.replaymod.replaystudio.pathing.path.Timeline;
import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Framebuffer;
import net.minecraft.util.ReportedException;
import net.minecraft.util.Timer; import net.minecraft.util.Timer;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display; //#if MC>=11300
import org.lwjgl.util.Dimension; import org.lwjgl.glfw.GLFW;
import org.lwjgl.util.ReadableDimension; //#else
//$$ import net.minecraft.client.gui.ScaledResolution;
//$$ import org.lwjgl.opengl.Display;
//#endif
//#if MC>=10904 //#if MC>=10904
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
@@ -57,7 +61,7 @@ import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
public class VideoRenderer implements RenderInfo { public class VideoRenderer implements RenderInfo {
private final Minecraft mc = Minecraft.getMinecraft(); private final Minecraft mc = MCVer.getMinecraft();
private final RenderSettings settings; private final RenderSettings settings;
private final ReplayHandler replayHandler; private final ReplayHandler replayHandler;
private final Timeline timeline; private final Timeline timeline;
@@ -152,7 +156,7 @@ public class VideoRenderer implements RenderInfo {
renderingPipeline.run(); renderingPipeline.run();
if (mc.hasCrashed) { if (mc.hasCrashed) {
throw new ReportedException(mc.crashReporter); throw newReportedException(mc.crashReporter);
} }
if (settings.isInjectSphericalMetadata()) { if (settings.isInjectSphericalMetadata()) {
@@ -175,18 +179,25 @@ public class VideoRenderer implements RenderInfo {
@Override @Override
public float updateForNextFrame() { public float updateForNextFrame() {
// because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily
int displayWidthBefore = mc.displayWidth; //#if MC>=11300
int displayHeightBefore = mc.displayHeight; // FIXME is this even necessary?
//#else
mc.displayWidth = displayWidth; //$$ int displayWidthBefore = mc.displayWidth;
mc.displayHeight = displayHeight; //$$ int displayHeightBefore = mc.displayHeight;
//$$ mc.displayWidth = displayWidth;
//$$ mc.displayHeight = displayHeight;
//#endif
if (!settings.isHighPerformance() || framesDone % fps == 0) { if (!settings.isHighPerformance() || framesDone % fps == 0) {
drawGui(); drawGui();
} }
// Updating the timer will cause the timeline player to update the game state // Updating the timer will cause the timeline player to update the game state
mc.timer.updateTimer(); mc.timer.updateTimer(
//#if MC>=11300
MCVer.milliTime()
//#endif
);
int elapsedTicks = mc.timer.elapsedTicks; int elapsedTicks = mc.timer.elapsedTicks;
while (elapsedTicks-- > 0) { while (elapsedTicks-- > 0) {
@@ -194,8 +205,12 @@ public class VideoRenderer implements RenderInfo {
} }
// change Minecraft's display size back // change Minecraft's display size back
mc.displayWidth = displayWidthBefore; //#if MC>=11300
mc.displayHeight = displayHeightBefore; // FIXME
//#else
//$$ mc.displayWidth = displayWidthBefore;
//$$ mc.displayHeight = displayHeightBefore;
//#endif
framesDone++; framesDone++;
return mc.timer.renderPartialTicks; return mc.timer.renderPartialTicks;
@@ -211,31 +226,52 @@ public class VideoRenderer implements RenderInfo {
timelinePlayerFuture = timelinePlayer.start(timeline); timelinePlayerFuture = timelinePlayer.start(timeline);
if (!OpenGlHelper.isFramebufferEnabled()) { if (!OpenGlHelper.isFramebufferEnabled()) {
Display.setResizable(false); //#if MC>=11300
GLFW.glfwSetWindowAttrib(mc.mainWindow.getHandle(), GLFW.GLFW_RESIZABLE, 1);
//#else
//$$ Display.setResizable(false);
//#endif
} }
if (mc.gameSettings.showDebugInfo) { if (mc.gameSettings.showDebugInfo) {
debugInfoWasShown = true; debugInfoWasShown = true;
mc.gameSettings.showDebugInfo = false; mc.gameSettings.showDebugInfo = false;
} }
if (Mouse.isGrabbed()) { //#if MC>=11300
if (mc.mouseHelper.isMouseGrabbed()) {
mouseWasGrabbed = true; mouseWasGrabbed = true;
} }
Mouse.setGrabbed(false); mc.mouseHelper.ungrabMouse();
//#else
//$$ if (Mouse.isGrabbed()) {
//$$ mouseWasGrabbed = true;
//$$ }
//$$ Mouse.setGrabbed(false);
//#endif
// Mute all sounds except GUI sounds (buttons, etc.) // Mute all sounds except GUI sounds (buttons, etc.)
Map<SoundCategory, Float> mutedSounds = new EnumMap<>(SoundCategory.class); //#if MC>=11300
originalSoundLevels = new EnumMap<>(SoundCategory.class);
for (SoundCategory category : SoundCategory.values()) { for (SoundCategory category : SoundCategory.values()) {
mutedSounds.put(category, 0f); if (category != SoundCategory.MASTER) {
originalSoundLevels.put(category, mc.gameSettings.getSoundLevel(category));
mc.gameSettings.setSoundLevel(category, 0);
}
} }
//#else
//$$ Map<SoundCategory, Float> mutedSounds = new EnumMap<>(SoundCategory.class);
//$$ for (SoundCategory category : SoundCategory.values()) {
//$$ mutedSounds.put(category, 0f);
//$$ }
//#if MC>=10904 //#if MC>=10904
originalSoundLevels = mc.gameSettings.soundLevels; //$$ originalSoundLevels = mc.gameSettings.soundLevels;
mutedSounds.put(SoundCategory.MASTER, originalSoundLevels.get(SoundCategory.MASTER)); //$$ mutedSounds.put(SoundCategory.MASTER, originalSoundLevels.get(SoundCategory.MASTER));
mc.gameSettings.soundLevels = mutedSounds; //$$ mc.gameSettings.soundLevels = mutedSounds;
//#else //#else
//$$ originalSoundLevels = mc.gameSettings.mapSoundLevels; //$$ originalSoundLevels = mc.gameSettings.mapSoundLevels;
//$$ mutedSounds.put(SoundCategory.MASTER, (Float) originalSoundLevels.get(SoundCategory.MASTER)); //$$ mutedSounds.put(SoundCategory.MASTER, (Float) originalSoundLevels.get(SoundCategory.MASTER));
//$$ mc.gameSettings.mapSoundLevels = mutedSounds; //$$ mc.gameSettings.mapSoundLevels = mutedSounds;
//#endif //#endif
//#endif
fps = settings.getFramesPerSecond(); fps = settings.getFramesPerSecond();
@@ -277,14 +313,28 @@ public class VideoRenderer implements RenderInfo {
timelinePlayer.onTick(new ReplayTimer.UpdatedEvent()); timelinePlayer.onTick(new ReplayTimer.UpdatedEvent());
if (!OpenGlHelper.isFramebufferEnabled()) { if (!OpenGlHelper.isFramebufferEnabled()) {
Display.setResizable(true); //#if MC>=11300
GLFW.glfwSetWindowAttrib(mc.mainWindow.getHandle(), GLFW.GLFW_RESIZABLE, 0);
//#else
//$$ Display.setResizable(true);
//#endif
} }
mc.gameSettings.showDebugInfo = debugInfoWasShown; mc.gameSettings.showDebugInfo = debugInfoWasShown;
if (mouseWasGrabbed) { if (mouseWasGrabbed) {
mc.mouseHelper.grabMouseCursor(); //#if MC>=11300
mc.mouseHelper.grabMouse();
//#else
//$$ mc.mouseHelper.grabMouseCursor();
//#endif
} }
//#if MC>=10904 //#if MC>=10904
mc.gameSettings.soundLevels = originalSoundLevels; //#if MC>=11300
for (Map.Entry<SoundCategory, Float> entry : originalSoundLevels.entrySet()) {
mc.gameSettings.setSoundLevel(entry.getKey(), entry.getValue());
}
//#else
//$$ mc.gameSettings.soundLevels = originalSoundLevels;
//#endif
//#else //#else
//$$ mc.gameSettings.mapSoundLevels = originalSoundLevels; //$$ mc.gameSettings.mapSoundLevels = originalSoundLevels;
//#endif //#endif
@@ -306,7 +356,11 @@ public class VideoRenderer implements RenderInfo {
} }
// Finally, resize the Minecraft framebuffer to the actual width/height of the window // Finally, resize the Minecraft framebuffer to the actual width/height of the window
mc.resize(displayWidth, displayHeight); //#if MC>=11300
mc.getFramebuffer().createFramebuffer(displayWidth, displayHeight);
//#else
//$$ mc.resize(displayWidth, displayHeight);
//#endif
} }
private void tick() { private void tick() {
@@ -317,14 +371,14 @@ public class VideoRenderer implements RenderInfo {
} }
mc.currentScreen = gui.toMinecraft(); mc.currentScreen = gui.toMinecraft();
//#if MC>=10800 //#if MC>=10800 && MC<11300
try { //$$ try {
mc.runTick(); //$$ mc.runTick();
} catch (IOException e) { //$$ } catch (IOException e) {
throw new RuntimeException(e); //$$ throw new RuntimeException(e);
} //$$ }
//#else //#else
//$$ mc.runTick(); mc.runTick();
//#endif //#endif
} }
@@ -333,7 +387,11 @@ public class VideoRenderer implements RenderInfo {
// Resize the GUI framebuffer if the display size changed // Resize the GUI framebuffer if the display size changed
if (!settings.isHighPerformance() && displaySizeChanged()) { if (!settings.isHighPerformance() && displaySizeChanged()) {
updateDisplaySize(); updateDisplaySize();
guiFramebuffer.createBindFramebuffer(mc.displayWidth, mc.displayHeight); //#if MC>=11300
guiFramebuffer.createBindFramebuffer(mc.mainWindow.getFramebufferWidth(), mc.mainWindow.getFramebufferHeight());
//#else
//$$ guiFramebuffer.createBindFramebuffer(mc.displayWidth, mc.displayHeight);
//#endif
} }
pushMatrix(); pushMatrix();
@@ -341,28 +399,47 @@ public class VideoRenderer implements RenderInfo {
enableTexture2D(); enableTexture2D();
guiFramebuffer.bindFramebuffer(true); guiFramebuffer.bindFramebuffer(true);
mc.entityRenderer.setupOverlayRendering(); //#if MC>=11300
mc.mainWindow.setupOverlayRendering();
//#else
//$$ mc.entityRenderer.setupOverlayRendering();
//#endif
ScaledResolution scaled = newScaledResolution(mc); //#if MC>=11300
gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight()); gui.toMinecraft().setWorldAndResolution(mc, mc.mainWindow.getScaledWidth(), mc.mainWindow.getScaledHeight());
//#else
//$$ ScaledResolution scaled = newScaledResolution(mc);
//$$ gui.toMinecraft().setWorldAndResolution(mc, scaled.getScaledWidth(), scaled.getScaledHeight());
//#endif
// Events are polled on 1.13+ in mainWindow.update which is called later
//#if MC<11300
//#if MC>=10800 //#if MC>=10800
try { //$$ try {
gui.toMinecraft().handleInput(); //$$ gui.toMinecraft().handleInput();
} catch (IOException e) { //$$ } catch (IOException e) {
// That's a strange exception from this kind of method O_o //$$ // That's a strange exception from this kind of method O_o
// It isn't actually thrown here, so we'll deal with it the easy way //$$ // It isn't actually thrown here, so we'll deal with it the easy way
throw new RuntimeException(e); //$$ throw new RuntimeException(e);
} //$$ }
//#else //#else
//$$ gui.toMinecraft().handleInput(); //$$ gui.toMinecraft().handleInput();
//#endif //#endif
//#endif
int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth; //#if MC>=11300
int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1; int mouseX = (int) mc.mouseHelper.getMouseX();
int mouseY = (int) mc.mouseHelper.getMouseY();
gui.toMinecraft().updateScreen(); gui.toMinecraft().tick();
gui.toMinecraft().drawScreen(mouseX, mouseY, 0); gui.toMinecraft().render(mouseX, mouseY, 0);
//#else
//$$ int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth;
//$$ int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1;
//$$
//$$ gui.toMinecraft().updateScreen();
//$$ gui.toMinecraft().drawScreen(mouseX, mouseY, 0);
//#endif
guiFramebuffer.unbindFramebuffer(); guiFramebuffer.unbindFramebuffer();
popMatrix(); popMatrix();
@@ -370,20 +447,30 @@ public class VideoRenderer implements RenderInfo {
guiFramebuffer.framebufferRender(displayWidth, displayHeight); guiFramebuffer.framebufferRender(displayWidth, displayHeight);
popMatrix(); popMatrix();
// if not in high performance mode, update the gui size if screen size changed //#if MC>=11300
// otherwise just swap the progress gui to screen mc.mainWindow.update(false);
if (settings.isHighPerformance()) { //#else
Display.update(); //$$ // if not in high performance mode, update the gui size if screen size changed
} else { //$$ // otherwise just swap the progress gui to screen
//$$ if (settings.isHighPerformance()) {
//$$ Display.update();
//$$ } else {
//#if MC>=10800 //#if MC>=10800
mc.updateDisplay(); //$$ mc.updateDisplay();
//#else //#else
//$$ mc.resetSize(); //$$ mc.resetSize();
//#endif //#endif
//$$ }
//#endif
//#if MC>=11300
if (mc.mouseHelper.isMouseGrabbed()) {
mc.mouseHelper.ungrabMouse();
} }
if (Mouse.isGrabbed()) { //#else
Mouse.setGrabbed(false); //$$ if (Mouse.isGrabbed()) {
} //$$ Mouse.setGrabbed(false);
//$$ }
//#endif
if (paused) { if (paused) {
try { try {
Thread.sleep(50); Thread.sleep(50);
@@ -396,12 +483,21 @@ public class VideoRenderer implements RenderInfo {
} }
private boolean displaySizeChanged() { private boolean displaySizeChanged() {
return displayWidth != Display.getWidth() || displayHeight != Display.getHeight(); //#if MC>=11300
return displayWidth != mc.mainWindow.getWidth() || displayHeight != mc.mainWindow.getHeight();
//#else
//$$ return displayWidth != Display.getWidth() || displayHeight != Display.getHeight();
//#endif
} }
private void updateDisplaySize() { private void updateDisplaySize() {
displayWidth = Display.getWidth(); //#if MC>=11300
displayHeight = Display.getHeight(); displayWidth = mc.mainWindow.getWidth();
displayHeight = mc.mainWindow.getHeight();
//#else
//$$ displayWidth = Display.getWidth();
//$$ displayHeight = Display.getHeight();
//#endif
} }
public int getFramesDone() { public int getFramesDone() {

View File

@@ -1,7 +1,6 @@
package com.replaymod.render.shader; package com.replaymod.render.shader;
import net.minecraft.client.Minecraft; import com.replaymod.core.versions.MCVer;
import net.minecraft.client.resources.IResource;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.lwjgl.opengl.ARBFragmentShader; import org.lwjgl.opengl.ARBFragmentShader;
@@ -9,6 +8,12 @@ import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.ARBVertexShader; import org.lwjgl.opengl.ARBVertexShader;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
//#if MC>=11300
import net.minecraft.resources.IResource;
//#else
//$$ import net.minecraft.client.resources.IResource;
//#endif
import java.io.InputStream; import java.io.InputStream;
import static org.lwjgl.opengl.ARBShaderObjects.*; import static org.lwjgl.opengl.ARBShaderObjects.*;
@@ -47,7 +52,7 @@ public class Program {
if(shader == 0) if(shader == 0)
throw new Exception("glCreateShaderObjectARB failed"); throw new Exception("glCreateShaderObjectARB failed");
IResource resource = Minecraft.getMinecraft().getResourceManager().getResource(resourceLocation); IResource resource = MCVer.getMinecraft().getResourceManager().getResource(resourceLocation);
try (InputStream is = resource.getInputStream()) { try (InputStream is = resource.getInputStream()) {
glShaderSourceARB(shader, IOUtils.toString(is)); glShaderSourceARB(shader, IOUtils.toString(is));
} }

View File

@@ -1,12 +1,18 @@
package com.replaymod.render.utils; package com.replaymod.render.utils;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.replaymod.core.versions.MCVer;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.minecraft.client.Minecraft;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.lwjgl.opengl.ARBBufferObject;
import org.lwjgl.opengl.GLContext; //#if MC>=11300
import org.lwjgl.opengl.Util; import org.lwjgl.opengl.ARBVertexBufferObject;
import org.lwjgl.opengl.GL;
//#else
//$$ import org.lwjgl.opengl.ARBBufferObject;
//$$ import org.lwjgl.opengl.GLContext;
//$$ import org.lwjgl.opengl.Util;
//#endif
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -14,6 +20,10 @@ import static org.lwjgl.opengl.ARBPixelBufferObject.*;
import static org.lwjgl.opengl.GL15.*; import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL21.GL_PIXEL_PACK_BUFFER; import static org.lwjgl.opengl.GL21.GL_PIXEL_PACK_BUFFER;
//#if MC>=11300
import static org.lwjgl.opengl.ARBVertexBufferObject.*;
//#endif
public class PixelBufferObject { public class PixelBufferObject {
@RequiredArgsConstructor @RequiredArgsConstructor
public enum Usage { public enum Usage {
@@ -24,8 +34,13 @@ public class PixelBufferObject {
private final int arb, gl15; private final int arb, gl15;
} }
public static final boolean SUPPORTED = GLContext.getCapabilities().GL_ARB_pixel_buffer_object || GLContext.getCapabilities().OpenGL15; //#if MC>=11300
private static final boolean arb = !GLContext.getCapabilities().OpenGL15; public static final boolean SUPPORTED = GL.getCapabilities().GL_ARB_pixel_buffer_object || GL.getCapabilities().OpenGL15;
private static final boolean arb = !GL.getCapabilities().OpenGL15;
//#else
//$$ public static final boolean SUPPORTED = GLContext.getCapabilities().GL_ARB_pixel_buffer_object || GLContext.getCapabilities().OpenGL15;
//$$ private static final boolean arb = !GLContext.getCapabilities().OpenGL15;
//#endif
private static ThreadLocal<Integer> bound = new ThreadLocal<>(); private static ThreadLocal<Integer> bound = new ThreadLocal<>();
private static ThreadLocal<Integer> mapped = new ThreadLocal<>(); private static ThreadLocal<Integer> mapped = new ThreadLocal<>();
@@ -39,12 +54,20 @@ public class PixelBufferObject {
} }
this.size = size; this.size = size;
this.handle = arb ? ARBBufferObject.glGenBuffersARB() : glGenBuffers(); //#if MC>=11300
this.handle = arb ? ARBVertexBufferObject.glGenBuffersARB() : glGenBuffers();
//#else
//$$ this.handle = arb ? ARBBufferObject.glGenBuffersARB() : glGenBuffers();
//#endif
bind(); bind();
if (arb) { if (arb) {
ARBBufferObject.glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, size, usage.arb); //#if MC>=11300
ARBVertexBufferObject.glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, size, usage.arb);
//#else
//$$ ARBBufferObject.glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, size, usage.arb);
//#endif
} else { } else {
glBufferData(GL_PIXEL_PACK_BUFFER, size, usage.gl15); glBufferData(GL_PIXEL_PACK_BUFFER, size, usage.gl15);
} }
@@ -61,7 +84,11 @@ public class PixelBufferObject {
public void bind() { public void bind() {
if (arb) { if (arb) {
ARBBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, getHandle()); //#if MC>=11300
ARBVertexBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, getHandle());
//#else
//$$ ARBBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, getHandle());
//#endif
} else { } else {
glBindBuffer(GL_PIXEL_PACK_BUFFER, getHandle()); glBindBuffer(GL_PIXEL_PACK_BUFFER, getHandle());
} }
@@ -71,7 +98,11 @@ public class PixelBufferObject {
public void unbind() { public void unbind() {
checkBound(); checkBound();
if (arb) { if (arb) {
ARBBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); //#if MC>=11300
ARBVertexBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
//#else
//$$ ARBBufferObject.glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
//#endif
} else { } else {
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
} }
@@ -95,13 +126,19 @@ public class PixelBufferObject {
checkNotMapped(); checkNotMapped();
ByteBuffer buffer; ByteBuffer buffer;
if (arb) { if (arb) {
buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB, size, null); //#if MC>=11300
buffer = ARBVertexBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB, size, null);
//#else
//$$ buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB, size, null);
//#endif
} else { } else {
buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY, size, null); buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY, size, null);
} }
if (buffer == null) { //#if MC<11300
Util.checkGLError(); //$$ if (buffer == null) {
} //$$ Util.checkGLError();
//$$ }
//#endif
mapped.set(getHandle()); mapped.set(getHandle());
return buffer; return buffer;
} }
@@ -111,13 +148,19 @@ public class PixelBufferObject {
checkNotMapped(); checkNotMapped();
ByteBuffer buffer; ByteBuffer buffer;
if (arb) { if (arb) {
buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_WRITE_ONLY_ARB, size, null); //#if MC>=11300
buffer = ARBVertexBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_WRITE_ONLY_ARB, size, null);
//#else
//$$ buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_WRITE_ONLY_ARB, size, null);
//#endif
} else { } else {
buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_WRITE_ONLY, size, null); buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_WRITE_ONLY, size, null);
} }
if (buffer == null) { //#if MC<11300
Util.checkGLError(); //$$ if (buffer == null) {
} //$$ Util.checkGLError();
//$$ }
//#endif
mapped.set(getHandle()); mapped.set(getHandle());
return buffer; return buffer;
} }
@@ -127,13 +170,19 @@ public class PixelBufferObject {
checkNotMapped(); checkNotMapped();
ByteBuffer buffer; ByteBuffer buffer;
if (arb) { if (arb) {
buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_WRITE_ARB, size, null); //#if MC>=11300
buffer = ARBVertexBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_WRITE_ARB, size, null);
//#else
//$$ buffer = ARBBufferObject.glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_WRITE_ARB, size, null);
//#endif
} else { } else {
buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, size, null); buffer = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_WRITE, size, null);
} }
if (buffer == null) { //#if MC<11300
Util.checkGLError(); //$$ if (buffer == null) {
} //$$ Util.checkGLError();
//$$ }
//#endif
mapped.set(getHandle()); mapped.set(getHandle());
return buffer; return buffer;
} }
@@ -144,7 +193,11 @@ public class PixelBufferObject {
throw new IllegalStateException("Buffer not mapped."); throw new IllegalStateException("Buffer not mapped.");
} }
if (arb) { if (arb) {
ARBBufferObject.glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); //#if MC>=11300
ARBVertexBufferObject.glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
//#else
//$$ ARBBufferObject.glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB);
//#endif
} else { } else {
glUnmapBuffer(GL_PIXEL_PACK_BUFFER); glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
} }
@@ -154,7 +207,11 @@ public class PixelBufferObject {
public void delete() { public void delete() {
if (handle != -1) { if (handle != -1) {
if (arb) { if (arb) {
ARBBufferObject.glDeleteBuffersARB(getHandle()); //#if MC>=11300
ARBVertexBufferObject.glDeleteBuffersARB(getHandle());
//#else
//$$ ARBBufferObject.glDeleteBuffersARB(getHandle());
//#endif
} else { } else {
glDeleteBuffers(getHandle()); glDeleteBuffers(getHandle());
} }
@@ -167,12 +224,7 @@ public class PixelBufferObject {
super.finalize(); super.finalize();
if (handle != -1) { if (handle != -1) {
LogManager.getLogger().warn("PBO garbage collected before deleted!"); LogManager.getLogger().warn("PBO garbage collected before deleted!");
Minecraft.getMinecraft().addScheduledTask(new Runnable() { MCVer.getMinecraft().addScheduledTask(this::delete);
@Override
public void run() {
delete();
}
});
} }
} }
} }

View File

@@ -1,6 +1,6 @@
package com.replaymod.render.utils; package com.replaymod.render.utils;
import net.minecraft.client.Minecraft; import com.replaymod.core.versions.MCVer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@@ -24,7 +24,7 @@ public class SoundHandler {
*/ */
public void playSound(ResourceLocation loc) { public void playSound(ResourceLocation loc) {
try { try {
InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(loc).getInputStream(); InputStream is = MCVer.getMinecraft().getResourceManager().getResource(loc).getInputStream();
byte[] bytes = IOUtils.toByteArray(is); byte[] bytes = IOUtils.toByteArray(is);
is.close(); is.close();
AudioInputStream ais = AudioSystem.getAudioInputStream(new ByteArrayInputStream(bytes)); AudioInputStream ais = AudioSystem.getAudioInputStream(new ByteArrayInputStream(bytes));

View File

@@ -74,15 +74,24 @@ public net.minecraft.client.renderer.EntityRenderer *
public net.minecraft.client.renderer.EntityRenderer *() public net.minecraft.client.renderer.EntityRenderer *()
# RenderGlobal # RenderGlobal
public net.minecraft.client.renderer.RenderGlobal field_174995_M # renderDispatcher ##if MC>=11300
public net.minecraft.client.renderer.RenderGlobal field_147595_R # displayListEntitiesDirty public net.minecraft.client.renderer.WorldRenderer field_174995_M # renderDispatcher
public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdate public net.minecraft.client.renderer.WorldRenderer field_147595_R # displayListEntitiesDirty
public net.minecraft.client.renderer.RenderGlobal field_72755_R # renderInfos public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate
public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdate public net.minecraft.client.renderer.WorldRenderer field_72755_R # renderInfos
public net.minecraft.client.renderer.RenderGlobal field_72740_G # renderEntitiesStartupCounter public net.minecraft.client.renderer.WorldRenderer field_175009_l # chunksToUpdate
public net.minecraft.client.renderer.WorldRenderer field_72740_G # renderEntitiesStartupCounter
##else
#$$ public net.minecraft.client.renderer.RenderGlobal field_174995_M # renderDispatcher
#$$ public net.minecraft.client.renderer.RenderGlobal field_147595_R # displayListEntitiesDirty
#$$ public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdate
#$$ public net.minecraft.client.renderer.RenderGlobal field_72755_R # renderInfos
#$$ public net.minecraft.client.renderer.RenderGlobal field_175009_l # chunksToUpdate
#$$ public net.minecraft.client.renderer.RenderGlobal field_72740_G # renderEntitiesStartupCounter
##if MC<10904 ##if MC<10904
#$$ public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk #$$ public net.minecraft.client.renderer.RenderGlobal func_174983_a(Lnet.minecraft.util.BlockPos;Lnet.minecraft.client.renderer.chunk.RenderChunk;)Z # isPositionInRenderChunk
##endif ##endif
##endif
public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation
#public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178553_a # renderChunk #public net.minecraft.client.renderer.RenderGlobal$ContainerLocalRenderInformation field_178553_a # renderChunk
@@ -120,7 +129,11 @@ public net.minecraft.server.integrated.IntegratedServer field_71348_o # isGamePa
# GameSettings # GameSettings
##if MC>=10904 ##if MC>=10904
##if MC>=11002 ##if MC>=11002
public-f net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels ##if MC>=11300
public-f net.minecraft.client.GameSettings field_186714_aM # soundLevels
##else
#$$ public-f net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels
##endif
##else ##else
#$$ public net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels #$$ public net.minecraft.client.settings.GameSettings field_186714_aM # soundLevels
##endif ##endif

View File

@@ -277,7 +277,6 @@ sourceSets {
exclude 'com/replaymod/editor' exclude 'com/replaymod/editor'
exclude 'com/replaymod/extras' exclude 'com/replaymod/extras'
exclude 'com/replaymod/online' exclude 'com/replaymod/online'
exclude 'com/replaymod/render'
exclude 'com/replaymod/restrictions' exclude 'com/replaymod/restrictions'
exclude 'com/replaymod/simplepathing' exclude 'com/replaymod/simplepathing'
} }