@babylonjs/inspector 9.4.1 → 9.5.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.
@@ -131,6 +131,7 @@ import { HtmlElementTexture } from '@babylonjs/core/Materials/Textures/htmlEleme
131
131
  import { ShaderMaterial } from '@babylonjs/core/Materials/shaderMaterial.js';
132
132
  import { CreatePlane } from '@babylonjs/core/Meshes/Builders/planeBuilder.js';
133
133
  import { BaseTexture } from '@babylonjs/core/Materials/Textures/baseTexture.js';
134
+ import { EnvCubeTexture } from '@babylonjs/core/Materials/Textures/envCubeTexture.js';
134
135
  import { MultiRenderTarget } from '@babylonjs/core/Materials/Textures/multiRenderTarget.js';
135
136
  import { RenderTargetTexture } from '@babylonjs/core/Materials/Textures/renderTargetTexture.js';
136
137
  import { ThinTexture } from '@babylonjs/core/Materials/Textures/thinTexture.js';
@@ -148,6 +149,7 @@ import { FilesInput } from '@babylonjs/core/Misc/filesInput.js';
148
149
  import { registeredGLTFExtensions } from '@babylonjs/loaders/glTF/2.0/glTFLoaderExtensionRegistry.js';
149
150
  import { GLTFLoaderDefaultOptions, GLTFLoaderAnimationStartMode, GLTFLoaderCoordinateSystemMode } from '@babylonjs/loaders/glTF/glTFFileLoader.js';
150
151
  import { GLTFValidation } from '@babylonjs/loaders/glTF/glTFValidation.js';
152
+ import { GPUPicker } from '@babylonjs/core/Collisions/gpuPicker.js';
151
153
  import { EngineStore } from '@babylonjs/core/Engines/engineStore.js';
152
154
  import { DebugLayer } from '@babylonjs/core/Debug/debugLayer.js';
153
155
  import { Lazy } from '@babylonjs/core/Misc/lazy.js';
@@ -2786,6 +2788,16 @@ const ChildWindow = (props) => {
2786
2788
  // Setup the window state, including creating a Fluent/Griffel "renderer" for managing runtime styles/classes in the child window.
2787
2789
  setWindowState({ mountNode: body, renderer: createDOMRenderer(childWindow.document) });
2788
2790
  onOpenChange?.(true);
2791
+ // Track the most recently observed window bounds. In some browsers (e.g. Firefox), accessing
2792
+ // properties like screenX on a closed window throws, so we cache the last known good values
2793
+ // to use as a fallback when the dispose runs after the window has already been closed.
2794
+ const getBounds = () => ({
2795
+ left: childWindow.screenX,
2796
+ top: childWindow.screenY,
2797
+ width: childWindow.innerWidth,
2798
+ height: childWindow.innerHeight,
2799
+ });
2800
+ let lastBounds = getBounds();
2789
2801
  // When the child window is closed for any reason, transition back to a closed state.
2790
2802
  const onChildWindowUnload = () => {
2791
2803
  setWindowState(undefined);
@@ -2794,6 +2806,12 @@ const ChildWindow = (props) => {
2794
2806
  };
2795
2807
  childWindow.addEventListener("unload", onChildWindowUnload, { once: true });
2796
2808
  disposeActions.push(() => childWindow.removeEventListener("unload", onChildWindowUnload));
2809
+ // Capture bounds before the window is unloaded, while its properties are still safe to read.
2810
+ const onChildWindowBeforeUnload = () => {
2811
+ lastBounds = getBounds();
2812
+ };
2813
+ childWindow.addEventListener("beforeunload", onChildWindowBeforeUnload);
2814
+ disposeActions.push(() => childWindow.removeEventListener("beforeunload", onChildWindowBeforeUnload));
2797
2815
  // If the main window closes, close any open child windows as well (don't leave them orphaned).
2798
2816
  const onParentWindowUnload = () => {
2799
2817
  childWindow.close();
@@ -2805,12 +2823,10 @@ const ChildWindow = (props) => {
2805
2823
  // On dispose, save the window bounds.
2806
2824
  disposeActions.push(() => {
2807
2825
  if (storageKey) {
2808
- localStorage.setItem(storageKey, JSON.stringify({
2809
- left: childWindow.screenX,
2810
- top: childWindow.screenY,
2811
- width: childWindow.innerWidth,
2812
- height: childWindow.innerHeight,
2813
- }));
2826
+ if (!childWindow.closed) {
2827
+ lastBounds = getBounds();
2828
+ }
2829
+ localStorage.setItem(storageKey, JSON.stringify(lastBounds));
2814
2830
  }
2815
2831
  });
2816
2832
  }
@@ -8429,7 +8445,7 @@ function MakeModularTool(options) {
8429
8445
  }
8430
8446
  // Register the extension list service (for browsing/installing extensions) if extension feeds are provided.
8431
8447
  if (extensionFeeds.length > 0) {
8432
- const { ExtensionListServiceDefinition } = await import('./extensionsListService-Bjzp92Wm.js');
8448
+ const { ExtensionListServiceDefinition } = await import('./extensionsListService-C33SU1_a.js');
8433
8449
  serviceContainer.addService(ExtensionListServiceDefinition);
8434
8450
  }
8435
8451
  // Register all external services (that make up a unique tool).
@@ -8550,14 +8566,14 @@ const DefaultInspectorExtensionFeed = new BuiltInsExtensionFeed("Inspector", [
8550
8566
  description: "Adds a new panel for easy creation of various Babylon assets. This is a WIP extension...expect changes!",
8551
8567
  keywords: ["creation", "tools"],
8552
8568
  ...BabylonWebResources,
8553
- getExtensionModuleAsync: async () => await import('./quickCreateToolsService-8EfpPJ2S.js'),
8569
+ getExtensionModuleAsync: async () => await import('./quickCreateToolsService-pBNUavZe.js'),
8554
8570
  },
8555
8571
  {
8556
8572
  name: "Reflector",
8557
8573
  description: "Connects to the Reflector Bridge for real-time scene synchronization with the Babylon.js Sandbox.",
8558
8574
  keywords: ["reflector", "bridge", "sync", "sandbox", "tools"],
8559
8575
  ...BabylonWebResources,
8560
- getExtensionModuleAsync: async () => await import('./reflectorService-Ocj-te9O.js'),
8576
+ getExtensionModuleAsync: async () => await import('./reflectorService-CAi2NPRy.js'),
8561
8577
  },
8562
8578
  ]);
8563
8579
 
@@ -15671,78 +15687,6 @@ const CheckboxPropertyLine = (props) => {
15671
15687
  return (jsx(PropertyLine, { ...props, children: jsx(Checkbox, { ...props }) }));
15672
15688
  };
15673
15689
 
15674
- /**
15675
- * Displays the base layer properties of an OpenPBR material.
15676
- * @param props - The required properties
15677
- * @returns A JSX element representing the base layer properties.
15678
- */
15679
- const OpenPBRMaterialBaseProperties = (props) => {
15680
- const { material } = props;
15681
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Base Weight", target: material, propertyKey: "baseWeight", min: 0, max: 1, step: 0.01, description: "Controls how strong or visible the base aspect appears.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Weight", target: material, propertyKey: "baseWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Base Color", target: material, propertyKey: "baseColor", isLinearMode: true, description: "Sets the primary surface color of the material.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Color", target: material, propertyKey: "baseColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Base Metalness", target: material, propertyKey: "baseMetalness", min: 0, max: 1, step: 0.01, description: "Controls whether the material behaves as metal or non-metal. The parameter supersedes transmission_weight and subsurface_weight.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Metalness", target: material, propertyKey: "baseMetalnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Base Diffuse Roughness", target: material, propertyKey: "baseDiffuseRoughness", min: 0, max: 1, step: 0.01, description: "Softens the surface's base appearance. Higher values create matte or porous looks. Lower values are smoother.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Diffuse Roughness", target: material, propertyKey: "baseDiffuseRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Ambient Occlusion", target: material, propertyKey: "ambientOcclusionTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15682
- };
15683
- /**
15684
- * Displays the specular layer properties of an OpenPBR material.
15685
- * @param props - The required properties
15686
- * @returns A JSX element representing the specular layer properties.
15687
- */
15688
- const OpenPBRMaterialSpecularProperties = (props) => {
15689
- const { material } = props;
15690
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular Weight", target: material, propertyKey: "specularWeight", min: 0, max: 1, step: 0.01, description: "Controls how strong the reflections appear.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Weight", target: material, propertyKey: "specularWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Specular Color", target: material, propertyKey: "specularColor", isLinearMode: true, description: "Tints the color of reflections.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Color", target: material, propertyKey: "specularColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular Roughness", target: material, propertyKey: "specularRoughness", min: 0, max: 1, step: 0.01, description: "Controls how sharp or blurry reflections are.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Roughness", target: material, propertyKey: "specularRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular Roughness Anisotropy", target: material, propertyKey: "specularRoughnessAnisotropy", min: 0, max: 1, step: 0.01, description: "Stretches reflections in one direction for brushed or streaked looks. Requires specular_roughness > 0.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/microfacetmodel" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Roughness Anisotropy", target: material, propertyKey: "specularRoughnessAnisotropyTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular IOR", target: material, propertyKey: "specularIor", min: 1, max: 3, step: 0.01, description: "Index of refraction is a physical value controlling the reflective intensity and refraction. The parameter has no effect on metals.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" })] }));
15691
- };
15692
- const OpenPBRMaterialTransmissionProperties = (props) => {
15693
- const { material } = props;
15694
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Weight", target: material, propertyKey: "transmissionWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the transparency effect. The parameter is superseded by base_metalness.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Weight", target: material, propertyKey: "transmissionWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Transmission Color", target: material, propertyKey: "transmissionColor", isLinearMode: true, description: "Tints light passing through the material. Works with transmission_depth for realistic thickness-based coloring.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Color", target: material, propertyKey: "transmissionColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Depth (cm)", target: material, propertyKey: "transmissionDepth", min: 0, max: 5, step: 0.001, convertTo: (value) => value * 100, convertFrom: (value) => value / 100, description: "Controls how quickly light is absorbed with thickness. Distance is in scene units.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Depth", target: material, propertyKey: "transmissionDepthTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Transmission Scatter", target: material, propertyKey: "transmissionScatter", isLinearMode: true, description: "Adds internal cloudiness to create materials like juice, honey, etc. Requires transmission_depth > 0.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Scatter", target: material, propertyKey: "transmissionScatterTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Scatter Anisotropy", target: material, propertyKey: "transmissionScatterAnisotropy", min: -1, max: 1, step: 0.01, description: "Shifts scattering forward/backward for clearer or hazier appearance depending on viewing angle.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Dispersion Abbe Number", target: material, propertyKey: "transmissionDispersionAbbeNumber", min: 1, max: 100, step: 1, description: "Physical value for the rainbow color separation in refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Dispersion Scale", target: material, propertyKey: "transmissionDispersionScale", min: 0, max: 1, step: 0.01, description: "Strength of rainbow color separation in refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Dispersion Scale", target: material, propertyKey: "transmissionDispersionScaleTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15695
- };
15696
- const OpenPBRMaterialSubsurfaceProperties = (props) => {
15697
- const { material } = props;
15698
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Subsurface Weight", target: material, propertyKey: "subsurfaceWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the subsurface effect. The parameter is superseded by base_metalness and transmission_weight.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Subsurface Weight", target: material, propertyKey: "subsurfaceWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Subsurface Color", target: material, propertyKey: "subsurfaceColor", isLinearMode: true, description: "Colors the light that scatters under the surface.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Subsurface Color", target: material, propertyKey: "subsurfaceColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Subsurface Radius (cm)", target: material, propertyKey: "subsurfaceRadius", min: 0, max: 4, step: 0.001, convertTo: (value) => value * 100, convertFrom: (value) => value / 100, description: "Controls how soft and spread-out the subsurface look appears.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Subsurface Radius Scale", target: material, propertyKey: "subsurfaceRadiusScale", isLinearMode: true, description: "Tints thin areas with light shining through, like warm glow on ears or leaves.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Subsurface Radius Scale", target: material, propertyKey: "subsurfaceRadiusScaleTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Subsurface Scatter Anisotropy", target: material, propertyKey: "subsurfaceScatterAnisotropy", min: -1, max: 1, step: 0.01, description: "Shifts scattering forward/backward for a softer glow or a sharper one.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" })] }));
15699
- };
15700
- /**
15701
- * Displays the coat layer properties of an OpenPBR material.
15702
- * @param props - The required properties
15703
- * @returns A JSX element representing the coat layer properties.
15704
- */
15705
- const OpenPBRMaterialCoatProperties = (props) => {
15706
- const { material } = props;
15707
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Weight", target: material, propertyKey: "coatWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the coat.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Weight", target: material, propertyKey: "coatWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Coat Color", target: material, propertyKey: "coatColor", isLinearMode: true, description: "Tints the coat, for tinted varnish or paint.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Color", target: material, propertyKey: "coatColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Roughness", target: material, propertyKey: "coatRoughness", min: 0, max: 1, step: 0.01, description: "Controls how sharp or blurry the coat reflections appear.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat/roughening" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Roughness", target: material, propertyKey: "coatRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Roughness Anisotropy", target: material, propertyKey: "coatRoughnessAnisotropy", min: 0, max: 1, step: 0.01, description: "Stretches coat reflections in one direction for brushed or streaked looks. Requires coat_roughness > 0.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Roughness Anisotropy", target: material, propertyKey: "coatRoughnessAnisotropyTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat IOR", target: material, propertyKey: "coatIor", min: 1, max: 3, step: 0.01, description: "Index of refraction is a physical value controlling the reflective intensity of the coat.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Darkening", target: material, propertyKey: "coatDarkening", min: 0, max: 1, step: 0.01, description: "Darkens the base under the coat, similar to how real varnish deepens color.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat/darkening" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Darkening", target: material, propertyKey: "coatDarkeningTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15708
- };
15709
- /**
15710
- * Displays the fuzz layer properties of an OpenPBR material.
15711
- * @param props - The required properties
15712
- * @returns A JSX element representing the fuzz layer properties.
15713
- */
15714
- const OpenPBRMaterialFuzzProperties = (props) => {
15715
- const { material } = props;
15716
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Fuzz Weight", target: material, propertyKey: "fuzzWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the fuzz.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/fuzz" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Fuzz Weight", target: material, propertyKey: "fuzzWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Fuzz Color", target: material, propertyKey: "fuzzColor", isLinearMode: true, description: "Controls the color of the fuzz.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/fuzz" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Fuzz Color", target: material, propertyKey: "fuzzColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Fuzz Roughness", target: material, propertyKey: "fuzzRoughness", min: 0, max: 1, step: 0.01, description: "Controls the roughness of the fuzz.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/fuzz" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Fuzz Roughness", target: material, propertyKey: "fuzzRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Number of Samples", target: material, propertyKey: "fuzzSampleNumber", min: 4, max: 64, step: 1 })] }));
15717
- };
15718
- /**
15719
- * Displays the emission properties of an OpenPBR material.
15720
- * @param props - The required properties
15721
- * @returns A JSX element representing the emission properties.
15722
- */
15723
- const OpenPBRMaterialEmissionProperties = (props) => {
15724
- const { material } = props;
15725
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: Color3PropertyLine, label: "Emission Color", target: material, propertyKey: "emissionColor", isLinearMode: true, description: "Controls the color of the glow.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/emission" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Emission Color", target: material, propertyKey: "emissionColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Emission Luminance", target: material, propertyKey: "emissionLuminance", min: 0, max: 10, step: 0.01, description: "Controls how bright the glow is.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/emission" })] }));
15726
- };
15727
- /**
15728
- * Displays the thin film properties of an OpenPBR material.
15729
- * @param props - The required properties
15730
- * @returns A JSX element representing the thin film properties.
15731
- */
15732
- const OpenPBRMaterialThinFilmProperties = (props) => {
15733
- const { material } = props;
15734
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Thin Film Weight", target: material, propertyKey: "thinFilmWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the thin-film.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-filmiridescence" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Thin Film Weight", target: material, propertyKey: "thinFilmWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Thin Film Thickness", target: material, propertyKey: "thinFilmThickness", min: 0, max: 1, step: 0.01, description: "Changes the color pattern of the iridescence.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-filmiridescence" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Thin Film Thickness", target: material, propertyKey: "thinFilmThicknessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Thin Film IOR", target: material, propertyKey: "thinFilmIor", min: 1, max: 3, step: 0.01, description: "Alters the strength and contrast of the color shift based in the index of refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-filmiridescence" })] }));
15735
- };
15736
- /**
15737
- * Displays the geometry properties of an OpenPBR material.
15738
- * @param props - The required properties
15739
- * @returns A JSX element representing the geometry properties.
15740
- */
15741
- const OpenPBRMaterialGeometryProperties = (props) => {
15742
- const { material } = props;
15743
- return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Geometry Opacity", target: material, propertyKey: "geometryOpacity", min: 0, max: 1, step: 0.01, description: "Controls material presence and transparency cutout.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/opacity/transparency" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Opacity", target: material, propertyKey: "geometryOpacityTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: CheckboxPropertyLine, label: "Thin-Walled", target: material, propertyKey: "geometryThinWalled", description: "When enabled, treats material as a thin shell (like leaves, paper sheets or windows). Disables ray bending in refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-walledcase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Normal", target: material, propertyKey: "geometryNormalTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Tangent Angle", target: material, propertyKey: "geometryTangentAngle", min: 0, max: Math.PI, step: 0.01, description: "Tangent vector controlling anisotropic reflection direction for the base (metal and non-metal). Works with specular_roughness_anisotropy.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/geometry/tangent" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Tangent", target: material, propertyKey: "geometryTangentTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Tangent Angle", target: material, propertyKey: "geometryCoatTangentAngle", min: 0, max: Math.PI, step: 0.01, description: "Tangent vector controlling anisotropic reflection direction for the coat. Works with coat_roughness_anisotropy.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/geometry/coat-tangent" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Coat Normal", target: material, propertyKey: "geometryCoatNormalTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Coat Tangent", target: material, propertyKey: "geometryCoatTangentTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Geometry Thickness", target: material, propertyKey: "geometryThickness", min: 0, step: 0.001, description: "Controls the thickness of the geometry for volume approximations.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thickness" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Thickness", target: material, propertyKey: "geometryThicknessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15744
- };
15745
-
15746
15690
  const LightFalloffOptions = [
15747
15691
  { label: "Physical", value: PBRBaseMaterial.LIGHTFALLOFF_PHYSICAL },
15748
15692
  { label: "glTF", value: PBRBaseMaterial.LIGHTFALLOFF_GLTF },
@@ -15917,6 +15861,92 @@ const PBRBaseMaterialDebugProperties = (props) => {
15917
15861
  return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: NumberDropdownPropertyLine, label: "Debug Mode", target: material, propertyKey: "debugMode", options: DebugMode }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Split Position", target: material, propertyKey: "debugLimit", min: -1, max: 1, step: 0.01 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Output Factor", target: material, propertyKey: "debugFactor", min: 0, max: 5, step: 0.01 })] }));
15918
15862
  };
15919
15863
 
15864
+ /**
15865
+ * Displays the base layer properties of an OpenPBR material.
15866
+ * @param props - The required properties
15867
+ * @returns A JSX element representing the base layer properties.
15868
+ */
15869
+ const OpenPBRMaterialBaseProperties = (props) => {
15870
+ const { material } = props;
15871
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Base Weight", target: material, propertyKey: "baseWeight", min: 0, max: 1, step: 0.01, description: "Controls how strong or visible the base aspect appears.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Weight", target: material, propertyKey: "baseWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Base Color", target: material, propertyKey: "baseColor", isLinearMode: true, description: "Sets the primary surface color of the material.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Color", target: material, propertyKey: "baseColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Base Metalness", target: material, propertyKey: "baseMetalness", min: 0, max: 1, step: 0.01, description: "Controls whether the material behaves as metal or non-metal. The parameter supersedes transmission_weight and subsurface_weight.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Metalness", target: material, propertyKey: "baseMetalnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Base Diffuse Roughness", target: material, propertyKey: "baseDiffuseRoughness", min: 0, max: 1, step: 0.01, description: "Softens the surface's base appearance. Higher values create matte or porous looks. Lower values are smoother.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Base Diffuse Roughness", target: material, propertyKey: "baseDiffuseRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Ambient Occlusion", target: material, propertyKey: "ambientOcclusionTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15872
+ };
15873
+ /**
15874
+ * Displays the specular layer properties of an OpenPBR material.
15875
+ * @param props - The required properties
15876
+ * @returns A JSX element representing the specular layer properties.
15877
+ */
15878
+ const OpenPBRMaterialSpecularProperties = (props) => {
15879
+ const { material } = props;
15880
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular Weight", target: material, propertyKey: "specularWeight", min: 0, max: 1, step: 0.01, description: "Controls how strong the reflections appear.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Weight", target: material, propertyKey: "specularWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Specular Color", target: material, propertyKey: "specularColor", isLinearMode: true, description: "Tints the color of reflections.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Color", target: material, propertyKey: "specularColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular Roughness", target: material, propertyKey: "specularRoughness", min: 0, max: 1, step: 0.01, description: "Controls how sharp or blurry reflections are.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Roughness", target: material, propertyKey: "specularRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular Roughness Anisotropy", target: material, propertyKey: "specularRoughnessAnisotropy", min: 0, max: 1, step: 0.01, description: "Stretches reflections in one direction for brushed or streaked looks. Requires specular_roughness > 0.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/microfacetmodel" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Specular Roughness Anisotropy", target: material, propertyKey: "specularRoughnessAnisotropyTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Specular IOR", target: material, propertyKey: "specularIor", min: 1, max: 3, step: 0.01, description: "Index of refraction is a physical value controlling the reflective intensity and refraction. The parameter has no effect on metals.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate" })] }));
15881
+ };
15882
+ const OpenPBRMaterialTransmissionProperties = (props) => {
15883
+ const { material } = props;
15884
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Weight", target: material, propertyKey: "transmissionWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the transparency effect. The parameter is superseded by base_metalness.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Weight", target: material, propertyKey: "transmissionWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Transmission Color", target: material, propertyKey: "transmissionColor", isLinearMode: true, description: "Tints light passing through the material. Works with transmission_depth for realistic thickness-based coloring.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Color", target: material, propertyKey: "transmissionColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Depth (cm)", target: material, propertyKey: "transmissionDepth", min: 0, max: 50, step: 0.001, convertTo: (value) => value * 100, convertFrom: (value) => value / 100, description: "Controls how quickly light is absorbed with thickness. Distance is in scene units.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Depth", target: material, propertyKey: "transmissionDepthTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Transmission Scatter", target: material, propertyKey: "transmissionScatter", isLinearMode: true, description: "Adds internal cloudiness to create materials like juice, honey, etc. Requires transmission_depth > 0.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Scatter", target: material, propertyKey: "transmissionScatterTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Scatter Anisotropy", target: material, propertyKey: "transmissionScatterAnisotropy", min: -1, max: 1, step: 0.01, description: "Shifts scattering forward/backward for clearer or hazier appearance depending on viewing angle.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Dispersion Abbe Number", target: material, propertyKey: "transmissionDispersionAbbeNumber", min: 1, max: 100, step: 1, description: "Physical value for the rainbow color separation in refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Transmission Dispersion Scale", target: material, propertyKey: "transmissionDispersionScale", min: 0, max: 5, step: 0.01, description: "Strength of rainbow color separation in refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/translucentbase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Transmission Dispersion Scale", target: material, propertyKey: "transmissionDispersionScaleTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15885
+ };
15886
+ const OpenPBRMaterialSubsurfaceProperties = (props) => {
15887
+ const { material } = props;
15888
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Subsurface Weight", target: material, propertyKey: "subsurfaceWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the subsurface effect. The parameter is superseded by base_metalness and transmission_weight.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Subsurface Weight", target: material, propertyKey: "subsurfaceWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Subsurface Color", target: material, propertyKey: "subsurfaceColor", isLinearMode: true, description: "Colors the light that scatters under the surface.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Subsurface Color", target: material, propertyKey: "subsurfaceColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Subsurface Radius (cm)", target: material, propertyKey: "subsurfaceRadius", min: 0, max: 50, step: 0.001, convertTo: (value) => value * 100, convertFrom: (value) => value / 100, description: "Controls how soft and spread-out the subsurface look appears.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Subsurface Radius Scale", target: material, propertyKey: "subsurfaceRadiusScale", isLinearMode: true, description: "Tints thin areas with light shining through, like warm glow on ears or leaves.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Subsurface Radius Scale", target: material, propertyKey: "subsurfaceRadiusScaleTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Subsurface Scatter Anisotropy", target: material, propertyKey: "subsurfaceScatterAnisotropy", min: -1, max: 1, step: 0.01, description: "Shifts scattering forward/backward for a softer glow or a sharper one.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/basesubstrate/subsurface" })] }));
15889
+ };
15890
+ /**
15891
+ * Displays the coat layer properties of an OpenPBR material.
15892
+ * @param props - The required properties
15893
+ * @returns A JSX element representing the coat layer properties.
15894
+ */
15895
+ const OpenPBRMaterialCoatProperties = (props) => {
15896
+ const { material } = props;
15897
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Weight", target: material, propertyKey: "coatWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the coat.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Weight", target: material, propertyKey: "coatWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Coat Color", target: material, propertyKey: "coatColor", isLinearMode: true, description: "Tints the coat, for tinted varnish or paint.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Color", target: material, propertyKey: "coatColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Roughness", target: material, propertyKey: "coatRoughness", min: 0, max: 1, step: 0.01, description: "Controls how sharp or blurry the coat reflections appear.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat/roughening" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Roughness", target: material, propertyKey: "coatRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Roughness Anisotropy", target: material, propertyKey: "coatRoughnessAnisotropy", min: 0, max: 1, step: 0.01, description: "Stretches coat reflections in one direction for brushed or streaked looks. Requires coat_roughness > 0.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Roughness Anisotropy", target: material, propertyKey: "coatRoughnessAnisotropyTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat IOR", target: material, propertyKey: "coatIor", min: 1, max: 3, step: 0.01, description: "Index of refraction is a physical value controlling the reflective intensity of the coat.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat" }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Darkening", target: material, propertyKey: "coatDarkening", min: 0, max: 1, step: 0.01, description: "Darkens the base under the coat, similar to how real varnish deepens color.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/coat/darkening" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Coat Darkening", target: material, propertyKey: "coatDarkeningTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15898
+ };
15899
+ /**
15900
+ * Displays the fuzz layer properties of an OpenPBR material.
15901
+ * @param props - The required properties
15902
+ * @returns A JSX element representing the fuzz layer properties.
15903
+ */
15904
+ const OpenPBRMaterialFuzzProperties = (props) => {
15905
+ const { material } = props;
15906
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Fuzz Weight", target: material, propertyKey: "fuzzWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the fuzz.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/fuzz" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Fuzz Weight", target: material, propertyKey: "fuzzWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: Color3PropertyLine, label: "Fuzz Color", target: material, propertyKey: "fuzzColor", isLinearMode: true, description: "Controls the color of the fuzz.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/fuzz" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Fuzz Color", target: material, propertyKey: "fuzzColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Fuzz Roughness", target: material, propertyKey: "fuzzRoughness", min: 0, max: 1, step: 0.01, description: "Controls the roughness of the fuzz.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/fuzz" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Fuzz Roughness", target: material, propertyKey: "fuzzRoughnessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15907
+ };
15908
+ /**
15909
+ * Displays the emission properties of an OpenPBR material.
15910
+ * @param props - The required properties
15911
+ * @returns A JSX element representing the emission properties.
15912
+ */
15913
+ const OpenPBRMaterialEmissionProperties = (props) => {
15914
+ const { material } = props;
15915
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: Color3PropertyLine, label: "Emission Color", target: material, propertyKey: "emissionColor", isLinearMode: true, description: "Controls the color of the glow.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/emission" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Emission Color", target: material, propertyKey: "emissionColorTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Emission Luminance", target: material, propertyKey: "emissionLuminance", min: 0, max: 10, step: 0.01, description: "Controls how bright the glow is.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/emission" })] }));
15916
+ };
15917
+ /**
15918
+ * Displays the thin film properties of an OpenPBR material.
15919
+ * @param props - The required properties
15920
+ * @returns A JSX element representing the thin film properties.
15921
+ */
15922
+ const OpenPBRMaterialThinFilmProperties = (props) => {
15923
+ const { material } = props;
15924
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Thin Film Weight", target: material, propertyKey: "thinFilmWeight", min: 0, max: 1, step: 0.01, description: "Controls the presence of the thin-film.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-filmiridescence" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Thin Film Weight", target: material, propertyKey: "thinFilmWeightTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Thin Film Thickness", target: material, propertyKey: "thinFilmThickness", min: 0, max: 1, step: 0.01, description: "Changes the color pattern of the iridescence.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-filmiridescence" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Thin Film Thickness", target: material, propertyKey: "thinFilmThicknessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Thin Film IOR", target: material, propertyKey: "thinFilmIor", min: 1, max: 3, step: 0.01, description: "Alters the strength and contrast of the color shift based in the index of refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-filmiridescence" })] }));
15925
+ };
15926
+ /**
15927
+ * Displays the geometry properties of an OpenPBR material.
15928
+ * @param props - The required properties
15929
+ * @returns A JSX element representing the geometry properties.
15930
+ */
15931
+ const OpenPBRMaterialGeometryProperties = (props) => {
15932
+ const { material } = props;
15933
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Geometry Opacity", target: material, propertyKey: "geometryOpacity", min: 0, max: 1, step: 0.01, description: "Controls material presence and transparency cutout.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/opacity/transparency" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Opacity", target: material, propertyKey: "geometryOpacityTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: CheckboxPropertyLine, label: "Thin-Walled", target: material, propertyKey: "geometryThinWalled", description: "When enabled, treats material as a thin shell (like leaves, paper sheets or windows). Disables ray bending in refraction.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thin-walledcase" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Normal", target: material, propertyKey: "geometryNormalTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Tangent Angle", target: material, propertyKey: "geometryTangentAngle", min: 0, max: Math.PI, step: 0.01, description: "Tangent vector controlling anisotropic reflection direction for the base (metal and non-metal). Works with specular_roughness_anisotropy.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/geometry/tangent" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Tangent", target: material, propertyKey: "geometryTangentTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Coat Tangent Angle", target: material, propertyKey: "geometryCoatTangentAngle", min: 0, max: Math.PI, step: 0.01, description: "Tangent vector controlling anisotropic reflection direction for the coat. Works with coat_roughness_anisotropy.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/geometry/coat-tangent" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Coat Normal", target: material, propertyKey: "geometryCoatNormalTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Coat Tangent", target: material, propertyKey: "geometryCoatTangentTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Geometry Thickness", target: material, propertyKey: "geometryThickness", min: 0, step: 0.001, description: "Controls the thickness of the geometry for volume approximations.", docLink: "https://academysoftwarefoundation.github.io/OpenPBR/index.html#model/thickness" }), jsx(BoundProperty, { component: TextureSelectorPropertyLine, label: "Geometry Thickness", target: material, propertyKey: "geometryThicknessTexture", scene: material.getScene(), defaultValue: null, onLink: (texture) => void 0 })] }));
15934
+ };
15935
+ const SssQualityOptions = [
15936
+ { label: "Low (8 samples)", value: 0 },
15937
+ { label: "Medium (16 samples)", value: 1 },
15938
+ { label: "High (32 samples)", value: 2 },
15939
+ ];
15940
+ /**
15941
+ * Displays the rendering quality properties of an OpenPBR material.
15942
+ * @param props - The required properties
15943
+ * @returns A JSX element representing the quality properties.
15944
+ */
15945
+ const OpenPBRMaterialQualityProperties = (props) => {
15946
+ const { material } = props;
15947
+ return (jsxs(Fragment, { children: [jsx(BoundProperty, { component: CheckboxPropertyLine, label: "Specular Anti-Aliasing", target: material, propertyKey: "enableSpecularAntiAliasing", description: "When enabled, reduces specular aliasing by adjusting roughness based on surface normal variation." }), jsx(BoundProperty, { component: CheckboxPropertyLine, label: "Horizon Occlusion", target: material, propertyKey: "useHorizonOcclusion", description: "When enabled, prevents normal maps from looking shiny when the reflected vector faces below the surface horizon." }), jsx(BoundProperty, { component: CheckboxPropertyLine, label: "Radiance Occlusion", target: material, propertyKey: "useRadianceOcclusion", description: "When enabled, reduces radiance in areas defined by ambient occlusion to improve energy conservation." }), jsx(BoundProperty, { component: CheckboxPropertyLine, label: "High Quality Refraction Blur", target: material, propertyKey: "refractionHighQualityBlur", description: "When enabled, uses a 4-tap rotated-grid kernel to eliminate bilinear block artifacts in rough refraction and a 6-sample spectral path for dispersion. When disabled, uses a single dithered sample." }), jsx(BoundProperty, { component: NumberDropdownPropertyLine, label: "SSS Quality", target: material, propertyKey: "sssQuality", options: SssQualityOptions, description: "Controls the number of samples used for subsurface scattering convolution. Higher quality reduces noise at the cost of performance." }), jsx(BoundProperty, { component: CheckboxPropertyLine, label: "Realtime Filtering", target: material, propertyKey: "realTimeFiltering", description: "When enabled, uses real-time filtering for IBL (image-based lighting) instead of prefiltered mipmaps." }), jsx(BoundProperty, { component: NumberDropdownPropertyLine, label: "Realtime Filtering Quality", target: material, propertyKey: "realTimeFilteringQuality", options: RealTimeFilteringQualityOptions, description: "Controls the number of samples used for IBL (image-based lighting) filtering. Higher quality reduces noise in reflections at the cost of performance." }), jsx(BoundProperty, { component: SyncedSliderPropertyLine, label: "Fuzz Sample Count", target: material, propertyKey: "fuzzSampleNumber", min: 4, max: 64, step: 1, description: "Controls the number of samples used for fuzz/sheen rendering. Higher values reduce noise at the cost of performance." })] }));
15948
+ };
15949
+
15920
15950
  const SkyMaterialProperties = (props) => {
15921
15951
  const { material } = props;
15922
15952
  const [toDisplayAngle, fromDisplayAngle, useDegrees] = useAngleConverters();
@@ -16125,6 +16155,10 @@ const MaterialPropertiesServiceDefinition = {
16125
16155
  section: "OpenPBR",
16126
16156
  component: ({ context }) => jsx(OpenPBRMaterialGeometryProperties, { material: context }),
16127
16157
  },
16158
+ {
16159
+ section: "OpenPBR Quality",
16160
+ component: ({ context }) => jsx(OpenPBRMaterialQualityProperties, { material: context }),
16161
+ },
16128
16162
  ],
