vis-core 0.33.15 → 0.33.16

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/README.md CHANGED
@@ -1 +1,25 @@
1
1
  # vis-core
2
+
3
+ ## 提前初始化 GPU
4
+
5
+ `SceneManager` 首次读取 URL 模板时,会先发出网络请求,再自动预热实际渲染器。现有 `load(url)`、`loadMapRegion(url, ...)` 和 `requestMapRegion(url, ...)` 调用无需修改。内存文档不会自动预热。
6
+
7
+ 宿主已经确认即将展示场景时,也可以更早调用:
8
+
9
+ ```ts
10
+ const manager = new SceneManager({ container });
11
+ void manager.prewarmRuntime().catch(error => {
12
+ // 预热是可选优化;正式加载仍可重新尝试初始化。
13
+ console.debug('GPU 预热未完成', error);
14
+ });
15
+
16
+ // 稍后需要展示时,复用预热中的或已就绪的上下文。
17
+ await manager.load(templateUrl);
18
+
19
+ // 页面卸载时,也会释放尚未被场景接管的预热上下文。
20
+ manager.dispose();
21
+ ```
22
+
23
+ 每个 manager 独立持有预热状态,重复调用共用初始化 Promise。预热只初始化渲染器,不读取场景、展开材质、挂载 canvas 或启动渲染循环;首次场景按最终配置接管同一个渲染器。模板或钩子修改了深度、后端等渲染器配置时,不兼容的预热实例会释放,按最终配置重新创建。WebGPU 降级及深度精度策略与普通加载相同。
24
+
25
+ 预热失败或未使用的设备丢失后可以重试。预热不能消除 GPU 冷启动成本,也不会把同步 WebGL 初始化移入后台线程;收益来自更早启动,以及与模板下载等等待重叠。测量时应分别记录预热耗时和后续加载耗时。
package/dist/index.d.ts CHANGED
@@ -50,8 +50,8 @@ import { Raycaster } from 'three/webgpu';
50
50
  import { RectAreaLight as RectAreaLight_2 } from 'three';
51
51
  import { RenderPipeline } from 'three/webgpu';
52
52
  import { RenderTarget } from 'three/webgpu';
53
- import { Scene } from 'three';
54
- import { Scene as Scene_2 } from 'three/webgpu';
53
+ import { Scene } from 'three/webgpu';
54
+ import { Scene as Scene_2 } from 'three';
55
55
  import { ShaderMaterial } from 'three';
56
56
  import { ShaderMaterialJSON } from 'three';
57
57
  import { SpotLight as SpotLight_2 } from 'three';
@@ -343,6 +343,8 @@ declare type Base_2 = Base_3;
343
343
 
