package ttftcuts.physis.client.render.tile;
import org.lwjgl.opengl.ARBShaderObjects;
import org.lwjgl.opengl.GL11;
import ttftcuts.physis.Physis;
import ttftcuts.physis.client.model.ModelSocketTable;
import ttftcuts.physis.common.block.tile.TileEntitySocketTable;
import ttftcuts.physis.common.helper.ShaderCallback;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
public class RenderTileSocketTable extends TileEntitySpecialRenderer {
private static final ResourceLocation texture = new ResourceLocation(Physis.MOD_ID+":textures/blocks/socketTable.png");
// TEMA: MC end portal texture
private static final ResourceLocation starsTexture = new ResourceLocation("textures/entity/end_portal.png");
private static final ModelSocketTable model = new ModelSocketTable();
// forward face to number of 90 degree rotations conversion
private static final int[] rot = {-1,-1,2,0,1,3};
private final EntityItem dummyEntityItem = new EntityItem(null);
private final RenderItem dummyRenderItem;
private TileEntitySocketTable table;
private final ShaderCallback shaderCallback;
public RenderTileSocketTable() {
dummyRenderItem = new RenderItem() {
@Override
public boolean shouldBob() {
return false;
}
@Override
public boolean shouldSpreadItems() {
return false;
}
};
dummyRenderItem.setRenderManager(RenderManager.instance);
// TEMA: this is the shader callback where the uniforms are set for this particular shader.
// it's called each frame when the shader is bound. Probably the most expensive part of the whole thing.
// you might be able to even call this once per frame instead of once per draw, pointing call at the program instead of passing this in useShader.
shaderCallback = new ShaderCallback() {
@Override
public void call(int shader) {
Minecraft mc = Minecraft.getMinecraft();
int x = ARBShaderObjects.glGetUniformLocationARB(shader, "yaw");
ARBShaderObjects.glUniform1fARB(x, (float)((mc.thePlayer.rotationYaw * 2 * Math.PI) / 360.0));
int z = ARBShaderObjects.glGetUniformLocationARB(shader, "pitch");
ARBShaderObjects.glUniform1fARB(z, - (float)((mc.thePlayer.rotationPitch * 2 * Math.PI) / 360.0));
}
};
}
@Override
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float tick) {
table = (TileEntitySocketTable)tile;
GL11.glPushMatrix();
GL11.glColor4f(1f, 1f, 1f, 1f);
GL11.glTranslated(x, y, z);
Minecraft mc = Minecraft.getMinecraft();
GL11.glTranslatef(0.5f, 1.5f, 0.5f);
GL11.glScalef(1F, -1F, -1F);
GL11.glRotatef(90F * rot[table.facing], 0F, 1F, 0F);
ItemStack stack = table.getStackInSlot(0);
if (stack != null) {
GL11.glPushMatrix();
GL11.glScalef(1F, -1F, -1F);
dummyEntityItem.setEntityItemStack(stack);
GL11.glRotatef(90f, 1f, 0f, 0f);
GL11.glTranslatef(0.13f, 0.085f, 0.53f);
GL11.glRotatef(110f, 0f, 0f, 1f);
// corrective rotation for the item render spinning...
float rot = -(((float)dummyEntityItem.age) / 20.0F + dummyEntityItem.hoverStart) * (180F / (float)Math.PI);
GL11.glRotatef(rot, 0F, 1F, 0F);
float scale = 1.2f;
GL11.glScalef(scale, scale, scale);
dummyRenderItem.doRender(dummyEntityItem, 0, 0, 0, 0, 0);
GL11.glPopMatrix();
}
// TEMA: binding the star texture here instead of the normal table one - you'd want this conditional on ShaderHelper.useShaders, and act accordingly otherwise.
//mc.renderEngine.bindTexture(starsTexture);
mc.renderEngine.bindTexture(texture);
//ShaderHelper.useShader(ShaderHelper.testShader, shaderCallback);
model.render();
//ShaderHelper.releaseShader();
GL11.glPopMatrix();
}
}