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,432 @@
1
+ <!doctype html>
2
+ <!-- reference: demos/screenwiper -->
3
+ <html lang="en">
4
+ <head>
5
+ <title>Screen Wiper</title>
6
+
7
+ <meta
8
+ name="viewport"
9
+ content="width=device-width, initial-scale=1.0, user-scalable=no"
10
+ />
11
+ <link type="text/css" rel="stylesheet" href="https://xrblocks.github.io/css/xr.css" />
12
+ <script>
13
+ window.litDisableBundleWarning = true;
14
+ </script>
15
+ <script type="importmap">
16
+ {
17
+ "imports": {
18
+ "three": "https://cdn.jsdelivr.net/npm/three@0.182.0/build/three.module.js",
19
+ "three/addons/": "https://cdn.jsdelivr.net/npm/three@0.182.0/examples/jsm/",
20
+ "troika-three-text": "https://cdn.jsdelivr.net/gh/protectwise/troika@028b81cf308f0f22e5aa8e78196be56ec1997af5/packages/troika-three-text/src/index.js",
21
+ "troika-three-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-three-utils/src/index.js",
22
+ "troika-worker-utils": "https://cdn.jsdelivr.net/gh/protectwise/troika@v0.52.4/packages/troika-worker-utils/src/index.js",
23
+ "bidi-js": "https://esm.sh/bidi-js@%5E1.0.2?target=es2022",
24
+ "webgl-sdf-generator": "https://esm.sh/webgl-sdf-generator@1.1.1/es2022/webgl-sdf-generator.mjs",
25
+ "lit": "https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js",
26
+ "lit/": "https://esm.run/lit@3/",
27
+ "xrblocks": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/xrblocks.js",
28
+ "xrblocks/addons/": "https://cdn.jsdelivr.net/npm/xrblocks@0.11.0/build/addons/"
29
+ }
30
+ }
31
+ </script>
32
+ </head>
33
+
34
+ <body>
35
+ <audio loop id="music" preload="auto" style="display: none">
36
+ <source
37
+ src="https://cdn.jsdelivr.net/gh/xrblocks/assets@main/musicLibrary/BackgroundMusic4.mp3"
38
+ type="audio/mpeg"
39
+ />
40
+ </audio>
41
+
42
+ <script type="module">
43
+ import 'xrblocks/addons/simulator/SimulatorAddons.js';
44
+
45
+ import * as THREE from 'three';
46
+ import {ShaderPass} from 'three/addons/postprocessing/ShaderPass.js';
47
+ import * as xb from 'xrblocks';
48
+
49
+ // --- AlphaShader inlined ---
50
+ const AlphaShader = {
51
+ name: 'AlphaShader',
52
+
53
+ defines: {
54
+ DEG_TO_RAD: 3.14159265359 / 180.0,
55
+ },
56
+
57
+ uniforms: {
58
+ tDiffuse: {value: null},
59
+ uWiperDegrees: {value: 10.0},
60
+ uLeftWiperActive: {value: false},
61
+ uLeftHandCartesianCoordinate: {value: new THREE.Vector3(0.0, -1.0, 0.0)},
62
+ uRightWiperActive: {value: false},
63
+ uRightHandCartesianCoordinate: {value: new THREE.Vector3(0.0, -1.0, 0.0)},
64
+ uReturnSpeed: {value: 0.005},
65
+ },
66
+
67
+ vertexShader: /* glsl */ `
68
+
69
+ varying vec2 vUv;
70
+
71
+ void main() {
72
+
73
+ vUv = uv;
74
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
75
+
76
+ }`,
77
+
78
+ fragmentShader: /* glsl */ `
79
+
80
+ #include <common>
81
+
82
+ varying vec2 vUv;
83
+
84
+ uniform sampler2D tDiffuse;
85
+ uniform float uWiperDegrees;
86
+ uniform bool uLeftWiperActive;
87
+ uniform vec3 uLeftHandCartesianCoordinate;
88
+ uniform bool uRightWiperActive;
89
+ uniform vec3 uRightHandCartesianCoordinate;
90
+ uniform float uReturnSpeed;
91
+
92
+ vec3 sphericalToCartesian(vec3 spherical) {
93
+ float x = spherical.x * cos(spherical.y) * sin(spherical.z);
94
+ float y = spherical.x * cos(spherical.z);
95
+ float z = spherical.x * sin(spherical.y) * sin(spherical.z);
96
+ return vec3(x, y, z);
97
+ }
98
+
99
+ float getWiperValue(bool wiperActive, vec3 handCartesianCoordinate) {
100
+ if (!wiperActive) return 1.0;
101
+ vec3 cartesianCoordinate = sphericalToCartesian(vec3(1.0, PI - vUv.x * 2.0 * PI, PI - vUv.y * PI));
102
+ float cosineSimilarity = dot(handCartesianCoordinate, cartesianCoordinate);
103
+ float wiperValue = 1.0 - smoothstep(cos(uWiperDegrees * DEG_TO_RAD), 1.0, cosineSimilarity);
104
+ wiperValue = 0.95 + 0.05 * wiperValue;
105
+ return wiperValue;
106
+ }
107
+
108
+ void main() {
109
+ float prevFrameValue = texture(tDiffuse, vUv).g;
110
+ float newFrameValue = prevFrameValue + uReturnSpeed * (uLeftWiperActive || uRightWiperActive ? 0.0 : 1.0);
111
+ newFrameValue *= getWiperValue(uLeftWiperActive, uLeftHandCartesianCoordinate);
112
+ newFrameValue *= getWiperValue(uRightWiperActive, uRightHandCartesianCoordinate);
113
+ gl_FragColor = vec4(vec3(newFrameValue), 1.0);
114
+ }`,
115
+ };
116
+
117
+ // --- ClearShader inlined ---
118
+ const ClearShader = {
119
+ name: 'ClearShader',
120
+
121
+ defines: {
122
+ DEG_TO_RAD: 3.14159265359 / 180.0,
123
+ },
124
+
125
+ uniforms: {
126
+ uClearColor: {
127
+ value: new THREE.Vector4(1.0, 1.0, 1.0, 1.0),
128
+ },
129
+ },
130
+
131
+ vertexShader: /* glsl */ `
132
+
133
+ varying vec2 vUv;
134
+
135
+ void main() {
136
+
137
+ vUv = uv;
138
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
139
+
140
+ }`,
141
+
142
+ fragmentShader: /* glsl */ `
143
+
144
+ #include <common>
145
+
146
+ varying vec2 vUv;
147
+ uniform vec4 uClearColor;
148
+
149
+
150
+ void main() {
151
+ gl_FragColor = uClearColor;
152
+ }`,
153
+ };
154
+
155
+ // --- ScreenWiperShader inlined ---
156
+ const noise_texture = new THREE.TextureLoader().load(
157
+ 'screenwiper_assets/Noise.png'
158
+ );
159
+ noise_texture.wrapS = THREE.RepeatWrapping;
160
+ noise_texture.wrapT = THREE.RepeatWrapping;
161
+
162
+ const color_map = new THREE.TextureLoader().load(
163
+ 'screenwiper_assets/ColorMap.png'
164
+ );
165
+ color_map.wrapS = THREE.RepeatWrapping;
166
+
167
+ const ScreenWiperShader = {
168
+ name: 'ScreenWiperShader',
169
+
170
+ defines: {
171
+ DEG_TO_RAD: 3.14159265359 / 180.0,
172
+ },
173
+
174
+ uniforms: {
175
+ uTexture: {value: noise_texture},
176
+ uMask: {value: null},
177
+ uColorMap: {value: color_map},
178
+ uTime: {value: new THREE.Vector4(0.0, 0.0, 0.0, 0.0)},
179
+ uMoveSpeed: {value: 0.1},
180
+ uColorSpeed: {value: 0.2},
181
+ uPulseSpeed: {value: 4.0},
182
+ uPulseAmount: {value: 0.025},
183
+ uHoleColor: {
184
+ value: new THREE.Vector4(
185
+ 49.0 / 255,
186
+ 103.0 / 255,
187
+ 154.0 / 255,
188
+ 64.0 / 255
189
+ ),
190
+ },
191
+ },
192
+
193
+ vertexShader: /* glsl */ `
194
+
195
+ varying vec2 vUv;
196
+
197
+ void main() {
198
+
199
+ vUv = uv;
200
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
201
+
202
+ }`,
203
+
204
+ fragmentShader: /* glsl */ `
205
+
206
+ #include <common>
207
+
208
+ varying vec2 vUv;
209
+
210
+ uniform sampler2D uTexture;
211
+ uniform sampler2D uMask;
212
+ uniform sampler2D uColorMap;
213
+ uniform vec4 uTime;
214
+ uniform float uColorSpeed;
215
+ uniform float uMoveSpeed;
216
+ uniform float uPulseSpeed;
217
+ uniform float uPulseAmount;
218
+ uniform vec4 uHoleColor;
219
+
220
+
221
+ void main() {
222
+ // Sample at uv scale 1.
223
+ vec2 uv1 = vUv;
224
+ uv1.x += sin(uTime.x * 4.89 * uMoveSpeed);
225
+ uv1.y += uTime.y * .123 * uMoveSpeed;
226
+ vec4 tex1 = texture(uTexture, 2.0 * uv1);
227
+
228
+ // Sample at uv scale 2.
229
+ vec2 uv2 = vUv * 2.0;
230
+ uv2.x += uTime.y * 0.277 * uMoveSpeed;
231
+ uv2.y += sin(uTime.x * 6.231 * uMoveSpeed);
232
+ vec4 tex2 = texture(uTexture, 2.0 * uv2);
233
+
234
+ float totalValue = (tex1.r * 0.75) + (tex2.r * 0.25);
235
+ vec4 mapColor = texture(uColorMap, vec2(totalValue + uTime.x * uColorSpeed, 0.5));
236
+ vec4 col = saturate(mapColor);
237
+ col.a = 1.0;
238
+
239
+ // Mask.
240
+ float pulseInside = sin(uTime.y * uPulseSpeed + vUv.x * 150.0) * uPulseAmount;
241
+ float pulseOutside = cos(uTime.y * uPulseSpeed + vUv.x * 150.0) * uPulseAmount;
242
+ vec4 mask = texture(uMask, vUv);
243
+ vec4 tintedCol = mix(col, uHoleColor, 0.5);
244
+ col = mix(tintedCol, col, step(0.8 + pulseOutside, mask.r));
245
+ col.a = mix(0.0, max(col.a, tintedCol.a), step(0.5 + pulseInside, mask.r));
246
+ gl_FragColor = col;
247
+ }`,
248
+ };
249
+
250
+ // --- ScreenWiper inlined ---
251
+ const raycaster = new THREE.Raycaster();
252
+
253
+ const clearpass = new ShaderPass(ClearShader);
254
+ clearpass.renderToScreen = false;
255
+
256
+ class ScreenWiper extends THREE.Mesh {
257
+ activeControllers = [];
258
+
259
+ constructor() {
260
+ const NATIVE_RESOLUTION = 1024;
261
+ const RESOLUTION_MULTIPLIER = 4;
262
+ const RESOLUTION = NATIVE_RESOLUTION * RESOLUTION_MULTIPLIER;
263
+ const renderTargetA = new THREE.WebGLRenderTarget(RESOLUTION, RESOLUTION);
264
+ const renderTargetB = new THREE.WebGLRenderTarget(RESOLUTION, RESOLUTION);
265
+
266
+ const geometry = new THREE.SphereGeometry(15, 32, 16);
267
+ const material = new THREE.ShaderMaterial({
268
+ name: 'ScreenWiperShader',
269
+ defines: Object.assign({}, ScreenWiperShader.defines),
270
+ uniforms: THREE.UniformsUtils.clone(ScreenWiperShader.uniforms),
271
+ vertexShader: ScreenWiperShader.vertexShader,
272
+ fragmentShader: ScreenWiperShader.fragmentShader,
273
+ transparent: true,
274
+ side: THREE.DoubleSide,
275
+ });
276
+ super(geometry, material);
277
+ this.renderTargetA = renderTargetA;
278
+ this.renderTargetB = renderTargetB;
279
+
280
+ this.shaderpass = new ShaderPass(AlphaShader);
281
+ this.controllerActiveUniforms = [
282
+ this.shaderpass.material.uniforms.uLeftWiperActive,
283
+ this.shaderpass.material.uniforms.uRightWiperActive,
284
+ ];
285
+ this.controllerCartesianCoordinateUniforms = [
286
+ this.shaderpass.material.uniforms.uLeftHandCartesianCoordinate,
287
+ this.shaderpass.material.uniforms.uRightHandCartesianCoordinate,
288
+ ];
289
+ this.worldPosition = new THREE.Vector3();
290
+ this.starttime = Date.now();
291
+ }
292
+
293
+ clear(renderer) {
294
+ const xrEnabled = renderer.xr.enabled;
295
+ const xrTarget = renderer.getRenderTarget();
296
+
297
+ renderer.xr.enabled = false;
298
+ clearpass.render(renderer, this.renderTargetA, null);
299
+ clearpass.render(renderer, this.renderTargetB, null);
300
+ this.material.uniforms.uMask.value = this.renderTargetB.texture;
301
+
302
+ renderer.xr.enabled = xrEnabled;
303
+ renderer.setRenderTarget(xrTarget);
304
+ }
305
+
306
+ update(renderer) {
307
+ const camera = renderer.xr.getCamera().cameras[0];
308
+ if (camera != null) {
309
+ this.position.copy(camera.position);
310
+ }
311
+
312
+ this.getWorldPosition(this.worldPosition);
313
+ for (let i = 0; i < 2; i++) {
314
+ if (i < this.activeControllers.length) {
315
+ this.controllerActiveUniforms[i].value = true;
316
+ const controller = this.activeControllers[i];
317
+ raycaster.setFromXRController(controller);
318
+ const intersects = raycaster.intersectObject(this);
319
+ if (intersects.length > 0) {
320
+ this.controllerCartesianCoordinateUniforms[i].value
321
+ .copy(intersects[0].point)
322
+ .sub(this.worldPosition)
323
+ .normalize();
324
+ }
325
+ } else {
326
+ this.controllerActiveUniforms[i].value = false;
327
+ }
328
+ }
329
+
330
+ const elapsedTime = (Date.now() - this.starttime) / 1000;
331
+ if (this.material.uniforms.uTime) {
332
+ this.material.uniforms.uTime.value.set(
333
+ elapsedTime / 20,
334
+ elapsedTime,
335
+ elapsedTime * 2,
336
+ elapsedTime * 3
337
+ );
338
+ }
339
+
340
+ const xrEnabled = renderer.xr.enabled;
341
+ const xrTarget = renderer.getRenderTarget();
342
+
343
+ renderer.xr.enabled = false;
344
+ [this.renderTargetA, this.renderTargetB] = [
345
+ this.renderTargetB,
346
+ this.renderTargetA,
347
+ ];
348
+ this.shaderpass.renderToScreen = false;
349
+ this.shaderpass.render(renderer, this.renderTargetB, this.renderTargetA);
350
+ this.material.uniforms.uMask.value = this.renderTargetB.texture;
351
+
352
+ renderer.xr.enabled = xrEnabled;
353
+ renderer.setRenderTarget(xrTarget);
354
+ }
355
+
356
+ addActiveController(controller) {
357
+ this.activeControllers.push(controller);
358
+ }
359
+
360
+ removeActiveController(controller) {
361
+ const index = this.activeControllers.indexOf(controller);
362
+ if (index != -1) {
363
+ this.activeControllers.splice(index, 1);
364
+ }
365
+ }
366
+
367
+ dispose() {
368
+ this.renderTargetA.dispose();
369
+ this.renderTargetB.dispose();
370
+ this.shaderpass.dispose();
371
+ this.material.dispose();
372
+ }
373
+
374
+ startTransition(passthrough) {
375
+ this.shaderpass.material.uniforms.uReturnSpeed.value = passthrough
376
+ ? -0.005
377
+ : 0.005;
378
+ }
379
+ }
380
+
381
+ // --- ScreenWiperScene inlined ---
382
+ class ScreenWiperScene extends xb.Script {
383
+ screenWiper = new ScreenWiper({
384
+ width: 1.0,
385
+ height: 1.0,
386
+ color: new THREE.Color(0x000000),
387
+ speed: 0.5,
388
+ direction: 'right',
389
+ start: 0.0,
390
+ end: 1.0,
391
+ });
392
+
393
+ constructor(opts) {
394
+ super(opts);
395
+ this.add(this.screenWiper);
396
+ }
397
+
398
+ init() {
399
+ this.screenWiper.clear(xb.core.renderer);
400
+ }
401
+
402
+ onSelectStart(event) {
403
+ this.screenWiper.addActiveController(event.target);
404
+ }
405
+
406
+ onSelectEnd(event) {
407
+ this.screenWiper.removeActiveController(event.target);
408
+ }
409
+
410
+ update() {
411
+ this.screenWiper.update(xb.core.renderer);
412
+ }
413
+ }
414
+
415
+ const options = new xb.Options();
416
+ options.simulator.instructions.enabled = false;
417
+ options.antialias = true;
418
+ options.reticles.enabled = true;
419
+ options.visualizeRays = true;
420
+
421
+ function start() {
422
+ xb.add(new ScreenWiperScene());
423
+ xb.init(options);
424
+ }
425
+
426
+ document.addEventListener('DOMContentLoaded', function () {
427
+ start();
428
+ });
429
+
430
+ </script>
431
+ </body>
432
+ </html>