diff --git a/src/engine/CollisionEngine/CollisionManager.java b/src/engine/CollisionEngine/CollisionManager.java index 0a711142..c5d58315 100644 --- a/src/engine/CollisionEngine/CollisionManager.java +++ b/src/engine/CollisionEngine/CollisionManager.java @@ -8,20 +8,10 @@ import java.awt.geom.Line2D; public class CollisionManager { public static boolean CollisionDetected(Building building, Line2D travelLine, float charHeight, float charY){ - Rectangle.Float boundsRect = new Rectangle.Float(); - Vector3f topLeft = new Vector3f(building.loc.x - building.getBounds().getHalfExtents().x,building.loc.y,building.loc.z - building.getBounds().getHalfExtents().y); + for (Mesh mesh : building.buildingMeshes) + if(mesh.MeshCollides(travelLine,charHeight,charY)) + return true; - boundsRect.setRect(topLeft.x, topLeft.z, building.getBounds().getHalfExtents().x * 2,building.getBounds().getHalfExtents().y * 2); - if(travelLine.intersects(boundsRect)){ - //collided with building - for(Triangle tri : building.buildingTriangles) { - if (tri.collides(travelLine)) { - //ChatManager.chatSystemInfo(pc, "Collision Detected"); - //MovementManager.movement(msg, pc); - return true; - } - } - } return false; } } diff --git a/src/engine/CollisionEngine/Mesh.java b/src/engine/CollisionEngine/Mesh.java index 96c99604..bf95ed9d 100644 --- a/src/engine/CollisionEngine/Mesh.java +++ b/src/engine/CollisionEngine/Mesh.java @@ -23,15 +23,13 @@ public class Mesh { public boolean MeshCollides(Line2D line, float charHeight, float charY){ //check if movement path intersects this mesh - //if(!this.BoundsCollides(line)) - // return false; - - //boolean feetcollides = (charY + charHeight) < this.minY; - //boolean headcollides = charY > this.maxY; - //check to see if the mesh collides between the characters feet and head locations - //if(feetcollides && headcollides){ - // return false; - //} + if(!this.BoundsCollides(line)) + return false; + + + //check to see if character is under or over the mesh + if((charY + charHeight) < this.minY || charY > this.maxY) + return false; //check if any triangles intersect the movement path for(Triangle tri : triangles) diff --git a/src/engine/db/handlers/dbBuildingHandler.java b/src/engine/db/handlers/dbBuildingHandler.java index 57810910..d11d2642 100644 --- a/src/engine/db/handlers/dbBuildingHandler.java +++ b/src/engine/db/handlers/dbBuildingHandler.java @@ -928,7 +928,6 @@ public class dbBuildingHandler extends dbHandlerBase { } catch (SQLException e) { Logger.error(e); } - } public void LOAD_MESH_BOUNDING_BOXES() { @@ -948,7 +947,7 @@ public class dbBuildingHandler extends dbHandlerBase { float refZ = Float.parseFloat(rs.getString("ref").split(";")[1]); - Vector2f topLeft = new Vector2f(centerX - refX,centerZ + refZ); + Vector2f topLeft = new Vector2f(refX,refZ); float width = Math.abs(endX-refX); float height = Math.abs(endZ-refZ); Rectangle2D boundRect = new Rectangle2D.Float(); diff --git a/src/engine/devcmd/cmds/InfoCmd.java b/src/engine/devcmd/cmds/InfoCmd.java index 04ed3f4e..313c21ce 100644 --- a/src/engine/devcmd/cmds/InfoCmd.java +++ b/src/engine/devcmd/cmds/InfoCmd.java @@ -244,7 +244,7 @@ public class InfoCmd extends AbstractDevCmd { for (Regions regions : targetBuilding.getBounds().getRegions()) { //TODO ADD REGION INFO } - output += "Triangle Count: " + targetBuilding.buildingTriangles.size(); + output += "Mesh Count: " + targetBuilding.buildingMeshes.size(); break; case PlayerCharacter: output += newline; diff --git a/src/engine/devcmd/cmds/RegionCmd.java b/src/engine/devcmd/cmds/RegionCmd.java index d5576d4a..67a063ca 100644 --- a/src/engine/devcmd/cmds/RegionCmd.java +++ b/src/engine/devcmd/cmds/RegionCmd.java @@ -47,6 +47,13 @@ public class RegionCmd extends AbstractDevCmd { output += "is Outside: " + region.isOutside(); this.throwbackInfo(pc, output); } + if(building != null){ + for (Mesh mesh : building.buildingMeshes){ + if(mesh.boundsRect.contains(pc.loc.x,pc.loc.z)) + this.throwbackInfo(pc, "Inside A Mesh's Bounds"); + } + } + } @Override diff --git a/src/engine/gameManager/BuildingManager.java b/src/engine/gameManager/BuildingManager.java index 7b23e1d7..bb971a92 100644 --- a/src/engine/gameManager/BuildingManager.java +++ b/src/engine/gameManager/BuildingManager.java @@ -982,47 +982,51 @@ public enum BuildingManager { if (building == null) return; - building.buildingTriangles = new ArrayList<>(); + building.buildingMeshes = new ArrayList<>(); float rotation = building.getRot().getRotation(); Vector3f buildingLoc = new Vector3f(building.loc.x, building.loc.y, building.loc.z); if (!mesh_triangle_points.containsKey(building.meshUUID)) return; //no data for this prop ID - //ArrayList meshes = prop_meshes.get(building.meshUUID); - //for (int mesh : meshes) { + ArrayList meshes = prop_meshes.get(building.meshUUID); + for (int mesh : meshes) { - //if (!mesh_heights.containsKey(mesh) || !mesh_triangle_points.containsKey(mesh)) - //return; //no data for this mesh + if (!mesh_heights.containsKey(mesh) || !mesh_triangle_points.containsKey(mesh)) + return; //no data for this mesh - //Mesh generatedMesh = new Mesh(); - //generatedMesh.maxY = building.loc.y + mesh_heights.get(mesh).x; - //generatedMesh.minY = building.loc.y + mesh_heights.get(mesh).y; + Mesh generatedMesh = new Mesh(); + generatedMesh.maxY = building.loc.y + mesh_heights.get(mesh).x; + generatedMesh.minY = building.loc.y + mesh_heights.get(mesh).y; ArrayList> triPoints = mesh_triangle_points.get(building.meshUUID); - //if (mesh_bounding_boxes.containsKey(mesh)) { - //Rectangle2D boundingBox = mesh_bounding_boxes.get(mesh); - //Bounds buildingBounds = building.getBounds(); - //float halfX = (float) boundingBox.getWidth() * 0.5f; - //float halfZ = (float)boundingBox.getHeight() * 0.5f; - //Vector3f bottomRight = new Vector3f(building.loc.x + halfX,building.loc.y,building.loc.z + halfZ); - //Vector3f topLeft = new Vector3f(building.loc.x - halfX,building.loc.y,building.loc.z - halfZ); - //Vector3f topRight = new Vector3f(building.loc.x + halfX,building.loc.y,building.loc.z - halfZ); - //Vector3f bottomLeft = new Vector3f(building.loc.x - halfX,building.loc.y,building.loc.z + halfZ); - - //generatedMesh.BoundingLines = new ArrayList<>(); - //Point2D.Float p1 = new Point2D.Float(topLeft.x, topLeft.z); - //Point2D.Float p2 = new Point2D.Float(topRight.x, topRight.z); - //Point2D.Float p3 = new Point2D.Float(bottomRight.x, bottomRight.z); - //Point2D.Float p4 = new Point2D.Float(bottomLeft.x, bottomLeft.z); - //float rectWidth = topLeft.distance(topRight); - //float rectHeight = topLeft.distance(bottomLeft); - //boundingBox.setRect(p1.x,p1.y,rectWidth, rectHeight); - //generatedMesh.BoundingLines.add(new Line2D.Float(p1, p2)); - //generatedMesh.BoundingLines.add(new Line2D.Float(p2, p3)); - //generatedMesh.BoundingLines.add(new Line2D.Float(p3, p4)); - //generatedMesh.BoundingLines.add(new Line2D.Float(p4, p1)); - //generatedMesh.boundsRect = boundingBox; - //} - //generatedMesh.triangles = new ArrayList<>(); + if (mesh_bounding_boxes.containsKey(mesh)) { + Rectangle2D boundingBox = mesh_bounding_boxes.get(mesh); + float halfX = (float) boundingBox.getWidth() * 0.5f; + float halfZ = (float) boundingBox.getHeight() * 0.5f; + Vector3f bottomRight = new Vector3f(building.loc.x + halfX, building.loc.y, building.loc.z + halfZ); + Vector3f topLeft = new Vector3f(building.loc.x - halfX, building.loc.y, building.loc.z - halfZ); + Vector3f topRight = new Vector3f(building.loc.x + halfX, building.loc.y, building.loc.z - halfZ); + Vector3f bottomLeft = new Vector3f(building.loc.x - halfX, building.loc.y, building.loc.z + halfZ); + + topLeft.x *= -1; + bottomLeft.x *= -1; + topRight.x *= -1; + bottomRight.x *= -1; + + generatedMesh.BoundingLines = new ArrayList<>(); + Point2D.Float p1 = new Point2D.Float(topLeft.x, topLeft.z); + Point2D.Float p2 = new Point2D.Float(topRight.x, topRight.z); + Point2D.Float p3 = new Point2D.Float(bottomRight.x, bottomRight.z); + Point2D.Float p4 = new Point2D.Float(bottomLeft.x, bottomLeft.z); + float rectWidth = topLeft.distance(topRight); + float rectHeight = topLeft.distance(bottomLeft); + boundingBox.setRect(p1.x, p1.y, rectWidth, rectHeight); + generatedMesh.BoundingLines.add(new Line2D.Float(p1, p2)); + generatedMesh.BoundingLines.add(new Line2D.Float(p2, p3)); + generatedMesh.BoundingLines.add(new Line2D.Float(p3, p4)); + generatedMesh.BoundingLines.add(new Line2D.Float(p4, p1)); + generatedMesh.boundsRect = boundingBox; + } + generatedMesh.triangles = new ArrayList<>(); for (ArrayList pointList : triPoints) { ArrayList rotatedPoints = new ArrayList<>(); @@ -1040,12 +1044,12 @@ public enum BuildingManager { tri.sides.add(new Line2D.Float(p1, p2)); tri.sides.add(new Line2D.Float(p2, p3)); tri.sides.add(new Line2D.Float(p3, p1)); - //generatedMesh.triangles.add(tri); - building.buildingTriangles.add(tri); + generatedMesh.triangles.add(tri); + } - //building.buildingMeshes.add(generatedMesh); - //} - } + building.buildingMeshes.add(generatedMesh); + } + } catch(Exception e){ Logger.info("Failed To Bake Building Mesh Data For Structure: " + building.meshUUID); } diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java index bec63817..f8220fb9 100644 --- a/src/engine/objects/Building.java +++ b/src/engine/objects/Building.java @@ -101,7 +101,7 @@ public class Building extends AbstractWorldObject { private ConcurrentHashMap condemned; private ArrayList children = null; - public ArrayList buildingTriangles; + public ArrayList buildingMeshes; /** * ResultSet Constructor