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

View file

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

View file

@ -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<BUFFER_SIZE; x++) {
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].setMaterial(material);
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) {
return new Vector3f(

View file

@ -1,5 +1,6 @@
package se.cookery.gfx.terrain;
import com.jme3.math.Vector3f;
import com.jme3.scene.Mesh;
import com.jme3.scene.VertexBuffer;
@ -15,6 +16,16 @@ public class TerrainMesh extends Mesh {
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.
*
@ -125,11 +136,18 @@ public class TerrainMesh extends Mesh {
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() {
return squareLengthZ;
public int getSquareIndexZ(Vector3f pos) {
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;
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);
}
}