344
344
  declare class Base_3 extends Camera {
345
345
  static VisName: string;
346
+ /** Internal: Share final renderer configuration with SceneManager prewarming. */
347
+ static prewarmRenderer(options: BaseOptions): ReturnType<typeof Pencil.prewarmRenderer>;
346
348
  runtimePolicy: {
347
349
  observeParentScale: boolean;
348
350
  applyDisabledMouseButtons: boolean;
@@ -358,8 +360,8 @@ declare class Base_3 extends Camera {
358
360
  roomEnvMap?: _THREE.Texture;
359
361
  private roomEnvLease?;
360
362
  visName: string;
361
- private detectRes?;
362
363
  private ownsPencil;
364
+ private rendererWarmup?;
363
365
  private renderingSuspensions;
364
366
  /** Internal: 在运行时创建前也可暂停,保证整个初始化过程不提交中间帧。 */
365
367
  suspendRendering(): () => void;
@@ -382,7 +384,6 @@ declare class Base_3 extends Camera {
382
384
  private getQueryOverrides;
383
385
  private getEffectiveLogarithmicDepthBuffer;
384
386
  private getEffectiveTier;
385
- private isExtClipControlAvailable;
386
387
  private resolveRendererDepthBufferOptions;
387
388
  private showDetectRes;
388
389
  setOptions(options: Record<string, any>): void;
@@ -611,6 +612,8 @@ declare interface BaseOptions {
611
612
  css2DContainer?: HTMLElement;
612
613
  controlsContainer?: HTMLElement;
613
614
  pencil?: any;
615
+ /** Internal: Owned by SceneManager until the first Pencil adopts it. */
616
+ rendererWarmup?: ReturnType<typeof Pencil.prewarmRenderer>;
614
617
  pencilConfig?: Record<string, any>;
615
618
  disableInitShow?: boolean;
616
619
  logarithmicDepthBuffer?: boolean;
@@ -1741,7 +1744,7 @@ declare class CameraPages extends OrigonPages<PerspectiveCamera_2> {
1741
1744
  private _cachedMatrixWorldInverse;
1742
1745
  private externallySyncedCameras;
1743
1746
  private ownedCameras;
1744
- constructor(options: Options_3);
1747
+ constructor(options: Options_4);
1745
1748
  addPerspectiveCamera(cameraParams?: {
1746
1749
  fov: number;
1747
1750
  aspect?: number;
@@ -1992,11 +1995,11 @@ declare const ColorSpace: {
1992
1995
  /** WebGPU render pipeline. Compatibility controls retain the saved scene schema. */
1993
1996
  declare class Composer {
1994
1997
  renderer: WebGPURenderer;
1995
- scene: Scene_2;
1998
+ scene: Scene;
1996
1999
  camera: Camera_2;
1997
2000
  finalComposer: RenderPipeline;
1998
2001
  renderPass: {
1999
- scene: Scene_2;
2002
+ scene: Scene;
2000
2003
  camera: Camera_2;
2001
2004
  };
2002
2005
  bloomComposer?: RenderTarget;
@@ -2027,7 +2030,7 @@ declare class Composer {
2027
2030
  bloomSelection: Set<BaseObject< Object3D<Object3DEventMap>>>;
2028
2031
  bloomLayer: Layers;
2029
2032
  active: boolean;
2030
- options: Options_2;
2033
+ options: Options_3;
2031
2034
  private readonly target;
2032
2035
  private overlayTarget?;
2033
2036
  private outputPipeline?;
@@ -2049,13 +2052,15 @@ declare class Composer {
2049
2052
  private readonly gtaoViews;
2050
2053
  private readonly onCameraChange;
2051
2054
  private readonly onSceneChange;
2052
- constructor(options: Options_2);
2055
+ constructor(options: Options_3);
2053
2056
  private createDepthTexture;
2057
+ /** Reconcile async backend selection before the first draw; preserve target identities. */
2058
+ synchronizeRendererCapabilities(multisampling?: number): void;
2054
2059
  private resizeTargets;
2055
2060
  private rebuild;
2056
2061
  private activateView;
2057
2062
  changeCamera(camera: Camera_2): void;
2058
- changeScene(scene: Scene_2): void;
2063
+ changeScene(scene: Scene): void;
2059
2064
  addOutputPass(): void;
2060
2065
  setPremultiplieAlpha(value: boolean): void;
2061
2066
  addSSAOPass(params: SSAOParams): void;
@@ -2217,7 +2222,7 @@ declare class CSSRendererController {
2217
2222
  setSize(width: number, height: number): void;
2218
2223
  setViewport(viewport: CSSRendererViewport): void;
2219
2224
  private applyViewport;
2220
- render(scene: Scene, camera: PerspectiveCamera_2): void;
2225
+ render(scene: Scene_2, camera: PerspectiveCamera_2): void;
2221
2226
  dispose(): void;
2222
2227
  }
2223
2228
 
@@ -2744,7 +2749,7 @@ declare class Lead_2 extends Pick_2 {
2744
2749
  sceneResources: SceneResources_2;
2745
2750
  get objectsPromise(): MapIterator<Promise<void>>;
2746
2751
  constructor(pencil: Pencil, ops: {
2747
- scene: Scene;
2752
+ scene: Scene_2;
2748
2753
  sceneResources: SceneResources_2;
2749
2754
  });
2750
2755
  /**
@@ -2807,7 +2812,7 @@ declare class LeadPages extends OrigonPages<Lead_2> {
2807
2812
  options: Options_11;
2808
2813
  get lead(): Lead_2;
2809
2814
  constructor(options: Options_11);
2810
- addLead(scene: Scene, sceneResources: SceneResources_2, index?: number): Lead_2;
2815
+ addLead(scene: Scene_2, sceneResources: SceneResources_2, index?: number): Lead_2;
2811
2816
  removePage(index: number): void;
2812
2817
  setPageActive(index: number): void;
2813
2818
  setSize(width: number, height: number): void;
@@ -2892,7 +2897,7 @@ declare class Loader {
2892
2897
  assets: Map<string, Texture | Object3D | any>;
2893
2898
  event: EventEmitter;
2894
2899
  options: Options_9;
2895
- scene: Scene;
2900
+ scene: Scene_2;
2896
2901
  private disposed;
2897
2902
  readonly resources: ResourceRegistry;
2898
2903
  private assetLeases;
@@ -2948,7 +2953,7 @@ declare class LoaderPages extends OrigonPages<Loader> {
2948
2953
  options: Options_10;
2949
2954
  get loader(): Loader;
2950
2955
  constructor(options: Options_10);
2951
- addLoader(scene: Scene, index?: number): Loader;
2956
+ addLoader(scene: Scene_2, index?: number): Loader;
2952
2957
  removePage(index: number): void;
2953
2958
  }
2954
2959
 
@@ -3841,6 +3846,8 @@ declare class OptionMaterialDependencies {
3841
3846
 
3842
3847
  declare interface Options {
3843
3848
  container: HTMLElement;
3849
+ /** Optional single-use renderer prepared by Pencil.prewarmRenderer(). */
3850
+ rendererWarmup?: RendererWarmup;
3844
3851
  helper?: boolean;
3845
3852
  controls?: Partial<ControlsParams>;
3846
3853
  renderer?: Partial<RendererParams>;
@@ -3968,11 +3975,9 @@ declare interface Options_19 {
3968
3975
  }
3969
3976
 
3970
3977
  declare interface Options_2 {
3971
- sceneController: ScenePages;
3972
- cameraController: CameraPages;
3973
- rendererController: RendererController;
3974
- composerParams: ComposerParams;
3975
- resources?: ResourceRegistry;
3978
+ width: number;
3979
+ height: number;
3980
+ rendererParams: RendererParams;
3976
3981
  }
3977
3982
 
3978
3983
  declare interface Options_20 {
@@ -4022,14 +4027,16 @@ declare interface Options_23 {
4022
4027
  }
4023
4028
 
4024
4029
  declare interface Options_3 {
4025
- width: number;
4026
- height: number;
4030
+ sceneController: ScenePages;
4031
+ cameraController: CameraPages;
4032
+ rendererController: RendererController;
4033
+ composerParams: ComposerParams;
4034
+ resources?: ResourceRegistry;
4027
4035
  }
4028
4036
 
4029
4037
  declare interface Options_4 {
4030
4038
  width: number;
4031
4039
  height: number;
4032
- rendererParams: RendererParams;
4033
4040
  }
4034
4041
 
4035
4042
  declare interface Options_5 {
@@ -4045,16 +4052,16 @@ declare interface Options_6 {
4045
4052
 
4046
4053
  declare interface Options_7 {
4047
4054
  renderer: WebGPURenderer;
4048
- scene: Scene_2;
4055
+ scene: Scene;
4049
4056
  /** Authored page identity when scene is a shared overlay. */
4050
- viewScene?: Scene_2;
4057
+ viewScene?: Scene;
4051
4058
  camera: Camera_2;
4052
4059
  }
4053
4060
 
4054
4061
  declare interface Options_8 {
4055
4062
  sceneController: ScenePages;
4056
4063
  /** Editor overlays live outside the authored scene and its render passes. */
4057
- helperScene?: Scene_2;
4064
+ helperScene?: Scene;
4058
4065
  cameraController: CameraPages;
4059
4066
  container: HTMLElement;
4060
4067
  resources?: ResourceRegistry;
@@ -4064,7 +4071,7 @@ declare interface Options_9 {
4064
4071
  prefix?: string;
4065
4072
  simpleTexture4deleted?: boolean;
4066
4073
  anisotropy: number;
4067
- scene: Scene | null;
4074
+ scene: Scene_2 | null;
4068
4075
  resources?: ResourceRegistry;
4069
4076
  }
4070
4077
 
@@ -4082,7 +4089,9 @@ declare class OrigonPages<T = any> {
4082
4089
  }
4083
4090
 
4084
4091
  /** Pack an export copy only; preserve the editor's independent scene snapshots. */
4085
- export declare function packSceneDocumentResources<T extends VisSceneDocument>(document: T): T;
4092
+ export declare function packSceneDocumentResources<T extends VisSceneDocument>(document: T, options?: {
4093
+ encodePixels?: boolean;
4094
+ }): T;
4086
4095
 
4087
4096
  /** Page identities are independent of Three's 32 rendering layers. */
4088
4097
  declare class Pages {
@@ -4147,7 +4156,7 @@ export declare function patchSceneViewportDocument(document: VisSceneDocument, s
4147
4156
  declare class Pencil {
4148
4157
  readonly resources: ResourceRegistry;
4149
4158
  readonly ready: Promise<void>;
4150
- options: Omit<DeepRequiredOptions, 'controls' | 'loader' | 'css2DRendererParams' | 'css3DRendererParams'> & Pick<Options, 'controls' | 'loader'> & {
4159
+ options: Omit<DeepRequiredOptions, 'controls' | 'loader' | 'css2DRendererParams' | 'css3DRendererParams' | 'rendererWarmup'> & Pick<Options, 'controls' | 'loader'> & {
4151
4160
  css2DRendererParams: CSSRendererParams;
4152
4161
  css3DRendererParams: CSSRendererParams;
4153
4162
  };
@@ -4161,7 +4170,7 @@ declare class Pencil {
4161
4170
  helperController?: HelperController;
4162
4171
  private _helperScene?;
4163
4172
  /** Drawn only in the editor, after the authored scene's postprocessing. */
4164
- get helperScene(): Scene_2< Object3DEventMap>;
4173
+ get helperScene(): Scene< Object3DEventMap>;
4165
4174
  private sceneCapture?;
4166
4175
  loaderController: LoaderPages;
4167
4176
  leadController: LeadPages;
@@ -4182,7 +4191,7 @@ declare class Pencil {
4182
4191
  get cameraPositon(): Vector3_2;
4183
4192
  get cameraTarget(): Vector3_2;
4184
4193
  get camera(): PerspectiveCamera;
4185
- get scene(): Scene_2< Object3DEventMap>;
4194
+ get scene(): Scene< Object3DEventMap>;
4186
4195
  get loader(): Loader;
4187
4196
  get lead(): Lead_2;
4188
4197
  get sceneResources(): SceneResources_2;
@@ -4195,6 +4204,7 @@ declare class Pencil {
4195
4204
  controls: boolean;
4196
4205
  renderer: {
4197
4206
  forceWebGL: boolean;
4207
+ autoDepthBuffer: boolean;
4198
4208
  antialias: boolean;
4199
4209
  devicePixelRatio: number;
4200
4210
  powerPreference: string;
@@ -4262,6 +4272,9 @@ declare class Pencil {
4262
4272
  attributesWorkerMaxWorkers: number;
4263
4273
  };
4264
4274
  private TweenRaf;
4275
+ private rendererWarmup?;
4276
+ /** Start only the GPU environment; the eventual Pencil takes ownership. */
4277
+ static prewarmRenderer(renderer?: Partial<RendererParams>): RendererWarmup;
4265
4278
  private tweenUpdateRaf;
4266
4279
  private cancelTweenRaf;
4267
4280
  constructor(options: Options);
@@ -4711,13 +4724,14 @@ declare class RendererController {
4711
4724
  private disposed;
4712
4725
  private hasRenderableSize;
4713
4726
  private readonly pointSprites;
4714
- options: Options_4;
4727
+ options: Options_2;
4715
4728
  private displayScaleObserver?;
4716
- constructor(options: Options_4);
4729
+ private releaseRenderPipelines?;
4730
+ constructor(options: Options_2);
4717
4731
  observeDisplayScale(container: HTMLElement): void;
4718
4732
  setSize(width: number, height: number): void;
4719
4733
  setPixelRatio(ratio: number): void;
4720
- render(scene: Scene_2, camera: Camera_2): void;
4734
+ render(scene: Scene, camera: Camera_2): void;
4721
4735
  setViewport(op: {
4722
4736
  x: number;
4723
4737
  y: number;
@@ -4741,10 +4755,26 @@ declare interface RendererParams {
4741
4755
  stencil: boolean;
4742
4756
  depth: boolean;
4743
4757
  reversedDepthBuffer: boolean;
4758
+ /** Prefer reversed depth on the selected backend; retain logarithmic depth on GL without EXT_clip_control. */
4759
+ autoDepthBuffer?: boolean;
4744
4760
  /** Use the WebGL 2 backend of WebGPURenderer, primarily for compatibility testing. */
4745
4761
  forceWebGL?: boolean;
4746
4762
  }
4747
4763
 
4764
+ /** A single-use, privately owned renderer. No scene, loader, DOM attachment or render loop. */
4765
+ declare class RendererWarmup {
4766
+ readonly ready: Promise<void>;
4767
+ private controller?;
4768
+ private readonly parameters;
4769
+ private cancelled;
4770
+ private detachDeviceListener?;
4771
+ get available(): boolean;
4772
+ constructor(parameters: RendererParams);
4773
+ /** Transfer ownership only when the final scene's renderer configuration matches. */
4774
+ take(parameters: RendererParams, width: number, height: number): RendererController | undefined;
4775
+ dispose(): void;
4776
+ }
4777
+
4748
4778
  export declare function replaceMaterialAssetDocument(document: VisSceneDocument, asset: MaterialAsset): VisSceneDocument;
4749
4779
 
4750
4780
  export declare const RESOURCE_SOURCE = "_resourceSource";
@@ -5016,6 +5046,8 @@ export declare class SceneManager extends Event_2 {
5016
5046
  private isSwitching;
5017
5047
  private isRegionSwitching;
5018
5048
  private pencil?;
5049
+ private rendererWarmup?;
5050
+ private disposed;
5019
5051
  private safeAreaInsets?;
5020
5052
  private generation;
5021
5053
  private mapRequests;
@@ -5047,6 +5079,13 @@ export declare class SceneManager extends Event_2 {
5047
5079
  setSceneCachePolicy(cacheScenes: boolean, maxCachedScenes?: number | undefined): void;
5048
5080
  private reportSceneRetirementErrors;
5049
5081
  constructor(options: SceneManagerInitOptions);
5082
+ /**
5083
+ * Initialize the eventual renderer without downloading/expanding a scene or drawing.
5084
+ * Call after starting template I/O to overlap network work with GPU startup.
5085
+ * Repeated calls share one promise. A scene with different renderer options
5086
+ * uses its own compatible renderer; failed warmups may be retried.
5087
+ */
5088
+ prewarmRuntime(): Promise<void>;
5050
5089
  private prepareScene;
5051
5090
  /** Publish one identity remap without exporting runtimes or copying other pages/resources. */
5052
5091
  remapCommittedIdentity(sceneId: string, previous: string, next: string, objectIdentity: boolean): boolean;
@@ -5251,14 +5290,14 @@ export declare interface SceneObjectPropertyPatch {
5251
5290
  unset?: readonly string[];
5252
5291
  }
5253
5292
 
5254
- declare class ScenePages extends OrigonPages<Scene> {
5255
- get scene(): Scene< Object3DEventMap>;
5256
- addScene(sceneParams?: SceneParams, index?: number): Scene< Object3DEventMap>;
5293
+ declare class ScenePages extends OrigonPages<Scene_2> {
5294
+ get scene(): Scene_2< Object3DEventMap>;
5295
+ addScene(sceneParams?: SceneParams, index?: number): Scene_2< Object3DEventMap>;
5257
5296
  setPageActive(index: number): void;
5258
5297
  }
5259
5298
 
5260
5299
  declare interface SceneParams {
5261
- background: Scene['background'];
5300
+ background: Scene_2['background'];
5262
5301
  }
5263
5302
 
5264
5303
  declare type ScenePropertyField = typeof scenePropertyFields[number];
@@ -5762,7 +5801,7 @@ declare class TransformControlsController {
5762
5801
  event: EventEmitter;
5763
5802
  constructor(options: Options_7);
5764
5803
  setViewport(viewport: Viewport): void;
5765
- bindActiveView(camera: Camera_2 | undefined, scene: Scene_2 | undefined, viewScene?: Scene_2< Object3DEventMap> | undefined): void;
5804
+ bindActiveView(camera: Camera_2 | undefined, scene: Scene | undefined, viewScene?: Scene< Object3DEventMap> | undefined): void;
5766
5805
  private releaseRaycastCamera;
5767
5806
  private getBoundingClientRect;
5768
5807
  addEvent(): void;
@@ -5827,7 +5866,7 @@ declare class UseMaterial extends PointerEvent_2 {
5827
5866
 
5828
5867
  declare type ValuesOf<T extends readonly any[]> = T[number];
5829
5868
 
5830
- export declare const VERSION = "0.33.15";
5869
+ export declare const VERSION = "0.33.16";
5831
5870
 
5832
5871
  declare interface Viewport {
5833
5872
  left: number;