add structure bounding box corners to layered outline
This commit is contained in:
+38
-21
@@ -1,38 +1,36 @@
|
||||
import { system, world } from "@minecraft/server";
|
||||
import { Vector } from "../lib/Vector";
|
||||
|
||||
const drawFrequency = 8;
|
||||
const drawParticle = "minecraft:villager_happy";
|
||||
|
||||
export class Outliner {
|
||||
dimension;
|
||||
min = new Vector();
|
||||
max = new Vector();
|
||||
#shouldDraw = true;
|
||||
|
||||
drawParticle = "minecraft:villager_happy";
|
||||
drawFrequency = 8;
|
||||
|
||||
#drawParticles = [];
|
||||
#runner = null;
|
||||
|
||||
constructor(dimension, min, max) {
|
||||
this.dimension = world.getDimension(dimension);
|
||||
this.dimension = dimension;
|
||||
this.min = new Vector(min.x, min.y, min.z);
|
||||
this.max = new Vector(max.x, max.y, max.z);
|
||||
this.vertices = this.getVertices(min, max);
|
||||
this.startDraw();
|
||||
}
|
||||
|
||||
startDraw() {
|
||||
this.#shouldDraw = true;
|
||||
this.#runner = system.runInterval(() => this.draw(), drawFrequency);
|
||||
this.#runner = system.runInterval(() => this.draw(), this.drawFrequency);
|
||||
}
|
||||
|
||||
stopDraw() {
|
||||
system.clearRun(this.#runner);
|
||||
this.shouldDraw = false;
|
||||
}
|
||||
|
||||
draw() {
|
||||
if (!this.#shouldDraw) return;
|
||||
this.#drawParticles.length = 0;
|
||||
this.#drawParticles.push(...this.getVerticeParticleLocations());
|
||||
this.#drawParticles.push(...this.getCubiodParticleLocations());
|
||||
|
||||
for (const [particleType, location] of this.#drawParticles) {
|
||||
@@ -44,17 +42,31 @@ export class Outliner {
|
||||
}
|
||||
}
|
||||
|
||||
getCubiodParticleLocations() {
|
||||
const vertices = [
|
||||
new Vector(this.min.x, this.min.y, this.min.z),
|
||||
new Vector(this.max.x, this.min.y, this.min.z),
|
||||
new Vector(this.min.x, this.max.y, this.min.z),
|
||||
new Vector(this.max.x, this.max.y, this.min.z),
|
||||
new Vector(this.min.x, this.min.y, this.max.z),
|
||||
new Vector(this.max.x, this.min.y, this.max.z),
|
||||
new Vector(this.min.x, this.max.y, this.max.z),
|
||||
new Vector(this.max.x, this.max.y, this.max.z)
|
||||
getVertices(min, max) {
|
||||
return [
|
||||
new Vector(min.x, min.y, min.z),
|
||||
new Vector(max.x, min.y, min.z),
|
||||
new Vector(min.x, max.y, min.z),
|
||||
new Vector(max.x, max.y, min.z),
|
||||
new Vector(min.x, min.y, max.z),
|
||||
new Vector(max.x, min.y, max.z),
|
||||
new Vector(min.x, max.y, max.z),
|
||||
new Vector(max.x, max.y, max.z)
|
||||
];
|
||||
}
|
||||
|
||||
setVertices(dimension, min, max) {
|
||||
this.dimension = dimension;
|
||||
this.min = new Vector(min.x, min.y, min.z);
|
||||
this.max = new Vector(max.x, max.y, max.z);
|
||||
this.vertices = this.getVertices(min, max);
|
||||
}
|
||||
|
||||
getVerticeParticleLocations() {
|
||||
return this.vertices.map((v) => [this.drawParticle, v]);
|
||||
}
|
||||
|
||||
getCubiodParticleLocations() {
|
||||
const edges = [
|
||||
[0, 1],
|
||||
[0, 2],
|
||||
@@ -71,13 +83,18 @@ export class Outliner {
|
||||
];
|
||||
const edgePoints = [];
|
||||
for (const edge of edges) {
|
||||
const [startVertex, endVertex] = [vertices[edge[0]], vertices[edge[1]]];
|
||||
const [startVertex, endVertex] = [this.vertices[edge[0]], this.vertices[edge[1]]];
|
||||
const resolution = Math.min(Math.floor(endVertex.subtract(startVertex).length), 16);
|
||||
for (let i = 1; i < resolution; i++) {
|
||||
const t = i / resolution;
|
||||
edgePoints.push(startVertex.lerp(endVertex, t));
|
||||
}
|
||||
}
|
||||
return vertices.concat(edgePoints).map((v) => [drawParticle, v]);
|
||||
return edgePoints.map((v) => [this.drawParticle, v]);
|
||||
}
|
||||
|
||||
addStandaloneParticles(locations) {
|
||||
for (const location of locations)
|
||||
this.vertices.push(new Vector(location.x, location.y, location.z));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user