@d5techs/3dgs-lib 1.4.75 → 1.4.77

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/App.d.ts CHANGED
@@ -80,6 +80,8 @@ export declare class App {
80
80
  private lastAppliedRenderScale;
81
81
  private baseRenderScale;
82
82
  private boundOnResize;
83
+ /** 额外渲染回调(在 gizmo 之前、场景辅助之后执行) */
84
+ private extraRenderCallbacks;
83
85
  constructor(canvas: HTMLCanvasElement);
84
86
  /**
85
87
  * 初始化应用
@@ -210,6 +212,11 @@ export declare class App {
210
212
  */
211
213
  createSplatBoundingBoxProvider(): SplatBoundingBoxProvider | null;
212
214
  getRenderer(): Renderer;
215
+ /**
216
+ * 注册额外的渲染回调(在场景辅助之后、gizmo 之前执行)
217
+ */
218
+ addRenderCallback(cb: (pass: GPURenderPassEncoder) => void): void;
219
+ removeRenderCallback(cb: (pass: GPURenderPassEncoder) => void): void;
213
220
  /**
214
221
  * CPU splat 拾取:在屏幕坐标 (clientX, clientY) 处找最近的 splat,返回世界坐标或 null
215
222
  */
@@ -0,0 +1,32 @@
1
+ import { Renderer } from "../core/Renderer";
2
+ import { Camera } from "../core/Camera";
3
+ export type VolumeType = 'box' | 'sphere' | null;
4
+ export interface VolumeState {
5
+ type: VolumeType;
6
+ center: [number, number, number];
7
+ /** box: [lenX, lenY, lenZ]; sphere: [radius, 0, 0] */
8
+ dimensions: [number, number, number];
9
+ }
10
+ export declare class SelectionVolumeRenderer {
11
+ private renderer;
12
+ private camera;
13
+ private pipeline;
14
+ private uniformBuffer;
15
+ private bindGroup;
16
+ private vertexBuffer;
17
+ private _volume;
18
+ private vertexCount;
19
+ private maxVertices;
20
+ private lineColor;
21
+ constructor(renderer: Renderer, camera: Camera);
22
+ get volume(): VolumeState;
23
+ setVolume(type: VolumeType, center?: [number, number, number], dimensions?: [number, number, number]): void;
24
+ setCenter(x: number, y: number, z: number): void;
25
+ setDimensions(a: number, b: number, c: number): void;
26
+ private createPipeline;
27
+ private createVertexBuffer;
28
+ private generateBoxVertices;
29
+ private generateSphereVertices;
30
+ render(pass: GPURenderPassEncoder): void;
31
+ destroy(): void;
32
+ }
@@ -5,20 +5,29 @@
5
5
  * 将 splat 中心投影到屏幕空间来判断哪些 splat 在选区内。
6
6
  */
7
7
  import type { Camera } from '../core/Camera';
8
+ import type { Renderer } from '../core/Renderer';
9
+ import type { TransformableObject } from '../core/gizmo/TransformGizmo';
8
10
  import type { GSSplatRenderer } from '../gs/GSSplatRenderer';
9
11
  import type { CompactSplatData } from '../gs/PLYLoaderMobile';
10
12
  import { SplatState } from './SplatState';
11
13
  import { EditHistory } from './EditHistory';
12
14
  import { ToolManager } from './tools/ToolManager';
15
+ import { SelectionVolumeRenderer } from './SelectionVolumeRenderer';
16
+ import type { VolumeState } from './SelectionVolumeRenderer';
13
17
  export interface SplatEditorCallbacks {
14
18
  onStateChanged?: () => void;
15
19
  onToolChanged?: (tool: string | null) => void;
16
20
  onHistoryChanged?: (canUndo: boolean, canRedo: boolean) => void;
17
21
  /** 退出编辑模式时调用,传回精简后的 CompactSplatData(已剔除删除的 splat) */
18
22
  onApplyEdits?: (newData: CompactSplatData) => void;
23
+ /** 体积选择工具激活时调用(返回当前 volume state) */
24
+ onVolumeToolActivated?: (volume: VolumeState) => void;
25
+ /** 体积选择工具停用时调用 */
26
+ onVolumeToolDeactivated?: () => void;
19
27
  }
20
28
  export declare class SplatEditor {
21
29
  private camera;
30
+ private gpuRenderer;
22
31
  private gsRenderer;
23
32
  private container;
24
33
  private splatState;
@@ -33,7 +42,11 @@ export declare class SplatEditor {
33
42
  private projDirty;
34
43
  private _active;
35
44
  private overlayCleanup;
36
- constructor(camera: Camera, gsRenderer: GSSplatRenderer, container: HTMLElement, callbacks?: SplatEditorCallbacks);
45
+ /** 体积选择线框渲染器 */
46
+ volumeRenderer: SelectionVolumeRenderer | null;
47
+ private boxTool;
48
+ private sphereTool;
49
+ constructor(camera: Camera, gsRenderer: GSSplatRenderer, container: HTMLElement, callbacks?: SplatEditorCallbacks, renderer?: Renderer);
37
50
  get active(): boolean;
38
51
  get state(): SplatState;
39
52
  get history(): EditHistory;
@@ -46,6 +59,10 @@ export declare class SplatEditor {
46
59
  * 进入编辑模式
47
60
  */
48
61
  enter(): void;
62
+ /**
63
+ * 渲染体积选择线框(在主渲染 pass 内调用)
64
+ */
65
+ renderVolume(pass: GPURenderPassEncoder): void;
49
66
  /**
50
67
  * 退出编辑模式,将编辑结果永久写入渲染数据
51
68
  */
@@ -71,13 +88,34 @@ export declare class SplatEditor {
71
88
  private selectByMask;
72
89
  private selectByColor;
73
90
  /**
74
- * 球选择:在屏幕空间判断 splat 是否在圆形区域内
91
+ * 世界空间球体选择
92
+ */
93
+ selectByWorldSphere(op: 'add' | 'remove' | 'set', center: [number, number, number], radius: number): void;
94
+ /**
95
+ * 世界空间 AABB 选择
96
+ */
97
+ selectByWorldBox(op: 'add' | 'remove' | 'set', center: [number, number, number], lenX: number, lenY: number, lenZ: number): void;
98
+ /**
99
+ * 应用当前体积选择
100
+ */
101
+ applyVolumeSelection(op: 'add' | 'remove' | 'set'): void;
102
+ /**
103
+ * 设置体积选择的中心位置(供外部 gizmo 调用)
104
+ */
105
+ setVolumeCenter(x: number, y: number, z: number): void;
106
+ /**
107
+ * 获取当前体积状态
108
+ */
109
+ getVolumeState(): VolumeState | null;
110
+ /**
111
+ * 创建体积位置的 TransformableObject 代理,供 gizmo 控制
75
112
  */
76
- private selectBySphere;
113
+ createVolumeTransformProxy(): TransformableObject | null;
77
114
  /**
78
- * 盒选择:在屏幕空间判断 splat 是否在矩形区域内
115
+ * 获取模型世界空间包围盒(中心 + 尺寸)
79
116
  */
80
- private selectByBox;
117
+ private getModelBounds;
118
+ private getModelCenter;
81
119
  /**
82
120
  * 根据屏幕像素坐标,找到最近的可见 splat 并返回其世界坐标及深度换算系数
83
121
  */
@@ -5,3 +5,5 @@ export { EditHistory } from './EditHistory';
5
5
  export { ToolManager } from './tools/ToolManager';
6
6
  export type { Tool } from './tools/ToolManager';
7
7
  export { exportEditedPLY } from './SplatExporter';
8
+ export { SelectionVolumeRenderer } from './SelectionVolumeRenderer';
9
+ export type { VolumeType, VolumeState } from './SelectionVolumeRenderer';
@@ -1,24 +1,24 @@
1
1
  import type { Tool } from './ToolManager';
2
+ export interface BoxSelectionCallbacks {
3
+ onApply: (op: 'add' | 'remove' | 'set') => void;
4
+ onDimensionsChanged: (lenX: number, lenY: number, lenZ: number) => void;
5
+ }
2
6
  export declare class BoxSelection implements Tool {
3
7
  private parent;
4
- private svg;
5
- private rect;
6
- private crossV;
7
- private crossH;
8
- private onSelect;
9
- private center;
10
- private halfW;
11
- private halfH;
12
- private dragId;
13
- constructor(parent: HTMLElement, onSelect: (op: 'add' | 'remove' | 'set', centerPx: {
14
- x: number;
15
- y: number;
16
- }, halfW: number, halfH: number) => void);
8
+ private toolbar;
9
+ private callbacks;
10
+ private _lenX;
11
+ private _lenY;
12
+ private _lenZ;
13
+ private inputX;
14
+ private inputY;
15
+ private inputZ;
16
+ get lenX(): number;
17
+ get lenY(): number;
18
+ get lenZ(): number;
19
+ constructor(parent: HTMLElement, callbacks: BoxSelectionCallbacks);
20
+ setDimensions(lenX: number, lenY: number, lenZ: number): void;
17
21
  activate(): void;
18
22
  deactivate(): void;
19
- private updateVisuals;
20
- private pointerdown;
21
- private pointermove;
22
- private dragEnd;
23
- private pointerup;
23
+ private emitDims;
24
24
  }
@@ -1,21 +1,17 @@
1
1
  import type { Tool } from './ToolManager';
2
+ export interface SphereSelectionCallbacks {
3
+ onApply: (op: 'add' | 'remove' | 'set') => void;
4
+ onRadiusChanged: (radius: number) => void;
5
+ }
2
6
  export declare class SphereSelection implements Tool {
3
7
  private parent;
4
- private svg;
5
- private circle;
6
- private onSelect;
7
- private center;
8
- private radiusPx;
9
- private dragId;
10
- constructor(parent: HTMLElement, onSelect: (op: 'add' | 'remove' | 'set', centerPx: {
11
- x: number;
12
- y: number;
13
- }, radiusPx: number) => void);
8
+ private toolbar;
9
+ private callbacks;
10
+ private _radius;
11
+ private radiusInput;
12
+ get radius(): number;
13
+ constructor(parent: HTMLElement, callbacks: SphereSelectionCallbacks);
14
+ setRadius(radius: number): void;
14
15
  activate(): void;
15
16
  deactivate(): void;
16
- private updateCircle;
17
- private pointerdown;
18
- private pointermove;
19
- private dragEnd;
20
- private pointerup;
21
17
  }
package/dist/index.d.ts CHANGED
@@ -55,5 +55,7 @@ export { EditHistory } from './editor/EditHistory';
55
55
  export { ToolManager } from './editor/tools/ToolManager';
56
56
  export type { Tool } from './editor/tools/ToolManager';
57
57
  export { exportEditedPLY } from './editor/SplatExporter';
58
+ export { SelectionVolumeRenderer } from './editor/SelectionVolumeRenderer';
59
+ export type { VolumeType, VolumeState } from './editor/SelectionVolumeRenderer';
58
60
  export { App } from './App';
59
61
  export type { ProgressCallback, AdaptivePerformanceConfig } from './App';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@d5techs/3dgs-lib",
3
- "version": "1.4.75",
3
+ "version": "1.4.77",
4
4
  "description": "可扩展的 WebGPU 3D 渲染引擎",
5
5
  "type": "module",
6
6
  "main": "./dist/3dgs-lib.cjs",