George Paton 58ec00004c Render the blocks in the inventory correctly
Add crafting recipes for the three light types
2024-02-12 16:14:05 +11:00

119 lines
4.0 KiB
Java

package com.hbm.render.block;
import org.lwjgl.opengl.GL11;
import com.hbm.blocks.machine.Spotlight;
import com.hbm.blocks.machine.SpotlightModular;
import com.hbm.render.util.ObjUtil;
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;
public class RenderLight implements ISimpleBlockRenderingHandler {
@Override
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
if (!(block instanceof Spotlight)) return;
Spotlight spot = (Spotlight) block;
GL11.glPushMatrix();
Tessellator tessellator = Tessellator.instance;
IIcon iicon = block.getIcon(0, 0);
tessellator.setColorOpaque_F(1, 1, 1);
if(renderer.hasOverrideBlockTexture()) {
iicon = renderer.overrideBlockTexture;
}
GL11.glRotated(-90, 0, 1, 0);
GL11.glScaled(1.5D, 1.5D, 1.5D);
tessellator.startDrawingQuads();
ObjUtil.renderPartWithIcon(spot.getModel(), spot.getPartName(0), iicon, tessellator, 0, false);
tessellator.draw();
GL11.glPopMatrix();
}
@Override
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
if (!(block instanceof Spotlight)) return true;
Spotlight spot = (Spotlight) block;
Tessellator tessellator = Tessellator.instance;
ForgeDirection dir = spot.getDirection(world, x, y, z);
tessellator.setBrightness(block.getMixedBrightnessForBlock(world, x, y, z));
tessellator.setColorOpaque_F(1, 1, 1);
float ox = 0.5F - dir.offsetX * 0.5F, oy = 0.5F - dir.offsetY * 0.5F, oz = 0.5F - dir.offsetZ * 0.5F;
float rot = ObjUtil.getYaw(dir);
float pitch = ObjUtil.getPitch(dir);
float roll = 0;
int connectionCount = 0;
if (spot instanceof SpotlightModular) {
ForgeDirection connectionDirection = null;
SpotlightModular modular = (SpotlightModular) spot;
// Searching through only adjacent blocks is simple, iterate through all directions ignoring the root and its opposite
// Once we have found any valid connection, we'll only connect in that one axis
for (ForgeDirection availableDir : ForgeDirection.VALID_DIRECTIONS) {
if (availableDir == dir || availableDir == dir.getOpposite()) continue;
if (modular.canConnectTo(world, x + availableDir.offsetX, y + availableDir.offsetY, z + availableDir.offsetZ)) {
connectionCount++;
connectionDirection = availableDir;
break;
}
}
if (connectionDirection != null) {
// Check if we're sandwiched between two lights
if (modular.canConnectTo(world, x - connectionDirection.offsetX, y - connectionDirection.offsetY, z - connectionDirection.offsetZ)) {
connectionCount++;
}
roll = getRotation(connectionDirection, dir);
}
}
tessellator.addTranslation(x + ox, y + oy, z + oz);
ObjUtil.renderPartWithIcon(spot.getModel(), spot.getPartName(connectionCount), block.getIcon(0, 0), tessellator, rot, pitch, roll, false);
tessellator.addTranslation(-x - ox, -y - oy, -z - oz);
return true;
}
@Override
public boolean shouldRender3DInInventory(int modelId) {
return true;
}
@Override
public int getRenderId() {
return Spotlight.renderID;
}
// This is very ad-hoc, which isn't ideal
private float getRotation(ForgeDirection dir, ForgeDirection axis) {
float flipX = axis == ForgeDirection.DOWN || axis == ForgeDirection.NORTH || axis == ForgeDirection.WEST ? -0.5F : 0.5F;
float addX = axis == ForgeDirection.NORTH || axis == ForgeDirection.SOUTH ? -0.5F : 0;
boolean flipNS = axis == ForgeDirection.WEST;
switch (dir) {
case NORTH: return flipNS ? (float)Math.PI : 0;
case SOUTH: return !flipNS ? (float)Math.PI : 0;
case EAST: return (float)Math.PI * (flipX + addX);
case WEST: return (float)Math.PI * (-flipX + addX);
case UP: return (float)Math.PI * -0.5F;
case DOWN: return (float)Math.PI * 0.5F;
default: return 0;
}
}
}