@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.
Files changed (228) hide show
  1. package/README.md +94 -0
  2. package/dist/asset/loaders/hdr-texture-loader.d.ts +1 -1
  3. package/dist/asset/loaders/hdr-texture-loader.d.ts.map +1 -1
  4. package/dist/asset/loaders/hdr-texture-loader.js +4 -4
  5. package/dist/asset/loaders/hdr-texture-loader.js.map +1 -1
  6. package/dist/audio/audio-system.d.ts +6 -2
  7. package/dist/audio/audio-system.d.ts.map +1 -1
  8. package/dist/audio/audio-system.js +1 -0
  9. package/dist/audio/audio-system.js.map +1 -1
  10. package/dist/audio/audio.d.ts +3 -1
  11. package/dist/audio/audio.d.ts.map +1 -1
  12. package/dist/audio/audio.js +8 -2
  13. package/dist/audio/audio.js.map +1 -1
  14. package/dist/camera/camera-source.js +1 -0
  15. package/dist/camera/camera-source.js.map +1 -1
  16. package/dist/camera/camera-system.d.ts.map +1 -1
  17. package/dist/camera/camera-system.js +1 -0
  18. package/dist/camera/camera-system.js.map +1 -1
  19. package/dist/camera/camera-utils.d.ts.map +1 -1
  20. package/dist/camera/camera-utils.js.map +1 -1
  21. package/dist/depth/depth-occludable.d.ts +48 -0
  22. package/dist/depth/depth-occludable.d.ts.map +1 -0
  23. package/dist/depth/depth-occludable.js +48 -0
  24. package/dist/depth/depth-occludable.js.map +1 -0
  25. package/dist/depth/depth-sensing-system.d.ts +164 -0
  26. package/dist/depth/depth-sensing-system.d.ts.map +1 -0
  27. package/dist/depth/depth-sensing-system.js +453 -0
  28. package/dist/depth/depth-sensing-system.js.map +1 -0
  29. package/dist/depth/depth-textures.d.ts +53 -0
  30. package/dist/depth/depth-textures.d.ts.map +1 -0
  31. package/dist/depth/depth-textures.js +114 -0
  32. package/dist/depth/depth-textures.js.map +1 -0
  33. package/dist/depth/index.d.ts +10 -0
  34. package/dist/depth/index.d.ts.map +1 -0
  35. package/dist/depth/occlusion/preprocessing-pass.d.ts +52 -0
  36. package/dist/depth/occlusion/preprocessing-pass.d.ts.map +1 -0
  37. package/dist/depth/occlusion/preprocessing-pass.js +105 -0
  38. package/dist/depth/occlusion/preprocessing-pass.js.map +1 -0
  39. package/dist/depth/occlusion/preprocessing-shader.glsl.d.ts +22 -0
  40. package/dist/depth/occlusion/preprocessing-shader.glsl.d.ts.map +1 -0
  41. package/dist/depth/occlusion/preprocessing-shader.glsl.js +115 -0
  42. package/dist/depth/occlusion/preprocessing-shader.glsl.js.map +1 -0
  43. package/dist/ecs/entity.d.ts +17 -1
  44. package/dist/ecs/entity.d.ts.map +1 -1
  45. package/dist/ecs/entity.js +7 -1
  46. package/dist/ecs/entity.js.map +1 -1
  47. package/dist/ecs/world.d.ts +12 -0
  48. package/dist/ecs/world.d.ts.map +1 -1
  49. package/dist/ecs/world.js +47 -3
  50. package/dist/ecs/world.js.map +1 -1
  51. package/dist/environment/dome-gradient.js +1 -0
  52. package/dist/environment/dome-gradient.js.map +1 -1
  53. package/dist/environment/dome-texture.d.ts +3 -1
  54. package/dist/environment/dome-texture.d.ts.map +1 -1
  55. package/dist/environment/dome-texture.js +7 -1
  56. package/dist/environment/dome-texture.js.map +1 -1
  57. package/dist/environment/environment-system.d.ts +8 -0
  58. package/dist/environment/environment-system.d.ts.map +1 -1
  59. package/dist/environment/environment-system.js +78 -2
  60. package/dist/environment/environment-system.js.map +1 -1
  61. package/dist/environment/ibl-gradient.js +1 -0
  62. package/dist/environment/ibl-gradient.js.map +1 -1
  63. package/dist/environment/ibl-texture.d.ts +3 -1
  64. package/dist/environment/ibl-texture.d.ts.map +1 -1
  65. package/dist/environment/ibl-texture.js +7 -1
  66. package/dist/environment/ibl-texture.js.map +1 -1
  67. package/dist/environment-raycast/environment-raycast.d.ts +136 -0
  68. package/dist/environment-raycast/environment-raycast.d.ts.map +1 -0
  69. package/dist/environment-raycast/environment-raycast.js +333 -0
  70. package/dist/environment-raycast/environment-raycast.js.map +1 -0
  71. package/dist/environment-raycast/index.d.ts +9 -0
  72. package/dist/environment-raycast/index.d.ts.map +1 -0
  73. package/dist/environment-raycast/raycast-target.d.ts +114 -0
  74. package/dist/environment-raycast/raycast-target.d.ts.map +1 -0
  75. package/dist/environment-raycast/raycast-target.js +84 -0
  76. package/dist/environment-raycast/raycast-target.js.map +1 -0
  77. package/dist/grab/distance-grabbable.d.ts +27 -2
  78. package/dist/grab/distance-grabbable.d.ts.map +1 -1
  79. package/dist/grab/distance-grabbable.js +25 -2
  80. package/dist/grab/distance-grabbable.js.map +1 -1
  81. package/dist/grab/grab-system.d.ts +106 -61
  82. package/dist/grab/grab-system.d.ts.map +1 -1
  83. package/dist/grab/grab-system.js +61 -10
  84. package/dist/grab/grab-system.js.map +1 -1
  85. package/dist/grab/handles.d.ts +14 -4
  86. package/dist/grab/handles.d.ts.map +1 -1
  87. package/dist/grab/handles.js +45 -18
  88. package/dist/grab/handles.js.map +1 -1
  89. package/dist/grab/index.d.ts +0 -1
  90. package/dist/grab/index.d.ts.map +1 -1
  91. package/dist/grab/index.js +0 -2
  92. package/dist/grab/index.js.map +1 -1
  93. package/dist/grab/one-hand-grabbable.js +1 -0
  94. package/dist/grab/one-hand-grabbable.js.map +1 -1
  95. package/dist/grab/two-hands-grabbable.js +1 -0
  96. package/dist/grab/two-hands-grabbable.js.map +1 -1
  97. package/dist/index.d.ts +3 -0
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +9 -1
  100. package/dist/index.js.map +1 -1
  101. package/dist/init/world-initializer.d.ts +17 -3
  102. package/dist/init/world-initializer.d.ts.map +1 -1
  103. package/dist/init/world-initializer.js +86 -19
  104. package/dist/init/world-initializer.js.map +1 -1
  105. package/dist/init/xr.d.ts +1 -0
  106. package/dist/init/xr.d.ts.map +1 -1
  107. package/dist/init/xr.js +6 -0
  108. package/dist/init/xr.js.map +1 -1
  109. package/dist/input/input-system.d.ts +408 -5
  110. package/dist/input/input-system.d.ts.map +1 -1
  111. package/dist/input/input-system.js +146 -23
  112. package/dist/input/input-system.js.map +1 -1
  113. package/dist/input/state-tags.d.ts +32 -15
  114. package/dist/input/state-tags.d.ts.map +1 -1
  115. package/dist/input/state-tags.js +34 -16
  116. package/dist/input/state-tags.js.map +1 -1
  117. package/dist/level/level-entity-creator.js +1 -0
  118. package/dist/level/level-entity-creator.js.map +1 -1
  119. package/dist/level/level-root.js +1 -0
  120. package/dist/level/level-root.js.map +1 -1
  121. package/dist/level/level-system.js +1 -0
  122. package/dist/level/level-system.js.map +1 -1
  123. package/dist/level/level-tag.js +1 -0
  124. package/dist/level/level-tag.js.map +1 -1
  125. package/dist/locomotion/locomotion.d.ts +10 -0
  126. package/dist/locomotion/locomotion.d.ts.map +1 -1
  127. package/dist/locomotion/locomotion.js +17 -1
  128. package/dist/locomotion/locomotion.js.map +1 -1
  129. package/dist/locomotion/slide.d.ts +10 -0
  130. package/dist/locomotion/slide.d.ts.map +1 -1
  131. package/dist/locomotion/slide.js +6 -2
  132. package/dist/locomotion/slide.js.map +1 -1
  133. package/dist/locomotion/teleport.js +1 -0
  134. package/dist/locomotion/teleport.js.map +1 -1
  135. package/dist/mcp/ecs-debug-tools.d.ts +167 -0
  136. package/dist/mcp/ecs-debug-tools.d.ts.map +1 -0
  137. package/dist/mcp/ecs-debug-tools.js +602 -0
  138. package/dist/mcp/ecs-debug-tools.js.map +1 -0
  139. package/dist/mcp/index.d.ts +10 -0
  140. package/dist/mcp/index.d.ts.map +1 -0
  141. package/dist/mcp/mcp-runtime.d.ts +31 -0
  142. package/dist/mcp/mcp-runtime.d.ts.map +1 -0
  143. package/dist/mcp/mcp-runtime.js +85 -0
  144. package/dist/mcp/mcp-runtime.js.map +1 -0
  145. package/dist/mcp/scene-tools.d.ts +41 -0
  146. package/dist/mcp/scene-tools.d.ts.map +1 -0
  147. package/dist/mcp/scene-tools.js +95 -0
  148. package/dist/mcp/scene-tools.js.map +1 -0
  149. package/dist/physics/physics-system.d.ts +1 -1
  150. package/dist/physics/physics-system.d.ts.map +1 -1
  151. package/dist/physics/physics-system.js +9 -4
  152. package/dist/physics/physics-system.js.map +1 -1
  153. package/dist/physics/utils.d.ts.map +1 -1
  154. package/dist/physics/utils.js +1 -1
  155. package/dist/scene-understanding/anchor.js +1 -0
  156. package/dist/scene-understanding/anchor.js.map +1 -1
  157. package/dist/scene-understanding/mesh.js +1 -0
  158. package/dist/scene-understanding/mesh.js.map +1 -1
  159. package/dist/scene-understanding/plane.js +1 -0
  160. package/dist/scene-understanding/plane.js.map +1 -1
  161. package/dist/scene-understanding/scene-understanding-system.d.ts +29 -0
  162. package/dist/scene-understanding/scene-understanding-system.d.ts.map +1 -1
  163. package/dist/scene-understanding/scene-understanding-system.js +118 -18
  164. package/dist/scene-understanding/scene-understanding-system.js.map +1 -1
  165. package/dist/transform/index.d.ts +2 -0
  166. package/dist/transform/index.d.ts.map +1 -1
  167. package/dist/transform/synced-euler.d.ts +62 -0
  168. package/dist/transform/synced-euler.d.ts.map +1 -0
  169. package/dist/transform/synced-euler.js +212 -0
  170. package/dist/transform/synced-euler.js.map +1 -0
  171. package/dist/transform/synced-quaternion.d.ts +11 -0
  172. package/dist/transform/synced-quaternion.d.ts.map +1 -1
  173. package/dist/transform/synced-quaternion.js +29 -0
  174. package/dist/transform/synced-quaternion.js.map +1 -1
  175. package/dist/transform/transform-utils.d.ts +24 -0
  176. package/dist/transform/transform-utils.d.ts.map +1 -0
  177. package/dist/transform/transform-utils.js +53 -0
  178. package/dist/transform/transform-utils.js.map +1 -0
  179. package/dist/transform/transform.d.ts.map +1 -1
  180. package/dist/transform/transform.js +19 -2
  181. package/dist/transform/transform.js.map +1 -1
  182. package/dist/ui/follow.js +1 -0
  183. package/dist/ui/follow.js.map +1 -1
  184. package/dist/ui/index.d.ts +1 -1
  185. package/dist/ui/index.d.ts.map +1 -1
  186. package/dist/ui/screenspace.js +1 -0
  187. package/dist/ui/screenspace.js.map +1 -1
  188. package/dist/ui/ui.d.ts.map +1 -1
  189. package/dist/ui/ui.js +2 -8
  190. package/dist/ui/ui.js.map +1 -1
  191. package/dist/version.d.ts +1 -1
  192. package/dist/version.js +1 -1
  193. package/dist/visibility/visibility.d.ts.map +1 -1
  194. package/dist/visibility/visibility.js +4 -1
  195. package/dist/visibility/visibility.js.map +1 -1
  196. package/package.json +16 -9
  197. 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
  198. 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
  199. 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
  200. 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
  201. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.js +0 -66
  202. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.js.map +0 -1
  203. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.js +0 -162
  204. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.js.map +0 -1
  205. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/html.js +0 -519
  206. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/html.js.map +0 -1
  207. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/token.js +0 -15
  208. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/token.js.map +0 -1
  209. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/unicode.js +0 -32
  210. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/common/unicode.js.map +0 -1
  211. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.js +0 -10
  212. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.js.map +0 -1
  213. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/index.js +0 -41
  214. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/index.js.map +0 -1
  215. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.js +0 -35
  216. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.js.map +0 -1
  217. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/serializer/index.js +0 -24
  218. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/serializer/index.js.map +0 -1
  219. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.js +0 -92
  220. package/dist/node_modules/.pnpm/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.js.map +0 -1
  221. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/libs/fflate.module.js +0 -382
  222. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/libs/fflate.module.js.map +0 -1
  223. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/EXRLoader.js +0 -2587
  224. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/EXRLoader.js.map +0 -1
  225. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/RGBELoader.js +0 -477
  226. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/examples/jsm/loaders/RGBELoader.js.map +0 -1
  227. package/dist/node_modules/.pnpm/super-three@0.177.0/node_modules/super-three/src/math/MathUtils.js +0 -17
  228. 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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"}