// lines.js — named groups of 1-px line segments in a three.js scene import * as THREE from 'three'; export class LineSet { constructor(scene) { this.scene = scene; this.objects = new Map(); } set(id, positions, color, origin = null) { // origin: positions are relative to it (float precision near the ground) this.remove(id); if (!positions.length) return; const geom = new THREE.BufferGeometry(); geom.setAttribute('position', new THREE.BufferAttribute(positions, 3)); const obj = new THREE.LineSegments(geom, new THREE.LineBasicMaterial({ color, transparent: true, opacity: 0.85, depthTest: this.depthTest ?? true, clippingPlanes: this.clip ?? null })); obj.scale.setScalar(this.scale ?? 1); if (origin) obj.position.set(origin[0], origin[1], origin[2]); this.objects.set(id, obj); this.scene.add(obj); } setClip(planes) { // shared THREE.Plane objects: callers move them, every line follows this.clip = planes; for (const o of this.objects.values()) o.material.clippingPlanes = planes; } setTransform(scale, depthTest) { // globe: hug the ground when zoomed in and draw on top of tiles this.scale = scale; this.depthTest = depthTest; for (const o of this.objects.values()) { o.scale.setScalar(scale); o.material.depthTest = depthTest; } } remove(id) { const obj = this.objects.get(id); if (!obj) return; this.scene.remove(obj); obj.geometry.dispose(); obj.material.dispose(); this.objects.delete(id); } }