From 3185866fa4691ffacabf79780d5fc285ba3e3c18 Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 30 Oct 2021 16:28:50 -0400 Subject: [PATCH] Scaffolding navmesh --- .../server/pathfinding/ChunkMeshList.java | 35 ++++++++++++++ .../server/pathfinding/NavMeshManager.java | 20 ++++++++ .../game/server/pathfinding/NavMeshUtils.java | 31 ++++++++++++ .../server/pathfinding/navmesh/NavCube.java | 47 +++++++++++++++++++ .../server/pathfinding/navmesh/NavMesh.java | 43 +++++++++++++++++ .../server/pathfinding/navmesh/NavShape.java | 17 +++++++ .../server/pathfinding/path/Waypoint.java | 12 +++++ 7 files changed, 205 insertions(+) create mode 100644 src/main/java/electrosphere/game/server/pathfinding/ChunkMeshList.java create mode 100644 src/main/java/electrosphere/game/server/pathfinding/NavMeshManager.java create mode 100644 src/main/java/electrosphere/game/server/pathfinding/NavMeshUtils.java create mode 100644 src/main/java/electrosphere/game/server/pathfinding/navmesh/NavCube.java create mode 100644 src/main/java/electrosphere/game/server/pathfinding/navmesh/NavMesh.java create mode 100644 src/main/java/electrosphere/game/server/pathfinding/navmesh/NavShape.java create mode 100644 src/main/java/electrosphere/game/server/pathfinding/path/Waypoint.java diff --git a/src/main/java/electrosphere/game/server/pathfinding/ChunkMeshList.java b/src/main/java/electrosphere/game/server/pathfinding/ChunkMeshList.java new file mode 100644 index 00000000..faf47591 --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/ChunkMeshList.java @@ -0,0 +1,35 @@ +package electrosphere.game.server.pathfinding; + +import electrosphere.game.server.pathfinding.navmesh.NavMesh; +import electrosphere.game.server.terrain.manager.ServerTerrainChunk; +import java.util.LinkedList; +import java.util.List; + +/** + * + * @author satellite + */ +public class ChunkMeshList { + + ServerTerrainChunk chunk; + List meshes = new LinkedList(); + + public ChunkMeshList(ServerTerrainChunk parent){ + chunk = parent; + } + + public void addMesh(NavMesh mesh){ + meshes.add(mesh); + } + + public List getMeshes(){ + return meshes; + } + + public ServerTerrainChunk getChunk(){ + return chunk; + } + + + +} diff --git a/src/main/java/electrosphere/game/server/pathfinding/NavMeshManager.java b/src/main/java/electrosphere/game/server/pathfinding/NavMeshManager.java new file mode 100644 index 00000000..2d25a231 --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/NavMeshManager.java @@ -0,0 +1,20 @@ +package electrosphere.game.server.pathfinding; + +import electrosphere.game.server.pathfinding.navmesh.NavMesh; +import electrosphere.game.server.terrain.manager.ServerTerrainChunk; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * + * @author satellite + */ +public class NavMeshManager { + + List meshes = new LinkedList(); + Map chunkToMeshListMap = new HashMap(); + + +} diff --git a/src/main/java/electrosphere/game/server/pathfinding/NavMeshUtils.java b/src/main/java/electrosphere/game/server/pathfinding/NavMeshUtils.java new file mode 100644 index 00000000..7e227561 --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/NavMeshUtils.java @@ -0,0 +1,31 @@ +package electrosphere.game.server.pathfinding; + +import electrosphere.game.server.pathfinding.navmesh.NavMesh; +import electrosphere.game.server.terrain.manager.ServerTerrainChunk; +import electrosphere.main.Globals; + +/** + * + * @author satellite + */ +public class NavMeshUtils { + + public static NavMesh createMeshFromChunk(ServerTerrainChunk chunk){ + NavMesh rVal = new NavMesh(); + float[][] heightMap = chunk.getHeightMap(); + for(int x = 0; x < Globals.serverTerrainManager.getChunkWidth(); x++){ + for(int y = 0; y < Globals.serverTerrainManager.getChunkWidth(); y++){ + //create node + + if(x > 0){ + //add back neighbor + } + if(y > 0){ + //add back neighbor + } + } + } + return rVal; + } + +} diff --git a/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavCube.java b/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavCube.java new file mode 100644 index 00000000..291ea175 --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavCube.java @@ -0,0 +1,47 @@ +package electrosphere.game.server.pathfinding.navmesh; + +import java.util.LinkedList; +import java.util.List; +import org.joml.Vector3d; + +/** + * + * @author satellite + */ + +/** + * Axis aligned bounding boxes used as nodes in pathfinding navmeshes + * Inclusive of boundary points on both minimum and maximum + */ + +public class NavCube extends NavShape { + + Vector3d minPoint; + Vector3d maxPoint; + + List neighbors = new LinkedList(); + + + public NavCube(double minX, double minY, double minZ, double maxX, double maxY, double maxZ){ + minPoint = new Vector3d(minX, minY, minZ); + maxPoint = new Vector3d(maxX, maxY, maxZ); + } + + @Override + public void addNeighbor(NavCube neighbor){ + neighbors.add(neighbor); + } + + @Override + public List getNeighbors(){ + return neighbors; + } + + @Override + public boolean containsPoint(double x, double y, double z){ + return x >= minPoint.x && y >= minPoint.y && z >= minPoint.z && x <= maxPoint.x && y <= maxPoint.y && z <= maxPoint.z; + } + + + +} diff --git a/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavMesh.java b/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavMesh.java new file mode 100644 index 00000000..893c998a --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavMesh.java @@ -0,0 +1,43 @@ +package electrosphere.game.server.pathfinding.navmesh; + +import java.util.LinkedList; +import java.util.List; + +/** + * + * @author satellite + */ +public class NavMesh { + + //nav method, ie walking, flying, climbing, swimming, etc + String method; + + List navNodes = new LinkedList(); + List neighbors = new LinkedList(); + + public void addNeighbor(NavMesh neighbor){ + neighbors.add(neighbor); + } + + public List getNeighbors(){ + return neighbors; + } + + public void addNode(NavShape node){ + navNodes.add(node); + } + + public List getNodes(){ + return navNodes; + } + + public boolean containsPoint(double x, double y, double z){ + for(NavShape shape : navNodes){ + if(shape.containsPoint(x, y, z)){ + return true; + } + } + return false; + } + +} diff --git a/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavShape.java b/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavShape.java new file mode 100644 index 00000000..18e867b9 --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/navmesh/NavShape.java @@ -0,0 +1,17 @@ +package electrosphere.game.server.pathfinding.navmesh; + +import java.util.List; + +/** + * + * @author satellite + */ +public abstract class NavShape { + + public abstract void addNeighbor(NavCube neighbor); + + public abstract List getNeighbors(); + + public abstract boolean containsPoint(double x, double y, double z); + +} diff --git a/src/main/java/electrosphere/game/server/pathfinding/path/Waypoint.java b/src/main/java/electrosphere/game/server/pathfinding/path/Waypoint.java new file mode 100644 index 00000000..26a8f0af --- /dev/null +++ b/src/main/java/electrosphere/game/server/pathfinding/path/Waypoint.java @@ -0,0 +1,12 @@ +package electrosphere.game.server.pathfinding.path; + +import org.joml.Vector3d; + +/** + * + * @author satellite + */ +public class Waypoint { + String method; //ie walking, flying, climbing, swimming, etc + Vector3d position; +}