/**
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
*
* File Created @ [Aug 8, 2014, 2:38:15 PM (GMT)]
*/
package vazkii.botania.client.render.tile;
import java.awt.Color;
import java.nio.FloatBuffer;
import java.util.Random;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.VertexBuffer;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation;
import vazkii.botania.common.block.tile.TileStarfield;
// This is copied from the vanilla end portal TESR, relevant edits are commented
public class RenderTileStarfield extends TileEntitySpecialRenderer<TileStarfield> {
private static final ResourceLocation END_SKY_TEXTURE = new ResourceLocation("textures/environment/end_sky.png");
private static final ResourceLocation END_PORTAL_TEXTURE = new ResourceLocation("textures/entity/end_portal.png");
private static final Random RANDOM = new Random(31100L);
private static final FloatBuffer MODELVIEW = GLAllocation.createDirectFloatBuffer(16);
private static final FloatBuffer PROJECTION = GLAllocation.createDirectFloatBuffer(16);
private FloatBuffer buffer = GLAllocation.createDirectFloatBuffer(16);
@Override
public void renderTileEntityAt(@Nonnull TileStarfield starfield, double x, double y, double z, float partialTicks, int destroyStage)
{
GlStateManager.disableLighting();
RANDOM.setSeed(31100L);
GlStateManager.getFloat(2982, MODELVIEW);
GlStateManager.getFloat(2983, PROJECTION);
double d0 = x * x + y * y + z * z;
int i = this.getPasses(d0);
float f = this.getOffset();
boolean flag = false;
for (int j = 0; j < i; ++j)
{
GlStateManager.pushMatrix();
float f1 = 2.0F / (float)(18 - j);
if (j == 0)
{
this.bindTexture(END_SKY_TEXTURE);
f1 = 0.15F;
GlStateManager.enableBlend();
GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
}
if (j >= 1)
{
this.bindTexture(END_PORTAL_TEXTURE);
flag = true;
Minecraft.getMinecraft().entityRenderer.func_191514_d(true);
}
if (j == 1)
{
GlStateManager.enableBlend();
GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE);
}
GlStateManager.texGen(GlStateManager.TexGen.S, 9216);
GlStateManager.texGen(GlStateManager.TexGen.T, 9216);
GlStateManager.texGen(GlStateManager.TexGen.R, 9216);
GlStateManager.texGen(GlStateManager.TexGen.S, 9474, this.getBuffer(1.0F, 0.0F, 0.0F, 0.0F));
GlStateManager.texGen(GlStateManager.TexGen.T, 9474, this.getBuffer(0.0F, 1.0F, 0.0F, 0.0F));
GlStateManager.texGen(GlStateManager.TexGen.R, 9474, this.getBuffer(0.0F, 0.0F, 1.0F, 0.0F));
GlStateManager.enableTexGenCoord(GlStateManager.TexGen.S);
GlStateManager.enableTexGenCoord(GlStateManager.TexGen.T);
GlStateManager.enableTexGenCoord(GlStateManager.TexGen.R);
GlStateManager.popMatrix();
GlStateManager.matrixMode(5890);
GlStateManager.pushMatrix();
GlStateManager.loadIdentity();
GlStateManager.translate(0.5F, 0.5F, 0.0F);
GlStateManager.scale(0.5F, 0.5F, 1.0F);
float f2 = (float)(j + 1);
GlStateManager.translate(17.0F / f2, (2.0F + f2 / 1.5F) * ((float)Minecraft.getSystemTime() % 800000.0F / 800000.0F), 0.0F);
GlStateManager.rotate((f2 * f2 * 4321.0F + f2 * 9.0F) * 2.0F, 0.0F, 0.0F, 1.0F);
GlStateManager.scale(4.5F - f2 / 4.0F, 4.5F - f2 / 4.0F, 1.0F);
GlStateManager.multMatrix(PROJECTION);
GlStateManager.multMatrix(MODELVIEW);
Tessellator tessellator = Tessellator.getInstance();
VertexBuffer vertexbuffer = tessellator.getBuffer();
vertexbuffer.begin(7, DefaultVertexFormats.POSITION_COLOR);
float f3 = (RANDOM.nextFloat() * 0.5F + 0.1F) * f1;
float f4 = (RANDOM.nextFloat() * 0.5F + 0.4F) * f1;
float f5 = (RANDOM.nextFloat() * 0.5F + 0.5F) * f1;
// Botania: change color based on time
Color color = Color.getHSBColor(Minecraft.getSystemTime() / 20F % 360 / 360F, 1F, 1F);
f3 = color.getRed() / 255F;
f4 = color.getGreen() / 255F;
f5 = color.getBlue() / 255F;
f3 *= f1; f4 *= f1; f5 *= f1;
/* Botania - don't render other faces
if (te.shouldRenderFace(EnumFacing.SOUTH))
{
vertexbuffer.pos(x, y, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y + 1.0D, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y + 1.0D, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
}
if (te.shouldRenderFace(EnumFacing.NORTH))
{
vertexbuffer.pos(x, y + 1.0D, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y + 1.0D, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y, z).color(f3, f4, f5, 1.0F).endVertex();
}
if (te.shouldRenderFace(EnumFacing.EAST))
{
vertexbuffer.pos(x + 1.0D, y + 1.0D, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y + 1.0D, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y, z).color(f3, f4, f5, 1.0F).endVertex();
}
if (te.shouldRenderFace(EnumFacing.WEST))
{
vertexbuffer.pos(x, y, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y + 1.0D, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y + 1.0D, z).color(f3, f4, f5, 1.0F).endVertex();
}
if (te.shouldRenderFace(EnumFacing.DOWN))
{
vertexbuffer.pos(x, y, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
}*/
// Botania - always render up face if (te.shouldRenderFace(EnumFacing.UP))
{
vertexbuffer.pos(x, y + (double)f, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y + (double)f, z + 1.0D).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x + 1.0D, y + (double)f, z).color(f3, f4, f5, 1.0F).endVertex();
vertexbuffer.pos(x, y + (double)f, z).color(f3, f4, f5, 1.0F).endVertex();
}
tessellator.draw();
GlStateManager.popMatrix();
GlStateManager.matrixMode(5888);
this.bindTexture(END_SKY_TEXTURE);
}
GlStateManager.disableBlend();
GlStateManager.disableTexGenCoord(GlStateManager.TexGen.S);
GlStateManager.disableTexGenCoord(GlStateManager.TexGen.T);
GlStateManager.disableTexGenCoord(GlStateManager.TexGen.R);
GlStateManager.enableLighting();
if (flag)
{
Minecraft.getMinecraft().entityRenderer.func_191514_d(false);
}
}
private int getPasses(double p_191286_1_)
{
int i;
if (p_191286_1_ > 36864.0D)
{
i = 1;
}
else if (p_191286_1_ > 25600.0D)
{
i = 3;
}
else if (p_191286_1_ > 16384.0D)
{
i = 5;
}
else if (p_191286_1_ > 9216.0D)
{
i = 7;
}
else if (p_191286_1_ > 4096.0D)
{
i = 9;
}
else if (p_191286_1_ > 1024.0D)
{
i = 11;
}
else if (p_191286_1_ > 576.0D)
{
i = 13;
}
else if (p_191286_1_ > 256.0D)
{
i = 14;
}
else
{
i = 15;
}
return i;
}
private float getOffset()
{
return 0.24F; // Botania: move to bottom of block space
}
private FloatBuffer getBuffer(float p_147525_1_, float p_147525_2_, float p_147525_3_, float p_147525_4_)
{
this.buffer.clear();
this.buffer.put(p_147525_1_).put(p_147525_2_).put(p_147525_3_).put(p_147525_4_);
this.buffer.flip();
return this.buffer;
}
}