/* Copyright (c) 2012-2015 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.resources; import javafx.scene.image.Image; import org.apache.commons.math3.util.FastMath; import se.llbit.chunky.PersistentSettings; import se.llbit.chunky.renderer.scene.Scene; import se.llbit.math.ColorUtil; import se.llbit.math.QuickMath; import se.llbit.math.Ray; import se.llbit.math.Vector4; import se.llbit.resources.ImageLoader; import se.llbit.util.ImageTools; import se.llbit.util.NotNull; /** * This class contains static fields for common textures. * * <p>The Texture type is used for all textures used in the renderer. * It mostly serves as a data object wrapping a BitmapImage. * * @author Jesper Öqvist <jesper@llbit.se> */ public class Texture { public static final Texture EMPTY_TEXTURE = new Texture() { @Override public void getColor(double u, double v, Vector4 c) { c.set(0, 0, 0, 0); } @Override public void getColorInterpolated(double u, double v, Vector4 c) { c.set(0, 0, 0, 0); } @Override public boolean isEmptyTexture() { return true; } }; public static final Texture paintings = new Texture(); public static final Texture air = new Texture("air"); public static final Texture stone = new Texture("stone"); public static final Texture prismarine = new Texture(); public static final Texture prismarineBricks = new Texture(); public static final Texture darkPrismarine = new Texture(); public static final Texture granite = new Texture(); public static final Texture smoothGranite = new Texture(); public static final Texture diorite = new Texture(); public static final Texture smoothDiorite = new Texture(); public static final Texture andesite = new Texture(); public static final Texture smoothAndesite = new Texture(); public static final Texture dirt = new Texture("dirt"); public static final Texture coarseDirt = new Texture("dirt"); public static final Texture grassSideSaturated = new Texture("grass-side-saturated"); public static final Texture grassTop = new Texture("grass"); public static final Texture grassSide = new Texture(); public static final Texture water = new Texture("water"); public static final Texture cauldronSide = new Texture(); public static final Texture cauldronInside = new Texture(); public static final Texture cauldronTop = new Texture(); public static final Texture cauldronBottom = new Texture(); public static final Texture slabTop = new Texture("stone-slab"); public static final Texture slabSide = new Texture("double-stone-slab"); public static final Texture brick = new Texture("bricks"); public static final Texture tntTop = new Texture(); public static final Texture tntSide = new Texture("tnt"); public static final Texture tntBottom = new Texture(); public static final Texture cobweb = new Texture("cobweb"); public static final Texture portal = new Texture("nether-portal"); public static final Texture cobblestone = new Texture("cobblestone"); public static final Texture bedrock = new Texture("bedrock"); public static final Texture sand = new Texture("sand"); public static final Texture gravel = new Texture("gravel"); public static final Texture ironBlock = new Texture("iron-block"); public static final Texture goldBlock = new Texture("gold-block"); public static final Texture diamondBlock = new Texture("diamond-block"); public static final Texture chestTop = new Texture(); public static final Texture chestBottom = new Texture(); public static final Texture chestLeft = new Texture(); public static final Texture chestRight = new Texture(); public static final Texture chestFront = new Texture("chest"); public static final Texture chestBack = new Texture(); public static final Texture chestLock = new Texture(); public static final Texture enderChestTop = new Texture(); public static final Texture enderChestBottom = new Texture(); public static final Texture enderChestLeft = new Texture(); public static final Texture enderChestRight = new Texture(); public static final Texture enderChestFront = new Texture(); public static final Texture enderChestBack = new Texture(); public static final Texture enderChestLock = new Texture(); public static final Texture redMushroom = new Texture("red-mushroom"); public static final Texture brownMushroom = new Texture("brown-mushroom"); public static final Texture goldOre = new Texture("gold-ore"); public static final Texture ironOre = new Texture("iron-ore"); public static final Texture coalOre = new Texture("coal-ore"); public static final Texture netherQuartzOre = new Texture(); public static final Texture bookshelf = new Texture("bookshelf"); public static final Texture mossStone = new Texture("moss-stone"); public static final Texture obsidian = new Texture("obsidian"); public static final Texture workbenchTop = new Texture(); public static final Texture workbenchSide = new Texture("workbench"); public static final Texture workbenchFront = new Texture("workbench"); public static final Texture furnaceTop = new Texture(); public static final Texture furnaceSide = new Texture(); public static final Texture furnaceUnlitFront = new Texture("furnace"); public static final Texture furnaceLitFront = new Texture("furnace-lit"); public static final Texture dispenserFront = new Texture("dispenser"); public static final Texture dispenserFrontVertical = new Texture("dispenser"); public static final Texture dropperFront = new Texture(); public static final Texture dropperFrontVertical = new Texture(); public static final Texture sponge = new Texture("sponge"); public static final Texture wetSponge = new Texture("sponge"); public static final Texture glass = new Texture("glass"); public static final Texture diamondOre = new Texture("diamond-ore"); public static final Texture redstoneOre = new Texture("redstone-ore"); public static final Texture stoneBrick = new Texture("stone-bricks"); public static final Texture mossyStoneBrick = new Texture(); public static final Texture crackedStoneBrick = new Texture(); public static final Texture circleStoneBrick = new Texture(); public static final Texture monsterSpawner = new Texture("spawner"); public static final Texture snowBlock = new Texture("snow"); public static final Texture snowSide = new Texture(); public static final Texture ice = new Texture("ice"); public static final Texture cactusTop = new Texture(); public static final Texture cactusSide = new Texture(); public static final Texture cactusBottom = new Texture(); public static final Texture clay = new Texture("clay"); public static final Texture sugarCane = new Texture("sugar-canes"); public static final Texture jukeboxSide = new Texture(); public static final Texture jukeboxTop = new Texture(); public static final Texture torch = new Texture("torch"); public static final Texture woodenDoorTop = new Texture(); public static final Texture woodenDoorBottom = new Texture(); public static final Texture ironDoorTop = new Texture(); public static final Texture ironDoorBottom = new Texture(); public static final Texture ladder = new Texture("ladder"); public static final Texture trapdoor = new Texture("trapdoor"); public static final Texture ironTrapdoor = new Texture("trapdoor"); public static final Texture ironBars = new Texture("iron-bars"); public static final Texture farmlandWet = new Texture(); public static final Texture farmlandDry = new Texture(); public static final Texture lever = new Texture(); public static final Texture redstoneTorchOn = new Texture("redstone-torch-on"); public static final Texture redstoneTorchOff = new Texture("redstone-torch-off"); public static final Texture redstoneWireCross = new Texture("redstone-wire-off-intersect"); public static final Texture redstoneWire = new Texture(); public static final Texture pumpkinTop = new Texture(); public static final Texture pumpkinSide = new Texture(); public static final Texture pumpkinFront = new Texture(); public static final Texture jackolanternFront = new Texture(); public static final Texture netherrack = new Texture("netherrack"); public static final Texture soulsand = new Texture("soul-sand"); public static final Texture glowstone = new Texture("glowstone"); public static final Texture seaLantern = new Texture(); public static final Texture sandstoneSide = new Texture("sandstone"); public static final Texture sandstoneTop = new Texture(); public static final Texture sandstoneBottom = new Texture(); public static final Texture sandstoneDecorated = new Texture(); public static final Texture sandstoneSmooth = new Texture(); public static final Texture redSandstoneSide = new Texture(); public static final Texture redSandstoneTop = new Texture(); public static final Texture redSandstoneBottom = new Texture(); public static final Texture redSandstoneDecorated = new Texture(); public static final Texture redSandstoneSmooth = new Texture(); public static final Texture bedFootTop = new Texture(); public static final Texture bedHeadTop = new Texture(); public static final Texture bedFootEnd = new Texture(); public static final Texture bedFootSide = new Texture(); public static final Texture bedHeadSide = new Texture(); public static final Texture bedHeadEnd = new Texture(); public static final Texture deadBush = new Texture("dead-bush"); public static final Texture tallGrass = new Texture("tall-grass"); public static final Texture fern = new Texture(); public static final Texture vines = new Texture("vines"); public static final Texture crops0 = new Texture(); public static final Texture crops1 = new Texture(); public static final Texture crops2 = new Texture(); public static final Texture crops3 = new Texture(); public static final Texture crops4 = new Texture(); public static final Texture crops5 = new Texture(); public static final Texture crops6 = new Texture(); public static final Texture crops7 = new Texture(); public static final Texture rails = new Texture("minecart-track"); public static final Texture railsCurved = new Texture(); public static final Texture poweredRailOn = new Texture(); public static final Texture poweredRailOff = new Texture(); public static final Texture detectorRail = new Texture(); public static final Texture activatorRail = new Texture(); public static final Texture activatorRailPowered = new Texture(); public static final Texture whiteWool = new Texture("wool"); public static final Texture orangeWool = new Texture("wool"); public static final Texture magentaWool = new Texture("wool"); public static final Texture lightBlueWool = new Texture("wool"); public static final Texture yellowWool = new Texture("wool"); public static final Texture limeWool = new Texture("wool"); public static final Texture pinkWool = new Texture("wool"); public static final Texture grayWool = new Texture("wool"); public static final Texture lightGrayWool = new Texture("wool"); public static final Texture cyanWool = new Texture("wool"); public static final Texture purpleWool = new Texture("wool"); public static final Texture blueWool = new Texture("wool"); public static final Texture brownWool = new Texture("wool"); public static final Texture greenWool = new Texture("wool"); public static final Texture redWool = new Texture("wool"); public static final Texture blackWool = new Texture("wool"); public static final Texture lava = new Texture("lava"); public static final Texture lapisOre = new Texture("lapis-lazuli-ore"); public static final Texture lapisBlock = new Texture("lapis-lazuli-block"); public static final Texture pistonSide = new Texture("piston"); public static final Texture pistonInnerTop = new Texture(); public static final Texture pistonBottom = new Texture(); public static final Texture pistonTop = new Texture("piston-extension"); public static final Texture pistonTopSticky = new Texture(); public static final Texture fire = new Texture("fire"); public static final AnimatedTexture fireLayer0 = new AnimatedTexture("fire"); public static final AnimatedTexture fireLayer1 = new AnimatedTexture("fire"); public static final Texture redstoneRepeaterOn = new Texture("redstone-repeater-off"); public static final Texture redstoneRepeaterOff = new Texture("redstone-repeater-on"); public static final Texture redstoneLampOn = new Texture("redstone-lamp-off"); public static final Texture redstoneLampOff = new Texture("redstone-lamp-on"); public static final Texture endPortalFrameTop = new Texture(); public static final Texture endPortalFrameSide = new Texture(); public static final Texture endPortal = new Texture("end-portal"); public static final Texture endStone = new Texture("end-stone"); public static final Texture brewingStandSide = new Texture(); public static final Texture brewingStandBase = new Texture(); public static final Texture cakeTop = new Texture(); public static final Texture cakeSide = new Texture(); public static final Texture cakeInside = new Texture(); public static final Texture cakeBottom = new Texture(); public static final Texture hugeBrownMushroom = new Texture(); public static final Texture hugeRedMushroom = new Texture(); public static final Texture mushroomStem = new Texture(); public static final Texture mushroomPores = new Texture(); public static final Texture melonSide = new Texture(); public static final Texture melonTop = new Texture(); public static final Texture stemStraight = new Texture(); public static final Texture stemBent = new Texture(); public static final Texture myceliumTop = new Texture(); public static final Texture myceliumSide = new Texture(); public static final Texture lilyPad = new Texture("lily-pad"); public static final Texture netherBrick = new Texture(); public static final Texture netherWart0 = new Texture(); public static final Texture netherWart1 = new Texture(); public static final Texture netherWart2 = new Texture(); public static final Texture largeChestFrontLeft = new Texture(); public static final Texture largeChestFrontRight = new Texture(); public static final Texture largeChestBackLeft = new Texture(); public static final Texture largeChestBackRight = new Texture(); public static final Texture largeChestTopLeft = new Texture(); public static final Texture largeChestTopRight = new Texture(); public static final Texture largeChestBottomLeft = new Texture(); public static final Texture largeChestBottomRight = new Texture(); public static final Texture largeChestLeft = new Texture(); public static final Texture largeChestRight = new Texture(); public static final Texture enchantmentTableSide = new Texture(); public static final Texture enchantmentTableTop = new Texture(); public static final Texture enchantmentTableBottom = new Texture(); public static final Texture commandBlockBack = new Texture(); public static final Texture commandBlockFront = new Texture(); public static final Texture commandBlockSide = new Texture(); public static final Texture commandBlockConditional = new Texture(); public static final Texture repeatingCommandBlockBack = new Texture(); public static final Texture repeatingCommandBlockFront = new Texture(); public static final Texture repeatingCommandBlockSide = new Texture(); public static final Texture repeatingCommandBlockConditional = new Texture(); public static final Texture chainCommandBlockBack = new Texture(); public static final Texture chainCommandBlockFront = new Texture(); public static final Texture chainCommandBlockSide = new Texture(); public static final Texture chainCommandBlockConditional = new Texture(); public static final Texture eyeOfTheEnder = new Texture(); public static final Texture dragonEgg = new Texture(); public static final Texture cocoaPlantSmall = new Texture(); public static final Texture cocoaPlantMedium = new Texture(); public static final Texture cocoaPlantLarge = new Texture(); public static final Texture emeraldOre = new Texture(); public static final Texture emeraldBlock = new Texture(); public static final Texture redstoneBlock = new Texture(); public static final Texture tripwireHook = new Texture(); public static final Texture tripwire = new Texture(); public static final Texture carrots0 = new Texture(); public static final Texture carrots1 = new Texture(); public static final Texture carrots2 = new Texture(); public static final Texture carrots3 = new Texture(); public static final Texture potatoes0 = new Texture(); public static final Texture potatoes1 = new Texture(); public static final Texture potatoes2 = new Texture(); public static final Texture potatoes3 = new Texture(); public static final Texture beacon = new Texture(); public static final Texture anvilSide = new Texture(); public static final Texture anvilTop = new Texture(); public static final Texture anvilTopDamaged1 = new Texture(); public static final Texture anvilTopDamaged2 = new Texture(); public static final Texture flowerPot = new Texture(); public static final Texture quartzSide = new Texture(); public static final Texture quartzTop = new Texture(); public static final Texture quartzBottom = new Texture(); public static final Texture quartzChiseled = new Texture(); public static final Texture quartzChiseledTop = new Texture(); public static final Texture quartzPillar = new Texture(); public static final Texture quartzPillarTop = new Texture(); public static final Texture daylightDetectorTop = new Texture(); public static final Texture daylightDetectorSide = new Texture(); public static final Texture comparatorOff = new Texture(); public static final Texture comparatorOn = new Texture(); public static final Texture hopperOutside = new Texture(); public static final Texture hopperInside = new Texture(); public static final Texture slime = new Texture(); // [1.6] Hay Block, Hardened Clay, Coal Block public static final Texture hayBlockSide = new Texture(); public static final Texture hayBlockTop = new Texture(); public static final Texture hardenedClay = new Texture(); public static final Texture coalBlock = new Texture(); // [1.6] Colored Clay public static final Texture whiteClay = new Texture(); public static final Texture orangeClay = new Texture(); public static final Texture magentaClay = new Texture(); public static final Texture lightBlueClay = new Texture(); public static final Texture yellowClay = new Texture(); public static final Texture limeClay = new Texture(); public static final Texture pinkClay = new Texture(); public static final Texture grayClay = new Texture(); public static final Texture lightGrayClay = new Texture(); public static final Texture cyanClay = new Texture(); public static final Texture purpleClay = new Texture(); public static final Texture blueClay = new Texture(); public static final Texture brownClay = new Texture(); public static final Texture greenClay = new Texture(); public static final Texture redClay = new Texture(); public static final Texture blackClay = new Texture(); // [1.7.2] Stained Glass public static final Texture whiteGlass = new Texture("glass"); public static final Texture orangeGlass = new Texture("glass"); public static final Texture magentaGlass = new Texture("glass"); public static final Texture lightBlueGlass = new Texture("glass"); public static final Texture yellowGlass = new Texture("glass"); public static final Texture limeGlass = new Texture("glass"); public static final Texture pinkGlass = new Texture("glass"); public static final Texture grayGlass = new Texture("glass"); public static final Texture lightGrayGlass = new Texture("glass"); public static final Texture cyanGlass = new Texture("glass"); public static final Texture purpleGlass = new Texture("glass"); public static final Texture blueGlass = new Texture("glass"); public static final Texture brownGlass = new Texture("glass"); public static final Texture greenGlass = new Texture("glass"); public static final Texture redGlass = new Texture("glass"); public static final Texture blackGlass = new Texture("glass"); // [1.7.2] Podzol public static final Texture podzolTop = new Texture(); public static final Texture podzolSide = new Texture(); // [1.7.2] Flowers public static final Texture dandelion = new Texture("yellow-flower"); public static final Texture poppy = new Texture("rose"); public static final Texture blueOrchid = new Texture(); public static final Texture allium = new Texture(); public static final Texture azureBluet = new Texture(); public static final Texture redTulip = new Texture(); public static final Texture orangeTulip = new Texture(); public static final Texture whiteTulip = new Texture(); public static final Texture pinkTulip = new Texture(); public static final Texture oxeyeDaisy = new Texture(); // [1.7.2] Large Flowers public static final Texture sunflowerBottom = new Texture(); public static final Texture sunflowerTop = new Texture(); public static final Texture sunflowerFront = new Texture(); public static final Texture sunflowerBack = new Texture(); public static final Texture lilacBottom = new Texture(); public static final Texture lilacTop = new Texture(); public static final Texture doubleTallGrassBottom = new Texture(); public static final Texture doubleTallGrassTop = new Texture(); public static final Texture largeFernBottom = new Texture(); public static final Texture largeFernTop = new Texture(); public static final Texture roseBushBottom = new Texture(); public static final Texture roseBushTop = new Texture(); public static final Texture peonyBottom = new Texture(); public static final Texture peonyTop = new Texture(); // [1.7.2] Colored Glass Panes public static final Texture glassPaneTop = new Texture(); public static final Texture whiteGlassPaneSide = new Texture(); public static final Texture orangeGlassPaneSide = new Texture(); public static final Texture magentaGlassPaneSide = new Texture(); public static final Texture lightBlueGlassPaneSide = new Texture(); public static final Texture yellowGlassPaneSide = new Texture(); public static final Texture limeGlassPaneSide = new Texture(); public static final Texture pinkGlassPaneSide = new Texture(); public static final Texture grayGlassPaneSide = new Texture(); public static final Texture lightGrayGlassPaneSide = new Texture(); public static final Texture cyanGlassPaneSide = new Texture(); public static final Texture purpleGlassPaneSide = new Texture(); public static final Texture blueGlassPaneSide = new Texture(); public static final Texture brownGlassPaneSide = new Texture(); public static final Texture greenGlassPaneSide = new Texture(); public static final Texture redGlassPaneSide = new Texture(); public static final Texture blackGlassPaneSide = new Texture(); // Minecraft 1.9 blocks. public static final Texture grassPathSide = new Texture(); public static final Texture grassPathTop = new Texture(); public static final Texture endBricks = new Texture(); public static final Texture purpurBlock = new Texture(); public static final Texture purpurPillarTop = new Texture(); public static final Texture purpurPillarSide = new Texture(); public static final Texture chorusFlower = new Texture(); public static final Texture chorusFlowerDead = new Texture(); public static final Texture chorusPlant = new Texture(); public static final Texture endRod = new Texture(); // [1.11] Shulker boxes. public static final ShulkerTexture shulkerBlack = new ShulkerTexture(); public static final ShulkerTexture shulkerBlue = new ShulkerTexture(); public static final ShulkerTexture shulkerBrown = new ShulkerTexture(); public static final ShulkerTexture shulkerCyan = new ShulkerTexture(); public static final ShulkerTexture shulkerGray = new ShulkerTexture(); public static final ShulkerTexture shulkerGreen = new ShulkerTexture(); public static final ShulkerTexture shulkerLightBlue = new ShulkerTexture(); public static final ShulkerTexture shulkerLime = new ShulkerTexture(); public static final ShulkerTexture shulkerMagenta = new ShulkerTexture(); public static final ShulkerTexture shulkerOrange = new ShulkerTexture(); public static final ShulkerTexture shulkerPink = new ShulkerTexture(); public static final ShulkerTexture shulkerPurple = new ShulkerTexture(); public static final ShulkerTexture shulkerRed = new ShulkerTexture(); public static final ShulkerTexture shulkerSilver = new ShulkerTexture(); public static final ShulkerTexture shulkerWhite = new ShulkerTexture(); public static final ShulkerTexture shulkerYellow = new ShulkerTexture(); // [1.11] Observer block. public static final Texture observerBack = new Texture(); public static final Texture observerFront = new Texture(); public static final Texture observerSide = new Texture(); public static final Texture observerTop = new Texture(); // Trapped Chest. public static final Texture trappedChestTop = new Texture(); public static final Texture trappedChestBottom = new Texture(); public static final Texture trappedChestLeft = new Texture(); public static final Texture trappedChestRight = new Texture(); public static final Texture trappedChestFront = new Texture("chest"); public static final Texture trappedChestBack = new Texture(); public static final Texture trappedChestLock = new Texture(); public static final Texture largeTrappedChestFrontLeft = new Texture(); public static final Texture largeTrappedChestFrontRight = new Texture(); public static final Texture largeTrappedChestBackLeft = new Texture(); public static final Texture largeTrappedChestBackRight = new Texture(); public static final Texture largeTrappedChestTopLeft = new Texture(); public static final Texture largeTrappedChestTopRight = new Texture(); public static final Texture largeTrappedChestBottomLeft = new Texture(); public static final Texture largeTrappedChestBottomRight = new Texture(); public static final Texture largeTrappedChestLeft = new Texture(); public static final Texture largeTrappedChestRight = new Texture(); // Entity textures. public static final EntityTexture alex = new EntityTexture(); public static final EntityTexture steve = new EntityTexture(); public static final EntityTexture zombie = new EntityTexture(); public static final EntityTexture creeper = new EntityTexture(); public static final EntityTexture skeleton = new EntityTexture(); public static final EntityTexture wither = new EntityTexture(); // [1.10] Bone, magma, nether wart block, red nether brick. public static final Texture boneSide = new Texture(); public static final Texture boneTop = new Texture(); public static final Texture magma = new Texture(); public static final Texture netherWartBlock = new Texture(); public static final Texture redNetherBrick = new Texture(); // [1.12] Glazed Terracotta: public static final Texture terracottaBlack = new Texture(); public static final Texture terracottaBlue = new Texture(); public static final Texture terracottaBrown = new Texture(); public static final Texture terracottaCyan = new Texture(); public static final Texture terracottaGray = new Texture(); public static final Texture terracottaGreen = new Texture(); public static final Texture terracottaLightBlue = new Texture(); public static final Texture terracottaLime = new Texture(); public static final Texture terracottaMagenta = new Texture(); public static final Texture terracottaOrange = new Texture(); public static final Texture terracottaPink = new Texture(); public static final Texture terracottaPurple = new Texture(); public static final Texture terracottaRed = new Texture(); public static final Texture terracottaSilver = new Texture(); public static final Texture terracottaWhite = new Texture(); public static final Texture terracottaYellow = new Texture(); // [1.12] Concrete: public static final Texture concreteBlack = new Texture(); public static final Texture concreteBlue = new Texture(); public static final Texture concreteBrown = new Texture(); public static final Texture concreteCyan = new Texture(); public static final Texture concreteGray = new Texture(); public static final Texture concreteGreen = new Texture(); public static final Texture concreteLightBlue = new Texture(); public static final Texture concreteLime = new Texture(); public static final Texture concreteMagenta = new Texture(); public static final Texture concreteOrange = new Texture(); public static final Texture concretePink = new Texture(); public static final Texture concretePurple = new Texture(); public static final Texture concreteRed = new Texture(); public static final Texture concreteSilver = new Texture(); public static final Texture concreteWhite = new Texture(); public static final Texture concreteYellow = new Texture(); public static final Texture concretePowderBlack = new Texture(); public static final Texture concretePowderBlue = new Texture(); public static final Texture concretePowderBrown = new Texture(); public static final Texture concretePowderCyan = new Texture(); public static final Texture concretePowderGray = new Texture(); public static final Texture concretePowderGreen = new Texture(); public static final Texture concretePowderLightBlue = new Texture(); public static final Texture concretePowderLime = new Texture(); public static final Texture concretePowderMagenta = new Texture(); public static final Texture concretePowderOrange = new Texture(); public static final Texture concretePowderPink = new Texture(); public static final Texture concretePowderPurple = new Texture(); public static final Texture concretePowderRed = new Texture(); public static final Texture concretePowderSilver = new Texture(); public static final Texture concretePowderWhite = new Texture(); public static final Texture concretePowderYellow = new Texture(); /** * Missing or unknown texture. */ public static final Texture unknown = new Texture("unknown"); public static final Texture signPost = new Texture(); public static final Texture packedIce = new Texture(); public static final Texture redSand = new Texture(); // Tree variants. public static final Texture oakWoodTop = new Texture("wood-top"); public static final Texture spruceWoodTop = new Texture("wood-top"); public static final Texture birchWoodTop = new Texture("wood-top"); public static final Texture jungleTreeTop = new Texture("wood-top"); public static final Texture acaciaWoodTop = new Texture("wood-top"); public static final Texture darkOakWoodTop = new Texture("wood-top"); public static final Texture oakLeaves = new Texture("leaves"); public static final Texture spruceLeaves = new Texture("leaves"); public static final Texture birchLeaves = new Texture("leaves"); public static final Texture jungleTreeLeaves = new Texture("leaves"); public static final Texture acaciaLeaves = new Texture("leaves"); public static final Texture darkOakLeaves = new Texture("leaves"); public static final Texture oakSapling = new Texture("sapling"); public static final Texture spruceSapling = new Texture("sapling"); public static final Texture birchSapling = new Texture("sapling"); public static final Texture jungleSapling = new Texture("sapling"); public static final Texture acaciaSapling = new Texture("sapling"); public static final Texture darkOakSapling = new Texture("sapling"); public static final Texture oakPlanks = new Texture("wooden-planks"); public static final Texture sprucePlanks = new Texture("wooden-planks"); public static final Texture birchPlanks = new Texture("wooden-planks"); public static final Texture jungleTreePlanks = new Texture("wooden-planks"); public static final Texture acaciaPlanks = new Texture("wooden-planks"); public static final Texture darkOakPlanks = new Texture("wooden-planks"); public static final Texture oakWood = new Texture("wood"); public static final Texture spruceWood = new Texture("wood"); public static final Texture birchWood = new Texture("wood"); public static final Texture jungleWood = new Texture("wood"); public static final Texture acaciaWood = new Texture("wood"); public static final Texture darkOakWood = new Texture("wood"); public static final Texture spruceDoorTop = new Texture(); public static final Texture birchDoorTop = new Texture(); public static final Texture jungleDoorTop = new Texture(); public static final Texture acaciaDoorTop = new Texture(); public static final Texture darkOakDoorTop = new Texture(); public static final Texture spruceDoorBottom = new Texture(); public static final Texture birchDoorBottom = new Texture(); public static final Texture jungleDoorBottom = new Texture(); public static final Texture acaciaDoorBottom = new Texture(); public static final Texture darkOakDoorBottom = new Texture(); // All the wool variants, ordered after block ID. public static final Texture[] wool = { whiteWool, orangeWool, magentaWool, lightBlueWool, yellowWool, limeWool, pinkWool, grayWool, lightGrayWool, cyanWool, purpleWool, blueWool, brownWool, greenWool, redWool, blackWool }; public static final Texture[] concrete = { concreteWhite, concreteOrange, concreteMagenta, concreteLightBlue, concreteYellow, concreteLime, concretePink, concreteGray, concreteSilver, concreteCyan, concretePurple, concreteBlue, concreteBrown, concreteGreen, concreteRed, concreteBlack }; public static final Texture[] concretePowder = { concretePowderWhite, concretePowderOrange, concretePowderMagenta, concretePowderLightBlue, concretePowderYellow, concretePowderLime, concretePowderPink, concretePowderGray, concretePowderSilver, concretePowderCyan, concretePowderPurple, concretePowderBlue, concretePowderBrown, concretePowderGreen, concretePowderRed, concretePowderBlack }; public static final Texture[] stainedGlass = { whiteGlass, orangeGlass, magentaGlass, lightBlueGlass, yellowGlass, limeGlass, pinkGlass, grayGlass, lightGrayGlass, cyanGlass, purpleGlass, blueGlass, brownGlass, greenGlass, redGlass, blackGlass }; public static final Texture[] stainedGlassPaneSide = { whiteGlassPaneSide, orangeGlassPaneSide, magentaGlassPaneSide, lightBlueGlassPaneSide, yellowGlassPaneSide, limeGlassPaneSide, pinkGlassPaneSide, grayGlassPaneSide, lightGrayGlassPaneSide, cyanGlassPaneSide, purpleGlassPaneSide, blueGlassPaneSide, brownGlassPaneSide, greenGlassPaneSide, redGlassPaneSide, blackGlassPaneSide }; public static final Texture[] stainedClay = { whiteClay, orangeClay, magentaClay, lightBlueClay, yellowClay, limeClay, pinkClay, grayClay, lightGrayClay, cyanClay, purpleClay, blueClay, brownClay, greenClay, redClay, blackClay }; @NotNull protected BitmapImage image; protected int width; protected int height; protected int avgColor; private float[] avgColorLinear; private float[][] linear; private Image fxImage = null; public Texture() { this(ImageLoader.missingImage); } public Texture(String resourceName) { this(ImageLoader.readNonNull("textures/" + resourceName + ".png")); } public Texture(BitmapImage img) { setTexture(img); } public void setTexture(Texture texture) { setTexture(texture.image); } public void setTexture(BitmapImage newImage) { image = newImage; // Gamma correct the texture. avgColorLinear = new float[] {0, 0, 0, 0}; int[] data = image.data; width = image.width; height = image.height; linear = new float[width * height][4]; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int index = width * y + x; ColorUtil.getRGBAComponents(data[index], linear[index]); linear[index][0] = (float) FastMath.pow(linear[index][0], Scene.DEFAULT_GAMMA); linear[index][1] = (float) FastMath.pow(linear[index][1], Scene.DEFAULT_GAMMA); linear[index][2] = (float) FastMath.pow(linear[index][2], Scene.DEFAULT_GAMMA); avgColorLinear[0] += linear[index][3] * linear[index][0]; avgColorLinear[1] += linear[index][3] * linear[index][1]; avgColorLinear[2] += linear[index][3] * linear[index][2]; avgColorLinear[3] += linear[index][3]; } } if (PersistentSettings.getSingleColorTextures()) { float[] avgColorFlat = {0, 0, 0}; if (avgColorLinear[3] > 0.001) { avgColorFlat[0] = avgColorLinear[0] / avgColorLinear[3]; avgColorFlat[1] = avgColorLinear[1] / avgColorLinear[3]; avgColorFlat[2] = avgColorLinear[2] / avgColorLinear[3]; } for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int index = width * y + x; linear[index][0] = avgColorFlat[0]; linear[index][1] = avgColorFlat[1]; linear[index][2] = avgColorFlat[2]; linear[index][3] = 1; } } } avgColorLinear[0] /= width * height; avgColorLinear[1] /= width * height; avgColorLinear[2] /= width * height; avgColorLinear[3] /= width * height; avgColor = ColorUtil.getArgb(FastMath.pow(avgColorLinear[0], 1 / Scene.DEFAULT_GAMMA), FastMath.pow(avgColorLinear[1], 1 / Scene.DEFAULT_GAMMA), FastMath.pow(avgColorLinear[2], 1 / Scene.DEFAULT_GAMMA), avgColorLinear[3]); } /** * Get linear color values. */ public void getColor(double u, double v, Vector4 c) { c.set(getColor(u, v)); } /** * Get linear color values. * * @param ray ray to store color value in. */ public void getColor(Ray ray) { getColor(ray.u, ray.v, ray.color); } /** * Get linear color values. * * @return color */ public float[] getColor(double u, double v) { return getColor((int) (u * width - Ray.EPSILON), (int) ((1 - v) * height - Ray.EPSILON)); } /** * Get linear color values * * @return color */ public final float[] getColor(int x, int y) { return linear[width * y + x]; } /** * Get bilinear interpolated color value. */ public void getColorInterpolated(double u, double v, Vector4 c) { double x = u * (width - 1); double y = (1 - v) * (height - 1); double weight; int fx = (int) QuickMath.floor(x); int cx = (int) QuickMath.ceil(x); int fy = (int) QuickMath.floor(y); int cy = (int) QuickMath.ceil(y); float[] rgb = getColor(fx, fy); weight = (1 - (y - fy)) * (1 - (x - fx)); c.x = weight * rgb[0]; c.y = weight * rgb[1]; c.z = weight * rgb[2]; rgb = getColor(cx, fy); weight = (1 - (y - fy)) * (1 - (cx - x)); c.x += weight * rgb[0]; c.y += weight * rgb[1]; c.z += weight * rgb[2]; rgb = getColor(fx, cy); weight = (1 - (cy - y)) * (1 - (x - fx)); c.x += weight * rgb[0]; c.y += weight * rgb[1]; c.z += weight * rgb[2]; rgb = getColor(cx, cy); weight = (1 - (cy - y)) * (1 - (cx - x)); c.x += weight * rgb[0]; c.y += weight * rgb[1]; c.z += weight * rgb[2]; } public int getColorWrapped(int u, int v) { return image.getPixel((u + width) % width, (v + height) % height); } /** * @return The average color of this texture */ public int getAvgColor() { return avgColor; } /** * Get the average linear color of this texture */ public void getAvgColorLinear(Vector4 c) { c.set(avgColorLinear); } /** * @return The average color of this texture */ public float[] getAvgColorLinear() { return avgColorLinear; } public int getWidth() { return width; } public int getHeight() { return height; } /** * @return {@code true} if this is the dedicated empty texture */ public boolean isEmptyTexture() { return false; } public Image fxImage() { if (fxImage == null) { fxImage = ImageTools.toFxImage(image); } return fxImage; } /** Access the raw image data for this texture. */ public int[] getData() { return image.data; } public BitmapImage getBitmap() { return image; } }