From 81477966eed568e9ef8edc85f3ad6b65c47b48ae Mon Sep 17 00:00:00 2001 From: "Aidan C. Brady" Date: Thu, 12 Jun 2014 18:16:20 +0200 Subject: [PATCH] Fix all render issues. 1.7 is now officially more stable than 1.6 (but not stable enough) --- .../client/gui/GuiDigitalMinerConfig.java | 11 +++++-- .../client/gui/GuiLogisticalSorter.java | 10 ++++-- .../client/render/MekanismRenderer.java | 20 ++++++++++++ .../client/render/RenderGlowPanel.java | 24 ++++++--------- .../client/render/RenderPartTransmitter.java | 29 ++++++++---------- .../common/multipart/PartGlowPanel.java | 5 +-- .../common/multipart/PartSidedPipe.java | 3 +- .../mekanism/gui/GuiDigitalMinerConfig.png | Bin 5304 -> 4836 bytes .../mekanism/gui/GuiLogisticalSorter.png | Bin 5288 -> 4812 bytes 9 files changed, 63 insertions(+), 39 deletions(-) diff --git a/src/main/java/mekanism/client/gui/GuiDigitalMinerConfig.java b/src/main/java/mekanism/client/gui/GuiDigitalMinerConfig.java index c93205454..1ba7db575 100644 --- a/src/main/java/mekanism/client/gui/GuiDigitalMinerConfig.java +++ b/src/main/java/mekanism/client/gui/GuiDigitalMinerConfig.java @@ -8,6 +8,8 @@ import java.util.Map; import java.util.Set; import mekanism.api.Coord4D; +import mekanism.api.EnumColor; +import mekanism.client.render.MekanismRenderer; import mekanism.client.sound.SoundHandler; import mekanism.common.Mekanism; import mekanism.common.inventory.container.ContainerNull; @@ -407,16 +409,19 @@ public class GuiDigitalMinerConfig extends GuiMekanism if(filter instanceof MItemStackFilter) { - drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 166, 96, 29); + MekanismRenderer.color(EnumColor.INDIGO, 1.0F, 2.5F); } else if(filter instanceof MOreDictFilter) { - drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 195, 96, 29); + MekanismRenderer.color(EnumColor.BRIGHT_GREEN, 1.0F, 2.5F); } else if(filter instanceof MMaterialFilter) { - drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 224, 96, 29); + MekanismRenderer.color(EnumColor.PURPLE, 1.0F, 4F); } + + drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 166, 96, 29); + MekanismRenderer.resetColor(); } } diff --git a/src/main/java/mekanism/client/gui/GuiLogisticalSorter.java b/src/main/java/mekanism/client/gui/GuiLogisticalSorter.java index d15619d8a..d7f7ad4a6 100644 --- a/src/main/java/mekanism/client/gui/GuiLogisticalSorter.java +++ b/src/main/java/mekanism/client/gui/GuiLogisticalSorter.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Set; import mekanism.api.Coord4D; +import mekanism.api.EnumColor; import mekanism.client.render.MekanismRenderer; import mekanism.client.sound.SoundHandler; import mekanism.common.Mekanism; @@ -414,16 +415,19 @@ public class GuiLogisticalSorter extends GuiMekanism if(filter instanceof TItemStackFilter) { - drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 166, 96, 29); + MekanismRenderer.color(EnumColor.INDIGO, 1.0F, 2.5F); } else if(filter instanceof TOreDictFilter) { - drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 195, 96, 29); + MekanismRenderer.color(EnumColor.BRIGHT_GREEN, 1.0F, 2.5F); } else if(filter instanceof TMaterialFilter) { - drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 224, 96, 29); + MekanismRenderer.color(EnumColor.PURPLE, 1.0F, 4F); } + + drawTexturedModalRect(guiWidth + 56, guiHeight + yStart, mouseOver ? 0 : 96, 166, 96, 29); + MekanismRenderer.resetColor(); } } diff --git a/src/main/java/mekanism/client/render/MekanismRenderer.java b/src/main/java/mekanism/client/render/MekanismRenderer.java index 22d20abe4..84644f561 100644 --- a/src/main/java/mekanism/client/render/MekanismRenderer.java +++ b/src/main/java/mekanism/client/render/MekanismRenderer.java @@ -208,6 +208,26 @@ public class MekanismRenderer Tessellator.instance.draw(); } + public static void color(EnumColor color) + { + color(color, 1.0F); + } + + public static void color(EnumColor color, float alpha) + { + color(color, alpha, 1.0F); + } + + public static void color(EnumColor color, float alpha, float multiplier) + { + GL11.glColor4f(color.getColor(0)*multiplier, color.getColor(1)*multiplier, color.getColor(2)*multiplier, alpha); + } + + public static void resetColor() + { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + } + public static IIcon getColorIcon(EnumColor color) { return colors[color.ordinal()]; diff --git a/src/main/java/mekanism/client/render/RenderGlowPanel.java b/src/main/java/mekanism/client/render/RenderGlowPanel.java index cc43ceafb..bd78468dd 100644 --- a/src/main/java/mekanism/client/render/RenderGlowPanel.java +++ b/src/main/java/mekanism/client/render/RenderGlowPanel.java @@ -3,7 +3,6 @@ package mekanism.client.render; import java.util.Map; import mekanism.api.EnumColor; -import mekanism.common.Mekanism; import mekanism.common.multipart.PartGlowPanel; import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils.ResourceType; @@ -43,39 +42,35 @@ public class RenderGlowPanel implements IIconSelfRegister Map models = CCModel.parseObjModels(MekanismUtils.getResource(ResourceType.MODEL, "glow_panel.obj"), 7, null); frameModels = new CCModel[6]; - frameModels[0] = models.get("frame"); - CCModel.generateSidedModels(frameModels, 0, new Vector3(0, 0, 0)); + frameModels[0] = models.get("frame").backfacedCopy().apply(Vector3.center.translation()).shrinkUVs(0.0005); + CCModel.generateSidedModels(frameModels, 0, Vector3.center); lightModels = new CCModel[6]; - lightModels[0] = models.get("light"); - CCModel.generateSidedModels(lightModels, 0, new Vector3(0, 0, 0)); + lightModels[0] = models.get("light").backfacedCopy().apply(Vector3.center.translation()).shrinkUVs(0.0005); + CCModel.generateSidedModels(lightModels, 0, Vector3.center); for(CCModel c : frameModels) { - c.apply(new Translation(.5, .5, .5)); c.computeLighting(LightModel.standardLightModel); - c.shrinkUVs(0.0005); } for(CCModel c : lightModels) { - c.apply(new Translation(.5, .5, .5)); c.computeLighting(LightModel.standardLightModel); - c.shrinkUVs(0.0005); } } public void renderStatic(PartGlowPanel panel) { - TextureUtils.bindAtlas(0); CCRenderState.reset(); CCRenderState.setBrightness(panel.world(), panel.x(), panel.y(), panel.z()); + CCRenderState.hasColour = true; Colour colour = new ColourRGBA(panel.colour.getColor(0), panel.colour.getColor(1), panel.colour.getColor(2), 1); int side = panel.side.ordinal(); - frameModels[side].render(0, frameModels[side].verts.length, new Translation(panel.x(), panel.y(), panel.z()), new IconTransformation(icon)); - lightModels[side].render(0, lightModels[side].verts.length, new Translation(panel.x(), panel.y(), panel.z()), new IconTransformation(icon), new ColourMultiplier(colour.rgba())); + frameModels[side].render(new Translation(panel.x(), panel.y(), panel.z()), new IconTransformation(icon)); + lightModels[side].render(new Translation(panel.x(), panel.y(), panel.z()), new IconTransformation(icon), new ColourMultiplier(colour.rgba())); } public void renderItem(int metadata) @@ -83,6 +78,7 @@ public class RenderGlowPanel implements IIconSelfRegister TextureUtils.bindAtlas(0); CCRenderState.reset(); CCRenderState.startDrawing(); + CCRenderState.hasColour = true; EnumColor c = EnumColor.DYES[metadata]; Colour colour = new ColourRGBA(c.getColor(0), c.getColor(1), c.getColor(2), 1); @@ -90,8 +86,8 @@ public class RenderGlowPanel implements IIconSelfRegister for(int i = 4; i < 5; i++) { - frameModels[i].render(0, frameModels[i].verts.length, new Translation(0, 0, 0), new IconTransformation(icon), new ColourMultiplier(white.rgba())); - lightModels[i].render(0, lightModels[i].verts.length, new Translation(0, 0, 0), new IconTransformation(icon), new ColourMultiplier(colour.rgba())); + frameModels[i].render(new IconTransformation(icon), new ColourMultiplier(white.rgba())); + lightModels[i].render(new IconTransformation(icon), new ColourMultiplier(colour.rgba())); } CCRenderState.draw(); diff --git a/src/main/java/mekanism/client/render/RenderPartTransmitter.java b/src/main/java/mekanism/client/render/RenderPartTransmitter.java index e01fb78dd..000550ead 100644 --- a/src/main/java/mekanism/client/render/RenderPartTransmitter.java +++ b/src/main/java/mekanism/client/render/RenderPartTransmitter.java @@ -7,7 +7,6 @@ import mekanism.api.Coord4D; import mekanism.client.model.ModelTransporterBox; import mekanism.client.render.MekanismRenderer.DisplayInteger; import mekanism.client.render.MekanismRenderer.Model3D; -import mekanism.common.Mekanism; import mekanism.common.item.ItemConfigurator; import mekanism.common.multipart.PartDiversionTransporter; import mekanism.common.multipart.PartLogisticalTransporter; @@ -92,20 +91,18 @@ public class RenderPartTransmitter implements IIconSelfRegister small_models = CCModel.parseObjModels(MekanismUtils.getResource(ResourceType.MODEL, "transmitter_small.obj"), 7, null); - for(CCModel c : small_models.values()) + for(Map.Entry e : small_models.entrySet()) { - c.apply(new Translation(.5, .5, .5)); - c.computeLighting(LightModel.standardLightModel); - c.shrinkUVs(0.0005); + e.setValue(e.getValue().twoFacedCopy().apply(new Translation(Vector3.center)).shrinkUVs(0.0005)); + e.getValue().computeLighting(LightModel.standardLightModel); } large_models = CCModel.parseObjModels(MekanismUtils.getResource(ResourceType.MODEL, "transmitter_large.obj"), 7, null); - for(CCModel c : large_models.values()) + for(Map.Entry e : large_models.entrySet()) { - c.apply(new Translation(.5, .5, .5)); - c.computeLighting(LightModel.standardLightModel); - c.shrinkUVs(0.0005); + e.setValue(e.getValue().twoFacedCopy().apply(new Translation(Vector3.center)).shrinkUVs(0.0005)); + e.getValue().computeLighting(LightModel.standardLightModel); } contents_models = CCModel.parseObjModels(MekanismUtils.getResource(ResourceType.MODEL, "transmitter_contents.obj"), 7, null); @@ -118,7 +115,7 @@ public class RenderPartTransmitter implements IIconSelfRegister for(CCModel c : contents_models.values()) { - c.apply(new Translation(.5, .5, .5)); + c.apply(new Translation(Vector3.center)); c.computeLighting(interiorLightModel); c.shrinkUVs(0.0005); } @@ -306,7 +303,8 @@ public class RenderPartTransmitter implements IIconSelfRegister } } } - else if(pipe.getConnectionType(side) != ConnectionType.NONE) { + else if(pipe.getConnectionType(side) != ConnectionType.NONE) + { GL11.glCullFace(GL11.GL_FRONT); CCRenderState.startDrawing(); renderFluidInOut(side, pipe); @@ -493,7 +491,6 @@ public class RenderPartTransmitter implements IIconSelfRegister public void renderStatic(PartSidedPipe transmitter) { - TextureUtils.bindAtlas(0); CCRenderState.reset(); CCRenderState.setBrightness(transmitter.world(), transmitter.x(), transmitter.y(), transmitter.z()); @@ -549,10 +546,10 @@ public class RenderPartTransmitter implements IIconSelfRegister { if(color != null) { - cc.render(0, cc.verts.length, new Translation(x, y, z), new IconTransformation(icon), new ColourMultiplier(color.rgba())); + cc.render(new Translation(x, y, z), new IconTransformation(icon), new ColourMultiplier(color.rgba())); } else { - cc.render(0, cc.verts.length, new Translation(x, y, z), new IconTransformation(icon)); + cc.render(new Translation(x, y, z), new IconTransformation(icon)); } } @@ -560,10 +557,10 @@ public class RenderPartTransmitter implements IIconSelfRegister { if(color != null) { - cc.render(0, cc.verts.length, new Translation(0, 0, 0), new IconTransformation(icon), new ColourMultiplier(color.rgba())); + cc.render(new IconTransformation(icon), new ColourMultiplier(color.rgba())); } else { - cc.render(0, cc.verts.length, new Translation(0, 0, 0), new IconTransformation(icon)); + cc.render(new IconTransformation(icon)); } } diff --git a/src/main/java/mekanism/common/multipart/PartGlowPanel.java b/src/main/java/mekanism/common/multipart/PartGlowPanel.java index bfa49cf2b..a2162d527 100644 --- a/src/main/java/mekanism/common/multipart/PartGlowPanel.java +++ b/src/main/java/mekanism/common/multipart/PartGlowPanel.java @@ -111,12 +111,13 @@ public class PartGlowPanel extends JCuboidPart implements JNormalOcclusion, JIco @SideOnly(Side.CLIENT) public boolean renderStatic(Vector3 pos, int pass) { - if(pass == 1) + if(pass == 0) { RenderGlowPanel.getInstance().renderStatic(this); + return true; } - return true; + return false; } @Override diff --git a/src/main/java/mekanism/common/multipart/PartSidedPipe.java b/src/main/java/mekanism/common/multipart/PartSidedPipe.java index 3d601f836..078c17396 100644 --- a/src/main/java/mekanism/common/multipart/PartSidedPipe.java +++ b/src/main/java/mekanism/common/multipart/PartSidedPipe.java @@ -314,9 +314,10 @@ public abstract class PartSidedPipe extends TMultiPart implements TSlottedPart, if(pass == 1) { RenderPartTransmitter.getInstance().renderStatic(this); + return true; } - return true; + return false; } @Override diff --git a/src/main/resources/assets/mekanism/gui/GuiDigitalMinerConfig.png b/src/main/resources/assets/mekanism/gui/GuiDigitalMinerConfig.png index 10c5654e1bbd05c2e0f3bcabe79f923715896084..bc6c516fe0e7fb65708d7c8fae6c0bbbd53f5253 100644 GIT binary patch literal 4836 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 literal 5304 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