copper3d 3.6.2 → 3.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/Loader/copperNrrdLoader.js +1 -1
  2. package/dist/Loader/copperNrrdLoader.js.map +1 -1
  3. package/dist/Scene/copperScene.d.ts +4 -4
  4. package/dist/Scene/copperScene.js +4 -4
  5. package/dist/Scene/copperScene.js.map +1 -1
  6. package/dist/Utils/surfaceAnnotation/MeshGraph.d.ts +12 -10
  7. package/dist/Utils/surfaceAnnotation/MeshGraph.js +14 -12
  8. package/dist/Utils/surfaceAnnotation/MeshGraph.js.map +1 -1
  9. package/dist/Utils/surfaceAnnotation/SurfaceAnnotator.d.ts +48 -28
  10. package/dist/Utils/surfaceAnnotation/SurfaceAnnotator.js +76 -50
  11. package/dist/Utils/surfaceAnnotation/SurfaceAnnotator.js.map +1 -1
  12. package/dist/Utils/surfaceAnnotation/annotationStore.d.ts +4 -4
  13. package/dist/Utils/surfaceAnnotation/annotationStore.js +4 -4
  14. package/dist/Utils/surfaceAnnotation/annotationStore.js.map +1 -1
  15. package/dist/Utils/surfaceAnnotation/contourRender.d.ts +1 -1
  16. package/dist/Utils/surfaceAnnotation/contourRender.js +16 -11
  17. package/dist/Utils/surfaceAnnotation/contourRender.js.map +1 -1
  18. package/dist/Utils/surfaceAnnotation/geodesicContour.d.ts +11 -10
  19. package/dist/Utils/surfaceAnnotation/geodesicContour.js +16 -15
  20. package/dist/Utils/surfaceAnnotation/geodesicContour.js.map +1 -1
  21. package/dist/Utils/surfaceAnnotation/pointMarkers.d.ts +3 -2
  22. package/dist/Utils/surfaceAnnotation/pointMarkers.js +6 -2
  23. package/dist/Utils/surfaceAnnotation/pointMarkers.js.map +1 -1
  24. package/dist/Utils/surfaceAnnotation/raycastSurface.d.ts +3 -2
  25. package/dist/Utils/surfaceAnnotation/raycastSurface.js +71 -5
  26. package/dist/Utils/surfaceAnnotation/raycastSurface.js.map +1 -1
  27. package/dist/Utils/surfaceAnnotation/strokeContour.d.ts +9 -6
  28. package/dist/Utils/surfaceAnnotation/strokeContour.js +15 -10
  29. package/dist/Utils/surfaceAnnotation/strokeContour.js.map +1 -1
  30. package/dist/Utils/surfaceAnnotation/types.d.ts +5 -5
  31. package/dist/Utils/surfaceAnnotation/types.js +2 -2
  32. package/dist/Utils/surfaceAnnotation/types.js.map +1 -1
  33. package/dist/Utils/texture2d.js +4 -2
  34. package/dist/Utils/texture2d.js.map +1 -1
  35. package/dist/Utils/workers/reformatSaveDataWorker.js +2 -2
  36. package/dist/Utils/workers/reformatSaveDataWorker.js.map +1 -1
  37. package/dist/bundle.esm.js +238 -129
  38. package/dist/bundle.umd.js +238 -129
  39. package/dist/index.d.ts +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/lib/three-vignette.js +8 -2
  42. package/dist/lib/three-vignette.js.map +1 -1
  43. package/dist/types/Scene/copperScene.d.ts +4 -4
  44. package/dist/types/Utils/surfaceAnnotation/MeshGraph.d.ts +12 -10
  45. package/dist/types/Utils/surfaceAnnotation/SurfaceAnnotator.d.ts +48 -28
  46. package/dist/types/Utils/surfaceAnnotation/annotationStore.d.ts +4 -4
  47. package/dist/types/Utils/surfaceAnnotation/contourRender.d.ts +1 -1
  48. package/dist/types/Utils/surfaceAnnotation/geodesicContour.d.ts +11 -10
  49. package/dist/types/Utils/surfaceAnnotation/pointMarkers.d.ts +3 -2
  50. package/dist/types/Utils/surfaceAnnotation/raycastSurface.d.ts +3 -2
  51. package/dist/types/Utils/surfaceAnnotation/strokeContour.d.ts +9 -6
  52. package/dist/types/Utils/surfaceAnnotation/types.d.ts +5 -5
  53. package/dist/types/index.d.ts +1 -1
  54. package/package.json +1 -1
