package joshie.harvest.cooking.render;
import joshie.harvest.cooking.CookingAPI;
import joshie.harvest.cooking.tile.TileCooking;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.VertexBuffer;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL14;
import javax.annotation.Nullable;
import java.util.List;
import static net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.FIXED;
import static net.minecraft.client.renderer.texture.TextureMap.LOCATION_BLOCKS_TEXTURE;
import static net.minecraft.client.renderer.vertex.DefaultVertexFormats.POSITION_TEX;
@SideOnly(Side.CLIENT)
public abstract class SpecialRendererCookware<T extends TileCooking> extends TileEntitySpecialRenderer<T> {
private static final Minecraft MINECRAFT = Minecraft.getMinecraft();
@Override
public void renderTileEntityAt(@Nullable T tile, double x, double y, double z, float tick, int destroyStage) {
GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
renderCookware(tile);
GlStateManager.popMatrix();
}
protected void renderCookware(T tile) {
List<ItemStack> ingredients = tile.getIngredients();
List<ItemStack> results = tile.getResult();
if (results != null) {
for (ItemStack result: results) {
renderResult(tile, result);
}
}
int fluidId = 0;
int max = ingredients.size();
for (int i = 0; i < max; i++) {
ItemStack ingredient = ingredients.get(i);
ResourceLocation fluid = CookingAPI.INSTANCE.getFluid(ingredient);
if (fluid == null) {
renderIngredient(ingredient, tile.heightOffset[i], tile.rotations[i], tile.offset1[i], tile.offset2[i]);
} else {
renderFluid(fluidId, tile.getWorld(), fluid);
fluidId++;
}
}
}
public void renderFluid(int i, World world, ResourceLocation fluid) {}
public abstract void translateIngredient(boolean isBlock, float position, float rotation, float offset1, float offset2);
public void translateResult(boolean isBlock) {}
public void translateResult(T t, boolean isBlock) {
translateResult(isBlock);
}
void renderIngredient(ItemStack stack, float position, float rotation, float offset1, float offset2) {
GlStateManager.pushMatrix();
RenderHelper.disableStandardItemLighting();
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
if (Minecraft.isAmbientOcclusionEnabled()) {
GL11.glShadeModel(GL11.GL_SMOOTH);
} else {
GL11.glShadeModel(GL11.GL_FLAT);
}
translateIngredient(stack.getItem() instanceof ItemBlock, position, rotation, offset1, offset2);
GlStateManager.blendFunc(GL11.GL_CONSTANT_ALPHA, GL11.GL_ONE_MINUS_CONSTANT_ALPHA);
GL14.glBlendColor(1F, 1F, 1F, 1F);
MINECRAFT.getRenderItem().renderItem(stack, FIXED);
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.disableBlend();
RenderHelper.enableStandardItemLighting();
GlStateManager.popMatrix();
}
void renderResult(T t, ItemStack stack) {
GlStateManager.pushMatrix();
RenderHelper.disableStandardItemLighting();
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
if (Minecraft.isAmbientOcclusionEnabled()) {
GL11.glShadeModel(GL11.GL_SMOOTH);
} else {
GL11.glShadeModel(GL11.GL_FLAT);
}
translateResult(t, stack.getItem() instanceof ItemBlock);
GlStateManager.blendFunc(GL11.GL_CONSTANT_ALPHA, GL11.GL_ONE_MINUS_CONSTANT_ALPHA);
GL14.glBlendColor(1F, 1F, 1F, 1F);
MINECRAFT.getRenderItem().renderItem(stack, FIXED);
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.disableBlend();
RenderHelper.enableStandardItemLighting();
GlStateManager.popMatrix();
}
@SuppressWarnings("ConstantConditions")
void renderFluidPlane(ResourceLocation fluid, float x, float y, float z, float size) {
GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
RenderHelper.disableStandardItemLighting();
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
Tessellator tessellator = Tessellator.getInstance();
VertexBuffer vb = tessellator.getBuffer();
TextureAtlasSprite sprite = MINECRAFT.getTextureMapBlocks().getTextureExtry(fluid.toString());
if (sprite != null) {
MINECRAFT.renderEngine.bindTexture(LOCATION_BLOCKS_TEXTURE);
double uMin = (double) sprite.getMinU();
double uMax = (double) sprite.getMaxU();
double vMin = (double) sprite.getMinV();
double vMax = (double) sprite.getMaxV();
vb.begin(7, POSITION_TEX);
vb.pos(size / 2f, 0, size / 2f).tex(uMax, vMax).endVertex();
vb.pos(size / 2f, 0, -size / 2f).tex(uMax, vMin).endVertex();
vb.pos(-size / 2f, 0, -size / 2f).tex(uMin, vMin).endVertex();
vb.pos(-size / 2f, 0, size / 2f).tex(uMin, vMax).endVertex();
tessellator.draw();
}
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.disableBlend();
RenderHelper.enableStandardItemLighting();
GlStateManager.popMatrix();
}
@SuppressWarnings("ConstantConditions")
void renderFluidCube(ResourceLocation fluid, float x, float y, float z, float size) {
GlStateManager.pushMatrix();
GlStateManager.translate(x, y, z);
RenderHelper.disableStandardItemLighting();
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
Tessellator tessellator = Tessellator.getInstance();
VertexBuffer vb = tessellator.getBuffer();
TextureAtlasSprite sprite = MINECRAFT.getTextureMapBlocks().getTextureExtry(fluid.toString());
if (sprite != null) {
MINECRAFT.renderEngine.bindTexture(LOCATION_BLOCKS_TEXTURE);
double uMin = (double) sprite.getMinU();
double uMax = (double) sprite.getMaxU();
double vMin = (double) sprite.getMinV();
double vMax = (double) sprite.getMaxV();
//Draw Top
//
vb.begin(7, POSITION_TEX);
vb.pos(size / 2f, 0, size / 2f).tex(uMax, vMax).endVertex();
vb.pos(size / 2f, 0, -size / 2f).tex(uMax, vMin).endVertex();
vb.pos(-size / 2f, 0, -size / 2f).tex(uMin, vMin).endVertex();
vb.pos(-size / 2f, 0, size / 2f).tex(uMin, vMax).endVertex();
tessellator.draw();
//Draw Bottom
vb.begin(7, POSITION_TEX);
vb.pos(size / 2f, -size / 2f, -size / 2f).tex(uMax, vMax).endVertex();//Top Right
vb.pos(size / 2f, -size / 2f, size / 2f).tex(uMax, vMin).endVertex(); //Top Left
vb.pos(-size / 2f, -size / 2f, size / 2f).tex(uMin, vMin).endVertex(); //Bottom Left
vb.pos(-size / 2f, -size / 2f, -size / 2f).tex(uMin, vMax).endVertex(); //Bottom Right
tessellator.draw();
//Draw Side 1
vb.begin(7, POSITION_TEX);
vb.pos(-size / 2f, 0, size / 2f).tex(uMax, vMax).endVertex();
vb.pos(-size / 2f, 0, -size / 2f).tex(uMax, vMin).endVertex();
vb.pos(-size / 2f, -size / 2f, -size / 2f).tex(uMin, vMin).endVertex();
vb.pos(-size / 2f, -size / 2f, size / 2f).tex(uMin, vMax).endVertex();
tessellator.draw();
//Draw Side 2
vb.begin(7, POSITION_TEX);
vb.pos(size / 2f, 0, -size / 2f).tex(uMax, vMax).endVertex();
vb.pos(size / 2f, 0, size / 2f).tex(uMax, vMin).endVertex();
vb.pos(size / 2f, -size / 2f, size / 2f).tex(uMin, vMin).endVertex();
vb.pos(size / 2f, -size / 2f, -size / 2f).tex(uMin, vMax).endVertex();
tessellator.draw();
//Draw Side 3
vb.begin(7, POSITION_TEX);
vb.pos(size / 2f, 0, size / 2f).tex(uMax, vMax).endVertex(); // Top Right
vb.pos(-size / 2f, 0, size / 2f).tex(uMax, vMin).endVertex(); //Top Left
vb.pos(-size / 2f, -size / 2f, size / 2f).tex(uMin, vMin).endVertex(); //Bottom Left
vb.pos(size / 2f, -size / 2f, size / 2f).tex(uMin, vMax).endVertex(); //Bottom Right
tessellator.draw();
//Draw Side 2
vb.begin(7, POSITION_TEX);
vb.pos(-size / 2f, 0, -size / 2f).tex(uMax, vMax).endVertex(); //Top Right
vb.pos(size / 2f, 0, -size / 2f).tex(uMax, vMin).endVertex(); //Top Left
vb.pos(size / 2f, -size / 2f, -size / 2f).tex(uMin, vMin).endVertex(); //Bottom Left
vb.pos(-size / 2f, -size / 2f, -size / 2f).tex(uMin, vMax).endVertex(); //Bottom Right
tessellator.draw();
}
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.disableBlend();
RenderHelper.enableStandardItemLighting();
GlStateManager.popMatrix();
}
}