89 lines
3.7 KiB
Java
89 lines
3.7 KiB
Java
package mods.betterfoliage.client.render;
|
|
|
|
import mods.betterfoliage.common.config.Config;
|
|
import mods.betterfoliage.common.util.Double3;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.client.Minecraft;
|
|
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.client.event.TextureStitchEvent;
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
|
|
import cpw.mods.fml.client.registry.RenderingRegistry;
|
|
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public class RenderBlockBetterGrass extends RenderBlockAOBase implements ISimpleBlockRenderingHandler {
|
|
|
|
public IIcon grassIcons[] = new IIcon[2];
|
|
|
|
public static int register() {
|
|
int result = RenderingRegistry.getNextAvailableRenderId();
|
|
RenderBlockBetterGrass renderGrass = new RenderBlockBetterGrass();
|
|
RenderingRegistry.registerBlockHandler(result, renderGrass);
|
|
MinecraftForge.EVENT_BUS.register(renderGrass);
|
|
renderGrass.init();
|
|
return result;
|
|
}
|
|
|
|
public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) {
|
|
renderStandardBlockAsItem(renderer, block, metadata, 1.0f);
|
|
}
|
|
|
|
public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) {
|
|
// store world for later use
|
|
blockAccess = world;
|
|
|
|
// render grass block
|
|
setRenderBoundsFromBlock(block);
|
|
setPassCounters(1);
|
|
boolean result = renderStandardBlock(block, x, y, z);
|
|
|
|
if (y == 255 || !blockAccess.isAirBlock(x, y + 1, z)) return result;
|
|
|
|
int variation = getSemiRandomFromPos(x, y, z, 0);
|
|
int heightVariation = getSemiRandomFromPos(x, y, z, 1);
|
|
double halfSize = Config.grassSize.value * 0.5;
|
|
double halfHeight = 0.5 * (Config.grassHeightMin.value + pRand[heightVariation] * (Config.grassHeightMax.value - Config.grassHeightMin.value));
|
|
Double3 drawCenter = new Double3(x + 0.5, y + 1.0 + halfHeight, z + 0.5).add(pRot[variation].scaleAxes(Config.grassHOffset.value, 0.0, Config.grassHOffset.value));
|
|
Double3 horz1 = new Double3(halfSize, 0.0, halfSize);
|
|
Double3 horz2 = new Double3(halfSize, 0.0, -halfSize);
|
|
Double3 vert1 = new Double3(0.0, halfHeight, 0.0);
|
|
IIcon grassIcon = grassIcons[variation % 2];
|
|
|
|
if (Minecraft.isAmbientOcclusionEnabled()) {
|
|
renderQuadWithShading(grassIcon, drawCenter, horz1, vert1, 0, aoYPXZPP, aoYPXZNN, aoYPXZNN, aoYPXZPP);
|
|
renderQuadWithShading(grassIcon, drawCenter, horz1.inverse(), vert1, 0, aoYPXZNN, aoYPXZPP, aoYPXZPP, aoYPXZNN);
|
|
renderQuadWithShading(grassIcon, drawCenter, horz2, vert1, 0, aoYPXZPN, aoYPXZNP, aoYPXZNP, aoYPXZPN);
|
|
renderQuadWithShading(grassIcon, drawCenter, horz2.inverse(), vert1, 0, aoYPXZNP, aoYPXZPN, aoYPXZPN, aoYPXZNP);
|
|
} else {
|
|
Tessellator.instance.setBrightness(block.getMixedBrightnessForBlock(blockAccess, x, y + 1, z));
|
|
renderQuad(grassIcon, drawCenter, horz1, vert1, 0);
|
|
renderQuad(grassIcon, drawCenter, horz1.inverse(), vert1, 0);
|
|
renderQuad(grassIcon, drawCenter, horz2, vert1, 0);
|
|
renderQuad(grassIcon, drawCenter, horz2.inverse(), vert1, 0);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public boolean shouldRender3DInInventory(int modelId) {
|
|
return true;
|
|
}
|
|
|
|
public int getRenderId() {
|
|
return 0;
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public void handleTextureReload(TextureStitchEvent.Pre event) {
|
|
if (event.map.getTextureType() != 0) return;
|
|
for (int idx = 0; idx < 2; idx++) {
|
|
grassIcons[idx] = event.map.registerIcon(String.format("betterfoliage:grass_%d", idx));
|
|
}
|
|
}
|
|
}
|