soonspacejs 2.15.19 → 2.16.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "soonspacejs",
3
- "version": "2.15.19",
3
+ "version": "2.16.1",
4
4
  "homepage": "https://www.xwbuilders.com/soonspacejs/",
5
5
  "description": "soonspacejs 2.x",
6
6
  "module": "./dist/index.esm.js",
@@ -26,10 +26,10 @@
26
26
  "author": "xunwei",
27
27
  "license": "UNLICENSED",
28
28
  "peerDependencies": {
29
- "@types/three": ">=0.183.1",
29
+ "@types/three": ">=0.185.4",
30
30
  "camera-controls": ">=3.1.2",
31
- "postprocessing": ">=6.39.0",
32
- "three": ">=0.183.2",
31
+ "postprocessing": ">=6.39.4",
32
+ "three": ">=0.185.1",
33
33
  "three-mesh-bvh": ">=0.9.9"
34
34
  },
35
35
  "gitHead": "4a87dd85050651088e11c3da777c49fab3db7e5d"
@@ -18,6 +18,6 @@ declare class Link extends BaseMesh {
18
18
  updateGeometry(params: Pick<LinkInfo, 'start' | 'end'>): void;
19
19
  computeVertex(): void;
20
20
  computeTextureRepeat(texture: Texture<HTMLImageElement>): void;
21
- createTexture(imgUrl?: string): Texture<HTMLImageElement> | undefined;
21
+ createTexture(imgUrl?: string): Texture<HTMLImageElement, import('three').TextureEventMap> | undefined;
22
22
  }
23
23
  export { Link, LinkInfo, clearTextureCache as clearLinkTextureCache, };
