package robombs.game.util; import robombs.game.Globals; import com.threed.jpct.*; public class TextureUtils { private static Texture alienBluePrint = null; private static int[] pixelsBluePrint = null; static { try { SimpleStream ss = new SimpleStream("data/disco.jpg"); alienBluePrint = new Texture(ss.getStream()); ss.close(); ITextureEffect it = new Opaquerizer(); alienBluePrint.setEffect(it); alienBluePrint.applyEffect(); alienBluePrint.removeEffect(); PixelGrabber grabber = new PixelGrabber(); alienBluePrint.setEffect(grabber); alienBluePrint.applyEffect(); alienBluePrint.removeEffect(); pixelsBluePrint = grabber.getPixels(); } catch (Exception e) { throw new RuntimeException("Unable to load alien skin!", e); } } public static Texture initOpaqueTexture(String name, String file) throws Exception { Texture t = initTexture(name, file, true); ITextureEffect it = new Opaquerizer(); t.setEffect(it); t.applyEffect(); t.removeEffect(); return t; } public static Texture initTexture(String name, String file, boolean opaque) throws Exception { SimpleStream ss = new SimpleStream(file); Texture t = null; t = new Texture(ss.getStream()); TextureManager.getInstance().addTexture(name, t); if (opaque) { t.removeAlpha(); } ss.close(); return t; } public static Texture initAlphaTexture(String name, String file) throws Exception { SimpleStream ss = new SimpleStream(file); Texture t = null; t = new Texture(ss.getStream(), true); TextureManager.getInstance().addTexture(name, t); ss.close(); return t; } public static Texture colorizeAlienSkin(float redFac, float greenFac, float blueFac) { Texture newy = new Texture(alienBluePrint.getWidth(), alienBluePrint.getHeight()); PixelGrabber grabber = new PixelGrabber(); int[] res = new int[newy.getArraySize()]; for (int x = 0; x < newy.getWidth(); x++) { for (int y = 0; y < newy.getHeight(); y++) { int pos = y * newy.getWidth() + x; if (x < 3 || x > 62 || y < 62 || y > 86) { // Spare the eyes! int col = pixelsBluePrint[pos] & 0x00ffffff; int r = col >> 16; int g = (col >> 8) & 0xff; int b = col & 0xff; int dif = Math.abs(r - g) + Math.abs(g - b); if (dif <= 30) { r *= redFac; g *= greenFac; b *= blueFac; } if (r > 255) { r = 255; } if (g > 255) { g = 255; } if (b > 255) { b = 255; } res[pos] = (r << 16) | (g << 8) | b; } else { res[pos] = pixelsBluePrint[pos]; } } } newy.setEffect(grabber); grabber.setNewPixels(res); newy.applyEffect(); newy.removeEffect(); return newy; } public static void loadGameTextures() throws Exception { long s = Ticker.getTime(); // Load in two threads to utilize multicore-cpus for a faster startup. Thread loader = new Thread() { public void run() { try { initOpaqueTexture("warehouse_top", "data/sets/warehouse/top.jpg"); initOpaqueTexture("warehouse_border", "data/sets/warehouse/border.jpg"); initTexture("warehouse_wall", "data/sets/warehouse/wall.jpg", true); initTexture("warehouse_wall_dark", "data/sets/warehouse/wall_dark.jpg", true); initTexture("warehouse_floor", "data/sets/warehouse/floor.jpg", true); initTexture("warehouse_floor2", "data/sets/warehouse/floor2.jpg", true); initTexture("warehouse_floor3", "data/sets/warehouse/floor3.jpg", true); initTexture("warehouse_floor4", "data/sets/warehouse/floor4.jpg", true); initOpaqueTexture("japan_top", "data/sets/japan/top.jpg"); initOpaqueTexture("japan_border", "data/sets/japan/border.jpg"); initTexture("japan_wall", "data/sets/japan/wall.jpg", true); initTexture("japan_wall_dark", "data/sets/japan/wall_dark.jpg", true); initTexture("japan_floor", "data/sets/japan/floor.jpg", true); initTexture("japan_floor2", "data/sets/japan/floor2.jpg", true); initTexture("japan_floor3", "data/sets/japan/floor3.jpg", true); initTexture("japan_floor4", "data/sets/japan/floor4.jpg", true); initOpaqueTexture("forest_top", "data/sets/forest/top.jpg"); initOpaqueTexture("forest_border", "data/sets/forest/border.jpg"); initTexture("forest_wall", "data/sets/forest/wall.jpg", true); initTexture("forest_wall_dark", "data/sets/forest/wall_dark.jpg", true); initTexture("forest_floor", "data/sets/forest/floor.jpg", true); initTexture("forest_floor2", "data/sets/forest/floor2.jpg", true); initTexture("forest_floor3", "data/sets/forest/floor3.jpg", true); initTexture("forest_floor4", "data/sets/forest/floor4.jpg", true); initOpaqueTexture("medival_top", "data/sets/medival/top.jpg"); initOpaqueTexture("medival_border", "data/sets/medival/border.jpg"); initTexture("medival_wall", "data/sets/medival/wall.jpg", true); initTexture("medival_wall_dark", "data/sets/medival/wall_dark.jpg", true); initTexture("medival_floor", "data/sets/medival/floor.jpg", true); initTexture("medival_floor2", "data/sets/medival/floor2.jpg", true); initTexture("medival_floor3", "data/sets/medival/floor3.jpg", true); initTexture("medival_floor4", "data/sets/medival/floor4.jpg", true); initOpaqueTexture("space_top", "data/sets/space/top.jpg"); initOpaqueTexture("space_border", "data/sets/space/border.jpg"); initTexture("space_wall", "data/sets/space/wall.jpg", true); initTexture("space_wall_dark", "data/sets/space/wall_dark.jpg", true); initTexture("space_floor", "data/sets/space/floor.jpg", true); initTexture("space_floor2", "data/sets/space/floor2.jpg", true); initTexture("space_floor3", "data/sets/space/floor3.jpg", true); initTexture("space_floor4", "data/sets/space/floor4.jpg", true); initTexture("highback", "data/highback.png", false); } catch (Exception e) { throw new RuntimeException(e); } } }; loader.start(); initOpaqueTexture("classic_top", "data/sets/classic/top.jpg"); initOpaqueTexture("classic_border", "data/sets/classic/border.jpg"); initTexture("classic_wall", "data/sets/classic/wall.jpg", true); initTexture("classic_wall_dark", "data/sets/classic/wall_dark.jpg", true); initTexture("classic_floor", "data/sets/classic/floor.jpg", true); initTexture("classic_floor2", "data/sets/classic/floor2.jpg", true); initTexture("classic_floor3", "data/sets/classic/floor3.jpg", true); initTexture("classic_floor4", "data/sets/classic/floor4.jpg", true); initOpaqueTexture("southern_top", "data/sets/southern/top.jpg"); initOpaqueTexture("southern_border", "data/sets/southern/border.jpg"); initTexture("southern_wall", "data/sets/southern/wall.jpg", true); initTexture("southern_wall_dark", "data/sets/southern/wall_dark.jpg", true); initTexture("southern_floor", "data/sets/southern/floor.jpg", true); initTexture("southern_floor2", "data/sets/southern/floor2.jpg", true); initTexture("southern_floor3", "data/sets/southern/floor3.jpg", true); initTexture("southern_floor4", "data/sets/southern/floor4.jpg", true); initOpaqueTexture("comic_top", "data/sets/comic/top.jpg"); initOpaqueTexture("comic_border", "data/sets/comic/border.jpg"); initTexture("comic_wall", "data/sets/comic/wall.jpg", true); initTexture("comic_wall_dark", "data/sets/comic/wall_dark.jpg", true); initTexture("comic_floor", "data/sets/comic/floor.jpg", true); initTexture("comic_floor2", "data/sets/comic/floor2.jpg", true); initTexture("comic_floor3", "data/sets/comic/floor3.jpg", true); initTexture("comic_floor4", "data/sets/comic/floor4.jpg", true); initTexture("bomb1", "data/bomb.jpg", true); //initTexture("boom", "data/boom.png", false); initTexture("crate", "data/crate.jpg", true); initAlphaTexture("blood", "data/blood.png"); initTexture("explosion", "data/explosion.png", false); initTexture("particle", "data/particle.jpg", false); initTexture("star", "data/star.png", false); initTexture("slime", "data/slime.png", false); initTexture("glow", "data/glow.jpg", false); initTexture("spark", "data/spark.gif", false); initTexture("crosshair", "data/crosshair.gif", false); initTexture("decal", "data/decal.gif", false); if (!Globals.compiledObjects) { initTexture("item", "data/itemenv.jpg", true); } else { initTexture("item", "data/itemenv_rev.jpg", true); } initTexture("icons", "data/icons.png", false); TextureManager.getInstance().getTexture("icons").enableGLClamping(); initTexture("smoke", "data/smoke2.jpg", true); initTexture("shield", "data/shield.png", true); initTexture("black", "data/justblack.png", true); initTexture("bar", "data/bar.png", true); initTexture("barbox", "data/box.png", false); initTexture("drop2", "data/drop2.png", false); initAlphaTexture("drop", "data/drop.png"); initAlphaTexture("debris", "data/debris.png"); initAlphaTexture("textbanner", "data/banner.png"); initAlphaTexture("textbannerLost", "data/banner_dead.png"); initTexture("credits", "data/credits.png", true); initTexture("crazy", "data/crazy.png", true); // Normalmaps initTexture("cratenormals", "data/crate_normals.png", true); initTexture("bombnormals", "data/bomb_normals.png", true); if (Globals.skyBox) { initTexture("left", "data/skybox/left.png", true); initTexture("right", "data/skybox/right.png", true); initTexture("up", "data/skybox/up.png", true); initTexture("down", "data/skybox/down.png", true); initTexture("front", "data/skybox/front.png", true); initTexture("back", "data/skybox/back.png", true); } loader.join(); System.out.println("Textures loaded in " + (Ticker.getTime() - s) + "ms!"); } private static class PixelGrabber implements ITextureEffect { private int[] pixels = null; private int[] toSet = null; public void setNewPixels(int[] pixels) { toSet = pixels; } public void init(Texture t) { } public void apply(int[] dest, int[] src) { if (toSet == null) { pixels = new int[src.length]; System.arraycopy(src, 0, pixels, 0, src.length); } else { System.arraycopy(toSet, 0, dest, 0, dest.length); } } public boolean containsAlpha() { return false; } public int[] getPixels() { return pixels; } } }