add bbox checks to pathfinding graphs
This commit is contained in:
+36
-12
@@ -77,17 +77,26 @@ export default class Pathfind {
|
||||
return []
|
||||
}
|
||||
|
||||
static buildGraph(waypoints = [], colliders = [], radius = 0, mergeNodes = true) {
|
||||
static buildGraph(waypoints, bboxes, obstacles, radius) {
|
||||
const filteredWaypoints = []
|
||||
const checked = new Set()
|
||||
|
||||
if (radius > 0) {
|
||||
for (const waypoint of waypoints) {
|
||||
const bbox = Entity.bbox(waypoint[0], waypoint[1], radius) // TODO: duplicate bbox calculation logic for speed
|
||||
const bboxCheckedObstacles = colliders.filter((it) => SATX.bboxCheck(bbox, it[0]))
|
||||
const bbox = Entity.bbox(waypoint[0], waypoint[1], radius)
|
||||
const bboxCheckedObstacles = []
|
||||
for (let i = 0; i < bboxes.length; i += 5) {
|
||||
if (bbox[0] <= bboxes[i + 2]) { continue }
|
||||
if (bbox[1] <= bboxes[i + 3]) { continue }
|
||||
if (bbox[2] >= bboxes[i]) { continue }
|
||||
if (bbox[3] >= bboxes[i + 1]) { continue }
|
||||
|
||||
bboxCheckedObstacles.push(obstacles[bboxes[i + 4]])
|
||||
}
|
||||
|
||||
if (bboxCheckedObstacles.length > 0) {
|
||||
const collider = Entity.collider(waypoint[0], waypoint[1], radius)
|
||||
const colliding = bboxCheckedObstacles.some((it) => it[1].some((c) => SATX.collideObject(collider, c)))
|
||||
const colliding = bboxCheckedObstacles.flat().some((it) => SATX.collideObject(collider, it))
|
||||
if (colliding) {
|
||||
continue
|
||||
}
|
||||
@@ -111,7 +120,7 @@ export default class Pathfind {
|
||||
if (i == j) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
if (Math.abs(mergedWaypoints[i] - mergedWaypoints[j]) < Pathfind.precision && Math.abs(mergedWaypoints[i + 1] - mergedWaypoints[j + 1]) < Pathfind.precision) {
|
||||
continue
|
||||
}
|
||||
@@ -124,11 +133,21 @@ export default class Pathfind {
|
||||
checked.add(key)
|
||||
checked.add(Pathfind.floatKey4(mergedWaypoints[j], mergedWaypoints[j + 1], mergedWaypoints[i], mergedWaypoints[i + 1]))
|
||||
|
||||
const bbox = Entity.tunnelBbox(mergedWaypoints[i], mergedWaypoints[i + 1], mergedWaypoints[j], mergedWaypoints[j + 1], radius) // TODO: duplicate bbox calculation logic for speed
|
||||
const bboxCheckedObstacles = colliders.filter((it) => SATX.bboxCheck(bbox, it[0]))
|
||||
const bbox = Entity.tunnelBbox(mergedWaypoints[i], mergedWaypoints[i + 1], mergedWaypoints[j], mergedWaypoints[j + 1], radius)
|
||||
|
||||
const bboxCheckedObstacles = []
|
||||
for (let i = 0; i < bboxes.length; i += 5) {
|
||||
if (bbox[0] <= bboxes[i + 2]) { continue }
|
||||
if (bbox[1] <= bboxes[i + 3]) { continue }
|
||||
if (bbox[2] >= bboxes[i]) { continue }
|
||||
if (bbox[3] >= bboxes[i + 1]) { continue }
|
||||
|
||||
bboxCheckedObstacles.push(obstacles[bboxes[i + 4]])
|
||||
}
|
||||
|
||||
if (bboxCheckedObstacles.length > 0) {
|
||||
const tunnel = Entity.tunnelCollider(mergedWaypoints[i], mergedWaypoints[i + 1], mergedWaypoints[j], mergedWaypoints[j + 1], radius)
|
||||
const colliding = bboxCheckedObstacles.some((it) => it[1].some((c) => SATX.collideObject(tunnel, c)))
|
||||
const colliding = bboxCheckedObstacles.some((it) => it.some((c) => SATX.collideObject(tunnel, c)))
|
||||
if (colliding) {
|
||||
continue
|
||||
}
|
||||
@@ -152,10 +171,6 @@ export default class Pathfind {
|
||||
}
|
||||
}
|
||||
|
||||
if (!mergeNodes) {
|
||||
return nodes
|
||||
}
|
||||
|
||||
const graph = new Float32Array(nodes.length * 5)
|
||||
let graphIndex = 0
|
||||
for (const node of nodes) {
|
||||
@@ -167,6 +182,15 @@ export default class Pathfind {
|
||||
graphIndex += 5
|
||||
}
|
||||
|
||||
// const niceGraph = []
|
||||
// for (let i = 0; i < graph.length / 5; i += 5) {
|
||||
// niceGraph.push({
|
||||
// from: [graph[i], graph[i + 1]],
|
||||
// to: [graph[i + 2], graph[i + 3]],
|
||||
// distance: graph[i + 4],
|
||||
// })
|
||||
// }
|
||||
// console.log(niceGraph)
|
||||
return graph
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user