mudra-skills 1.0.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 (149) hide show
  1. package/.claude-plugin/plugin.json +19 -0
  2. package/CLAUDE.md +35 -0
  3. package/bin/install.js +25 -0
  4. package/package.json +28 -0
  5. package/skills/mudra-master/SKILL.md +202 -0
  6. package/skills/mudra-master/mudra-preview/SKILL.md +151 -0
  7. package/skills/mudra-master/mudra-preview/assets/ar-menu.html +382 -0
  8. package/skills/mudra-master/mudra-preview/assets/document-scroller.html +468 -0
  9. package/skills/mudra-master/mudra-preview/assets/drum-machine.html +788 -0
  10. package/skills/mudra-master/mudra-preview/assets/emg-visualizer.html +390 -0
  11. package/skills/mudra-master/mudra-preview/assets/generative-art.html +408 -0
  12. package/skills/mudra-master/mudra-preview/assets/gesture-assistant.html +342 -0
  13. package/skills/mudra-master/mudra-preview/assets/gesture-speech.html +444 -0
  14. package/skills/mudra-master/mudra-preview/assets/hands-free-desktop.html +376 -0
  15. package/skills/mudra-master/mudra-preview/assets/model-rotator.html +365 -0
  16. package/skills/mudra-master/mudra-preview/assets/mudra-duel.html +3200 -0
  17. package/skills/mudra-master/mudra-preview/assets/mudra-monitor.html +1451 -0
  18. package/skills/mudra-master/mudra-preview/assets/mudra-ultimate-template.html +891 -0
  19. package/skills/mudra-master/mudra-preview/assets/music-sequencer.html +455 -0
  20. package/skills/mudra-master/mudra-preview/assets/neural-pong.html +380 -0
  21. package/skills/mudra-master/mudra-preview/assets/neural-snake.html +364 -0
  22. package/skills/mudra-master/mudra-preview/assets/presentation-controller.html +345 -0
  23. package/skills/mudra-master/mudra-preview/assets/pressure-painter.html +285 -0
  24. package/skills/mudra-master/mudra-preview/assets/runner.html +1812 -0
  25. package/skills/mudra-master/mudra-preview/assets/smart-home.html +461 -0
  26. package/skills/mudra-master/mudra-preview/assets/space-invaders.html +1154 -0
  27. package/skills/mudra-master/mudra-preview/assets/waterful-ring-toss.html +1624 -0
  28. package/skills/mudra-master/mudra-preview/references/agent_protocol.json +646 -0
  29. package/skills/mudra-master/mudra-preview/references/promt.md +16829 -0
  30. package/skills/mudra-master/mudra-xr/SKILL.md +245 -0
  31. package/skills/mudra-master/mudra-xr/assets/demos/3dgs-walkthrough.html +242 -0
  32. package/skills/mudra-master/mudra-xr/assets/demos/aisimulator.html +792 -0
  33. package/skills/mudra-master/mudra-xr/assets/demos/balloonpop.html +422 -0
  34. package/skills/mudra-master/mudra-xr/assets/demos/ballpit.html +284 -0
  35. package/skills/mudra-master/mudra-xr/assets/demos/drone.html +41 -0
  36. package/skills/mudra-master/mudra-xr/assets/demos/gemini-icebreakers.html +338 -0
  37. package/skills/mudra-master/mudra-xr/assets/demos/gemini-xrobject.html +302 -0
  38. package/skills/mudra-master/mudra-xr/assets/demos/math3d.html +188 -0
  39. package/skills/mudra-master/mudra-xr/assets/demos/measure.html +247 -0
  40. package/skills/mudra-master/mudra-xr/assets/demos/occlusion.html +251 -0
  41. package/skills/mudra-master/mudra-xr/assets/demos/rain.html +498 -0
  42. package/skills/mudra-master/mudra-xr/assets/demos/screenwiper.html +432 -0
  43. package/skills/mudra-master/mudra-xr/assets/demos/splash.html +519 -0
  44. package/skills/mudra-master/mudra-xr/assets/demos/webcam_gestures.html +253 -0
  45. package/skills/mudra-master/mudra-xr/assets/demos/xremoji.html +833 -0
  46. package/skills/mudra-master/mudra-xr/assets/demos/xrpoet.html +151 -0
  47. package/skills/mudra-master/mudra-xr/assets/samples/depthmap.html +266 -0
  48. package/skills/mudra-master/mudra-xr/assets/samples/depthmesh.html +100 -0
  49. package/skills/mudra-master/mudra-xr/assets/samples/game_rps.html +1099 -0
  50. package/skills/mudra-master/mudra-xr/assets/samples/gestures_custom.html +467 -0
  51. package/skills/mudra-master/mudra-xr/assets/samples/gestures_heuristic.html +256 -0
  52. package/skills/mudra-master/mudra-xr/assets/samples/lighting.html +163 -0
  53. package/skills/mudra-master/mudra-xr/assets/samples/mesh_detection.html +46 -0
  54. package/skills/mudra-master/mudra-xr/assets/samples/modelviewer.html +183 -0
  55. package/skills/mudra-master/mudra-xr/assets/samples/paint.html +133 -0
  56. package/skills/mudra-master/mudra-xr/assets/samples/planar-vst.html +45 -0
  57. package/skills/mudra-master/mudra-xr/assets/samples/reticle.html +95 -0
  58. package/skills/mudra-master/mudra-xr/assets/samples/skybox_agent.html +384 -0
  59. package/skills/mudra-master/mudra-xr/assets/samples/sound.html +390 -0
  60. package/skills/mudra-master/mudra-xr/assets/samples/ui.html +496 -0
  61. package/skills/mudra-master/mudra-xr/assets/samples/virtual-screens.html +808 -0
  62. package/skills/mudra-master/mudra-xr/assets/templates/0_basic.html +64 -0
  63. package/skills/mudra-master/mudra-xr/assets/templates/1_ui.html +107 -0
  64. package/skills/mudra-master/mudra-xr/assets/templates/2_hands.html +183 -0
  65. package/skills/mudra-master/mudra-xr/assets/templates/3_depth.html +89 -0
  66. package/skills/mudra-master/mudra-xr/assets/templates/4_stereo.html +84 -0
  67. package/skills/mudra-master/mudra-xr/assets/templates/5_camera.html +117 -0
  68. package/skills/mudra-master/mudra-xr/assets/templates/6_ai.html +154 -0
  69. package/skills/mudra-master/mudra-xr/assets/templates/7_ai_live.html +253 -0
  70. package/skills/mudra-master/mudra-xr/assets/templates/8_objects.html +95 -0
  71. package/skills/mudra-master/mudra-xr/assets/templates/9_xr-toggle.html +90 -0
  72. package/skills/mudra-master/mudra-xr/assets/templates/heuristic_hand_gestures.html +102 -0
  73. package/skills/mudra-master/mudra-xr/assets/templates/meshes.html +47 -0
  74. package/skills/mudra-master/mudra-xr/assets/templates/planes.html +47 -0
  75. package/skills/mudra-master/mudra-xr/assets/templates/uikit.html +187 -0
  76. package/skills/mudra-master/mudra-xr/references/agent_protocol.json +878 -0
  77. package/skills/mudra-master/mudra-xr/references/promt.md +1516 -0
  78. package/skills/mudra-preview/SKILL.md +151 -0
  79. package/skills/mudra-preview/assets/ar-menu.html +382 -0
  80. package/skills/mudra-preview/assets/document-scroller.html +468 -0
  81. package/skills/mudra-preview/assets/drum-machine.html +788 -0
  82. package/skills/mudra-preview/assets/emg-visualizer.html +390 -0
  83. package/skills/mudra-preview/assets/generative-art.html +408 -0
  84. package/skills/mudra-preview/assets/gesture-assistant.html +342 -0
  85. package/skills/mudra-preview/assets/gesture-speech.html +444 -0
  86. package/skills/mudra-preview/assets/hands-free-desktop.html +376 -0
  87. package/skills/mudra-preview/assets/model-rotator.html +365 -0
  88. package/skills/mudra-preview/assets/mudra-duel.html +3200 -0
  89. package/skills/mudra-preview/assets/mudra-monitor.html +1451 -0
  90. package/skills/mudra-preview/assets/mudra-ultimate-template.html +891 -0
  91. package/skills/mudra-preview/assets/music-sequencer.html +455 -0
  92. package/skills/mudra-preview/assets/neural-pong.html +380 -0
  93. package/skills/mudra-preview/assets/neural-snake.html +364 -0
  94. package/skills/mudra-preview/assets/presentation-controller.html +345 -0
  95. package/skills/mudra-preview/assets/pressure-painter.html +285 -0
  96. package/skills/mudra-preview/assets/runner.html +1812 -0
  97. package/skills/mudra-preview/assets/smart-home.html +461 -0
  98. package/skills/mudra-preview/assets/space-invaders.html +1154 -0
  99. package/skills/mudra-preview/assets/waterful-ring-toss.html +1624 -0
  100. package/skills/mudra-preview/references/agent_protocol.json +646 -0
  101. package/skills/mudra-preview/references/promt.md +16829 -0
  102. package/skills/mudra-xr/SKILL.md +245 -0
  103. package/skills/mudra-xr/assets/demos/3dgs-walkthrough.html +242 -0
  104. package/skills/mudra-xr/assets/demos/aisimulator.html +792 -0
  105. package/skills/mudra-xr/assets/demos/balloonpop.html +422 -0
  106. package/skills/mudra-xr/assets/demos/ballpit.html +284 -0
  107. package/skills/mudra-xr/assets/demos/drone.html +41 -0
  108. package/skills/mudra-xr/assets/demos/gemini-icebreakers.html +338 -0
  109. package/skills/mudra-xr/assets/demos/gemini-xrobject.html +302 -0
  110. package/skills/mudra-xr/assets/demos/math3d.html +188 -0
  111. package/skills/mudra-xr/assets/demos/measure.html +247 -0
  112. package/skills/mudra-xr/assets/demos/occlusion.html +251 -0
  113. package/skills/mudra-xr/assets/demos/rain.html +498 -0
  114. package/skills/mudra-xr/assets/demos/screenwiper.html +432 -0
  115. package/skills/mudra-xr/assets/demos/splash.html +519 -0
  116. package/skills/mudra-xr/assets/demos/webcam_gestures.html +253 -0
  117. package/skills/mudra-xr/assets/demos/xremoji.html +833 -0
  118. package/skills/mudra-xr/assets/demos/xrpoet.html +151 -0
  119. package/skills/mudra-xr/assets/samples/depthmap.html +266 -0
  120. package/skills/mudra-xr/assets/samples/depthmesh.html +100 -0
  121. package/skills/mudra-xr/assets/samples/game_rps.html +1099 -0
  122. package/skills/mudra-xr/assets/samples/gestures_custom.html +467 -0
  123. package/skills/mudra-xr/assets/samples/gestures_heuristic.html +256 -0
  124. package/skills/mudra-xr/assets/samples/lighting.html +163 -0
  125. package/skills/mudra-xr/assets/samples/mesh_detection.html +46 -0
  126. package/skills/mudra-xr/assets/samples/modelviewer.html +183 -0
  127. package/skills/mudra-xr/assets/samples/paint.html +133 -0
  128. package/skills/mudra-xr/assets/samples/planar-vst.html +45 -0
  129. package/skills/mudra-xr/assets/samples/reticle.html +95 -0
  130. package/skills/mudra-xr/assets/samples/skybox_agent.html +384 -0
  131. package/skills/mudra-xr/assets/samples/sound.html +390 -0
  132. package/skills/mudra-xr/assets/samples/ui.html +496 -0
  133. package/skills/mudra-xr/assets/samples/virtual-screens.html +808 -0
  134. package/skills/mudra-xr/assets/templates/0_basic.html +64 -0
  135. package/skills/mudra-xr/assets/templates/1_ui.html +107 -0
  136. package/skills/mudra-xr/assets/templates/2_hands.html +183 -0
  137. package/skills/mudra-xr/assets/templates/3_depth.html +89 -0
  138. package/skills/mudra-xr/assets/templates/4_stereo.html +84 -0
  139. package/skills/mudra-xr/assets/templates/5_camera.html +117 -0
  140. package/skills/mudra-xr/assets/templates/6_ai.html +154 -0
  141. package/skills/mudra-xr/assets/templates/7_ai_live.html +253 -0
  142. package/skills/mudra-xr/assets/templates/8_objects.html +95 -0
  143. package/skills/mudra-xr/assets/templates/9_xr-toggle.html +90 -0
  144. package/skills/mudra-xr/assets/templates/heuristic_hand_gestures.html +102 -0
  145. package/skills/mudra-xr/assets/templates/meshes.html +47 -0
  146. package/skills/mudra-xr/assets/templates/planes.html +47 -0
  147. package/skills/mudra-xr/assets/templates/uikit.html +187 -0
  148. package/skills/mudra-xr/references/agent_protocol.json +878 -0
  149. package/skills/mudra-xr/references/promt.md +1516 -0
