/* Copyright (c) 2010-2016 Jesper Öqvist <jesper@llbit.se>
*
* This file is part of Chunky.
*
* Chunky is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Chunky is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Chunky. If not, see <http://www.gnu.org/licenses/>.
*/
package se.llbit.chunky.world;
import se.llbit.chunky.PersistentSettings;
import se.llbit.chunky.model.AnvilModel;
import se.llbit.chunky.model.BeaconModel;
import se.llbit.chunky.model.BedModel;
import se.llbit.chunky.model.BrewingStandModel;
import se.llbit.chunky.model.ButtonModel;
import se.llbit.chunky.model.CactusModel;
import se.llbit.chunky.model.CakeModel;
import se.llbit.chunky.model.CarpetModel;
import se.llbit.chunky.model.CauldronModel;
import se.llbit.chunky.model.ChestModel;
import se.llbit.chunky.model.ChorusFlowerModel;
import se.llbit.chunky.model.ChorusPlantModel;
import se.llbit.chunky.model.CocoaPlantModel;
import se.llbit.chunky.model.ComparatorModel;
import se.llbit.chunky.model.CropsModel;
import se.llbit.chunky.model.DaylightSensorModel;
import se.llbit.chunky.model.DirectionalBlockModel;
import se.llbit.chunky.model.DoorModel;
import se.llbit.chunky.model.DragonEggModel;
import se.llbit.chunky.model.EnchantmentTableModel;
import se.llbit.chunky.model.EndPortalFrameModel;
import se.llbit.chunky.model.EndPortalModel;
import se.llbit.chunky.model.EndRodModel;
import se.llbit.chunky.model.FarmlandModel;
import se.llbit.chunky.model.FenceGateModel;
import se.llbit.chunky.model.FenceModel;
import se.llbit.chunky.model.FireModel;
import se.llbit.chunky.model.FlowerPotModel;
import se.llbit.chunky.model.FurnaceModel;
import se.llbit.chunky.model.GlassPaneModel;
import se.llbit.chunky.model.GrassModel;
import se.llbit.chunky.model.GrassPathModel;
import se.llbit.chunky.model.HopperModel;
import se.llbit.chunky.model.IronBarsModel;
import se.llbit.chunky.model.LadderModel;
import se.llbit.chunky.model.LargeFlowerModel;
import se.llbit.chunky.model.LavaModel;
import se.llbit.chunky.model.LeafModel;
import se.llbit.chunky.model.LeverModel;
import se.llbit.chunky.model.LilyPadModel;
import se.llbit.chunky.model.MelonStemModel;
import se.llbit.chunky.model.ObserverModel;
import se.llbit.chunky.model.PistonExtensionModel;
import se.llbit.chunky.model.PistonModel;
import se.llbit.chunky.model.PressurePlateModel;
import se.llbit.chunky.model.PumpkinModel;
import se.llbit.chunky.model.QuartzModel;
import se.llbit.chunky.model.RailModel;
import se.llbit.chunky.model.RedstoneRepeaterModel;
import se.llbit.chunky.model.RedstoneWireModel;
import se.llbit.chunky.model.SaplingModel;
import se.llbit.chunky.model.SlabModel;
import se.llbit.chunky.model.SnowModel;
import se.llbit.chunky.model.SpriteModel;
import se.llbit.chunky.model.StairModel;
import se.llbit.chunky.model.StoneWallModel;
import se.llbit.chunky.model.TallGrassModel;
import se.llbit.chunky.model.TerracottaModel;
import se.llbit.chunky.model.TexturedBlockModel;
import se.llbit.chunky.model.TorchModel;
import se.llbit.chunky.model.TrapdoorModel;
import se.llbit.chunky.model.TripwireHookModel;
import se.llbit.chunky.model.TripwireModel;
import se.llbit.chunky.model.VineModel;
import se.llbit.chunky.model.WaterModel;
import se.llbit.chunky.model.WoodModel;
import se.llbit.chunky.renderer.scene.Scene;
import se.llbit.chunky.resources.Texture;
import se.llbit.json.JsonString;
import se.llbit.json.JsonValue;
import se.llbit.math.Ray;
import java.util.HashSet;
import java.util.Set;
/**
* Block objects define the properties for different types of Minecraft blocks.
*
* <p>This class also determines how blocks are rendered.
*
* <p>Block ID reference: http://minecraft.gamepedia.com/Data_values/Block_IDs
*
* @author Jesper Öqvist <jesper.oqvist@cs.lth.se>
*/
public class Block extends Material {
private static final boolean UNKNOWN_INVISIBLE = !PersistentSettings.drawUnknownBlocks();
public static final int AIR_ID = 0x00;
// The air block is public because it is never supposed to change.
// All other blocks are private to avoid direct references to the default blocks.
public static final Block AIR = new Block(AIR_ID, "Air", Texture.air) {
{
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final int STONE_ID = 0x01;
public static final Block STONE = new Block(STONE_ID, "Stone", Texture.stone) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.stone, Texture.granite, Texture.smoothGranite, Texture.diorite,
Texture.smoothDiorite, Texture.andesite, Texture.smoothAndesite,};
final String[] stoneKind =
{"stone", "granite", "smoothGranite", "diorite", "smoothDiorite", "andesite",
"smoothAndesite",};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 7]);
}
@Override public String description(int data) {
return stoneKind[data % 7];
}
};
public static final int GRASS_ID = 0x02;
public static final Block GRASS = new Block(GRASS_ID, "Grass", Texture.grassTop) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return GrassModel.intersect(ray, scene);
}
};
public static final int DIRT_ID = 0x03;
public static final Block DIRT = new Block(DIRT_ID, "Dirt", Texture.dirt) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] textures =
{{Texture.dirt, Texture.dirt, Texture.dirt, Texture.dirt, Texture.dirt, Texture.dirt,},
{Texture.coarseDirt, Texture.coarseDirt, Texture.coarseDirt, Texture.coarseDirt,
Texture.coarseDirt, Texture.coarseDirt,},
{Texture.podzolSide, Texture.podzolSide, Texture.podzolSide, Texture.podzolSide,
Texture.podzolTop, Texture.podzolSide,},};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, textures[ray.getBlockData() % 3]);
}
final String[] kind = {"regular", "coarse", "podzol"};
@Override public String description(int data) {
return kind[data % 3];
}
};
public static final int COBBLESTONE_ID = 0x04;
public static final Block COBBLESTONE = new Block(COBBLESTONE_ID, "Cobblestone", Texture.cobblestone) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int WOODENPLANKS_ID = 0x05;
public static final Block WOODENPLANKS = new Block(WOODENPLANKS_ID, "Wooden Planks", Texture.oakPlanks) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.oakPlanks, Texture.sprucePlanks, Texture.birchPlanks, Texture.jungleTreePlanks,
Texture.acaciaPlanks, Texture.darkOakPlanks, Texture.acaciaPlanks,
Texture.darkOakPlanks};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, getTexture(ray.getBlockData()));
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 7];
}
};
public static final int SAPLING_ID = 0x06;
public static final Block SAPLING = new Block(SAPLING_ID, "Sapling", Texture.oakSapling) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.oakSapling, Texture.spruceSapling, Texture.birchSapling, Texture.jungleSapling,
Texture.acaciaSapling, Texture.darkOakSapling, Texture.acaciaSapling,
Texture.darkOakSapling};
@Override public boolean intersect(Ray ray, Scene scene) {
return SaplingModel.intersect(ray, getTexture(ray.getBlockData()));
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 7];
}
};
public static final int BEDROCK_ID = 0x07;
public static final Block BEDROCK = new Block(BEDROCK_ID, "Bedrock", Texture.bedrock);
public static final int WATER_ID = 0x08;
public static final Block WATER = new Block(WATER_ID, "Water", Texture.water) {
{
isOpaque = false;
isSolid = false;
specular = Scene.WATER_SPECULAR;
localIntersect = true;
ior = 1.333f;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return WaterModel.intersect(ray);
}
@Override public void getColor(Ray ray) {
Texture.water.getAvgColorLinear(ray.color);
}
@Override public boolean isWater() {
return true;
}
};
public static final int STATIONARYWATER_ID = 0x09;
public static final Block STATIONARYWATER = new Block(STATIONARYWATER_ID, "Stationary Water", Texture.water) {
{
isOpaque = false;
isSolid = false;
specular = Scene.WATER_SPECULAR;
localIntersect = true;
ior = 1.333f;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return WaterModel.intersect(ray);
}
@Override public boolean isWater() {
return true;
}
};
public static final int LAVA_ID = 0x0A;
public static final Block LAVA = new Block(LAVA_ID, "Lava", Texture.lava) {
{
isOpaque = false;
isSolid = false;
emittance = 1.0f;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return LavaModel.intersect(ray);
}
};
public static final int STATIONARYLAVA_ID = 0x0B;
public static final Block STATIONARYLAVA = new Block(STATIONARYLAVA_ID, "Stationary Lava", Texture.lava) {
{
isOpaque = false;
isSolid = false;
emittance = 1.0f;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return LavaModel.intersect(ray);
}
};
public static final int SAND_ID = 0x0C;
public static final Block SAND = new Block(SAND_ID, "Sand", Texture.sand) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture = {Texture.sand, Texture.redSand};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, getTexture(ray.getBlockData()));
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 1];
}
};
public static final int GRAVEL_ID = 0x0D;
public static final Block GRAVEL = new Block(GRAVEL_ID, "Gravel", Texture.gravel) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int GOLDORE_ID = 0x0E;
public static final Block GOLDORE = new Block(GOLDORE_ID, "Gold Ore", Texture.goldOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int IRONORE_ID = 0x0F;
public static final Block IRONORE = new Block(IRONORE_ID, "Iron Ore", Texture.ironOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int COALORE_ID = 0x10;
public static final Block COALORE = new Block(COALORE_ID, "Coal Ore", Texture.coalOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int WOOD_ID = 0x11;
public static final Block WOOD = new Block(WOOD_ID, "Wood", Texture.oakWood) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture =
{{Texture.oakWood, Texture.oakWoodTop}, {Texture.spruceWood, Texture.spruceWoodTop},
{Texture.birchWood, Texture.birchWoodTop}, {Texture.jungleWood, Texture.jungleTreeTop}};
@Override public boolean intersect(Ray ray, Scene scene) {
return WoodModel.intersect(ray, texture[ray.getBlockData() & 3]);
}
final String[] woodType = {"oak", "spruce", "birch", "jungle",};
@Override public String description(int data) {
return woodType[data & 3];
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 3][1];
}
};
public static final int LEAVES_ID = 0x12;
public static final Block LEAVES = new Block(LEAVES_ID, "Leaves", Texture.oakLeaves) {
{
isOpaque = false;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.oakLeaves, Texture.spruceLeaves, Texture.birchLeaves, Texture.jungleTreeLeaves};
@Override public boolean intersect(Ray ray, Scene scene) {
return LeafModel.intersect(ray, scene, getTexture(ray.getBlockData()));
}
final String[] woodType = {"oak", "spruce", "birch", "jungle",};
@Override public String description(int data) {
return woodType[data & 3];
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 3];
}
};
public static final int SPONGE_ID = 0x13;
public static final Block SPONGE = new Block(SPONGE_ID, "Sponge", Texture.sponge) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture = {Texture.sponge, Texture.wetSponge,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 2]);
}
final String[] kind = {"dry", "wet"};
@Override public String description(int data) {
return kind[data % 2];
}
};
public static final int GLASS_ID = 0x14;
public static final Block GLASS = new Block(GLASS_ID, "Glass", Texture.glass) {
{
isOpaque = false;
isSolid = true;
ior = 1.520f;
}
@Override public boolean isSameMaterial(Material other) {
return other == this || other == STAINED_GLASS;
}
};
public static final int LAPIS_ORE_ID = 0x15;
public static final Block LAPIS_ORE =
new Block(LAPIS_ORE_ID, "Lapis Lazuli Ore", Texture.lapisOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int LAPIS_BLOCK_ID = 0x16;
public static final Block LAPIS_BLOCK =
new Block(LAPIS_BLOCK_ID, "Lapis Lazuli Block", Texture.lapisBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int DISPENSER_ID = 0x17;
public static final Block DISPENSER = new Block(DISPENSER_ID, "Dispenser", Texture.dispenserFront) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
// Facing down.
{Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop,
Texture.furnaceTop, Texture.dispenserFrontVertical},
// Facing up.
{Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop,
Texture.dispenserFrontVertical, Texture.furnaceTop},
// Facing north.
{Texture.dispenserFront, Texture.furnaceSide, Texture.furnaceSide, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,},
// Facing south.
{Texture.furnaceSide, Texture.dispenserFront, Texture.furnaceSide, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,},
// Facing east.
{Texture.furnaceSide, Texture.furnaceSide, Texture.furnaceSide, Texture.dispenserFront,
Texture.furnaceTop, Texture.furnaceTop,},
// Facing west.
{Texture.furnaceSide, Texture.furnaceSide, Texture.dispenserFront, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,},
};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 6]);
}
};
public static final int SANDSTONE_ID = 0x18;
public static final Block SANDSTONE = new Block(SANDSTONE_ID, "Sandstone", Texture.sandstoneSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
// normal
{Texture.sandstoneSide, Texture.sandstoneSide, Texture.sandstoneSide,
Texture.sandstoneSide, Texture.sandstoneTop, Texture.sandstoneBottom,},
// decorated
{Texture.sandstoneDecorated, Texture.sandstoneDecorated, Texture.sandstoneDecorated,
Texture.sandstoneDecorated, Texture.sandstoneTop, Texture.sandstoneBottom,},
// smooth
{Texture.sandstoneSmooth, Texture.sandstoneSmooth, Texture.sandstoneSmooth,
Texture.sandstoneSmooth, Texture.sandstoneTop, Texture.sandstoneBottom,},};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 3]);
}
};
public static final int NOTEBLOCK_ID = 0x19;
public static final Block NOTEBLOCK = new Block(NOTEBLOCK_ID, "Note Block", Icon.noteBlock) {
{
isOpaque = true;
isSolid = true;
}
@Override public Texture getTexture(int blockData) {
return Texture.jukeboxSide;
}
};
public static final int BED_ID = 0x1A;
public static final Block BED = new Block(BED_ID, "Bed", Icon.bed) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return BedModel.intersect(ray);
}
};
public static final int POWEREDRAIL_ID = 0x1B;
public static final Block POWEREDRAIL = new Block(POWEREDRAIL_ID, "Powered Rail", Texture.poweredRailOn) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.poweredRailOff, Texture.poweredRailOn};
@Override public boolean intersect(Ray ray, Scene scene) {
return RailModel
.intersect(ray, texture[ray.getBlockData() >>> 3], (ray.getBlockData() & 7) % 6);
}
};
public static final int DETECTORRAIL_ID = 0x1C;
public static final Block DETECTORRAIL = new Block(DETECTORRAIL_ID, "Detector Rail", Texture.detectorRail) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return RailModel.intersect(ray, Texture.detectorRail, (ray.getBlockData() & 7) % 6);
}
};
public static final int STICKYPISTON_ID = 0x1D;
public static final Block STICKYPISTON = new Block(STICKYPISTON_ID, "Sticky Piston", Texture.pistonTopSticky) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PistonModel.intersect(ray, 1);
}
};
public static final int COBWEB_ID = 0x1E;
public static final Block COBWEB = new Block(COBWEB_ID, "Cobweb", Texture.cobweb) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, Texture.cobweb);
}
};
public static final int TALLGRASS_ID = 0x1F;
public static final Block TALLGRASS = new Block(TALLGRASS_ID, "Tall Grass", Texture.tallGrass) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
subSurfaceScattering = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TallGrassModel.intersect(ray, scene);
}
};
public static final int DEADBUSH_ID = 0x20;
public static final Block DEADBUSH = new Block(DEADBUSH_ID, "Dead Bush", Texture.deadBush) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, Texture.deadBush);
}
};
public static final int PISTON_ID = 0x21;
public static final Block PISTON = new Block(PISTON_ID, "Piston", Texture.pistonTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PistonModel.intersect(ray, 0);
}
};
public static final int PISTON_HEAD_ID = 0x22;
public static final Block PISTON_HEAD = new Block(PISTON_HEAD_ID,
"Piston Head", Texture.pistonTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PistonExtensionModel.intersect(ray);
}
};
public static final int WOOL_ID = 0x23;
public static final Block WOOL = new Block(WOOL_ID, "Wool", Texture.lightGrayWool) {
{
isOpaque = true;
isSolid = true;
}
@Override public Texture getTexture(int blockData) {
return Texture.wool[blockData];
}
@Override public String description(int data) {
return woolColor[data & 15];
}
};
public static final int PISTON_EXTENSION_ID = 0x24;
public static final Block PISTON_EXTENSION = new Block(PISTON_EXTENSION_ID,
"Block moved by Piston", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final int DANDELION_ID = 0x25;
public static final Block DANDELION = new Block(DANDELION_ID, "Dandelion", Texture.dandelion) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
subSurfaceScattering = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, Texture.dandelion);
}
};
public static final int FLOWER_ID = 0x26;
public static final Block FLOWER = new Block(FLOWER_ID, "Flower", Texture.poppy) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
subSurfaceScattering = true;
}
final Texture[] textures =
{Texture.poppy, Texture.blueOrchid, Texture.allium, Texture.azureBluet, Texture.redTulip,
Texture.orangeTulip, Texture.whiteTulip, Texture.pinkTulip, Texture.oxeyeDaisy};
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, textures[ray.getBlockData() % 9]);
}
final String[] flowerType =
{"Poppy", "Blue Orchid", "Allium", "Azure Bluet", "Red Tulip", "Orange Tulip",
"White Tulip", "Pink Tulip", "Oxeye Daisy"};
@Override public String description(int data) {
return flowerType[data % 8];
}
};
public static final int BROWNMUSHROOM_ID = 0x27;
public static final Block BROWNMUSHROOM = new Block(BROWNMUSHROOM_ID, "Brown Mushroom", Texture.brownMushroom) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, Texture.brownMushroom);
}
};
public static final int REDMUSHROOM_ID = 0x28;
public static final Block REDMUSHROOM = new Block(REDMUSHROOM_ID, "Red Mushroom", Texture.redMushroom) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, Texture.redMushroom);
}
};
public static final int GOLDBLOCK_ID = 0x29;
public static final Block GOLDBLOCK = new Block(GOLDBLOCK_ID, "Gold Block", Texture.goldBlock) {
{
isOpaque = true;
isSolid = true;
specular = Scene.SPECULAR_COEFF;
}
};
public static final int IRONBLOCK_ID = 0x2A;
public static final Block IRONBLOCK = new Block(IRONBLOCK_ID, "Iron Block", Texture.ironBlock) {
{
isOpaque = true;
isSolid = true;
specular = Scene.SPECULAR_COEFF;
}
};
public static final int DOUBLESLAB_ID = 0x2B;
public static final Block DOUBLESLAB = new Block(DOUBLESLAB_ID, "Double Stone Slab", Texture.slabTop) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] sandstone =
{Texture.sandstoneSide, Texture.sandstoneSide, Texture.sandstoneSide,
Texture.sandstoneSide, Texture.sandstoneTop, Texture.sandstoneTop,};
final Texture[] stone =
{Texture.slabSide, Texture.slabSide, Texture.slabSide, Texture.slabSide,
Texture.slabTop, Texture.slabTop,};
final Texture[] quartz =
{Texture.quartzSide, Texture.quartzSide, Texture.quartzSide, Texture.quartzSide,
Texture.quartzTop, Texture.quartzBottom,};
@Override public boolean intersect(Ray ray, Scene scene) {
switch (ray.getBlockData()) {
default:
case 0:
return TexturedBlockModel.intersect(ray, stone);
case 1:
return TexturedBlockModel.intersect(ray, sandstone);
case 2:
case 10:
return TexturedBlockModel.intersect(ray, Texture.oakPlanks);
case 3:
case 11:
return TexturedBlockModel.intersect(ray, Texture.cobblestone);
case 4:
case 12:
return TexturedBlockModel.intersect(ray, Texture.brick);
case 5:
case 13:
return TexturedBlockModel.intersect(ray, Texture.stoneBrick);
case 6:
case 14:
return TexturedBlockModel.intersect(ray, Texture.netherBrick);
case 7:
case 15:
return TexturedBlockModel.intersect(ray, quartz);
case 8:
return TexturedBlockModel.intersect(ray, Texture.slabTop);
case 9:
return TexturedBlockModel.intersect(ray, Texture.sandstoneTop);
}
}
};
public static final int SLAB_ID = 0x2C;
public static final Block SLAB = new Block(SLAB_ID, "Stone Slab", Texture.slabTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[][] texture =
{{Texture.slabSide, Texture.slabTop}, {Texture.sandstoneSide, Texture.sandstoneTop},
{Texture.oakPlanks, Texture.oakPlanks}, {Texture.cobblestone, Texture.cobblestone},
{Texture.brick, Texture.brick}, {Texture.stoneBrick, Texture.stoneBrick},
{Texture.netherBrick, Texture.netherBrick}, {Texture.quartzSide, Texture.quartzTop},};
final String[] slabKind =
{"stone", "sandstone", "wood", "cobble", "brick", "stone brick", "nether brick", "quartz",};
@Override public boolean intersect(Ray ray, Scene scene) {
Texture[] textures = texture[ray.getBlockData() & 7];
return SlabModel.intersect(ray, textures[0], textures[1]);
}
@Override public String description(int data) {
return slabKind[data & 7];
}
};
public static final int BRICKS_ID = 0x2D;
public static final Block BRICKS = new Block(BRICKS_ID, "Bricks", Texture.brick) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int TNT_ID = 0x2E;
public static final Block TNT = new Block(TNT_ID, "TNT", Texture.tntSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.tntSide, Texture.tntSide, Texture.tntSide, Texture.tntSide, Texture.tntTop,
Texture.tntBottom,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
};
public static final int BOOKSHELF_ID = 0x2F;
public static final Block BOOKSHELF = new Block(BOOKSHELF_ID, "Bookshelf", Texture.bookshelf) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.bookshelf, Texture.bookshelf, Texture.bookshelf, Texture.bookshelf,
Texture.oakPlanks, Texture.oakPlanks,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
};
public static final int MOSSSTONE_ID = 0x30;
public static final Block MOSSSTONE = new Block(MOSSSTONE_ID, "Moss Stone", Texture.mossStone) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int OBSIDIAN_ID = 0x31;
public static final Block OBSIDIAN = new Block(OBSIDIAN_ID, "Obsidian", Texture.obsidian) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int TORCH_ID = 0x32;
public static final Block TORCH = new Block(TORCH_ID, "Torch", Texture.torch) {
{
isOpaque = false;
isSolid = false;
emittance = 50.0f;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TorchModel.intersect(ray, Texture.torch);
}
final String[] direction = {"", "east", "west", "south", "north", "on floor"};
@Override public String description(int data) {
return direction[data % 6];
}
};
public static final int FIRE_ID = 0x33;
public static final Block FIRE = new Block(FIRE_ID, "Fire", Texture.fire) {
{
isOpaque = false;
isSolid = false;
emittance = 1.0f;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FireModel.intersect(ray);
}
};
public static final int MONSTERSPAWNER_ID = 0x34;
public static final Block MONSTERSPAWNER = new Block(MONSTERSPAWNER_ID, "Monster Spawner", Texture.monsterSpawner) {
{
isOpaque = false;
isSolid = true;
}
};
public static final int OAKWOODSTAIRS_ID = 0x35;
public static final Block OAKWOODSTAIRS = new Block(OAKWOODSTAIRS_ID, "Wooden Stairs", Icon.woodenStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.oakPlanks);
}
@Override public Texture getTexture(int blockData) {
return Texture.oakPlanks;
}
};
public static final int CHEST_ID = 0x36;
public static final Block CHEST = new Block(CHEST_ID, "Chest", Texture.chestFront) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[][] texture = {
// single
{Texture.chestFront, Texture.chestBack, Texture.chestLeft, Texture.chestRight,
Texture.chestTop, Texture.chestBottom, Texture.chestLock, Texture.chestLock,
Texture.chestLock, Texture.chestLock, Texture.chestLock,},
// left
{Texture.largeChestFrontLeft, Texture.largeChestBackLeft, Texture.largeChestLeft,
Texture.largeChestTopLeft, Texture.largeChestBottomLeft, Texture.chestLock,
Texture.chestLock, Texture.chestLock, Texture.chestLock,},
// right
{Texture.largeChestFrontRight, Texture.largeChestBackRight, Texture.largeChestRight,
Texture.largeChestTopRight, Texture.largeChestBottomRight, Texture.chestLock,
Texture.chestLock, Texture.chestLock, Texture.chestLock,}};
@Override public boolean intersect(Ray ray, Scene scene) {
return ChestModel.intersect(ray, texture[(ray.getCurrentData() >> 16) % 3]);
}
};
public static final int REDSTONEWIRE_ID = 0x37;
public static final Block REDSTONEWIRE = new Block(REDSTONEWIRE_ID, "Redstone Wire", Texture.redstoneWireCross) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return RedstoneWireModel.intersect(ray);
}
@Override public String description(int data) {
return "power: " + data;
}
};
public static final int DIAMONDORE_ID = 0x38;
public static final Block DIAMONDORE = new Block(DIAMONDORE_ID, "Diamond Ore", Texture.diamondOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int DIAMONDBLOCK_ID = 0x39;
public static final Block DIAMONDBLOCK = new Block(DIAMONDBLOCK_ID, "Diamond Block", Texture.diamondBlock) {
{
isOpaque = true;
isSolid = true;
specular = Scene.SPECULAR_COEFF;
}
};
public static final int WORKBENCH_ID = 0x3A;
public static final Block WORKBENCH = new Block(WORKBENCH_ID, "Workbench", Texture.workbenchFront) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.workbenchFront, Texture.workbenchSide, Texture.workbenchSide,
Texture.workbenchFront, Texture.workbenchTop, Texture.oakPlanks,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
};
public static final int CROPS_ID = 0x3B;
public static final Block CROPS = new Block(CROPS_ID, "Wheat", Texture.crops7) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.crops0, Texture.crops1, Texture.crops2, Texture.crops3, Texture.crops4,
Texture.crops5, Texture.crops6, Texture.crops7};
@Override public boolean intersect(Ray ray, Scene scene) {
return CropsModel.intersect(ray, texture[ray.getBlockData() % 8]);
}
};
public static final int SOIL_ID = 0x3C;
public static final Block SOIL = new Block(SOIL_ID, "Soil", Texture.farmlandWet) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FarmlandModel.intersect(ray);
}
};
public static final int FURNACEUNLIT_ID = 0x3D;
public static final Block FURNACEUNLIT = new Block(FURNACEUNLIT_ID, "Furnace", Texture.furnaceUnlitFront) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.furnaceUnlitFront, Texture.furnaceSide, Texture.furnaceSide,
Texture.furnaceSide, Texture.furnaceTop, Texture.furnaceTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return FurnaceModel.intersect(ray, texture);
}
};
public static final int FURNACELIT_ID = 0x3E;
public static final Block FURNACELIT = new Block(FURNACELIT_ID, "Burning Furnace", Texture.furnaceLitFront) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.furnaceLitFront, Texture.furnaceSide, Texture.furnaceSide, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return FurnaceModel.intersect(ray, texture);
}
};
public static final int SIGNPOST_ID = 0x3F;
public static final Block SIGNPOST = new Block(SIGNPOST_ID, "Sign Post", Icon.signPost) {
{
// This block is rendered as an entity instead of a voxel.
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final int WOODENDOOR_ID = 0x40;
public static final Block WOODENDOOR = new Block(WOODENDOOR_ID, "Wooden Door", Icon.woodenDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.woodenDoorBottom, Texture.woodenDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int LADDER_ID = 0x41;
public static final Block LADDER = new Block(LADDER_ID, "Ladder", Texture.ladder) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return LadderModel.intersect(ray);
}
};
public static final int MINECARTTRACKS_ID = 0x42;
public static final Block MINECARTTRACKS = new Block(MINECARTTRACKS_ID, "Minecart Tracks", Texture.rails) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.rails, Texture.rails, Texture.rails, Texture.rails, Texture.rails,
Texture.rails, Texture.railsCurved, Texture.railsCurved, Texture.railsCurved,
Texture.railsCurved};
@Override public boolean intersect(Ray ray, Scene scene) {
int type = ray.getBlockData() % 10;
return RailModel.intersect(ray, texture[type], type);
}
};
public static final int STONESTAIRS_ID = 0x43;
public static final Block STONESTAIRS = new Block(STONESTAIRS_ID, "Cobblestone Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.cobblestone);
}
@Override public Texture getTexture(int blockData) {
return Texture.stone;
}
};
public static final int WALLSIGN_ID = 0x44;
public static final Block WALLSIGN = new Block(WALLSIGN_ID, "Wall Sign", Icon.wallSign) {
{
// This block is rendered as an entity instead of a voxel.
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final int LEVER_ID = 0x45;
public static final Block LEVER = new Block(LEVER_ID, "Lever", Texture.lever) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return LeverModel.intersect(ray);
}
};
public static final int STONEPRESSUREPLATE_ID = 0x46;
public static final Block STONEPRESSUREPLATE = new Block(STONEPRESSUREPLATE_ID, "Stone Pressure Plate", Icon.stonePressurePlate) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PressurePlateModel.intersect(ray, Texture.stone);
}
};
public static final int IRONDOOR_ID = 0x47;
public static final Block IRONDOOR = new Block(IRONDOOR_ID, "Iron Door", Icon.ironDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.ironDoorBottom, Texture.ironDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int WOODENPRESSUREPLATE_ID = 0x48;
public static final Block WOODENPRESSUREPLATE = new Block(WOODENPRESSUREPLATE_ID, "Wooden Pressure Plate", Icon.woodenPressurePlate) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PressurePlateModel.intersect(ray, Texture.oakPlanks);
}
};
public static final int REDSTONEORE_ID = 0x49;
public static final Block REDSTONEORE = new Block(REDSTONEORE_ID, "Redstone Ore", Texture.redstoneOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int GLOWINGREDSTONEORE_ID = 0x4A;
public static final Block GLOWINGREDSTONEORE = new Block(GLOWINGREDSTONEORE_ID, "Glowing Redstone Ore", Texture.redstoneOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int REDSTONETORCHOFF_ID = 0x4B;
public static final Block REDSTONETORCHOFF = new Block(REDSTONETORCHOFF_ID, "Redstone Torch (off)", Texture.redstoneTorchOff) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TorchModel.intersect(ray, Texture.redstoneTorchOff);
}
final String[] direction = {"", "east", "west", "south", "north", "on floor"};
@Override public String description(int data) {
return direction[data % 6];
}
};
public static final int REDSTONETORCHON_ID = 0x4C;
public static final Block REDSTONETORCHON = new Block(REDSTONETORCHON_ID, "Redstone Torch (on)", Texture.redstoneTorchOn) {
{
isOpaque = false;
isSolid = false;
emittance = 1.0f;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TorchModel.intersect(ray, Texture.redstoneTorchOn);
}
final String[] direction = {"", "east", "west", "south", "north", "on floor"};
@Override public String description(int data) {
return direction[data % 6];
}
};
public static final int STONEBUTTON_ID = 0x4D;
public static final Block STONEBUTTON = new Block(STONEBUTTON_ID, "Stone Button", Icon.stoneButton) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return ButtonModel.intersect(ray, Texture.stone);
}
};
public static final int SNOW_ID = 0x4E;
public static final Block SNOW = new Block(SNOW_ID, "Snow", Texture.snowBlock) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SnowModel.intersect(ray);
}
};
public static final int ICE_ID = 0x4F;
public static final Block ICE = new Block(ICE_ID, "Ice", Texture.ice) {
{
isOpaque = false;
isSolid = true;
ior = 1.31f;
}
};
public static final int SNOWBLOCK_ID = 0x50;
public static final Block SNOWBLOCK = new Block(SNOWBLOCK_ID, "Snow Block", Texture.snowBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int CACTUS_ID = 0x51;
public static final Block CACTUS = new Block(CACTUS_ID, "Cactus", Texture.cactusSide) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return CactusModel.intersect(ray);
}
};
public static final int CLAY_ID = 0x52;
public static final Block CLAY = new Block(CLAY_ID, "Clay", Texture.clay) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int SUGARCANE_ID = 0x53;
public static final Block SUGARCANE = new Block(SUGARCANE_ID, "Sugar Cane", Texture.sugarCane) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SpriteModel.intersect(ray, Texture.sugarCane);
}
};
public static final int JUKEBOX_ID = 0x54;
public static final Block JUKEBOX = new Block(JUKEBOX_ID, "Jukebox", Texture.jukeboxSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.jukeboxSide, Texture.jukeboxSide, Texture.jukeboxSide, Texture.jukeboxSide,
Texture.jukeboxTop, Texture.jukeboxSide,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
};
public static final int FENCE_ID = 0x55;
public static final Block FENCE = new Block(FENCE_ID, "Fence", Icon.fence) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.oakPlanks);
}
@Override protected boolean isFence() {
return true;
}
};
public static final int PUMPKIN_ID = 0x56;
public static final Block PUMPKIN = new Block(PUMPKIN_ID, "Pumpkin", Texture.pumpkinSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.pumpkinFront, Texture.pumpkinSide, Texture.pumpkinSide, Texture.pumpkinSide,
Texture.pumpkinTop, Texture.pumpkinTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return PumpkinModel.intersect(ray, texture);
}
};
public static final int NETHERRACK_ID = 0x57;
public static final Block NETHERRACK =
new Block(NETHERRACK_ID, "Netherrack", Texture.netherrack) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int SOULSAND_ID = 0x58;
public static final Block SOULSAND = new Block(SOULSAND_ID, "Soul Sand", Texture.soulsand) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int GLOWSTONE_ID = 0x59;
public static final Block GLOWSTONE = new Block(GLOWSTONE_ID, "Glowstone", Texture.glowstone) {
{
isOpaque = true;
isSolid = true;
emittance = 1.0f;
}
};
public static final int PORTAL_ID = 0x5A;
public static final Block PORTAL = new Block(PORTAL_ID, "Portal", Texture.portal) {
{
isOpaque = false;
isSolid = false;
emittance = 0.4f;
}
};
public static final int JACKOLANTERN_ID = 0x5B;
public static final Block JACKOLANTERN = new Block(JACKOLANTERN_ID, "Jack-O-Lantern", Texture.jackolanternFront) {
{
isOpaque = true;
isSolid = true;
emittance = 1.0f;
localIntersect = true;
}
final Texture[] texture =
{Texture.jackolanternFront, Texture.pumpkinSide, Texture.pumpkinSide,
Texture.pumpkinSide, Texture.pumpkinTop, Texture.pumpkinTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return PumpkinModel.intersect(ray, texture);
}
};
public static final int CAKE_ID = 0x5C;
public static final Block CAKE = new Block(CAKE_ID, "Cake Block", Icon.cake) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return CakeModel.intersect(ray);
}
};
public static final int REDSTONEREPEATEROFF_ID = 0x5D;
public static final Block REDSTONEREPEATEROFF = new Block(REDSTONEREPEATEROFF_ID, "Redstone Repeater (off)", Texture.redstoneRepeaterOff) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return RedstoneRepeaterModel.intersect(ray, 0);
}
};
public static final int REDSTONEREPEATERON_ID = 0x5E;
public static final Block REDSTONEREPEATERON = new Block(REDSTONEREPEATERON_ID, "Redstone Repeater (on)", Texture.redstoneRepeaterOn) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return RedstoneRepeaterModel.intersect(ray, 1);
}
};
public static final int STAINED_GLASS_ID = 0x5F;
public static final Block STAINED_GLASS = new Block(STAINED_GLASS_ID, "Stained Glass", Texture.glass) {
{
isOpaque = false;
isSolid = true;
ior = 1.520f;
}
@Override public Texture getTexture(int blockData) {
return Texture.stainedGlass[blockData];
}
@Override public String description(int data) {
return woolColor[data & 15];
}
@Override public boolean isSameMaterial(Material other) {
return other == this || other == GLASS;
}
};
public static final int TRAPDOOR_ID = 0x60;
public static final Block TRAPDOOR = new Block(TRAPDOOR_ID, "Trapdoor", Texture.trapdoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TrapdoorModel.intersect(ray, Texture.trapdoor);
}
};
public static final int HIDDENSILVERFISH_ID = 0x61;
public static final Block HIDDENSILVERFISH = new Block(HIDDENSILVERFISH_ID, "Hidden Silverfish", Texture.stone) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture = {Texture.stone, Texture.cobblestone, Texture.stoneBrick};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % texture.length]);
}
};
public static final int STONEBRICKS_ID = 0x62;
public static final Block STONEBRICKS = new Block(STONEBRICKS_ID, "Stone Bricks", Texture.stoneBrick) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.stoneBrick, Texture.mossyStoneBrick, Texture.crackedStoneBrick,
Texture.circleStoneBrick};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[(ray.getCurrentData() >> 8) & 3]);
}
};
public static final int HUGEBROWNMUSHROOM_ID = 0x63;
public static final Block HUGEBROWNMUSHROOM = new Block(HUGEBROWNMUSHROOM_ID, "Huge Brown Mushroom", Texture.hugeBrownMushroom) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
// 0 = fleshy
{Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores,
Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores},
// 1 = cap on top, west, north
{Texture.hugeBrownMushroom, Texture.mushroomPores, Texture.mushroomPores,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 2 = cap on top, north
{Texture.hugeBrownMushroom, Texture.mushroomPores, Texture.mushroomPores,
Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 3 = cap on top, east, north
{Texture.hugeBrownMushroom, Texture.mushroomPores, Texture.hugeBrownMushroom,
Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 4 = cap on top, west
{Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 5 = cap on top
{Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores,
Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 6 = cap on top, east
{Texture.mushroomPores, Texture.mushroomPores, Texture.hugeBrownMushroom,
Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 7 = cap on top, west, south
{Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 8 = cap on top, south
{Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores,
Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 9 = cap on top, east, south
{Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom,
Texture.mushroomPores, Texture.hugeBrownMushroom, Texture.mushroomPores},
// 10 = stem
{Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem,
Texture.mushroomPores, Texture.mushroomPores},
// 11 = undefined (cap on all sides)
{Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom},
// 12 = undefined (cap on all sides)
{Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom},
// 13 = undefined (cap on all sides)
{Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom},
// 14 = cap on all sides
{Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom,
Texture.hugeBrownMushroom, Texture.hugeBrownMushroom, Texture.hugeBrownMushroom},
// 15 = stem on all sides
{Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem,
Texture.mushroomStem, Texture.mushroomStem}};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData()]);
}
};
public static final int HUGEREDMUSHROOM_ID = 0x64;
public static final Block HUGEREDMUSHROOM = new Block(HUGEREDMUSHROOM_ID, "Huge Red Mushroom", Texture.hugeRedMushroom) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
// 0 = fleshy
{Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores,
Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores},
// 1 = cap on top, west, north
{Texture.hugeRedMushroom, Texture.mushroomPores, Texture.mushroomPores,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.mushroomPores},
// 2 = cap on top, north
{Texture.hugeRedMushroom, Texture.mushroomPores, Texture.mushroomPores,
Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores},
// 3 = cap on top, east, north
{Texture.hugeRedMushroom, Texture.mushroomPores, Texture.hugeRedMushroom,
Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores},
// 4 = cap on top, west
{Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.mushroomPores},
// 5 = cap on top
{Texture.mushroomPores, Texture.mushroomPores, Texture.mushroomPores,
Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores},
// 6 = cap on top, east
{Texture.mushroomPores, Texture.mushroomPores, Texture.hugeRedMushroom,
Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores},
// 7 = cap on top, west, south
{Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.mushroomPores},
// 8 = cap on top, south
{Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores,
Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores},
// 9 = cap on top, east, south
{Texture.mushroomPores, Texture.hugeRedMushroom, Texture.hugeRedMushroom,
Texture.mushroomPores, Texture.hugeRedMushroom, Texture.mushroomPores},
// 10 = stem
{Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem,
Texture.mushroomPores, Texture.mushroomPores},
// 11 = undefined (cap on all sides)
{Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom},
// 12 = undefined (cap on all sides)
{Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom},
// 13 = undefined (cap on all sides)
{Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom},
// 14 = cap on all sides
{Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom,
Texture.hugeRedMushroom, Texture.hugeRedMushroom, Texture.hugeRedMushroom},
// 15 = stem on all sides
{Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem, Texture.mushroomStem,
Texture.mushroomStem, Texture.mushroomStem}};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 11]);
}
};
public static final int IRONBARS_ID = 0x65;
public static final Block IRONBARS = new Block(IRONBARS_ID, "Iron Bars", Texture.ironBars) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return IronBarsModel.intersect(ray);
}
};
public static final int GLASSPANE_ID = 0x66;
public static final Block GLASSPANE = new Block(GLASSPANE_ID, "Glass Pane", Texture.glass) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
ior = 1.520f;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return GlassPaneModel.intersect(ray, Texture.glass, Texture.glassPaneTop);
}
};
public static final int MELON_ID = 0x67;
public static final Block MELON = new Block(MELON_ID, "Melon", Texture.melonSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture texture[] =
{Texture.melonSide, Texture.melonSide, Texture.melonSide, Texture.melonSide,
Texture.melonTop, Texture.melonTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
};
public static final int PUMPKINSTEM_ID = 0x68;
public static final Block PUMPKINSTEM = new Block(PUMPKINSTEM_ID, "Pumpkin Stem", Texture.stemStraight) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return MelonStemModel.intersect(ray);
}
};
public static final int MELONSTEM_ID = 0x69;
public static final Block MELONSTEM = new Block(MELONSTEM_ID, "Melon Stem", Texture.stemStraight) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return MelonStemModel.intersect(ray);
}
};
public static final int VINES_ID = 0x6A;
public static final Block VINES = new Block(VINES_ID, "Vines", Texture.vines) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return VineModel.intersect(ray, scene);
}
};
public static final int FENCEGATE_ID = 0x6B;
public static final Block FENCEGATE = new Block(FENCEGATE_ID, "Fence Gate", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceGateModel.intersect(ray, Texture.oakPlanks);
}
@Override protected boolean isFenceGate() {
return true;
}
};
public static final int BRICKSTAIRS_ID = 0x6C;
public static final Block BRICKSTAIRS = new Block(BRICKSTAIRS_ID, "Brick Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.brick);
}
@Override public Texture getTexture(int blockData) {
return Texture.brick;
}
};
public static final int STONEBRICKSTAIRS_ID = 0x6D;
public static final Block STONEBRICKSTAIRS = new Block(STONEBRICKSTAIRS_ID, "Stone Brick Stairs", Icon.stoneBrickStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.stoneBrick);
}
@Override public Texture getTexture(int blockData) {
return Texture.stoneBrick;
}
};
public static final int MYCELIUM_ID = 0x6E;
public static final Block MYCELIUM = new Block(MYCELIUM_ID, "Mycelium", Texture.myceliumSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture texture[] =
{Texture.myceliumSide, Texture.myceliumSide, Texture.myceliumSide, Texture.myceliumSide,
Texture.myceliumTop, Texture.dirt};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
@Override public Texture getTexture(int blockData) {
return Texture.myceliumTop;
}
};
public static final int LILY_PAD_ID = 0x6F;
public static final Block LILY_PAD = new Block(LILY_PAD_ID, "Lily Pad", Texture.lilyPad) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
isInvisible = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return LilyPadModel.intersect(ray);
}
@Override public void getColor(Ray ray) {
LilyPadModel.getColor(ray);
}
};
public static final int NETHERBRICK_ID = 0x70;
public static final Block NETHERBRICK = new Block(NETHERBRICK_ID, "Nether Brick", Texture.netherBrick) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int NETHERBRICKFENCE_ID = 0x71;
public static final Block NETHERBRICKFENCE = new Block(NETHERBRICKFENCE_ID, "Nether Brick Fence", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.netherBrick);
}
@Override protected boolean isFence() {
// Note: isFence() returns false since nether brick fence does not connect to normal fence.
return false;
}
};
public static final int NETHERBRICKSTAIRS_ID = 0x72;
public static final Block NETHERBRICKSTAIRS = new Block(NETHERBRICKSTAIRS_ID, "Nether Brick Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.netherBrick);
}
@Override public Texture getTexture(int blockData) {
return Texture.netherBrick;
}
};
public static final int NETHERWART_ID = 0x73;
public static final Block NETHERWART = new Block(NETHERWART_ID, "Nether Wart", Texture.netherWart2) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.netherWart0, Texture.netherWart1, Texture.netherWart1, Texture.netherWart2};
@Override public boolean intersect(Ray ray, Scene scene) {
return CropsModel.intersect(ray, texture[ray.getBlockData() & 3]);
}
};
public static final int ENCHNATMENTTABLE_ID = 0x74;
public static final Block ENCHNATMENTTABLE = new Block(ENCHNATMENTTABLE_ID, "Enchantment Table", Texture.enchantmentTableSide) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return EnchantmentTableModel.intersect(ray);
}
};
public static final int BREWINGSTAND_ID = 0x75;
public static final Block BREWINGSTAND = new Block(BREWINGSTAND_ID, "Brewing Stand", Texture.brewingStandSide) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return BrewingStandModel.intersect(ray);
}
};
public static final int CAULDRON_ID = 0x76;
public static final Block CAULDRON = new Block(CAULDRON_ID, "Cauldron", Texture.cauldronSide) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return CauldronModel.intersect(ray);
}
};
public static final int ENDPORTAL_ID = 0x77;
public static final Block ENDPORTAL = new Block(ENDPORTAL_ID, "End Portal", Texture.endPortal) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return EndPortalModel.intersect(ray);
}
};
public static final int ENDPORTALFRAME_ID = 0x78;
public static final Block ENDPORTALFRAME = new Block(ENDPORTALFRAME_ID, "End Portal Frame", Texture.endPortalFrameTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return EndPortalFrameModel.intersect(ray);
}
};
public static final int ENDSTONE_ID = 0x79;
public static final Block ENDSTONE = new Block(ENDSTONE_ID, "End Stone", Texture.endStone) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
};
public static final int DRAGONEGG_ID = 0x7A;
public static final Block DRAGONEGG = new Block(DRAGONEGG_ID, "Dragon Egg", Texture.dragonEgg) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return DragonEggModel.intersect(ray);
}
};
public static final int REDSTONELAMPOFF_ID = 0x7B;
public static final Block REDSTONELAMPOFF = new Block(REDSTONELAMPOFF_ID, "Redstone Lamp (off)", Texture.redstoneLampOff) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int REDSTONELAMPON_ID = 0x7C;
public static final Block REDSTONELAMPON = new Block(REDSTONELAMPON_ID, "Redstone Lamp (on)", Texture.redstoneLampOn) {
{
isOpaque = true;
isSolid = true;
emittance = 1.0f;
}
};
public static final int DOUBLEWOODENSLAB_ID = 0x7D;
public static final Block DOUBLEWOODENSLAB = new Block(DOUBLEWOODENSLAB_ID, "Double Wooden Slab", Texture.oakPlanks) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.oakPlanks, Texture.sprucePlanks, Texture.birchPlanks, Texture.jungleTreePlanks,
Texture.acaciaPlanks, Texture.darkOakPlanks,};
final String[] woodKind = {"oak", "spruce", "birch", "jungle", "acacia", "dark oak",};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 6]);
}
@Override public String description(int data) {
return woodKind[data % 6];
}
};
public static final int SINGLEWOODENSLAB_ID = 0x7E;
public static final Block SINGLEWOODENSLAB = new Block(SINGLEWOODENSLAB_ID, "Single Wooden Slab", Texture.oakPlanks) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.oakPlanks, Texture.sprucePlanks, Texture.birchPlanks, Texture.jungleTreePlanks,
Texture.acaciaPlanks, Texture.darkOakPlanks,};
final String[] woodKind = {"oak", "spruce", "birch", "jungle", "acacia", "dark oak",};
@Override public boolean intersect(Ray ray, Scene scene) {
return SlabModel.intersect(ray, texture[(ray.getBlockData() & 7) % 6]);
}
@Override public String description(int data) {
return woodKind[(data & 7) % 6];
}
};
public static final int COCOAPLANT_ID = 0x7F;
public static final Block COCOAPLANT = new Block(COCOAPLANT_ID, "Cocoa Plant", Texture.cocoaPlantLarge) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return CocoaPlantModel.intersect(ray);
}
final String[] cocoaSize = {"small", "medium", "large"};
@Override public String description(int data) {
return cocoaSize[(data & 15) >> 2];
}
};
public static final int SANDSTONESTAIRS_ID = 0x80;
public static final Block SANDSTONESTAIRS = new Block(SANDSTONESTAIRS_ID, "Sandstone Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel
.intersect(ray, Texture.sandstoneSide, Texture.sandstoneTop, Texture.sandstoneBottom);
}
@Override public Texture getTexture(int blockData) {
return Texture.sandstoneSide;
}
};
public static final int EMERALDORE_ID = 0x81;
public static final Block EMERALDORE = new Block(EMERALDORE_ID, "Emerald Ore", Texture.emeraldOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int ENDERCHEST_ID = 0x82;
public static final Block ENDERCHEST = new Block(ENDERCHEST_ID, "Ender Chest", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.enderChestFront, Texture.enderChestBack, Texture.enderChestLeft,
Texture.enderChestRight, Texture.enderChestTop, Texture.enderChestBottom,
Texture.enderChestLock, Texture.enderChestLock, Texture.enderChestLock,
Texture.enderChestLock, Texture.enderChestLock,};
@Override public boolean intersect(Ray ray, Scene scene) {
return ChestModel.intersect(ray, texture);
}
};
public static final int TRIPWIREHOOK_ID = 0x83;
public static final Block TRIPWIREHOOK = new Block(TRIPWIREHOOK_ID, "Tripwire Hook", Texture.tripwireHook) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TripwireHookModel.intersect(ray);
}
};
public static final int TRIPWIRE_ID = 0x84;
public static final Block TRIPWIRE = new Block(TRIPWIRE_ID, "Tripwire", Texture.tripwire) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TripwireModel.intersection(ray);
}
};
public static final int EMERALDBLOCK_ID = 0x85;
public static final Block EMERALDBLOCK = new Block(EMERALDBLOCK_ID, "Emerald Block", Texture.emeraldBlock) {
{
isOpaque = true;
isSolid = true;
specular = Scene.SPECULAR_COEFF;
}
};
public static final int SPRUCEWOODSTAIRS_ID = 0x86;
public static final Block SPRUCEWOODSTAIRS = new Block(SPRUCEWOODSTAIRS_ID, "Spruce Wood Stairs", Icon.woodenStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.sprucePlanks);
}
@Override public Texture getTexture(int blockData) {
return Texture.sprucePlanks;
}
};
public static final int BIRCHWOODSTAIRS_ID = 0x87;
public static final Block BIRCHWOODSTAIRS = new Block(BIRCHWOODSTAIRS_ID, "Birch Wood Stairs", Icon.woodenStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.birchPlanks);
}
@Override public Texture getTexture(int blockData) {
return Texture.birchPlanks;
}
};
public static final int JUNGLEWOODSTAIRS_ID = 0x88;
public static final Block JUNGLEWOODSTAIRS = new Block(JUNGLEWOODSTAIRS_ID, "Jungle Wood Stairs", Icon.woodenStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.jungleTreePlanks);
}
@Override public Texture getTexture(int blockData) {
return Texture.jungleTreePlanks;
}
};
public static final int COMMAND_BLOCK_ID = 0x89;
public static final Block COMMAND_BLOCK = new Block(COMMAND_BLOCK_ID, "Command Block", Texture.commandBlockBack) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
{
Texture.commandBlockBack,
Texture.commandBlockFront,
Texture.commandBlockSide
},
{
Texture.commandBlockBack,
Texture.commandBlockFront,
Texture.commandBlockConditional
},
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, texture[ray.getBlockData() >> 3]);
}
};
public static final int BEACON_ID = 0x8A;
public static final Block BEACON = new Block(BEACON_ID, "Beacon", Texture.glass) {
{
isOpaque = false;
isSolid = true;
ior = 1.520f;
localIntersect = true;
emittance = 1.0f;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return BeaconModel.intersect(ray);
}
};
public static final int STONEWALL_ID = 0x8B;
public static final Block STONEWALL = new Block(STONEWALL_ID, "Cobblestone Wall", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.cobblestone, Texture.mossStone};
@Override public boolean intersect(Ray ray, Scene scene) {
return StoneWallModel.intersect(ray, texture[ray.getBlockData() & 1]);
}
};
public static final int FLOWERPOT_ID = 0x8C;
public static final Block FLOWERPOT = new Block(FLOWERPOT_ID, "Flower Pot", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FlowerPotModel.intersect(ray, scene);
}
};
public static final int CARROTS_ID = 0x8D;
public static final Block CARROTS = new Block(CARROTS_ID, "Carrots", Texture.carrots3) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.carrots0, Texture.carrots0, Texture.carrots1, Texture.carrots1, Texture.carrots2,
Texture.carrots2, Texture.carrots2, Texture.carrots3};
@Override public boolean intersect(Ray ray, Scene scene) {
return CropsModel.intersect(ray, texture[ray.getBlockData() % 8]);
}
};
public static final int POTATOES_ID = 0x8E;
public static final Block POTATOES = new Block(POTATOES_ID, "Potatoes", Texture.potatoes3) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture =
{Texture.potatoes0, Texture.potatoes0, Texture.potatoes1, Texture.potatoes1,
Texture.potatoes2, Texture.potatoes2, Texture.potatoes2, Texture.potatoes3};
@Override public boolean intersect(Ray ray, Scene scene) {
return CropsModel.intersect(ray, texture[ray.getBlockData() % 8]);
}
};
public static final int WOODENBUTTON_ID = 0x8F;
public static final Block WOODENBUTTON = new Block(WOODENBUTTON_ID, "Wooden Button", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return ButtonModel.intersect(ray, Texture.oakPlanks);
}
};
public static final int HEAD_ID = 0x90;
public static final Block HEAD = new Block(HEAD_ID, "Head", Texture.unknown) {
{
// This block is rendered as an entity instead of a voxel.
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final int ANVIL_ID = 0x91;
public static final Block ANVIL = new Block(ANVIL_ID, "Anvil", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return AnvilModel.intersect(ray);
}
};
public static final int TRAPPEDCHEST_ID = 0x92;
public static final Block TRAPPEDCHEST = new Block(TRAPPEDCHEST_ID, "Trapped Chest", Texture.chestFront) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[][] texture = {
// single
{Texture.trappedChestFront, Texture.trappedChestBack, Texture.trappedChestLeft,
Texture.trappedChestRight, Texture.trappedChestTop, Texture.trappedChestBottom,
Texture.trappedChestLock, Texture.trappedChestLock, Texture.trappedChestLock,
Texture.trappedChestLock, Texture.trappedChestLock,},
// left
{Texture.largeTrappedChestFrontLeft, Texture.largeTrappedChestBackLeft,
Texture.largeTrappedChestLeft, Texture.largeTrappedChestTopLeft,
Texture.largeTrappedChestBottomLeft, Texture.trappedChestLock,
Texture.trappedChestLock, Texture.trappedChestLock, Texture.chestLock,},
// right
{Texture.largeTrappedChestFrontRight, Texture.largeTrappedChestBackRight,
Texture.largeTrappedChestRight, Texture.largeTrappedChestTopRight,
Texture.largeTrappedChestBottomRight, Texture.trappedChestLock,
Texture.trappedChestLock, Texture.trappedChestLock, Texture.trappedChestLock,}};
@Override public boolean intersect(Ray ray, Scene scene) {
return ChestModel.intersect(ray, texture[(ray.getCurrentData() >> 16) % 3]);
}
};
public static final int WEIGHTEDPRESSUREPLATELIGHT_ID = 0x93;
public static final Block WEIGHTEDPRESSUREPLATELIGHT = new Block(WEIGHTEDPRESSUREPLATELIGHT_ID, "Weighted Pressure Plate (Light)", Texture.goldBlock) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PressurePlateModel.intersect(ray, Texture.goldBlock);
}
};
public static final int WEIGHTEDPRESSUREPLATEHEAVY_ID = 0x94;
public static final Block WEIGHTEDPRESSUREPLATEHEAVY = new Block(WEIGHTEDPRESSUREPLATEHEAVY_ID, "Weighted Pressure Plate (Heavy)", Texture.ironBlock) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return PressurePlateModel.intersect(ray, Texture.ironBlock);
}
};
public static final int COMPARATOR_ID = 0x95;
public static final Block COMPARATOR = new Block(COMPARATOR_ID,
"Redstone Comparator", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return ComparatorModel.intersect(ray, 1 & (ray.getBlockData() >> 3));
}
};
public static final int COMPARATOR_POWERED_ID = 0x96;
public static final Block COMPARATOR_POWERED = new Block(COMPARATOR_POWERED_ID,
"Redstone Comparator (powered)", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return ComparatorModel.intersect(ray, 1);
}
};
public static final int DAYLIGHTSENSOR_ID = 0x97;
public static final Block DAYLIGHTSENSOR = new Block(DAYLIGHTSENSOR_ID,
"Daylight Sensor", Texture.daylightDetectorTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return DaylightSensorModel.intersect(ray);
}
};
public static final int REDSTONEBLOCK_ID = 0x98;
public static final Block REDSTONEBLOCK = new Block(REDSTONEBLOCK_ID, "Block of Redstone", Texture.redstoneBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int NETHERQUARTZORE_ID = 0x99;
public static final Block NETHERQUARTZORE = new Block(NETHERQUARTZORE_ID, "Nether Quartz Ore", Texture.netherQuartzOre) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int HOPPER_ID = 0x9A;
public static final Block HOPPER = new Block(HOPPER_ID, "Hopper", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return HopperModel.intersect(ray);
}
};
public static final int QUARTZ_ID = 0x9B;
public static final Block QUARTZ = new Block(QUARTZ_ID, "Block of Quartz", Texture.quartzSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return QuartzModel.intersect(ray);
}
};
public static final int QUARTZSTAIRS_ID = 0x9C;
public static final Block QUARTZSTAIRS = new Block(QUARTZSTAIRS_ID, "Quartz Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel
.intersect(ray, Texture.quartzSide, Texture.quartzTop, Texture.quartzBottom);
}
@Override public Texture getTexture(int blockData) {
return Texture.quartzSide;
}
};
public static final int ACTIVATORRAIL_ID = 0x9D;
public static final Block ACTIVATORRAIL = new Block(ACTIVATORRAIL_ID, "Activator Rail", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.activatorRail, Texture.activatorRailPowered};
@Override public boolean intersect(Ray ray, Scene scene) {
return RailModel
.intersect(ray, texture[ray.getBlockData() >>> 3], (ray.getBlockData() & 7) % 6);
}
};
public static final int DROPPER_ID = 0x9E;
public static final Block DROPPER = new Block(DROPPER_ID, "Dropper", Texture.dropperFront) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
// Facing down.
{Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop,
Texture.furnaceTop, Texture.dropperFrontVertical},
// Facing up.
{Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop, Texture.furnaceTop,
Texture.dropperFrontVertical, Texture.furnaceTop},
// Facing north.
{Texture.dropperFront, Texture.furnaceSide, Texture.furnaceSide, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,},
// Facing south.
{Texture.furnaceSide, Texture.dropperFront, Texture.furnaceSide, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,},
// Facing east.
{Texture.furnaceSide, Texture.furnaceSide, Texture.furnaceSide, Texture.dropperFront,
Texture.furnaceTop, Texture.furnaceTop,},
// Facing west.
{Texture.furnaceSide, Texture.furnaceSide, Texture.dropperFront, Texture.furnaceSide,
Texture.furnaceTop, Texture.furnaceTop,},
};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 6]);
}
};
public static final int STAINED_CLAY_ID = 0x9F;
public static final Block STAINED_CLAY = new Block(STAINED_CLAY_ID, "Stained Clay", Texture.clay) {
{
isOpaque = true;
isSolid = true;
}
@Override public Texture getTexture(int blockData) {
return Texture.stainedClay[blockData];
}
@Override public String description(int data) {
return woolColor[data & 15];
}
};
public static final int STAINED_GLASSPANE_ID = 0xA0;
public static final Block STAINED_GLASSPANE = new Block(STAINED_GLASSPANE_ID, "Stained Glass Pane", Texture.glass) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
ior = 1.520f;
}
@Override public boolean intersect(Ray ray, Scene scene) {
int data = ray.getBlockData();
return GlassPaneModel
.intersect(ray, Texture.stainedGlass[data], Texture.stainedGlassPaneSide[data]);
}
@Override public String description(int data) {
return woolColor[data & 15];
}
};
public static final int LEAVES2_ID = 0xA1;
public static final Block LEAVES2 = new Block(LEAVES2_ID, "Leaves", Texture.oakLeaves) {
{
isOpaque = false;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.acaciaLeaves, Texture.darkOakLeaves, Texture.acaciaLeaves, Texture.darkOakLeaves};
@Override public boolean intersect(Ray ray, Scene scene) {
return LeafModel.intersect(ray, scene, getTexture(ray.getBlockData()));
}
final String[] woodType = {"acacia", "dark oak", "unknown", "unknown"};
@Override public String description(int data) {
return woodType[data & 3];
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 3];
}
};
public static final int WOOD2_ID = 0xA2;
public static final Block WOOD2 = new Block(WOOD2_ID, "Wood", Texture.oakWood) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture =
{{Texture.acaciaWood, Texture.acaciaWoodTop}, {Texture.darkOakWood, Texture.darkOakWoodTop},
{Texture.acaciaWood, Texture.acaciaWoodTop},
{Texture.darkOakWood, Texture.darkOakWoodTop}};
@Override public boolean intersect(Ray ray, Scene scene) {
return WoodModel.intersect(ray, texture[ray.getBlockData() & 3]);
}
final String[] woodType = {"acacia", "dark oak", "unknown", "unknown"};
@Override public String description(int data) {
return woodType[data & 3];
}
@Override public Texture getTexture(int blockData) {
return texture[blockData & 3][1];
}
};
public static final int ACACIASTAIRS_ID = 0xA3;
public static final Block ACACIASTAIRS = new Block(ACACIASTAIRS_ID, "Acacia Stairs", Icon.woodenStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.acaciaPlanks);
}
@Override public Texture getTexture(int blockData) {
return Texture.acaciaPlanks;
}
};
public static final int DARKOAKSTAIRS_ID = 0xA4;
public static final Block DARKOAKSTAIRS = new Block(DARKOAKSTAIRS_ID, "Dark Oak Stairs", Icon.woodenStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.darkOakPlanks);
}
@Override public Texture getTexture(int blockData) {
return Texture.darkOakPlanks;
}
};
public static final int SLIMEBLOCK_ID = 0xA5;
public static final Block SLIMEBLOCK = new Block(SLIMEBLOCK_ID, "Slime Block", Texture.slime) {
{
isOpaque = false;
isSolid = true;
localIntersect = false;
}
};
public static final int BARRIER_ID = 0xA6;
public static final Block BARRIER = new Block(BARRIER_ID, "Barrier", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final int IRON_TRAPDOOR_ID = 0xA7;
public static final Block IRON_TRAPDOOR = new Block(IRON_TRAPDOOR_ID, "Iron Trapdoor", Texture.ironTrapdoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TrapdoorModel.intersect(ray, Texture.ironTrapdoor);
}
};
public static final int PRISMARINE_ID = 0xA8;
public static final Block PRISMARINE = new Block(PRISMARINE_ID, "Prismarine", Texture.prismarine) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] textures =
{{Texture.prismarine, Texture.prismarine, Texture.prismarine, Texture.prismarine,
Texture.prismarine, Texture.prismarine,},
{Texture.prismarineBricks, Texture.prismarineBricks, Texture.prismarineBricks,
Texture.prismarineBricks, Texture.prismarineBricks, Texture.prismarineBricks,},
{Texture.darkPrismarine, Texture.darkPrismarine, Texture.darkPrismarine,
Texture.darkPrismarine, Texture.darkPrismarine, Texture.darkPrismarine,},};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, textures[ray.getBlockData() % 3]);
}
final String[] kind = {"rough", "bricks", "dark"};
@Override public String description(int data) {
return kind[data % 3];
}
};
public static final int SEALANTERN_ID = 0xA9;
public static final Block SEALANTERN = new Block(SEALANTERN_ID, "Sea Lantern", Texture.seaLantern) {
{
isOpaque = true;
isSolid = true;
emittance = 0.5f;
}
};
public static final int HAY_BLOCK_ID = 0xAA;
public static final Block HAY_BLOCK = new Block(HAY_BLOCK_ID, "Hay Block", Texture.hayBlockSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture = {Texture.hayBlockSide, Texture.hayBlockTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return WoodModel.intersect(ray, texture);
}
};
public static final int CARPET_ID = 0xAB;
public static final Block CARPET = new Block(CARPET_ID, "Carpet", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return CarpetModel.intersect(ray, Texture.wool[ray.getBlockData()]);
}
@Override public String description(int data) {
return woolColor[data & 15];
}
};
public static final int HARDENED_CLAY_ID = 0xAC;
public static final Block HARDENED_CLAY = new Block(HARDENED_CLAY_ID, "Hardened Clay", Texture.hardenedClay) {
{
isOpaque = true;
isSolid = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, Texture.hardenedClay);
}
};
public static final int BLOCK_OF_COAL_ID = 0xAD;
public static final Block COAL_BLOCK = new Block(BLOCK_OF_COAL_ID, "Block of Coal", Texture.coalBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int PACKED_ICE_ID = 0xAE;
public static final Block PACKED_ICE = new Block(PACKED_ICE_ID, "Unknown Block 0xAE", Texture.packedIce) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int LARGE_FLOWER_ID = 0xAF;
public static final Block LARGE_FLOWER = new Block(LARGE_FLOWER_ID, "Large Flower", Texture.dandelion) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
subSurfaceScattering = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return LargeFlowerModel.intersect(ray, scene);
}
};
public static final int STANDING_BANNER_ID = 0xB0;
public static final Block STANDING_BANNER = new Block(STANDING_BANNER_ID,
"Standing Banner", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
// TODO: render this.
}
};
public static final int WALL_BANNER_ID = 0xB1;
public static final Block WALL_BANNER = new Block(WALL_BANNER_ID, "Wall Banner", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
// TODO: render this.
}
};
public static final Block INVERTED_DAYLIGHTSENSOR = new Block(0xB2,
"Inverted Daylight Sensor", Texture.daylightDetectorTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return DaylightSensorModel.intersect(ray);
}
};
public static final int REDSANDSTONE_ID = 0xB3;
public static final Block REDSANDSTONE = new Block(REDSANDSTONE_ID, "Red Sandstone", Texture.redSandstoneSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
// normal
{Texture.redSandstoneSide, Texture.redSandstoneSide, Texture.redSandstoneSide,
Texture.redSandstoneSide, Texture.redSandstoneTop, Texture.redSandstoneBottom,},
// decorated
{Texture.redSandstoneDecorated, Texture.redSandstoneDecorated,
Texture.redSandstoneDecorated, Texture.redSandstoneDecorated,
Texture.redSandstoneTop, Texture.redSandstoneBottom,},
// smooth
{Texture.redSandstoneSmooth, Texture.redSandstoneSmooth, Texture.redSandstoneSmooth,
Texture.redSandstoneSmooth, Texture.redSandstoneTop, Texture.redSandstoneBottom,},};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 3]);
}
};
public static final int REDSANDSTONESTAIRS_ID = 0xB4;
public static final Block REDSANDSTONESTAIRS = new Block(REDSANDSTONESTAIRS_ID, "Red Sandstone Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.redSandstoneSide, Texture.redSandstoneTop,
Texture.redSandstoneBottom);
}
@Override public Texture getTexture(int blockData) {
return Texture.redSandstoneSide;
}
};
public static final int DOUBLESLAB2_ID = 0xB5;
public static final Block DOUBLESLAB2 = new Block(DOUBLESLAB2_ID, "Double Slab2", Texture.redSandstoneTop) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures =
{Texture.redSandstoneSide, Texture.redSandstoneSide, Texture.redSandstoneSide,
Texture.redSandstoneSide, Texture.redSandstoneTop, Texture.redSandstoneTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, textures);
}
};
public static final int SLAB2_ID = 0xB6;
public static final Block SLAB2 = new Block(SLAB2_ID, "Slab2", Texture.redSandstoneTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] textures = {Texture.redSandstoneSide, Texture.redSandstoneTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return SlabModel.intersect(ray, textures[0], textures[1]);
}
};
public static final int SPRUCEFENCEGATE_ID = 0xB7;
public static final Block SPRUCEFENCEGATE = new Block(SPRUCEFENCEGATE_ID, "Spruce Fence Gate", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceGateModel.intersect(ray, Texture.sprucePlanks);
}
@Override protected boolean isFence() {
return true;
}
@Override protected boolean isFenceGate() {
return true;
}
};
public static final int BIRCHFENCEGATE_ID = 0xB8;
public static final Block BIRCHFENCEGATE = new Block(BIRCHFENCEGATE_ID, "Birch Fence Gate", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceGateModel.intersect(ray, Texture.birchPlanks);
}
@Override protected boolean isFenceGate() {
return true;
}
};
public static final int JUNGLEFENCEGATE_ID = 0xB9;
public static final Block JUNGLEFENCEGATE = new Block(JUNGLEFENCEGATE_ID, "Jungle Fence Gate", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceGateModel.intersect(ray, Texture.jungleTreePlanks);
}
@Override protected boolean isFenceGate() {
return true;
}
};
public static final int DARKOAKFENCEGATE_ID = 0xBA;
public static final Block DARKOAKFENCEGATE = new Block(DARKOAKFENCEGATE_ID, "Dark Oak Fence Gate", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceGateModel.intersect(ray, Texture.darkOakPlanks);
}
@Override protected boolean isFenceGate() {
return true;
}
};
public static final int ACACIAFENCEGATE_ID = 0xBB;
public static final Block ACACIAFENCEGATE = new Block(ACACIAFENCEGATE_ID, "Acacia Fence Gate", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceGateModel.intersect(ray, Texture.acaciaPlanks);
}
@Override protected boolean isFenceGate() {
return true;
}
};
public static final int SPRUCEFENCE_ID = 0xBC;
public static final Block SPRUCEFENCE = new Block(SPRUCEFENCE_ID, "Spruce Fence", Icon.fence) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.sprucePlanks);
}
@Override protected boolean isFence() {
return true;
}
};
public static final int BIRCHFENCE_ID = 0xBD;
public static final Block BIRCHFENCE = new Block(BIRCHFENCE_ID, "Birch Fence", Icon.fence) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.birchPlanks);
}
@Override protected boolean isFence() {
return true;
}
};
public static final int JUNGLEFENCE_ID = 0xBE;
public static final Block JUNGLEFENCE = new Block(JUNGLEFENCE_ID, "Jungle Fence", Icon.fence) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.jungleTreePlanks);
}
@Override protected boolean isFence() {
return true;
}
};
public static final int DARKOAKFENCE_ID = 0xBF;
public static final Block DARKOAKFENCE =
new Block(DARKOAKFENCE_ID, "Dark Oak Fence", Icon.fence) {
{
isOpaque = false;
// isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.darkOakPlanks);
}
@Override protected boolean isFence() {
return true;
}
};
public static final int ACACIAFENCE_ID = 0xC0;
public static final Block ACACIAFENCE = new Block(ACACIAFENCE_ID, "Acacia Fence", Icon.fence) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return FenceModel.intersect(ray, Texture.acaciaPlanks);
}
@Override protected boolean isFence() {
return true;
}
};
public static final int SPRUCEDOOR_ID = 0xC1;
public static final Block SPRUCEDOOR = new Block(SPRUCEDOOR_ID, "Spruce Door", Icon.woodenDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.spruceDoorBottom, Texture.spruceDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int BIRCHDOOR_ID = 0xC2;
public static final Block BIRCHDOOR = new Block(BIRCHDOOR_ID, "Birch Door", Icon.woodenDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.birchDoorBottom, Texture.birchDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int JUNGLEDOOR_ID = 0xC3;
public static final Block JUNGLEDOOR = new Block(JUNGLEDOOR_ID, "Jungle Door", Icon.woodenDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.jungleDoorBottom, Texture.jungleDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int ACACIADOOR_ID = 0xC4;
public static final Block ACACIADOOR = new Block(ACACIADOOR_ID, "Acacia Door", Icon.woodenDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.acaciaDoorBottom, Texture.acaciaDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int DARKOAKDOOR_ID = 0xC5;
public static final Block DARKOAKDOOR = new Block(DARKOAKDOOR_ID, "Dark Oak Door", Icon.woodenDoor) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
final Texture[] texture = {Texture.darkOakDoorBottom, Texture.darkOakDoorTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return DoorModel.intersect(ray, texture[ray.getBlockData() >>> 3]);
}
};
public static final int ENDROD_ID = 0xC6;
public static final Block ENDROD = new Block(ENDROD_ID, "End Rod", Texture.endRod) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
emittance = 1.0f;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return EndRodModel.intersect(ray);
}
final String[] direction = {
"down", "up", "north", "south", "west", "east"
};
@Override
public String description(int data) {
return direction[data % 6];
}
};
public static final int CHORUSPLANT_ID = 0xC7;
public static final Block CHORUSPLANT =
new Block(CHORUSPLANT_ID, "Chorus Plant", Texture.chorusPlant) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return ChorusPlantModel.intersect(ray);
}
};
public static final int CHORUSFLOWER_ID = 0xC8;
public static final Block CHORUSFLOWER =
new Block(CHORUSFLOWER_ID, "Chorus Flower", Texture.chorusFlower) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return ChorusFlowerModel.intersect(ray);
}
@Override public Texture getTexture(int blockData) {
return blockData < 5 ? Texture.chorusFlower : Texture.chorusFlowerDead;
}
};
public static final int PURPURBLOCK_ID = 0xC9;
public static final Block PURPURBLOCK = new Block(PURPURBLOCK_ID, "Purpur Block", Texture.purpurBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int PURPURPILLAR_ID = 0xCA;
public static final Block PURPURPILLAR = new Block(PURPURPILLAR_ID, "Purpur Pillar", Texture.purpurPillarSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture =
{Texture.purpurPillarSide, Texture.purpurPillarSide, Texture.purpurPillarSide,
Texture.purpurPillarSide, Texture.purpurPillarTop, Texture.purpurPillarTop,};
@Override public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture[ray.getBlockData() % 7]);
}
};
public static final int PURPURSTAIRS_ID = 0xCB;
public static final Block PURPURSTAIRS = new Block(PURPURSTAIRS_ID, "Purpur Stairs", Icon.stoneStairs) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return StairModel.intersect(ray, Texture.purpurBlock);
}
@Override public Texture getTexture(int blockData) {
return Texture.purpurBlock;
}
};
public static final int PURPURDOUBLESLAB_ID = 0xCC;
public static final Block PURPURDOUBLESLAB = new Block(PURPURDOUBLESLAB_ID, "Purpur Double Slab", Texture.purpurBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final int PURPURSLAB_ID = 0xCD;
public static final Block PURPURSLAB = new Block(PURPURSLAB_ID, "Purpur Slab", Texture.purpurBlock) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return SlabModel.intersect(ray, Texture.purpurBlock);
}
};
public static final int ENDBRICKS_ID = 0xCE;
public static final Block ENDBRICKS = new Block(ENDBRICKS_ID, "End Stone Bricks", Texture.endBricks) {
{
isOpaque = true;
isSolid = true;
}
};
public static final Block BEETROOTS = new Block(0xCF, "Beetroot Seeds", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
}
};
public static final int GRASSPATH_ID = 0xD0;
public static final Block GRASSPATH = new Block(GRASSPATH_ID, "Grass Path", Texture.grassPathTop) {
{
isOpaque = false;
isSolid = false;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return GrassPathModel.intersect(ray);
}
};
public static final Block END_GATEWAY = new Block(0xD1, "End Gateway", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
}
// TODO: render this.
};
public static final int REPEATING_COMMAND_BLOCK_ID = 0xD2;
public static final Block REPEATING_COMMAND_BLOCK = new Block(REPEATING_COMMAND_BLOCK_ID,
"Repeating Command Block", Texture.repeatingCommandBlockBack) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
{
Texture.repeatingCommandBlockBack,
Texture.repeatingCommandBlockFront,
Texture.repeatingCommandBlockSide
},
{
Texture.repeatingCommandBlockBack,
Texture.repeatingCommandBlockFront,
Texture.repeatingCommandBlockConditional
}
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, texture[ray.getBlockData() >> 3]);
}
};
public static final int CHAIN_COMMAND_BLOCK_ID = 0xD3;
public static final Block CHAIN_COMMAND_BLOCK = new Block(CHAIN_COMMAND_BLOCK_ID,
"Chain Command Block", Texture.chainCommandBlockBack) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[][] texture = {
{
Texture.chainCommandBlockBack,
Texture.chainCommandBlockFront,
Texture.chainCommandBlockSide
},
{
Texture.chainCommandBlockBack,
Texture.chainCommandBlockFront,
Texture.chainCommandBlockConditional
}
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, texture[ray.getBlockData() >> 3]);
}
};
public static final Block FROSTEDICE = new Block(0xD4, "Frosted Ice", Texture.ice) {
{
isOpaque = false;
isSolid = true;
ior = 1.31f;
}
// TODO: render ice cracks.
};
public static final Block MAGMA = new Block(0xD5, "Magma", Texture.magma) {
{
isOpaque = true;
isSolid = true;
emittance = 0.6f; // Not as bright as lava (1.0).
}
};
public static final Block NETHER_WART_BLOCK = new Block(0xD6, "Nether Wart",
Texture.netherWartBlock) {
{
isOpaque = true;
isSolid = true;
}
};
public static final Block RED_NETHER_BRICK = new Block(0xD7, "Red Nether Brick",
Texture.redNetherBrick) {
{
isOpaque = true;
isSolid = true;
}
};
public static final Block BONE = new Block(0xD8, "Bone", Texture.boneSide) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture = {Texture.boneSide, Texture.boneTop};
@Override public boolean intersect(Ray ray, Scene scene) {
return WoodModel.intersect(ray, texture);
}
};
private static final Block STRUCTURE_VOID = new Block(0xD9, "Structure Void", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = true;
}
};
public static final Block OBSERVER = new Block(0xDA, "Observer", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] texture = {
Texture.observerBack, Texture.observerFront,
Texture.observerSide, Texture.observerTop
};
@Override public boolean intersect(Ray ray, Scene scene) {
return ObserverModel.intersect(ray, texture);
}
};
public static final Block SHULKERBOX_WHITE = new Block(0xDB, "Shulker Box White", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerWhite.bottom,
Texture.shulkerWhite.top,
Texture.shulkerWhite.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_ORANGE = new Block(0xDC, "Shulker Box Orange", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerOrange.bottom,
Texture.shulkerOrange.top,
Texture.shulkerOrange.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_MAGENTA = new Block(0xDD, "Shulker Box Magenta", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerMagenta.bottom,
Texture.shulkerMagenta.top,
Texture.shulkerMagenta.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_LIGHTBLUE = new Block(0xDE, "Shulker Box Light Blue",
Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerLightBlue.bottom,
Texture.shulkerLightBlue.top,
Texture.shulkerLightBlue.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_YELLOW = new Block(0xDF, "Shulker Box Yellow", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerYellow.bottom,
Texture.shulkerYellow.top,
Texture.shulkerYellow.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_LIME = new Block(0xE0, "Shulker Box Lime", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerLime.bottom,
Texture.shulkerLime.top,
Texture.shulkerLime.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_PINK = new Block(0xE1, "Shulker Box Pink", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerPink.bottom,
Texture.shulkerPink.top,
Texture.shulkerPink.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_GRAY = new Block(0xE2, "Shulker Box Gray", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerGray.bottom,
Texture.shulkerGray.top,
Texture.shulkerGray.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_SILVER = new Block(0xE3, "Shulker Box Light Gray",
Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerSilver.bottom,
Texture.shulkerSilver.top,
Texture.shulkerSilver.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_CYAN = new Block(0xE4, "Shulker Box Cyan", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerCyan.bottom,
Texture.shulkerCyan.top,
Texture.shulkerCyan.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_PURPLE = new Block(0xE5, "Shulker Box Purple", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerPurple.bottom,
Texture.shulkerPurple.top,
Texture.shulkerPurple.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_BLUE = new Block(0xE6, "Shulker Box Blue", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerBlue.bottom,
Texture.shulkerBlue.top,
Texture.shulkerBlue.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_BROWN = new Block(0xE7, "Shulker Box Brown", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerBrown.bottom,
Texture.shulkerBrown.top,
Texture.shulkerBrown.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_GREEN = new Block(0xE8, "Shulker Box Green", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerGreen.bottom,
Texture.shulkerGreen.top,
Texture.shulkerGreen.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_RED = new Block(0xE9, "Shulker Box Red", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerRed.bottom,
Texture.shulkerRed.top,
Texture.shulkerRed.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block SHULKERBOX_BLACK = new Block(0xEA, "Shulker Box Black", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
final Texture[] textures = {
Texture.shulkerBlack.bottom,
Texture.shulkerBlack.top,
Texture.shulkerBlack.side
};
@Override public boolean intersect(Ray ray, Scene scene) {
return DirectionalBlockModel.intersect(ray, textures);
}
};
public static final Block WHITE_TERRACOTTA = new Block(0xEB, "White Glazed Terracotta",
Texture.terracottaWhite) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaWhite);
}
};
public static final Block ORANGE_TERRACOTTA = new Block(0xEC, "Orange Glazed Terracotta",
Texture.terracottaOrange) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaOrange);
}
};
public static final Block MAGENTA_TERRACOTTA = new Block(0xED, "Magenta Glazed Terracotta",
Texture.terracottaMagenta) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaMagenta);
}
};
public static final Block LIGHT_BLUE_TERRACOTTA = new Block(0xEE, "Light Blue Glazed Terracotta",
Texture.terracottaLightBlue) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaLightBlue);
}
};
public static final Block YELLOW_TERRACOTTA = new Block(0xEF, "Yellow Glazed Terracotta",
Texture.terracottaYellow) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaYellow);
}
};
public static final Block LIME_TERRACOTTA = new Block(0xF0, "Lime Glazed Terracotta",
Texture.terracottaLime) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaLime);
}
};
public static final Block PINK_TERRACOTTA = new Block(0xF1, "Pink Glazed Terracotta", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaWhite);
}
};
public static final Block GRAY_TERRACOTTA = new Block(0xF2, "Gray Glazed Terracotta", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaWhite);
}
};
public static final Block SILVER_TERRACOTTA = new Block(0xF3, "Light Gray Glazed Terracotta",
Texture.terracottaSilver) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaSilver);
}
};
public static final Block CYAN_TERRACOTTA = new Block(0xF4, "Cyan Glazed Terracotta",
Texture.terracottaCyan) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaCyan);
}
};
public static final Block PURPLE_TERRACOTTA = new Block(0xF5, "Purple Glazed Terracotta",
Texture.terracottaPurple) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaPurple);
}
};
public static final Block BLUE_TERRACOTTA = new Block(0xF6, "Blue Glazed Terracotta",
Texture.terracottaBlue) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaBlue);
}
};
public static final Block BROWN_TERRACOTTA = new Block(0xF7, "Brown Glazed Terracotta",
Texture.terracottaBrown) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaBrown);
}
};
public static final Block GREEN_TERRACOTTA = new Block(0xF8, "Green Glazed Terracotta",
Texture.terracottaGreen) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaGreen);
}
};
public static final Block RED_TERRACOTTA = new Block(0xF9, "Red Glazed Terracotta",
Texture.terracottaRed) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaRed);
}
};
public static final Block BLACK_TERRACOTTA = new Block(0xFA, "Black Glazed Terracotta",
Texture.terracottaBlack) {
{
isOpaque = true;
isSolid = true;
localIntersect = true;
}
@Override public boolean intersect(Ray ray, Scene scene) {
return TerracottaModel.intersect(ray, Texture.terracottaBlack);
}
};
public static final Block CONCRETE = new Block(0xFB, "Concrete", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
}
@Override public Texture getTexture(int blockData) {
return Texture.concrete[blockData];
}
@Override public String description(int data) {
return woolColor[data & 15];
}
};
public static final Block CONCRETE_POWDER = new Block(0xFC, "Concrete Powder", Texture.unknown) {
{
isOpaque = true;
isSolid = true;
}
@Override public Texture getTexture(int blockData) {
return Texture.concretePowder[blockData];
}
@Override public String description(int data) {
return woolColor[data & 15];
}
};
private static final Block UNKNOWN0xFD = new Block(0xFD, "Unknown Block 0xFD", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
}
};
private static final Block UNKNOWN0xFE = new Block(0xFE, "Unknown Block 0xFE", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
}
};
public static final Block STRUCTURE_BLOCK = new Block(0xFF, "Structure Block", Texture.unknown) {
{
isOpaque = false;
isSolid = false;
isInvisible = UNKNOWN_INVISIBLE;
}
// TODO: render this.
};
public static final Block[] blocks = {
AIR, STONE, GRASS, DIRT, COBBLESTONE, WOODENPLANKS, SAPLING, BEDROCK, WATER, STATIONARYWATER,
LAVA, STATIONARYLAVA, SAND, GRAVEL, GOLDORE, IRONORE, COALORE, WOOD, LEAVES, SPONGE,
GLASS, LAPIS_ORE, LAPIS_BLOCK, DISPENSER, SANDSTONE, NOTEBLOCK, BED,
POWEREDRAIL, DETECTORRAIL, STICKYPISTON, COBWEB, TALLGRASS, DEADBUSH, PISTON, PISTON_HEAD, WOOL,
PISTON_EXTENSION, DANDELION, FLOWER, BROWNMUSHROOM, REDMUSHROOM,
GOLDBLOCK, IRONBLOCK, DOUBLESLAB, SLAB, BRICKS, TNT, BOOKSHELF, MOSSSTONE, OBSIDIAN,
TORCH, FIRE, MONSTERSPAWNER, OAKWOODSTAIRS, CHEST, REDSTONEWIRE, DIAMONDORE, DIAMONDBLOCK,
WORKBENCH, CROPS, SOIL, FURNACEUNLIT, FURNACELIT, SIGNPOST, WOODENDOOR, LADDER,
MINECARTTRACKS, STONESTAIRS, WALLSIGN, LEVER, STONEPRESSUREPLATE, IRONDOOR,
WOODENPRESSUREPLATE, REDSTONEORE, GLOWINGREDSTONEORE, REDSTONETORCHOFF, REDSTONETORCHON,
STONEBUTTON, SNOW, ICE, SNOWBLOCK, CACTUS, CLAY, SUGARCANE, JUKEBOX, FENCE, PUMPKIN,
NETHERRACK, SOULSAND, GLOWSTONE, PORTAL, JACKOLANTERN, CAKE, REDSTONEREPEATEROFF,
REDSTONEREPEATERON, STAINED_GLASS, TRAPDOOR, HIDDENSILVERFISH, STONEBRICKS,
HUGEBROWNMUSHROOM, HUGEREDMUSHROOM, IRONBARS, GLASSPANE, MELON, PUMPKINSTEM, MELONSTEM,
VINES, FENCEGATE, BRICKSTAIRS, STONEBRICKSTAIRS, MYCELIUM, LILY_PAD, NETHERBRICK,
NETHERBRICKFENCE, NETHERBRICKSTAIRS, NETHERWART, ENCHNATMENTTABLE, BREWINGSTAND, CAULDRON,
ENDPORTAL, ENDPORTALFRAME, ENDSTONE, DRAGONEGG, REDSTONELAMPOFF, REDSTONELAMPON,
DOUBLEWOODENSLAB, SINGLEWOODENSLAB, COCOAPLANT, SANDSTONESTAIRS, EMERALDORE, ENDERCHEST,
TRIPWIREHOOK, TRIPWIRE, EMERALDBLOCK, SPRUCEWOODSTAIRS, BIRCHWOODSTAIRS, JUNGLEWOODSTAIRS,
COMMAND_BLOCK, BEACON, STONEWALL, FLOWERPOT, CARROTS, POTATOES, WOODENBUTTON, HEAD, ANVIL,
TRAPPEDCHEST, WEIGHTEDPRESSUREPLATELIGHT, WEIGHTEDPRESSUREPLATEHEAVY, COMPARATOR,
COMPARATOR_POWERED, DAYLIGHTSENSOR, REDSTONEBLOCK, NETHERQUARTZORE, HOPPER, QUARTZ,
QUARTZSTAIRS, ACTIVATORRAIL, DROPPER, STAINED_CLAY, STAINED_GLASSPANE, LEAVES2, WOOD2,
ACACIASTAIRS, DARKOAKSTAIRS, SLIMEBLOCK, BARRIER, IRON_TRAPDOOR, PRISMARINE, SEALANTERN,
HAY_BLOCK, CARPET, HARDENED_CLAY, COAL_BLOCK, PACKED_ICE, LARGE_FLOWER, STANDING_BANNER,
WALL_BANNER, INVERTED_DAYLIGHTSENSOR, REDSANDSTONE, REDSANDSTONESTAIRS, DOUBLESLAB2, SLAB2,
SPRUCEFENCEGATE, BIRCHFENCEGATE, JUNGLEFENCEGATE, DARKOAKFENCEGATE, ACACIAFENCEGATE,
SPRUCEFENCE, BIRCHFENCE, JUNGLEFENCE, DARKOAKFENCE, ACACIAFENCE, SPRUCEDOOR, BIRCHDOOR,
JUNGLEDOOR, ACACIADOOR, DARKOAKDOOR, ENDROD, CHORUSPLANT, CHORUSFLOWER, PURPURBLOCK,
PURPURPILLAR, PURPURSTAIRS, PURPURDOUBLESLAB, PURPURSLAB, ENDBRICKS, BEETROOTS,
GRASSPATH, END_GATEWAY, REPEATING_COMMAND_BLOCK, CHAIN_COMMAND_BLOCK, FROSTEDICE, MAGMA,
NETHER_WART_BLOCK, RED_NETHER_BRICK, BONE, STRUCTURE_VOID, OBSERVER, SHULKERBOX_WHITE,
SHULKERBOX_ORANGE, SHULKERBOX_MAGENTA, SHULKERBOX_LIGHTBLUE, SHULKERBOX_YELLOW,
SHULKERBOX_LIME, SHULKERBOX_PINK, SHULKERBOX_GRAY, SHULKERBOX_SILVER, SHULKERBOX_CYAN,
SHULKERBOX_PURPLE, SHULKERBOX_BLUE, SHULKERBOX_BROWN, SHULKERBOX_GREEN, SHULKERBOX_RED,
SHULKERBOX_BLACK, WHITE_TERRACOTTA, ORANGE_TERRACOTTA, MAGENTA_TERRACOTTA,
LIGHT_BLUE_TERRACOTTA, YELLOW_TERRACOTTA, LIME_TERRACOTTA, PINK_TERRACOTTA, GRAY_TERRACOTTA,
SILVER_TERRACOTTA, CYAN_TERRACOTTA, PURPLE_TERRACOTTA, BLUE_TERRACOTTA, BROWN_TERRACOTTA,
GREEN_TERRACOTTA, RED_TERRACOTTA, BLACK_TERRACOTTA, CONCRETE, CONCRETE_POWDER, UNKNOWN0xFD,
UNKNOWN0xFE, STRUCTURE_BLOCK
};
/** Minecraft block ID. */
public final int id;
/** The block types that can connect to redstone wire. */
private static final Set<Block> redstoneConnectors = new HashSet<>();
static {
redstoneConnectors.add(REDSTONEWIRE);
redstoneConnectors.add(REDSTONETORCHOFF);
redstoneConnectors.add(REDSTONETORCHON);
redstoneConnectors.add(REDSTONEREPEATEROFF);
redstoneConnectors.add(REDSTONEREPEATERON);
redstoneConnectors.add(LEVER);
redstoneConnectors.add(STONEBUTTON);
redstoneConnectors.add(TRIPWIREHOOK);
redstoneConnectors.add(TRIPWIREHOOK);
redstoneConnectors.add(COMPARATOR);
redstoneConnectors.add(COMPARATOR_POWERED);
redstoneConnectors.add(DAYLIGHTSENSOR);
}
public Block(int id, String name, Texture texture) {
super(name, texture);
this.id = id;
}
/** The in-game name of this block. */
public String getBlockName() {
return name;
}
@Override public String toString() {
return getBlockName();
}
public boolean intersect(Ray ray, Scene scene) {
return TexturedBlockModel.intersect(ray, texture);
}
public Texture getIcon() {
return texture;
}
public boolean isLava() {
return this == LAVA || this == STATIONARYLAVA;
}
public boolean isNetherBrickFenceConnector() {
return isSolid || this == NETHERBRICKFENCE || isFenceGate();
}
public boolean isFenceConnector() {
return isSolid || isFence() || isFenceGate();
}
protected boolean isFence() {
return false;
}
protected boolean isFenceGate() {
return false;
}
public boolean isStoneWallConnector() {
return isSolid || this == FENCEGATE || this == STONEWALL;
}
public boolean isGlassPaneConnector() {
return isSolid || this == GLASSPANE || this == STAINED_GLASSPANE;
}
public boolean isIronBarsConnector() {
return isSolid || this == IRONBARS;
}
public boolean isChorusPlant() {
return this == CHORUSPLANT || this == CHORUSFLOWER;
}
public boolean isRedstoneWireConnector() {
return redstoneConnectors.contains(this);
}
public boolean isCave() {
return !isSolid && !this.isWater();
}
public boolean isStair() {
return this == OAKWOODSTAIRS || this == STONESTAIRS || this == BRICKSTAIRS
|| this == STONEBRICKSTAIRS || this == NETHERBRICKSTAIRS || this == SANDSTONESTAIRS
|| this == SPRUCEWOODSTAIRS || this == BIRCHWOODSTAIRS || this == JUNGLEWOODSTAIRS
|| this == QUARTZSTAIRS || this == ACACIASTAIRS || this == DARKOAKSTAIRS
|| this == REDSANDSTONESTAIRS;
}
public boolean isGroundBlock() {
return id != Block.AIR_ID &&
id != Block.LEAVES_ID &&
id != Block.LEAVES2_ID &&
id != Block.WOOD_ID &&
id != Block.WOOD2_ID;
}
public static Block get(int id) {
return blocks[0xFF & id];
}
/**
* Changes the internal block representation for a given block ID.
*
* <p>The Block class is responsible for rendering Minecraft blocks.
* Changing the block instance for a given block ID can be used to
* change the rendering of that block, or to change rendering
* parameters such as emittance and texture.
*
* @param id ID of the block to change.
* @param newBlock new block representation.
*/
public static void set(int id, Block newBlock) {
if (id < 0 || id > 0xFF) {
throw new IllegalArgumentException("Block id out of range.");
}
if (newBlock == null) {
throw new IllegalArgumentException("Block can not be null.");
}
blocks[id] = newBlock;
}
private static final String[] woolColor = {
"white", "orange", "magenta", "light blue", "yellow", "lime", "pink", "gray", "light gray",
"cyan", "purple", "blue", "brown", "green", "red", "black"
};
private static final String[] bits = {
"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010",
"1011", "1100", "1101", "1110", "1111"
};
/**
* @param data block data
* @return debug info for this block
*/
public String description(int data) {
return bits[data & 15];
}
public boolean isSameMaterial(Material other) {
return other == this;
}
@Override public JsonValue toJson() {
return new JsonString("block:" + id);
}
}