soonspacejs 2.15.19 → 2.16.0

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.0",
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;
@@ -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, };
@@ -0,0 +1,19 @@
1
+ import { BatchedMesh, 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
+ }
10
+ interface CreateAutoBatchedMeshOptions {
11
+ minInstances: number;
12
+ maxInstancesPerBatch: number;
13
+ }
14
+ export interface AutoBatchedMeshResult<T> {
15
+ batches: AutoBatchedMeshBatch<T>[];
16
+ batchedValues: Set<T>;
17
+ }
18
+ export declare function createAutoBatchedMeshes<T>(candidates: AutoBatchedCandidate<T>[], options: CreateAutoBatchedMeshOptions): AutoBatchedMeshResult<T>;
19
+ export {};
@@ -0,0 +1,108 @@
1
+ import { 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
+ requestSync(): void;
67
+ markBeforeRenderListenerSafe(listener: () => void): void;
68
+ unmarkBeforeRenderListenerSafe(listener: () => void): void;
69
+ hasUnsafeBeforeRenderListeners(numListeners: number): boolean;
70
+ setOutlineSelection(sources: Mesh[]): Mesh[];
71
+ getOutlineSelection(): Mesh[];
72
+ withRenderProxies<T>(render: () => T): T;
73
+ beginRender(forceSourceSync?: boolean): void;
74
+ endRender(): void;
75
+ getRaycastObjects(objects: Object3D | Object3D[]): Object3D | Object3D[];
76
+ resolveIntersection<TObject extends Object3D = Object3D>(intersection: Intersection<TObject>, raycaster?: Raycaster, sourceIntersections?: Map<Object3D<import('three').Object3DEventMap>, Intersection<Object3D<import('three').Object3DEventMap>>[]>): Intersection<TObject> | null;
77
+ resolveIntersections<TObject extends Object3D = Object3D>(intersections: Intersection<TObject>[], raycaster?: Raycaster): Intersection<TObject>[];
78
+ clear(): void;
79
+ dispose(): void;
80
+ private _createBinding;
81
+ private _syncRoot;
82
+ private _updateProxyBindings;
83
+ private _syncInstancedMeshBounds;
84
+ private _isSourceWorldVisible;
85
+ private _syncOwnedBatchMaterials;
86
+ private _ensureOutlineProxy;
87
+ private _removeOutlineProxy;
88
+ private _promoteDynamicDescendants;
89
+ private _isTrackedDescendant;
90
+ private _requiresPartialRendering;
91
+ private _hideManagedSources;
92
+ private _restoreRoot;
93
+ private _removeBinding;
94
+ private _rebuildDirtyRoots;
95
+ private _supportsMultiDraw;
96
+ private _applyEmptyTextureGuards;
97
+ private _restoreEmptyTextureVersions;
98
+ private _normalizeOptions;
99
+ private _registerSceneRoots;
100
+ private _removeInvalidRoots;
101
+ private _partitionNestedRoots;
102
+ private _handleObjectAdded;
103
+ private _handleObjectRemoved;
104
+ private _handleSourceChanged;
105
+ private _handleMaterialChanged;
106
+ private _retryPendingRoots;
107
+ }
108
+ 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 {};
@@ -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,13 @@ declare class Viewport {
57
59
  */
58
60
  postRender: Map<string | number, () => void>;
59
61
  private _loop;
62
+ private outlineSelection;
60
63
  resizeObserver: ResizeObserver;
61
64
  constructor(options: ViewportOptions, signals: SignalsState, cache: ObjectsCache);
62
65
  _initInfo(): void;
63
66
  _initStats(): void;
64
- setAutoInstancing(enabled: boolean): void;
67
+ setAutoInstancing(enabled: boolean, root?: Object3D, options?: AutoInstancingOptions): void;
68
+ getAutoInstancingStats(root?: Object3D): AutoInstancingStats | AutoInstancingStats[] | null;
65
69
  /**
66
70
  ***************************** post-processing ***************************
67
71
  */
@@ -86,7 +90,7 @@ declare class Viewport {
86
90
  /**
87
91
  ***************************** environment ***************************
88
92
  */
89
- setEnvironment(options?: EnvironmentOptions): Promise<Texture<unknown>>;
93
+ setEnvironment(options?: EnvironmentOptions): Promise<Texture<unknown, import('three').TextureEventMap>>;
90
94
  /**
91
95
  ***************************** modelAnimation ***************************
92
96
  */
@@ -101,6 +105,7 @@ declare class Viewport {
101
105
  * @param count
102
106
  */
103
107
  triggerRender(count?: number): void;
108
+ private _triggerRender;
104
109
  /**
105
110
  * 暂停渲染
106
111
  * @param pause
@@ -110,6 +115,7 @@ declare class Viewport {
110
115
  * effect passes
111
116
  */
112
117
  _passesObserver(): void;
118
+ private _syncAutoInstancingOutlineSelection;
113
119
  /**
114
120
  * 每帧都会被执行
115
121
  * @param time
@@ -123,7 +129,7 @@ declare class Viewport {
123
129
  };
124
130
  getPositionByOffset(offset: OffsetPoint, z?: number, scalar?: number): Vector3;
125
131
  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>>[];
132
+ 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
133
  clearSignals(): void;
128
134
  /**
129
135
  * 隔离显示对象 - 使用 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>;