@onerjs/core 8.55.9 → 8.56.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
- package/AudioV2/webAudio/webAudioEngine.js +6 -5
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/Culling/Helper/boundingInfoHelper.js +8 -4
- package/Culling/Helper/boundingInfoHelper.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
- package/Engines/AbstractEngine/pure.d.ts +1 -0
- package/Engines/AbstractEngine/pure.js +1 -0
- package/Engines/AbstractEngine/pure.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
- package/Engines/WebGPU/webgpuDrawContext.js +15 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.d.ts +11 -3
- package/Engines/webgpuEngine.d.ts +1 -0
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +10 -0
- package/Engines/webgpuEngine.pure.js +15 -1
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/powBlock.pure.js +2 -1
- package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
- package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +1 -0
- package/Materials/Node/nodeMaterialBuildState.d.ts +3 -3
- package/Materials/PBR/openpbrMaterial.pure.d.ts +1 -0
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +1 -0
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -0
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/drawWrapper.js +3 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
- package/Materials/imageProcessingConfiguration.defines.js +2 -0
- package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
- package/Materials/imageProcessingConfiguration.functions.js +3 -0
- package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
- package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
- package/Materials/imageProcessingConfiguration.pure.js +123 -2
- package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +1 -0
- package/Materials/uniformBuffer.d.ts +29 -0
- package/Materials/uniformBuffer.js +146 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/colorTemperature.functions.d.ts +29 -0
- package/Maths/colorTemperature.functions.js +196 -0
- package/Maths/colorTemperature.functions.js.map +1 -0
- package/Maths/index.d.ts +1 -0
- package/Maths/index.js +1 -0
- package/Maths/index.js.map +1 -1
- package/Maths/pure.d.ts +1 -0
- package/Maths/pure.js +1 -0
- package/Maths/pure.js.map +1 -1
- package/Misc/observable.pure.js +1 -3
- package/Misc/observable.pure.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
- package/PostProcesses/imageProcessingPostProcess.js +41 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
- package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
- package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +2 -4
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
- package/Rendering/IBLShadows/pure.d.ts +1 -0
- package/Rendering/IBLShadows/pure.js +1 -0
- package/Rendering/IBLShadows/pure.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +10 -1
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/XR/features/Layers/WebXRCompositionLayer.d.ts +52 -0
- package/XR/features/Layers/WebXRCompositionLayer.js +80 -0
- package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
- package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
- package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
- package/XR/features/WebXRDepthSensing.pure.js +42 -0
- package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
- package/XR/features/WebXRHandTracking.pure.js +2 -0
- package/XR/features/WebXRHandTracking.pure.js.map +1 -1
- package/XR/features/WebXRLayers.pure.d.ts +12 -0
- package/XR/features/WebXRLayers.pure.js +31 -1
- package/XR/features/WebXRLayers.pure.js.map +1 -1
- package/XR/features/WebXRTrackedSources.d.ts +5 -0
- package/XR/features/WebXRTrackedSources.js +8 -0
- package/XR/features/WebXRTrackedSources.js.map +1 -0
- package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
- package/XR/features/WebXRTrackedSources.pure.js +153 -0
- package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
- package/XR/features/index.d.ts +1 -0
- package/XR/features/index.js +1 -0
- package/XR/features/index.js.map +1 -1
- package/XR/features/pure.d.ts +1 -0
- package/XR/features/pure.js +1 -0
- package/XR/features/pure.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
- package/XR/motionController/webXRAbstractMotionController.js +61 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/webXRDefaultExperience.js +8 -4
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +86 -44
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +9 -0
- package/XR/webXRFeaturesManager.js +4 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRGraphicsBinding.d.ts +29 -0
- package/XR/webXRGraphicsBinding.js +40 -0
- package/XR/webXRGraphicsBinding.js.map +1 -1
- package/XR/webXRInputSource.js +1 -1
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRLayerWrapper.d.ts +7 -5
- package/XR/webXRLayerWrapper.js +10 -7
- package/XR/webXRLayerWrapper.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +45 -0
- package/XR/webXRSessionManager.js +174 -29
- package/XR/webXRSessionManager.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingParticleDiffuse.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,2CAA2C,CAAC;AACzD,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"fluidRenderingParticleDiffuse.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,2CAA2C,CAAC;AACzD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;CAiBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,6CAA6C,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"fluidRenderingParticleDiffuseVertexShader\";\nconst shader = `attribute position: vec3f;attribute offset: vec2f;attribute color: vec4f;uniform view: mat4x4f;uniform projection: mat4x4f;\n#ifdef FLUIDRENDERING_PER_PARTICLE_SIZE\nattribute size: vec2f;\n#else\nuniform size: vec2f;\n#endif\nvarying uv: vec2f;varying diffuseColor: vec3f;@vertex\nfn main(input: VertexInputs)->FragmentInputs {\n#ifdef FLUIDRENDERING_PER_PARTICLE_SIZE\nvar particleSize: vec2f=vertexInputs.size;\n#else\nvar particleSize: vec2f=uniforms.size;\n#endif\nvar cornerPos: vec3f=vec3f(\nvec2f(vertexInputs.offset.x-0.5,vertexInputs.offset.y-0.5)*particleSize,\n0.0\n);var viewPos: vec3f=(uniforms.view*vec4f(vertexInputs.position,1.0)).xyz+cornerPos;vertexOutputs.position=uniforms.projection*vec4f(viewPos,1.0);vertexOutputs.uv=vertexInputs.offset;vertexOutputs.diffuseColor=vertexInputs.color.rgb;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n\n/** @internal */\nexport const fluidRenderingParticleDiffuseVertexShaderWGSL = { name, shader };\n"]}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
// Do not edit.
|
|
2
2
|
import { ShaderStore } from "../Engines/shaderStore.js";
|
|
3
3
|
const name = "fluidRenderingParticleThicknessVertexShader";
|
|
4
|
-
const shader = `attribute position: vec3f;attribute offset: vec2f;uniform view: mat4x4f;uniform projection: mat4x4f;
|
|
5
|
-
|
|
6
|
-
vec2f
|
|
4
|
+
const shader = `attribute position: vec3f;attribute offset: vec2f;uniform view: mat4x4f;uniform projection: mat4x4f;
|
|
5
|
+
#ifdef FLUIDRENDERING_PER_PARTICLE_SIZE
|
|
6
|
+
attribute size: vec2f;
|
|
7
|
+
#else
|
|
8
|
+
uniform size: vec2f;
|
|
9
|
+
#endif
|
|
10
|
+
varying uv: vec2f;@vertex
|
|
11
|
+
fn main(input: VertexInputs)->FragmentInputs {
|
|
12
|
+
#ifdef FLUIDRENDERING_PER_PARTICLE_SIZE
|
|
13
|
+
var particleSize: vec2f=vertexInputs.size;
|
|
14
|
+
#else
|
|
15
|
+
var particleSize: vec2f=uniforms.size;
|
|
16
|
+
#endif
|
|
17
|
+
var cornerPos: vec3f=vec3f(
|
|
18
|
+
vec2f(vertexInputs.offset.x-0.5,vertexInputs.offset.y-0.5)*particleSize,
|
|
7
19
|
0.0
|
|
8
20
|
);var viewPos: vec3f=(uniforms.view*vec4f(vertexInputs.position,1.0)).xyz+cornerPos;vertexOutputs.position=uniforms.projection*vec4f(viewPos,1.0);vertexOutputs.uv=vertexInputs.offset;}
|
|
9
21
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluidRenderingParticleThickness.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/fluidRenderingParticleThickness.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,6CAA6C,CAAC;AAC3D,MAAM,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"fluidRenderingParticleThickness.vertex.js","sourceRoot":"","sources":["../../../../dev/core/src/ShadersWGSL/fluidRenderingParticleThickness.vertex.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,IAAI,GAAG,6CAA6C,CAAC;AAC3D,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;CAiBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,CAAC;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,+CAA+C,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\n\nconst name = \"fluidRenderingParticleThicknessVertexShader\";\nconst shader = `attribute position: vec3f;attribute offset: vec2f;uniform view: mat4x4f;uniform projection: mat4x4f;\n#ifdef FLUIDRENDERING_PER_PARTICLE_SIZE\nattribute size: vec2f;\n#else\nuniform size: vec2f;\n#endif\nvarying uv: vec2f;@vertex\nfn main(input: VertexInputs)->FragmentInputs {\n#ifdef FLUIDRENDERING_PER_PARTICLE_SIZE\nvar particleSize: vec2f=vertexInputs.size;\n#else\nvar particleSize: vec2f=uniforms.size;\n#endif\nvar cornerPos: vec3f=vec3f(\nvec2f(vertexInputs.offset.x-0.5,vertexInputs.offset.y-0.5)*particleSize,\n0.0\n);var viewPos: vec3f=(uniforms.view*vec4f(vertexInputs.position,1.0)).xyz+cornerPos;vertexOutputs.position=uniforms.projection*vec4f(viewPos,1.0);vertexOutputs.uv=vertexInputs.offset;}\n`;\n// Sideeffect\nif (!ShaderStore.ShadersStoreWGSL[name]) {\n ShaderStore.ShadersStoreWGSL[name] = shader;\n}\n\n/** @internal */\nexport const fluidRenderingParticleThicknessVertexShaderWGSL = { name, shader };\n"]}
|
|
@@ -16,6 +16,7 @@ export type { WebXRSpatialLayerType } from "../../webXRLayerWrapper.js";
|
|
|
16
16
|
/**
|
|
17
17
|
* Wraps an XR composition layer and creates its Babylon render target provider.
|
|
18
18
|
* @typeParam LayerT the concrete WebXR composition layer type
|
|
19
|
+
* @see https://playground.babylonjs.com/#TODARD#0
|
|
19
20
|
*/
|
|
20
21
|
export declare class WebXRCompositionLayerWrapper<LayerT extends XRCompositionLayer = XRCompositionLayer, LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType> extends WebXRLayerWrapper<LayerTypeT> {
|
|
21
22
|
getWidth: () => number;
|
|
@@ -41,6 +42,56 @@ export declare class WebXRCompositionLayerWrapper<LayerT extends XRCompositionLa
|
|
|
41
42
|
* Whether Babylon should acquire subimages and expose render target textures for this layer.
|
|
42
43
|
*/
|
|
43
44
|
readonly usesRenderTargetProvider: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Whether the native layer exposes compositor opacity control.
|
|
47
|
+
*/
|
|
48
|
+
get isOpacitySupported(): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Gets the compositor opacity applied to this layer.
|
|
51
|
+
* @returns The native opacity in the range 0 to 1.
|
|
52
|
+
* @throws If opacity is not supported by the active XR runtime.
|
|
53
|
+
*/
|
|
54
|
+
get opacity(): number;
|
|
55
|
+
/**
|
|
56
|
+
* Sets the compositor opacity applied to this layer.
|
|
57
|
+
* The native runtime clamps the value to the range 0 to 1.
|
|
58
|
+
* @param value The desired opacity.
|
|
59
|
+
* @throws If opacity is not supported by the active XR runtime.
|
|
60
|
+
*/
|
|
61
|
+
set opacity(value: number);
|
|
62
|
+
/**
|
|
63
|
+
* Whether the native layer exposes compositor quality hints.
|
|
64
|
+
*/
|
|
65
|
+
get isQualitySupported(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Gets the compositor quality hint applied to this layer.
|
|
68
|
+
* @returns The current native layer quality hint.
|
|
69
|
+
* @throws If quality hints are not supported by the active XR runtime.
|
|
70
|
+
*/
|
|
71
|
+
get quality(): XRLayerQuality;
|
|
72
|
+
/**
|
|
73
|
+
* Sets the compositor quality hint applied to this layer.
|
|
74
|
+
* @param value The desired quality hint.
|
|
75
|
+
* @throws If quality hints are not supported by the active XR runtime, or the native runtime rejects the value.
|
|
76
|
+
*/
|
|
77
|
+
set quality(value: XRLayerQuality);
|
|
78
|
+
/**
|
|
79
|
+
* Whether the native layer exposes mono-presentation control.
|
|
80
|
+
*/
|
|
81
|
+
get isForceMonoPresentationSupported(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Gets whether the compositor presents the left-eye layer configuration to both eyes.
|
|
84
|
+
* @returns Whether mono presentation is forced.
|
|
85
|
+
* @throws If mono presentation control is not supported by the active XR runtime.
|
|
86
|
+
*/
|
|
87
|
+
get forceMonoPresentation(): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Sets whether the compositor presents the left-eye layer configuration to both eyes.
|
|
90
|
+
* Applications should continue rendering both eyes when this is enabled.
|
|
91
|
+
* @param value Whether to force mono presentation.
|
|
92
|
+
* @throws If mono presentation control is not supported by the active XR runtime.
|
|
93
|
+
*/
|
|
94
|
+
set forceMonoPresentation(value: boolean);
|
|
44
95
|
constructor(getWidth: () => number, getHeight: () => number, layer: LayerT, layerType: LayerTypeT,
|
|
45
96
|
/**
|
|
46
97
|
* Whether the layer renders both views into a texture array.
|
|
@@ -50,6 +101,7 @@ export declare class WebXRCompositionLayerWrapper<LayerT extends XRCompositionLa
|
|
|
50
101
|
* Whether the layer can only be rendered when its native `needsRedraw` flag is set.
|
|
51
102
|
*/
|
|
52
103
|
isStatic?: boolean);
|
|
104
|
+
private _assertControlSupported;
|
|
53
105
|
/**
|
|
54
106
|
* Disposes the Babylon render-target resources and destroys the native layer when this wrapper owns it.
|
|
55
107
|
*/
|
|
@@ -6,8 +6,83 @@ import { Quaternion, Vector3 } from "../../../Maths/math.vector.pure.js";
|
|
|
6
6
|
/**
|
|
7
7
|
* Wraps an XR composition layer and creates its Babylon render target provider.
|
|
8
8
|
* @typeParam LayerT the concrete WebXR composition layer type
|
|
9
|
+
* @see https://playground.babylonjs.com/#TODARD#0
|
|
9
10
|
*/
|
|
10
11
|
export class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {
|
|
12
|
+
/**
|
|
13
|
+
* Whether the native layer exposes compositor opacity control.
|
|
14
|
+
*/
|
|
15
|
+
get isOpacitySupported() {
|
|
16
|
+
return "opacity" in this.layer;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Gets the compositor opacity applied to this layer.
|
|
20
|
+
* @returns The native opacity in the range 0 to 1.
|
|
21
|
+
* @throws If opacity is not supported by the active XR runtime.
|
|
22
|
+
*/
|
|
23
|
+
get opacity() {
|
|
24
|
+
this._assertControlSupported("opacity");
|
|
25
|
+
return this.layer.opacity;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Sets the compositor opacity applied to this layer.
|
|
29
|
+
* The native runtime clamps the value to the range 0 to 1.
|
|
30
|
+
* @param value The desired opacity.
|
|
31
|
+
* @throws If opacity is not supported by the active XR runtime.
|
|
32
|
+
*/
|
|
33
|
+
set opacity(value) {
|
|
34
|
+
this._assertControlSupported("opacity");
|
|
35
|
+
this.layer.opacity = value;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Whether the native layer exposes compositor quality hints.
|
|
39
|
+
*/
|
|
40
|
+
get isQualitySupported() {
|
|
41
|
+
return "quality" in this.layer;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Gets the compositor quality hint applied to this layer.
|
|
45
|
+
* @returns The current native layer quality hint.
|
|
46
|
+
* @throws If quality hints are not supported by the active XR runtime.
|
|
47
|
+
*/
|
|
48
|
+
get quality() {
|
|
49
|
+
this._assertControlSupported("quality");
|
|
50
|
+
return this.layer.quality;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sets the compositor quality hint applied to this layer.
|
|
54
|
+
* @param value The desired quality hint.
|
|
55
|
+
* @throws If quality hints are not supported by the active XR runtime, or the native runtime rejects the value.
|
|
56
|
+
*/
|
|
57
|
+
set quality(value) {
|
|
58
|
+
this._assertControlSupported("quality");
|
|
59
|
+
this.layer.quality = value;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether the native layer exposes mono-presentation control.
|
|
63
|
+
*/
|
|
64
|
+
get isForceMonoPresentationSupported() {
|
|
65
|
+
return "forceMonoPresentation" in this.layer;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Gets whether the compositor presents the left-eye layer configuration to both eyes.
|
|
69
|
+
* @returns Whether mono presentation is forced.
|
|
70
|
+
* @throws If mono presentation control is not supported by the active XR runtime.
|
|
71
|
+
*/
|
|
72
|
+
get forceMonoPresentation() {
|
|
73
|
+
this._assertControlSupported("forceMonoPresentation");
|
|
74
|
+
return this.layer.forceMonoPresentation;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Sets whether the compositor presents the left-eye layer configuration to both eyes.
|
|
78
|
+
* Applications should continue rendering both eyes when this is enabled.
|
|
79
|
+
* @param value Whether to force mono presentation.
|
|
80
|
+
* @throws If mono presentation control is not supported by the active XR runtime.
|
|
81
|
+
*/
|
|
82
|
+
set forceMonoPresentation(value) {
|
|
83
|
+
this._assertControlSupported("forceMonoPresentation");
|
|
84
|
+
this.layer.forceMonoPresentation = value;
|
|
85
|
+
}
|
|
11
86
|
constructor(getWidth, getHeight, layer, layerType,
|
|
12
87
|
/**
|
|
13
88
|
* Whether the layer renders both views into a texture array.
|
|
@@ -36,6 +111,11 @@ export class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {
|
|
|
36
111
|
*/
|
|
37
112
|
this.usesRenderTargetProvider = true;
|
|
38
113
|
}
|
|
114
|
+
_assertControlSupported(control) {
|
|
115
|
+
if (!(control in this.layer)) {
|
|
116
|
+
throw new Error(`XRCompositionLayer.${control} is not supported by this XR runtime.`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
39
119
|
/**
|
|
40
120
|
* Disposes the Babylon render-target resources and destroys the native layer when this wrapper owns it.
|
|
41
121
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRCompositionLayer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/XR/features/Layers/WebXRCompositionLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport { type RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { type Viewport } from \"core/Maths/math.viewport\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type WebXRLayerType, WebXRLayerWrapper, type WebXRSpatialLayerType, type WebXRSupportedLayerType } from \"core/XR/webXRLayerWrapper\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"core/XR/webXRRenderTargetTextureProvider\";\r\nimport { WebXRWebGLRenderTargetTextureProvider } from \"core/XR/webXRWebGLRenderTargetTextureProvider\";\r\nimport { type WebXRSessionManager } from \"core/XR/webXRSessionManager\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector.pure\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode.pure\";\r\n\r\n/**\r\n * The non-projection composition layers that can be positioned in an XR space.\r\n */\r\nexport type WebXRSpatialLayer = XRQuadLayer | XRCylinderLayer | XREquirectLayer | XRCubeLayer;\r\n\r\nexport type { WebXRSpatialLayerType } from \"core/XR/webXRLayerWrapper\";\r\n\r\n/**\r\n * Wraps an XR composition layer and creates its Babylon render target provider.\r\n * @typeParam LayerT the concrete WebXR composition layer type\r\n */\r\nexport class WebXRCompositionLayerWrapper<\r\n LayerT extends XRCompositionLayer = XRCompositionLayer,\r\n LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType,\r\n> extends WebXRLayerWrapper<LayerTypeT> {\r\n /**\r\n * Whether this layer receives its content directly from an HTML media element.\r\n */\r\n public readonly isMediaLayer: boolean = false;\r\n\r\n /**\r\n * Whether Babylon should acquire subimages and expose render target textures for this layer.\r\n */\r\n public readonly usesRenderTargetProvider: boolean = true;\r\n\r\n constructor(\r\n public override getWidth: () => number,\r\n public override getHeight: () => number,\r\n public override readonly layer: LayerT,\r\n public override readonly layerType: LayerTypeT,\r\n /**\r\n * Whether the layer renders both views into a texture array.\r\n */\r\n public readonly isMultiview: boolean,\r\n public createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider<LayerTypeT>,\r\n public _originalInternalTexture: Nullable<InternalTexture> = null,\r\n private readonly _destroyLayerOnDispose = false,\r\n /**\r\n * Whether the layer can only be rendered when its native `needsRedraw` flag is set.\r\n */\r\n public readonly isStatic = false\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, createRTTProvider);\r\n }\r\n\r\n /**\r\n * Disposes the Babylon render-target resources and destroys the native layer when this wrapper owns it.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n if (this._destroyLayerOnDispose) {\r\n this.layer.destroy();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a positionable XR composition layer and synchronizes it with a Babylon transform node.\r\n * The node's scaling does not affect the physical dimensions of the layer.\r\n * @typeParam LayerT the concrete positionable WebXR layer type\r\n */\r\nexport class WebXRSpatialLayerWrapper<\r\n LayerT extends WebXRSpatialLayer = WebXRSpatialLayer,\r\n LayerTypeT extends WebXRSpatialLayerType = WebXRSpatialLayerType,\r\n> extends WebXRCompositionLayerWrapper<LayerT, LayerTypeT> {\r\n private readonly _currentPosition = new Vector3();\r\n private readonly _currentRotation = new Quaternion();\r\n private readonly _lastPosition = new Vector3(Number.NaN, Number.NaN, Number.NaN);\r\n private readonly _lastRotation = new Quaternion(Number.NaN, Number.NaN, Number.NaN, Number.NaN);\r\n\r\n constructor(\r\n getWidth: () => number,\r\n getHeight: () => number,\r\n layer: LayerT,\r\n layerType: LayerTypeT,\r\n isMultiview: boolean,\r\n isStatic: boolean,\r\n /**\r\n * Whether the layer should follow changes to the session manager's reference space.\r\n */\r\n public readonly usesSessionReferenceSpace: boolean,\r\n createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider<LayerTypeT>,\r\n /**\r\n * The Babylon node whose world position and rotation are applied to the native layer.\r\n */\r\n public readonly transformNode: TransformNode,\r\n private readonly _ownsTransformNode: boolean\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, isMultiview, createRTTProvider, null, true, isStatic);\r\n }\r\n\r\n /**\r\n * Synchronizes the native layer with the current world transform of the Babylon node.\r\n * @param useRightHandedSystem whether the Babylon scene uses right-handed coordinates\r\n * @param worldScalingFactor the number of Babylon scene units represented by one meter\r\n */\r\n public updateFromTransformNode(useRightHandedSystem: boolean, worldScalingFactor: number): void {\r\n this.transformNode.computeWorldMatrix(true).decompose(undefined, this._currentRotation, this._currentPosition);\r\n this._currentPosition.scaleInPlace(1 / worldScalingFactor);\r\n\r\n if (!useRightHandedSystem) {\r\n this._currentPosition.z *= -1;\r\n this._currentRotation.z *= -1;\r\n this._currentRotation.w *= -1;\r\n }\r\n\r\n if (this._currentPosition.equals(this._lastPosition) && this._currentRotation.equals(this._lastRotation)) {\r\n return;\r\n }\r\n\r\n this._lastPosition.copyFrom(this._currentPosition);\r\n this._lastRotation.copyFrom(this._currentRotation);\r\n\r\n const orientation = {\r\n x: this._currentRotation.x,\r\n y: this._currentRotation.y,\r\n z: this._currentRotation.z,\r\n w: this._currentRotation.w,\r\n };\r\n if (this.layerType === \"XRCubeLayer\") {\r\n (this.layer as XRCubeLayer).orientation =\r\n typeof DOMPointReadOnly === \"undefined\" ? (orientation as DOMPointReadOnly) : new DOMPointReadOnly(orientation.x, orientation.y, orientation.z, orientation.w);\r\n } else {\r\n (this.layer as XRQuadLayer | XRCylinderLayer | XREquirectLayer).transform = new XRRigidTransform(\r\n {\r\n x: this._currentPosition.x,\r\n y: this._currentPosition.y,\r\n z: this._currentPosition.z,\r\n },\r\n orientation\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the native layer wrapper and its Babylon transform node when the node was created by Babylon.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n if (this._ownsTransformNode) {\r\n this.transformNode.dispose();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wraps an XRMediaBinding layer.\r\n * @typeParam LayerT the concrete media layer type\r\n */\r\nexport class WebXRMediaLayerWrapper<\r\n LayerT extends Exclude<WebXRSpatialLayer, XRCubeLayer> = Exclude<WebXRSpatialLayer, XRCubeLayer>,\r\n LayerTypeT extends Exclude<WebXRSpatialLayerType, \"XRCubeLayer\"> = Exclude<WebXRSpatialLayerType, \"XRCubeLayer\">,\r\n> extends WebXRSpatialLayerWrapper<LayerT, LayerTypeT> {\r\n /**\r\n * Media layers receive their contents directly from the user agent.\r\n */\r\n public override readonly isMediaLayer: boolean = true;\r\n /**\r\n * Media layers are populated directly by the user agent.\r\n */\r\n public override readonly usesRenderTargetProvider: boolean = false;\r\n\r\n /**\r\n * Creates a wrapper for a media-backed spatial layer.\r\n * @param getWidth returns the current video width\r\n * @param getHeight returns the current video height\r\n * @param layer the native media composition layer\r\n * @param layerType the concrete spatial layer type\r\n * @param transformNode the Babylon transform synchronized with the native layer\r\n * @param ownsTransformNode whether the wrapper should dispose the transform node\r\n * @param usesSessionReferenceSpace whether the layer should follow session reference-space changes\r\n */\r\n constructor(\r\n getWidth: () => number,\r\n getHeight: () => number,\r\n layer: LayerT,\r\n layerType: LayerTypeT,\r\n transformNode: TransformNode,\r\n ownsTransformNode: boolean,\r\n usesSessionReferenceSpace: boolean\r\n ) {\r\n super(\r\n getWidth,\r\n getHeight,\r\n layer,\r\n layerType,\r\n false,\r\n false,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRNoRenderTargetTextureProvider(sessionManager, this),\r\n transformNode,\r\n ownsTransformNode\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a native cube layer and exposes its raw subimage.\r\n * Cube layers require six face uploads or render passes and therefore do not use Babylon's 2D composition-layer render target provider.\r\n */\r\nexport class WebXRCubeLayerWrapper extends WebXRSpatialLayerWrapper<XRCubeLayer, \"XRCubeLayer\"> {\r\n /**\r\n * Cube layers are populated through raw cubemap or array-layer access.\r\n */\r\n public override readonly usesRenderTargetProvider: boolean = false;\r\n\r\n constructor(\r\n getWidth: () => number,\r\n getHeight: () => number,\r\n layer: XRCubeLayer,\r\n isStatic: boolean,\r\n usesSessionReferenceSpace: boolean,\r\n private readonly _binding: XRWebGLBinding | XRGPUBinding,\r\n transformNode: TransformNode,\r\n ownsTransformNode: boolean\r\n ) {\r\n super(\r\n getWidth,\r\n getHeight,\r\n layer,\r\n \"XRCubeLayer\",\r\n false,\r\n isStatic,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRNoRenderTargetTextureProvider(sessionManager, this),\r\n transformNode,\r\n ownsTransformNode\r\n );\r\n }\r\n\r\n /**\r\n * Gets the compositor-owned cube subimage for the current frame.\r\n * WebGL callers must populate all six cubemap faces. WebGPU callers must render to six consecutive array layers beginning at the descriptor's base array layer.\r\n * @param frame the current XR frame\r\n * @param eye the eye to retrieve for stereo cube layers\r\n * @returns the raw WebGL or WebGPU cube subimage\r\n */\r\n public getSubImage(frame: XRFrame, eye?: XREye): XRWebGLSubImage | XRGPUSubImage {\r\n return this._binding.getSubImage(this.layer, frame, eye);\r\n }\r\n}\r\n\r\n/**\r\n * Composition layers that are populated outside Babylon do not expose render targets.\r\n * @internal\r\n */\r\nclass WebXRNoRenderTargetTextureProvider<LayerTypeT extends WebXRSupportedLayerType> extends WebXRLayerRenderTargetTextureProvider<LayerTypeT> {\r\n /**\r\n * Creates a no-render-target provider.\r\n * @param sessionManager the current XR session manager\r\n * @param layerWrapper the composition layer wrapper\r\n */\r\n constructor(sessionManager: WebXRSessionManager, layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>) {\r\n super(sessionManager.scene, layerWrapper);\r\n }\r\n\r\n /**\r\n * Media layers do not expose a viewport.\r\n * @param _viewport unused viewport\r\n * @param _view unused XR view\r\n * @returns always `false`\r\n */\r\n public trySetViewportForView(_viewport: Viewport, _view: XRView): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Media layers do not expose render target textures.\r\n * @param _eye unused XR eye\r\n * @returns always `null`\r\n */\r\n public getRenderTargetTextureForEye(_eye: XREye): Nullable<RenderTargetTexture> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Media layers do not expose render target textures.\r\n * @param _view unused XR view\r\n * @returns always `null`\r\n */\r\n public getRenderTargetTextureForView(_view: XRView): Nullable<RenderTargetTexture> {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRCompositionLayer.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerRenderTargetTextureProvider<\r\n LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType,\r\n> extends WebXRWebGLRenderTargetTextureProvider<LayerTypeT> {\r\n protected _lastSubImages = new Map<XREye, XRWebGLSubImage>();\r\n private _compositionLayer: XRCompositionLayer;\r\n /**\r\n * Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)\r\n */\r\n public onRenderTargetTextureCreatedObservable = new Observable<{ texture: RenderTargetTexture; eye?: XREye }>();\r\n\r\n constructor(\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding,\r\n public override readonly layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>\r\n ) {\r\n super(_xrSessionManager.scene, layerWrapper);\r\n this._compositionLayer = layerWrapper.layer;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye: XREye = \"none\") {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n const eyeIndex = eye == \"right\" ? 1 : 0;\r\n\r\n const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n\r\n if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {\r\n let depthStencilTexture;\r\n const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;\r\n const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;\r\n if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {\r\n depthStencilTexture = subImage.depthStencilTexture;\r\n }\r\n\r\n this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(\r\n colorTextureWidth,\r\n colorTextureHeight,\r\n null,\r\n subImage.colorTexture,\r\n depthStencilTexture,\r\n this.layerWrapper.isMultiview\r\n );\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: colorTextureWidth,\r\n framebufferHeight: colorTextureHeight,\r\n };\r\n this.onRenderTargetTextureCreatedObservable.notifyObservers({ texture: this._renderTargetTextures[eyeIndex], eye });\r\n }\r\n\r\n this._lastSubImages.set(eye, subImage);\r\n return this._renderTargetTextures[eyeIndex];\r\n }\r\n private _getSubImageForEye(eye?: XREye): Nullable<XRWebGLSubImage> {\r\n const currentFrame = this._xrSessionManager.currentFrame;\r\n if (currentFrame) {\r\n return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForEye(eye);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture> {\r\n return this.getRenderTargetTextureForEye(view?.eye);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const textureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n const xrViewport = subImage.viewport;\r\n viewport.x = xrViewport.x / textureWidth;\r\n viewport.y = xrViewport.y / textureHeight;\r\n viewport.width = xrViewport.width / textureWidth;\r\n viewport.height = xrViewport.height / textureHeight;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRCompositionLayer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/XR/features/Layers/WebXRCompositionLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type InternalTexture } from \"core/Materials/Textures/internalTexture\";\r\nimport { type RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { type Viewport } from \"core/Maths/math.viewport\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { type WebXRLayerType, WebXRLayerWrapper, type WebXRSpatialLayerType, type WebXRSupportedLayerType } from \"core/XR/webXRLayerWrapper\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"core/XR/webXRRenderTargetTextureProvider\";\r\nimport { WebXRWebGLRenderTargetTextureProvider } from \"core/XR/webXRWebGLRenderTargetTextureProvider\";\r\nimport { type WebXRSessionManager } from \"core/XR/webXRSessionManager\";\r\nimport { type Nullable } from \"core/types\";\r\nimport { Quaternion, Vector3 } from \"core/Maths/math.vector.pure\";\r\nimport { type TransformNode } from \"core/Meshes/transformNode.pure\";\r\n\r\n/**\r\n * The non-projection composition layers that can be positioned in an XR space.\r\n */\r\nexport type WebXRSpatialLayer = XRQuadLayer | XRCylinderLayer | XREquirectLayer | XRCubeLayer;\r\n\r\nexport type { WebXRSpatialLayerType } from \"core/XR/webXRLayerWrapper\";\r\n\r\n/**\r\n * Wraps an XR composition layer and creates its Babylon render target provider.\r\n * @typeParam LayerT the concrete WebXR composition layer type\r\n * @see https://playground.babylonjs.com/#TODARD#0\r\n */\r\nexport class WebXRCompositionLayerWrapper<\r\n LayerT extends XRCompositionLayer = XRCompositionLayer,\r\n LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType,\r\n> extends WebXRLayerWrapper<LayerTypeT> {\r\n /**\r\n * Whether this layer receives its content directly from an HTML media element.\r\n */\r\n public readonly isMediaLayer: boolean = false;\r\n\r\n /**\r\n * Whether Babylon should acquire subimages and expose render target textures for this layer.\r\n */\r\n public readonly usesRenderTargetProvider: boolean = true;\r\n\r\n /**\r\n * Whether the native layer exposes compositor opacity control.\r\n */\r\n public get isOpacitySupported(): boolean {\r\n return \"opacity\" in this.layer;\r\n }\r\n\r\n /**\r\n * Gets the compositor opacity applied to this layer.\r\n * @returns The native opacity in the range 0 to 1.\r\n * @throws If opacity is not supported by the active XR runtime.\r\n */\r\n public get opacity(): number {\r\n this._assertControlSupported(\"opacity\");\r\n return this.layer.opacity!;\r\n }\r\n\r\n /**\r\n * Sets the compositor opacity applied to this layer.\r\n * The native runtime clamps the value to the range 0 to 1.\r\n * @param value The desired opacity.\r\n * @throws If opacity is not supported by the active XR runtime.\r\n */\r\n public set opacity(value: number) {\r\n this._assertControlSupported(\"opacity\");\r\n this.layer.opacity = value;\r\n }\r\n\r\n /**\r\n * Whether the native layer exposes compositor quality hints.\r\n */\r\n public get isQualitySupported(): boolean {\r\n return \"quality\" in this.layer;\r\n }\r\n\r\n /**\r\n * Gets the compositor quality hint applied to this layer.\r\n * @returns The current native layer quality hint.\r\n * @throws If quality hints are not supported by the active XR runtime.\r\n */\r\n public get quality(): XRLayerQuality {\r\n this._assertControlSupported(\"quality\");\r\n return this.layer.quality!;\r\n }\r\n\r\n /**\r\n * Sets the compositor quality hint applied to this layer.\r\n * @param value The desired quality hint.\r\n * @throws If quality hints are not supported by the active XR runtime, or the native runtime rejects the value.\r\n */\r\n public set quality(value: XRLayerQuality) {\r\n this._assertControlSupported(\"quality\");\r\n this.layer.quality = value;\r\n }\r\n\r\n /**\r\n * Whether the native layer exposes mono-presentation control.\r\n */\r\n public get isForceMonoPresentationSupported(): boolean {\r\n return \"forceMonoPresentation\" in this.layer;\r\n }\r\n\r\n /**\r\n * Gets whether the compositor presents the left-eye layer configuration to both eyes.\r\n * @returns Whether mono presentation is forced.\r\n * @throws If mono presentation control is not supported by the active XR runtime.\r\n */\r\n public get forceMonoPresentation(): boolean {\r\n this._assertControlSupported(\"forceMonoPresentation\");\r\n return this.layer.forceMonoPresentation!;\r\n }\r\n\r\n /**\r\n * Sets whether the compositor presents the left-eye layer configuration to both eyes.\r\n * Applications should continue rendering both eyes when this is enabled.\r\n * @param value Whether to force mono presentation.\r\n * @throws If mono presentation control is not supported by the active XR runtime.\r\n */\r\n public set forceMonoPresentation(value: boolean) {\r\n this._assertControlSupported(\"forceMonoPresentation\");\r\n this.layer.forceMonoPresentation = value;\r\n }\r\n\r\n constructor(\r\n public override getWidth: () => number,\r\n public override getHeight: () => number,\r\n public override readonly layer: LayerT,\r\n public override readonly layerType: LayerTypeT,\r\n /**\r\n * Whether the layer renders both views into a texture array.\r\n */\r\n public readonly isMultiview: boolean,\r\n public createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider<LayerTypeT>,\r\n public _originalInternalTexture: Nullable<InternalTexture> = null,\r\n private readonly _destroyLayerOnDispose = false,\r\n /**\r\n * Whether the layer can only be rendered when its native `needsRedraw` flag is set.\r\n */\r\n public readonly isStatic = false\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, createRTTProvider);\r\n }\r\n\r\n private _assertControlSupported(control: \"opacity\" | \"quality\" | \"forceMonoPresentation\"): void {\r\n if (!(control in this.layer)) {\r\n throw new Error(`XRCompositionLayer.${control} is not supported by this XR runtime.`);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the Babylon render-target resources and destroys the native layer when this wrapper owns it.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n if (this._destroyLayerOnDispose) {\r\n this.layer.destroy();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a positionable XR composition layer and synchronizes it with a Babylon transform node.\r\n * The node's scaling does not affect the physical dimensions of the layer.\r\n * @typeParam LayerT the concrete positionable WebXR layer type\r\n */\r\nexport class WebXRSpatialLayerWrapper<\r\n LayerT extends WebXRSpatialLayer = WebXRSpatialLayer,\r\n LayerTypeT extends WebXRSpatialLayerType = WebXRSpatialLayerType,\r\n> extends WebXRCompositionLayerWrapper<LayerT, LayerTypeT> {\r\n private readonly _currentPosition = new Vector3();\r\n private readonly _currentRotation = new Quaternion();\r\n private readonly _lastPosition = new Vector3(Number.NaN, Number.NaN, Number.NaN);\r\n private readonly _lastRotation = new Quaternion(Number.NaN, Number.NaN, Number.NaN, Number.NaN);\r\n\r\n constructor(\r\n getWidth: () => number,\r\n getHeight: () => number,\r\n layer: LayerT,\r\n layerType: LayerTypeT,\r\n isMultiview: boolean,\r\n isStatic: boolean,\r\n /**\r\n * Whether the layer should follow changes to the session manager's reference space.\r\n */\r\n public readonly usesSessionReferenceSpace: boolean,\r\n createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider<LayerTypeT>,\r\n /**\r\n * The Babylon node whose world position and rotation are applied to the native layer.\r\n */\r\n public readonly transformNode: TransformNode,\r\n private readonly _ownsTransformNode: boolean\r\n ) {\r\n super(getWidth, getHeight, layer, layerType, isMultiview, createRTTProvider, null, true, isStatic);\r\n }\r\n\r\n /**\r\n * Synchronizes the native layer with the current world transform of the Babylon node.\r\n * @param useRightHandedSystem whether the Babylon scene uses right-handed coordinates\r\n * @param worldScalingFactor the number of Babylon scene units represented by one meter\r\n */\r\n public updateFromTransformNode(useRightHandedSystem: boolean, worldScalingFactor: number): void {\r\n this.transformNode.computeWorldMatrix(true).decompose(undefined, this._currentRotation, this._currentPosition);\r\n this._currentPosition.scaleInPlace(1 / worldScalingFactor);\r\n\r\n if (!useRightHandedSystem) {\r\n this._currentPosition.z *= -1;\r\n this._currentRotation.z *= -1;\r\n this._currentRotation.w *= -1;\r\n }\r\n\r\n if (this._currentPosition.equals(this._lastPosition) && this._currentRotation.equals(this._lastRotation)) {\r\n return;\r\n }\r\n\r\n this._lastPosition.copyFrom(this._currentPosition);\r\n this._lastRotation.copyFrom(this._currentRotation);\r\n\r\n const orientation = {\r\n x: this._currentRotation.x,\r\n y: this._currentRotation.y,\r\n z: this._currentRotation.z,\r\n w: this._currentRotation.w,\r\n };\r\n if (this.layerType === \"XRCubeLayer\") {\r\n (this.layer as XRCubeLayer).orientation =\r\n typeof DOMPointReadOnly === \"undefined\" ? (orientation as DOMPointReadOnly) : new DOMPointReadOnly(orientation.x, orientation.y, orientation.z, orientation.w);\r\n } else {\r\n (this.layer as XRQuadLayer | XRCylinderLayer | XREquirectLayer).transform = new XRRigidTransform(\r\n {\r\n x: this._currentPosition.x,\r\n y: this._currentPosition.y,\r\n z: this._currentPosition.z,\r\n },\r\n orientation\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Disposes the native layer wrapper and its Babylon transform node when the node was created by Babylon.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n if (this._ownsTransformNode) {\r\n this.transformNode.dispose();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wraps an XRMediaBinding layer.\r\n * @typeParam LayerT the concrete media layer type\r\n */\r\nexport class WebXRMediaLayerWrapper<\r\n LayerT extends Exclude<WebXRSpatialLayer, XRCubeLayer> = Exclude<WebXRSpatialLayer, XRCubeLayer>,\r\n LayerTypeT extends Exclude<WebXRSpatialLayerType, \"XRCubeLayer\"> = Exclude<WebXRSpatialLayerType, \"XRCubeLayer\">,\r\n> extends WebXRSpatialLayerWrapper<LayerT, LayerTypeT> {\r\n /**\r\n * Media layers receive their contents directly from the user agent.\r\n */\r\n public override readonly isMediaLayer: boolean = true;\r\n /**\r\n * Media layers are populated directly by the user agent.\r\n */\r\n public override readonly usesRenderTargetProvider: boolean = false;\r\n\r\n /**\r\n * Creates a wrapper for a media-backed spatial layer.\r\n * @param getWidth returns the current video width\r\n * @param getHeight returns the current video height\r\n * @param layer the native media composition layer\r\n * @param layerType the concrete spatial layer type\r\n * @param transformNode the Babylon transform synchronized with the native layer\r\n * @param ownsTransformNode whether the wrapper should dispose the transform node\r\n * @param usesSessionReferenceSpace whether the layer should follow session reference-space changes\r\n */\r\n constructor(\r\n getWidth: () => number,\r\n getHeight: () => number,\r\n layer: LayerT,\r\n layerType: LayerTypeT,\r\n transformNode: TransformNode,\r\n ownsTransformNode: boolean,\r\n usesSessionReferenceSpace: boolean\r\n ) {\r\n super(\r\n getWidth,\r\n getHeight,\r\n layer,\r\n layerType,\r\n false,\r\n false,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRNoRenderTargetTextureProvider(sessionManager, this),\r\n transformNode,\r\n ownsTransformNode\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Wraps a native cube layer and exposes its raw subimage.\r\n * Cube layers require six face uploads or render passes and therefore do not use Babylon's 2D composition-layer render target provider.\r\n */\r\nexport class WebXRCubeLayerWrapper extends WebXRSpatialLayerWrapper<XRCubeLayer, \"XRCubeLayer\"> {\r\n /**\r\n * Cube layers are populated through raw cubemap or array-layer access.\r\n */\r\n public override readonly usesRenderTargetProvider: boolean = false;\r\n\r\n constructor(\r\n getWidth: () => number,\r\n getHeight: () => number,\r\n layer: XRCubeLayer,\r\n isStatic: boolean,\r\n usesSessionReferenceSpace: boolean,\r\n private readonly _binding: XRWebGLBinding | XRGPUBinding,\r\n transformNode: TransformNode,\r\n ownsTransformNode: boolean\r\n ) {\r\n super(\r\n getWidth,\r\n getHeight,\r\n layer,\r\n \"XRCubeLayer\",\r\n false,\r\n isStatic,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRNoRenderTargetTextureProvider(sessionManager, this),\r\n transformNode,\r\n ownsTransformNode\r\n );\r\n }\r\n\r\n /**\r\n * Gets the compositor-owned cube subimage for the current frame.\r\n * WebGL callers must populate all six cubemap faces. WebGPU callers must render to six consecutive array layers beginning at the descriptor's base array layer.\r\n * @param frame the current XR frame\r\n * @param eye the eye to retrieve for stereo cube layers\r\n * @returns the raw WebGL or WebGPU cube subimage\r\n */\r\n public getSubImage(frame: XRFrame, eye?: XREye): XRWebGLSubImage | XRGPUSubImage {\r\n return this._binding.getSubImage(this.layer, frame, eye);\r\n }\r\n}\r\n\r\n/**\r\n * Composition layers that are populated outside Babylon do not expose render targets.\r\n * @internal\r\n */\r\nclass WebXRNoRenderTargetTextureProvider<LayerTypeT extends WebXRSupportedLayerType> extends WebXRLayerRenderTargetTextureProvider<LayerTypeT> {\r\n /**\r\n * Creates a no-render-target provider.\r\n * @param sessionManager the current XR session manager\r\n * @param layerWrapper the composition layer wrapper\r\n */\r\n constructor(sessionManager: WebXRSessionManager, layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>) {\r\n super(sessionManager.scene, layerWrapper);\r\n }\r\n\r\n /**\r\n * Media layers do not expose a viewport.\r\n * @param _viewport unused viewport\r\n * @param _view unused XR view\r\n * @returns always `false`\r\n */\r\n public trySetViewportForView(_viewport: Viewport, _view: XRView): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Media layers do not expose render target textures.\r\n * @param _eye unused XR eye\r\n * @returns always `null`\r\n */\r\n public getRenderTargetTextureForEye(_eye: XREye): Nullable<RenderTargetTexture> {\r\n return null;\r\n }\r\n\r\n /**\r\n * Media layers do not expose render target textures.\r\n * @param _view unused XR view\r\n * @returns always `null`\r\n */\r\n public getRenderTargetTextureForView(_view: XRView): Nullable<RenderTargetTexture> {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Provides render target textures and other important rendering information for a given XRCompositionLayer.\r\n * @internal\r\n */\r\nexport class WebXRCompositionLayerRenderTargetTextureProvider<\r\n LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType,\r\n> extends WebXRWebGLRenderTargetTextureProvider<LayerTypeT> {\r\n protected _lastSubImages = new Map<XREye, XRWebGLSubImage>();\r\n private _compositionLayer: XRCompositionLayer;\r\n /**\r\n * Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)\r\n */\r\n public onRenderTargetTextureCreatedObservable = new Observable<{ texture: RenderTargetTexture; eye?: XREye }>();\r\n\r\n constructor(\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding,\r\n public override readonly layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>\r\n ) {\r\n super(_xrSessionManager.scene, layerWrapper);\r\n this._compositionLayer = layerWrapper.layer;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye: XREye = \"none\") {\r\n const lastSubImage = this._lastSubImages.get(eye);\r\n const eyeIndex = eye == \"right\" ? 1 : 0;\r\n\r\n const colorTextureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const colorTextureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n\r\n if (!this._renderTargetTextures[eyeIndex] || lastSubImage?.textureWidth !== colorTextureWidth || lastSubImage?.textureHeight !== colorTextureHeight) {\r\n let depthStencilTexture;\r\n const depthStencilTextureWidth = subImage.depthStencilTextureWidth ?? colorTextureWidth;\r\n const depthStencilTextureHeight = subImage.depthStencilTextureHeight ?? colorTextureHeight;\r\n if (colorTextureWidth === depthStencilTextureWidth || colorTextureHeight === depthStencilTextureHeight) {\r\n depthStencilTexture = subImage.depthStencilTexture;\r\n }\r\n\r\n this._renderTargetTextures[eyeIndex] = this._createRenderTargetTexture(\r\n colorTextureWidth,\r\n colorTextureHeight,\r\n null,\r\n subImage.colorTexture,\r\n depthStencilTexture,\r\n this.layerWrapper.isMultiview\r\n );\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: colorTextureWidth,\r\n framebufferHeight: colorTextureHeight,\r\n };\r\n this.onRenderTargetTextureCreatedObservable.notifyObservers({ texture: this._renderTargetTextures[eyeIndex], eye });\r\n }\r\n\r\n this._lastSubImages.set(eye, subImage);\r\n return this._renderTargetTextures[eyeIndex];\r\n }\r\n private _getSubImageForEye(eye?: XREye): Nullable<XRWebGLSubImage> {\r\n const currentFrame = this._xrSessionManager.currentFrame;\r\n if (currentFrame) {\r\n return this._xrWebGLBinding.getSubImage(this._compositionLayer, currentFrame, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForEye(eye);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, eye);\r\n }\r\n return null;\r\n }\r\n public getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture> {\r\n return this.getRenderTargetTextureForEye(view?.eye);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n const textureWidth = subImage.colorTextureWidth ?? subImage.textureWidth;\r\n const textureHeight = subImage.colorTextureHeight ?? subImage.textureHeight;\r\n const xrViewport = subImage.viewport;\r\n viewport.x = xrViewport.x / textureWidth;\r\n viewport.y = xrViewport.y / textureHeight;\r\n viewport.width = xrViewport.width / textureWidth;\r\n viewport.height = xrViewport.height / textureHeight;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n"]}
|
|
@@ -6,7 +6,7 @@ import { Axis } from "../../Maths/math.axis.js";
|
|
|
6
6
|
import { StandardMaterial } from "../../Materials/standardMaterial.pure.js";
|
|
7
7
|
import { CreateCylinder } from "../../Meshes/Builders/cylinderBuilder.pure.js";
|
|
8
8
|
import { CreateTorus } from "../../Meshes/Builders/torusBuilder.pure.js";
|
|
9
|
-
import { Ray } from "../../Culling/ray.pure.js";
|
|
9
|
+
import { Ray, RegisterRay } from "../../Culling/ray.pure.js";
|
|
10
10
|
import { PickingInfo } from "../../Collisions/pickingInfo.js";
|
|
11
11
|
import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
|
|
12
12
|
import { UtilityLayerRenderer } from "../../Rendering/utilityLayerRenderer.js";
|
|
@@ -796,6 +796,7 @@ export function RegisterWebXRControllerPointerSelection() {
|
|
|
796
796
|
return;
|
|
797
797
|
}
|
|
798
798
|
_Registered = true;
|
|
799
|
+
RegisterRay();
|
|
799
800
|
//register the plugin
|
|
800
801
|
WebXRFeaturesManager.AddWebXRFeature(WebXRControllerPointerSelection.Name, (xrSessionManager, options) => {
|
|
801
802
|
return () => new WebXRControllerPointerSelection(xrSessionManager, options);
|