@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 +124 -90
- package/dist/3dgs-lib.cjs.map +1 -1
- package/dist/3dgs-lib.js +124 -90
- package/dist/3dgs-lib.js.map +1 -1
- package/dist/editor/SelectionVolumeRenderer.d.ts +0 -2
- package/package.json +1 -1
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 = "
|
|
17619
|
-
input.step = "
|
|
17620
|
-
input.value = this._radius
|
|
17618
|
+
input.min = "1";
|
|
17619
|
+
input.step = "1";
|
|
17620
|
+
input.value = String(this._radius);
|
|
17621
17621
|
input.style.cssText = `
|
|
17622
|
-
width:
|
|
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(
|
|
17630
|
-
input.value = v
|
|
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 =
|
|
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 = "
|
|
17708
|
-
input.step = "
|
|
17709
|
-
input.value =
|
|
17707
|
+
input.min = "1";
|
|
17708
|
+
input.step = "1";
|
|
17709
|
+
input.value = String(Math.round(initial));
|
|
17710
17710
|
input.style.cssText = `
|
|
17711
|
-
width:
|
|
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(
|
|
17719
|
-
input.value = v
|
|
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 =
|
|
17766
|
-
this.inputY.value =
|
|
17767
|
-
this.inputZ.value =
|
|
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
|
|
17881
|
-
const
|
|
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, "
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
17993
|
-
|
|
17994
|
-
|
|
17995
|
-
|
|
17996
|
-
|
|
17997
|
-
|
|
17998
|
-
|
|
17999
|
-
|
|
18000
|
-
|
|
18001
|
-
|
|
18002
|
-
|
|
18003
|
-
|
|
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
|
|
18012
|
-
|
|
18013
|
-
|
|
18014
|
-
const
|
|
18015
|
-
|
|
18016
|
-
|
|
18017
|
-
|
|
18018
|
-
|
|
18019
|
-
|
|
18020
|
-
|
|
18021
|
-
|
|
18022
|
-
|
|
18023
|
-
|
|
18024
|
-
|
|
18025
|
-
|
|
18026
|
-
|
|
18027
|
-
|
|
18028
|
-
|
|
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
|
-
|
|
18043
|
-
|
|
18044
|
-
|
|
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
|
|
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.
|
|
18162
|
-
this.volumeRenderer.setVolume("box",
|
|
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 =
|
|
18165
|
-
this.
|
|
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 {
|