diff --git a/client/src/main/java/core/engine/renderer/MasterRenderer.java b/client/src/main/java/core/engine/renderer/MasterRenderer.java index 849271e..4c97dc1 100644 --- a/client/src/main/java/core/engine/renderer/MasterRenderer.java +++ b/client/src/main/java/core/engine/renderer/MasterRenderer.java @@ -8,6 +8,7 @@ import core.engine.model.TexturedModel; import core.engine.shader.StaticShader; import core.engine.shader.TerrainShader; import core.engine.terrain.Terrain; +import core.engine.terrain.TerrainTile; import org.lwjgl.opengl.GL11; import utils.vectors.Matrix4f; @@ -27,7 +28,7 @@ public class MasterRenderer { private EntityRenderer renderer; private TerrainRenderer terrainRenderer; private Map> entities = new HashMap<>(); - private List terrains = new ArrayList<>(); + private List terrains = new ArrayList<>(); private Matrix4f projectionMatrix; public MasterRenderer() { @@ -62,7 +63,7 @@ public class MasterRenderer { } public void processTerrain(Terrain terrain) { - terrains.add(terrain); + terrains.addAll(terrain.getTerrainTiles()); } public void processEntity(Entity entity) { diff --git a/client/src/main/java/core/engine/renderer/TerrainRenderer.java b/client/src/main/java/core/engine/renderer/TerrainRenderer.java index 688bf0d..02debc6 100644 --- a/client/src/main/java/core/engine/renderer/TerrainRenderer.java +++ b/client/src/main/java/core/engine/renderer/TerrainRenderer.java @@ -5,6 +5,7 @@ import core.engine.model.RawModel; import core.engine.model.TexturedModel; import core.engine.shader.TerrainShader; import core.engine.terrain.Terrain; +import core.engine.terrain.TerrainTile; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL20; @@ -26,8 +27,8 @@ public class TerrainRenderer { shader.stop(); } - public void render(List terrains) { - for(Terrain terrain : terrains) { + public void render(List terrains) { + for(TerrainTile terrain : terrains) { prepareTerrain(terrain); loadModelMatrix(terrain); GL11.glDrawElements(GL11.GL_TRIANGLES, terrain.getModel().getVertexCount(), GL11.GL_UNSIGNED_INT, 0); @@ -35,7 +36,7 @@ public class TerrainRenderer { } } - private void prepareTerrain(Terrain model) { + private void prepareTerrain(TerrainTile model) { RawModel rawModel = model.getModel(); GL30.glBindVertexArray(rawModel.getVaoID()); GL20.glEnableVertexAttribArray(0); @@ -52,7 +53,7 @@ public class TerrainRenderer { GL30.glBindVertexArray(0); } - private void loadModelMatrix(Terrain terrain) { + private void loadModelMatrix(TerrainTile terrain) { Matrix4f transformationMatrix = MatrixGraphicUtils.createTransformationMatrix(new Vector3f(terrain.getX(), 0, terrain.getZ()), 0,0,0,1); shader.loadTransformationMatrix(transformationMatrix); } diff --git a/client/src/main/java/core/engine/terrain/Terrain.java b/client/src/main/java/core/engine/terrain/Terrain.java index 54dbd29..7c59079 100644 --- a/client/src/main/java/core/engine/terrain/Terrain.java +++ b/client/src/main/java/core/engine/terrain/Terrain.java @@ -4,60 +4,30 @@ import core.engine.Loader; import core.engine.model.RawModel; import core.engine.textures.ModelTexture; +import java.util.ArrayList; +import java.util.List; + public class Terrain { - private static final float WIDTH = 100; - private static final float DEPTH = 100; + private static final float SIZE = 100; + private static final int VERTEX_COUNT = 128; private float x; private float z; - private RawModel model; - private ModelTexture texture; + + private List terrainTiles = new ArrayList<>(); public Terrain(int gridX, int gridZ, Loader loader, ModelTexture modelTexture) { - this.texture = modelTexture; - this.x = gridX * WIDTH; - this.z = gridZ * DEPTH; - this.model = generateTerrain(loader); - } + this.x = gridX * SIZE; + this.z = gridZ * SIZE; - private RawModel generateTerrain(Loader loader){ - int count = VERTEX_COUNT * VERTEX_COUNT; - float[] vertices = new float[count * 3]; - float[] normals = new float[count * 3]; - float[] textureCoords = new float[count*2]; - int[] indices = new int[6*(VERTEX_COUNT-1)*(VERTEX_COUNT-1)]; - int vertexPointer = 0; - for(int i=0;i getTerrainTiles() { + return terrainTiles; } - public ModelTexture getTexture() { - return texture; + public void setTerrainTiles(List terrainTiles) { + this.terrainTiles = terrainTiles; } } diff --git a/client/src/main/java/core/engine/terrain/TerrainGenerator.java b/client/src/main/java/core/engine/terrain/TerrainGenerator.java new file mode 100644 index 0000000..b76763a --- /dev/null +++ b/client/src/main/java/core/engine/terrain/TerrainGenerator.java @@ -0,0 +1,5 @@ +package core.engine.terrain; + +public class TerrainGenerator { + +} diff --git a/client/src/main/java/core/engine/terrain/TerrainTile.java b/client/src/main/java/core/engine/terrain/TerrainTile.java new file mode 100644 index 0000000..2f10c6a --- /dev/null +++ b/client/src/main/java/core/engine/terrain/TerrainTile.java @@ -0,0 +1,102 @@ +package core.engine.terrain; + +import core.engine.Loader; +import core.engine.model.RawModel; +import core.engine.textures.ModelTexture; + +public class TerrainTile { + + private RawModel model; + private ModelTexture texture; + + private float x; + private float z; + + public TerrainTile(Loader loader, ModelTexture texture, int row, int column, int VERTEX_COUNT, float size) { + float[] vertices = new float[12]; // 4 vertices * 3 coordinates + float[] normals = new float[12]; // 4 normals * 3 coordinates + float[] textureCoords = new float[8]; // 4 texture coords * 2 coordinates + int[] indices = new int[6]; // 2 triangles * 3 indices + + //Calculate positions for the four vertices of this terrain tile + float x0 = (float) column / (VERTEX_COUNT - 1) * size; + float x1 = (float) (column + 1) / (VERTEX_COUNT - 1) * size; + float z0 = (float) row / (VERTEX_COUNT - 1) * size; + float z1 = (float) (row + 1) / (VERTEX_COUNT - 1) * size; + + // Populate vertices, normals, and textureCoords arrays based on the calculated positions + //Vertices + // Vertex 0 + vertices[0] = x0; + vertices[1] = 0; + vertices[2] = z0; + + // Vertex 1 + vertices[3] = x0; + vertices[4] = 0; + vertices[5] = z1; + + // Vertex 2 + vertices[6] = x1; + vertices[7] = 0; + vertices[8] = z0; + + // Vertex 3 + vertices[9] = x1; + vertices[10] = 0; + vertices[11] = z1; + + //Normals + for(int i=0; i