16129
16163
  });
16130
16164
  const skyMaterialRegistration = propertiesService.addSectionContent({
@@ -20916,8 +20950,13 @@ const AdvancedDynamicTextureGeneralProperties = MakeLazyComponent(async () => {
20916
20950
  const AdvancedDynamicTexturePreviewProperties = (props) => {
20917
20951
  const { texture } = props;
20918
20952
  return (jsx(Fragment, { children: jsx(ButtonLine, { label: "Edit GUI", icon: EditRegular, onClick: async () => {
20919
- const { GUIEditor } = await import('@babylonjs/gui-editor');
20920
- await GUIEditor.Show({ liveGuiTexture: texture });
20953
+ // The UMD inspector bundle externalizes "gui-editor/guiEditor" to BABYLON.GuiEditor,
20954
+ // which is the GUIEditor class itself rather than a namespace { GUIEditor }.
20955
+ // Tolerate both shapes so this works in both UMD and module builds.
20956
+ // eslint-disable-next-line @typescript-eslint/naming-convention
20957
+ const guiEditorModule = await import('@babylonjs/gui-editor');
20958
+ const guiEditor = "GUIEditor" in guiEditorModule ? guiEditorModule.GUIEditor : guiEditorModule;
20959
+ await guiEditor.Show({ liveGuiTexture: texture });
20921
20960
  } }) }));
20922
20961
  };
20923
20962
 
@@ -21169,7 +21208,7 @@ const TexturePropertiesServiceDefinition = {
21169
21208
  });
21170
21209
  const cubeTextureContentRegistration = propertiesService.addSectionContent({
21171
21210
  key: "Cube Texture Properties",
21172
- predicate: (entity) => entity instanceof CubeTexture,
21211
+ predicate: (entity) => entity instanceof CubeTexture || entity instanceof EnvCubeTexture,
21173
21212
  content: [
21174
21213
  {
21175
21214
  section: "Transform",
@@ -21621,8 +21660,13 @@ const GuiExplorerServiceDefinition = {
21621
21660
  icon: () => jsx(EditRegular, {}),
21622
21661
  // eslint-disable-next-line @typescript-eslint/naming-convention
21623
21662
  execute: async () => {
21624
- const { GUIEditor } = await import('@babylonjs/gui-editor');
21625
- await GUIEditor.Show({ liveGuiTexture: texture });
21663
+ // The UMD inspector bundle externalizes "gui-editor/guiEditor" to BABYLON.GuiEditor,
21664
+ // which is the GUIEditor class itself rather than a namespace { GUIEditor }.
21665
+ // Tolerate both shapes so this works in both UMD and module builds.
21666
+ // eslint-disable-next-line @typescript-eslint/naming-convention
21667
+ const guiEditorModule = await import('@babylonjs/gui-editor');
21668
+ const guiEditor = "GUIEditor" in guiEditorModule ? guiEditorModule.GUIEditor : guiEditorModule;
21669
+ await guiEditor.Show({ liveGuiTexture: texture });
21626
21670
  },
21627
21671
  };
21628
21672
  },
@@ -23006,10 +23050,37 @@ const GLTFValidationServiceDefinition = {
23006
23050
 
23007
23051
  const PickingToolbar = (props) => {
23008
23052
  const { scene, selectEntity, gizmoService, ignoreBackfaces, highlightSelectedEntity, onHighlightSelectedEntityChange } = props;
23009
- const meshDataCache = useMemo(() => new WeakMap(), [scene]);
23010
23053
  // Not sure why changing the cursor on the canvas itself doesn't work, so change it on the parent.
23011
23054
  const sceneElement = scene.getEngine().getRenderingCanvas()?.parentElement;
23012
23055
  const [pickingEnabled, setPickingEnabled] = useState(false);
23056
+ // One GPUPicker per (scene, component lifetime). useResource handles disposal on unmount or when scene changes.
23057
+ // The factory must be stable (memoized) so useResource doesn't recreate the picker on every render.
23058
+ const gpuPicker = useResource(useCallback(() => new GPUPicker(), [scene]));
23059
+ // Track the meshes the picker should know about. Re-evaluate whenever meshes are added or removed.
23060
+ // Do not filter on vertex count here: meshes can be created before their geometry is populated,
23061
+ // and they still need to remain in the GPUPicker list so they become pickable once geometry arrives.
23062
+ const pickableMeshes = useObservableState(useCallback(() => scene.meshes.filter((mesh) => mesh.isEnabled() && mesh.isVisible), [scene]), scene.onNewMeshAddedObservable, scene.onMeshRemovedObservable);
23063
+ // Keep the GPUPicker's picking list in sync with the current pickable meshes (and apply the
23064
+ // backface culling preference) while picking is enabled.
23065
+ useEffect(() => {
23066
+ if (!pickingEnabled) {
23067
+ gpuPicker.clearPickingList();
23068
+ return;
23069
+ }
23070
+ if (pickableMeshes.length === 0) {
23071
+ gpuPicker.clearPickingList();
23072
+ return;
23073
+ }
23074
+ gpuPicker.setPickingList(pickableMeshes);
23075
+ // GPUPicker creates its picking ShaderMaterials lazily inside setPickingList. Apply the
23076
+ // backface culling preference now so subsequent renders use the correct setting.
23077
+ // (ShaderMaterial.backFaceCulling defaults to true, which matches ignoreBackfaces=true.)
23078
+ for (const material of gpuPicker.defaultRenderMaterials) {
23079
+ if (material) {
23080
+ material.backFaceCulling = ignoreBackfaces ?? false;
23081
+ }
23082
+ }
23083
+ }, [pickingEnabled, pickableMeshes, gpuPicker, ignoreBackfaces]);
23013
23084
  // Exit picking mode if the escape key is pressed.
23014
23085
  useKeyListener({
23015
23086
  onKeyDown: (e) => {
@@ -23022,7 +23093,12 @@ const PickingToolbar = (props) => {
23022
23093
  if (pickingEnabled && sceneElement) {
23023
23094
  const originalCursor = getComputedStyle(sceneElement).cursor;
23024
23095
  sceneElement.style.cursor = "crosshair";
23096
+ const pickingLock = new AsyncLock();
23025
23097
  const pointerObserver = scene.onPrePointerObservable.add(() => {
23098
+ // Capture pointer position and synchronous gizmo hover state at click time.
23099
+ // The async GPU pick may queue behind a previous pick (e.g. while picking shaders
23100
+ // compile on the very first click), and by the time the queued callback runs the
23101
+ // pointer and gizmo hover state may have changed.
23026
23102
  let pickedEntity = null;
23027
23103
  // Check camera gizmos.
23028
23104
  if (!pickedEntity) {
@@ -23040,34 +23116,27 @@ const PickingToolbar = (props) => {
23040
23116
  }
23041
23117
  }
23042
23118
  }
23043
- // Check the main scene.
23044
- if (!pickedEntity) {
23045
- // Refresh bounding info to ensure morph target and skeletal animations are taken into account.
23046
- for (const mesh of scene.meshes) {
23047
- let cache = meshDataCache.get(mesh);
23048
- if (!cache) {
23049
- cache = {};
23050
- meshDataCache.set(mesh, cache);
23051
- }
23052
- mesh.refreshBoundingInfo({ applyMorph: true, applySkeleton: true, cache });
23053
- }
23054
- const pickingInfo = scene.pick(scene.unTranslatedPointer.x, scene.unTranslatedPointer.y, (mesh) => mesh.isEnabled() && mesh.isVisible && mesh.getTotalVertices() > 0, false, undefined, (p0, p1, p2, ray) => {
23055
- if (!ignoreBackfaces) {
23056
- return true;
23057
- }
23058
- const p0p1 = TmpVectors.Vector3[0];
23059
- const p1p2 = TmpVectors.Vector3[1];
23060
- p1.subtractToRef(p0, p0p1);
23061
- p2.subtractToRef(p1, p1p2);
23062
- const normal = Vector3.Cross(p0p1, p1p2);
23063
- return Vector3.Dot(normal, ray.direction) < 0;
23064
- });
23065
- pickedEntity = pickingInfo.pickedMesh;
23066
- }
23067
- // If an entity was picked, select it.
23068
23119
  if (pickedEntity) {
23069
23120
  selectEntity(pickedEntity);
23121
+ return;
23070
23122
  }
23123
+ // Check the main scene via GPU pick. Serialize concurrent picks via the lock so
23124
+ // rapid clicks don't overlap on the GPU picker (which would otherwise no-op).
23125
+ const x = scene.unTranslatedPointer.x;
23126
+ const y = scene.unTranslatedPointer.y;
23127
+ void (async () => {
23128
+ try {
23129
+ await pickingLock.lockAsync(async () => {
23130
+ const pickingInfo = await gpuPicker.pickAsync(x, y);
23131
+ if (pickingInfo?.mesh) {
23132
+ selectEntity(pickingInfo.mesh);
23133
+ }
23134
+ });
23135
+ }
23136
+ catch (error) {
23137
+ Logger.Warn(`GPU picking failed: ${error}`);
23138
+ }
23139
+ })();
23071
23140
  }, PointerEventTypes.POINTERTAP);
23072
23141
  return () => {
23073
23142
  sceneElement.style.cursor = originalCursor;
@@ -23077,7 +23146,7 @@ const PickingToolbar = (props) => {
23077
23146
  return () => {
23078
23147
  /* No-op */
23079
23148
  };
23080
- }, [pickingEnabled, sceneElement, ignoreBackfaces]);
23149
+ }, [pickingEnabled, sceneElement, scene, gizmoService, gpuPicker, selectEntity]);
23081
23150
  const togglePicking = useCallback(() => {
23082
23151
  setPickingEnabled((prev) => !prev);
23083
23152
  }, []);
@@ -24254,4 +24323,4 @@ const TextAreaPropertyLine = (props) => {
24254
24323
  AttachDebugLayer();
24255
24324
 
24256
24325
  export { GetPropertyDescriptor as $, Accordion as A, Button as B, CheckboxPropertyLine as C, Color4PropertyLine as D, ColorPickerPopup as E, ColorStepGradientComponent as F, ComboBox as G, ComboBoxPropertyLine as H, ConstructorFactory as I, ConvertOptions as J, DebugServiceIdentity as K, Link as L, MessageBar as M, NumberInputPropertyLine as N, DetachDebugLayer as O, Popover as P, DraggableLine as Q, Dropdown as R, ShellServiceIdentity as S, TextInputPropertyLine as T, EntitySelector as U, Vector3PropertyLine as V, ErrorBoundary as W, ExtensibleAccordion as X, FactorGradientComponent as Y, FactorGradientList as Z, FileUploadLine as _, useToast as a, ThemeServiceIdentity as a$, GizmoServiceIdentity as a0, HexPropertyLine as a1, InfoLabel as a2, InputHexField as a3, InputHsvField as a4, Inspector as a5, InterceptFunction as a6, InterceptProperty as a7, IsPropertyReadonly as a8, LineContainer as a9, SearchBox as aA, SelectionServiceDefinition as aB, SettingsServiceIdentity as aC, SettingsStore as aD, SettingsStoreIdentity as aE, ShowInspector as aF, SidePaneContainer as aG, SkeletonSelector as aH, Slider as aI, SpinButton as aJ, StartInspectable as aK, StatsServiceIdentity as aL, StringDropdown as aM, StringDropdownPropertyLine as aN, StringifiedPropertyLine as aO, Switch as aP, SwitchPropertyLine as aQ, SyncedSliderInput as aR, SyncedSliderPropertyLine as aS, TeachingMoment as aT, TextAreaPropertyLine as aU, TextInput as aV, TextPropertyLine as aW, Textarea as aX, TextureSelector as aY, TextureUpload as aZ, Theme as a_, LinkPropertyLine as aa, LinkToEntityPropertyLine as ab, List as ac, MakeDialogTeachingMoment as ad, MakeLazyComponent as ae, MakeModularBridge as af, MakeModularTool as ag, MakePopoverTeachingMoment as ah, MakePropertyHook as ai, MakeTeachingMoment as aj, MaterialSelector as ak, NodeSelector as al, NumberDropdown as am, NumberDropdownPropertyLine as an, ObservableCollection as ao, Pane as ap, PlaceholderPropertyLine as aq, PositionedPopover as ar, PropertiesServiceIdentity as as, Property as at, PropertyContext as au, PropertyLine as av, QuaternionPropertyLine as aw, RotationVectorPropertyLine as ax, SceneExplorerServiceIdentity as ay, SearchBar as az, useInterceptObservable as b, ToastProvider as b0, ToggleButton as b1, Tooltip as b2, UploadButton as b3, Vector2PropertyLine as b4, Vector4PropertyLine as b5, WatcherServiceIdentity as b6, useAngleConverters as b7, useAsyncResource as b8, useColor3Property as b9, useColor4Property as ba, useEventListener as bb, useEventfulState as bc, useKeyListener as bd, useKeyState as be, useObservableCollection as bf, useOrderedObservableCollection as bg, usePollingObservable as bh, usePropertyChangedNotifier as bi, useQuaternionProperty as bj, useResource as bk, useTheme as bl, useThemeMode as bm, useVector3Property as bn, LinkToEntity as c, SpinButtonPropertyLine as d, useProperty as e, SceneContextIdentity as f, SelectionServiceIdentity as g, useObservableState as h, AccordionSection as i, ButtonLine as j, ToolsServiceIdentity as k, AccordionSectionItem as l, AttachDebugLayer as m, BooleanBadgePropertyLine as n, BoundProperty as o, BridgeCommandRegistryIdentity as p, BuiltInsExtensionFeed as q, Checkbox as r, ChildWindow as s, Collapse as t, useExtensionManager as u, Color3GradientComponent as v, Color3GradientList as w, Color3PropertyLine as x, Color4GradientComponent as y, Color4GradientList as z };
24257
- //# sourceMappingURL=index-Cav-eo60.js.map
24326
+ //# sourceMappingURL=index-D0JXVQQf.js.map