BloodMagic/src/main/java/wayoftime/bloodmagic/client/render/block/RenderAltar.java
WayofTime 5e8437fe58 Demon Crucible implementation
Readded the Demon Crucible to test the World's Will Chunk saving/loading.
2020-11-03 17:23:44 -05:00

234 lines
7.3 KiB
Java

package wayoftime.bloodmagic.client.render.block;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.Atlases;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ItemCameraTransforms;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.entity.LivingEntity;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.fluids.FluidStack;
import wayoftime.bloodmagic.client.render.BloodMagicRenderer;
import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model3D;
import wayoftime.bloodmagic.client.render.RenderResizableCuboid;
import wayoftime.bloodmagic.common.block.BloodMagicBlocks;
import wayoftime.bloodmagic.tile.TileAltar;
public class RenderAltar extends TileEntityRenderer<TileAltar>
{
public RenderAltar(TileEntityRendererDispatcher rendererDispatcherIn)
{
super(rendererDispatcherIn);
}
private static final float MIN_HEIGHT = 0.499f;
private static final float MAX_HEIGHT = 0.745f;
@Override
public void render(TileAltar tileAltar, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int combinedLightIn, int combinedOverlayIn)
{
ItemStack inputStack = tileAltar.getStackInSlot(0);
float level = ((float) tileAltar.getCurrentBlood()) / (float) tileAltar.getCapacity();
this.renderItem(inputStack, tileAltar, matrixStack, buffer, combinedLightIn, combinedOverlayIn);
renderFluid(level, matrixStack, buffer, combinedLightIn, combinedOverlayIn);
// if (tileAltar.getCurrentTierDisplayed() != AltarTier.ONE)
// renderHologram(tileAltar, tileAltar.getCurrentTierDisplayed(), partialTicks);
}
private void renderFluid(float fluidLevel, MatrixStack matrixStack, IRenderTypeBuffer renderer, int combinedLightIn, int combinedOverlayIn)
{
Fluid fluid = BloodMagicBlocks.LIFE_ESSENCE_FLUID.get();
FluidStack fluidStack = new FluidStack(fluid, 1000);
FluidRenderData data = new FluidRenderData(fluidStack);
matrixStack.push();
Model3D model = getFluidModel(fluidLevel, data);
IVertexBuilder buffer = renderer.getBuffer(Atlases.getTranslucentCullBlockType());
// matrixStack.translate(data.loca, y, z);
// int glow = data.calculateGlowLight(0);
RenderResizableCuboid.INSTANCE.renderCube(model, matrixStack, buffer, data.getColorARGB(1), combinedLightIn, combinedOverlayIn);
matrixStack.pop();
}
private void renderItem(ItemStack stack, TileAltar tileAltar, MatrixStack matrixStack, IRenderTypeBuffer buffer, int combinedLightIn, int combinedOverlayIn)
{
matrixStack.push();
Minecraft mc = Minecraft.getInstance();
ItemRenderer itemRenderer = mc.getItemRenderer();
if (!stack.isEmpty())
{
matrixStack.translate(0.5, 1, 0.5);
matrixStack.push();
float rotation = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL);
matrixStack.rotate(Vector3f.YP.rotationDegrees(rotation));
matrixStack.scale(0.5F, 0.5F, 0.5F);
RenderHelper.enableStandardItemLighting();
IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stack, tileAltar.getWorld(), (LivingEntity) null);
itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.FIXED, true, matrixStack, buffer, combinedLightIn, combinedOverlayIn, ibakedmodel); // renderItem
RenderHelper.disableStandardItemLighting();
matrixStack.pop();
}
matrixStack.pop();
}
private Model3D getFluidModel(float fluidLevel, FluidRenderData data)
{
Model3D model = new BloodMagicRenderer.Model3D();
model.setTexture(data.getTexture());
model.minX = 0.1;
model.minY = MIN_HEIGHT;
model.minZ = 0.1;
model.maxX = 0.9;
model.maxY = (MAX_HEIGHT - MIN_HEIGHT) * fluidLevel + MIN_HEIGHT;
model.maxZ = 0.9;
return model;
}
public class FluidRenderData
{
public BlockPos location;
public int height;
public int length;
public int width;
public final FluidStack fluidType;
public FluidRenderData(FluidStack fluidType)
{
this.fluidType = fluidType;
}
public TextureAtlasSprite getTexture()
{
return Minecraft.getInstance().getAtlasSpriteGetter(AtlasTexture.LOCATION_BLOCKS_TEXTURE).apply(fluidType.getFluid().getAttributes().getStillTexture());
}
public boolean isGaseous()
{
return fluidType.getFluid().getAttributes().isGaseous(fluidType);
}
public int getColorARGB(float scale)
{
return fluidType.getFluid().getAttributes().getColor(fluidType);
}
public int calculateGlowLight(int light)
{
return light;
}
@Override
public int hashCode()
{
int code = super.hashCode();
code = 31 * code + fluidType.getFluid().getRegistryName().hashCode();
if (fluidType.hasTag())
{
code = 31 * code + fluidType.getTag().hashCode();
}
return code;
}
@Override
public boolean equals(Object data)
{
return super.equals(data) && data instanceof FluidRenderData
&& fluidType.isFluidEqual(((FluidRenderData) data).fluidType);
}
}
//
// private void renderHologram(TileAltar altar, AltarTier tier, float partialTicks)
// {
// EntityPlayerSP player = Minecraft.getMinecraft().player;
// World world = player.world;
//
// if (tier == AltarTier.ONE)
// return;
//
// GlStateManager.pushMatrix();
// GlStateManager.enableBlend();
// GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
// GlStateManager.color(1F, 1F, 1F, 0.6125F);
//
// BlockPos vec3, vX;
// vec3 = altar.getPos();
// double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * partialTicks;
// double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * partialTicks;
// double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * partialTicks;
//
// for (AltarComponent altarComponent : tier.getAltarComponents())
// {
// vX = vec3.add(altarComponent.getOffset());
// double minX = vX.getX() - posX;
// double minY = vX.getY() - posY;
// double minZ = vX.getZ() - posZ;
//
// if (!world.getBlockState(vX).isOpaqueCube())
// {
// TextureAtlasSprite texture = null;
//
// switch (altarComponent.getComponent())
// {
// case BLOODRUNE:
// texture = ClientHandler.blankBloodRune;
// break;
// case NOTAIR:
// texture = ClientHandler.stoneBrick;
// break;
// case GLOWSTONE:
// texture = ClientHandler.glowstone;
// break;
// case BLOODSTONE:
// texture = ClientHandler.bloodStoneBrick;
// break;
// case BEACON:
// texture = ClientHandler.beacon;
// break;
// case CRYSTAL:
// texture = ClientHandler.crystalCluster;
// break;
// }
//
// RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ);
// }
// }
//
// GlStateManager.popMatrix();
// }
// private static void setGLColorFromInt(int color)
// {
// float red = (color >> 16 & 0xFF) / 255.0F;
// float green = (color >> 8 & 0xFF) / 255.0F;
// float blue = (color & 0xFF) / 255.0F;
//
// GlStateManager.color(red, green, blue, 1.0F);
// }
}