File size: 1,266 Bytes
970fc3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import * as THREE from "three";
function createCurveLayer(world) {
  const group = new THREE.Group();
  world.add(group);
  let key = "";
  return { sync(curves = [], selected = null) {
    const next = JSON.stringify([curves, selected]);
    if (key === next) return;
    key = next;
    for (const child of [...group.children]) {
      child.geometry.dispose();
      child.material.dispose();
      group.remove(child);
    }
    for (const curve of curves) {
      const points = curve.points.map((p) => new THREE.Vector3(p[0], p[1] + (curve.mode === "floor2d" ? 0.025 : 0), p[2])), path = new THREE.CurvePath();
      for (let i = 1; i < points.length; i++) path.add(new THREE.LineCurve3(points[i - 1], points[i]));
      const color = curve.id === selected ? "#ffd166" : curve.mode === "space3d" ? "#b89bff" : "#51dac0";
      const mesh = new THREE.Mesh(new THREE.TubeGeometry(path, Math.max(8, points.length * 2), 0.012, 6, false), new THREE.MeshBasicMaterial({ color, toneMapped: false }));
      group.add(mesh);
      const start = new THREE.Mesh(new THREE.SphereGeometry(0.055, 10, 8), new THREE.MeshBasicMaterial({ color, toneMapped: false }));
      start.position.copy(points[0]);
      group.add(start);
    }
  } };
}
export {
  createCurveLayer
};