three-stdlib
Version:
stand-alone library of threejs examples
126 lines (125 loc) • 4.61 kB
JavaScript
import { InstancedBufferGeometry, Float32BufferAttribute, InstancedInterleavedBuffer, InterleavedBufferAttribute, WireframeGeometry, Box3, Sphere, Vector3 } from "three";
const _box = /* @__PURE__ */ new Box3();
const _vector = /* @__PURE__ */ new Vector3();
class LineSegmentsGeometry extends InstancedBufferGeometry {
constructor() {
super();
this.isLineSegmentsGeometry = true;
this.type = "LineSegmentsGeometry";
const positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0];
const uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2];
const index = [0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5];
this.setIndex(index);
this.setAttribute("position", new Float32BufferAttribute(positions, 3));
this.setAttribute("uv", new Float32BufferAttribute(uvs, 2));
}
applyMatrix4(matrix) {
const start = this.attributes.instanceStart;
const end = this.attributes.instanceEnd;
if (start !== void 0) {
start.applyMatrix4(matrix);
end.applyMatrix4(matrix);
start.needsUpdate = true;
}
if (this.boundingBox !== null) {
this.computeBoundingBox();
}
if (this.boundingSphere !== null) {
this.computeBoundingSphere();
}
return this;
}
setPositions(array) {
let lineSegments;
if (array instanceof Float32Array) {
lineSegments = array;
} else if (Array.isArray(array)) {
lineSegments = new Float32Array(array);
}
const instanceBuffer = new InstancedInterleavedBuffer(lineSegments, 6, 1);
this.setAttribute("instanceStart", new InterleavedBufferAttribute(instanceBuffer, 3, 0));
this.setAttribute("instanceEnd", new InterleavedBufferAttribute(instanceBuffer, 3, 3));
this.computeBoundingBox();
this.computeBoundingSphere();
return this;
}
setColors(array, itemSize = 3) {
let colors;
if (array instanceof Float32Array) {
colors = array;
} else if (Array.isArray(array)) {
colors = new Float32Array(array);
}
const instanceColorBuffer = new InstancedInterleavedBuffer(colors, itemSize * 2, 1);
this.setAttribute("instanceColorStart", new InterleavedBufferAttribute(instanceColorBuffer, itemSize, 0));
this.setAttribute("instanceColorEnd", new InterleavedBufferAttribute(instanceColorBuffer, itemSize, itemSize));
return this;
}
fromWireframeGeometry(geometry) {
this.setPositions(geometry.attributes.position.array);
return this;
}
fromEdgesGeometry(geometry) {
this.setPositions(geometry.attributes.position.array);
return this;
}
fromMesh(mesh) {
this.fromWireframeGeometry(new WireframeGeometry(mesh.geometry));
return this;
}
fromLineSegments(lineSegments) {
const geometry = lineSegments.geometry;
this.setPositions(geometry.attributes.position.array);
return this;
}
computeBoundingBox() {
if (this.boundingBox === null) {
this.boundingBox = new Box3();
}
const start = this.attributes.instanceStart;
const end = this.attributes.instanceEnd;
if (start !== void 0 && end !== void 0) {
this.boundingBox.setFromBufferAttribute(start);
_box.setFromBufferAttribute(end);
this.boundingBox.union(_box);
}
}
computeBoundingSphere() {
if (this.boundingSphere === null) {
this.boundingSphere = new Sphere();
}
if (this.boundingBox === null) {
this.computeBoundingBox();
}
const start = this.attributes.instanceStart;
const end = this.attributes.instanceEnd;
if (start !== void 0 && end !== void 0) {
const center = this.boundingSphere.center;
this.boundingBox.getCenter(center);
let maxRadiusSq = 0;
for (let i = 0, il = start.count; i < il; i++) {
_vector.fromBufferAttribute(start, i);
maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector));
_vector.fromBufferAttribute(end, i);
maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector));
}
this.boundingSphere.radius = Math.sqrt(maxRadiusSq);
if (isNaN(this.boundingSphere.radius)) {
console.error(
"THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.",
this
);
}
}
}
toJSON() {
}
applyMatrix(matrix) {
console.warn("THREE.LineSegmentsGeometry: applyMatrix() has been renamed to applyMatrix4().");
return this.applyMatrix4(matrix);
}
}
export {
LineSegmentsGeometry
};
//# sourceMappingURL=LineSegmentsGeometry.js.map