Added terrain square ID selection (only local index currently)

This commit is contained in:
Ziver Koc 2020-11-04 01:30:16 +01:00
parent 9518118651
commit 3bfd93af86
5 changed files with 63 additions and 16 deletions

View file

@ -37,7 +37,7 @@ public class CookeryClient extends SimpleApplication {
BlockGenerator blockGenerator = new GrassLandBlockGenerator(); BlockGenerator blockGenerator = new GrassLandBlockGenerator();
World world = new World(blockGenerator); World world = new World(blockGenerator);
TerrainManager terrain = new TerrainManager(1, 1, TerrainManager terrain = new TerrainManager(1, 5,
new BlockHeightMap(world), new BlockHeightMap(world),
MaterialUtil.createMaterial(assetManager, ColorRGBA.Green)); MaterialUtil.createMaterial(assetManager, ColorRGBA.Green));

View file

@ -50,12 +50,18 @@ public class MouseClickAction implements ActionListener {
rootNode.collideWith(ray, results); rootNode.collideWith(ray, results);
if (results.size() > 0) { if (results.size() > 0) {
// The closest result is the target that the player picked: // The closest result is the target that the player picked
Geometry target = results.getClosestCollision().getGeometry(); CollisionResult collision = results.getClosestCollision();
System.out.println("Click registered: Geometry: " + target.getName()); System.out.println("Click registered: Geometry: " + collision.getGeometry().getName());
if (target.getMesh() instanceof TerrainMesh) { if (collision.getGeometry().getMesh() instanceof TerrainMesh) {
System.out.println("Terrain"); 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)
);
} }
} }
} }

View file

@ -22,8 +22,8 @@ public class TerrainManager {
/** /**
* Create a new instance of TerrainManager * Create a new instance of TerrainManager
* *
* @param squareLength is the width of a single square * @param squareLength is the size of a single square
* @param squareCount is the height 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 * @param heightMap is the height map for the terrain
*/ */
public TerrainManager(float squareLength, int squareCount, TerrainHeightMap heightMap, Material material) { public TerrainManager(float squareLength, int squareCount, TerrainHeightMap heightMap, Material material) {
@ -34,7 +34,7 @@ public class TerrainManager {
for (int x=0; x<BUFFER_SIZE; x++) { for (int x=0; x<BUFFER_SIZE; x++) {
for (int z=0; z<BUFFER_SIZE; z++) { for (int z=0; z<BUFFER_SIZE; z++) {
TerrainMesh terrainMesh = new TerrainMesh(squareLength, squareLength, squareCount, squareCount); TerrainMesh terrainMesh = new TerrainMesh(squareLength, squareCount);
terrainBuffer[x][z] = new Geometry("TerrainMesh " + x + "x" + z, terrainMesh); terrainBuffer[x][z] = new Geometry("TerrainMesh " + x + "x" + z, terrainMesh);
terrainBuffer[x][z].setMaterial(material); terrainBuffer[x][z].setMaterial(material);
terrainBuffer[x][z].setLocalTranslation(terrainMesh.getMeshLengthX() * x, 0, terrainMesh.getMeshLengthZ() * z); terrainBuffer[x][z].setLocalTranslation(terrainMesh.getMeshLengthX() * x, 0, terrainMesh.getMeshLengthZ() * z);
@ -71,7 +71,7 @@ public class TerrainManager {
} }
/** /**
* @return a vector to the closest terrain mesh coordinate. * @return a vector to the closest terrain mesh coordinate from the given coordinate.
*/ */
private Vector3f getTerrainVector(Vector3f position) { private Vector3f getTerrainVector(Vector3f position) {
return new Vector3f( return new Vector3f(

View file

@ -1,5 +1,6 @@
package se.cookery.gfx.terrain; package se.cookery.gfx.terrain;
import com.jme3.math.Vector3f;
import com.jme3.scene.Mesh; import com.jme3.scene.Mesh;
import com.jme3.scene.VertexBuffer; import com.jme3.scene.VertexBuffer;
@ -15,6 +16,16 @@ public class TerrainMesh extends Mesh {
private int squareCountZ; private int squareCountZ;
/**
* Created a symmetrically sized terrain Mesh.
*
* @param squareLength is the width and height of a single square
* @param squareCount the number of squares that make up the whole terrain on the X and Z axis
*/
public TerrainMesh(float squareLength, int squareCount){
this(squareLength, squareLength, squareCount, squareCount);
}
/** /**
* Created a terrain Mesh with the given sizes. * Created a terrain Mesh with the given sizes.
* *
@ -125,11 +136,18 @@ public class TerrainMesh extends Mesh {
return squareLengthZ * squareCountZ; return squareLengthZ * squareCountZ;
} }
public float getSquareLengthX() {
return squareLengthX; public int getSquareIndexX(Vector3f pos) {
if (pos.x < 0 || pos.x > squareLengthX * squareCountX)
return -1;
return (int)(pos.x / squareLengthX);
} }
public float getSquareLengthZ() { public int getSquareIndexZ(Vector3f pos) {
return squareLengthZ; if (pos.z < 0 || pos.z > squareLengthZ * squareCountZ)
return -1;
return (int)(pos.z / squareLengthZ);
} }
} }

View file

@ -1,5 +1,6 @@
package se.cookery.gfx.terrain; package se.cookery.gfx.terrain;
import com.jme3.math.Vector3f;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@ -8,7 +9,7 @@ class TerrainMeshTest {
@Test @Test
public void singleSquareTerrain(){ public void singleSquareTerrain(){
TerrainMesh terrain = new TerrainMesh(1, 1, 1 ,1); TerrainMesh terrain = new TerrainMesh(1, 1);
float[] vertexBuffer = terrain.generateVertexBuffer(); float[] vertexBuffer = terrain.generateVertexBuffer();
assertEquals(3 * 4, vertexBuffer.length); assertEquals(3 * 4, vertexBuffer.length);
@ -29,7 +30,7 @@ class TerrainMeshTest {
@Test @Test
public void fourSquareTerrain(){ public void fourSquareTerrain(){
TerrainMesh terrain = new TerrainMesh(1, 1, 2 ,2); TerrainMesh terrain = new TerrainMesh(1, 2);
float[] vertexBuffer = terrain.generateVertexBuffer(); float[] vertexBuffer = terrain.generateVertexBuffer();
assertEquals(3 * 9, vertexBuffer.length); assertEquals(3 * 9, vertexBuffer.length);
@ -58,4 +59,26 @@ class TerrainMeshTest {
5, 7, 8, 5, 7, 8,
}, indexBuffer); }, 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);
}
} }