ShoeLace1291
ShoeLace1291

Reputation: 4698

How do I apply different textures to multiple polygons in LWJGL?

I am drawing a grid of hexagon tiles. I have six different images that I want to use as the fill for these tiles. I use my hexagon class to loop through each point in the tile. The textures are stored in an array list which is then shuffled into a random order. The problem with my script right now is that the same texture is applied to each tile. What am I doing wrong?

public class LWJGLHelloWorld {

    public static int SCREEN_WIDTH;
    public static int SCREEN_HEIGHT;
    public static int WINDOW_WIDTH;
    public static int WINDOW_HEIGHT;
    public double WIDTH;
    public double HEIGHT;
    public ArrayList<Hexagon> hexagons = new ArrayList<Hexagon>();
    public ArrayList<String> resources = new ArrayList<String>();
    public Texture brick;
    public Texture stone;
    public Texture lumber;
    public Texture wool;
    public Texture wheat;
    public Texture wasteland;

    private static enum State {
        INTRO, MAIN_MENU, GAME;
    }

    private State state = State.INTRO;

    public LWJGLHelloWorld(){

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        double SCREEN_WIDTH = screenSize.getWidth();
        double SCREEN_HEIGHT = screenSize.getHeight();
        double WIDTH = SCREEN_WIDTH * .85;
        double HEIGHT = SCREEN_HEIGHT * .85;

        try {
            Display.setDisplayMode(new DisplayMode((int)WIDTH, (int)HEIGHT));
            Display.setTitle("Hello, LWJGL!");;
            Display.create();
        } catch (LWJGLException e){
            e.printStackTrace();
        }
        resetResources();


        brick = loadTexture("brick");
        stone = loadTexture("stone");
        lumber = loadTexture("lumber");
        //Texture wheat = loadTexture("wheat");
        wool = loadTexture("wool");
        wasteland = loadTexture("wasteland");

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        glEnable(GL_TEXTURE_2D);

        int originX = (int)(Display.getDisplayMode().getWidth() / 2);
        int originY = (int)(Display.getDisplayMode().getHeight() / 2);
        int radius = (int)(HEIGHT * .1);
        int padding = (int)(HEIGHT * .005);

        findHexCoords(originX, originY, 5, radius, padding);

        while(!Display.isCloseRequested()){
            glClear(GL_COLOR_BUFFER_BIT);
            for(int h = 0; h < hexagons.size(); h++){
                String rsrc = resources.get(h);
                bindTexture(rsrc);
                glBegin(GL_POLYGON);
                Hexagon hex = hexagons.get(h);
                for(int p = 0; p < hex.points.length; p++){
                    Point point = hex.points[p];
                    glTexCoord2f(point.x, point.y);
                    glVertex2f(point.x, point.y);
                }
                glEnd();
            }

            Display.update();
            Display.sync(60);
        }

        Display.destroy();
    }

    private void bindTexture(String rsrc){
        switch(rsrc){
        case "brick":
            brick.bind();
            break;
        case "stone":
            stone.bind();
            break;
        case "lumber":
            lumber.bind();
            break;
        case "wheat":
            //wheat.bind();
            break;
        case "wool":
            wool.bind();
            break;
        case "wasteland":
            wasteland.bind();
            break;  
        }
    }

    private void findHexCoords(int x, int y, int size, int radius, int padding) {

        Point origin = new Point(x, y);
        double ang30 = Math.toRadians(30);
        double xOff = Math.cos(ang30) * (radius + padding);
        double yOff = Math.sin(ang30) * (radius + padding);
        int half = size / 2;

        int i = 0;
        for (int row = 0; row < size; row++) {

            int cols = size - Math.abs(row - half);

            for (int col = 0; col < cols; col++) {

                int xLbl = row < half ? col - row : col - half;
                int yLbl = row - half;
                int centerX = (int) (origin.x + xOff * (col * 2 + 1 - cols));
                int centerY = (int) (origin.y + yOff * (row - half) * 3);

                Hexagon hex = new Hexagon(centerX, centerY, radius);
                System.out.println(centerX+","+centerY);
                hexagons.add(hex);
                i++;
            }
        }
    }               

    private Texture loadTexture(String key){
        try {
            return TextureLoader.getTexture("PNG", new FileInputStream(new File("img/" + key + ".png")));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) {
        new LWJGLHelloWorld();

    }

    public void resetResources(){
        resources.clear();
        resources.add("Brick");
        resources.add("Brick");
        resources.add("Brick");
        resources.add("Wool");
        resources.add("Wool");
        resources.add("Wool");
        resources.add("Wool");
        resources.add("Lumber");
        resources.add("Lumber");
        resources.add("Lumber");
        resources.add("Lumber");
        resources.add("Stone");
        resources.add("Stone");
        resources.add("Stone");
        resources.add("Wheat");
        resources.add("Wheat");
        resources.add("Wheat");
        resources.add("Wheat");
        long seed = System.nanoTime();
        Collections.shuffle(resources, new Random(seed));
        int randomIndex = ThreadLocalRandom.current().nextInt(0, 19);
        resources.add(randomIndex, "Wasteland");
        for(int r = 0; r < resources.size(); r++){
            System.out.println(resources.get(r));
        }
    }

Upvotes: 1

Views: 181

Answers (1)

Loris Securo
Loris Securo

Reputation: 7638

The first letter of the strings that you are adding in resources is uppercase (e.g. Brick).

In the bindTexture switch you are searching strings from resources that have a lowercase first letter (e.g. brick). Therefore the switch should always fail and not able to bind the correct texture.

Either fix the switch or the resources array accordingly.

Upvotes: 2

Related Questions