From 9f92785ec6a329e7cfe741a14b7376784c67ce64 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 28 Jan 2022 08:04:05 +0100 Subject: [PATCH] fixed skybox chainloader --- .../com/hbm/main/ModEventHandlerClient.java | 16 ++- .../world/RenderNTMSkyboxChainloader.java | 121 ++++++++++++++++++ ...Skybox.java => RenderNTMSkyboxImpact.java} | 6 +- 3 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/hbm/render/world/RenderNTMSkyboxChainloader.java rename src/main/java/com/hbm/render/world/{RenderNTMSkybox.java => RenderNTMSkyboxImpact.java} (98%) diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 13ed5a233..42688a750 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -41,7 +41,8 @@ import com.hbm.render.util.RenderAccessoryUtility; import com.hbm.render.util.RenderOverhead; import com.hbm.render.util.RenderScreenOverlay; import com.hbm.render.util.SoyuzPronter; -import com.hbm.render.world.RenderNTMSkybox; +import com.hbm.render.world.RenderNTMSkyboxChainloader; +import com.hbm.render.world.RenderNTMSkyboxImpact; import com.hbm.sound.MovingSoundChopper; import com.hbm.sound.MovingSoundChopperMine; import com.hbm.sound.MovingSoundCrashing; @@ -688,8 +689,17 @@ public class ModEventHandlerClient { if(world != null && world.provider instanceof WorldProviderSurface) { IRenderHandler sky = world.provider.getSkyRenderer(); - if(!(sky instanceof RenderNTMSkybox)) { - world.provider.setSkyRenderer(new RenderNTMSkybox()); + + if(ModEventHandler.dust > 0 || ModEventHandler.fire > 0) { + + if(!(sky instanceof RenderNTMSkyboxImpact)) { + world.provider.setSkyRenderer(new RenderNTMSkyboxImpact()); + } + } else { + + if(!(sky instanceof RenderNTMSkyboxChainloader)) { + world.provider.setSkyRenderer(new RenderNTMSkyboxChainloader(sky)); + } } } } diff --git a/src/main/java/com/hbm/render/world/RenderNTMSkyboxChainloader.java b/src/main/java/com/hbm/render/world/RenderNTMSkyboxChainloader.java new file mode 100644 index 000000000..df520e044 --- /dev/null +++ b/src/main/java/com/hbm/render/world/RenderNTMSkyboxChainloader.java @@ -0,0 +1,121 @@ +package com.hbm.render.world; + +import org.lwjgl.opengl.GL11; + +import com.hbm.extprop.HbmLivingProps; + +import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.WorldClient; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.IRenderHandler; + +public class RenderNTMSkyboxChainloader extends IRenderHandler { //why an abstract class uses the I-prefix is beyond me but ok, alright, whatever + + /* + * To get the terrain render order right, making a sky rendering handler is absolutely necessary. Turns out MC can only handle one of these, so what do we do? + * We make out own renderer, grab any existing renderers that are already occupying the slot, doing what is effectively chainloading while adding our own garbage. + * If somebody does the exact same thing as we do we might be screwed due to increasingly long recursive loops but we can fix that too, no worries. + */ + private IRenderHandler parent; + + private static final ResourceLocation digammaStar = new ResourceLocation("hbm:textures/misc/star_digamma.png"); + private static final ResourceLocation bobmazonSat = new ResourceLocation("hbm:textures/misc/sat_bobmazon.png"); + + /* + * If the skybox was rendered successfully in the last tick (even from other mods' skyboxes chainloading this one) then we don't need to add it again + */ + public static boolean didLastRender = false; + + public RenderNTMSkyboxChainloader(IRenderHandler parent) { + this.parent = parent; + } + + @Override + public void render(float partialTicks, WorldClient world, Minecraft mc) { + + if(parent != null) { + + //basically a recursion-brake to prevent endless rendering loops from other mods' chainloaders. + //do other mods' skyboxes even employ chainloading? + if(!didLastRender) { + didLastRender = true; + parent.render(partialTicks, world, mc); + didLastRender = false; + } + + } else{ + RenderGlobal rg = Minecraft.getMinecraft().renderGlobal; + world.provider.setSkyRenderer(null); + rg.renderSky(partialTicks); + world.provider.setSkyRenderer(this); + } + + GL11.glPushMatrix(); + GL11.glDepthMask(false); + + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_ALPHA_TEST); + GL11.glDisable(GL11.GL_FOG); + OpenGlHelper.glBlendFunc(770, 1, 1, 0); + + float brightness = (float) Math.sin(world.getCelestialAngle(partialTicks) * Math.PI); + brightness *= brightness; + + GL11.glColor4f(brightness, brightness, brightness, 1.0F); + + GL11.glPushMatrix(); + GL11.glRotatef(-90.0F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(world.getCelestialAngle(partialTicks) * 360.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(140.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(-40.0F, 0.0F, 0.0F, 1.0F); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(digammaStar); + + float digamma = HbmLivingProps.getDigamma(Minecraft.getMinecraft().thePlayer); + float var12 = 1F * (1 + digamma * 0.25F); + double dist = 100D - digamma * 2.5; + + Tessellator tessellator = Tessellator.instance; + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(-var12, dist, -var12, 0.0D, 0.0D); + tessellator.addVertexWithUV(var12, dist, -var12, 0.0D, 1.0D); + tessellator.addVertexWithUV(var12, dist, var12, 1.0D, 1.0D); + tessellator.addVertexWithUV(-var12, dist, var12, 1.0D, 0.0D); + tessellator.draw(); + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glRotatef(-40.0F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef((System.currentTimeMillis() % (360 * 1000) / 1000F), 0.0F, 1.0F, 0.0F); + GL11.glRotatef((System.currentTimeMillis() % (360 * 100) / 100F), 1.0F, 0.0F, 0.0F); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(bobmazonSat); + + var12 = 0.5F; + dist = 100D; + + tessellator.startDrawingQuads(); + tessellator.addVertexWithUV(-var12, dist, -var12, 0.0D, 0.0D); + tessellator.addVertexWithUV(var12, dist, -var12, 0.0D, 1.0D); + tessellator.addVertexWithUV(var12, dist, var12, 1.0D, 1.0D); + tessellator.addVertexWithUV(-var12, dist, var12, 1.0D, 0.0D); + tessellator.draw(); + GL11.glPopMatrix(); + + GL11.glDepthMask(true); + + GL11.glEnable(GL11.GL_FOG); + GL11.glDisable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + GL11.glPopMatrix(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/render/world/RenderNTMSkybox.java b/src/main/java/com/hbm/render/world/RenderNTMSkyboxImpact.java similarity index 98% rename from src/main/java/com/hbm/render/world/RenderNTMSkybox.java rename to src/main/java/com/hbm/render/world/RenderNTMSkyboxImpact.java index a76f3318a..9e03e7819 100644 --- a/src/main/java/com/hbm/render/world/RenderNTMSkybox.java +++ b/src/main/java/com/hbm/render/world/RenderNTMSkyboxImpact.java @@ -24,7 +24,7 @@ import com.hbm.main.ModEventHandler; import java.util.Random; -public class RenderNTMSkybox extends IRenderHandler { +public class RenderNTMSkyboxImpact extends IRenderHandler { private static final ResourceLocation sunTexture = new ResourceLocation("textures/environment/sun.png"); private static final ResourceLocation moonTexture = new ResourceLocation("textures/environment/moon_phases.png"); @@ -42,7 +42,7 @@ public class RenderNTMSkybox extends IRenderHandler { /// I had to break your compat feature for other mods' skyboxes in order to /// make the skybox render correctly after Tom. Sorry about that. -Pu - public RenderNTMSkybox() { + public RenderNTMSkyboxImpact() { GL11.glPushMatrix(); GL11.glNewList(this.starGLCallList, GL11.GL_COMPILE); this.renderStars(); @@ -171,7 +171,7 @@ public class RenderNTMSkybox extends IRenderHandler { { GL11.glColor4d(1, 1, 1, rain); f10 = 20.0F; - FMLClientHandler.instance().getClient().renderEngine.bindTexture(RenderNTMSkybox.moonTexture); + FMLClientHandler.instance().getClient().renderEngine.bindTexture(RenderNTMSkyboxImpact.moonTexture); float sinphi = FMLClientHandler.instance().getClient().theWorld.getMoonPhase(); final int cosphi = (int) (sinphi % 4); final int var29 = (int) (sinphi / 4 % 2);