rtype.JNLPTextureLoader.java Source code

Java tutorial

Introduction

Here is the source code for rtype.JNLPTextureLoader.java

Source

/*
 *
 * Created: Jan  7 2008
 *
 * Copyright (C) 1999-2000 Fabien Sanglard
 * 
 * This program 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 2
 * of the License, or (at your option) any later version.
 * 
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

package rtype;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.util.Hashtable;

import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;

//import org.lwjgl.devil.IL;
import org.lwjgl.opengl.GL11;

import rtype.entity.IEntity;

public class JNLPTextureLoader implements ITextureLoader {
    private static Texture[] textures = new Texture[1024];
    private static Texture[][] animations = new Texture[1024][1024];

    public JNLPTextureLoader() {
    }

    /* (non-Javadoc)
     * @see rtype.ITextureLoader#init()
     */
    public void init() {
        textures[IEntity.PLANET] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 490, 473, 512, 512);

        textures[IEntity.SPACE_TRASH_1] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 256, 438, 256,
                256); // Big huge spaceship with 5 reactors
        textures[IEntity.SPACE_TRASH_2] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 257, 700, 256,
                256);
        textures[IEntity.SPACE_TRASH_3] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 373, 956, 64, 64); // Round trash
        textures[IEntity.SPACE_TRASH_4] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 492, 102, 256,
                128); // Sattelite trash
        textures[IEntity.STAR_1] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 612, 1011, 8, 8);
        textures[IEntity.STAR_2] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 649, 990, 16, 32);
        textures[IEntity.STAR_3] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 674, 994, 16, 16);
        textures[IEntity.STAR_4] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 716, 1004, 16, 16);
        textures[IEntity.STAR_5] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 738, 990, 32, 32);
        textures[IEntity.STAR_6] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 780, 994, 16, 16);

        textures[IEntity.BULLET] = loadTexture("src/main/resources/Data/BulletSet1.png", 32, 00, 32, 32);

        textures[IEntity.ORB_BEAM] = loadTexture("src/main/resources/Data/GlowBullets.png", 32, 0, 32, 32);
        textures[IEntity.ENEMY_BULLET] = loadTexture("src/main/resources/Data/BulletSet1.png", 0, 0, 32, 32);
        textures[IEntity.ENEMY_PIECE_1] = loadTexture("src/main/resources/Data/SpaceTrash.png", 00, 00, 32, 32);
        textures[IEntity.ENEMY_PIECE_2] = loadTexture("src/main/resources/Data/SpaceTrash.png", 32, 00, 32, 32);
        textures[IEntity.ENEMY_PIECE_3] = loadTexture("src/main/resources/Data/SpaceTrash.png", 64, 00, 32, 32);
        textures[IEntity.ENEMY_PIECE_4] = loadTexture("src/main/resources/Data/SpaceTrash.png", 96, 00, 32, 32);
        textures[IEntity.ENEMY_PIECE_5] = loadTexture("src/main/resources/Data/SpaceTrash.png", 00, 32, 32, 32);
        textures[IEntity.ENEMY_PIECE_6] = loadTexture("src/main/resources/Data/SpaceTrash.png", 32, 32, 32, 32);
        textures[IEntity.ENEMY_PIECE_7] = loadTexture("src/main/resources/Data/SpaceTrash.png", 64, 32, 32, 32);
        textures[IEntity.ENEMY_PIECE_8] = loadTexture("src/main/resources/Data/SpaceTrash.png", 96, 32, 32, 32);
        textures[IEntity.BULLET_RAPID_FIRE] = loadTexture("src/main/resources/Data/BulletSet1.png", 00, 64, 32, 32);
        textures[IEntity.BULLET_MULTI_SHOOT] = loadTexture("src/main/resources/Data/BulletSet1.png", 0, 32, 32, 32);
        textures[IEntity.BULLET_BASE] = loadTexture("src/main/resources/Data/BulletSet1.png", 32, 32, 32, 32);
        textures[IEntity.SPACE_TRASH_5] = loadTexture("src/main/resources/Data/Stage1Layer1.png", 148, 721, 64, 64); // Extreme left trash

        textures[IEntity.FORCEBLAST] = loadTexture("src/main/resources/Data/forceblast.png", 0, 0, 128, 64);

        //textures[IEntity.SCANLINE] = loadTexture("Data/Scanlines.png",0,0,32,32);

        animations[IEntity.PLAYER_SHIP] = loadAnimation("src/main/resources/Data/PlayerShip.png", 4, 4, 128, 128);
        animations[IEntity.GREEN_ORB] = loadAnimation("src/main/resources/Data/Orb1.png", 8, 2, 64, 64);
        animations[IEntity.BLUE_ORB] = loadAnimation("src/main/resources/Data/Orb1.png", 8, 2, 64, 64, 0, 128);
        animations[IEntity.PINK_ORB] = loadAnimation("src/main/resources/Data/Orb1.png", 8, 2, 64, 64, 0, 256);
        animations[IEntity.RED_ORB] = loadAnimation("src/main/resources/Data/Orb1.png", 8, 2, 64, 64, 0, 384);
        animations[IEntity.FORCE_CHARGE] = loadAnimation("src/main/resources/Data/forcecharge.png", 8, 4, 64, 64);
        animations[IEntity.PLAYER_SPEED] = loadAnimation("src/main/resources/Data/PlayerSpeed.png", 8, 4, 64, 64);
        animations[IEntity.EXPLOSION1] = loadAnimation("src/main/resources/Data/Explosion2.png", 8, 4, 64, 64);
        animations[IEntity.EXPLOSION2] = loadAnimation("src/main/resources/Data/ExplosionSmall.png", 8, 4, 128,
                128);
        animations[IEntity.LADYBIRD] = loadAnimation("src/main/resources/Data/ladybird.png", 4, 4, 64, 64);
        animations[IEntity.FIRE_BALL] = loadAnimation("src/main/resources/Data/FireBall.png", 4, 4, 128, 128);
        animations[IEntity.FONT] = loadAnimation("src/main/resources/Data/Fonts.png", 16, 16, 32, 32);
        animations[IEntity.BULLET_HIT_YELLOW] = loadAnimation("src/main/resources/Data/BulletHit.png", 4, 2, 32,
                32);
        animations[IEntity.BULLET_HIT_GREEN] = loadAnimation("src/main/resources/Data/BulletHit2.png", 4, 2, 32,
                32);
        animations[IEntity.BULLET_HIT_BLUE] = loadAnimation("src/main/resources/Data/BulletHit3.png", 4, 2, 32, 32);
        animations[IEntity.BIT_UPGRADE] = loadAnimation("src/main/resources/Data/BitUpgrade.png", 4, 2, 32, 32);
        animations[IEntity.BONUS_MULTI_SHOOT_ORB] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64,
                64, 00, 00);
        animations[IEntity.BONUS_LIGHTNING_ORB] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64,
                64, 00, 64);
        animations[IEntity.BONUS_RAPID_SHOOT_ORB] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64,
                64, 00, 128);
        animations[IEntity.BONUS_GRAVITY_ORB] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64, 64,
                00, 192);
        animations[IEntity.BONUS_SPEED] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64, 64, 00,
                256);
        animations[IEntity.BONUS_CRYSTAL_ORB] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64, 64,
                00, 320);
        animations[IEntity.BONUS_BOOSTER] = loadAnimation("src/main/resources/Data/PowerUp1.png", 8, 1, 64, 64, 00,
                384);
        animations[IEntity.IMPLOSION] = loadAnimation("src/main/resources/Data/Implosion.png", 8, 4, 64, 64);
        animations[IEntity.MISSILE] = loadAnimation("src/main/resources/Data/HomingMissile.png", 4, 4, 64, 64);
        animations[IEntity.SMOKE] = loadAnimation("src/main/resources/Data/SmokePuff.png", 4, 4, 32, 32);
    }

    /* (non-Javadoc)
     * @see rtype.ITextureLoader#getTexture(int)
     */
    public Texture getTexture(int textureID) {
        return textures[textureID];
    }

    /* (non-Javadoc)
     * @see rtype.ITextureLoader#getAnimation(int)
     */
    public Texture[] getAnimation(int animationID) {
        return animations[animationID];
    }

    Hashtable imageCache = new Hashtable();

    // Offset are in term off pixel, not byte, the image loader figure out alone what is the bytesPerPixel
    private Texture loadTexture(String path, int xOffSet, int yOffSet, int textWidth, int textHeight) {

        BufferedImage buffImage = null;
        try {
            if (imageCache.get(path) != null)
                buffImage = (BufferedImage) imageCache.get(path);
            else {
                System.out.println("Loading image:" + path);
                buffImage = ImageIO.read(new FileImageInputStream(new File(path)));
                imageCache.put(path, buffImage);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        int bytesPerPixel = buffImage.getColorModel().getPixelSize() / 8;

        ByteBuffer scratch = ByteBuffer.allocateDirect(textWidth * textHeight * bytesPerPixel)
                .order(ByteOrder.nativeOrder());
        DataBufferByte data = ((DataBufferByte) buffImage.getRaster().getDataBuffer());

        for (int i = 0; i < textHeight; i++)
            scratch.put(data.getData(), (xOffSet + (yOffSet + i) * buffImage.getWidth()) * bytesPerPixel,
                    textWidth * bytesPerPixel);

        scratch.rewind();

        // Create A IntBuffer For Image Address In Memory
        IntBuffer buf = ByteBuffer.allocateDirect(4).order(ByteOrder.nativeOrder()).asIntBuffer();
        GL11.glGenTextures(buf); // Create Texture In OpenGL

        // Create Nearest Filtered Texture
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, buf.get(0));
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
        GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, textWidth, textHeight, 0, GL11.GL_RGBA,
                GL11.GL_UNSIGNED_BYTE, scratch);

        Texture newTexture = new Texture();
        newTexture.textureId = buf.get(0); // Return Image Addresses In Memory
        newTexture.textureHeight = textHeight;
        newTexture.textureWidth = textWidth;

        return newTexture;
    }

    private Texture[] loadAnimation(String path, int cols, int rows, int textWidth, int textHeight) {
        return loadAnimation(path, cols, rows, textWidth, textHeight, 0, 0);
    }

    private Texture[] loadAnimation(String path, int cols, int rows, int textWidth, int textHeight, int xOffSet,
            int yOffSet) {
        Texture[] toReturntextures = new Texture[cols * rows];

        BufferedImage buffImage = null;
        try {
            if (imageCache.get(path) != null)
                buffImage = (BufferedImage) imageCache.get(path);
            else {
                System.out.println("Loading image:" + path);
                buffImage = ImageIO.read(new FileImageInputStream(new File(path)));
                imageCache.put(path, buffImage);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        int bytesPerPixel = buffImage.getColorModel().getPixelSize() / 8;

        ByteBuffer scratch = ByteBuffer.allocateDirect(textWidth * textHeight * bytesPerPixel)
                .order(ByteOrder.nativeOrder());

        byte[] data = ((DataBufferByte) buffImage.getRaster().getDataBuffer()).getData();

        for (int i = 0; i < rows; i++)
            for (int j = 0; j < cols; j++) {
                toReturntextures[i * cols + j] = loadTexture(path, j * textWidth + xOffSet,
                        i * textHeight + yOffSet, textWidth, textHeight);
                /*
                for (int z = 0 ; z < textHeight ; z ++)
                   scratch.put(data,(xOffSet+(yOffSet+z)*buffImage.getWidth())*bytesPerPixel  + (j * textWidth + i* buffImage.getWidth()) * bytesPerPixel, textWidth*bytesPerPixel);
                    
                scratch.rewind();
                      
                  // Create A IntBuffer For Image Address In Memory
                  IntBuffer buf = ByteBuffer.allocateDirect(12).order(ByteOrder.nativeOrder()).asIntBuffer();
                  GL11.glGenTextures(buf); // Create Texture In OpenGL
                    
                   // Create Nearest Filtered Texture
                  GL11.glBindTexture(GL11.GL_TEXTURE_2D, buf.get(0));
                  GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
                  GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
                  GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0,GL11.GL_RGBA,textWidth,textHeight, 0,GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, scratch);
                    
                  Texture newTexture = new Texture();
                  newTexture.textureId = buf.get(0);     // Return Image Addresses In Memory
                  newTexture.textureHeight = textHeight;
                  newTexture.textureWidth = textWidth;
                      
                  toReturntextures[i*cols+j] = newTexture;
                  toReturntextures[i*cols+j].textureHeight = textHeight;
                  toReturntextures[i*cols+j].textureWidth = textWidth;
                  */
            }

        return toReturntextures;
    }

}