Saturday, March 4, 2017

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

Leave a Comment

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));         }     } 

1 Answers

Answers 1

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.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment