@roomle/web-sdk 4.2.0-alpha.7 → 4.3.0-alpha.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.
Files changed (87) hide show
  1. package/lib/ConfiguratorKernel.wasm +0 -0
  2. package/lib/{GaussianBlurNode-DEczNsyD.mjs → GaussianBlurNode-Bjszve7N.mjs} +15 -15
  3. package/lib/{GaussianBlurNode-DEczNsyD.mjs.map → GaussianBlurNode-Bjszve7N.mjs.map} +1 -1
  4. package/lib/RoomleCore.wasm +0 -0
  5. package/lib/RoomleToolsCore.wasm +0 -0
  6. package/lib/{api-B6sLiuiL.mjs → api-C0UElaCW.mjs} +2 -2
  7. package/lib/{api-B6sLiuiL.mjs.map → api-C0UElaCW.mjs.map} +1 -1
  8. package/lib/asset-loader.worker-eqHzNAwa.mjs.map +1 -1
  9. package/lib/{banana-for-scale-C-grIlTK.mjs → banana-for-scale-DGYmxeBG.mjs} +3 -3
  10. package/lib/{banana-for-scale-C-grIlTK.mjs.map → banana-for-scale-DGYmxeBG.mjs.map} +1 -1
  11. package/lib/budgeteer.sw-BUMElkO1.mjs.map +1 -1
  12. package/lib/{common-utils-6T8eGlhX.mjs → common-utils-CyQUubmw.mjs} +29 -15
  13. package/lib/{common-utils-6T8eGlhX.mjs.map → common-utils-CyQUubmw.mjs.map} +1 -1
  14. package/lib/{component-dimensioning-DJuokZnv.mjs → component-dimensioning--4sX2AgY.mjs} +4 -4
  15. package/lib/{component-dimensioning-DJuokZnv.mjs.map → component-dimensioning--4sX2AgY.mjs.map} +1 -1
  16. package/lib/{component-raycast-helper-SZg14d7A.mjs → component-raycast-helper-CskJedpv.mjs} +3 -3
  17. package/lib/{component-raycast-helper-SZg14d7A.mjs.map → component-raycast-helper-CskJedpv.mjs.map} +1 -1
  18. package/lib/configurator-CjFo24FH.mjs +2 -0
  19. package/lib/{configurator-Cbof6AET.mjs → configurator-vxRFxJ-B.mjs} +4 -4
  20. package/lib/{configurator-Cbof6AET.mjs.map → configurator-vxRFxJ-B.mjs.map} +1 -1
  21. package/lib/{decorate-CX1ZGuFY.mjs → decorate-CjaqqbUP.mjs} +12 -9
  22. package/lib/decorate-CjaqqbUP.mjs.map +1 -0
  23. package/lib/dimensioning-helper-0s61LK9R.mjs +2 -0
  24. package/lib/{dimensioning-helper-BwvR76_I.mjs → dimensioning-helper-Cgao7A18.mjs} +2 -2
  25. package/lib/{dimensioning-helper-BwvR76_I.mjs.map → dimensioning-helper-Cgao7A18.mjs.map} +1 -1
  26. package/lib/{glb-viewer-DmVh1uJg.mjs → glb-viewer-B-r0E1aa.mjs} +6 -6
  27. package/lib/{glb-viewer-DmVh1uJg.mjs.map → glb-viewer-B-r0E1aa.mjs.map} +1 -1
  28. package/lib/glb-viewer-BnJkmakv.mjs +2 -0
  29. package/lib/{highlight-coordinator-Qonmfsu1.mjs → highlight-coordinator-CR5rcFh_.mjs} +2 -2
  30. package/lib/{highlight-coordinator-Qonmfsu1.mjs.map → highlight-coordinator-CR5rcFh_.mjs.map} +1 -1
  31. package/lib/{homag-intelligence-CzD_RMQo.mjs → homag-intelligence-DHTCBB64.mjs} +8 -5
  32. package/lib/{homag-intelligence-CzD_RMQo.mjs.map → homag-intelligence-DHTCBB64.mjs.map} +1 -1
  33. package/lib/{imos-ix-poc-export-helper-Q6-OXziY.mjs → imos-ix-poc-export-helper-DRQK_p2h.mjs} +2 -2
  34. package/lib/{imos-ix-poc-export-helper-Q6-OXziY.mjs.map → imos-ix-poc-export-helper-DRQK_p2h.mjs.map} +1 -1
  35. package/lib/{material-viewer-BkSh-aG7.mjs → material-viewer-ZlNDhA8D.mjs} +6 -6
  36. package/lib/{material-viewer-BkSh-aG7.mjs.map → material-viewer-ZlNDhA8D.mjs.map} +1 -1
  37. package/lib/{packages-BGVMQMZK.mjs → packages-C9J0u-cc.mjs} +5 -5
  38. package/lib/{packages-BGVMQMZK.mjs.map → packages-C9J0u-cc.mjs.map} +1 -1
  39. package/lib/planner-C-5Mg-Lv.mjs +2 -0
  40. package/lib/{planner-DFa8uJOF.mjs → planner-ClY-VUWt.mjs} +3 -3
  41. package/lib/{planner-DFa8uJOF.mjs.map → planner-ClY-VUWt.mjs.map} +1 -1
  42. package/lib/{plugin-system-CqXT37-v.mjs → plugin-system-vlnG8j2T.mjs} +3 -3
  43. package/lib/{plugin-system-CqXT37-v.mjs.map → plugin-system-vlnG8j2T.mjs.map} +1 -1
  44. package/lib/{roomle-headless-setup-7xnQlZl3.mjs → roomle-headless-setup-DbO_rLjK.mjs} +54 -40
  45. package/lib/roomle-headless-setup-DbO_rLjK.mjs.map +1 -0
  46. package/lib/roomle-headless.d.ts +125 -115
  47. package/lib/roomle-headless.js +289 -358
  48. package/lib/roomle-headless.js.map +1 -1
  49. package/lib/roomle-renderer-FUqNfNIf.mjs.map +1 -1
  50. package/lib/{roomle-sdk-B73VmWod.mjs → roomle-sdk-BpCPIwDm.mjs} +2447 -2306
  51. package/lib/roomle-sdk-BpCPIwDm.mjs.map +1 -0
  52. package/lib/roomle-sdk.d.ts +79 -4
  53. package/lib/roomle-sdk.js +7 -7
  54. package/lib/{roomle-webgpu-renderer-Dzuy_Y39.mjs → roomle-webgpu-renderer-Lt55gNj5.mjs} +370 -303
  55. package/lib/roomle-webgpu-renderer-Lt55gNj5.mjs.map +1 -0
  56. package/lib/{scene-renderer-DR7EFd-8.mjs → scene-renderer-CLkhNnnv.mjs} +5 -5
  57. package/lib/{scene-renderer-DR7EFd-8.mjs.map → scene-renderer-CLkhNnnv.mjs.map} +1 -1
  58. package/lib/{script-loader-BlsGBrYo.mjs → script-loader-9GrUxzSB.mjs} +3 -3
  59. package/lib/{script-loader-BlsGBrYo.mjs.map → script-loader-9GrUxzSB.mjs.map} +1 -1
  60. package/lib/{shading-settings-Bnt9v9xJ.mjs → shading-settings-CRNmMpcn.mjs} +2 -2
  61. package/lib/{shading-settings-Bnt9v9xJ.mjs.map → shading-settings-CRNmMpcn.mjs.map} +1 -1
  62. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
  63. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
  64. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
  65. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
  66. package/lib/{stats-helper-vEwFkDIt.mjs → stats-helper-D9l8soWd.mjs} +3 -3
  67. package/lib/{stats-helper-vEwFkDIt.mjs.map → stats-helper-D9l8soWd.mjs.map} +1 -1
  68. package/lib/three.tsl-BnL9nfJa.mjs +2 -0
  69. package/lib/{three.tsl-BElp7_oF.mjs → three.tsl-Dew9p5yF.mjs} +46 -48
  70. package/lib/{three.tsl-BElp7_oF.mjs.map → three.tsl-Dew9p5yF.mjs.map} +1 -1
  71. package/lib/{threejs-utils-C9zED_Tu.mjs → threejs-utils-CKV1QNU9.mjs} +4 -3
  72. package/lib/threejs-utils-CKV1QNU9.mjs.map +1 -0
  73. package/lib/{tools-core-DKYMilYC.mjs → tools-core-CKaB3WsP.mjs} +3 -3
  74. package/lib/{tools-core-DKYMilYC.mjs.map → tools-core-CKaB3WsP.mjs.map} +1 -1
  75. package/lib/{webgpu-BMwlJflc.mjs → webgpu-B0rxiqW-.mjs} +313 -313
  76. package/lib/{webgpu-BMwlJflc.mjs.map → webgpu-B0rxiqW-.mjs.map} +1 -1
  77. package/package.json +2 -2
  78. package/lib/configurator-BFd5022u.mjs +0 -2
  79. package/lib/decorate-CX1ZGuFY.mjs.map +0 -1
  80. package/lib/dimensioning-helper-yMfkA1IY.mjs +0 -2
  81. package/lib/glb-viewer-DlH5_aTU.mjs +0 -2
  82. package/lib/planner-CSKuhBke.mjs +0 -2
  83. package/lib/roomle-headless-setup-7xnQlZl3.mjs.map +0 -1
  84. package/lib/roomle-sdk-B73VmWod.mjs.map +0 -1
  85. package/lib/roomle-webgpu-renderer-Dzuy_Y39.mjs.map +0 -1
  86. package/lib/three.tsl-BtDRDR0q.mjs +0 -2
  87. package/lib/threejs-utils-C9zED_Tu.mjs.map +0 -1
@@ -2016,6 +2016,7 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
2016
2016
  private _subPartObject;
2017
2017
  private _subPartGuard;
2018
2018
  protected _components: Map<number, RoomleComponent>;
2019
+ private _componentsWithOutdatedGeometry;
2019
2020
  private _previews;
2020
2021
  protected _componentNumberOfPossibleChildren: Map<number, number>;
2021
2022
  protected _componentFactory: RoomleComponentFactory;
@@ -2064,6 +2065,7 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
2064
2065
  Editor3dGeometryReady(id: number): void;
2065
2066
  Editor3dGeometryNotReady(id: number): void;
2066
2067
  Editor3dPlanObjectConstructionDone(planObjectId: number): void;
2068
+ private _finishPendingPlanObjectConstruction;
2067
2069
  Editor3dPreviewConstructionDone(componentId: number, _objectId: number): void;
2068
2070
  Editor3dSetPreviewAssociations(dockPairs: KernelDockPairPreview[], previewId: number): void;
2069
2071
  componentDeleted(componentId: number): void;
@@ -2097,6 +2099,7 @@ export declare class ConfiguratorViewModel implements ConfiguratorKernelCallback
2097
2099
  protected _generateMesh(runtimeComponentId: number | undefined, geometryId: string | null | undefined, materialId: string | null, vertices: Float32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array, _type?: KernelEnum, _newGeometryInstance?: boolean, materialAttributes?: Record<string, string>): Mesh;
