database mesh data loaded into hashmaps

This commit is contained in:
2024-01-03 19:25:59 -06:00
parent 78a0416b19
commit f1e41e47cf
6 changed files with 234 additions and 0 deletions
@@ -14,10 +14,13 @@ import engine.Enum.BuildingGroup;
import engine.Enum.GameObjectType;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid;
import engine.collision.Mesh;
import engine.collision.Triangle;
import engine.job.JobContainer;
import engine.job.JobScheduler;
import engine.jobs.UpgradeBuildingJob;
import engine.math.Bounds;
import engine.math.Vector3f;
import engine.math.Vector3fImmutable;
import engine.net.client.ClientConnection;
import engine.net.client.msg.ErrorPopupMsg;
@@ -27,6 +30,10 @@ import engine.objects.*;
import engine.server.MBServerStatics;
import org.pmw.tinylog.Logger;
import java.awt.*;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
@@ -38,6 +45,12 @@ public enum BuildingManager {
BUILDINGMANAGER;
public static HashMap<Integer,ArrayList<Integer>> prop_meshes = new HashMap<>();
public static HashMap<Integer,Float> mesh_heights = new HashMap<>();
public static HashMap<Integer,ArrayList<ArrayList<Vector3f>>> mesh_triangle_points = new HashMap<>();
public static HashMap<Integer, Rectangle2D> mesh_bounding_boxes = new HashMap<>();
public static HashMap<Integer, ArrayList<BuildingLocation>> _stuckLocations = new HashMap<>();
public static HashMap<Integer, ArrayList<BuildingLocation>> _slotLocations = new HashMap<>();
@@ -942,6 +955,9 @@ public enum BuildingManager {
cleanupHirelings(building);
//rebake colliders for change in rank
BuildingManager.BakeBuildingMeshes(building);
building.isDeranking.compareAndSet(true, false);
}
@@ -960,4 +976,63 @@ public enum BuildingManager {
return null;
}
public static void BakeBuildingMeshes(Building building){
if(building == null)
return;
building.buildingMeshes = new ArrayList<>();
float rotation = building.getRot().getRotation();
Vector3f buildingLoc = new Vector3f(building.loc.x,building.loc.y,building.loc.z);
if(!prop_meshes.containsKey(building.getBlueprint().getMeshForRank(building.getRank())))
return; //no data for this prop ID
ArrayList<Integer> meshes = prop_meshes.get(building.getBlueprint().getMeshForRank(building.getRank()));
for(int mesh : meshes){
if(!mesh_heights.containsKey(mesh) || !mesh_triangle_points.containsKey(mesh))
return; //no data for this mesh
Mesh generatedMesh = new Mesh();
generatedMesh.meshHeight = mesh_heights.get(mesh);
ArrayList<ArrayList<Vector3f>> triPoints = mesh_triangle_points.get(mesh);
if(mesh_bounding_boxes.containsKey(mesh)){
Rectangle2D boundingBox = mesh_bounding_boxes.get(mesh);
generatedMesh.BoundingLines = new ArrayList<>();
float maxX = building.loc.x + (float)boundingBox.getMaxX();
float minX = building.loc.x + (float)boundingBox.getMinX();
float maxY = building.loc.z + (float)boundingBox.getMaxY();
float minY = building.loc.z + (float)boundingBox.getMinY();
Point2D.Float p1 = new Point2D.Float(minX,maxY);
Point2D.Float p2 = new Point2D.Float(maxX,maxY);
Point2D.Float p3 = new Point2D.Float(maxX,minY);
Point2D.Float p4 = new Point2D.Float(minX,minY);
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));
}
for(ArrayList<Vector3f> pointList : triPoints){
ArrayList<Vector3f> rotatedPoints = new ArrayList<>();
for(Vector3f point : pointList)
rotatedPoints.add(Vector3f.rotateAroundPoint(buildingLoc,point,rotation));
Point2D.Float p1 = new Point2D.Float(rotatedPoints.get(0).x,rotatedPoints.get(0).z);
Point2D.Float p2 = new Point2D.Float(rotatedPoints.get(1).x,rotatedPoints.get(1).z);
Point2D.Float p3 = new Point2D.Float(rotatedPoints.get(2).x,rotatedPoints.get(2).z);
Triangle tri = new Triangle();
tri.sides = new ArrayList<>();
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.buildingMeshes.add(generatedMesh);
}
}
}