@@ -1,20 +1,21 @@
1
1
  /**
2
- * 模式 B(测地线)状态机:逐次点击锚点,相邻锚点之间用 MeshGraph 求最短路径,
3
- * 拼成一条贴合表面的折线。Enter 结束并可闭合(首尾再求一段)。
2
+ * State machine for mode B (geodesic): click anchors one by one, find the shortest path between
3
+ * adjacent anchors with MeshGraph, and stitch them into a polyline that hugs the surface.
4
+ * Enter finishes and can close the loop (computing one more segment between first and last).
4
5
  */
5
6
  export class GeodesicContour {
6
7
  constructor(graph, mesh) {
7
8
  this.graph = graph;
8
9
  this.mesh = mesh;
9
- this.anchors = []; // 顶点索引
10
- this.segments = []; // 相邻锚点间路径(含端点)
11
- this.history = []; // 每次增删前的锚点快照,用于撤销
10
+ this.anchors = []; // vertex indices
11
+ this.segments = []; // path between adjacent anchors (endpoints included)
12
+ this.history = []; // anchor snapshot before each add/remove, for undo
12
13
  }
13
- /** 任何改动锚点前先存一份快照(顶点索引数组很小,快照成本可忽略) */
14
+ /** Save a snapshot before any anchor change (the vertex-index array is tiny, so snapshot cost is negligible). */
14
15
  snapshot() {
15
16
  this.history.push(this.anchors.slice());
16
17
  }
17
- /** 传入 local 命中点,snap 到最近顶点并对上一锚点求路径。 */
18
+ /** Given a local hit point, snap to the nearest vertex and compute the path to the previous anchor. */
18
19
  addAnchor(localHitPoint) {
19
20
  const v = this.graph.nearestVertex(localHitPoint);
20
21
  this.snapshot();
@@ -24,7 +25,7 @@ export class GeodesicContour {
24
25
  }
25
26
  this.anchors.push(v);
26
27
  }
27
- /** 删除指定下标的锚点,重算相邻段(支持取消中间任意一点) */
28
+ /** Remove the anchor at the given index and recompute adjacent segments (allows canceling any middle point). */
28
29
  removeAnchorAt(index) {
29
30
  if (index < 0 || index >= this.anchors.length)
30
31
  return;
@@ -32,11 +33,11 @@ export class GeodesicContour {
32
33
  this.anchors.splice(index, 1);
33
34
  this.rebuildSegments();
34
35
  }
35
- /** 是否还有可撤销的编辑(加点/删点) */
36
+ /** Whether there is still an editable change to undo (add/remove point). */
36
37
  canUndo() {
37
38
  return this.history.length > 0;
38
39
  }
39
- /** 撤销上一次锚点编辑(加点删回去;删点恢复)。无历史返回 false */
40
+ /** Undo the last anchor edit (addremove it; remove restore it). Returns false when no history. */
40
41
  undoEdit() {
41
42
  const prev = this.history.pop();
42
43
  if (!prev)
@@ -45,21 +46,21 @@ export class GeodesicContour {
45
46
  this.rebuildSegments();
46
47
  return true;
47
48
  }
48
- /** 据当前锚点序列整体重算所有相邻段路径。 */
49
+ /** Recompute all adjacent-segment paths from the current anchor sequence. */
49
50
  rebuildSegments() {
50
51
  this.segments = [];
51
52
  for (let i = 1; i < this.anchors.length; i++) {
52
53
  this.segments.push(this.graph.shortestPath(this.anchors[i - 1], this.anchors[i]));
53
54
  }
54
55
  }
55
- /** 各锚点的 local 顶点(用于绘制可见的锚点标记) */
56
+ /** Local vertex of each anchor (used to draw visible anchor markers). */
56
57
  getAnchorLocals() {
57
58
  return this.anchors.map((i) => this.graph.vertexLocal(i));
58
59
  }
59
60
  get anchorCount() {
60
61
  return this.anchors.length;
61
62
  }
62
- /** 把所有路径顶点(world)+ 法线 拼成折线;closed 时补一段首尾路径。 */
63
+ /** Stitch all path vertices (world) + normals into a polyline; when closed, add one first-to-last segment. */
63
64
  buildVertices(closed) {
64
65
  const segs = this.segments.slice();
65
66
  if (closed && this.anchors.length > 2) {
@@ -67,14 +68,14 @@ export class GeodesicContour {
67
68
  }
68
69
  const idxPath = [];
69
70
  segs.forEach((s, si) => {
70
- const start = si === 0 ? 0 : 1; // 去重相邻段共享端点
71
+ const start = si === 0 ? 0 : 1; // dedupe the endpoint shared between adjacent segments
71
72
  for (let k = start; k < s.length; k++)
72
73
  idxPath.push(s[k]);
73
74
  });
74
75
  if (idxPath.length === 0 && this.anchors.length === 1) {
75
76
  idxPath.push(this.anchors[0]);
76
77
  }
77
- // 图几何即 local 空间,直接产出 local 顶点(渲染时再派生 world)
78
+ // The graph geometry is already local space, so emit local vertices directly (world is derived at render time).
78
79
  return idxPath.map((i) => this.graph.vertexLocal(i));
79
80
  }
80
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"geodesicContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/geodesicContour.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"geodesicContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/geodesicContour.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import * as THREE from "three";
2
2
  import type { AnnotationVertex } from "./types";
3
3
  /**
4
- * local 顶点处生成一个标记小球(fiducial)local→world 后沿 world 法线略外移,
5
- * 避免一半埋进表面。radius 由调用方按模型 bbox 缩放传入。
4
+ * Create a marker sphere (fiducial) at a local vertex. After local→world, nudge it
5
+ * outward along the world normal so it doesn't sink halfway into the surface.
6
+ * radius is passed in by the caller, scaled to the model bbox.
6
7
  */
7
8
  export declare function makePointMarker(v: AnnotationVertex, mesh: THREE.Mesh, color: string, radius: number): THREE.Mesh;
@@ -1,11 +1,15 @@
1
1
  import * as THREE from "three";
2
2
  import { localVertexToWorld } from "./types";
3
3
  /**
4
- * local 顶点处生成一个标记小球(fiducial)local→world 后沿 world 法线略外移,
5
- * 避免一半埋进表面。radius 由调用方按模型 bbox 缩放传入。
4
+ * Create a marker sphere (fiducial) at a local vertex. After local→world, nudge it
5
+ * outward along the world normal so it doesn't sink halfway into the surface.
6
+ * radius is passed in by the caller, scaled to the model bbox.
6
7
  */
7
8
  export function makePointMarker(v, mesh, color, radius) {
8
9
  const geo = new THREE.SphereGeometry(radius, 16, 16);
10
+ // depthTest ON so markers are occluded by the model when they are on the far side (no
11
+ // see-through), consistent with the contour lines. Markers are volumetric spheres lifted off
12
+ // the surface, so they still show on the visible side without z-fighting.
9
13
  const mat = new THREE.MeshBasicMaterial({ color });
10
14
  const m = new THREE.Mesh(geo, mat);
11
15
  const { p, n } = localVertexToWorld(v, mesh);
@@ -1 +1 @@
1
- {"version":3,"file":"pointMarkers.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/pointMarkers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAmB,EACnB,IAAgB,EAChB,KAAa,EACb,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"pointMarkers.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/pointMarkers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAmB,EACnB,IAAgB,EAChB,KAAa,EACb,MAAc;IAEd,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,sFAAsF;IACtF,6FAA6F;IAC7F,0EAA0E;IAC1E,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC;IACpB,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import * as THREE from "three";
2
2
  import type { SurfaceHit } from "./types";
3
3
  /**
4
- * 把屏幕坐标(clientX/Y)投射到 mesh 表面,返回命中点、world-space 法线与 faceIndex。
5
- * 未命中返回 null。本地实现,不依赖 Copper3D 未导出的 raycast 内部函数。
4
+ * Project screen coordinates (clientX/Y) onto the mesh surface, returning the hit point,
5
+ * world-space normal, and faceIndex. Returns null on a miss. Local implementation that does not
6
+ * depend on Copper3D's unexported raycast internals.
6
7
  */
7
8
  export declare function raycastSurface(camera: THREE.PerspectiveCamera, container: HTMLElement, mesh: THREE.Mesh, clientX: number, clientY: number): SurfaceHit | null;
@@ -1,9 +1,69 @@
1
1
  import * as THREE from "three";
2
2
  const ray = new THREE.Raycaster();
3
3
  const ndc = new THREE.Vector2();
4
+ // scratch objects for the smooth-normal interpolation (avoid per-call allocation)
5
+ const _nm = new THREE.Matrix3();
6
+ const _lp = new THREE.Vector3();
7
+ const _pa = new THREE.Vector3();
8
+ const _pb = new THREE.Vector3();
9
+ const _pc = new THREE.Vector3();
10
+ const _na = new THREE.Vector3();
11
+ const _nb = new THREE.Vector3();
12
+ const _nc = new THREE.Vector3();
13
+ const _v0 = new THREE.Vector3();
14
+ const _v1 = new THREE.Vector3();
15
+ const _v2 = new THREE.Vector3();
4
16
  /**
5
- * 把屏幕坐标(clientX/Y)投射到 mesh 表面,返回命中点、world-space 法线与 faceIndex。
6
- * 未命中返回 null。本地实现,不依赖 Copper3D 未导出的 raycast 内部函数。
17
+ * Interpolate a "smooth per-vertex normal" across the hit triangle using barycentric coordinates,
18
+ * instead of using the per-face normal.
19
+ *
20
+ * Per-face normals on voxel / marching-cubes meshes are axis-aligned stair directions (±x/±y/±z);
21
+ * using them to push the annotation line outward along the normal shoves points toward neighboring
22
+ * stairs rather than cleanly "outward", making the line dip in and out on bumpy surfaces and get
23
+ * occluded by the steps. A smooth normal varies continuously along the surface, so the outward
24
+ * direction is stable and consistent and the line can float smoothly above the relief. Returns false
25
+ * when interpolation isn't possible (caller falls back to the face normal).
26
+ */
27
+ function interpolateLocalNormal(geom, face, localPoint, out) {
28
+ const posAttr = geom.getAttribute("position");
29
+ const norAttr = geom.getAttribute("normal");
30
+ if (!posAttr || !norAttr)
31
+ return false;
32
+ _pa.fromBufferAttribute(posAttr, face.a);
33
+ _pb.fromBufferAttribute(posAttr, face.b);
34
+ _pc.fromBufferAttribute(posAttr, face.c);
35
+ // Barycentric coordinates (local space): u/v/w
36
+ _v0.subVectors(_pb, _pa);
37
+ _v1.subVectors(_pc, _pa);
38
+ _v2.subVectors(localPoint, _pa);
39
+ const d00 = _v0.dot(_v0);
40
+ const d01 = _v0.dot(_v1);
41
+ const d11 = _v1.dot(_v1);
42
+ const d20 = _v2.dot(_v0);
43
+ const d21 = _v2.dot(_v1);
44
+ const denom = d00 * d11 - d01 * d01;
45
+ if (Math.abs(denom) < 1e-12)
46
+ return false;
47
+ const v = (d11 * d20 - d01 * d21) / denom;
48
+ const w = (d00 * d21 - d01 * d20) / denom;
49
+ const u = 1 - v - w;
50
+ _na.fromBufferAttribute(norAttr, face.a);
51
+ _nb.fromBufferAttribute(norAttr, face.b);
52
+ _nc.fromBufferAttribute(norAttr, face.c);
53
+ out
54
+ .set(0, 0, 0)
55
+ .addScaledVector(_na, u)
56
+ .addScaledVector(_nb, v)
57
+ .addScaledVector(_nc, w);
58
+ if (out.lengthSq() < 1e-12)
59
+ return false;
60
+ out.normalize();
61
+ return true;
62
+ }
63
+ /**
64
+ * Project screen coordinates (clientX/Y) onto the mesh surface, returning the hit point,
65
+ * world-space normal, and faceIndex. Returns null on a miss. Local implementation that does not
66
+ * depend on Copper3D's unexported raycast internals.
7
67
  */
8
68
  export function raycastSurface(camera, container, mesh, clientX, clientY) {
9
69
  var _a;
@@ -18,9 +78,15 @@ export function raycastSurface(camera, container, mesh, clientX, clientY) {
18
78
  const point = h.point.clone();
19
79
  const normal = new THREE.Vector3(0, 0, 1);
20
80
  if (h.face) {
21
- normal.copy(h.face.normal);
22
- const nm = new THREE.Matrix3().getNormalMatrix(mesh.matrixWorld);
23
- normal.applyMatrix3(nm).normalize();
81
+ // Prefer a smooth interpolated normal (stable outward direction on bumpy/voxel meshes);
82
+ // fall back to the flat face normal if the geometry has no normal attribute.
83
+ _lp.copy(h.point);
84
+ mesh.worldToLocal(_lp);
85
+ if (!interpolateLocalNormal(mesh.geometry, h.face, _lp, normal)) {
86
+ normal.copy(h.face.normal);
87
+ }
88
+ _nm.getNormalMatrix(mesh.matrixWorld);
89
+ normal.applyMatrix3(_nm).normalize();
24
90
  }
25
91
  return { point, normal, faceIndex: (_a = h.faceIndex) !== null && _a !== void 0 ? _a : -1 };
26
92
  }
@@ -1 +1 @@
1
- {"version":3,"file":"raycastSurface.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/raycastSurface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;AAClC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA+B,EAC/B,SAAsB,EACtB,IAAgB,EAChB,OAAe,EACf,OAAe;;IAEf,MAAM,IAAI,GAAG,SAAS,CAAC,qBAAqB,EAAE,CAAC;IAC/C,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrD,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtD,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC,IAAI,EAAE;QACV,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,EAAE,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;KACrC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAA,CAAC,CAAC,SAAS,mCAAI,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"raycastSurface.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/raycastSurface.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import * as THREE from "three";
2
2
  import type { AnnotationVertex, SurfaceHit } from "./types";
3
3
  /**
4
- * 模式 A(自由手绘)一笔的状态机。
5
- * pointermove 时不断 addSample;与上一采样点世界距离 < minGap 的样本丢弃,避免过密。
6
- * 顶点以 local 存(由 mesh 把世界命中点转 local)。
4
+ * State machine for one stroke in mode A (freehand).
5
+ * On pointermove it keeps calling addSample; samples whose world distance from the previous
6
+ * sample is < minGap are dropped to avoid over-density.
7
+ * Vertices are stored in local space (the mesh converts the world hit point to local).
7
8
  */
8
9
  export declare class StrokeContour {
9
10
  private minGap;
@@ -14,9 +15,11 @@ export declare class StrokeContour {
14
15
  private lastNormal;
15
16
  private has;
16
17
  /**
17
- * @param minGap 采样最小间距(世界系),去抖
18
- * @param maxJump 跳变阈值(世界系):距离 > maxJump 且法线大幅翻转时丢弃该样本,
19
- * 避免笔触掠过沟缝/轮廓边时相邻点落在不同深度、直线段横穿模型。
18
+ * @param minGap minimum sample spacing (world space), debounce
19
+ * @param maxJump jump threshold (world space): drop the sample when distance > maxJump and the
20
+ * normal flips sharply, to prevent adjacent points landing at different depths
21
+ * (and the straight segment cutting through the model) when the stroke grazes a
22
+ * groove or contour edge.
20
23
  */
21
24
  constructor(minGap: number, maxJump: number, mesh: THREE.Mesh);
22
25
  begin(): void;
@@ -1,15 +1,18 @@
1
1
  import * as THREE from "three";
2
2
  import { worldHitToLocalVertex } from "./types";
3
3
  /**
4
- * 模式 A(自由手绘)一笔的状态机。
5
- * pointermove 时不断 addSample;与上一采样点世界距离 < minGap 的样本丢弃,避免过密。
6
- * 顶点以 local 存(由 mesh 把世界命中点转 local)。
4
+ * State machine for one stroke in mode A (freehand).
5
+ * On pointermove it keeps calling addSample; samples whose world distance from the previous
6
+ * sample is < minGap are dropped to avoid over-density.
7
+ * Vertices are stored in local space (the mesh converts the world hit point to local).
7
8
  */
8
9
  export class StrokeContour {
9
10
  /**
10
- * @param minGap 采样最小间距(世界系),去抖
11
- * @param maxJump 跳变阈值(世界系):距离 > maxJump 且法线大幅翻转时丢弃该样本,
12
- * 避免笔触掠过沟缝/轮廓边时相邻点落在不同深度、直线段横穿模型。
11
+ * @param minGap minimum sample spacing (world space), debounce
12
+ * @param maxJump jump threshold (world space): drop the sample when distance > maxJump and the
13
+ * normal flips sharply, to prevent adjacent points landing at different depths
14
+ * (and the straight segment cutting through the model) when the stroke grazes a
15
+ * groove or contour edge.
13
16
  */
14
17
  constructor(minGap, maxJump, mesh) {
15
18
  this.minGap = minGap;
@@ -28,10 +31,12 @@ export class StrokeContour {
28
31
  if (this.has) {
29
32
  const d = hit.point.distanceTo(this.last);
30
33
  if (d < this.minGap)
31
- return; // 太近,去抖
32
- // 跳变剔除:距离突然很大「且」法线大幅翻转(>~75°)→ 多半跳到了背面/远面,丢弃,
33
- // 否则相邻两点之间的直线段会横穿模型内部。两个条件同时满足才剔除:
34
- // 快速画(距离大、法线相近)不误删;画过尖锐棱边(法线变、距离近)也不误删。
34
+ return; // too close, debounce
35
+ // Jump rejection: distance suddenly large AND normal flips sharply (>~75°) likely jumped to
36
+ // the back/far side, so drop it, otherwise the straight segment between adjacent points cuts
37
+ // through the model interior. Only reject when both conditions hold:
38
+ // fast drawing (large distance, similar normals) isn't falsely dropped, and drawing over a
39
+ // sharp edge (normal changes, distance small) isn't falsely dropped either.
35
40
  if (d > this.maxJump && hit.normal.dot(this.lastNormal) < 0.25)
36
41
  return;
37
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"strokeContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/strokeContour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAMxB;;;;OAIG;IACH,YACU,MAAc,EACd,OAAe,EACf,IAAgB;QAFhB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAY;QAblB,UAAK,GAAuB,EAAE,CAAC;QAC/B,SAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3B,eAAU,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,QAAG,GAAG,KAAK,CAAC;IAWjB,CAAC;IAEJ,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,GAAe;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,QAAQ;YACrC,8CAA8C;YAC9C,mCAAmC;YACnC,wCAAwC;YACxC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI;gBAAE,OAAO;SACxE;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
1
+ {"version":3,"file":"strokeContour.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/strokeContour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IAMxB;;;;;;OAMG;IACH,YACU,MAAc,EACd,OAAe,EACf,IAAgB;QAFhB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAY;QAflB,UAAK,GAAuB,EAAE,CAAC;QAC/B,SAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3B,eAAU,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACjC,QAAG,GAAG,KAAK,CAAC;IAajB,CAAC;IAEJ,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,GAAe;QACvB,IAAI,IAAI,CAAC,GAAG,EAAE;YACZ,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;gBAAE,OAAO,CAAC,sBAAsB;YACnD,8FAA8F;YAC9F,6FAA6F;YAC7F,qEAAqE;YACrE,2FAA2F;YAC3F,4EAA4E;YAC5E,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI;gBAAE,OAAO;SACxE;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
@@ -5,7 +5,7 @@ export interface SurfaceHit {
5
5
  normal: THREE.Vector3;
6
6
  faceIndex: number;
7
7
  }
8
- /** 标注顶点:位置与法线均为 **模型 local 空间**(单一真源,不受相机/摆放影响) */
8
+ /** Annotation vertex: position and normal are both in **model local space** (single source of truth, unaffected by camera/placement). */
9
9
  export interface AnnotationVertex {
10
10
  x: number;
11
11
  y: number;
@@ -26,14 +26,14 @@ export interface Annotation {
26
26
  object3D: THREE.Object3D | null;
27
27
  }
28
28
  export interface ExportOptions {
29
- /** 导出坐标空间,默认 "local"(模型空间,可复现、不受相机/摆放影响) */
29
+ /** Export coordinate space, defaults to "local" (model space, reproducible and unaffected by camera/placement). */
30
30
  space?: "local" | "world";
31
- /** 是否在每个点附带法线 [x,y,z,nx,ny,nz] */
31
+ /** Whether to attach a normal to each point [x,y,z,nx,ny,nz]. */
32
32
  includeNormals?: boolean;
33
33
  }
34
- /** 世界系命中点 → local 顶点(位置 worldToLocal,法线用逆变换) */
34
+ /** World-space hit point → local vertex (position via worldToLocal, normal via inverse transform). */
35
35
  export declare function worldHitToLocalVertex(h: SurfaceHit, mesh: THREE.Mesh): AnnotationVertex;
36
- /** local 顶点 → world 位置 + world 法线(供渲染) */
36
+ /** Local vertex → world position + world normal (for rendering). */
37
37
  export declare function localVertexToWorld(v: AnnotationVertex, mesh: THREE.Mesh): {
38
38
  p: THREE.Vector3;
39
39
  n: THREE.Vector3;
@@ -1,6 +1,6 @@
1
1
  import * as THREE from "three";
2
2
  const _inv = new THREE.Matrix4();
3
- /** 世界系命中点 → local 顶点(位置 worldToLocal,法线用逆变换) */
3
+ /** World-space hit point → local vertex (position via worldToLocal, normal via inverse transform). */
4
4
  export function worldHitToLocalVertex(h, mesh) {
5
5
  const lp = mesh.worldToLocal(h.point.clone());
6
6
  _inv.copy(mesh.matrixWorld).invert();
@@ -16,7 +16,7 @@ export function worldHitToLocalVertex(h, mesh) {
16
16
  };
17
17
  }
18
18
  const _nm = new THREE.Matrix3();
19
- /** local 顶点 → world 位置 + world 法线(供渲染) */
19
+ /** Local vertex → world position + world normal (for rendering). */
20
20
  export function localVertexToWorld(v, mesh) {
21
21
  const p = new THREE.Vector3(v.x, v.y, v.z).applyMatrix4(mesh.matrixWorld);
22
22
  _nm.getNormalMatrix(mesh.matrixWorld);
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuC/B,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAEjC,iDAAiD;AACjD,MAAM,UAAU,qBAAqB,CACnC,CAAa,EACb,IAAgB;IAEhB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;IACjE,OAAO;QACL,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,EAAE,EAAE,EAAE,CAAC,CAAC;QACR,EAAE,EAAE,EAAE,CAAC,CAAC;QACR,EAAE,EAAE,EAAE,CAAC,CAAC;QACR,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAEhC,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CAChC,CAAmB,EACnB,IAAgB;IAEhB,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1E,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Utils/surfaceAnnotation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAuC/B,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAEjC,sGAAsG;AACtG,MAAM,UAAU,qBAAqB,CACnC,CAAa,EACb,IAAgB;IAEhB,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;IACjE,OAAO;QACL,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,EAAE,EAAE,EAAE,CAAC,CAAC;QACR,EAAE,EAAE,EAAE,CAAC,CAAC;QACR,EAAE,EAAE,EAAE,CAAC,CAAC;QACR,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;AAEhC,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CAChC,CAAmB,EACnB,IAAgB;IAEhB,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1E,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5E,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AAClB,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import * as THREE from "three";
2
2
  import { getLut } from "../Loader/copperDicomLoader";
3
- import vert_2d from "../lib/shader/texture2d_vertex.glsl";
4
- import frag_2d from "../lib/shader/texture2d_frag.glsl";
3
+ // Loaded as raw strings (?raw) — no GLSL/glslify handler in this app's Vite build, and the
4
+ // 2D texture/volume path that uses these is never exercised by the surface annotator.
5
+ import vert_2d from "../lib/shader/texture2d_vertex.glsl?raw";
6
+ import frag_2d from "../lib/shader/texture2d_frag.glsl?raw";
5
7
  let planeWidth = 80;
6
8
  let planeHeight = 80;
7
9
  // Build a quad from the 4 world-space image-plane corners (preserves real pose).
@@ -1 +1 @@
1
- {"version":3,"file":"texture2d.js","sourceRoot":"","sources":["../../src/Utils/texture2d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"texture2d.js","sourceRoot":"","sources":["../../src/Utils/texture2d.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,13 @@
1
1
  addEventListener("message", (event) => {
2
2
  const data = event.data;
3
3
  if (data.type === "reformat") {
4
- // Worker 中执行计算量大的代码
4
+ // Run the compute-heavy code inside the Worker
5
5
  const masks = restructData(data.masksData, data.len, data.width, data.height);
6
6
  const result = {
7
7
  masks,
8
8
  type: "reformat",
9
9
  };
10
- // 发送计算结果到主线程
10
+ // Send the computed result back to the main thread
11
11
  postMessage(result);
12
12
  }
13
13
  else if (data.type === "saveBlob") {
@@ -1 +1 @@
1
- {"version":3,"file":"reformatSaveDataWorker.js","sourceRoot":"","sources":["../../../src/Utils/workers/reformatSaveDataWorker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reformatSaveDataWorker.js","sourceRoot":"","sources":["../../../src/Utils/workers/reformatSaveDataWorker.ts"],"names":[],"mappings":"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"}