@@ -10,9 +10,9 @@ declare class PoiManage extends DefaultManage {
10
10
  textures: Map<string, Texture>;
11
11
  constructor(viewport: Viewport, cache: ObjectsCache);
12
12
  dispose(): void;
13
- _createIcon(info: PoiInfo): Mesh<import('three').BufferGeometry<import('three').NormalBufferAttributes, import('three').BufferGeometryEventMap>, import('three').Material | import('three').Material[], import('three').Object3DEventMap> | Icon;
13
+ _createIcon(info: PoiInfo): Mesh<import('three').BufferGeometry<import('three').NormalBufferAttributes, import('three').BufferGeometryEventMap>, import('three').Material<import('three').MaterialEventMap> | import('three').Material<import('three').MaterialEventMap>[], import('three').Object3DEventMap> | Icon;
14
14
  _createIconMaterial({ url, type, }: PoiInfo): MeshBasicMaterial | SpriteMaterial | undefined;
15
- _createText(info: PoiInfo): Mesh<import('three').BufferGeometry<import('three').NormalBufferAttributes, import('three').BufferGeometryEventMap>, import('three').Material | import('three').Material[], import('three').Object3DEventMap> | Icon;
15
+ _createText(info: PoiInfo): Mesh<import('three').BufferGeometry<import('three').NormalBufferAttributes, import('three').BufferGeometryEventMap>, import('three').Material<import('three').MaterialEventMap> | import('three').Material<import('three').MaterialEventMap>[], import('three').Object3DEventMap> | Icon;
16
16
  _createTextMaterial(info: PoiInfo): MeshBasicMaterial | SpriteMaterial;
17
17
  _createTextTexture(info: ClonePoiInfo): CanvasTexture<HTMLCanvasElement>;
18
18
  _createTextCanvas(text: string, info?: NameCanvasInfo): HTMLCanvasElement;
@@ -0,0 +1,4 @@
1
+ import { Object3D } from 'three';
2
+ export declare function setAutoBatchMaterialKey(object: Object3D, key: string): void;
3
+ export declare function getAutoBatchMaterialKey(object: Object3D): string | undefined;
4
+ export declare function deleteAutoBatchMaterialKey(object: Object3D): void;
@@ -7,5 +7,5 @@ interface GradientTextureOptions {
7
7
  stops?: number[];
8
8
  size?: number;
9
9
  }
10
- declare function gradientTexture(options?: GradientTextureOptions): Texture<HTMLCanvasElement> | null;
10
+ declare function gradientTexture(options?: GradientTextureOptions): Texture<HTMLCanvasElement, import('three').TextureEventMap> | null;
11
11
  export { GradientTextureOptions, gradientTexture, };
@@ -7,7 +7,7 @@ declare function IVector3ToEuler(val: IVector3 | Euler): Euler;
7
7
  * @param object
8
8
  * @returns
9
9
  */
10
- declare function getBoundingBox(object: Object3D, precise?: boolean): Box3;
10
+ declare function getBoundingBox(object: Object3D, precise?: boolean, cachedBounds?: Box3 | null): Box3;
11
11
  declare function rotationAxisFix(axis: AxisType, source: Euler, target: Euler): Euler;
12
12
  declare function rotationAFix(source: Euler, target: Euler): Euler;
13
13
  declare function deg2Euler(deg: number): number;
@@ -0,0 +1,23 @@
1
+ import { BatchedMesh, Material, Mesh } from 'three';
2
+ export interface AutoBatchedCandidate<T> {
3
+ source: Mesh;
4
+ value: T;
5
+ }
6
+ export interface AutoBatchedMeshBatch<T> {
7
+ proxy: BatchedMesh;
8
+ values: T[];
9
+ usesInstanceColor: boolean;
10
+ ownedMaterial?: Material;
11
+ }
12
+ interface CreateAutoBatchedMeshOptions {
13
+ minInstances: number;
14
+ maxInstancesPerBatch: number;
15
+ }
16
+ export interface AutoBatchedMeshResult<T> {
17
+ batches: AutoBatchedMeshBatch<T>[];
18
+ batchedValues: Set<T>;
19
+ }
20
+ export declare function getAutoBatchedMaterialKey(source: Mesh): string | null;
21
+ export declare function getAutoBatchedMaterialColor(source: Mesh): number | null;
22
+ export declare function createAutoBatchedMeshes<T>(candidates: AutoBatchedCandidate<T>[], options: CreateAutoBatchedMeshOptions): AutoBatchedMeshResult<T>;
23
+ export {};
@@ -0,0 +1,110 @@
1
+ import { Box3, Group as ThreeGroup, Mesh, Object3D, Raycaster, Intersection } from 'three';
2
+ import { default as Viewport } from '.';
3
+ export interface AutoInstancingOptions {
4
+ /**
5
+ * 同一批次至少包含多少个 Mesh 时才创建 InstancedMesh。
6
+ */
7
+ minInstances?: number;
8
+ /**
9
+ * 单个 InstancedMesh 批次允许包含的最大实例数。
10
+ * 限制批次规模可以降低动态更新和包围体重算的成本。
11
+ */
12
+ maxInstancesPerBatch?: number;
13
+ /**
14
+ * 连续多少帧发生局部变换后,将对象从静态批次提升为独立代理。
15
+ */
16
+ dynamicPromotionFrames?: number;
17
+ /**
18
+ * 透明双面 BatchedMesh 是否使用单通道绘制。
19
+ * 仅在代理渲染期间生效,不修改源材质的持久状态。
20
+ */
21
+ transparentSinglePass?: boolean;
22
+ /**
23
+ * 是否跳过 image 为空但已标记更新的纹理上传。
24
+ * 仅在代理渲染期间临时复位纹理版本,避免 WebGLRenderer 每帧重复重试和告警。
25
+ */
26
+ skipEmptyTextureUploads?: boolean;
27
+ }
28
+ export interface AutoInstancingStats {
29
+ active: boolean;
30
+ sourceObjects: number;
31
+ sourceRenderables: number;
32
+ instancedBatches: number;
33
+ instancedObjects: number;
34
+ mergedBatches: number;
35
+ mergedObjects: number;
36
+ batchedBatches: number;
37
+ batchedObjects: number;
38
+ passthroughObjects: number;
39
+ unsupportedObjects: number;
40
+ multiDrawSupported: boolean;
41
+ }
42
+ declare class AutoInstancingManager {
43
+ readonly viewport: Viewport;
44
+ readonly proxyRoot: ThreeGroup<import('three').Object3DEventMap>;
45
+ private roots;
46
+ private pendingRoots;
47
+ private sourceToProxy;
48
+ private sourceBindings;
49
+ private proxyBindings;
50
+ private dynamicSources;
51
+ private excludedRoots;
52
+ private excludedSubtrees;
53
+ private outlineIndependentSources;
54
+ private outlineSources;
55
+ private outlineSourceSet;
56
+ private safeBeforeRenderListeners;
57
+ private activeEmptyTextureVersions;
58
+ private autoMode;
59
+ private autoModeOptions;
60
+ private isRendering;
61
+ constructor(viewport: Viewport);
62
+ setEnabled(enabled: boolean, options?: AutoInstancingOptions): AutoInstancingStats[];
63
+ registerRoot(root: Object3D, options?: AutoInstancingOptions): AutoInstancingStats | null;
64
+ unregisterRoot(root: Object3D, excludeFromAutoMode?: boolean): void;
65
+ getStats(root?: Object3D): AutoInstancingStats | AutoInstancingStats[] | null;
66
+ getBounds(root: Object3D): Box3 | null;
67
+ requestSync(): void;
68
+ markBeforeRenderListenerSafe(listener: () => void): void;
69
+ unmarkBeforeRenderListenerSafe(listener: () => void): void;
70
+ hasUnsafeBeforeRenderListeners(numListeners: number): boolean;
71
+ setOutlineSelection(sources: Mesh[]): Mesh[];
72
+ getOutlineSelection(): Mesh[];
73
+ withRenderProxies<T>(render: () => T): T;
74
+ beginRender(forceSourceSync?: boolean): void;
75
+ endRender(): void;
76
+ getRaycastObjects(objects: Object3D | Object3D[]): Object3D | Object3D[];
77
+ resolveIntersection<TObject extends Object3D = Object3D>(intersection: Intersection<TObject>, raycaster?: Raycaster, sourceIntersections?: Map<Object3D<import('three').Object3DEventMap>, Intersection<Object3D<import('three').Object3DEventMap>>[]>): Intersection<TObject> | null;
78
+ resolveIntersections<TObject extends Object3D = Object3D>(intersections: Intersection<TObject>[], raycaster?: Raycaster): Intersection<TObject>[];
79
+ clear(): void;
80
+ dispose(): void;
81
+ private _createBinding;
82
+ private _syncRoot;
83
+ private _updateRootBounds;
84
+ private _updateProxyBindings;
85
+ private _syncInstancedMeshBounds;
86
+ private _isSourceWorldVisible;
87
+ private _syncOwnedBatchMaterials;
88
+ private _ensureOutlineProxy;
89
+ private _removeOutlineProxy;
90
+ private _promoteDynamicDescendants;
91
+ private _isTrackedDescendant;
92
+ private _requiresPartialRendering;
93
+ private _hideManagedSources;
94
+ private _restoreRoot;
95
+ private _removeBinding;
96
+ private _rebuildDirtyRoots;
97
+ private _supportsMultiDraw;
98
+ private _applyEmptyTextureGuards;
99
+ private _restoreEmptyTextureVersions;
100
+ private _normalizeOptions;
101
+ private _registerSceneRoots;
102
+ private _removeInvalidRoots;
103
+ private _partitionNestedRoots;
104
+ private _handleObjectAdded;
105
+ private _handleObjectRemoved;
106
+ private _handleSourceChanged;
107
+ private _handleMaterialChanged;
108
+ private _retryPendingRoots;
109
+ }
110
+ export default AutoInstancingManager;
@@ -0,0 +1,21 @@
1
+ import { Mesh } from 'three';
2
+ export interface AutoMergedCandidate<T> {
3
+ source: Mesh;
4
+ value: T;
5
+ }
6
+ export interface AutoMergedMeshBatch<T> {
7
+ proxy: Mesh;
8
+ values: T[];
9
+ faceEnds: number[];
10
+ }
11
+ interface CreateAutoMergedMeshOptions {
12
+ minInstances: number;
13
+ maxInstancesPerBatch: number;
14
+ maxRootBytes: number;
15
+ }
16
+ export interface AutoMergedMeshResult<T> {
17
+ batches: AutoMergedMeshBatch<T>[];
18
+ mergedValues: Set<T>;
19
+ }
20
+ export declare function createAutoMergedMeshes<T>(candidates: AutoMergedCandidate<T>[], options: CreateAutoMergedMeshOptions): AutoMergedMeshResult<T>;
21
+ export {};
@@ -3,7 +3,10 @@ import { WorkerPool } from 'three/examples/jsm/utils/WorkerPool.js';
3
3
  import { MeshBVH } from 'three-mesh-bvh';
4
4
  declare class GenerateMeshBVHWorker {
5
5
  workerPool: WorkerPool;
6
+ private pendingRejectors;
7
+ private disposed;
6
8
  constructor();
9
+ private _createAbortError;
7
10
  generate(geometry: BufferGeometry, options?: any): Promise<MeshBVH | undefined>;
8
11
  dispose(): void;
9
12
  }
@@ -1,4 +1,5 @@
1
1
  import { default as Viewport } from '..';
2
+ import { GenerateMeshBVHWorker } from './GenerateMeshBVHWorker';
2
3
  export type ModelsBoundsTreeOptions = {
3
4
  type?: 'block' | 'slice' | 'worker';
4
5
  force?: boolean;
@@ -10,8 +11,14 @@ declare class Bvh {
10
11
  cameraChanging: boolean;
11
12
  timer: number | null;
12
13
  computedGeometriesUuid: Map<string, string>;
13
- generateMeshBVHWorker: import('./GenerateMeshBVHWorker').GenerateMeshBVHWorker;
14
+ inFlightGeometryBuilds: Map<string, Promise<void>>;
15
+ frameHandles: Set<number>;
16
+ sliceRejectors: Set<(reason: Error) => void>;
17
+ disposed: boolean;
18
+ generateMeshBVHWorker: GenerateMeshBVHWorker;
14
19
  constructor(viewport: Viewport);
20
+ private _createAbortError;
21
+ private _requestFrame;
15
22
  computeModelsBoundsTree(options?: ModelsBoundsTreeOptions): Promise<void>;
16
23
  dispose(): void;
17
24
  }
@@ -4,6 +4,8 @@ declare class Info {
4
4
  readonly scene: Scene;
5
5
  readonly signals: SignalsState;
6
6
  container: HTMLDivElement;
7
+ private renderStateFrame;
8
+ private disposed;
7
9
  state: {
8
10
  objects: number;
9
11
  meshes: number;
@@ -13,5 +15,6 @@ declare class Info {
13
15
  };
14
16
  constructor(scene: Scene, signals: SignalsState);
15
17
  addListeners(): void;
18
+ dispose(): void;
16
19
  }
17
20
  export default Info;
@@ -2,11 +2,6 @@ import { WebGLRenderer } from 'three';
2
2
  import { CSS2DRenderer, CSS3DRenderer } from '../Renderer';
3
3
  import { InternalOptions } from '../Interface';
4
4
  import { default as Viewport } from '.';
5
- declare module 'three' {
6
- interface WebGLRenderer {
7
- autoInstancing: boolean;
8
- }
9
- }
10
5
  declare class RendererManager {
11
6
  readonly viewport: Viewport;
12
7
  internalOptions: InternalOptions;
@@ -38,7 +38,7 @@ declare class Scener {
38
38
  unHighlightShow(objects?: Object3D | Object3D[]): Promise<void | void[]>;
39
39
  emissiveShow(object: Object3D | Object3D[], options?: EmissiveSelectOptions): Promise<void | void[]>;
40
40
  unEmissiveShow(objects?: Object3D | Object3D[]): Promise<void | void[]>;
41
- updateMaterial(material: Material, materialOption: UpdateMaterialOption): Material;
41
+ updateMaterial(material: Material, materialOption: UpdateMaterialOption): Material<import('three').MaterialEventMap>;
42
42
  private _handleEmissiveShow;
43
43
  private _handleUnEmissive;
44
44
  _triggerObjectAdded(object: Object3D): void;
@@ -16,6 +16,7 @@ import { default as EventHandler } from './EventHandler';
16
16
  import { default as Info } from './Info';
17
17
  import { ViewHelper } from './ViewHelper';
18
18
  import { ObjectsCache } from '../Cache';
19
+ import { default as AutoInstancingManager, AutoInstancingOptions, AutoInstancingStats } from './AutoInstancingManager';
19
20
  export declare const innerRenderState: {
20
21
  needsUpdate: boolean;
21
22
  };
@@ -35,6 +36,7 @@ declare class Viewport {
35
36
  renderer: WebGLRenderer;
36
37
  rendererCSS2D: CSS2DRenderer;
37
38
  rendererCSS3D: CSS3DRenderer;
39
+ autoInstancingManager: AutoInstancingManager;
38
40
  pmremGenerator: PMREMGenerator;
39
41
  info: Info;
40
42
  stats: Stats;
@@ -57,11 +59,14 @@ declare class Viewport {
57
59
  */
58
60
  postRender: Map<string | number, () => void>;
59
61
  private _loop;
62
+ private outlineSelection;
63
+ private pendingRenderResolvers;
60
64
  resizeObserver: ResizeObserver;
61
65
  constructor(options: ViewportOptions, signals: SignalsState, cache: ObjectsCache);
62
66
  _initInfo(): void;
63
67
  _initStats(): void;
64
- setAutoInstancing(enabled: boolean): void;
68
+ setAutoInstancing(enabled: boolean, root?: Object3D, options?: AutoInstancingOptions): void;
69
+ getAutoInstancingStats(root?: Object3D): AutoInstancingStats | AutoInstancingStats[] | null;
65
70
  /**
66
71
  ***************************** post-processing ***************************
67
72
  */
@@ -86,7 +91,7 @@ declare class Viewport {
86
91
  /**
87
92
  ***************************** environment ***************************
88
93
  */
89
- setEnvironment(options?: EnvironmentOptions): Promise<Texture<unknown>>;
94
+ setEnvironment(options?: EnvironmentOptions): Promise<Texture<unknown, import('three').TextureEventMap>>;
90
95
  /**
91
96
  ***************************** modelAnimation ***************************
92
97
  */
@@ -101,6 +106,7 @@ declare class Viewport {
101
106
  * @param count
102
107
  */
103
108
  triggerRender(count?: number): void;
109
+ private _triggerRender;
104
110
  /**
105
111
  * 暂停渲染
106
112
  * @param pause
@@ -110,6 +116,7 @@ declare class Viewport {
110
116
  * effect passes
111
117
  */
112
118
  _passesObserver(): void;
119
+ private _syncAutoInstancingOutlineSelection;
113
120
  /**
114
121
  * 每帧都会被执行
115
122
  * @param time
@@ -123,7 +130,7 @@ declare class Viewport {
123
130
  };
124
131
  getPositionByOffset(offset: OffsetPoint, z?: number, scalar?: number): Vector3;
125
132
  getIntersects(event: MouseEvent | TouchEvent | OffsetPoint, objects?: Object3D<import('three').Object3DEventMap>[], options?: IntersectsOptions): Intersection<Object3D<import('three').Object3DEventMap>>[];
126
- rayClash(startPoint?: Vector3, dir?: Vector3, objects?: Mesh<import('three').BufferGeometry<import('three').NormalBufferAttributes, import('three').BufferGeometryEventMap>, Material | Material[], import('three').Object3DEventMap>[]): Intersection<Object3D<import('three').Object3DEventMap>>[];
133
+ rayClash(startPoint?: Vector3, dir?: Vector3, objects?: Mesh<import('three').BufferGeometry<import('three').NormalBufferAttributes, import('three').BufferGeometryEventMap>, Material<import('three').MaterialEventMap> | Material<import('three').MaterialEventMap>[], import('three').Object3DEventMap>[]): Intersection<Object3D<import('three').Object3DEventMap>>[];
127
134
  clearSignals(): void;
128
135
  /**
129
136
  * 隔离显示对象 - 使用 Layers API 仅显示指定对象,隐藏场景中其他对象
package/types/index.d.ts CHANGED
@@ -6,6 +6,7 @@ import { IClipAnimation, BaseObjectInfo, ViewportOptions, SceneGlobalEvents, Plu
6
6
  import { BaseObject3D, Model, ModelInfo, Poi, PoiInfo, PoiNode, PoiNodeInfo, Topology, TopologyInfo, Group, GroupInfo, Canvas3D, Canvas3DInfo, PluginObject, PluginObjectInfo, DecalInfo, Decal, DecalGeometryInfo, PoiMeshInfo, PolygonPoiMeshInfo } from './Library';
7
7
  import { ObjectsCache } from './Cache';
8
8
  import { default as Viewport } from './Viewport';
9
+ import { AutoInstancingOptions, AutoInstancingStats } from './Viewport/AutoInstancingManager';
9
10
  import { default as Controls } from './Controls';
10
11
  import { default as Manager } from './Manager';
11
12
  import { BoxSpace, FindObjectsNearPosition, FindNearbyObjects, SetTextureOptions } from './tools';
@@ -33,6 +34,7 @@ export interface SoonSpaceConstructor {
33
34
  export * from './Library';
34
35
  export * from './Interface';
35
36
  export * from './tools';
37
+ export type { AutoInstancingOptions, AutoInstancingStats, } from './Viewport/AutoInstancingManager';
36
38
  export * from './Constants';
37
39
  export * from '@three3d/animation';
38
40
  /**
@@ -145,7 +147,8 @@ declare class SoonSpace {
145
147
  /******* Viewport methods */
146
148
  /******/
147
149
  /******/
148
- setAutoInstancing(enabled: boolean): void;
150
+ setAutoInstancing(enabled: boolean, root?: Object3D, options?: AutoInstancingOptions): void;
151
+ getAutoInstancingStats(root?: Object3D): AutoInstancingStats | AutoInstancingStats[] | null;
149
152
  /**
150
153
  * 设置泛光
151
154
  * @param bloom
@@ -197,7 +200,7 @@ declare class SoonSpace {
197
200
  * 设置场景环境
198
201
  * @returns
199
202
  */
200
- setEnvironment(options?: EnvironmentOptions): Promise<THREE.Texture<unknown>>;
203
+ setEnvironment(options?: EnvironmentOptions): Promise<THREE.Texture<unknown, THREE.TextureEventMap>>;
201
204
  /**
202
205
  * 播放模型动画
203
206
  * @param model
@@ -881,7 +884,7 @@ declare class SoonSpace {
881
884
  * @param options - 选项
882
885
  * @returns 返回设置的纹理对象
883
886
  */
884
- setTexture(mesh: Mesh, image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | null, options?: SetTextureOptions): THREE.Texture<unknown> | null;
887
+ setTexture(mesh: Mesh, image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | null, options?: SetTextureOptions): THREE.Texture<unknown, THREE.TextureEventMap> | null;
885
888
  /******/
886
889
  /******/
887
890
  /******* Canvas3D methods */
@@ -24,7 +24,7 @@ export declare function createUVMatrix(box: Box2): Matrix3;
24
24
  * 判断包围合 与 对象的包围盒是否相交
25
25
  */
26
26
  export declare function boundingIsIntersected(target: Box3 | Sphere, obj: Object3D): boolean;
27
- export declare function createTexture(image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, cache?: boolean, textureCache?: Map<string, Texture>): Texture<unknown>;
27
+ export declare function createTexture(image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, cache?: boolean, textureCache?: Map<string, Texture>): Texture<unknown, import('three').TextureEventMap>;
28
28
  export interface SetTextureOptions {
29
29
  /**
30
30
  * 是否使用缓存中的材质
@@ -45,4 +45,4 @@ export interface SetTextureOptions {
45
45
  * @param textureCache
46
46
  * @returns
47
47
  */
48
- export declare function setTexture(material: MeshStandardMaterial, image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, cache?: boolean, textureCache?: Map<string, Texture>): Texture<unknown>;
48
+ export declare function setTexture(material: MeshStandardMaterial, image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, cache?: boolean, textureCache?: Map<string, Texture>): Texture<unknown, import('three').TextureEventMap>;