Try to optimise arcane lock rendering, fixes #399
This commit is contained in:
@@ -20,9 +20,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|||||||
import net.minecraftforge.fml.relauncher.Side;
|
import net.minecraftforge.fml.relauncher.Side;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mod.EventBusSubscriber(Side.CLIENT)
|
@Mod.EventBusSubscriber(Side.CLIENT)
|
||||||
public class RenderArcaneLock {
|
public class RenderArcaneLock {
|
||||||
|
|
||||||
@@ -39,36 +36,44 @@ public class RenderArcaneLock {
|
|||||||
|
|
||||||
EntityPlayer player = Minecraft.getMinecraft().player;
|
EntityPlayer player = Minecraft.getMinecraft().player;
|
||||||
World world = Minecraft.getMinecraft().world;
|
World world = Minecraft.getMinecraft().world;
|
||||||
|
|
||||||
GlStateManager.pushMatrix();
|
|
||||||
GlStateManager.enableBlend();
|
|
||||||
boolean lighting = GL11.glIsEnabled(GL11.GL_LIGHTING);
|
|
||||||
GlStateManager.disableLighting();
|
|
||||||
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
|
|
||||||
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
Vec3d origin = player.getPositionEyes(event.getPartialTicks());
|
Vec3d origin = player.getPositionEyes(event.getPartialTicks());
|
||||||
GlStateManager.translate(-origin.x, -origin.y + player.getEyeHeight(), -origin.z);
|
|
||||||
|
|
||||||
GlStateManager.color(1, 1, 1, 1);
|
|
||||||
|
|
||||||
Minecraft.getMinecraft().renderEngine.bindTexture(textures[(player.ticksExisted % (textures.length * 2))/2]);
|
|
||||||
|
|
||||||
Tessellator tessellator = Tessellator.getInstance();
|
Tessellator tessellator = Tessellator.getInstance();
|
||||||
BufferBuilder buffer = tessellator.getBuffer();
|
BufferBuilder buffer = tessellator.getBuffer();
|
||||||
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
|
||||||
|
|
||||||
// Someone managed to get a CME here so let's just copy the list to be safe
|
boolean flag = false;
|
||||||
|
boolean lighting = false;
|
||||||
|
|
||||||
|
// Someone managed to get a CME here so let's iterate manually to be safe (don't copy the list, it's expensive!)
|
||||||
// It's only cosmetic so if a tileentity somehow gets removed while we're rendering them it's not a big deal
|
// It's only cosmetic so if a tileentity somehow gets removed while we're rendering them it's not a big deal
|
||||||
List<TileEntity> tileentities = new ArrayList<>(world.loadedTileEntityList);
|
for(int i=0; i<world.loadedTileEntityList.size(); i++){
|
||||||
|
|
||||||
for(TileEntity tileentity : tileentities){
|
TileEntity tileentity = world.loadedTileEntityList.get(i);
|
||||||
|
|
||||||
if(tileentity == null) continue; // What the heck VoxelMap
|
if(tileentity == null) continue; // What the heck VoxelMap
|
||||||
|
|
||||||
if(tileentity.getDistanceSq(origin.x, origin.y, origin.z) <= tileentity.getMaxRenderDistanceSquared()
|
if(tileentity.getDistanceSq(origin.x, origin.y, origin.z) <= tileentity.getMaxRenderDistanceSquared()
|
||||||
&& tileentity.getTileData().hasUniqueId(ArcaneLock.NBT_KEY)){
|
&& tileentity.getTileData().hasUniqueId(ArcaneLock.NBT_KEY)){
|
||||||
|
|
||||||
|
if(!flag){
|
||||||
|
|
||||||
|
flag = true;
|
||||||
|
|
||||||
|
GlStateManager.pushMatrix();
|
||||||
|
GlStateManager.enableBlend();
|
||||||
|
lighting = GL11.glIsEnabled(GL11.GL_LIGHTING);
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
|
||||||
|
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
|
GlStateManager.translate(-origin.x, -origin.y + player.getEyeHeight(), -origin.z);
|
||||||
|
|
||||||
|
GlStateManager.color(1, 1, 1, 1);
|
||||||
|
|
||||||
|
Minecraft.getMinecraft().renderEngine.bindTexture(textures[(player.ticksExisted % (textures.length * 2))/2]);
|
||||||
|
|
||||||
|
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
|
||||||
|
}
|
||||||
|
|
||||||
Vec3d[] vertices = WizardryUtilities.getVertices(world.getBlockState(tileentity.getPos()).getBoundingBox(world, tileentity.getPos()).grow(0.05).offset(tileentity.getPos()));
|
Vec3d[] vertices = WizardryUtilities.getVertices(world.getBlockState(tileentity.getPos()).getBoundingBox(world, tileentity.getPos()).grow(0.05).offset(tileentity.getPos()));
|
||||||
|
|
||||||
drawFace(buffer, vertices[0], vertices[1], vertices[3], vertices[2], 0, 0, 1, 1); // Bottom
|
drawFace(buffer, vertices[0], vertices[1], vertices[3], vertices[2], 0, 0, 1, 1); // Bottom
|
||||||
@@ -81,15 +86,19 @@ public class RenderArcaneLock {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tessellator.draw();
|
if(flag){
|
||||||
|
|
||||||
GlStateManager.disableBlend();
|
tessellator.draw();
|
||||||
GlStateManager.enableTexture2D();
|
|
||||||
if (lighting) {
|
GlStateManager.disableBlend();
|
||||||
GlStateManager.enableLighting();
|
GlStateManager.enableTexture2D();
|
||||||
|
if(lighting){
|
||||||
|
GlStateManager.enableLighting();
|
||||||
|
}
|
||||||
|
GlStateManager.disableRescaleNormal();
|
||||||
|
GlStateManager.popMatrix();
|
||||||
}
|
}
|
||||||
GlStateManager.disableRescaleNormal();
|
|
||||||
GlStateManager.popMatrix();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void drawFace(BufferBuilder buffer, Vec3d topLeft, Vec3d topRight, Vec3d bottomLeft, Vec3d bottomRight, float u1, float v1, float u2, float v2){
|
private static void drawFace(BufferBuilder buffer, Vec3d topLeft, Vec3d topRight, Vec3d bottomLeft, Vec3d bottomRight, float u1, float v1, float u2, float v2){
|
||||||
|
|||||||
Reference in New Issue
Block a user