2098
2100
  protected _setMaterial(mesh: Mesh, material: any, _type?: KernelEnum): void;
2099
2101
  constructComponents(planObjectId: number): void;
2102
+ private _takeOutdatedGeometryOf;
2100
2103
  requestSubPartConstruction(partId: number): Promise<Mesh>;
2101
2104
  protected getMeshGenerator(): MeshGenerator;
2102
2105
  setRequestRenderCallback(requestRenderCallback: () => void): void;
@@ -2280,6 +2283,7 @@ export declare const CORE_PLAN_COMPONENT_TYPE: {
2280
2283
  export declare const CORE_PLAN_ROOM_GEOMETRY_MODE: {
2281
2284
  readonly FLOOR: 0;
2282
2285
  readonly ROOM: 1;
2286
+ readonly PLAN: 2;
2283
2287
  };
2284
2288
 
2285
2289
  export declare const CORE_SNAP_STATE: {
@@ -2957,9 +2961,13 @@ export declare interface ExternalObjectAPI {
2957
2961
  */
2958
2962
  loadExternalObjectGroups(groupJson: ExternalGroupData, options: LoadExternalObjectOptions): Promise<LoadExternalObjectGroupResult[]>;
2959
2963
  /**
2960
- * "loadExternalObjectGroupLayout" creates and loads a group of modules from an article layout.
2961
- * @param articleLayoutJson The article layout JSON as object.
2962
- * @param layoutType The article layout type. Only "nobila" is supported at the moment.
2964
+ * "loadExternalObjectGroupLayout" creates and loads groups of modules from an article layout.
2965
+ * @param articleLayoutJson The article layout JSON as object. The layout type "nobila" evaluates
2966
+ * the "shapes" property, the layout type "posGroups" evaluates the "posGroups" property.
2967
+ * For the layout type "posGroups" a group whose id matches a group already loaded in the plan
2968
+ * completely replaces that group; root modules keep their ids when they already exist in the
2969
+ * replaced group, all other ids are regenerated.
2970
+ * @param layoutType The article layout type. "nobila" and "posGroups" are supported.
2963
2971
  * @param options Options for loading the external object group.
2964
2972
  */
2965
2973
  loadExternalObjectGroupLayout(articleLayoutJson: ExternalObjectGroupLayout, layoutType: string, options?: LoadExternalObjectOptions): Promise<LoadExternalObjectGroupResult[]>;
@@ -3056,6 +3064,13 @@ export declare interface ExternalObjectAPI {
3056
3064
  * "getExternalRoomInformation" returns the room information for currently loaded in the plan.
3057
3065
  */
3058
3066
  getExternalRoomInformation(mode?: PlanRoomGeometryMode): Promise<ExternalRoomInformation>;
3067
+ /**
3068
+ * "getExternalObjectPlanContext" returns a consistent snapshot of the external object state:
3069
+ * the master data per library, the room information of all rooms, the articles that can be
3070
+ * used, and all groups currently loaded in the plan.
3071
+ * @param include The sections to include. All sections are returned when omitted or empty.
3072
+ */
3073
+ getExternalObjectPlanContext(include?: HiPlanContextSection[]): Promise<HiPlanContext>;
3059
3074
  /**
3060
3075
  * It generates a snapshot of the external object in the plan without saving any data.
3061
3076
  * By default, the snapshot includes order data, room information, the plan XML, GLBs of the complete scene,
@@ -3130,6 +3145,7 @@ export declare interface ExternalObjectGroup {
3130
3145
  export declare interface ExternalObjectGroupLayout {
3131
3146
  [key: string]: unknown;
3132
3147
  shapes?: ExternalObjectGroupLayoutShape[];
3148
+ posGroups?: PosGroup[];
3133
3149
  }
3134
3150
 
3135
3151
  export declare interface ExternalObjectGroupLayoutArticle {
@@ -3651,8 +3667,9 @@ export declare interface GlueLogic {
3651
3667
  getSaveDataGroups(): Promise<PosGroup[] | null>;
3652
3668
  getSubArticleId(id: string): string | undefined;
3653
3669
  newPosDataFromId(id: string): Promise<PosGroup | undefined>;
3654
- newPosDataFromArticleLayout(articleLayoutJson: ExternalObjectGroupLayout, layoutType: string, posArticles?: PosArticle[]): Promise<PosGroup | undefined>;
3670
+ createOrReplacePosDataFromArticleLayout(articleLayoutJson: ExternalObjectGroupLayout, layoutType: string, posArticles?: PosArticle[]): Promise<PosGroup | PosGroup[] | undefined>;
3655
3671
  newPosDataFromGroup(posDataJson: PosGroup): Promise<PosGroup>;
3672
+ getPlanContext(include?: HiPlanContextSection[]): Promise<HiPlanContext>;
3656
3673
  getGroupDataForOrder(options: GetGroupDataForOrderOptions): Promise<HiOrderData | null>;
3657
3674
  getMaterialUrl(materialId: string, groupOrModuleId?: string): string | null;
3658
3675
  }
@@ -3812,25 +3829,12 @@ export declare interface HeadlessInitData extends Partial<InitDataDefinition>, P
3812
3829
  }
3813
3830
 
3814
3831
  export declare class HeadlessRoomleSdk {
3815
- private _planner;
3816
- private _plannerMain;
3817
- private _configurator;
3818
- private _configuratorMain;
3819
- private _glbViewer;
3820
- private _glbViewerMain;
3821
- private _initialized;
3822
- private _configuratorReady;
3823
- private _plannerReady;
3824
- private _glbViewerReady;
3825
- private _loadedConfigurationId;
3826
- private _loadedPlanId;
3827
- private _loadedStaticItemId;
3828
- private _width;
3829
- private _height;
3830
- private _featureFlags?;
3831
- private _webGpuConfig?;
3832
- private _webGpu;
3832
+ private readonly _initData;
3833
+ private readonly _webGpuConfig;
3834
+ private readonly _container;
3835
+ private _plannerMainPromise;
3833
3836
  private _loaderQueue;
3837
+ private _loadedScene;
3834
3838
  private _skyboxOriginal;
3835
3839
  /**
3836
3840
  * Create and initialize a headless SDK instance.
@@ -3838,82 +3842,66 @@ export declare class HeadlessRoomleSdk {
3838
3842
  * @returns Initialized SDK instance.
3839
3843
  */
3840
3844
  static create(initData: HeadlessInitData): Promise<HeadlessRoomleSdk>;
3841
- private _init;
3842
- private _deepMergeHeadlessInitDefaults;
3843
- private _registerHeadlessServices;
3844
- private _makeStubElement;
3845
+ private constructor();
3845
3846
  /**
3846
- * Boot and initialize the configurator module ahead of first load.
3847
- * @param initData Optional per-module init overrides.
3847
+ * Mount the configurator inside the planner, booting the planner if needed.
3848
+ * It shares the planner's kernel and scene manager (the planner's own
3849
+ * configure-in-room path) and never loads a scene of its own.
3848
3850
  */
3849
- prewarmConfigurator(initData?: Partial<InitDataDefinition>): Promise<void>;
3851
+ getHeadlessConfigurator(): Promise<RoomleConfigurator>;
3850
3852
  /**
3851
- * Boot and initialize the planner module ahead of first load.
3852
- * @param initData Optional per-module init overrides.
3853
+ * Boot and initialize the headless planner. Optional: every load boots it
3854
+ * on demand.
3853
3855
  */
3854
- prewarmPlanner(initData?: Partial<InitDataDefinition>): Promise<void>;
3856
+ createHeadlessPlanner(): Promise<void>;
3855
3857
  /**
3856
- * Boot and initialize the GLB viewer module ahead of first load.
3857
- * @param initData Optional per-module init overrides.
3858
+ * The first call boots a planner, every other one awaits the same boot promise
3859
+ * so we can only ever have 1 instance.
3858
3860
  */
3859
- prewarmGlbViewer(initData?: Partial<InitDataDefinition>): Promise<void>;
3861
+ private _getPlannerMain;
3862
+ private _bootPlanner;
3863
+ private _getPlanner;
3864
+ private _getConfigurator;
3860
3865
  /**
3861
- * Load a saved configuration by **id**, via the RAPI `/configurations/`
3862
- * endpoint. For an inline configuration string use
3863
- * {@link loadConfigurationString} instead.
3864
- * @param configurationId Multi-segment id like `catalog:item:HASH`.
3865
- * @param initData Optional per-module init overrides for prewarm.
3866
+ * Load a saved configuration by **id**. Like every load it goes through the
3867
+ * planner: `createPlanFromObject` picks the RAPI endpoint from the id shape
3868
+ * (`/items/` for `catalog:item`, `/configurations/` for `catalog:item:HASH`),
3869
+ * so this method, {@link loadConfigurableItemById} and {@link loadStaticItem}
3870
+ * behave the same and only name the caller's intent. For an inline
3871
+ * configuration string use {@link loadConfigurationString} instead.
3872
+ * @param configurationId `catalog:item:HASH`.
3866
3873
  */
3867
- loadConfiguration(configurationId: RapiId, initData?: Partial<InitDataDefinition>): Promise<void>;
3874
+ loadConfiguration(configurationId: RapiId): Promise<void>;
3868
3875
  /**
3869
3876
  * Load a configuration string directly without querying the RAPI (`{"componentId":"catalog:item",…}`)
3870
3877
  * To load a configuration by ID, use {@link loadConfiguration}
3871
3878
  */
3872
- loadConfigurationString(configuration: string, initData?: Partial<InitDataDefinition>): Promise<void>;
3879
+ loadConfigurationString(configuration: string): Promise<void>;
3873
3880
  /**
3874
- * Load a configurable item via the RAPI `/items/` endpoint.
3881
+ * Load a configurable item by id. Same path as {@link loadConfiguration};
3882
+ * the name states the intent.
3875
3883
  * @param itemId Single-segment id like `catalog:item`.
3876
- * @param initData Optional per-module init overrides for prewarm.
3877
3884
  */
3878
- loadConfigurableItemById(itemId: RapiId, initData?: Partial<InitDataDefinition>): Promise<void>;
3879
- private _loadIntoConfigurator;
3885
+ loadConfigurableItemById(itemId: RapiId): Promise<void>;
3880
3886
  /**
3881
- * Load a static (non-configurable) item via the GLB viewer.
3887
+ * Load a static (non-configurable) item. Same path as
3888
+ * {@link loadConfiguration}; the kernel decides static vs. configurable.
3882
3889
  * @param staticItemId Catalog item id whose RAPI record has no `configuration`.
3883
- * @param initData Optional per-module init overrides for prewarm.
3884
- */
3885
- loadStaticItem(staticItemId: string, initData?: Partial<InitDataDefinition>): Promise<void>;
3886
- /**
3887
- * GLB-loaded scenes commonly contain hundreds of thousands of triangles
3888
- * (high-poly furniture/cars). With the default 1024² shadow map those
3889
- * triangles cast a self-shadow pattern back onto themselves that the
3890
- * shadow comparison can't resolve cleanly — it appears as a dense
3891
- * triangle/herringbone overlay covering every PBR-shaded surface
3892
- * (visible on flat-coloured car bodies, wood slats, etc.). The
3893
- * artifact is specific to headless's GL backend; in the browser the
3894
- * same scene renders fine.
3895
- *
3896
- * Walking the freshly-loaded scene and clearing `castShadow` on every
3897
- * mesh removes the cause of the acne while keeping `receiveShadow`,
3898
- * so static items still pick up shadows from external casters and
3899
- * full PBR direct-light shading is preserved.
3900
3890
  */
3901
- private _suppressGlbSelfShadowing;
3902
- loadObject(id: string, initData?: Partial<InitDataDefinition>): Promise<void>;
3891
+ loadStaticItem(staticItemId: string): Promise<void>;
3892
+ loadObject(id: string): Promise<void>;
3903
3893
  /**
3904
3894
  * Load a plan into the planner.
3905
3895
  * @param planId Plan id (no colons).
3906
- * @param initData Optional per-module init overrides for prewarm.
3907
3896
  */
3908
- loadPlan(planId: string, initData?: Partial<InitDataDefinition>): Promise<void>;
3897
+ loadPlan(planId: string): Promise<void>;
3909
3898
  /**
3910
3899
  * Load plan XML string directly in the planner.
3911
3900
  * @param xml Plan XML (`<plan version="2">…</plan>`).
3912
- * @param initData Optional per-module init overrides for prewarm.
3913
3901
  */
3914
- loadPlanXml(xml: string, initData?: Partial<InitDataDefinition>): Promise<void>;
3902
+ loadPlanXml(xml: string): Promise<void>;
3915
3903
  private _loadIntoPlanner;
3916
- private _inlineSceneId;
3904
+ private _load;
3917
3905
  /**
3918
3906
  * Serialises concurrent load operations using a promise-chain queue.
3919
3907
  * Each call chains its task onto the previous queue tail so they run
@@ -3922,28 +3910,6 @@ export declare class HeadlessRoomleSdk {
3922
3910
  * always advanced in a settled state).
3923
3911
  */
3924
3912
  private _withLoader;
3925
- /**
3926
- * Wait for the active scene to fire its onReadyForRender callback —
3927
- * fired by each scene manager once `_itemsLoaded` (planner) /
3928
- * `loadConfiguration` (configurator) / `loadStaticItem` (GLB viewer)
3929
- * has finished constructing the scene and queued its materials. The
3930
- * callback is armed via {@link _armOnReadyForRender} *before* the load
3931
- * begins so synchronous firings (the GLB viewer does this) are still
3932
- * caught.
3933
- */
3934
- private _settleScene;
3935
- /**
3936
- * Pre-arms an onReadyForRender listener on the *global* callback (shared
3937
- * across configurator/planner/GLB viewer) so that it captures even
3938
- * synchronous firings during the upcoming load. Restores the previous
3939
- * callback after firing. Using the global callback rather than each
3940
- * module's api.callbacks is necessary because the GLB viewer only fires
3941
- * the global one ([glb-viewer-scene-manager.ts:355](packages/web-sdk/packages/glb-viewer-core/src/webgl/glb-viewer-scene-manager.ts:355)).
3942
- */
3943
- private _armOnReadyForRender;
3944
- private _onReadyForRenderArmed;
3945
- private _getPlannerListenerInfo;
3946
- private _getConfiguratorListenerInfo;
3947
3913
  /**
3948
3914
  * Export the active scene as GLB.
3949
3915
  * @param outputPath Optional file path to write the buffer to.
@@ -3956,16 +3922,7 @@ export declare class HeadlessRoomleSdk {
3956
3922
  * @returns The USDZ bytes as an ArrayBuffer.
3957
3923
  */
3958
3924
  exportUSDZ(outputPath?: string): Promise<ExportResult>;
3959
- /**
3960
- * Returns the active top-level API (planner or configurator) based on what
3961
- * was last loaded. `loadPlan()` and `loadConfiguration()` are mutually
3962
- * exclusive — each one nulls the other's id — so this resolves cleanly.
3963
- */
3964
- private _getActiveApi;
3965
- /**
3966
- * Returns the scene manager of whichever module is active. All exporters
3967
- * route through here so plan-mode and config-mode share a single code path.
3968
- */
3925
+ private _requireLoadedScene;
3969
3926
  private _getActiveSceneManager;
3970
3927
  setEnvironmentMap(url: string, options?: EnvironmentMapOptions): Promise<void>;
3971
3928
  resetEnvironmentMap(options?: EnvironmentMapOptions): Promise<void>;
@@ -3973,6 +3930,8 @@ export declare class HeadlessRoomleSdk {
3973
3930
  private _getEnvironmentSceneManager;
3974
3931
  setSkybox(url: string): Promise<void>;
3975
3932
  resetSkybox(): void;
3933
+ private _useEnvironmentGeometry;
3934
+ private _withLoadedScene;
3976
3935
  private _export;
3977
3936
  /**
3978
3937
  * Render a perspective screenshot preserving the scene background.
@@ -3997,7 +3956,9 @@ export declare class HeadlessRoomleSdk {
3997
3956
  height: number;
3998
3957
  }>;
3999
3958
  /**
4000
- * Render a top-down image of the scene. Not supported for static items.
3959
+ * Render a top-down image of the scene. Not covered by tests for static
3960
+ * items (RML-17789): the GLB viewer used to refuse them, the planner path
3961
+ * does not, and nobody has verified the output yet.
4001
3962
  * @param outputPath Optional file path to write the PNG to.
4002
3963
  * @param options ssaa, size, showDimensions.
4003
3964
  * @returns Data URL plus final image dimensions.
@@ -4007,18 +3968,9 @@ export declare class HeadlessRoomleSdk {
4007
3968
  width: number;
4008
3969
  height: number;
4009
3970
  }>;
4010
- private _resolveTopImage;
4011
- private _getRenderDimensions;
4012
- private _resolveImageDataUrl;
4013
- private _writeDataUrlToFile;
4014
- private _rawPixelsToPngDataUrl;
4015
- /** Downscale a data URL image to target dimensions using high-quality filtering. */
4016
- private _ssaaDownscale;
4017
- getConfiguratorApi(): RoomleConfigurator<readonly []>;
4018
- getPlannerApi(): RoomlePlanner<readonly []>;
4019
- /** Destroy any prewarmed configurator, planner, and GLB viewer modules. */
3971
+ getConfiguratorApi(): Promise<RoomleConfigurator>;
3972
+ getPlannerApi(): Promise<RoomlePlanner>;
4020
3973
  destroy(): Promise<void>;
4021
- private _ensureInitialized;
4022
3974
  }
4023
3975
 
4024
3976
  export declare interface HelpLineType {
@@ -4101,6 +4053,15 @@ export declare interface HiObjectSelectionApi {
4101
4053
  selectionChanged(selectionMode: SELECTION_MODE, objectType: CallbackObjectType, payload: SelectionPayload, _payloadPromise: Promise<SelectionPayload>, _planElementViewModel: PlanElementViewModel): void;
4102
4054
  }
4103
4055
 
4056
+ export declare interface HiPlanContext {
4057
+ masterData?: Record<string, MasterData>;
4058
+ rooms?: ExternalRoomInformation;
4059
+ articles?: PosArticle[];
4060
+ groups?: PosGroup[];
4061
+ }
4062
+
4063
+ export declare type HiPlanContextSection = 'masterData' | 'rooms' | 'articles' | 'groups';
4064
+
4104
4065
  export declare class HiTagCatalogCallbacks implements Context {
4105
4066
  _creator_: string;
4106
4067
  private _glueLogic;
@@ -5142,6 +5103,7 @@ export declare interface LoadExternalObjectGroupResult {
5142
5103
 
5143
5104
  export declare interface LoadExternalObjectOptions {
5144
5105
  reason?: HiLoadObjectReason;
5106
+ applyGroupPosition?: boolean;
5145
5107
  findFreeSpaceInPlan?: boolean;
5146
5108
  moduleIdMap?: Array<{
5147
5109
  originalModuleId: string;
@@ -5820,6 +5782,7 @@ export declare const PLAN_ELEMENT_CHANGE_TYPES: {
5820
5782
  export declare const PLAN_ROOM_GEOMETRY_MODE: {
5821
5783
  readonly FLOOR: "floor";
5822
5784
  readonly ROOM: "room";
5785
+ readonly PLAN: "plan";
5823
5786
  };
5824
5787
 
5825
5788
  export declare abstract class PlanElement extends AbstractModelWrapper {
@@ -6380,6 +6343,7 @@ export declare class PlannerSceneEventHandler extends SceneEventHandler<SceneEve
6380
6343
  private _move;
6381
6344
  hasSelection(): boolean;
6382
6345
  selectPlanElement(planElement: PlanElementViewModel): Promise<void>;
6346
+ selectPlanElementAfterObjectModeChange(planElement: PlanElementViewModel): void;
6383
6347
  protected _interaction(_forceRender?: boolean): void;
6384
6348
  addComponentDragInHandler(planViewModel: PlanElementViewModel): void;
6385
6349
  enableSnapping(): void;
@@ -6514,6 +6478,7 @@ export declare class PlannerSceneManager extends ConfiguratorSceneManager implem
6514
6478
  private _setCameraPosition;
6515
6479
  private _resetCameraPosition;
6516
6480
  selectPlanObject(runtimeId: number): Promise<void>;
6481
+ selectPlanObjectAfterObjectModeChange(runtimeId: number): void;
6517
6482
  backToPlanner(): void;
6518
6483
  private _getYRotationOfObject;
6519
6484
  loadStaticPlanObjects(): void;
@@ -8292,6 +8257,7 @@ export declare interface RoomleComponent extends RoomleEventedObject3D {
8292
8257
  animationValueMap?: AnimationValueMap;
8293
8258
  get childComponents(): RoomleComponent[];
8294
8259
  get parentComponent(): RoomleComponent | null;
8260
+ get rootComponent(): RoomleComponent;
8295
8261
  replaceMeshes(meshes: Mesh[]): void;
8296
8262
  addMesh(mesh: Mesh, transform?: Float32Array): void;
8297
8263
  removeMesh(mesh: Mesh): void;
@@ -9321,6 +9287,14 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
9321
9287
  * return the object runtime id
9322
9288
  */
9323
9289
  createPlanFromObject(id: RapiId, position?: Position3, rotation?: number): Promise<number>;
9290
+ /**
9291
+ * Creates a plan holding a single object built from a configuration string
9292
+ * @param configuration configuration string (`{"componentId":"catalog:item",…}`).
9293
+ * @param position XYZ
9294
+ * @param rotation deg
9295
+ */
9296
+ createPlanFromConfigurationString(configuration: string, position?: Position3, rotation?: number): Promise<number>;
9297
+ private _createPlanFromElement;
9324
9298
  loadPlanXml(xml: string, options?: InitDataDefinition & GlobalInitDataDefinition): Promise<void>;
9325
9299
  /**
9326
9300
  * Creates 2D elevation plans of the current plan, one per elevation view.
@@ -9678,6 +9652,7 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
9678
9652
  private _loadExternalObjectGroupInConfigurator;
9679
9653
  private _loadExternalObjectGroupInPlanner;
9680
9654
  private _updateExternalObjectRootModuleSelection;
9655
+ private _mergeAndSelectExternalObjectGroup;
9681
9656
  private _loadOrUpdateExternalObjectGroup;
9682
9657
  private _interactionBeforeLoadingExternalObjectGroups;
9683
9658
  private _interactionAfterLoadingExternalObjectGroups;
@@ -9699,6 +9674,7 @@ export declare class RoomlePlanner<P extends readonly PluginName[] = readonly []
9699
9674
  openOrCloseGeometryOfExternalObject(groupIdOrRootModuleId: string, _subModuleId: string | null, open: boolean, animate: boolean): void;
9700
9675
  _selectExternalObjectGroup(groupId: string, switchToPlanner: boolean): Promise<void>;
9701
9676
  getExternalObjectGroups(): Promise<object[]>;
9677
+ getExternalObjectPlanContext(include?: HiPlanContextSection[]): Promise<HiPlanContext>;
9702
9678
  getExternalRoomInformation(mode?: PlanRoomGeometryMode): Promise<ExternalRoomInformation>;
9703
9679
  /**
9704
9680
  * Highlights a product in the planner.
@@ -10304,6 +10280,7 @@ export declare abstract class SceneManager implements Context, LifeCycleCallback
10304
10280
  private _clock;
10305
10281
  private _delta;
10306
10282
  protected _renderLoopFunction: (() => void) | null;
10283
+ private _renderLoopFunctionApplied;
10307
10284
  protected _renderListener: (() => void) | null;
10308
10285
  protected _stopRendering: boolean;
10309
10286
  protected _roomleRenderer: GenericRoomleRenderer | null;
@@ -10320,6 +10297,12 @@ export declare abstract class SceneManager implements Context, LifeCycleCallback
10320
10297
  protected abstract createCameraControl(mode: Enumify_2<typeof CAMERA_TYPE>, offset: CanvasOffset): void;
10321
10298
  protected abstract _getInputManager(): InputManager;
10322
10299
  get cameraBehaviour(): CameraBehaviour;
10300
+ protected _scheduleRenderLoopFunction(renderLoopFunction: () => void): void;
10301
+ /**
10302
+ * Resolves the next time the render loop applies a scheduled function, so arm
10303
+ * it **before** triggering the work whose mutation you are waiting for.
10304
+ */
10305
+ whenRenderLoopFunctionApplied(): Promise<void>;
10323
10306
  abstract sceneChanged(): void;
10324
10307
  abstract getBounds(): Box3 | null;
10325
10308
  abstract getGeometryBounds(): Box3 | null;
@@ -11235,6 +11218,7 @@ export declare class WebGpuConfig implements WebGpuConfigDefinition {
11235
11218
  topLight: WebGpuTopLightConfig;
11236
11219
  groundReflection: WebGpuGroundReflectionConfig;
11237
11220
  fog: WebGpuFogConfig;
11221
+ ssgi: WebGpuSSGIConfig;
11238
11222
  toneMapping: WebGpuToneMapping;
11239
11223
  toneMappingExposure: number;
11240
11224
  }
@@ -11273,6 +11257,10 @@ export declare interface WebGpuConfigDefinition {
11273
11257
  * @description Visual configuration for the WebGPU fog.
11274
11258
  */
11275
11259
  fog?: WebGpuFogConfigDefinition;
11260
+ /**
11261
+ * @description Visual configuration for the WebGPU screen space global illumination (SSGI) effect.
11262
+ */
11263
+ ssgi?: WebGpuSSGIConfigDefinition;
11276
11264
  /**
11277
11265
  * @description Tone mapping operator applied by the WebGPU renderer.
11278
11266
  * @default 'none'
@@ -11353,6 +11341,28 @@ export declare interface WebGpuGroundReflectionConfigDefinition {
11353
11341
  endFadeout?: number;
11354
11342
  }
11355
11343
 
11344
+ export declare class WebGpuSSGIConfig implements WebGpuSSGIConfigDefinition {
11345
+ giDenoiseRadius: number;
11346
+ aoDenoiseRadius: number;
11347
+ }
11348
+
11349
+ export declare interface WebGpuSSGIConfigDefinition {
11350
+ /**
11351
+ * @description Radius of the denoising filter applied to the indirect lighting.
11352
+ * Higher values produce a stronger denoising effect, which can help reduce noise
11353
+ * in the indirect lighting but may also blur fine details.
11354
+ * @default 20
11355
+ */
11356
+ giDenoiseRadius?: number;
11357
+ /**
11358
+ * @description Radius of the denoising filter applied to the ambient occlusion (AO) pass.
11359
+ * Higher values produce a stronger denoising effect, which can help reduce noise
11360
+ * in the AO but may also blur fine details.
11361
+ * @default 10
11362
+ */
11363
+ aoDenoiseRadius?: number;
11364
+ }
11365
+
11356
11366
  export declare type WebGpuToneMapping = Enumify_2<typeof WEBGPU_TONE_MAPPINGS>;
11357
11367
 
11358
11368
  export declare class WebGpuTopLightConfig implements WebGpuTopLightConfigDefinition {