diff --git a/settings.gradle b/settings.gradle index 1fb85e6d..59ab2954 100644 --- a/settings.gradle +++ b/settings.gradle @@ -56,3 +56,5 @@ replayModVersions.each { version -> buildFileName = '../common.gradle' } } + +include ':mixin-hack' \ No newline at end of file diff --git a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java index e3c6d2bf..2acbbe39 100644 --- a/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java +++ b/src/main/java/com/replaymod/render/capturer/ODSFrameCapturer.java @@ -1,6 +1,5 @@ package com.replaymod.render.capturer; -import com.replaymod.core.versions.MCVer; import com.replaymod.render.RenderSettings; import com.replaymod.render.frame.CubicOpenGlFrame; import com.replaymod.render.frame.ODSOpenGlFrame; @@ -8,12 +7,10 @@ import com.replaymod.render.frame.OpenGlFrame; import com.replaymod.render.rendering.FrameCapturer; import com.replaymod.render.shader.Program; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; -import net.minecraft.client.Minecraft; import net.minecraft.crash.CrashReport; import net.minecraft.util.ResourceLocation; //#if MC>=10800 -import net.minecraft.client.renderer.GlStateManager; import static net.minecraft.client.renderer.GlStateManager.*; //#else //$$ import com.replaymod.render.hooks.GLStateTracker.BooleanState; @@ -36,9 +33,7 @@ public class ODSFrameCapturer implements FrameCapturer { private final Program.Uniform leftEyeVariable; private final BooleanState[] previousStates = new BooleanState[3]; - private final BooleanState previousFogState; - - private final Minecraft mc = MCVer.getMinecraft(); + private BooleanState previousFogState; public ODSFrameCapturer(WorldRenderer worldRenderer, final RenderInfo renderInfo, int frameSize) { RenderInfo fakeInfo = new RenderInfo() { @@ -62,9 +57,9 @@ public class ODSFrameCapturer implements FrameCapturer { @Override public float updateForNextFrame() { if (call++ % 2 == 0) { - shaderProgram.stopUsing(); + unbindProgram(); partialTicks = renderInfo.updateForNextFrame(); - shaderProgram.use(); + bindProgram(); } return partialTicks; } @@ -78,30 +73,43 @@ public class ODSFrameCapturer implements FrameCapturer { right = new CubicStereoFrameCapturer(worldRenderer, fakeInfo, frameSize); try { shaderProgram = new Program(vertexResource, fragmentResource); - shaderProgram.use(); leftEyeVariable = shaderProgram.getUniformVariable("leftEye"); directionVariable = shaderProgram.getUniformVariable("direction"); - setTexture("texture", 0); - setTexture("lightMap", 1); - linkState(0, "textureEnabled"); - linkState(1, "lightMapEnabled"); - linkState(2, "hurtTextureEnabled"); - final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); - previousFogState = fog(); - uniform.set(previousFogState.currentState); - fog(new BooleanState(previousFogState.capability) { - @Override - public void setState(boolean state) { - super.setState(state); - uniform.set(state); - } - }); - shaderProgram.stopUsing(); } catch (Exception e) { throw newReportedException(CrashReport.makeCrashReport(e, "Creating ODS shaders")); } } + private void bindProgram() { + shaderProgram.use(); + setTexture("texture", 0); + setTexture("lightMap", 1); + linkState(0, "textureEnabled"); + linkState(1, "lightMapEnabled"); + linkState(2, "hurtTextureEnabled"); + final Program.Uniform uniform = shaderProgram.getUniformVariable("fogEnabled"); + previousFogState = fog(); + uniform.set(previousFogState.currentState); + fog(new BooleanState(previousFogState.capability) { + { currentState = previousFogState.currentState; } + @Override + public void setState(boolean state) { + super.setState(state); + uniform.set(state); + } + }); + } + + private void unbindProgram() { + for (int i = 0; i < previousStates.length; i++) { + previousStates[i].currentState = texture2DState(i).currentState; + texture2DState(i, previousStates[i]); + } + previousFogState.currentState = fog().currentState; + fog(previousFogState); + shaderProgram.stopUsing(); + } + private void setTexture(String texture, int i) { shaderProgram.getUniformVariable(texture).set(i); } @@ -111,6 +119,7 @@ public class ODSFrameCapturer implements FrameCapturer { previousStates[id] = texture2DState(id); uniform.set(previousStates[id].currentState); texture2DState(id, new BooleanState(previousStates[id].capability) { + { currentState = previousStates[id].currentState; } @Override public void setState(boolean state) { super.setState(state); @@ -126,12 +135,12 @@ public class ODSFrameCapturer implements FrameCapturer { @Override public ODSOpenGlFrame process() { - shaderProgram.use(); + bindProgram(); leftEyeVariable.set(true); CubicOpenGlFrame leftFrame = left.process(); leftEyeVariable.set(false); CubicOpenGlFrame rightFrame = right.process(); - shaderProgram.stopUsing(); + unbindProgram(); if (leftFrame != null && rightFrame != null) { return new ODSOpenGlFrame(leftFrame, rightFrame); @@ -144,10 +153,6 @@ public class ODSFrameCapturer implements FrameCapturer { left.close(); right.close(); shaderProgram.delete(); - for (int i = 0; i < previousStates.length; i++) { - texture2DState(i, previousStates[i]); - } - fog(previousFogState); } private class CubicStereoFrameCapturer extends CubicPboOpenGlFrameCapturer {