diff --git a/core/src/se/cookery/CookeryClient.java b/core/src/se/cookery/CookeryClient.java index 2416619..bd26bca 100644 --- a/core/src/se/cookery/CookeryClient.java +++ b/core/src/se/cookery/CookeryClient.java @@ -37,7 +37,7 @@ public class CookeryClient extends SimpleApplication { BlockGenerator blockGenerator = new GrassLandBlockGenerator(); World world = new World(blockGenerator); - TerrainManager terrain = new TerrainManager(1, 1, + TerrainManager terrain = new TerrainManager(1, 5, new BlockHeightMap(world), MaterialUtil.createMaterial(assetManager, ColorRGBA.Green)); diff --git a/core/src/se/cookery/gfx/input/MouseClickAction.java b/core/src/se/cookery/gfx/input/MouseClickAction.java index 37c9b45..4c7daee 100644 --- a/core/src/se/cookery/gfx/input/MouseClickAction.java +++ b/core/src/se/cookery/gfx/input/MouseClickAction.java @@ -50,12 +50,18 @@ public class MouseClickAction implements ActionListener { rootNode.collideWith(ray, results); if (results.size() > 0) { - // The closest result is the target that the player picked: - Geometry target = results.getClosestCollision().getGeometry(); - System.out.println("Click registered: Geometry: " + target.getName()); + // The closest result is the target that the player picked + CollisionResult collision = results.getClosestCollision(); + System.out.println("Click registered: Geometry: " + collision.getGeometry().getName()); - if (target.getMesh() instanceof TerrainMesh) { - System.out.println("Terrain"); + if (collision.getGeometry().getMesh() instanceof TerrainMesh) { + TerrainMesh terrainMesh = (TerrainMesh) collision.getGeometry().getMesh(); + Vector3f vect = collision.getContactPoint().subtract(collision.getGeometry().getLocalTranslation()); + System.out.println("Terrain: " + + terrainMesh.getSquareIndexX(vect) + + "x" + + terrainMesh.getSquareIndexZ(vect) + ); } } } diff --git a/core/src/se/cookery/gfx/terrain/TerrainManager.java b/core/src/se/cookery/gfx/terrain/TerrainManager.java index b9ff75a..02b8982 100644 --- a/core/src/se/cookery/gfx/terrain/TerrainManager.java +++ b/core/src/se/cookery/gfx/terrain/TerrainManager.java @@ -22,8 +22,8 @@ public class TerrainManager { /** * Create a new instance of TerrainManager * - * @param squareLength is the width of a single square - * @param squareCount is the height of a single square + * @param squareLength is the size of a single square + * @param squareCount is the number of squares on each side in each block * @param heightMap is the height map for the terrain */ public TerrainManager(float squareLength, int squareCount, TerrainHeightMap heightMap, Material material) { @@ -34,7 +34,7 @@ public class TerrainManager { for (int x=0; x squareLengthX * squareCountX) + return -1; + + return (int)(pos.x / squareLengthX); } - public float getSquareLengthZ() { - return squareLengthZ; + public int getSquareIndexZ(Vector3f pos) { + if (pos.z < 0 || pos.z > squareLengthZ * squareCountZ) + return -1; + + return (int)(pos.z / squareLengthZ); } } \ No newline at end of file diff --git a/core/test/se/cookery/gfx/terrain/TerrainMeshTest.java b/core/test/se/cookery/gfx/terrain/TerrainMeshTest.java index 58d72fa..eec37c1 100644 --- a/core/test/se/cookery/gfx/terrain/TerrainMeshTest.java +++ b/core/test/se/cookery/gfx/terrain/TerrainMeshTest.java @@ -1,5 +1,6 @@ package se.cookery.gfx.terrain; +import com.jme3.math.Vector3f; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -8,7 +9,7 @@ class TerrainMeshTest { @Test public void singleSquareTerrain(){ - TerrainMesh terrain = new TerrainMesh(1, 1, 1 ,1); + TerrainMesh terrain = new TerrainMesh(1, 1); float[] vertexBuffer = terrain.generateVertexBuffer(); assertEquals(3 * 4, vertexBuffer.length); @@ -29,7 +30,7 @@ class TerrainMeshTest { @Test public void fourSquareTerrain(){ - TerrainMesh terrain = new TerrainMesh(1, 1, 2 ,2); + TerrainMesh terrain = new TerrainMesh(1, 2); float[] vertexBuffer = terrain.generateVertexBuffer(); assertEquals(3 * 9, vertexBuffer.length); @@ -58,4 +59,26 @@ class TerrainMeshTest { 5, 7, 8, }, indexBuffer); } + + @Test + void getSquareIndexX() { + TerrainMesh terrain = new TerrainMesh(1, 10); + + assertEquals(terrain.getSquareIndexX(new Vector3f(-5.4f, 0f, 0f)), -1); + assertEquals(terrain.getSquareIndexX(new Vector3f(20.3f, 0f, 0f)), -1); + assertEquals(terrain.getSquareIndexX(new Vector3f(0f, 0f, 0f)), 0); + assertEquals(terrain.getSquareIndexX(new Vector3f(2.5f, 0f, 0f)), 2); + assertEquals(terrain.getSquareIndexX(new Vector3f(9.9f, 0f, 0f)), 9); + } + + @Test + void getSquareIndexZ() { + TerrainMesh terrain = new TerrainMesh(1, 10); + + assertEquals(terrain.getSquareIndexZ(new Vector3f(0f, 0f, -5.4f)), -1); + assertEquals(terrain.getSquareIndexZ(new Vector3f(0f, 0f, 20.3f)), -1); + assertEquals(terrain.getSquareIndexZ(new Vector3f(0f, 0f, 0f)), 0); + assertEquals(terrain.getSquareIndexZ(new Vector3f(0f, 0f, 2.5f)), 2); + assertEquals(terrain.getSquareIndexZ(new Vector3f(0f, 0f, 9.9f)), 9); + } } \ No newline at end of file