@iwsdk/core 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +94 -0
- package/dist/asset/loaders/hdr-texture-loader.d.ts +1 -1
- package/dist/asset/loaders/hdr-texture-loader.d.ts.map +1 -1
- package/dist/asset/loaders/hdr-texture-loader.js +4 -4
- package/dist/asset/loaders/hdr-texture-loader.js.map +1 -1
- package/dist/audio/audio-system.d.ts +6 -2
- package/dist/audio/audio-system.d.ts.map +1 -1
- package/dist/audio/audio-system.js +1 -0
- package/dist/audio/audio-system.js.map +1 -1
- package/dist/audio/audio.d.ts +3 -1
- package/dist/audio/audio.d.ts.map +1 -1
- package/dist/audio/audio.js +8 -2
- package/dist/audio/audio.js.map +1 -1
- package/dist/camera/camera-source.js +1 -0
- package/dist/camera/camera-source.js.map +1 -1
- package/dist/camera/camera-system.d.ts.map +1 -1
- package/dist/camera/camera-system.js +1 -0
- package/dist/camera/camera-system.js.map +1 -1
- package/dist/camera/camera-utils.d.ts.map +1 -1
- package/dist/camera/camera-utils.js.map +1 -1
- package/dist/depth/depth-occludable.d.ts +48 -0
- package/dist/depth/depth-occludable.d.ts.map +1 -0
- package/dist/depth/depth-occludable.js +48 -0
- package/dist/depth/depth-occludable.js.map +1 -0
- package/dist/depth/depth-sensing-system.d.ts +164 -0
- package/dist/depth/depth-sensing-system.d.ts.map +1 -0
- package/dist/depth/depth-sensing-system.js +453 -0
- package/dist/depth/depth-sensing-system.js.map +1 -0
- package/dist/depth/depth-textures.d.ts +53 -0
- package/dist/depth/depth-textures.d.ts.map +1 -0
- package/dist/depth/depth-textures.js +114 -0
- package/dist/depth/depth-textures.js.map +1 -0
- package/dist/depth/index.d.ts +10 -0
- package/dist/depth/index.d.ts.map +1 -0
- package/dist/depth/occlusion/preprocessing-pass.d.ts +52 -0
- package/dist/depth/occlusion/preprocessing-pass.d.ts.map +1 -0
- package/dist/depth/occlusion/preprocessing-pass.js +105 -0
- package/dist/depth/occlusion/preprocessing-pass.js.map +1 -0
- package/dist/depth/occlusion/preprocessing-shader.glsl.d.ts +22 -0
- package/dist/depth/occlusion/preprocessing-shader.glsl.d.ts.map +1 -0
- package/dist/depth/occlusion/preprocessing-shader.glsl.js +115 -0
- package/dist/depth/occlusion/preprocessing-shader.glsl.js.map +1 -0
- package/dist/ecs/entity.d.ts +17 -1
- package/dist/ecs/entity.d.ts.map +1 -1
- package/dist/ecs/entity.js +7 -1
- package/dist/ecs/entity.js.map +1 -1
- package/dist/ecs/world.d.ts +12 -0
- package/dist/ecs/world.d.ts.map +1 -1
- package/dist/ecs/world.js +47 -3
- package/dist/ecs/world.js.map +1 -1
- package/dist/environment/dome-gradient.js +1 -0
- package/dist/environment/dome-gradient.js.map +1 -1
- package/dist/environment/dome-texture.d.ts +3 -1
- package/dist/environment/dome-texture.d.ts.map +1 -1
- package/dist/environment/dome-texture.js +7 -1
- package/dist/environment/dome-texture.js.map +1 -1
- package/dist/environment/environment-system.d.ts +8 -0
- package/dist/environment/environment-system.d.ts.map +1 -1
- package/dist/environment/environment-system.js +78 -2
- package/dist/environment/environment-system.js.map +1 -1
- package/dist/environment/ibl-gradient.js +1 -0
- package/dist/environment/ibl-gradient.js.map +1 -1
- package/dist/environment/ibl-texture.d.ts +3 -1
- package/dist/environment/ibl-texture.d.ts.map +1 -1
- package/dist/environment/ibl-texture.js +7 -1
- package/dist/environment/ibl-texture.js.map +1 -1
- package/dist/environment-raycast/environment-raycast.d.ts +136 -0
- package/dist/environment-raycast/environment-raycast.d.ts.map +1 -0
- package/dist/environment-raycast/environment-raycast.js +333 -0
- package/dist/environment-raycast/environment-raycast.js.map +1 -0
- package/dist/environment-raycast/index.d.ts +9 -0
- package/dist/environment-raycast/index.d.ts.map +1 -0
- package/dist/environment-raycast/raycast-target.d.ts +114 -0
- package/dist/environment-raycast/raycast-target.d.ts.map +1 -0
- package/dist/environment-raycast/raycast-target.js +84 -0
- package/dist/environment-raycast/raycast-target.js.map +1 -0
- package/dist/grab/distance-grabbable.d.ts +27 -2
- package/dist/grab/distance-grabbable.d.ts.map +1 -1
- package/dist/grab/distance-grabbable.js +25 -2
- package/dist/grab/distance-grabbable.js.map +1 -1
- package/dist/grab/grab-system.d.ts +106 -61
- package/dist/grab/grab-system.d.ts.map +1 -1
- package/dist/grab/grab-system.js +61 -10
- package/dist/grab/grab-system.js.map +1 -1
- package/dist/grab/handles.d.ts +14 -4
- package/dist/grab/handles.d.ts.map +1 -1
- package/dist/grab/handles.js +45 -18
- package/dist/grab/handles.js.map +1 -1
- package/dist/grab/index.d.ts +0 -1
- package/dist/grab/index.d.ts.map +1 -1
- package/dist/grab/index.js +0 -2
- package/dist/grab/index.js.map +1 -1
- package/dist/grab/one-hand-grabbable.js +1 -0
- package/dist/grab/one-hand-grabbable.js.map +1 -1
- package/dist/grab/two-hands-grabbable.js +1 -0
- package/dist/grab/two-hands-grabbable.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/init/world-initializer.d.ts +17 -3
- package/dist/init/world-initializer.d.ts.map +1 -1
- package/dist/init/world-initializer.js +86 -19
- package/dist/init/world-initializer.js.map +1 -1
- package/dist/init/xr.d.ts +1 -0
- package/dist/init/xr.d.ts.map +1 -1
- package/dist/init/xr.js +6 -0
- package/dist/init/xr.js.map +1 -1
- package/dist/input/input-system.d.ts +408 -5
- package/dist/input/input-system.d.ts.map +1 -1
- package/dist/input/input-system.js +146 -23
- package/dist/input/input-system.js.map +1 -1
- package/dist/input/state-tags.d.ts +32 -15
- package/dist/input/state-tags.d.ts.map +1 -1
- package/dist/input/state-tags.js +34 -16
- package/dist/input/state-tags.js.map +1 -1
- package/dist/level/level-entity-creator.js +1 -0
- package/dist/level/level-entity-creator.js.map +1 -1
- package/dist/level/level-root.js +1 -0
- package/dist/level/level-root.js.map +1 -1
- package/dist/level/level-system.js +1 -0
- package/dist/level/level-system.js.map +1 -1
- package/dist/level/level-tag.js +1 -0
- package/dist/level/level-tag.js.map +1 -1
- package/dist/locomotion/locomotion.d.ts +10 -0
- package/dist/locomotion/locomotion.d.ts.map +1 -1
- package/dist/locomotion/locomotion.js +17 -1
- package/dist/locomotion/locomotion.js.map +1 -1
- package/dist/locomotion/slide.d.ts +10 -0
- package/dist/locomotion/slide.d.ts.map +1 -1
- package/dist/locomotion/slide.js +6 -2
- package/dist/locomotion/slide.js.map +1 -1
- package/dist/locomotion/teleport.js +1 -0
- package/dist/locomotion/teleport.js.map +1 -1
- package/dist/mcp/ecs-debug-tools.d.ts +167 -0
- package/dist/mcp/ecs-debug-tools.d.ts.map +1 -0
- package/dist/mcp/ecs-debug-tools.js +602 -0
- package/dist/mcp/ecs-debug-tools.js.map +1 -0
- package/dist/mcp/index.d.ts +10 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/mcp-runtime.d.ts +31 -0
- package/dist/mcp/mcp-runtime.d.ts.map +1 -0
- package/dist/mcp/mcp-runtime.js +85 -0
- package/dist/mcp/mcp-runtime.js.map +1 -0
- package/dist/mcp/scene-tools.d.ts +41 -0
- package/dist/mcp/scene-tools.d.ts.map +1 -0
- package/dist/mcp/scene-tools.js +95 -0
- package/dist/mcp/scene-tools.js.map +1 -0
- package/dist/physics/physics-system.d.ts +1 -1
- package/dist/physics/physics-system.d.ts.map +1 -1
- package/dist/physics/physics-system.js +9 -4
- package/dist/physics/physics-system.js.map +1 -1
- package/dist/physics/utils.d.ts.map +1 -1
- package/dist/physics/utils.js +1 -1
- package/dist/scene-understanding/anchor.js +1 -0
- package/dist/scene-understanding/anchor.js.map +1 -1
- package/dist/scene-understanding/mesh.js +1 -0
- package/dist/scene-understanding/mesh.js.map +1 -1
- package/dist/scene-understanding/plane.js +1 -0
- package/dist/scene-understanding/plane.js.map +1 -1
- package/dist/scene-understanding/scene-understanding-system.d.ts +29 -0
- package/dist/scene-understanding/scene-understanding-system.d.ts.map +1 -1
- package/dist/scene-understanding/scene-understanding-system.js +118 -18
- package/dist/scene-understanding/scene-understanding-system.js.map +1 -1
- package/dist/transform/index.d.ts +2 -0
- package/dist/transform/index.d.ts.map +1 -1
- package/dist/transform/synced-euler.d.ts +62 -0
- package/dist/transform/synced-euler.d.ts.map +1 -0
- package/dist/transform/synced-euler.js +212 -0
- package/dist/transform/synced-euler.js.map +1 -0
- package/dist/transform/synced-quaternion.d.ts +11 -0
- package/dist/transform/synced-quaternion.d.ts.map +1 -1
- package/dist/transform/synced-quaternion.js +29 -0
- package/dist/transform/synced-quaternion.js.map +1 -1
- package/dist/transform/transform-utils.d.ts +24 -0
- package/dist/transform/transform-utils.d.ts.map +1 -0
- package/dist/transform/transform-utils.js +53 -0
- package/dist/transform/transform-utils.js.map +1 -0
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +19 -2
- package/dist/transform/transform.js.map +1 -1
- package/dist/ui/follow.js +1 -0
- package/dist/ui/follow.js.map +1 -1
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/screenspace.js +1 -0
- package/dist/ui/screenspace.js.map +1 -1
- package/dist/ui/ui.d.ts.map +1 -1
- package/dist/ui/ui.js +2 -8
- package/dist/ui/ui.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/visibility/visibility.d.ts.map +1 -1
- package/dist/visibility/visibility.js +4 -1
- package/dist/visibility/visibility.js.map +1 -1
- package/package.json +16 -9
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.1.7_super-three@0.177.0/node_modules/@pmndrs/uikitml/dist/interpreter/html.js +0 -128
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.1.7_super-three@0.177.0/node_modules/@pmndrs/uikitml/dist/interpreter/html.js.map +0 -1
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.1.7_super-three@0.177.0/node_modules/@pmndrs/uikitml/dist/interpreter/index.js +0 -161
- package/dist/node_modules/.pnpm/@pmndrs_uikitml@0.1.7_super-three@0.177.0/node_modules/@pmndrs/uikitml/dist/interpreter/index.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.js +0 -66
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.js +0 -162
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/html.js +0 -519
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/html.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/token.js +0 -15
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/token.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/unicode.js +0 -32
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/unicode.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.js +0 -10
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/index.js +0 -41
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/index.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.js +0 -35
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/serializer/index.js +0 -24
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/serializer/index.js.map +0 -1
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.js +0 -92
- package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.js.map +0 -1
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/libs/fflate.module.js +0 -382
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/libs/fflate.module.js.map +0 -1
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/EXRLoader.js +0 -2587
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/EXRLoader.js.map +0 -1
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/RGBELoader.js +0 -477
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/RGBELoader.js.map +0 -1
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/src/math/MathUtils.js +0 -17
- package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/src/math/MathUtils.js.map +0 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
import { Types } from '../ecs/index.js';
|
|
8
|
+
declare const DepthSensingSystem_base: import("elics").SystemConstructor<{
|
|
9
|
+
enableOcclusion: {
|
|
10
|
+
type: Types.Boolean;
|
|
11
|
+
default: true;
|
|
12
|
+
};
|
|
13
|
+
enableDepthTexture: {
|
|
14
|
+
type: Types.Boolean;
|
|
15
|
+
default: true;
|
|
16
|
+
};
|
|
17
|
+
useFloat32: {
|
|
18
|
+
type: Types.Boolean;
|
|
19
|
+
default: true;
|
|
20
|
+
};
|
|
21
|
+
blurRadius: {
|
|
22
|
+
type: Types.Float32;
|
|
23
|
+
default: number;
|
|
24
|
+
};
|
|
25
|
+
}, {
|
|
26
|
+
occludables: {
|
|
27
|
+
required: import("elics").Component<{
|
|
28
|
+
mode: {
|
|
29
|
+
type: Types.Enum;
|
|
30
|
+
enum: {
|
|
31
|
+
SoftOcclusion: string;
|
|
32
|
+
HardOcclusion: string;
|
|
33
|
+
MinMaxSoftOcclusion: string;
|
|
34
|
+
};
|
|
35
|
+
default: string;
|
|
36
|
+
};
|
|
37
|
+
}>[];
|
|
38
|
+
};
|
|
39
|
+
}, import("../ecs/world.js").World, import("../ecs/system.js").System<{
|
|
40
|
+
enableOcclusion: {
|
|
41
|
+
type: Types.Boolean;
|
|
42
|
+
default: true;
|
|
43
|
+
};
|
|
44
|
+
enableDepthTexture: {
|
|
45
|
+
type: Types.Boolean;
|
|
46
|
+
default: true;
|
|
47
|
+
};
|
|
48
|
+
useFloat32: {
|
|
49
|
+
type: Types.Boolean;
|
|
50
|
+
default: true;
|
|
51
|
+
};
|
|
52
|
+
blurRadius: {
|
|
53
|
+
type: Types.Float32;
|
|
54
|
+
default: number;
|
|
55
|
+
};
|
|
56
|
+
}, {
|
|
57
|
+
occludables: {
|
|
58
|
+
required: import("elics").Component<{
|
|
59
|
+
mode: {
|
|
60
|
+
type: Types.Enum;
|
|
61
|
+
enum: {
|
|
62
|
+
SoftOcclusion: string;
|
|
63
|
+
HardOcclusion: string;
|
|
64
|
+
MinMaxSoftOcclusion: string;
|
|
65
|
+
};
|
|
66
|
+
default: string;
|
|
67
|
+
};
|
|
68
|
+
}>[];
|
|
69
|
+
};
|
|
70
|
+
}>>;
|
|
71
|
+
/**
|
|
72
|
+
* DepthSensingSystem - Manages WebXR depth sensing and occlusion.
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* - Automatically retrieves and processes depth data from WebXR sessions.
|
|
76
|
+
* - Supports both CPU-optimized and GPU-optimized depth sensing.
|
|
77
|
+
* - Enables occlusion of virtual objects behind real-world surfaces.
|
|
78
|
+
* - Requires WebXR session feature: 'depth-sensing'.
|
|
79
|
+
* NOTE: The depth occlusion feature may not be compatible with custom shaders.
|
|
80
|
+
*
|
|
81
|
+
* @example Basic depth sensing setup
|
|
82
|
+
* ```ts
|
|
83
|
+
* // Configure world with depth sensing
|
|
84
|
+
* World.create(document.getElementById('scene-container'), {
|
|
85
|
+
* xr: {
|
|
86
|
+
* sessionMode: SessionMode.ImmersiveAR,
|
|
87
|
+
* features: {
|
|
88
|
+
* depthSensing: { usage: 'gpu-optimized', format: 'float32' }
|
|
89
|
+
* },
|
|
90
|
+
* }
|
|
91
|
+
* })
|
|
92
|
+
*
|
|
93
|
+
* // Add the depth sensing system
|
|
94
|
+
* world.registerSystem(DepthSensingSystem)
|
|
95
|
+
* ```
|
|
96
|
+
*
|
|
97
|
+
* @example Enable occlusion for an object
|
|
98
|
+
* ```ts
|
|
99
|
+
* const cube = world.createTransformEntity(cubeObject)
|
|
100
|
+
* cube.addComponent(DepthOccludable) // Will be occluded by real-world geometry
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @category Depth Sensing
|
|
104
|
+
* @see {@link DepthOccludable}
|
|
105
|
+
*/
|
|
106
|
+
export declare class DepthSensingSystem extends DepthSensingSystem_base {
|
|
107
|
+
private depthFeatureEnabled;
|
|
108
|
+
cpuDepthData: XRCPUDepthInformation[];
|
|
109
|
+
gpuDepthData: XRWebGLDepthInformation[];
|
|
110
|
+
private depthTextures?;
|
|
111
|
+
private entityShaderMap;
|
|
112
|
+
private readonly viewportSize;
|
|
113
|
+
private preprocessingPass?;
|
|
114
|
+
private minMaxEntityCount;
|
|
115
|
+
/**
|
|
116
|
+
* Get the raw value to meters conversion factor.
|
|
117
|
+
*/
|
|
118
|
+
get rawValueToMeters(): number;
|
|
119
|
+
init(): void;
|
|
120
|
+
private initializeDepthTextures;
|
|
121
|
+
/**
|
|
122
|
+
* Injects inline depth occlusion shader code into all materials of an entity.
|
|
123
|
+
*/
|
|
124
|
+
private attachOcclusionToEntity;
|
|
125
|
+
private detachOcclusionFromEntity;
|
|
126
|
+
/**
|
|
127
|
+
* Modifies a material's shader in-place to incorporate inline depth-based
|
|
128
|
+
* occlusion. Compares the virtual fragment's view-space depth against the
|
|
129
|
+
* real-world depth from the XR depth texture array.
|
|
130
|
+
* Both GPU-optimized (ExternalTexture) and CPU-optimized (DataArrayTexture)
|
|
131
|
+
* paths use sampler2DArray with VIEW_ID for correct stereo depth sampling.
|
|
132
|
+
* @param shader - The shader object provided by onBeforeCompile.
|
|
133
|
+
*/
|
|
134
|
+
private static addOcclusionToShader;
|
|
135
|
+
private cleanup;
|
|
136
|
+
private updateEnabledFeatures;
|
|
137
|
+
update(): void;
|
|
138
|
+
/**
|
|
139
|
+
* Runs the MinMax depth preprocessing pass if any entity uses MinMaxSoftOcclusion.
|
|
140
|
+
* Renders a fullscreen pass per eye that computes min/max/avg depth in a 4×4
|
|
141
|
+
* neighborhood, outputting to per-view 2D render targets.
|
|
142
|
+
*/
|
|
143
|
+
private runMinMaxPreprocessing;
|
|
144
|
+
/**
|
|
145
|
+
* Updates depth data from the XR frame.
|
|
146
|
+
*/
|
|
147
|
+
private updateLocalDepth;
|
|
148
|
+
/**
|
|
149
|
+
* Update with CPU-optimized depth data.
|
|
150
|
+
*/
|
|
151
|
+
private updateCPUDepthData;
|
|
152
|
+
/**
|
|
153
|
+
* Update with GPU-optimized depth data.
|
|
154
|
+
*/
|
|
155
|
+
private updateGPUDepthData;
|
|
156
|
+
/**
|
|
157
|
+
* Updates depth texture uniforms on all occludable materials each frame.
|
|
158
|
+
* Both GPU and CPU paths set the texture array uniform; the shader uses
|
|
159
|
+
* VIEW_ID to select the correct stereo layer.
|
|
160
|
+
*/
|
|
161
|
+
private updateOcclusionUniforms;
|
|
162
|
+
}
|
|
163
|
+
export {};
|
|
164
|
+
//# sourceMappingURL=depth-sensing-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depth-sensing-system.d.ts","sourceRoot":"","sources":["../../src/depth/depth-sensing-system.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAwB,KAAK,EAAE,MAAM,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAe9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,kBAAmB,SAAQ,uBAUvC;IACC,OAAO,CAAC,mBAAmB,CAAsB;IAGjD,YAAY,EAAE,qBAAqB,EAAE,CAAM;IAC3C,YAAY,EAAE,uBAAuB,EAAE,CAAM;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAgB;IAGtC,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiB;IAC9C,OAAO,CAAC,iBAAiB,CAAC,CAAyB;IACnD,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,CAO7B;IAED,IAAI,IAAI,IAAI;IAoCZ,OAAO,CAAC,uBAAuB;IAI/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAwC/B,OAAO,CAAC,yBAAyB;IAIjC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAsInC,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,qBAAqB;IAe7B,MAAM,IAAI,IAAI;IAgBd;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IAkD9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgCxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;CA0ChC"}
|
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { createSystem } from '../ecs/system.js';
|
|
2
|
+
import '../ecs/world.js';
|
|
3
|
+
import { Types } from 'elics';
|
|
4
|
+
import '../ecs/entity.js';
|
|
5
|
+
import '../ecs/component-registry.js';
|
|
6
|
+
import '../runtime/three.js';
|
|
7
|
+
import { DepthOccludable, OcclusionShadersMode } from './depth-occludable.js';
|
|
8
|
+
import { DepthTextures } from './depth-textures.js';
|
|
9
|
+
import { DepthPreprocessingPass } from './occlusion/preprocessing-pass.js';
|
|
10
|
+
import { Vector2, Mesh } from 'three';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the MIT license found in the
|
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* DepthSensingSystem - Manages WebXR depth sensing and occlusion.
|
|
20
|
+
*
|
|
21
|
+
* @remarks
|
|
22
|
+
* - Automatically retrieves and processes depth data from WebXR sessions.
|
|
23
|
+
* - Supports both CPU-optimized and GPU-optimized depth sensing.
|
|
24
|
+
* - Enables occlusion of virtual objects behind real-world surfaces.
|
|
25
|
+
* - Requires WebXR session feature: 'depth-sensing'.
|
|
26
|
+
* NOTE: The depth occlusion feature may not be compatible with custom shaders.
|
|
27
|
+
*
|
|
28
|
+
* @example Basic depth sensing setup
|
|
29
|
+
* ```ts
|
|
30
|
+
* // Configure world with depth sensing
|
|
31
|
+
* World.create(document.getElementById('scene-container'), {
|
|
32
|
+
* xr: {
|
|
33
|
+
* sessionMode: SessionMode.ImmersiveAR,
|
|
34
|
+
* features: {
|
|
35
|
+
* depthSensing: { usage: 'gpu-optimized', format: 'float32' }
|
|
36
|
+
* },
|
|
37
|
+
* }
|
|
38
|
+
* })
|
|
39
|
+
*
|
|
40
|
+
* // Add the depth sensing system
|
|
41
|
+
* world.registerSystem(DepthSensingSystem)
|
|
42
|
+
* ```
|
|
43
|
+
*
|
|
44
|
+
* @example Enable occlusion for an object
|
|
45
|
+
* ```ts
|
|
46
|
+
* const cube = world.createTransformEntity(cubeObject)
|
|
47
|
+
* cube.addComponent(DepthOccludable) // Will be occluded by real-world geometry
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @category Depth Sensing
|
|
51
|
+
* @see {@link DepthOccludable}
|
|
52
|
+
*/
|
|
53
|
+
class DepthSensingSystem extends createSystem({
|
|
54
|
+
occludables: { required: [DepthOccludable] },
|
|
55
|
+
}, {
|
|
56
|
+
enableOcclusion: { type: Types.Boolean, default: true },
|
|
57
|
+
enableDepthTexture: { type: Types.Boolean, default: true },
|
|
58
|
+
useFloat32: { type: Types.Boolean, default: true },
|
|
59
|
+
blurRadius: { type: Types.Float32, default: 20.0 },
|
|
60
|
+
}) {
|
|
61
|
+
constructor() {
|
|
62
|
+
super(...arguments);
|
|
63
|
+
// Depth data storage
|
|
64
|
+
this.cpuDepthData = [];
|
|
65
|
+
this.gpuDepthData = [];
|
|
66
|
+
// Occlusion
|
|
67
|
+
this.entityShaderMap = new Map();
|
|
68
|
+
this.viewportSize = new Vector2();
|
|
69
|
+
this.minMaxEntityCount = 0;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the raw value to meters conversion factor.
|
|
73
|
+
*/
|
|
74
|
+
get rawValueToMeters() {
|
|
75
|
+
if (this.cpuDepthData.length) {
|
|
76
|
+
return this.cpuDepthData[0].rawValueToMeters;
|
|
77
|
+
}
|
|
78
|
+
else if (this.gpuDepthData.length) {
|
|
79
|
+
return this.gpuDepthData[0].rawValueToMeters;
|
|
80
|
+
}
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
init() {
|
|
84
|
+
this.xrManager.addEventListener('sessionstart', () => {
|
|
85
|
+
this.updateEnabledFeatures(this.xrManager.getSession());
|
|
86
|
+
});
|
|
87
|
+
this.xrManager.addEventListener('sessionend', () => {
|
|
88
|
+
this.cleanup();
|
|
89
|
+
});
|
|
90
|
+
// React to config changes
|
|
91
|
+
this.config.enableDepthTexture.subscribe((enabled) => {
|
|
92
|
+
if (enabled && !this.depthTextures) {
|
|
93
|
+
this.initializeDepthTextures();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
this.queries.occludables.subscribe('qualify', (entity) => {
|
|
97
|
+
this.attachOcclusionToEntity(entity);
|
|
98
|
+
if (DepthOccludable.data.mode[entity.index] ===
|
|
99
|
+
OcclusionShadersMode.MinMaxSoftOcclusion) {
|
|
100
|
+
this.minMaxEntityCount++;
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
this.queries.occludables.subscribe('disqualify', (entity) => {
|
|
104
|
+
if (DepthOccludable.data.mode[entity.index] ===
|
|
105
|
+
OcclusionShadersMode.MinMaxSoftOcclusion) {
|
|
106
|
+
this.minMaxEntityCount--;
|
|
107
|
+
}
|
|
108
|
+
this.detachOcclusionFromEntity(entity);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
initializeDepthTextures() {
|
|
112
|
+
this.depthTextures = new DepthTextures(this.config.useFloat32.value);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Injects inline depth occlusion shader code into all materials of an entity.
|
|
116
|
+
*/
|
|
117
|
+
attachOcclusionToEntity(entity) {
|
|
118
|
+
const object3D = entity.object3D;
|
|
119
|
+
if (!object3D) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const entityUniforms = new Set();
|
|
123
|
+
this.entityShaderMap.set(entity, entityUniforms);
|
|
124
|
+
object3D.traverse((child) => {
|
|
125
|
+
var _a;
|
|
126
|
+
if (!(child instanceof Mesh)) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const materials = Array.isArray(child.material)
|
|
130
|
+
? child.material
|
|
131
|
+
: [child.material];
|
|
132
|
+
for (const material of materials) {
|
|
133
|
+
if (!material) {
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
material.transparent = true;
|
|
137
|
+
const existingCallback = (_a = material.onBeforeCompile) === null || _a === void 0 ? void 0 : _a.bind(material);
|
|
138
|
+
material.onBeforeCompile = (shader, renderer) => {
|
|
139
|
+
if (existingCallback) {
|
|
140
|
+
existingCallback(shader, renderer);
|
|
141
|
+
}
|
|
142
|
+
// Only inject occlusion if not already present
|
|
143
|
+
if (!shader.uniforms.occlusionEnabled) {
|
|
144
|
+
DepthSensingSystem.addOcclusionToShader(shader);
|
|
145
|
+
}
|
|
146
|
+
material.userData.shader = shader;
|
|
147
|
+
entityUniforms.add(shader.uniforms);
|
|
148
|
+
};
|
|
149
|
+
material.needsUpdate = true;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
detachOcclusionFromEntity(entity) {
|
|
154
|
+
this.entityShaderMap.delete(entity);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Modifies a material's shader in-place to incorporate inline depth-based
|
|
158
|
+
* occlusion. Compares the virtual fragment's view-space depth against the
|
|
159
|
+
* real-world depth from the XR depth texture array.
|
|
160
|
+
* Both GPU-optimized (ExternalTexture) and CPU-optimized (DataArrayTexture)
|
|
161
|
+
* paths use sampler2DArray with VIEW_ID for correct stereo depth sampling.
|
|
162
|
+
* @param shader - The shader object provided by onBeforeCompile.
|
|
163
|
+
*/
|
|
164
|
+
static addOcclusionToShader(shader) {
|
|
165
|
+
var _a;
|
|
166
|
+
shader.uniforms.occlusionEnabled = { value: false };
|
|
167
|
+
shader.uniforms.uXRDepthTextureArray = { value: null };
|
|
168
|
+
shader.uniforms.uRawValueToMeters = { value: 0.001 };
|
|
169
|
+
shader.uniforms.uIsGPUDepth = { value: false };
|
|
170
|
+
shader.uniforms.uDepthNear = { value: 0 };
|
|
171
|
+
shader.uniforms.uViewportSize = { value: new Vector2() };
|
|
172
|
+
shader.uniforms.uOcclusionBlurRadius = { value: 20.0 };
|
|
173
|
+
shader.uniforms.uOcclusionHardMode = { value: false };
|
|
174
|
+
shader.uniforms.uOcclusionMinMaxMode = { value: false };
|
|
175
|
+
shader.uniforms.uMinMaxTexture0 = { value: null };
|
|
176
|
+
shader.uniforms.uMinMaxTexture1 = { value: null };
|
|
177
|
+
shader.defines = {
|
|
178
|
+
...((_a = shader.defines) !== null && _a !== void 0 ? _a : {}),
|
|
179
|
+
USE_UV: true,
|
|
180
|
+
};
|
|
181
|
+
// Vertex shader: compute view-space depth for occlusion comparison
|
|
182
|
+
shader.vertexShader = shader.vertexShader
|
|
183
|
+
.replace('#include <common>', ['varying float vOcclusionViewDepth;', '#include <common>'].join('\n'))
|
|
184
|
+
.replace('#include <fog_vertex>', [
|
|
185
|
+
'#include <fog_vertex>',
|
|
186
|
+
'vec4 occlusion_view_pos = modelViewMatrix * vec4(position, 1.0);',
|
|
187
|
+
'vOcclusionViewDepth = -occlusion_view_pos.z;',
|
|
188
|
+
].join('\n'));
|
|
189
|
+
// Fragment shader: sample XR depth array and compare against virtual depth
|
|
190
|
+
shader.fragmentShader = shader.fragmentShader
|
|
191
|
+
.replace('uniform vec3 diffuse;', [
|
|
192
|
+
'uniform vec3 diffuse;',
|
|
193
|
+
'uniform bool occlusionEnabled;',
|
|
194
|
+
'uniform float uRawValueToMeters;',
|
|
195
|
+
'uniform bool uIsGPUDepth;',
|
|
196
|
+
'uniform float uDepthNear;',
|
|
197
|
+
'uniform vec2 uViewportSize;',
|
|
198
|
+
'uniform float uOcclusionBlurRadius;',
|
|
199
|
+
'uniform bool uOcclusionHardMode;',
|
|
200
|
+
'uniform bool uOcclusionMinMaxMode;',
|
|
201
|
+
'uniform sampler2D uMinMaxTexture0;',
|
|
202
|
+
'uniform sampler2D uMinMaxTexture1;',
|
|
203
|
+
'varying float vOcclusionViewDepth;',
|
|
204
|
+
'',
|
|
205
|
+
'uniform sampler2DArray uXRDepthTextureArray;',
|
|
206
|
+
'',
|
|
207
|
+
'// Fallback for non-multiview sessions',
|
|
208
|
+
'#ifndef VIEW_ID',
|
|
209
|
+
'#define VIEW_ID 0',
|
|
210
|
+
'#endif',
|
|
211
|
+
'',
|
|
212
|
+
'float OcclusionDepthGetMeters(in vec2 uv) {',
|
|
213
|
+
' float textureValue = texture(uXRDepthTextureArray, vec3(uv.x, uv.y, float(VIEW_ID))).r;',
|
|
214
|
+
' if (uIsGPUDepth) {',
|
|
215
|
+
' return uRawValueToMeters * uDepthNear / (1.0 - textureValue);',
|
|
216
|
+
' }',
|
|
217
|
+
' return textureValue * uRawValueToMeters;',
|
|
218
|
+
'}',
|
|
219
|
+
'',
|
|
220
|
+
'float OcclusionGetSample(in vec2 depthUV, in vec2 offset) {',
|
|
221
|
+
' float sampleDepth = OcclusionDepthGetMeters(depthUV + offset);',
|
|
222
|
+
' return smoothstep(0.0, 0.05, sampleDepth - vOcclusionViewDepth);',
|
|
223
|
+
'}',
|
|
224
|
+
].join('\n'))
|
|
225
|
+
.replace('vec4 diffuseColor = vec4( diffuse, opacity );', [
|
|
226
|
+
'vec4 diffuseColor = vec4( diffuse, opacity );',
|
|
227
|
+
'if (occlusionEnabled) {',
|
|
228
|
+
' vec2 screenUV = gl_FragCoord.xy / uViewportSize;',
|
|
229
|
+
' vec2 depthUV = uIsGPUDepth ? screenUV : vec2(screenUV.x, 1.0 - screenUV.y);',
|
|
230
|
+
' float occlusion_value;',
|
|
231
|
+
' if (uOcclusionMinMaxMode) {',
|
|
232
|
+
' // MinMax soft occlusion — two-cluster edge-aware blending',
|
|
233
|
+
' vec4 mmData;',
|
|
234
|
+
' if (uint(VIEW_ID) == 0u) {',
|
|
235
|
+
' mmData = texture2D(uMinMaxTexture0, depthUV);',
|
|
236
|
+
' } else {',
|
|
237
|
+
' mmData = texture2D(uMinMaxTexture1, depthUV);',
|
|
238
|
+
' }',
|
|
239
|
+
' float minAvgDepth = mmData.r;',
|
|
240
|
+
' float maxAvgDepth = mmData.g;',
|
|
241
|
+
' float midAvgDepth = mmData.r + mmData.b;',
|
|
242
|
+
' float fadeRange = vOcclusionViewDepth * 0.04;',
|
|
243
|
+
' float fadeRangeInv = 1.0 / max(fadeRange, 0.001);',
|
|
244
|
+
' vec3 envDepths = vec3(minAvgDepth, maxAvgDepth, midAvgDepth);',
|
|
245
|
+
' vec3 occAlphas = clamp((envDepths - vOcclusionViewDepth) * fadeRangeInv, 0.0, 1.0);',
|
|
246
|
+
' occlusion_value = occAlphas.z;',
|
|
247
|
+
' float alphaDiff = occAlphas.y - occAlphas.x;',
|
|
248
|
+
' if (alphaDiff > 0.03) {',
|
|
249
|
+
' float denom = mmData.a;',
|
|
250
|
+
' float interp = denom > 0.001 ? mmData.b / denom : 0.5;',
|
|
251
|
+
' occlusion_value = mix(occAlphas.x, occAlphas.y, smoothstep(0.2, 0.8, interp));',
|
|
252
|
+
' }',
|
|
253
|
+
' } else if (uOcclusionHardMode) {',
|
|
254
|
+
' occlusion_value = OcclusionGetSample(depthUV, vec2(0.0));',
|
|
255
|
+
' } else {',
|
|
256
|
+
' vec2 texelSize = uOcclusionBlurRadius / uViewportSize;',
|
|
257
|
+
' // 13-tap two-ring sampling pattern for smooth occlusion edges',
|
|
258
|
+
' // Center sample',
|
|
259
|
+
' occlusion_value = OcclusionGetSample(depthUV, vec2(0.0));',
|
|
260
|
+
' // Inner ring: 6 samples at 40% radius, 60 degree intervals',
|
|
261
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.4, 0.0));',
|
|
262
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.2, 0.346));',
|
|
263
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2(-0.2, 0.346));',
|
|
264
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2(-0.4, 0.0));',
|
|
265
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2(-0.2, -0.346));',
|
|
266
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.2, -0.346));',
|
|
267
|
+
' // Outer ring: 6 samples at full radius, offset 30 degrees',
|
|
268
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.866, 0.5));',
|
|
269
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.0, 1.0));',
|
|
270
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2(-0.866, 0.5));',
|
|
271
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2(-0.866, -0.5));',
|
|
272
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.0, -1.0));',
|
|
273
|
+
' occlusion_value += OcclusionGetSample(depthUV, texelSize * vec2( 0.866, -0.5));',
|
|
274
|
+
' occlusion_value /= 13.0;',
|
|
275
|
+
' }',
|
|
276
|
+
' if (occlusion_value < 0.01) {',
|
|
277
|
+
' discard;',
|
|
278
|
+
' }',
|
|
279
|
+
' diffuseColor.a *= occlusion_value;',
|
|
280
|
+
'}',
|
|
281
|
+
].join('\n'));
|
|
282
|
+
}
|
|
283
|
+
cleanup() {
|
|
284
|
+
var _a;
|
|
285
|
+
this.depthFeatureEnabled = undefined;
|
|
286
|
+
this.cpuDepthData = [];
|
|
287
|
+
this.gpuDepthData = [];
|
|
288
|
+
(_a = this.preprocessingPass) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
289
|
+
this.preprocessingPass = undefined;
|
|
290
|
+
this.minMaxEntityCount = 0;
|
|
291
|
+
}
|
|
292
|
+
updateEnabledFeatures(xrSession) {
|
|
293
|
+
if (!xrSession) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
const enabledFeatures = xrSession.enabledFeatures;
|
|
297
|
+
this.depthFeatureEnabled = enabledFeatures === null || enabledFeatures === void 0 ? void 0 : enabledFeatures.includes('depth-sensing');
|
|
298
|
+
if (!this.depthFeatureEnabled) {
|
|
299
|
+
console.log('Warning: depth-sensing feature not enabled for WebXR session. Depth sensing features are disabled.');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
update() {
|
|
303
|
+
if (!this.depthFeatureEnabled) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const frame = this.xrFrame;
|
|
307
|
+
if (frame) {
|
|
308
|
+
this.updateLocalDepth(frame);
|
|
309
|
+
}
|
|
310
|
+
if (this.config.enableOcclusion.value) {
|
|
311
|
+
this.runMinMaxPreprocessing();
|
|
312
|
+
this.updateOcclusionUniforms();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Runs the MinMax depth preprocessing pass if any entity uses MinMaxSoftOcclusion.
|
|
317
|
+
* Renders a fullscreen pass per eye that computes min/max/avg depth in a 4×4
|
|
318
|
+
* neighborhood, outputting to per-view 2D render targets.
|
|
319
|
+
*/
|
|
320
|
+
runMinMaxPreprocessing() {
|
|
321
|
+
var _a, _b, _c, _d;
|
|
322
|
+
if (this.minMaxEntityCount === 0) {
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
const nativeTexture = (_a = this.depthTextures) === null || _a === void 0 ? void 0 : _a.getNativeTexture();
|
|
326
|
+
const dataArrayTexture = (_b = this.depthTextures) === null || _b === void 0 ? void 0 : _b.getDataArrayTexture();
|
|
327
|
+
const isGPUDepth = nativeTexture !== undefined;
|
|
328
|
+
const depthTextureArray = isGPUDepth
|
|
329
|
+
? nativeTexture
|
|
330
|
+
: dataArrayTexture;
|
|
331
|
+
if (!depthTextureArray) {
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const depthNear = (_d = (_c = this.gpuDepthData[0]) === null || _c === void 0 ? void 0 : _c.depthNear) !== null && _d !== void 0 ? _d : 0;
|
|
335
|
+
if (!this.preprocessingPass) {
|
|
336
|
+
this.preprocessingPass = new DepthPreprocessingPass();
|
|
337
|
+
}
|
|
338
|
+
this.preprocessingPass.setDepthTexture(depthTextureArray, this.rawValueToMeters, isGPUDepth, depthNear);
|
|
339
|
+
// Determine depth texture dimensions
|
|
340
|
+
let depthWidth;
|
|
341
|
+
let depthHeight;
|
|
342
|
+
if (this.cpuDepthData[0]) {
|
|
343
|
+
depthWidth = this.cpuDepthData[0].width;
|
|
344
|
+
depthHeight = this.cpuDepthData[0].height;
|
|
345
|
+
}
|
|
346
|
+
else if (this.gpuDepthData[0]) {
|
|
347
|
+
// GPU depth textures have their own resolution (typically ~256×192),
|
|
348
|
+
// which is much smaller than the drawing buffer.
|
|
349
|
+
depthWidth = this.gpuDepthData[0].width;
|
|
350
|
+
depthHeight = this.gpuDepthData[0].height;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
return; // No depth data available
|
|
354
|
+
}
|
|
355
|
+
// Render preprocessing for both eyes
|
|
356
|
+
this.preprocessingPass.render(this.renderer, depthWidth, depthHeight, 0);
|
|
357
|
+
this.preprocessingPass.render(this.renderer, depthWidth, depthHeight, 1);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Updates depth data from the XR frame.
|
|
361
|
+
*/
|
|
362
|
+
updateLocalDepth(frame) {
|
|
363
|
+
const session = frame.session;
|
|
364
|
+
const binding = this.renderer.xr.getBinding();
|
|
365
|
+
const xrRefSpace = this.renderer.xr.getReferenceSpace();
|
|
366
|
+
if (xrRefSpace) {
|
|
367
|
+
const pose = frame.getViewerPose(xrRefSpace);
|
|
368
|
+
if (pose) {
|
|
369
|
+
if (session.depthUsage === 'gpu-optimized') {
|
|
370
|
+
// GPU path: the native texture is a texture array containing all
|
|
371
|
+
// views. We only need to update the ExternalTexture once using the
|
|
372
|
+
// first view's depth data.
|
|
373
|
+
const view = pose.views[0];
|
|
374
|
+
const depthData = binding.getDepthInformation(view);
|
|
375
|
+
if (depthData) {
|
|
376
|
+
this.updateGPUDepthData(depthData);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
// CPU path: each view has its own DataTexture.
|
|
381
|
+
for (let viewId = 0; viewId < pose.views.length; ++viewId) {
|
|
382
|
+
const view = pose.views[viewId];
|
|
383
|
+
const depthData = frame.getDepthInformation(view);
|
|
384
|
+
if (!depthData) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
this.updateCPUDepthData(depthData, viewId);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Update with CPU-optimized depth data.
|
|
395
|
+
*/
|
|
396
|
+
updateCPUDepthData(depthData, viewId = 0) {
|
|
397
|
+
this.cpuDepthData[viewId] = depthData;
|
|
398
|
+
if (this.config.enableDepthTexture.value && this.depthTextures) {
|
|
399
|
+
this.depthTextures.updateData(depthData, viewId);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Update with GPU-optimized depth data.
|
|
404
|
+
*/
|
|
405
|
+
updateGPUDepthData(depthData) {
|
|
406
|
+
this.gpuDepthData[0] = depthData;
|
|
407
|
+
if (this.config.enableDepthTexture.value && this.depthTextures) {
|
|
408
|
+
this.depthTextures.updateNativeTexture(depthData, this.renderer);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Updates depth texture uniforms on all occludable materials each frame.
|
|
413
|
+
* Both GPU and CPU paths set the texture array uniform; the shader uses
|
|
414
|
+
* VIEW_ID to select the correct stereo layer.
|
|
415
|
+
*/
|
|
416
|
+
updateOcclusionUniforms() {
|
|
417
|
+
var _a, _b, _c, _d;
|
|
418
|
+
const nativeTexture = (_a = this.depthTextures) === null || _a === void 0 ? void 0 : _a.getNativeTexture();
|
|
419
|
+
const dataArrayTexture = (_b = this.depthTextures) === null || _b === void 0 ? void 0 : _b.getDataArrayTexture();
|
|
420
|
+
const isGPUDepth = nativeTexture !== undefined;
|
|
421
|
+
const depthNear = (_d = (_c = this.gpuDepthData[0]) === null || _c === void 0 ? void 0 : _c.depthNear) !== null && _d !== void 0 ? _d : 0;
|
|
422
|
+
// Select the texture array: ExternalTexture for GPU, DataArrayTexture for CPU
|
|
423
|
+
const depthTextureArray = isGPUDepth ? nativeTexture : dataArrayTexture;
|
|
424
|
+
if (!depthTextureArray) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
this.renderer.getDrawingBufferSize(this.viewportSize);
|
|
428
|
+
for (const [entity, entityUniforms] of this.entityShaderMap) {
|
|
429
|
+
const isHardMode = DepthOccludable.data.mode[entity.index] ===
|
|
430
|
+
OcclusionShadersMode.HardOcclusion;
|
|
431
|
+
const isMinMaxMode = DepthOccludable.data.mode[entity.index] ===
|
|
432
|
+
OcclusionShadersMode.MinMaxSoftOcclusion;
|
|
433
|
+
for (const uniforms of entityUniforms) {
|
|
434
|
+
uniforms.uXRDepthTextureArray.value = depthTextureArray;
|
|
435
|
+
uniforms.uRawValueToMeters.value = this.rawValueToMeters;
|
|
436
|
+
uniforms.uIsGPUDepth.value = isGPUDepth;
|
|
437
|
+
uniforms.uDepthNear.value = depthNear;
|
|
438
|
+
uniforms.uViewportSize.value.copy(this.viewportSize);
|
|
439
|
+
uniforms.uOcclusionBlurRadius.value = this.config.blurRadius.value;
|
|
440
|
+
uniforms.uOcclusionHardMode.value = isHardMode;
|
|
441
|
+
uniforms.uOcclusionMinMaxMode.value = isMinMaxMode;
|
|
442
|
+
uniforms.occlusionEnabled.value = this.config.enableOcclusion.value;
|
|
443
|
+
if (isMinMaxMode && this.preprocessingPass) {
|
|
444
|
+
uniforms.uMinMaxTexture0.value = this.preprocessingPass.getTexture(0);
|
|
445
|
+
uniforms.uMinMaxTexture1.value = this.preprocessingPass.getTexture(1);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
export { DepthSensingSystem };
|
|
453
|
+
//# sourceMappingURL=depth-sensing-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depth-sensing-system.js","sources":["../../src/depth/depth-sensing-system.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|