@@ -0,0 +1,151 @@
1
+ <!doctype html>
2
+ <!-- reference: demos/xrpoet -->
3
+ <html lang="en">
4
+ <head>
5
+
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+
8
+ <title>Gemini Poem Generator</title>
9
+ <link type="text/css" rel="stylesheet" href="https://xrblocks.github.io/css/xr.css" />
10
+ <script>
11
+ window.litDisableBundleWarning = true;
12
+ </script>
13
+ <script type="importmap">
14
+ {
15
+ "imports": {
16
+ "three": "https://cdn.jsdelivr.net/npm/three@0.182.0/build/three.module.js",
17
+ "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.182.0/examples/jsm/",
18
+ "troika-three-text": "https://cdn.jsdelivr.net/gh/protectwise/troika@028b81cf308f0f22e5aa8e78196be56ec1997af5/packages/troika-three-text/src/index.js",
19
+ "troika-three-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-three-utils/src/index.js",
20
+ "troika-worker-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-worker-utils/src/index.js",
21
+ "bidi-js": "https://esm.sh/bidi-js@%5E1.0.2?target=es2022",
22
+ "webgl-sdf-generator": "https://esm.sh/webgl-sdf-generator@1.1.1/es2022/webgl-sdf-generator.mjs",
23
+ "lit": "https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js",
24
+ "lit/": "https://esm.run/lit@3/",
25
+ "xrblocks": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/xrblocks.js",
26
+ "xrblocks/addons/": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/addons/",
27
+ "@google/genai": "https://cdn.jsdelivr.net/npm/@google/genai/+esm"
28
+ }
29
+ }
30
+ </script>
31
+ </head>
32
+
33
+ <body>
34
+ <script type="module">
35
+ import 'xrblocks/addons/simulator/SimulatorAddons.js';
36
+
37
+ import * as xb from 'xrblocks';
38
+
39
+ // --- PoemGenerator inlined ---
40
+ class PoemGenerator extends xb.Script {
41
+ constructor() {
42
+ super();
43
+ this.panel = null;
44
+ this.isProcessing = false;
45
+ this.responseDisplay = null;
46
+ }
47
+
48
+ init() {
49
+ this.ai = xb.core.ai;
50
+ this.deviceCamera = xb.core.deviceCamera;
51
+
52
+ this.createPanel();
53
+ }
54
+
55
+ createPanel() {
56
+ this.panel = new xb.SpatialPanel({
57
+ width: 2.0,
58
+ height: 1.25,
59
+ backgroundColor: '#1a1a1abb',
60
+ });
61
+ this.panel.position.set(0, 1.6, -2);
62
+ this.add(this.panel);
63
+
64
+ const grid = this.panel.addGrid();
65
+
66
+ const responseRow = grid.addRow({weight: 0.9});
67
+ this.responseDisplay = new xb.ScrollingTroikaTextView({
68
+ text: '',
69
+ fontSize: 0.03,
70
+ });
71
+ responseRow.add(this.responseDisplay);
72
+
73
+ const buttonRow = grid.addRow({weight: 0.2});
74
+
75
+ const videoRow = grid.addRow({weight: 0.7});
76
+ this.videoView = new xb.VideoView({
77
+ width: 1.0,
78
+ height: 1.0,
79
+ mode: 'stretch',
80
+ });
81
+ videoRow.add(this.videoView);
82
+
83
+ const buttonPanel = buttonRow.addPanel({
84
+ backgroundColor: '#00000000',
85
+ showEdge: false,
86
+ });
87
+ buttonPanel.addGrid().addIconButton({
88
+ text: 'photo_camera',
89
+ fontSize: 0.6,
90
+ backgroundColor: '#FFFFFF',
91
+ defaultOpacity: 0.2,
92
+ hoverOpacity: 0.8,
93
+ selectedOpacity: 1.0,
94
+ }).onTriggered = () => this.captureAndGeneratePoem();
95
+
96
+ if (this.deviceCamera) {
97
+ this.videoView.load(this.deviceCamera);
98
+ }
99
+ }
100
+
101
+ async captureAndGeneratePoem() {
102
+ if (this.isProcessing || !this.ai?.isAvailable()) return;
103
+ this.isProcessing = true;
104
+
105
+ const snapshot = this.deviceCamera.getSnapshot({outputFormat: 'base64'});
106
+ if (!snapshot) {
107
+ throw new Error('Failed to capture video snapshot.');
108
+ }
109
+ const {strippedBase64, mimeType} = xb.parseBase64DataURL(snapshot);
110
+ const image = {inlineData: {mimeType: mimeType, data: strippedBase64}};
111
+ const question =
112
+ 'Can you write a 12 lined, lighthearted poem about what you see?';
113
+ const parts = [image, {text: question}];
114
+
115
+ try {
116
+ const response = await this.ai.query({
117
+ type: 'multiPart',
118
+ parts: parts,
119
+ });
120
+ this.responseDisplay.addText(`${response.text}\n\n`);
121
+ } catch (error) {
122
+ this.responseDisplay.addText(`Error: ${error.message}\n\n`);
123
+ }
124
+
125
+ this.isProcessing = false;
126
+ }
127
+ }
128
+
129
+ const options = new xb.Options();
130
+ options.simulator.instructions.enabled = false;
131
+ options.enableUI();
132
+ options.enableAI();
133
+ options.enableCamera();
134
+ options.setAppTitle('XR Poet');
135
+
136
+ function start() {
137
+ try {
138
+ xb.init(options);
139
+ xb.add(new PoemGenerator());
140
+ } catch (error) {
141
+ console.error('Failed to initialize XR app:', error);
142
+ }
143
+ }
144
+
145
+ document.addEventListener('DOMContentLoaded', function () {
146
+ start();
147
+ });
148
+
149
+ </script>
150
+ </body>
151
+ </html>
@@ -0,0 +1,266 @@
1
+ <!doctype html>
2
+ <!-- reference: samples/depthmap -->
3
+ <html lang="en">
4
+ <head>
5
+ <title>Depth Map | XR Blocks</title>
6
+
7
+ <meta
8
+ name="viewport"
9
+ content="width=device-width, initial-scale=1.0, user-scalable=no"
10
+ />
11
+
12
+ <link type="text/css" rel="stylesheet" href="https://xrblocks.github.io/css/xr.css" />
13
+ <script>
14
+ window.litDisableBundleWarning = true;
15
+ </script>
16
+ <script type="importmap">
17
+ {
18
+ "imports": {
19
+ "three": "https://cdn.jsdelivr.net/npm/three@0.182.0/build/three.module.js",
20
+ "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.182.0/examples/jsm/",
21
+ "troika-three-text": "https://cdn.jsdelivr.net/gh/protectwise/troika@028b81cf308f0f22e5aa8e78196be56ec1997af5/packages/troika-three-text/src/index.js",
22
+ "troika-three-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-three-utils/src/index.js",
23
+ "troika-worker-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-worker-utils/src/index.js",
24
+ "bidi-js": "https://esm.sh/bidi-js@%5E1.0.2?target=es2022",
25
+ "webgl-sdf-generator": "https://esm.sh/webgl-sdf-generator@1.1.1/es2022/webgl-sdf-generator.mjs",
26
+ "lit": "https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js",
27
+ "lit/": "https://esm.run/lit@3/",
28
+ "xrblocks": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/xrblocks.js",
29
+ "xrblocks/addons/": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/addons/"
30
+ }
31
+ }
32
+ </script>
33
+ </head>
34
+
35
+ <body>
36
+ <script type="module">
37
+ import 'xrblocks/addons/simulator/instructions/SimulatorInstructions.js';
38
+
39
+ import * as THREE from 'three';
40
+ import {FullScreenQuad} from 'three/addons/postprocessing/Pass.js';
41
+ import * as xb from 'xrblocks';
42
+
43
+ // --- Inlined: depthmap.glsl.js ---
44
+ const DepthMapShader = {
45
+ name: 'DepthMapShader',
46
+ defines: {},
47
+
48
+ vertexShader: /* glsl */ `
49
+ varying vec2 vTexCoord;
50
+
51
+ void main() {
52
+ vTexCoord = uv;
53
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
54
+ }
55
+ `,
56
+
57
+ fragmentShader: /* glsl */ `
58
+ #include <packing>
59
+
60
+ precision mediump float;
61
+
62
+ uniform sampler2D uDepthTexture;
63
+ uniform sampler2DArray uDepthTextureArray;
64
+ uniform float uRawValueToMeters;
65
+ uniform float uAlpha;
66
+ uniform float uIsTextureArray;
67
+ uniform int uView;
68
+ uniform float uDepthNear;
69
+
70
+ uniform sampler2D tDiffuse;
71
+ uniform float cameraNear;
72
+ uniform float cameraFar;
73
+
74
+ varying vec2 vTexCoord;
75
+
76
+ float DepthGetMeters(in sampler2D depth_texture, in vec2 depth_uv) {
77
+ // Assume we're using floating point depth.
78
+ return uRawValueToMeters * texture2D(depth_texture, depth_uv).r;
79
+ }
80
+
81
+ float DepthArrayGetMeters(in sampler2DArray depth_texture, in vec2 depth_uv) {
82
+ float textureValue = texture(depth_texture, vec3(depth_uv.x, depth_uv.y, uView)).r;
83
+ return uRawValueToMeters * uDepthNear / (1.0 - textureValue);
84
+ }
85
+
86
+ vec3 TurboColormap(in float x) {
87
+ const vec4 kRedVec4 = vec4(0.55305649, 3.00913185, -5.46192616, -11.11819092);
88
+ const vec4 kGreenVec4 = vec4(0.16207513, 0.17712472, 15.24091500, -36.50657960);
89
+ const vec4 kBlueVec4 = vec4(-0.05195877, 5.18000081, -30.94853351, 81.96403246);
90
+ const vec2 kRedVec2 = vec2(27.81927491, -14.87899417);
91
+ const vec2 kGreenVec2 = vec2(25.95549545, -5.02738237);
92
+ const vec2 kBlueVec2 = vec2(-86.53476570, 30.23299484);
93
+
94
+ // Adjusts color space via 6 degree poly interpolation to avoid pure red.
95
+ x = clamp(x * 0.9 + 0.03, 0.0, 1.0);
96
+ vec4 v4 = vec4( 1.0, x, x * x, x * x * x);
97
+ vec2 v2 = v4.zw * v4.z;
98
+ return vec3(
99
+ dot(v4, kRedVec4) + dot(v2, kRedVec2),
100
+ dot(v4, kGreenVec4) + dot(v2, kGreenVec2),
101
+ dot(v4, kBlueVec4) + dot(v2, kBlueVec2)
102
+ );
103
+ }
104
+
105
+ void main(void) {
106
+ vec4 texCoord = vec4(vTexCoord, 0, 1);
107
+ vec2 uv = texCoord.xy;
108
+
109
+ vec4 diffuse = texture2D( tDiffuse, texCoord.xy );
110
+ highp float real_depth;
111
+ if (uIsTextureArray < 0.5) {
112
+ uv.y = 1.0 - uv.y;
113
+ real_depth = DepthGetMeters(uDepthTexture, uv);
114
+ } else
115
+ real_depth = DepthArrayGetMeters(uDepthTextureArray, uv);
116
+ vec4 depth_visualization = vec4(
117
+ TurboColormap(clamp(real_depth / 8.0, 0.0, 1.0)), 1.0);
118
+ gl_FragColor = mix(diffuse, depth_visualization, uAlpha);
119
+ }
120
+ `,
121
+ };
122
+
123
+ // --- Inlined: DepthVisualizationPass.js ---
124
+ class DepthVisualizationPass extends xb.XRPass {
125
+ constructor() {
126
+ super();
127
+ this.depthTextures = [null, null];
128
+ this.uniforms = {
129
+ uDepthTexture: {value: null},
130
+ uDepthTextureArray: {value: null},
131
+ uRawValueToMeters: {value: 8.0 / 65536.0},
132
+ uAlpha: {value: 1.0},
133
+ tDiffuse: {value: null},
134
+ uView: {value: 0},
135
+ uIsTextureArray: {value: 0},
136
+ // Used to interpret Quest 3 depth.
137
+ uDepthNear: {value: 0},
138
+ };
139
+ this.depthMapQuad = new FullScreenQuad(
140
+ new THREE.ShaderMaterial({
141
+ name: 'DepthMapShader',
142
+ uniforms: this.uniforms,
143
+ vertexShader: DepthMapShader.vertexShader,
144
+ fragmentShader: DepthMapShader.fragmentShader,
145
+ })
146
+ );
147
+ }
148
+
149
+ setAlpha(value) {
150
+ this.uniforms.uAlpha.value = value;
151
+ }
152
+
153
+ updateEnvironmentalDepthTexture(xrDepth) {
154
+ this.depthTextures[0] = xrDepth.getTexture(0);
155
+ this.depthTextures[1] = xrDepth.getTexture(1);
156
+ this.uniforms.uRawValueToMeters.value = xrDepth.rawValueToMeters;
157
+ if (this.depthTextures[0]) {
158
+ this.uniforms.uIsTextureArray.value = this.depthTextures[0]
159
+ .isExternalTexture
160
+ ? 1.0
161
+ : 0;
162
+ }
163
+ }
164
+
165
+ render(renderer, writeBuffer, readBuffer, deltaTime, maskActive, viewId) {
166
+ const texture = this.depthTextures[viewId];
167
+ if (!texture) return;
168
+ if (texture.isExternalTexture) {
169
+ this.uniforms.uDepthTextureArray.value = texture;
170
+ const depthNear = xb.core.depth.gpuDepthData[0].depthNear;
171
+ this.uniforms.uDepthNear.value = depthNear;
172
+ } else {
173
+ this.uniforms.uDepthTexture.value = texture;
174
+ }
175
+ this.uniforms.tDiffuse.value = readBuffer.texture;
176
+ this.uniforms.uView.value = viewId;
177
+ renderer.setRenderTarget(this.renderToScreen ? null : writeBuffer);
178
+ this.depthMapQuad.render(renderer);
179
+ }
180
+
181
+ dispose() {
182
+ this.depthMapQuad.dispose();
183
+ }
184
+ }
185
+
186
+ // --- Inlined: DepthMapScene.js ---
187
+ class DepthMapScene extends xb.Script {
188
+ init() {
189
+ if (xb.core.effects) {
190
+ this.depthVisPass = new DepthVisualizationPass(xb.scene, xb.core.camera);
191
+ xb.core.effects.addPass(this.depthVisPass);
192
+ } else {
193
+ console.error(
194
+ 'This sample needs post processing for adding the depth visualization pass. Please enable options.usePostprocessing'
195
+ );
196
+ }
197
+
198
+ this.depthMeshAlphaSlider = new xb.FreestandingSlider(
199
+ /*start=*/ 1.0,
200
+ /*min=*/ 0.0,
201
+ /*max=*/ 1.0,
202
+ /*scale*/ 5.0
203
+ );
204
+ // Which controller is currently selecting depthMeshAlphaSlider.
205
+ this.currentSliderController = null;
206
+
207
+ const light = new THREE.HemisphereLight(0xffffff, 0xbbbbff, 3);
208
+ light.position.set(0.5, 1, 0.25);
209
+ this.add(light);
210
+ }
211
+
212
+ onSelectStart(event) {
213
+ const controller = event.target;
214
+ controller.userData.selected = true;
215
+ this.currentSliderController = controller;
216
+ this.depthMeshAlphaSlider.setInitialPose(
217
+ controller.position,
218
+ controller.quaternion
219
+ );
220
+ }
221
+
222
+ onSelectEnd(event) {
223
+ const controller = event.target;
224
+ controller.userData.selected = false;
225
+ if (this.currentSliderController == controller) {
226
+ const opacity = this.depthMeshAlphaSlider.getValueFromController(
227
+ this.currentSliderController
228
+ );
229
+ this.depthVisPass.setAlpha(opacity);
230
+ this.depthMeshAlphaSlider.updateValue(opacity);
231
+ }
232
+ this.currentSliderController = null;
233
+ }
234
+
235
+ update() {
236
+ if (this.currentSliderController) {
237
+ const opacity = this.depthMeshAlphaSlider.getValueFromController(
238
+ this.currentSliderController
239
+ );
240
+ this.depthVisPass.setAlpha(opacity);
241
+ }
242
+ this.depthVisPass.updateEnvironmentalDepthTexture(xb.core.depth);
243
+ }
244
+ }
245
+
246
+ // --- Main entry point ---
247
+ const options = new xb.Options();
248
+ options.simulator.instructions.enabled = false;
249
+ options.depth.enabled = true;
250
+ options.depth.depthTexture.enabled = true;
251
+ options.depth.depthTypeRequest = [xb.getUrlParameter('depthType') ?? 'raw'];
252
+ options.usePostprocessing = true;
253
+ options.setAppTitle('Depth Map');
254
+
255
+ function start() {
256
+ xb.add(new DepthMapScene());
257
+ xb.init(options);
258
+ }
259
+
260
+ document.addEventListener('DOMContentLoaded', function () {
261
+ start();
262
+ });
263
+
264
+ </script>
265
+ </body>
266
+ </html>
@@ -0,0 +1,100 @@
1
+ <!doctype html>
2
+ <!-- reference: samples/depthmesh -->
3
+ <html lang="en">
4
+ <head>
5
+ <title>Depth Mesh | XR Blocks</title>
6
+
7
+ <meta
8
+ name="viewport"
9
+ content="width=device-width, initial-scale=1.0, user-scalable=no"
10
+ />
11
+
12
+ <link type="text/css" rel="stylesheet" href="https://xrblocks.github.io/css/xr.css" />
13
+ <script type="importmap">
14
+ {
15
+ "imports": {
16
+ "three": "https://cdn.jsdelivr.net/npm/three@0.182.0/build/three.module.js",
17
+ "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.182.0/examples/jsm/",
18
+ "troika-three-text": "https://cdn.jsdelivr.net/gh/protectwise/troika@028b81cf308f0f22e5aa8e78196be56ec1997af5/packages/troika-three-text/src/index.js",
19
+ "troika-three-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-three-utils/src/index.js",
20
+ "troika-worker-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-worker-utils/src/index.js",
21
+ "bidi-js": "https://esm.sh/bidi-js@%5E1.0.2?target=es2022",
22
+ "webgl-sdf-generator": "https://esm.sh/webgl-sdf-generator@1.1.1/es2022/webgl-sdf-generator.mjs",
23
+ "lit": "https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js",
24
+ "lit/": "https://esm.run/lit@3/",
25
+ "xrblocks": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/xrblocks.js",
26
+ "xrblocks/addons/": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/addons/"
27
+ }
28
+ }
29
+ </script>
30
+ </head>
31
+
32
+ <body>
33
+ <script type="module">
34
+ import * as THREE from 'three';
35
+ import * as xb from 'xrblocks';
36
+
37
+ class DepthMeshVisualizer extends xb.Script {
38
+ currentSliderController = null;
39
+ depthMeshAlphaSlider = new xb.FreestandingSlider(
40
+ /*start=*/ 1.0,
41
+ /*min=*/ 0.0,
42
+ /*max=*/ 1.0,
43
+ /*scale*/ 5.0
44
+ );
45
+
46
+ constructor() {
47
+ super();
48
+ const light = new THREE.HemisphereLight(0xffffff, 0xbbbbff, 3);
49
+ light.position.set(0.5, 1, 0.25);
50
+ this.add(light);
51
+ }
52
+
53
+ init() {
54
+ xb.core.depth.depthMesh.material.uniforms.uOpacity.value =
55
+ this.depthMeshAlphaSlider.startingValue;
56
+ }
57
+
58
+ onSelectStart(event) {
59
+ this.currentSliderController = event.target;
60
+ this.depthMeshAlphaSlider.setInitialPoseFromController(
61
+ this.currentSliderController
62
+ );
63
+ }
64
+
65
+ onSelectEnd(event) {
66
+ const controller = event.target;
67
+ if (this.currentSliderController == controller) {
68
+ const opacity = this.depthMeshAlphaSlider.getValueFromController(
69
+ this.currentSliderController
70
+ );
71
+ xb.core.depth.depthMesh.material.uniforms.uOpacity.value = opacity;
72
+ this.depthMeshAlphaSlider.updateValue(opacity);
73
+ }
74
+ this.currentSliderController = null;
75
+ }
76
+
77
+ update() {
78
+ if (this.currentSliderController) {
79
+ const opacity = this.depthMeshAlphaSlider.getValueFromController(
80
+ this.currentSliderController
81
+ );
82
+ xb.core.depth.depthMesh.material.uniforms.uOpacity.value = opacity;
83
+ console.log('opacity:' + opacity);
84
+ }
85
+ }
86
+ }
87
+
88
+ document.addEventListener('DOMContentLoaded', function () {
89
+ const options = new xb.Options();
90
+ options.simulator.instructions.enabled = false;
91
+ options.setAppTitle('Depth Mesh');
92
+ options.depth = new xb.DepthOptions(xb.xrDepthMeshVisualizationOptions);
93
+ options.depth.depthTypeRequest = [xb.getUrlParameter('depthType') ?? 'raw'];
94
+ xb.add(new DepthMeshVisualizer());
95
+ xb.init(options);
96
+ });
97
+
98
+ </script>
99
+ </body>
100
+ </html>