@d5techs/3dgs-lib 1.4.77 → 1.4.79

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.
package/dist/3dgs-lib.cjs CHANGED
@@ -17615,19 +17615,19 @@ class SphereSelection {
17615
17615
  inputWrap.style.cssText = "display:inline-flex; align-items:center; gap:2px;";
17616
17616
  const input = document.createElement("input");
17617
17617
  input.type = "number";
17618
- input.min = "0.01";
17619
- input.step = "0.1";
17620
- input.value = this._radius.toFixed(2);
17618
+ input.min = "1";
17619
+ input.step = "1";
17620
+ input.value = String(this._radius);
17621
17621
  input.style.cssText = `
17622
- width:50px; padding:3px 4px; border:1px solid #555; border-radius:4px;
17622
+ width:40px; padding:3px 4px; border:1px solid #555; border-radius:4px;
17623
17623
  background:#222; color:#ddd; font-size:12px; text-align:center;
17624
17624
  `;
17625
17625
  const label = document.createElement("span");
17626
17626
  label.textContent = "Radius";
17627
17627
  label.style.cssText = "color:#888; font-size:11px;";
17628
17628
  input.addEventListener("change", () => {
17629
- const v = Math.max(0.01, parseFloat(input.value) || 0.01);
17630
- input.value = v.toFixed(2);
17629
+ const v = Math.max(1, Math.round(parseFloat(input.value) || 1));
17630
+ input.value = String(v);
17631
17631
  this._radius = v;
17632
17632
  this.callbacks.onRadiusChanged(v);
17633
17633
  });
@@ -17644,8 +17644,8 @@ class SphereSelection {
17644
17644
  return this._radius;
17645
17645
  }
17646
17646
  setRadius(radius) {
17647
- this._radius = radius;
17648
- this.radiusInput.value = radius.toFixed(2);
17647
+ this._radius = Math.round(radius);
17648
+ this.radiusInput.value = String(this._radius);
17649
17649
  }
17650
17650
  activate() {
17651
17651
  this.toolbar.style.display = "flex";
@@ -17704,19 +17704,19 @@ class BoxSelection {
17704
17704
  wrap.style.cssText = "display:inline-flex; align-items:center; gap:2px;";
17705
17705
  const input = document.createElement("input");
17706
17706
  input.type = "number";
17707
- input.min = "0.01";
17708
- input.step = "0.1";
17709
- input.value = initial.toFixed(2);
17707
+ input.min = "1";
17708
+ input.step = "1";
17709
+ input.value = String(Math.round(initial));
17710
17710
  input.style.cssText = `
17711
- width:50px; padding:3px 4px; border:1px solid #555; border-radius:4px;
17711
+ width:40px; padding:3px 4px; border:1px solid #555; border-radius:4px;
17712
17712
  background:#222; color:#ddd; font-size:12px; text-align:center;
17713
17713
  `;
17714
17714
  const label = document.createElement("span");
17715
17715
  label.textContent = placeholder;
17716
17716
  label.style.cssText = "color:#888; font-size:11px;";
17717
17717
  input.addEventListener("change", () => {
17718
- const v = Math.max(0.01, parseFloat(input.value) || 0.01);
17719
- input.value = v.toFixed(2);
17718
+ const v = Math.max(1, Math.round(parseFloat(input.value) || 1));
17719
+ input.value = String(v);
17720
17720
  onChange(v);
17721
17721
  });
17722
17722
  wrap.appendChild(input);
@@ -17759,12 +17759,12 @@ class BoxSelection {
17759
17759
  return this._lenZ;
17760
17760
  }
17761
17761
  setDimensions(lenX, lenY, lenZ) {
17762
- this._lenX = lenX;
17763
- this._lenY = lenY;
17764
- this._lenZ = lenZ;
17765
- this.inputX.value = lenX.toFixed(2);
17766
- this.inputY.value = lenY.toFixed(2);
17767
- this.inputZ.value = lenZ.toFixed(2);
17762
+ this._lenX = Math.round(lenX);
17763
+ this._lenY = Math.round(lenY);
17764
+ this._lenZ = Math.round(lenZ);
17765
+ this.inputX.value = String(this._lenX);
17766
+ this.inputY.value = String(this._lenY);
17767
+ this.inputZ.value = String(this._lenZ);
17768
17768
  }
17769
17769
  activate() {
17770
17770
  this.toolbar.style.display = "flex";
@@ -17877,8 +17877,10 @@ function exportEditedPLY(positions, scales, rotations, colors, opacities, shCoef
17877
17877
  }
17878
17878
  return buffer;
17879
17879
  }
17880
- const SPHERE_SEGMENTS = 64;
17881
- const SPHERE_RINGS = 3;
17880
+ const SEG = 64;
17881
+ const LAT_COUNT = 8;
17882
+ const LON_COUNT = 12;
17883
+ const BOX_GRID_SUBDIV = 4;
17882
17884
  class SelectionVolumeRenderer {
17883
17885
  constructor(renderer, camera) {
17884
17886
  __publicField(this, "renderer");
@@ -17889,16 +17891,14 @@ class SelectionVolumeRenderer {
17889
17891
  __publicField(this, "vertexBuffer", null);
17890
17892
  __publicField(this, "_volume", { type: null, center: [0, 0, 0], dimensions: [2, 2, 2] });
17891
17893
  __publicField(this, "vertexCount", 0);
17892
- __publicField(this, "maxVertices");
17893
- __publicField(this, "lineColor", [0.2, 0.8, 1]);
17894
+ __publicField(this, "lineColor", [0.4, 0.9, 1]);
17894
17895
  this.renderer = renderer;
17895
17896
  this.camera = camera;
17896
- this.maxVertices = Math.max(
17897
- 24,
17898
- SPHERE_SEGMENTS * 2 * SPHERE_RINGS
17899
- );
17900
17897
  this.createPipeline();
17901
- this.createVertexBuffer();
17898
+ this.vertexBuffer = this.renderer.device.createBuffer({
17899
+ size: 65536,
17900
+ usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST
17901
+ });
17902
17902
  }
17903
17903
  get volume() {
17904
17904
  return this._volume;
@@ -17932,7 +17932,7 @@ class SelectionVolumeRenderer {
17932
17932
  return o;
17933
17933
  }
17934
17934
  @fragment fn fs(i: VO) -> @location(0) vec4<f32> {
17935
- return vec4(i.color, 0.8);
17935
+ return vec4(i.color, 0.6);
17936
17936
  }
17937
17937
  `
17938
17938
  );
@@ -17970,78 +17970,115 @@ class SelectionVolumeRenderer {
17970
17970
  depthStencil: { format: this.renderer.depthFormat, depthWriteEnabled: false, depthCompare: "always" }
17971
17971
  });
17972
17972
  }
17973
- createVertexBuffer() {
17974
- const size = this.maxVertices * 24;
17975
- this.vertexBuffer = this.renderer.device.createBuffer({
17976
- size,
17977
- usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST
17978
- });
17979
- }
17973
+ // ========== Box: 12 edges + grid lines on all 6 faces ==========
17980
17974
  generateBoxVertices() {
17981
17975
  const [cx, cy, cz] = this._volume.center;
17982
17976
  const [lx, ly, lz] = this._volume.dimensions;
17983
17977
  const hx = lx / 2, hy = ly / 2, hz = lz / 2;
17984
17978
  const [r, g, b] = this.lineColor;
17985
17979
  const v = [];
17986
- const addLine = (x12, y12, z12, x2, y2, z2) => {
17980
+ const line = (x12, y12, z12, x2, y2, z2) => {
17987
17981
  v.push(x12, y12, z12, r, g, b, x2, y2, z2, r, g, b);
17988
17982
  };
17989
17983
  const x0 = cx - hx, x1 = cx + hx;
17990
17984
  const y0 = cy - hy, y1 = cy + hy;
17991
17985
  const z0 = cz - hz, z1 = cz + hz;
17992
- addLine(x0, y0, z0, x1, y0, z0);
17993
- addLine(x1, y0, z0, x1, y0, z1);
17994
- addLine(x1, y0, z1, x0, y0, z1);
17995
- addLine(x0, y0, z1, x0, y0, z0);
17996
- addLine(x0, y1, z0, x1, y1, z0);
17997
- addLine(x1, y1, z0, x1, y1, z1);
17998
- addLine(x1, y1, z1, x0, y1, z1);
17999
- addLine(x0, y1, z1, x0, y1, z0);
18000
- addLine(x0, y0, z0, x0, y1, z0);
18001
- addLine(x1, y0, z0, x1, y1, z0);
18002
- addLine(x1, y0, z1, x1, y1, z1);
18003
- addLine(x0, y0, z1, x0, y1, z1);
17986
+ line(x0, y0, z0, x1, y0, z0);
17987
+ line(x1, y0, z0, x1, y0, z1);
17988
+ line(x1, y0, z1, x0, y0, z1);
17989
+ line(x0, y0, z1, x0, y0, z0);
17990
+ line(x0, y1, z0, x1, y1, z0);
17991
+ line(x1, y1, z0, x1, y1, z1);
17992
+ line(x1, y1, z1, x0, y1, z1);
17993
+ line(x0, y1, z1, x0, y1, z0);
17994
+ line(x0, y0, z0, x0, y1, z0);
17995
+ line(x1, y0, z0, x1, y1, z0);
17996
+ line(x1, y0, z1, x1, y1, z1);
17997
+ line(x0, y0, z1, x0, y1, z1);
17998
+ const n = BOX_GRID_SUBDIV;
17999
+ for (let i = 1; i < n; i++) {
18000
+ const t = i / n;
18001
+ const px = x0 + (x1 - x0) * t;
18002
+ const pz = z0 + (z1 - z0) * t;
18003
+ line(px, y0, z0, px, y0, z1);
18004
+ line(px, y1, z0, px, y1, z1);
18005
+ line(x0, y0, pz, x1, y0, pz);
18006
+ line(x0, y1, pz, x1, y1, pz);
18007
+ }
18008
+ for (let i = 1; i < n; i++) {
18009
+ const t = i / n;
18010
+ const px = x0 + (x1 - x0) * t;
18011
+ const py = y0 + (y1 - y0) * t;
18012
+ line(px, y0, z0, px, y1, z0);
18013
+ line(px, y0, z1, px, y1, z1);
18014
+ line(x0, py, z0, x1, py, z0);
18015
+ line(x0, py, z1, x1, py, z1);
18016
+ }
18017
+ for (let i = 1; i < n; i++) {
18018
+ const t = i / n;
18019
+ const py = y0 + (y1 - y0) * t;
18020
+ const pz = z0 + (z1 - z0) * t;
18021
+ line(x0, py, z0, x0, py, z1);
18022
+ line(x1, py, z0, x1, py, z1);
18023
+ line(x0, y0, pz, x0, y1, pz);
18024
+ line(x1, y0, pz, x1, y1, pz);
18025
+ }
18004
18026
  return new Float32Array(v);
18005
18027
  }
18028
+ // ========== Sphere: latitude + longitude rings ==========
18006
18029
  generateSphereVertices() {
18007
18030
  const [cx, cy, cz] = this._volume.center;
18008
18031
  const radius = this._volume.dimensions[0];
18009
18032
  const [r, g, b] = this.lineColor;
18010
18033
  const v = [];
18011
- const seg = SPHERE_SEGMENTS;
18012
- const addCircle = (axis) => {
18013
- for (let i = 0; i < seg; i++) {
18014
- const a0 = i / seg * Math.PI * 2;
18015
- const a1 = (i + 1) / seg * Math.PI * 2;
18016
- let x0, y0, z0, x1, y1, z1;
18017
- if (axis === "y") {
18018
- x0 = cx + Math.cos(a0) * radius;
18019
- y0 = cy;
18020
- z0 = cz + Math.sin(a0) * radius;
18021
- x1 = cx + Math.cos(a1) * radius;
18022
- y1 = cy;
18023
- z1 = cz + Math.sin(a1) * radius;
18024
- } else if (axis === "x") {
18025
- x0 = cx;
18026
- y0 = cy + Math.cos(a0) * radius;
18027
- z0 = cz + Math.sin(a0) * radius;
18028
- x1 = cx;
18029
- y1 = cy + Math.cos(a1) * radius;
18030
- z1 = cz + Math.sin(a1) * radius;
18031
- } else {
18032
- x0 = cx + Math.cos(a0) * radius;
18033
- y0 = cy + Math.sin(a0) * radius;
18034
- z0 = cz;
18035
- x1 = cx + Math.cos(a1) * radius;
18036
- y1 = cy + Math.sin(a1) * radius;
18037
- z1 = cz;
18038
- }
18039
- v.push(x0, y0, z0, r, g, b, x1, y1, z1, r, g, b);
18034
+ const addRing = (centerY, ringRadius) => {
18035
+ for (let i = 0; i < SEG; i++) {
18036
+ const a0 = i / SEG * Math.PI * 2;
18037
+ const a1 = (i + 1) / SEG * Math.PI * 2;
18038
+ v.push(
18039
+ cx + Math.cos(a0) * ringRadius,
18040
+ cy + centerY,
18041
+ cz + Math.sin(a0) * ringRadius,
18042
+ r,
18043
+ g,
18044
+ b,
18045
+ cx + Math.cos(a1) * ringRadius,
18046
+ cy + centerY,
18047
+ cz + Math.sin(a1) * ringRadius,
18048
+ r,
18049
+ g,
18050
+ b
18051
+ );
18040
18052
  }
18041
18053
  };
18042
- addCircle("x");
18043
- addCircle("y");
18044
- addCircle("z");
18054
+ for (let i = 0; i <= LAT_COUNT; i++) {
18055
+ const phi = -Math.PI / 2 + i / LAT_COUNT * Math.PI;
18056
+ const y = Math.sin(phi) * radius;
18057
+ const ringR = Math.cos(phi) * radius;
18058
+ if (ringR < 1e-3) continue;
18059
+ addRing(y, ringR);
18060
+ }
18061
+ for (let j = 0; j < LON_COUNT; j++) {
18062
+ const theta = j / LON_COUNT * Math.PI;
18063
+ for (let i = 0; i < SEG; i++) {
18064
+ const phi0 = i / SEG * Math.PI * 2;
18065
+ const phi1 = (i + 1) / SEG * Math.PI * 2;
18066
+ v.push(
18067
+ cx + Math.cos(phi0) * Math.sin(theta) * radius,
18068
+ cy + Math.sin(phi0) * radius,
18069
+ cz + Math.cos(phi0) * Math.cos(theta) * radius,
18070
+ r,
18071
+ g,
18072
+ b,
18073
+ cx + Math.cos(phi1) * Math.sin(theta) * radius,
18074
+ cy + Math.sin(phi1) * radius,
18075
+ cz + Math.cos(phi1) * Math.cos(theta) * radius,
18076
+ r,
18077
+ g,
18078
+ b
18079
+ );
18080
+ }
18081
+ }
18045
18082
  return new Float32Array(v);
18046
18083
  }
18047
18084
  render(pass) {
@@ -18154,16 +18191,13 @@ class SplatEditor {
18154
18191
  this.toolOverlay.style.display = name && !isVolumeTool ? "block" : "none";
18155
18192
  if (isVolumeTool && this.volumeRenderer) {
18156
18193
  const volType = name;
18157
- const bounds = this.getModelBounds();
18158
- const defaultSize = Math.max(bounds.size[0], bounds.size[1], bounds.size[2]) * 0.3;
18159
- const safeSize = Math.max(defaultSize, 0.5);
18194
+ const center = this.getModelCenter();
18160
18195
  if (volType === "box") {
18161
- this.boxTool.setDimensions(safeSize, safeSize, safeSize);
18162
- this.volumeRenderer.setVolume("box", bounds.center, [safeSize, safeSize, safeSize]);
18196
+ const lx = this.boxTool.lenX, ly = this.boxTool.lenY, lz = this.boxTool.lenZ;
18197
+ this.volumeRenderer.setVolume("box", center, [lx, ly, lz]);
18163
18198
  } else {
18164
- const r = safeSize / 2;
18165
- this.sphereTool.setRadius(r);
18166
- this.volumeRenderer.setVolume("sphere", bounds.center, [r, 0, 0]);
18199
+ const r = this.sphereTool.radius;
18200
+ this.volumeRenderer.setVolume("sphere", center, [r, 0, 0]);
18167
18201
  }
18168
18202
  (_b2 = (_a2 = this.callbacks).onVolumeToolActivated) == null ? void 0 : _b2.call(_a2, this.volumeRenderer.volume);
18169
18203
  } else {