Added terrain square ID selection (only local index currently)
This commit is contained in:
parent
9518118651
commit
3bfd93af86
5 changed files with 63 additions and 16 deletions
|
|
@ -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));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue