@driftengine/core 3.61.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 (955) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +9 -0
  4. package/dist/behavior/behaviorTree.d.ts +140 -0
  5. package/dist/behavior/behaviorTree.js +289 -0
  6. package/dist/build/shaderComments.d.ts +64 -0
  7. package/dist/build/shaderComments.js +0 -0
  8. package/dist/cinematic/player.d.ts +80 -0
  9. package/dist/cinematic/player.js +184 -0
  10. package/dist/cinematic/script.d.ts +63 -0
  11. package/dist/cinematic/script.js +141 -0
  12. package/dist/core/bootGate.d.ts +37 -0
  13. package/dist/core/bootGate.js +47 -0
  14. package/dist/core/loadTracker.d.ts +78 -0
  15. package/dist/core/loadTracker.js +106 -0
  16. package/dist/core/loop.d.ts +118 -0
  17. package/dist/core/loop.js +84 -0
  18. package/dist/core/messageQueue.d.ts +61 -0
  19. package/dist/core/messageQueue.js +104 -0
  20. package/dist/core/onceSet.d.ts +27 -0
  21. package/dist/core/onceSet.js +62 -0
  22. package/dist/core/preferences.d.ts +47 -0
  23. package/dist/core/preferences.js +140 -0
  24. package/dist/core/remoteSave.d.ts +154 -0
  25. package/dist/core/remoteSave.js +249 -0
  26. package/dist/core/rng.d.ts +64 -0
  27. package/dist/core/rng.js +72 -0
  28. package/dist/core/stepBudget.d.ts +91 -0
  29. package/dist/core/stepBudget.js +105 -0
  30. package/dist/core/storage.d.ts +52 -0
  31. package/dist/core/storage.js +85 -0
  32. package/dist/core/tickTrace.d.ts +72 -0
  33. package/dist/core/tickTrace.js +102 -0
  34. package/dist/core/timeCurve.d.ts +83 -0
  35. package/dist/core/timeCurve.js +107 -0
  36. package/dist/core/withDefaults.d.ts +21 -0
  37. package/dist/core/withDefaults.js +29 -0
  38. package/dist/dev/contactProbe.d.ts +41 -0
  39. package/dist/dev/contactProbe.js +58 -0
  40. package/dist/dev/fpsMeter.d.ts +45 -0
  41. package/dist/dev/fpsMeter.js +86 -0
  42. package/dist/environment/celestialClock.d.ts +141 -0
  43. package/dist/environment/celestialClock.js +262 -0
  44. package/dist/geometry/decal.d.ts +61 -0
  45. package/dist/geometry/decal.js +178 -0
  46. package/dist/geometry/filmPatch.d.ts +35 -0
  47. package/dist/geometry/filmPatch.js +112 -0
  48. package/dist/geometry/growable.d.ts +70 -0
  49. package/dist/geometry/growable.js +167 -0
  50. package/dist/geometry/lightVolume.d.ts +76 -0
  51. package/dist/geometry/lightVolume.js +65 -0
  52. package/dist/geometry/meshBuilder.d.ts +426 -0
  53. package/dist/geometry/meshBuilder.js +1184 -0
  54. package/dist/geometry/pixelFont.d.ts +59 -0
  55. package/dist/geometry/pixelFont.js +179 -0
  56. package/dist/geometry/ribbon.d.ts +101 -0
  57. package/dist/geometry/ribbon.js +546 -0
  58. package/dist/geometry/shellFill.d.ts +101 -0
  59. package/dist/geometry/shellFill.js +203 -0
  60. package/dist/geometry/spline.d.ts +162 -0
  61. package/dist/geometry/spline.js +527 -0
  62. package/dist/geometry/tangents.d.ts +30 -0
  63. package/dist/geometry/tangents.js +142 -0
  64. package/dist/geometry/textMesh.d.ts +51 -0
  65. package/dist/geometry/textMesh.js +57 -0
  66. package/dist/geometry/treeBuilder.d.ts +37 -0
  67. package/dist/geometry/treeBuilder.js +56 -0
  68. package/dist/host/display.d.ts +135 -0
  69. package/dist/host/display.js +114 -0
  70. package/dist/host/files.d.ts +25 -0
  71. package/dist/host/files.js +44 -0
  72. package/dist/host/lifecycle.d.ts +45 -0
  73. package/dist/host/lifecycle.js +28 -0
  74. package/dist/host/platformServices.d.ts +23 -0
  75. package/dist/host/platformServices.js +1 -0
  76. package/dist/host/screen.d.ts +49 -0
  77. package/dist/host/screen.js +90 -0
  78. package/dist/index.d.ts +289 -0
  79. package/dist/index.js +320 -0
  80. package/dist/input/actionMap.d.ts +181 -0
  81. package/dist/input/actionMap.js +314 -0
  82. package/dist/input/activeDevice.d.ts +55 -0
  83. package/dist/input/activeDevice.js +83 -0
  84. package/dist/input/gamepadIdentity.d.ts +43 -0
  85. package/dist/input/gamepadIdentity.js +108 -0
  86. package/dist/input/gamepadMapping.d.ts +56 -0
  87. package/dist/input/gamepadMapping.js +91 -0
  88. package/dist/input/input.d.ts +281 -0
  89. package/dist/input/input.js +703 -0
  90. package/dist/input/inputHarness.d.ts +42 -0
  91. package/dist/input/inputHarness.js +193 -0
  92. package/dist/input/rightGesture.d.ts +57 -0
  93. package/dist/input/rightGesture.js +49 -0
  94. package/dist/input/rumble.d.ts +71 -0
  95. package/dist/input/rumble.js +119 -0
  96. package/dist/input/touchControls.d.ts +138 -0
  97. package/dist/input/touchControls.js +352 -0
  98. package/dist/input/typingTarget.d.ts +6 -0
  99. package/dist/input/typingTarget.js +27 -0
  100. package/dist/math/bounds.d.ts +61 -0
  101. package/dist/math/bounds.js +121 -0
  102. package/dist/math/color.d.ts +8 -0
  103. package/dist/math/color.js +35 -0
  104. package/dist/math/exact.d.ts +66 -0
  105. package/dist/math/exact.js +262 -0
  106. package/dist/math/frustum.d.ts +44 -0
  107. package/dist/math/frustum.js +90 -0
  108. package/dist/math/intersect.d.ts +76 -0
  109. package/dist/math/intersect.js +185 -0
  110. package/dist/math/scalar.d.ts +51 -0
  111. package/dist/math/scalar.js +99 -0
  112. package/dist/math/spring.d.ts +59 -0
  113. package/dist/math/spring.js +88 -0
  114. package/dist/nav/navGraph.d.ts +71 -0
  115. package/dist/nav/navGraph.js +111 -0
  116. package/dist/nav/navPath.d.ts +93 -0
  117. package/dist/nav/navPath.js +162 -0
  118. package/dist/nav/navSearch.d.ts +74 -0
  119. package/dist/nav/navSearch.js +198 -0
  120. package/dist/physics/boxSurface.d.ts +48 -0
  121. package/dist/physics/boxSurface.js +73 -0
  122. package/dist/physics/colliderSurface.d.ts +46 -0
  123. package/dist/physics/colliderSurface.js +146 -0
  124. package/dist/physics/compositeSurface.d.ts +33 -0
  125. package/dist/physics/compositeSurface.js +108 -0
  126. package/dist/physics/heightSurface.d.ts +103 -0
  127. package/dist/physics/heightSurface.js +153 -0
  128. package/dist/physics/ribbonSurface.d.ts +239 -0
  129. package/dist/physics/ribbonSurface.js +522 -0
  130. package/dist/render/ambientOcclusionPass.d.ts +53 -0
  131. package/dist/render/ambientOcclusionPass.js +179 -0
  132. package/dist/render/areaLights.d.ts +116 -0
  133. package/dist/render/areaLights.js +91 -0
  134. package/dist/render/areaShadowSet.d.ts +184 -0
  135. package/dist/render/areaShadowSet.js +277 -0
  136. package/dist/render/atmosphere.d.ts +94 -0
  137. package/dist/render/atmosphere.js +91 -0
  138. package/dist/render/backend/api.d.ts +496 -0
  139. package/dist/render/backend/api.js +1 -0
  140. package/dist/render/backend/budget.d.ts +82 -0
  141. package/dist/render/backend/budget.js +99 -0
  142. package/dist/render/backend/createRenderer.d.ts +135 -0
  143. package/dist/render/backend/createRenderer.js +201 -0
  144. package/dist/render/backend/deadline.d.ts +24 -0
  145. package/dist/render/backend/deadline.js +38 -0
  146. package/dist/render/backend/probe.d.ts +30 -0
  147. package/dist/render/backend/probe.js +129 -0
  148. package/dist/render/backend/select.d.ts +70 -0
  149. package/dist/render/backend/select.js +249 -0
  150. package/dist/render/backend/timer.d.ts +50 -0
  151. package/dist/render/backend/timer.js +1 -0
  152. package/dist/render/backend/webgl2/instanced.d.ts +21 -0
  153. package/dist/render/backend/webgl2/instanced.js +42 -0
  154. package/dist/render/backend/webgl2/morphTexture.d.ts +21 -0
  155. package/dist/render/backend/webgl2/morphTexture.js +55 -0
  156. package/dist/render/backend/webgl2/renderer.d.ts +3027 -0
  157. package/dist/render/backend/webgl2/renderer.js +6041 -0
  158. package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +32 -0
  159. package/dist/render/backend/webgl2/skinPaletteTexture.js +68 -0
  160. package/dist/render/backend/webgpu/boltPass.d.ts +42 -0
  161. package/dist/render/backend/webgpu/boltPass.js +160 -0
  162. package/dist/render/backend/webgpu/buffers.d.ts +159 -0
  163. package/dist/render/backend/webgpu/buffers.js +402 -0
  164. package/dist/render/backend/webgpu/causticsPass.d.ts +36 -0
  165. package/dist/render/backend/webgpu/causticsPass.js +138 -0
  166. package/dist/render/backend/webgpu/clusterBinner.d.ts +51 -0
  167. package/dist/render/backend/webgpu/clusterBinner.js +206 -0
  168. package/dist/render/backend/webgpu/depthPass.d.ts +114 -0
  169. package/dist/render/backend/webgpu/depthPass.js +228 -0
  170. package/dist/render/backend/webgpu/device.d.ts +52 -0
  171. package/dist/render/backend/webgpu/device.js +121 -0
  172. package/dist/render/backend/webgpu/drawCommand.d.ts +43 -0
  173. package/dist/render/backend/webgpu/drawCommand.js +54 -0
  174. package/dist/render/backend/webgpu/environmentTexels.d.ts +28 -0
  175. package/dist/render/backend/webgpu/environmentTexels.js +79 -0
  176. package/dist/render/backend/webgpu/filmPass.d.ts +29 -0
  177. package/dist/render/backend/webgpu/filmPass.js +97 -0
  178. package/dist/render/backend/webgpu/flatPass.d.ts +213 -0
  179. package/dist/render/backend/webgpu/flatPass.js +482 -0
  180. package/dist/render/backend/webgpu/flockPass.d.ts +34 -0
  181. package/dist/render/backend/webgpu/flockPass.js +129 -0
  182. package/dist/render/backend/webgpu/gpuTimestamps.d.ts +94 -0
  183. package/dist/render/backend/webgpu/gpuTimestamps.js +213 -0
  184. package/dist/render/backend/webgpu/insetPass.d.ts +19 -0
  185. package/dist/render/backend/webgpu/insetPass.js +108 -0
  186. package/dist/render/backend/webgpu/instanced.d.ts +27 -0
  187. package/dist/render/backend/webgpu/instanced.js +49 -0
  188. package/dist/render/backend/webgpu/lightVolumePass.d.ts +75 -0
  189. package/dist/render/backend/webgpu/lightVolumePass.js +154 -0
  190. package/dist/render/backend/webgpu/linePass.d.ts +90 -0
  191. package/dist/render/backend/webgpu/linePass.js +220 -0
  192. package/dist/render/backend/webgpu/morphTexture.d.ts +18 -0
  193. package/dist/render/backend/webgpu/morphTexture.js +51 -0
  194. package/dist/render/backend/webgpu/panelPass.d.ts +37 -0
  195. package/dist/render/backend/webgpu/panelPass.js +114 -0
  196. package/dist/render/backend/webgpu/particlePass.d.ts +89 -0
  197. package/dist/render/backend/webgpu/particlePass.js +280 -0
  198. package/dist/render/backend/webgpu/pipelineCache.d.ts +93 -0
  199. package/dist/render/backend/webgpu/pipelineCache.js +140 -0
  200. package/dist/render/backend/webgpu/plumePass.d.ts +69 -0
  201. package/dist/render/backend/webgpu/plumePass.js +213 -0
  202. package/dist/render/backend/webgpu/pointShadowPass.d.ts +88 -0
  203. package/dist/render/backend/webgpu/pointShadowPass.js +280 -0
  204. package/dist/render/backend/webgpu/postPass.d.ts +342 -0
  205. package/dist/render/backend/webgpu/postPass.js +366 -0
  206. package/dist/render/backend/webgpu/probePass.d.ts +108 -0
  207. package/dist/render/backend/webgpu/probePass.js +188 -0
  208. package/dist/render/backend/webgpu/reflectionPass.d.ts +29 -0
  209. package/dist/render/backend/webgpu/reflectionPass.js +87 -0
  210. package/dist/render/backend/webgpu/renderer.d.ts +3082 -0
  211. package/dist/render/backend/webgpu/renderer.js +10911 -0
  212. package/dist/render/backend/webgpu/scatterPass.d.ts +95 -0
  213. package/dist/render/backend/webgpu/scatterPass.js +266 -0
  214. package/dist/render/backend/webgpu/sdfTextPass.d.ts +86 -0
  215. package/dist/render/backend/webgpu/sdfTextPass.js +190 -0
  216. package/dist/render/backend/webgpu/shaderModules.d.ts +9 -0
  217. package/dist/render/backend/webgpu/shaderModules.js +45 -0
  218. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +23 -0
  219. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.js +208 -0
  220. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +67 -0
  221. package/dist/render/backend/webgpu/skinPaletteRing.js +97 -0
  222. package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +17 -0
  223. package/dist/render/backend/webgpu/skinPaletteTexture.js +68 -0
  224. package/dist/render/backend/webgpu/skyPass.d.ts +102 -0
  225. package/dist/render/backend/webgpu/skyPass.js +70 -0
  226. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +41 -0
  227. package/dist/render/backend/webgpu/surfaceTexturePass.js +228 -0
  228. package/dist/render/backend/webgpu/textPass.d.ts +73 -0
  229. package/dist/render/backend/webgpu/textPass.js +190 -0
  230. package/dist/render/backend/webgpu/uniformRing.d.ts +133 -0
  231. package/dist/render/backend/webgpu/uniformRing.js +208 -0
  232. package/dist/render/backend/webgpu/waterPass.d.ts +73 -0
  233. package/dist/render/backend/webgpu/waterPass.js +160 -0
  234. package/dist/render/backend/webgpu/windStreakPass.d.ts +46 -0
  235. package/dist/render/backend/webgpu/windStreakPass.js +153 -0
  236. package/dist/render/billboard.d.ts +27 -0
  237. package/dist/render/billboard.js +79 -0
  238. package/dist/render/bloomChain.d.ts +66 -0
  239. package/dist/render/bloomChain.js +83 -0
  240. package/dist/render/bloomPass.d.ts +54 -0
  241. package/dist/render/bloomPass.js +219 -0
  242. package/dist/render/boltBatch.d.ts +39 -0
  243. package/dist/render/boltBatch.js +121 -0
  244. package/dist/render/boltPool.d.ts +135 -0
  245. package/dist/render/boltPool.js +259 -0
  246. package/dist/render/boom.d.ts +46 -0
  247. package/dist/render/boom.js +81 -0
  248. package/dist/render/camera.d.ts +119 -0
  249. package/dist/render/camera.js +304 -0
  250. package/dist/render/causticsRenderer.d.ts +63 -0
  251. package/dist/render/causticsRenderer.js +119 -0
  252. package/dist/render/cinematicCamera.d.ts +102 -0
  253. package/dist/render/cinematicCamera.js +227 -0
  254. package/dist/render/clusteredLights.d.ts +260 -0
  255. package/dist/render/clusteredLights.js +479 -0
  256. package/dist/render/colourGrade.d.ts +62 -0
  257. package/dist/render/colourGrade.js +91 -0
  258. package/dist/render/compute.d.ts +74 -0
  259. package/dist/render/compute.js +8 -0
  260. package/dist/render/contextLoss.d.ts +32 -0
  261. package/dist/render/contextLoss.js +46 -0
  262. package/dist/render/debugLines.d.ts +75 -0
  263. package/dist/render/debugLines.js +281 -0
  264. package/dist/render/decalPass.d.ts +34 -0
  265. package/dist/render/decalPass.js +103 -0
  266. package/dist/render/decalProjector.d.ts +140 -0
  267. package/dist/render/decalProjector.js +282 -0
  268. package/dist/render/decalQueue.d.ts +53 -0
  269. package/dist/render/decalQueue.js +87 -0
  270. package/dist/render/depthConvention.d.ts +314 -0
  271. package/dist/render/depthConvention.js +346 -0
  272. package/dist/render/drawingBuffer.d.ts +52 -0
  273. package/dist/render/drawingBuffer.js +67 -0
  274. package/dist/render/emptyTexture.d.ts +60 -0
  275. package/dist/render/emptyTexture.js +103 -0
  276. package/dist/render/envProbeArray.d.ts +85 -0
  277. package/dist/render/envProbeArray.js +164 -0
  278. package/dist/render/equirectToCube.d.ts +54 -0
  279. package/dist/render/equirectToCube.js +123 -0
  280. package/dist/render/flockGeometry.d.ts +23 -0
  281. package/dist/render/flockGeometry.js +43 -0
  282. package/dist/render/flockRenderer.d.ts +37 -0
  283. package/dist/render/flockRenderer.js +70 -0
  284. package/dist/render/frame/arena.d.ts +32 -0
  285. package/dist/render/frame/arena.js +65 -0
  286. package/dist/render/frame/index.d.ts +18 -0
  287. package/dist/render/frame/index.js +4 -0
  288. package/dist/render/frame/replay.d.ts +34 -0
  289. package/dist/render/frame/replay.js +48 -0
  290. package/dist/render/frame/resources.d.ts +25 -0
  291. package/dist/render/frame/resources.js +55 -0
  292. package/dist/render/frame/schedule.d.ts +37 -0
  293. package/dist/render/frame/schedule.js +61 -0
  294. package/dist/render/frameView.d.ts +19 -0
  295. package/dist/render/frameView.js +1 -0
  296. package/dist/render/gizmo.d.ts +236 -0
  297. package/dist/render/gizmo.js +727 -0
  298. package/dist/render/globalMedium.d.ts +124 -0
  299. package/dist/render/globalMedium.js +100 -0
  300. package/dist/render/globalMediumPass.d.ts +101 -0
  301. package/dist/render/globalMediumPass.js +250 -0
  302. package/dist/render/gpuCapability.d.ts +111 -0
  303. package/dist/render/gpuCapability.js +194 -0
  304. package/dist/render/gpuTimer.d.ts +87 -0
  305. package/dist/render/gpuTimer.js +145 -0
  306. package/dist/render/halfFloat.d.ts +4 -0
  307. package/dist/render/halfFloat.js +38 -0
  308. package/dist/render/handleRegistry.d.ts +54 -0
  309. package/dist/render/handleRegistry.js +84 -0
  310. package/dist/render/iesProfile.d.ts +64 -0
  311. package/dist/render/iesProfile.js +179 -0
  312. package/dist/render/imageTexels.d.ts +50 -0
  313. package/dist/render/imageTexels.js +91 -0
  314. package/dist/render/instancedMesh.d.ts +48 -0
  315. package/dist/render/instancedMesh.js +127 -0
  316. package/dist/render/instances.d.ts +69 -0
  317. package/dist/render/instances.js +52 -0
  318. package/dist/render/lightBudget.d.ts +397 -0
  319. package/dist/render/lightBudget.js +524 -0
  320. package/dist/render/lightMatrix.d.ts +3 -0
  321. package/dist/render/lightMatrix.js +45 -0
  322. package/dist/render/lightVolumeDraw.d.ts +132 -0
  323. package/dist/render/lightVolumeDraw.js +181 -0
  324. package/dist/render/lineBatch.d.ts +60 -0
  325. package/dist/render/lineBatch.js +160 -0
  326. package/dist/render/linePoints.d.ts +33 -0
  327. package/dist/render/linePoints.js +46 -0
  328. package/dist/render/livePointShadowSet.d.ts +72 -0
  329. package/dist/render/livePointShadowSet.js +258 -0
  330. package/dist/render/lod.d.ts +35 -0
  331. package/dist/render/lod.js +65 -0
  332. package/dist/render/mesh.d.ts +177 -0
  333. package/dist/render/mesh.js +466 -0
  334. package/dist/render/occlusion.d.ts +81 -0
  335. package/dist/render/occlusion.js +378 -0
  336. package/dist/render/oitPass.d.ts +67 -0
  337. package/dist/render/oitPass.js +213 -0
  338. package/dist/render/orderIndependent.d.ts +92 -0
  339. package/dist/render/orderIndependent.js +108 -0
  340. package/dist/render/particleBatch.d.ts +140 -0
  341. package/dist/render/particleBatch.js +186 -0
  342. package/dist/render/particleMaterial.d.ts +54 -0
  343. package/dist/render/particleMaterial.js +42 -0
  344. package/dist/render/particlePool.d.ts +124 -0
  345. package/dist/render/particlePool.js +182 -0
  346. package/dist/render/pass.d.ts +195 -0
  347. package/dist/render/pass.js +9 -0
  348. package/dist/render/passTarget.d.ts +86 -0
  349. package/dist/render/passTarget.js +121 -0
  350. package/dist/render/pickable.d.ts +31 -0
  351. package/dist/render/pickable.js +172 -0
  352. package/dist/render/planarReflection.d.ts +59 -0
  353. package/dist/render/planarReflection.js +194 -0
  354. package/dist/render/planarReflectionDraw.d.ts +31 -0
  355. package/dist/render/planarReflectionDraw.js +65 -0
  356. package/dist/render/plumeGeometry.d.ts +25 -0
  357. package/dist/render/plumeGeometry.js +61 -0
  358. package/dist/render/plumeMaterial.d.ts +31 -0
  359. package/dist/render/plumeMaterial.js +64 -0
  360. package/dist/render/plumeRenderer.d.ts +96 -0
  361. package/dist/render/plumeRenderer.js +185 -0
  362. package/dist/render/pointLightSelection.d.ts +175 -0
  363. package/dist/render/pointLightSelection.js +301 -0
  364. package/dist/render/pointShadowArray.d.ts +95 -0
  365. package/dist/render/pointShadowArray.js +219 -0
  366. package/dist/render/pointShadowBudget.d.ts +118 -0
  367. package/dist/render/pointShadowBudget.js +221 -0
  368. package/dist/render/pointShadowImage.d.ts +265 -0
  369. package/dist/render/pointShadowImage.js +339 -0
  370. package/dist/render/pointShadowMap.d.ts +93 -0
  371. package/dist/render/pointShadowMap.js +167 -0
  372. package/dist/render/pointShadowSystem.d.ts +195 -0
  373. package/dist/render/pointShadowSystem.js +336 -0
  374. package/dist/render/prefilterEnvMap.d.ts +124 -0
  375. package/dist/render/prefilterEnvMap.js +146 -0
  376. package/dist/render/prefilterPass.d.ts +44 -0
  377. package/dist/render/prefilterPass.js +98 -0
  378. package/dist/render/probeGrid.d.ts +122 -0
  379. package/dist/render/probeGrid.js +174 -0
  380. package/dist/render/rainField.d.ts +99 -0
  381. package/dist/render/rainField.js +168 -0
  382. package/dist/render/reflectionProbe.d.ts +188 -0
  383. package/dist/render/reflectionProbe.js +437 -0
  384. package/dist/render/renderQuality.d.ts +699 -0
  385. package/dist/render/renderQuality.js +293 -0
  386. package/dist/render/rendererHarness.d.ts +39 -0
  387. package/dist/render/rendererHarness.js +185 -0
  388. package/dist/render/resolutionGovernor.d.ts +107 -0
  389. package/dist/render/resolutionGovernor.js +144 -0
  390. package/dist/render/scatterDeform.d.ts +17 -0
  391. package/dist/render/scatterDeform.js +46 -0
  392. package/dist/render/sceneTarget.d.ts +288 -0
  393. package/dist/render/sceneTarget.js +856 -0
  394. package/dist/render/screenSpaceReflection.d.ts +233 -0
  395. package/dist/render/screenSpaceReflection.js +415 -0
  396. package/dist/render/sdfFont.d.ts +77 -0
  397. package/dist/render/sdfFont.js +86 -0
  398. package/dist/render/sdfTextLayout.d.ts +46 -0
  399. package/dist/render/sdfTextLayout.js +145 -0
  400. package/dist/render/sdfTextRenderer.d.ts +75 -0
  401. package/dist/render/sdfTextRenderer.js +194 -0
  402. package/dist/render/seaState.d.ts +25 -0
  403. package/dist/render/seaState.js +34 -0
  404. package/dist/render/segmentQuads.d.ts +29 -0
  405. package/dist/render/segmentQuads.js +75 -0
  406. package/dist/render/shader.d.ts +5 -0
  407. package/dist/render/shader.js +172 -0
  408. package/dist/render/shaders/ambientOcclusion.d.ts +45 -0
  409. package/dist/render/shaders/ambientOcclusion.js +352 -0
  410. package/dist/render/shaders/arcane.d.ts +19 -0
  411. package/dist/render/shaders/arcane.js +102 -0
  412. package/dist/render/shaders/bloom.d.ts +70 -0
  413. package/dist/render/shaders/bloom.js +227 -0
  414. package/dist/render/shaders/bolt.d.ts +17 -0
  415. package/dist/render/shaders/bolt.js +161 -0
  416. package/dist/render/shaders/caustics.d.ts +38 -0
  417. package/dist/render/shaders/caustics.js +167 -0
  418. package/dist/render/shaders/conditionals.d.ts +21 -0
  419. package/dist/render/shaders/conditionals.js +55 -0
  420. package/dist/render/shaders/decalProject.d.ts +25 -0
  421. package/dist/render/shaders/decalProject.js +125 -0
  422. package/dist/render/shaders/depth.d.ts +14 -0
  423. package/dist/render/shaders/depth.js +114 -0
  424. package/dist/render/shaders/depthOfField.d.ts +41 -0
  425. package/dist/render/shaders/depthOfField.js +139 -0
  426. package/dist/render/shaders/film.d.ts +15 -0
  427. package/dist/render/shaders/film.js +283 -0
  428. package/dist/render/shaders/fire.d.ts +12 -0
  429. package/dist/render/shaders/fire.js +178 -0
  430. package/dist/render/shaders/flat/directionalShadow.d.ts +1 -0
  431. package/dist/render/shaders/flat/directionalShadow.js +195 -0
  432. package/dist/render/shaders/flat/index.d.ts +135 -0
  433. package/dist/render/shaders/flat/index.js +387 -0
  434. package/dist/render/shaders/flat/lobes.d.ts +1 -0
  435. package/dist/render/shaders/flat/lobes.js +398 -0
  436. package/dist/render/shaders/flat/main.d.ts +2 -0
  437. package/dist/render/shaders/flat/main.js +1630 -0
  438. package/dist/render/shaders/flat/pointShadow.d.ts +1 -0
  439. package/dist/render/shaders/flat/pointShadow.js +322 -0
  440. package/dist/render/shaders/flat/preamble.d.ts +15 -0
  441. package/dist/render/shaders/flat/preamble.js +864 -0
  442. package/dist/render/shaders/flat/probeGrid.d.ts +21 -0
  443. package/dist/render/shaders/flat/probeGrid.js +151 -0
  444. package/dist/render/shaders/flat/surface.d.ts +2 -0
  445. package/dist/render/shaders/flat/surface.js +40 -0
  446. package/dist/render/shaders/flock.d.ts +11 -0
  447. package/dist/render/shaders/flock.js +102 -0
  448. package/dist/render/shaders/fog.d.ts +37 -0
  449. package/dist/render/shaders/fog.js +98 -0
  450. package/dist/render/shaders/fullscreen.d.ts +16 -0
  451. package/dist/render/shaders/fullscreen.js +27 -0
  452. package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +65 -0
  453. package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +71 -0
  454. package/dist/render/shaders/generated/arcane.wgsl.d.ts +90 -0
  455. package/dist/render/shaders/generated/arcane.wgsl.js +96 -0
  456. package/dist/render/shaders/generated/bloom.wgsl.d.ts +69 -0
  457. package/dist/render/shaders/generated/bloom.wgsl.js +75 -0
  458. package/dist/render/shaders/generated/bolt.wgsl.d.ts +118 -0
  459. package/dist/render/shaders/generated/bolt.wgsl.js +124 -0
  460. package/dist/render/shaders/generated/caustics.wgsl.d.ts +118 -0
  461. package/dist/render/shaders/generated/caustics.wgsl.js +124 -0
  462. package/dist/render/shaders/generated/decalProject.wgsl.d.ts +61 -0
  463. package/dist/render/shaders/generated/decalProject.wgsl.js +67 -0
  464. package/dist/render/shaders/generated/depth.wgsl.d.ts +131 -0
  465. package/dist/render/shaders/generated/depth.wgsl.js +137 -0
  466. package/dist/render/shaders/generated/film.wgsl.d.ts +134 -0
  467. package/dist/render/shaders/generated/film.wgsl.js +140 -0
  468. package/dist/render/shaders/generated/fire.wgsl.d.ts +128 -0
  469. package/dist/render/shaders/generated/fire.wgsl.js +134 -0
  470. package/dist/render/shaders/generated/flat.wgsl.d.ts +9163 -0
  471. package/dist/render/shaders/generated/flat.wgsl.js +9192 -0
  472. package/dist/render/shaders/generated/flock.wgsl.d.ts +73 -0
  473. package/dist/render/shaders/generated/flock.wgsl.js +79 -0
  474. package/dist/render/shaders/generated/fullscreen.wgsl.d.ts +12 -0
  475. package/dist/render/shaders/generated/fullscreen.wgsl.js +18 -0
  476. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +130 -0
  477. package/dist/render/shaders/generated/globalMedium.wgsl.js +136 -0
  478. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +230 -0
  479. package/dist/render/shaders/generated/lightVolume.wgsl.js +239 -0
  480. package/dist/render/shaders/generated/line.wgsl.d.ts +128 -0
  481. package/dist/render/shaders/generated/line.wgsl.js +134 -0
  482. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +51 -0
  483. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +57 -0
  484. package/dist/render/shaders/generated/oitResolve.wgsl.d.ts +23 -0
  485. package/dist/render/shaders/generated/oitResolve.wgsl.js +29 -0
  486. package/dist/render/shaders/generated/panel.wgsl.d.ts +48 -0
  487. package/dist/render/shaders/generated/panel.wgsl.js +54 -0
  488. package/dist/render/shaders/generated/particle.wgsl.d.ts +332 -0
  489. package/dist/render/shaders/generated/particle.wgsl.js +338 -0
  490. package/dist/render/shaders/generated/prefilter.wgsl.d.ts +61 -0
  491. package/dist/render/shaders/generated/prefilter.wgsl.js +67 -0
  492. package/dist/render/shaders/generated/rush.wgsl.d.ts +131 -0
  493. package/dist/render/shaders/generated/rush.wgsl.js +137 -0
  494. package/dist/render/shaders/generated/scatter.wgsl.d.ts +195 -0
  495. package/dist/render/shaders/generated/scatter.wgsl.js +201 -0
  496. package/dist/render/shaders/generated/sdfText.wgsl.d.ts +69 -0
  497. package/dist/render/shaders/generated/sdfText.wgsl.js +75 -0
  498. package/dist/render/shaders/generated/sky.wgsl.d.ts +100 -0
  499. package/dist/render/shaders/generated/sky.wgsl.js +106 -0
  500. package/dist/render/shaders/generated/smoke.wgsl.d.ts +85 -0
  501. package/dist/render/shaders/generated/smoke.wgsl.js +91 -0
  502. package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +18 -0
  503. package/dist/render/shaders/generated/ssrResolve.wgsl.js +24 -0
  504. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +86 -0
  505. package/dist/render/shaders/generated/ssrTrace.wgsl.js +92 -0
  506. package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +46 -0
  507. package/dist/render/shaders/generated/temporalResolve.wgsl.js +52 -0
  508. package/dist/render/shaders/generated/text.wgsl.d.ts +98 -0
  509. package/dist/render/shaders/generated/text.wgsl.js +104 -0
  510. package/dist/render/shaders/generated/water.wgsl.d.ts +247 -0
  511. package/dist/render/shaders/generated/water.wgsl.js +253 -0
  512. package/dist/render/shaders/generated/windStreaks.wgsl.d.ts +73 -0
  513. package/dist/render/shaders/generated/windStreaks.wgsl.js +79 -0
  514. package/dist/render/shaders/gerstner.d.ts +21 -0
  515. package/dist/render/shaders/gerstner.js +110 -0
  516. package/dist/render/shaders/globalMedium.d.ts +56 -0
  517. package/dist/render/shaders/globalMedium.js +393 -0
  518. package/dist/render/shaders/lightVolume.d.ts +61 -0
  519. package/dist/render/shaders/lightVolume.js +527 -0
  520. package/dist/render/shaders/line.d.ts +18 -0
  521. package/dist/render/shaders/line.js +122 -0
  522. package/dist/render/shaders/morph.d.ts +26 -0
  523. package/dist/render/shaders/morph.js +61 -0
  524. package/dist/render/shaders/octahedral.d.ts +76 -0
  525. package/dist/render/shaders/octahedral.js +161 -0
  526. package/dist/render/shaders/octahedralResolve.d.ts +25 -0
  527. package/dist/render/shaders/octahedralResolve.js +81 -0
  528. package/dist/render/shaders/oitResolve.d.ts +17 -0
  529. package/dist/render/shaders/oitResolve.js +42 -0
  530. package/dist/render/shaders/outputTransform.d.ts +37 -0
  531. package/dist/render/shaders/outputTransform.js +106 -0
  532. package/dist/render/shaders/panel.d.ts +17 -0
  533. package/dist/render/shaders/panel.js +50 -0
  534. package/dist/render/shaders/particle.d.ts +82 -0
  535. package/dist/render/shaders/particle.js +431 -0
  536. package/dist/render/shaders/prefilter.d.ts +37 -0
  537. package/dist/render/shaders/prefilter.js +276 -0
  538. package/dist/render/shaders/rush.d.ts +21 -0
  539. package/dist/render/shaders/rush.js +355 -0
  540. package/dist/render/shaders/scatter.d.ts +14 -0
  541. package/dist/render/shaders/scatter.js +206 -0
  542. package/dist/render/shaders/sdfText.d.ts +9 -0
  543. package/dist/render/shaders/sdfText.js +65 -0
  544. package/dist/render/shaders/skinning.d.ts +17 -0
  545. package/dist/render/shaders/skinning.js +59 -0
  546. package/dist/render/shaders/sky.d.ts +10 -0
  547. package/dist/render/shaders/sky.js +242 -0
  548. package/dist/render/shaders/smoke.d.ts +8 -0
  549. package/dist/render/shaders/smoke.js +88 -0
  550. package/dist/render/shaders/ssrResolve.d.ts +15 -0
  551. package/dist/render/shaders/ssrResolve.js +28 -0
  552. package/dist/render/shaders/ssrTrace.d.ts +22 -0
  553. package/dist/render/shaders/ssrTrace.js +230 -0
  554. package/dist/render/shaders/tangentFrame.d.ts +17 -0
  555. package/dist/render/shaders/tangentFrame.js +70 -0
  556. package/dist/render/shaders/temporalResolve.d.ts +1 -0
  557. package/dist/render/shaders/temporalResolve.js +150 -0
  558. package/dist/render/shaders/text.d.ts +17 -0
  559. package/dist/render/shaders/text.js +155 -0
  560. package/dist/render/shaders/vertexChannel.d.ts +39 -0
  561. package/dist/render/shaders/vertexChannel.js +69 -0
  562. package/dist/render/shaders/water.d.ts +18 -0
  563. package/dist/render/shaders/water.js +354 -0
  564. package/dist/render/shaders/windStreaks.d.ts +14 -0
  565. package/dist/render/shaders/windStreaks.js +129 -0
  566. package/dist/render/shadowCasters.d.ts +107 -0
  567. package/dist/render/shadowCasters.js +1 -0
  568. package/dist/render/shadowMap.d.ts +10 -0
  569. package/dist/render/shadowMap.js +80 -0
  570. package/dist/render/shotPlacement.d.ts +80 -0
  571. package/dist/render/shotPlacement.js +183 -0
  572. package/dist/render/skinPalette.d.ts +90 -0
  573. package/dist/render/skinPalette.js +136 -0
  574. package/dist/render/ssrPass.d.ts +59 -0
  575. package/dist/render/ssrPass.js +196 -0
  576. package/dist/render/surfaceSheet.d.ts +52 -0
  577. package/dist/render/surfaceSheet.js +99 -0
  578. package/dist/render/surfaceTexture.d.ts +197 -0
  579. package/dist/render/surfaceTexture.js +116 -0
  580. package/dist/render/temporalAa.d.ts +104 -0
  581. package/dist/render/temporalAa.js +194 -0
  582. package/dist/render/temporalPass.d.ts +54 -0
  583. package/dist/render/temporalPass.js +135 -0
  584. package/dist/render/textLayout.d.ts +88 -0
  585. package/dist/render/textLayout.js +201 -0
  586. package/dist/render/textRenderer.d.ts +32 -0
  587. package/dist/render/textRenderer.js +176 -0
  588. package/dist/render/thirdPersonCamera.d.ts +272 -0
  589. package/dist/render/thirdPersonCamera.js +479 -0
  590. package/dist/render/trample.d.ts +57 -0
  591. package/dist/render/trample.js +134 -0
  592. package/dist/render/translucentQueue.d.ts +76 -0
  593. package/dist/render/translucentQueue.js +90 -0
  594. package/dist/render/uniformVectorBudget.d.ts +105 -0
  595. package/dist/render/uniformVectorBudget.js +201 -0
  596. package/dist/render/uploadStep.d.ts +14 -0
  597. package/dist/render/uploadStep.js +14 -0
  598. package/dist/render/vertexDefaults.d.ts +48 -0
  599. package/dist/render/vertexDefaults.js +111 -0
  600. package/dist/render/visibility.d.ts +22 -0
  601. package/dist/render/visibility.js +47 -0
  602. package/dist/render/waterDraw.d.ts +57 -0
  603. package/dist/render/waterDraw.js +102 -0
  604. package/dist/render/waterGrid.d.ts +62 -0
  605. package/dist/render/waterGrid.js +151 -0
  606. package/dist/render/waterRenderer.d.ts +163 -0
  607. package/dist/render/waterRenderer.js +165 -0
  608. package/dist/render/wind.d.ts +45 -0
  609. package/dist/render/wind.js +32 -0
  610. package/dist/render/windField.d.ts +34 -0
  611. package/dist/render/windField.js +13 -0
  612. package/dist/render/windStreakDraw.d.ts +73 -0
  613. package/dist/render/windStreakDraw.js +86 -0
  614. package/dist/render/windStreakRenderer.d.ts +37 -0
  615. package/dist/render/windStreakRenderer.js +86 -0
  616. package/dist/scene/node.d.ts +128 -0
  617. package/dist/scene/node.js +319 -0
  618. package/dist/scene/visit.d.ts +38 -0
  619. package/dist/scene/visit.js +43 -0
  620. package/dist/ui/clipMime.d.ts +46 -0
  621. package/dist/ui/clipMime.js +88 -0
  622. package/dist/ui/exportTarget.d.ts +305 -0
  623. package/dist/ui/exportTarget.js +368 -0
  624. package/dist/ui/frameOverlay.d.ts +59 -0
  625. package/dist/ui/frameOverlay.js +76 -0
  626. package/dist/ui/framePacer.d.ts +142 -0
  627. package/dist/ui/framePacer.js +284 -0
  628. package/dist/ui/frameRecorder.d.ts +188 -0
  629. package/dist/ui/frameRecorder.js +221 -0
  630. package/dist/ui/fullscreen.d.ts +72 -0
  631. package/dist/ui/fullscreen.js +92 -0
  632. package/dist/ui/pixelCursor.d.ts +28 -0
  633. package/dist/ui/pixelCursor.js +66 -0
  634. package/dist/ui/splash.d.ts +86 -0
  635. package/dist/ui/splash.js +300 -0
  636. package/dist/ui/stillFrame.d.ts +22 -0
  637. package/dist/ui/stillFrame.js +40 -0
  638. package/package.json +60 -0
  639. package/src/behavior/behaviorTree.ts +346 -0
  640. package/src/build/shaderComments.ts +0 -0
  641. package/src/cinematic/player.ts +209 -0
  642. package/src/cinematic/script.ts +231 -0
  643. package/src/core/bootGate.ts +49 -0
  644. package/src/core/loadTracker.ts +144 -0
  645. package/src/core/loop.ts +211 -0
  646. package/src/core/messageQueue.ts +145 -0
  647. package/src/core/onceSet.ts +65 -0
  648. package/src/core/preferences.ts +177 -0
  649. package/src/core/remoteSave.ts +347 -0
  650. package/src/core/rng.ts +101 -0
  651. package/src/core/stepBudget.ts +136 -0
  652. package/src/core/storage.ts +114 -0
  653. package/src/core/tickTrace.ts +129 -0
  654. package/src/core/timeCurve.ts +175 -0
  655. package/src/core/withDefaults.ts +28 -0
  656. package/src/dev/contactProbe.ts +115 -0
  657. package/src/dev/fpsMeter.ts +101 -0
  658. package/src/environment/celestialClock.ts +385 -0
  659. package/src/geometry/decal.ts +260 -0
  660. package/src/geometry/filmPatch.ts +158 -0
  661. package/src/geometry/growable.ts +165 -0
  662. package/src/geometry/lightVolume.ts +161 -0
  663. package/src/geometry/meshBuilder.ts +1397 -0
  664. package/src/geometry/pixelFont.ts +189 -0
  665. package/src/geometry/ribbon.ts +790 -0
  666. package/src/geometry/shellFill.ts +265 -0
  667. package/src/geometry/spline.ts +659 -0
  668. package/src/geometry/tangents.ts +173 -0
  669. package/src/geometry/textMesh.ts +96 -0
  670. package/src/geometry/treeBuilder.ts +114 -0
  671. package/src/host/display.ts +180 -0
  672. package/src/host/files.ts +77 -0
  673. package/src/host/lifecycle.ts +63 -0
  674. package/src/host/platformServices.ts +23 -0
  675. package/src/host/screen.ts +134 -0
  676. package/src/index.ts +730 -0
  677. package/src/input/actionMap.ts +377 -0
  678. package/src/input/activeDevice.ts +86 -0
  679. package/src/input/gamepadIdentity.ts +131 -0
  680. package/src/input/gamepadMapping.ts +121 -0
  681. package/src/input/input.ts +872 -0
  682. package/src/input/inputHarness.ts +226 -0
  683. package/src/input/rightGesture.ts +76 -0
  684. package/src/input/rumble.ts +138 -0
  685. package/src/input/touchControls.ts +451 -0
  686. package/src/input/typingTarget.ts +26 -0
  687. package/src/math/bounds.ts +153 -0
  688. package/src/math/color.ts +37 -0
  689. package/src/math/exact.ts +274 -0
  690. package/src/math/frustum.ts +115 -0
  691. package/src/math/intersect.ts +228 -0
  692. package/src/math/scalar.ts +109 -0
  693. package/src/math/spring.ts +106 -0
  694. package/src/nav/navGraph.ts +168 -0
  695. package/src/nav/navPath.ts +217 -0
  696. package/src/nav/navSearch.ts +200 -0
  697. package/src/physics/boxSurface.ts +96 -0
  698. package/src/physics/colliderSurface.ts +213 -0
  699. package/src/physics/compositeSurface.ts +111 -0
  700. package/src/physics/heightSurface.ts +234 -0
  701. package/src/physics/ribbonSurface.ts +642 -0
  702. package/src/render/ambientOcclusionPass.ts +200 -0
  703. package/src/render/areaLights.ts +194 -0
  704. package/src/render/areaShadowSet.ts +405 -0
  705. package/src/render/atmosphere.ts +186 -0
  706. package/src/render/backend/api.ts +802 -0
  707. package/src/render/backend/budget.ts +139 -0
  708. package/src/render/backend/createRenderer.ts +343 -0
  709. package/src/render/backend/deadline.ts +37 -0
  710. package/src/render/backend/probe.ts +152 -0
  711. package/src/render/backend/select.ts +288 -0
  712. package/src/render/backend/timer.ts +59 -0
  713. package/src/render/backend/webgl2/instanced.ts +46 -0
  714. package/src/render/backend/webgl2/morphTexture.ts +58 -0
  715. package/src/render/backend/webgl2/renderer.ts +7484 -0
  716. package/src/render/backend/webgl2/skinPaletteTexture.ts +70 -0
  717. package/src/render/backend/webgpu/boltPass.ts +205 -0
  718. package/src/render/backend/webgpu/buffers.ts +553 -0
  719. package/src/render/backend/webgpu/causticsPass.ts +174 -0
  720. package/src/render/backend/webgpu/clusterBinner.ts +259 -0
  721. package/src/render/backend/webgpu/depthPass.ts +261 -0
  722. package/src/render/backend/webgpu/device.ts +148 -0
  723. package/src/render/backend/webgpu/drawCommand.ts +79 -0
  724. package/src/render/backend/webgpu/environmentTexels.ts +96 -0
  725. package/src/render/backend/webgpu/filmPass.ts +123 -0
  726. package/src/render/backend/webgpu/flatPass.ts +635 -0
  727. package/src/render/backend/webgpu/flockPass.ts +163 -0
  728. package/src/render/backend/webgpu/gpuTimestamps.ts +255 -0
  729. package/src/render/backend/webgpu/insetPass.ts +123 -0
  730. package/src/render/backend/webgpu/instanced.ts +55 -0
  731. package/src/render/backend/webgpu/lightVolumePass.ts +203 -0
  732. package/src/render/backend/webgpu/linePass.ts +270 -0
  733. package/src/render/backend/webgpu/morphTexture.ts +61 -0
  734. package/src/render/backend/webgpu/panelPass.ts +138 -0
  735. package/src/render/backend/webgpu/particlePass.ts +370 -0
  736. package/src/render/backend/webgpu/pipelineCache.ts +152 -0
  737. package/src/render/backend/webgpu/plumePass.ts +292 -0
  738. package/src/render/backend/webgpu/pointShadowPass.ts +368 -0
  739. package/src/render/backend/webgpu/postPass.ts +470 -0
  740. package/src/render/backend/webgpu/probePass.ts +218 -0
  741. package/src/render/backend/webgpu/reflectionPass.ts +137 -0
  742. package/src/render/backend/webgpu/renderer.ts +13004 -0
  743. package/src/render/backend/webgpu/scatterPass.ts +354 -0
  744. package/src/render/backend/webgpu/sdfTextPass.ts +220 -0
  745. package/src/render/backend/webgpu/shaderModules.ts +49 -0
  746. package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +219 -0
  747. package/src/render/backend/webgpu/skinPaletteRing.ts +105 -0
  748. package/src/render/backend/webgpu/skinPaletteTexture.ts +79 -0
  749. package/src/render/backend/webgpu/skyPass.ts +85 -0
  750. package/src/render/backend/webgpu/surfaceTexturePass.ts +257 -0
  751. package/src/render/backend/webgpu/textPass.ts +224 -0
  752. package/src/render/backend/webgpu/uniformRing.ts +228 -0
  753. package/src/render/backend/webgpu/waterPass.ts +211 -0
  754. package/src/render/backend/webgpu/windStreakPass.ts +196 -0
  755. package/src/render/billboard.ts +108 -0
  756. package/src/render/bloomChain.ts +101 -0
  757. package/src/render/bloomPass.ts +256 -0
  758. package/src/render/boltBatch.ts +141 -0
  759. package/src/render/boltPool.ts +360 -0
  760. package/src/render/boom.ts +123 -0
  761. package/src/render/camera.ts +348 -0
  762. package/src/render/causticsRenderer.ts +171 -0
  763. package/src/render/cinematicCamera.ts +278 -0
  764. package/src/render/clusteredLights.ts +598 -0
  765. package/src/render/colourGrade.ts +109 -0
  766. package/src/render/compute.ts +83 -0
  767. package/src/render/contextLoss.ts +50 -0
  768. package/src/render/debugLines.ts +411 -0
  769. package/src/render/decalPass.ts +124 -0
  770. package/src/render/decalProjector.ts +390 -0
  771. package/src/render/decalQueue.ts +110 -0
  772. package/src/render/depthConvention.ts +383 -0
  773. package/src/render/drawingBuffer.ts +89 -0
  774. package/src/render/emptyTexture.ts +130 -0
  775. package/src/render/envProbeArray.ts +201 -0
  776. package/src/render/equirectToCube.ts +160 -0
  777. package/src/render/flockGeometry.ts +53 -0
  778. package/src/render/flockRenderer.ts +111 -0
  779. package/src/render/frame/arena.ts +93 -0
  780. package/src/render/frame/index.ts +29 -0
  781. package/src/render/frame/replay.ts +50 -0
  782. package/src/render/frame/resources.ts +61 -0
  783. package/src/render/frame/schedule.ts +85 -0
  784. package/src/render/frameView.ts +20 -0
  785. package/src/render/gizmo.ts +923 -0
  786. package/src/render/globalMedium.ts +154 -0
  787. package/src/render/globalMediumPass.ts +323 -0
  788. package/src/render/gpuCapability.ts +244 -0
  789. package/src/render/gpuTimer.ts +182 -0
  790. package/src/render/halfFloat.ts +39 -0
  791. package/src/render/handleRegistry.ts +96 -0
  792. package/src/render/iesProfile.ts +215 -0
  793. package/src/render/imageTexels.ts +109 -0
  794. package/src/render/instancedMesh.ts +187 -0
  795. package/src/render/instances.ts +92 -0
  796. package/src/render/lightBudget.ts +655 -0
  797. package/src/render/lightMatrix.ts +69 -0
  798. package/src/render/lightVolumeDraw.ts +216 -0
  799. package/src/render/lineBatch.ts +180 -0
  800. package/src/render/linePoints.ts +61 -0
  801. package/src/render/livePointShadowSet.ts +285 -0
  802. package/src/render/lod.ts +86 -0
  803. package/src/render/mesh.ts +536 -0
  804. package/src/render/occlusion.ts +406 -0
  805. package/src/render/oitPass.ts +230 -0
  806. package/src/render/orderIndependent.ts +136 -0
  807. package/src/render/particleBatch.ts +299 -0
  808. package/src/render/particleMaterial.ts +84 -0
  809. package/src/render/particlePool.ts +291 -0
  810. package/src/render/pass.ts +203 -0
  811. package/src/render/passTarget.ts +225 -0
  812. package/src/render/pickable.ts +222 -0
  813. package/src/render/planarReflection.ts +233 -0
  814. package/src/render/planarReflectionDraw.ts +87 -0
  815. package/src/render/plumeGeometry.ts +75 -0
  816. package/src/render/plumeMaterial.ts +99 -0
  817. package/src/render/plumeRenderer.ts +272 -0
  818. package/src/render/pointLightSelection.ts +447 -0
  819. package/src/render/pointShadowArray.ts +276 -0
  820. package/src/render/pointShadowBudget.ts +305 -0
  821. package/src/render/pointShadowImage.ts +470 -0
  822. package/src/render/pointShadowMap.ts +228 -0
  823. package/src/render/pointShadowSystem.ts +408 -0
  824. package/src/render/prefilterEnvMap.ts +162 -0
  825. package/src/render/prefilterPass.ts +115 -0
  826. package/src/render/probeGrid.ts +248 -0
  827. package/src/render/rainField.ts +240 -0
  828. package/src/render/reflectionProbe.ts +530 -0
  829. package/src/render/renderQuality.ts +1054 -0
  830. package/src/render/rendererHarness.ts +214 -0
  831. package/src/render/resolutionGovernor.ts +189 -0
  832. package/src/render/scatterDeform.ts +72 -0
  833. package/src/render/sceneTarget.ts +1032 -0
  834. package/src/render/screenSpaceReflection.ts +524 -0
  835. package/src/render/sdfFont.ts +157 -0
  836. package/src/render/sdfTextLayout.ts +206 -0
  837. package/src/render/sdfTextRenderer.ts +233 -0
  838. package/src/render/seaState.ts +55 -0
  839. package/src/render/segmentQuads.ts +92 -0
  840. package/src/render/shader.ts +190 -0
  841. package/src/render/shaders/ambientOcclusion.ts +354 -0
  842. package/src/render/shaders/arcane.ts +103 -0
  843. package/src/render/shaders/bloom.ts +232 -0
  844. package/src/render/shaders/bolt.ts +164 -0
  845. package/src/render/shaders/caustics.ts +169 -0
  846. package/src/render/shaders/conditionals.ts +58 -0
  847. package/src/render/shaders/decalProject.ts +127 -0
  848. package/src/render/shaders/depth.ts +131 -0
  849. package/src/render/shaders/depthOfField.ts +141 -0
  850. package/src/render/shaders/film.ts +285 -0
  851. package/src/render/shaders/fire.ts +180 -0
  852. package/src/render/shaders/flat/directionalShadow.ts +196 -0
  853. package/src/render/shaders/flat/index.ts +502 -0
  854. package/src/render/shaders/flat/lobes.ts +399 -0
  855. package/src/render/shaders/flat/main.ts +1631 -0
  856. package/src/render/shaders/flat/pointShadow.ts +323 -0
  857. package/src/render/shaders/flat/preamble.ts +875 -0
  858. package/src/render/shaders/flat/probeGrid.ts +152 -0
  859. package/src/render/shaders/flat/surface.ts +41 -0
  860. package/src/render/shaders/flock.ts +103 -0
  861. package/src/render/shaders/fog.ts +99 -0
  862. package/src/render/shaders/fullscreen.ts +28 -0
  863. package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +74 -0
  864. package/src/render/shaders/generated/arcane.wgsl.ts +98 -0
  865. package/src/render/shaders/generated/bloom.wgsl.ts +79 -0
  866. package/src/render/shaders/generated/bolt.wgsl.ts +127 -0
  867. package/src/render/shaders/generated/caustics.wgsl.ts +127 -0
  868. package/src/render/shaders/generated/decalProject.wgsl.ts +69 -0
  869. package/src/render/shaders/generated/depth.wgsl.ts +142 -0
  870. package/src/render/shaders/generated/film.wgsl.ts +143 -0
  871. package/src/render/shaders/generated/fire.wgsl.ts +137 -0
  872. package/src/render/shaders/generated/flat.wgsl.ts +9195 -0
  873. package/src/render/shaders/generated/flock.wgsl.ts +82 -0
  874. package/src/render/shaders/generated/fullscreen.wgsl.ts +20 -0
  875. package/src/render/shaders/generated/globalMedium.wgsl.ts +139 -0
  876. package/src/render/shaders/generated/lightVolume.wgsl.ts +242 -0
  877. package/src/render/shaders/generated/line.wgsl.ts +137 -0
  878. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +60 -0
  879. package/src/render/shaders/generated/oitResolve.wgsl.ts +31 -0
  880. package/src/render/shaders/generated/panel.wgsl.ts +57 -0
  881. package/src/render/shaders/generated/particle.wgsl.ts +343 -0
  882. package/src/render/shaders/generated/prefilter.wgsl.ts +69 -0
  883. package/src/render/shaders/generated/rush.wgsl.ts +139 -0
  884. package/src/render/shaders/generated/scatter.wgsl.ts +205 -0
  885. package/src/render/shaders/generated/sdfText.wgsl.ts +78 -0
  886. package/src/render/shaders/generated/sky.wgsl.ts +109 -0
  887. package/src/render/shaders/generated/smoke.wgsl.ts +93 -0
  888. package/src/render/shaders/generated/ssrResolve.wgsl.ts +26 -0
  889. package/src/render/shaders/generated/ssrTrace.wgsl.ts +94 -0
  890. package/src/render/shaders/generated/temporalResolve.wgsl.ts +54 -0
  891. package/src/render/shaders/generated/text.wgsl.ts +107 -0
  892. package/src/render/shaders/generated/water.wgsl.ts +256 -0
  893. package/src/render/shaders/generated/windStreaks.wgsl.ts +82 -0
  894. package/src/render/shaders/gerstner.ts +110 -0
  895. package/src/render/shaders/globalMedium.ts +396 -0
  896. package/src/render/shaders/lightVolume.ts +546 -0
  897. package/src/render/shaders/line.ts +125 -0
  898. package/src/render/shaders/morph.ts +62 -0
  899. package/src/render/shaders/octahedral.ts +170 -0
  900. package/src/render/shaders/octahedralResolve.ts +83 -0
  901. package/src/render/shaders/oitResolve.ts +42 -0
  902. package/src/render/shaders/outputTransform.ts +107 -0
  903. package/src/render/shaders/panel.ts +51 -0
  904. package/src/render/shaders/particle.ts +438 -0
  905. package/src/render/shaders/prefilter.ts +278 -0
  906. package/src/render/shaders/rush.ts +357 -0
  907. package/src/render/shaders/scatter.ts +211 -0
  908. package/src/render/shaders/sdfText.ts +68 -0
  909. package/src/render/shaders/skinning.ts +59 -0
  910. package/src/render/shaders/sky.ts +243 -0
  911. package/src/render/shaders/smoke.ts +89 -0
  912. package/src/render/shaders/ssrResolve.ts +28 -0
  913. package/src/render/shaders/ssrTrace.ts +233 -0
  914. package/src/render/shaders/tangentFrame.ts +70 -0
  915. package/src/render/shaders/temporalResolve.ts +151 -0
  916. package/src/render/shaders/text.ts +156 -0
  917. package/src/render/shaders/vertexChannel.ts +71 -0
  918. package/src/render/shaders/water.ts +356 -0
  919. package/src/render/shaders/windStreaks.ts +130 -0
  920. package/src/render/shadowCasters.ts +124 -0
  921. package/src/render/shadowMap.ts +89 -0
  922. package/src/render/shotPlacement.ts +266 -0
  923. package/src/render/skinPalette.ts +157 -0
  924. package/src/render/ssrPass.ts +241 -0
  925. package/src/render/surfaceSheet.ts +158 -0
  926. package/src/render/surfaceTexture.ts +310 -0
  927. package/src/render/temporalAa.ts +221 -0
  928. package/src/render/temporalPass.ts +153 -0
  929. package/src/render/textLayout.ts +239 -0
  930. package/src/render/textRenderer.ts +201 -0
  931. package/src/render/thirdPersonCamera.ts +578 -0
  932. package/src/render/trample.ts +140 -0
  933. package/src/render/translucentQueue.ts +161 -0
  934. package/src/render/uniformVectorBudget.ts +246 -0
  935. package/src/render/uploadStep.ts +14 -0
  936. package/src/render/vertexDefaults.ts +115 -0
  937. package/src/render/visibility.ts +56 -0
  938. package/src/render/waterDraw.ts +167 -0
  939. package/src/render/waterGrid.ts +180 -0
  940. package/src/render/waterRenderer.ts +352 -0
  941. package/src/render/wind.ts +79 -0
  942. package/src/render/windField.ts +50 -0
  943. package/src/render/windStreakDraw.ts +131 -0
  944. package/src/render/windStreakRenderer.ts +130 -0
  945. package/src/scene/node.ts +336 -0
  946. package/src/scene/visit.ts +82 -0
  947. package/src/ui/clipMime.ts +109 -0
  948. package/src/ui/exportTarget.ts +491 -0
  949. package/src/ui/frameOverlay.ts +159 -0
  950. package/src/ui/framePacer.ts +351 -0
  951. package/src/ui/frameRecorder.ts +333 -0
  952. package/src/ui/fullscreen.ts +113 -0
  953. package/src/ui/pixelCursor.ts +99 -0
  954. package/src/ui/splash.ts +347 -0
  955. package/src/ui/stillFrame.ts +44 -0
@@ -0,0 +1,451 @@
1
+ /** Configurable two-zone mobile controls over raw touch input. */
2
+
3
+ import type { TouchPoint } from './input.ts';
4
+ import { InputSource } from './input.ts';
5
+
6
+ export interface TouchControlsOptions {
7
+ /**
8
+ * The two nodes the stick is *drawn* with, when a caller wants one drawn.
9
+ *
10
+ * **Optional, and that is a correction rather than a convenience.** These were positional
11
+ * arguments and read as dependencies — a consumer who could not reach the page concluded the
12
+ * class needed two elements to work, and constructed two `div`s it never appended anywhere so
13
+ * the input maths would run. It does not need them: they are an *output channel*, written to and
14
+ * never read. Every touch comes from `input.target`, and every number this class reports is
15
+ * computed without either node.
16
+ *
17
+ * So absent means the stick has no visible representation and the controls work exactly as they
18
+ * did, which is what a consumer drawing its own HUD, drawing none, or forbidden the page wants.
19
+ * `stickBase` takes `hidden` and a position; `stickNub` takes a transform.
20
+ */
21
+ stickBase?: HTMLElement;
22
+ stickNub?: HTMLElement;
23
+ /** Fraction of the input surface assigned to the dynamic stick. */
24
+ splitRatio?: number;
25
+ stickRadiusPx?: number;
26
+ stickDeadzone?: number;
27
+ gestureMovePx?: number;
28
+ holdResolveMs?: number;
29
+ /**
30
+ * How long a touch may last and still fire the primary on release.
31
+ *
32
+ * The press fires on release, so this duration *is* the action's input
33
+ * latency, and a caller whose action has a grace window of its own — a
34
+ * platformer's coyote time — wants the two sized against each other. Set it
35
+ * past that window and a tap begun at the edge of a drop resolves after the
36
+ * body is unjumpably in the air.
37
+ */
38
+ tapMaxMs?: number;
39
+ /**
40
+ * Whether holding the second zone still also *fires* the primary, or only holds it.
41
+ *
42
+ * The default is only-holds, and it is the fix for a real complaint from phone
43
+ * testing: a still thumb kept firing the primary action, so there was no way to hold
44
+ * position and look. A thumb placed down and held is what looking around
45
+ * *starts* with, so resolving it into a press fires the action every time somebody
46
+ * lines up a camera move. There is no threshold that separates "still thumb" from
47
+ * "about to look", because they are the same input.
48
+ *
49
+ * A tap still fires on release, which is where the intent actually is; and the hold
50
+ * still reports `primaryHeld`, so a caller whose action has a held form — a glide, a
51
+ * charge — keeps it. Only the *edge* from a motionless press is gone.
52
+ *
53
+ * The promotion is not a verdict, and reading it as one is what later ate the tap:
54
+ * a touch promoted to the hold and released quickly is still a tap, because the
55
+ * player's thumb did the thing a tap is. See `isTapRelease`.
56
+ */
57
+ fireOnHold?: boolean;
58
+ swipeMaxMs?: number;
59
+ /** Vertical travel divided by horizontal travel required for a swipe. */
60
+ swipeDominance?: number;
61
+ }
62
+
63
+ import { classifyRightGesture, isTapRelease } from './rightGesture.ts';
64
+
65
+ type RightMode = 'pending' | 'look' | 'secondary' | 'primary-hold';
66
+
67
+ /**
68
+ * Second-zone touches beyond the first, and what they may do.
69
+ *
70
+ * The first thumb in the zone owns everything continuous: the look, and the
71
+ * held form of the primary. Anything after it owns only *edges* — a tap, a
72
+ * flick — because two fingers contributing look at once is one camera being
73
+ * dragged in two directions, which is a worse control than the one this fixes.
74
+ *
75
+ * They exist at all because the zone used to drop every touch after the first
76
+ * outright: a player steering through a corner could not jump out of it without
77
+ * letting go of the corner.
78
+ */
79
+ const EXTRA_SLOTS = 3;
80
+ const NO_TOUCH = -1;
81
+
82
+ /**
83
+ * A reusable mobile scheme: dynamic stick on the first zone; look plus a
84
+ * primary tap/hold and secondary downward swipe on the second. The class
85
+ * reports generic control state. A game decides whether those signals mean
86
+ * jump, fire, crouch, slide, or anything else.
87
+ */
88
+ export class TouchControls {
89
+ moveX = 0;
90
+ moveY = 0;
91
+ primaryHeld = false;
92
+ secondaryHeld = false;
93
+ onFirstTouch: (() => void) | null = null;
94
+
95
+ private primaryQueued = false;
96
+ private lookDx = 0;
97
+ private lookDy = 0;
98
+ private leftId: number | null = null;
99
+ private rightId: number | null = null;
100
+ private rightMode: RightMode = 'pending';
101
+ private rightLastX = 0;
102
+ private rightLastY = 0;
103
+ /** Greatest distance the owning touch has reached from where it landed. */
104
+ private rightTravel = 0;
105
+ private rightStart: TouchPoint | null = null;
106
+ private firstTouchSeen = false;
107
+
108
+ /*
109
+ * The extra second-zone touches, as parallel fixed arrays: a touch event
110
+ * arrives as often as a frame does while a thumb is down, so nothing on this
111
+ * path may allocate.
112
+ */
113
+ private readonly extraIds = new Int32Array(EXTRA_SLOTS).fill(NO_TOUCH);
114
+ private readonly extraTravel = new Float32Array(EXTRA_SLOTS);
115
+ private readonly extraSliding = new Uint8Array(EXTRA_SLOTS);
116
+ /** Whether the owning touch is the one holding the secondary. */
117
+ private ownerSliding = false;
118
+
119
+ private readonly stickBase: HTMLElement | null;
120
+ private readonly stickNub: HTMLElement | null;
121
+ private readonly surface: HTMLElement;
122
+ private readonly splitRatio: number;
123
+ private readonly stickRadiusPx: number;
124
+ private readonly stickDeadzone: number;
125
+ private readonly gestureMovePx: number;
126
+ private readonly holdResolveMs: number;
127
+ private readonly tapMaxMs: number;
128
+ private readonly fireOnHold: boolean;
129
+ private readonly swipeMaxMs: number;
130
+ private readonly swipeDominance: number;
131
+ private readonly unsubscribe: () => void;
132
+
133
+ /**
134
+ * Take the input surface, and optionally the two nodes the stick is drawn with.
135
+ *
136
+ * **Two forms, and the older one is kept working rather than deprecated.** It was
137
+ * `(input, stickBase, stickNub, options)`, which put an output channel where a reader expects a
138
+ * dependency — a consumer forbidden the page read the signature, concluded the class could not be
139
+ * used without two `HTMLElement`s, and built two it threw away. The options form says what is
140
+ * true: the elements are how the stick is *drawn*, and drawing it is optional.
141
+ *
142
+ * `new TouchControls(input)` is a working control scheme with no visible stick.
143
+ */
144
+ constructor(input: InputSource, options?: TouchControlsOptions);
145
+ constructor(
146
+ input: InputSource,
147
+ stickBase: HTMLElement,
148
+ stickNub: HTMLElement,
149
+ options?: TouchControlsOptions,
150
+ );
151
+ constructor(
152
+ input: InputSource,
153
+ second: HTMLElement | TouchControlsOptions = {},
154
+ third?: HTMLElement,
155
+ fourth: TouchControlsOptions = {},
156
+ ) {
157
+ /*
158
+ * **A third argument means the positional form, and nothing about the second is inspected.**
159
+ *
160
+ * Sniffing the second argument was tried first and is wrong: `instanceof HTMLElement` needs a
161
+ * DOM constructor this package is checked without, and duck-typing on `nodeType` reads a
162
+ * stand-in element as an options object — which this file's own harness supplies, so the first
163
+ * version silently dropped every option a positional caller passed. The arity carries the
164
+ * answer without asking what anything is.
165
+ */
166
+ const positional = third !== undefined;
167
+ const options: TouchControlsOptions = positional ? fourth : (second as TouchControlsOptions);
168
+ this.stickBase = positional ? (second as HTMLElement) : (options.stickBase ?? null);
169
+ this.stickNub = positional ? (third ?? null) : (options.stickNub ?? null);
170
+ this.surface = input.target;
171
+ this.splitRatio = options.splitRatio ?? 0.5;
172
+ this.stickRadiusPx = options.stickRadiusPx ?? 40;
173
+ this.stickDeadzone = options.stickDeadzone ?? 0.12;
174
+ /*
175
+ * Twenty rather than fourteen: a thumb rolls a little as it lands, and at
176
+ * fourteen that roll turned a tap into a two-degree camera nudge. Nothing
177
+ * is lost at the start of a look, because the travel that resolves one is
178
+ * credited to it (see `onMove`).
179
+ */
180
+ this.gestureMovePx = options.gestureMovePx ?? 20;
181
+ this.holdResolveMs = options.holdResolveMs ?? 90;
182
+ this.tapMaxMs = options.tapMaxMs ?? 180;
183
+ this.fireOnHold = options.fireOnHold ?? false;
184
+ this.swipeMaxMs = options.swipeMaxMs ?? 160;
185
+ this.swipeDominance = options.swipeDominance ?? 2.4;
186
+ this.validateOptions();
187
+ this.unsubscribe = input.subscribe({
188
+ onTouchStart: (touch) => this.onStart(touch),
189
+ onTouchMove: (touch) => this.onMove(touch),
190
+ onTouchEnd: (touch, durationMs) => this.onEnd(touch, durationMs),
191
+ });
192
+ }
193
+
194
+ /** Resolve a still second-zone touch into the generic primary hold. */
195
+ tick(nowMs: number): void {
196
+ const start = this.rightStart;
197
+ if (this.rightMode !== 'pending' || start === null) return;
198
+ if (nowMs - start.startTime >= this.holdResolveMs) {
199
+ // Held, not fired: see `fireOnHold`. A motionless thumb is somebody deciding
200
+ // where to look, and firing under it is the bug this exists to prevent.
201
+ if (this.fireOnHold) this.primaryQueued = true;
202
+ this.primaryHeld = true;
203
+ this.rightMode = 'primary-hold';
204
+ }
205
+ }
206
+
207
+ /** Consume the primary edge exactly once. */
208
+ consumePrimaryPress(): boolean {
209
+ const queued = this.primaryQueued;
210
+ this.primaryQueued = false;
211
+ return queued;
212
+ }
213
+
214
+ /** Drain accumulated second-zone look motion into a caller-owned object. */
215
+ consumeLook(out: { dx: number; dy: number }): void {
216
+ out.dx = this.lookDx;
217
+ out.dy = this.lookDy;
218
+ this.lookDx = 0;
219
+ this.lookDy = 0;
220
+ }
221
+
222
+ dispose(): void {
223
+ this.unsubscribe();
224
+ if (this.stickBase !== null) this.stickBase.hidden = true;
225
+ this.moveX = 0;
226
+ this.moveY = 0;
227
+ this.primaryHeld = false;
228
+ this.secondaryHeld = false;
229
+ this.ownerSliding = false;
230
+ this.extraIds.fill(NO_TOUCH);
231
+ this.extraSliding.fill(0);
232
+ }
233
+
234
+ private onStart(touch: TouchPoint): void {
235
+ if (!this.firstTouchSeen) {
236
+ this.firstTouchSeen = true;
237
+ this.onFirstTouch?.();
238
+ }
239
+ const bounds = this.surface.getBoundingClientRect();
240
+ const splitX = bounds.left + bounds.width * this.splitRatio;
241
+ if (touch.startX < splitX) {
242
+ if (this.leftId !== null) return;
243
+ this.leftId = touch.id;
244
+ this.showStick(touch.startX, touch.startY);
245
+ return;
246
+ }
247
+ if (this.rightId !== null) {
248
+ this.claimExtra(touch.id);
249
+ return;
250
+ }
251
+ this.rightId = touch.id;
252
+ this.rightMode = 'pending';
253
+ this.rightStart = touch;
254
+ this.rightTravel = 0;
255
+ this.rightLastX = touch.x;
256
+ this.rightLastY = touch.y;
257
+ }
258
+
259
+ private onMove(touch: TouchPoint): void {
260
+ if (touch.id === this.leftId) {
261
+ this.updateStick(touch);
262
+ return;
263
+ }
264
+ if (touch.id !== this.rightId) {
265
+ this.moveExtra(touch);
266
+ return;
267
+ }
268
+
269
+ const dx = touch.x - touch.startX;
270
+ const dy = touch.y - touch.startY;
271
+ this.rightTravel = Math.max(this.rightTravel, Math.hypot(dx, dy));
272
+
273
+ if (this.rightMode === 'pending') {
274
+ const gesture = this.classify(touch, dx, dy);
275
+ if (gesture === 'secondary') {
276
+ this.rightMode = 'secondary';
277
+ this.ownerSliding = true;
278
+ this.secondaryHeld = true;
279
+ } else if (gesture === 'look') {
280
+ this.rightMode = 'look';
281
+ /*
282
+ * Credit the travel that resolved the gesture. Starting the count from
283
+ * here instead threw away the first dozen pixels of every drag, which
284
+ * is a dead zone at the start of each look and reads as the camera
285
+ * being slow to respond rather than as an input being dropped.
286
+ */
287
+ this.lookDx += dx;
288
+ this.lookDy += dy;
289
+ this.rightLastX = touch.x;
290
+ this.rightLastY = touch.y;
291
+ }
292
+ } else if (this.rightMode === 'look' || this.rightMode === 'primary-hold') {
293
+ /*
294
+ * A held thumb still looks, and keeps holding while it does.
295
+ *
296
+ * The hold used to be a terminal state: once a motionless touch resolved
297
+ * into it, the same thumb could no longer move the camera for the rest of
298
+ * its life. That is the wrong half of the input to freeze — the held form
299
+ * is for verbs that last (a glide), and a verb that lasts is exactly the
300
+ * one you need to steer through.
301
+ */
302
+ this.lookDx += touch.x - this.rightLastX;
303
+ this.lookDy += touch.y - this.rightLastY;
304
+ }
305
+ this.rightLastX = touch.x;
306
+ this.rightLastY = touch.y;
307
+ }
308
+
309
+ private onEnd(touch: TouchPoint, durationMs: number): void {
310
+ if (touch.id === this.leftId) {
311
+ this.leftId = null;
312
+ this.moveX = 0;
313
+ this.moveY = 0;
314
+ if (this.stickBase !== null) this.stickBase.hidden = true;
315
+ return;
316
+ }
317
+ if (touch.id !== this.rightId) {
318
+ this.endExtra(touch, durationMs);
319
+ return;
320
+ }
321
+
322
+ /*
323
+ * `primary-hold` counts as a tap here, and that is the fix. It is the state
324
+ * a still thumb is promoted into after `holdResolveMs`, so the old test —
325
+ * fire only from `pending` — threw away every tap slower than 90 ms, which
326
+ * on a phone is most of them. `isTapRelease` decides on travel and duration
327
+ * instead, which is what a tap actually is.
328
+ */
329
+ if (
330
+ (this.rightMode === 'pending' || this.rightMode === 'primary-hold') &&
331
+ this.isTap(this.rightTravel, durationMs)
332
+ ) {
333
+ this.primaryQueued = true;
334
+ }
335
+ if (this.rightMode === 'secondary') {
336
+ this.ownerSliding = false;
337
+ this.refreshSecondary();
338
+ }
339
+ if (this.rightMode === 'primary-hold') this.primaryHeld = false;
340
+ this.rightId = null;
341
+ this.rightStart = null;
342
+ this.rightMode = 'pending';
343
+ this.rightTravel = 0;
344
+ }
345
+
346
+ private claimExtra(id: number): void {
347
+ for (let i = 0; i < EXTRA_SLOTS; i++) {
348
+ if (this.extraIds[i] !== NO_TOUCH) continue;
349
+ this.extraIds[i] = id;
350
+ this.extraTravel[i] = 0;
351
+ this.extraSliding[i] = 0;
352
+ return;
353
+ }
354
+ }
355
+
356
+ private extraSlot(id: number): number {
357
+ for (let i = 0; i < EXTRA_SLOTS; i++) {
358
+ if (this.extraIds[i] === id) return i;
359
+ }
360
+ return -1;
361
+ }
362
+
363
+ private moveExtra(touch: TouchPoint): void {
364
+ const slot = this.extraSlot(touch.id);
365
+ if (slot < 0) return;
366
+ const dx = touch.x - touch.startX;
367
+ const dy = touch.y - touch.startY;
368
+ this.extraTravel[slot] = Math.max(this.extraTravel[slot] ?? 0, Math.hypot(dx, dy));
369
+ // A flick still reads as one from any finger. A drag does not become a
370
+ // look: the owning thumb has the camera, and a second one joining it would
371
+ // make every two-thumb frame a fight over the same axis.
372
+ if (this.extraSliding[slot] === 0 && this.classify(touch, dx, dy) === 'secondary') {
373
+ this.extraSliding[slot] = 1;
374
+ this.secondaryHeld = true;
375
+ }
376
+ }
377
+
378
+ private endExtra(touch: TouchPoint, durationMs: number): void {
379
+ const slot = this.extraSlot(touch.id);
380
+ if (slot < 0) return;
381
+ if (this.isTap(this.extraTravel[slot] ?? 0, durationMs)) this.primaryQueued = true;
382
+ this.extraIds[slot] = NO_TOUCH;
383
+ this.extraSliding[slot] = 0;
384
+ this.refreshSecondary();
385
+ }
386
+
387
+ /** The secondary is held while *any* touch in the zone is holding it. */
388
+ private refreshSecondary(): void {
389
+ let held = this.ownerSliding;
390
+ for (let i = 0; i < EXTRA_SLOTS && !held; i++) held = this.extraSliding[i] === 1;
391
+ this.secondaryHeld = held;
392
+ }
393
+
394
+ private classify(touch: TouchPoint, dx: number, dy: number) {
395
+ return classifyRightGesture(dx, dy, performance.now() - touch.startTime, {
396
+ gestureMovePx: this.gestureMovePx,
397
+ swipeMaxMs: this.swipeMaxMs,
398
+ swipeDominance: this.swipeDominance,
399
+ });
400
+ }
401
+
402
+ private isTap(travelPx: number, durationMs: number): boolean {
403
+ return isTapRelease(travelPx, durationMs, {
404
+ gestureMovePx: this.gestureMovePx,
405
+ tapMaxMs: this.tapMaxMs,
406
+ });
407
+ }
408
+
409
+ private showStick(x: number, y: number): void {
410
+ if (this.stickBase !== null) {
411
+ this.stickBase.style.left = `${x}px`;
412
+ this.stickBase.style.top = `${y}px`;
413
+ this.stickBase.hidden = false;
414
+ }
415
+ if (this.stickNub !== null) this.stickNub.style.transform = 'translate3d(0, 0, 0)';
416
+ }
417
+
418
+ private updateStick(touch: TouchPoint): void {
419
+ const dx = touch.x - touch.startX;
420
+ const dy = touch.y - touch.startY;
421
+ const length = Math.hypot(dx, dy);
422
+ const strength = Math.min(length / this.stickRadiusPx, 1);
423
+
424
+ if (strength < this.stickDeadzone || length < 1e-6) {
425
+ this.moveX = 0;
426
+ this.moveY = 0;
427
+ } else {
428
+ this.moveX = (dx / length) * strength;
429
+ this.moveY = (-dy / length) * strength;
430
+ }
431
+
432
+ const clampedLength = Math.min(length, this.stickRadiusPx);
433
+ const nx = length > 1e-6 ? (dx / length) * clampedLength : 0;
434
+ const ny = length > 1e-6 ? (dy / length) * clampedLength : 0;
435
+ if (this.stickNub !== null) {
436
+ this.stickNub.style.transform = `translate3d(${nx}px, ${ny}px, 0)`;
437
+ }
438
+ }
439
+
440
+ private validateOptions(): void {
441
+ if (this.splitRatio <= 0 || this.splitRatio >= 1) {
442
+ throw new Error(`TouchControls.splitRatio must be between 0 and 1, got ${this.splitRatio}`);
443
+ }
444
+ if (this.stickRadiusPx <= 0) {
445
+ throw new Error(`TouchControls.stickRadiusPx must be positive, got ${this.stickRadiusPx}`);
446
+ }
447
+ if (this.stickDeadzone < 0 || this.stickDeadzone >= 1) {
448
+ throw new Error(`TouchControls.stickDeadzone must be in [0, 1), got ${this.stickDeadzone}`);
449
+ }
450
+ }
451
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Whether the keystroke belongs to a text field rather than to the game.
3
+ *
4
+ * An input layer that swallows keys while somebody is typing is a text field that
5
+ * silently drops characters. A consumer found this the hard way: it asks for
6
+ * `Space`, `KeyE` and the arrows to be `preventDefault`ed — reasonably, since Space
7
+ * scrolls the page and the arrows move it — and a player writing a bug report could
8
+ * not type a space, an `e`, or move the caret.
9
+ *
10
+ * Game-agnostic and deliberately conservative: it asks what the event is *for*, not
11
+ * what the game wants. A consumer that genuinely wants keys while a field has focus
12
+ * can read `keys` directly; nothing here stops that.
13
+ */
14
+ const TYPING_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);
15
+
16
+ /**
17
+ * `INPUT` covers buttons and checkboxes too, which do not take text — but a Space on a
18
+ * focused button is the browser's own "press it", so leaving those alone is right for
19
+ * the same reason.
20
+ */
21
+ export function isTypingTarget(target: EventTarget | null): boolean {
22
+ if (target === null) return false;
23
+ const element = target as Partial<HTMLElement> & { tagName?: string };
24
+ if (typeof element.tagName === 'string' && TYPING_TAGS.has(element.tagName)) return true;
25
+ return element.isContentEditable === true;
26
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * How big a piece of geometry is, and where it sits.
3
+ *
4
+ * **Nothing in this engine knew either until now**, which is why there has never been a frustum
5
+ * test: a renderer cannot decide whether a mesh is on screen without knowing what part of space
6
+ * it occupies. `CAPABILITIES.md` recorded the consequence — no draw culling at all, only backface
7
+ * — and every track on the roadmap that wants culling, level of detail, a broadphase or a
8
+ * bounding gizmo wants this object first.
9
+ *
10
+ * Both a box and a sphere, because the two answer different questions cheaply. A sphere survives
11
+ * an arbitrary transform as a sphere, which makes it the right shape for a per-draw visibility
12
+ * test; a box is tighter and is what a physics broadphase and an editor's selection want.
13
+ */
14
+ export interface Bounds {
15
+ /** The axis-aligned box, in the geometry's own space. */
16
+ readonly min: Float32Array;
17
+ readonly max: Float32Array;
18
+ /** The box's midpoint, which is what the radius is measured from. */
19
+ readonly centre: Float32Array;
20
+ /** The furthest vertex from `centre`. See `boundsOfPositions` for why not half the diagonal. */
21
+ radius: number;
22
+ }
23
+
24
+ export function createBounds(): Bounds {
25
+ return {
26
+ min: new Float32Array(3),
27
+ max: new Float32Array(3),
28
+ centre: new Float32Array(3),
29
+ radius: 0,
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Measure a vertex array, into bounds the caller owns.
35
+ *
36
+ * **Two passes, and the second one is the point.** The first finds the box; the second finds the
37
+ * furthest vertex from the box's midpoint. Half the diagonal would be one pass and would be the
38
+ * box's circumradius — right for a box, and loose for anything rounded, which is most geometry.
39
+ * A sphere that reaches the corners of a box the geometry never visits answers every test too
40
+ * generously, and the cost is a second walk of an array that is already in cache.
41
+ *
42
+ * **Measured about the box's centre and never about the origin.** A mesh modelled a kilometre
43
+ * from the origin gets a kilometre-wide sphere the other way, and culls nothing for the rest of
44
+ * its life.
45
+ *
46
+ * Allocates nothing: `out` is the caller's and is returned for convenience.
47
+ */
48
+ export function boundsOfPositions(positions: Float32Array, out: Bounds): Bounds {
49
+ /* Whole vertices only. A trailing partial one has no third component and cannot be placed;
50
+ reading it as a zero would drag the box to the origin. */
51
+ const vertices = Math.floor(positions.length / 3);
52
+ if (vertices === 0) {
53
+ out.min.fill(0);
54
+ out.max.fill(0);
55
+ out.centre.fill(0);
56
+ out.radius = 0;
57
+ return out;
58
+ }
59
+
60
+ let minX = Infinity;
61
+ let minY = Infinity;
62
+ let minZ = Infinity;
63
+ let maxX = -Infinity;
64
+ let maxY = -Infinity;
65
+ let maxZ = -Infinity;
66
+ for (let i = 0; i < vertices; i += 1) {
67
+ const x = positions[i * 3] ?? 0;
68
+ const y = positions[i * 3 + 1] ?? 0;
69
+ const z = positions[i * 3 + 2] ?? 0;
70
+ if (x < minX) minX = x;
71
+ if (y < minY) minY = y;
72
+ if (z < minZ) minZ = z;
73
+ if (x > maxX) maxX = x;
74
+ if (y > maxY) maxY = y;
75
+ if (z > maxZ) maxZ = z;
76
+ }
77
+
78
+ out.min[0] = minX;
79
+ out.min[1] = minY;
80
+ out.min[2] = minZ;
81
+ out.max[0] = maxX;
82
+ out.max[1] = maxY;
83
+ out.max[2] = maxZ;
84
+
85
+ const cx = (minX + maxX) * 0.5;
86
+ const cy = (minY + maxY) * 0.5;
87
+ const cz = (minZ + maxZ) * 0.5;
88
+ out.centre[0] = cx;
89
+ out.centre[1] = cy;
90
+ out.centre[2] = cz;
91
+
92
+ let furthest = 0;
93
+ for (let i = 0; i < vertices; i += 1) {
94
+ const dx = (positions[i * 3] ?? 0) - cx;
95
+ const dy = (positions[i * 3 + 1] ?? 0) - cy;
96
+ const dz = (positions[i * 3 + 2] ?? 0) - cz;
97
+ const squared = dx * dx + dy * dy + dz * dz;
98
+ if (squared > furthest) furthest = squared;
99
+ }
100
+ out.radius = Math.sqrt(furthest);
101
+ return out;
102
+ }
103
+
104
+ /**
105
+ * Bounds for a box the caller names itself, into bounds the caller owns.
106
+ *
107
+ * **`boundsOfPositions` was the only way to make one of these, and it demands a vertex array.**
108
+ * A consumer that wants to ask the renderer about a region rather than about a mesh — a streamed
109
+ * world testing its squares, a trigger volume, a room — has no vertices to hand it, so making the
110
+ * object meant filling `centre` and `radius` by hand and getting the sphere's invariant right. A
111
+ * consumer measured what that costs: with one mesh per material per square, a two-kilometre ring
112
+ * is 1,618 draws it walks one at a time, where the world itself knows 68 squares it could have
113
+ * tested instead.
114
+ *
115
+ * **Here the radius *is* half the diagonal**, which is the opposite of what `boundsOfPositions`
116
+ * does and is right for the same reason. That function measures the furthest actual vertex,
117
+ * because a mesh's corners are usually empty; a named box has no vertices and its corners are
118
+ * exactly the points it promises to contain, so anything tighter would report a region as off
119
+ * screen while part of it is on.
120
+ *
121
+ * Degenerate is allowed: a flat square gives a real box and a real radius, and a caller that
122
+ * passes a max below a min gets those values back rather than a silent swap — the box it asked
123
+ * for is the box it gets, and an inverted one is a bug at the call site.
124
+ */
125
+ export function boundsOfBox(
126
+ minX: number,
127
+ minY: number,
128
+ minZ: number,
129
+ maxX: number,
130
+ maxY: number,
131
+ maxZ: number,
132
+ out: Bounds,
133
+ ): Bounds {
134
+ out.min[0] = minX;
135
+ out.min[1] = minY;
136
+ out.min[2] = minZ;
137
+ out.max[0] = maxX;
138
+ out.max[1] = maxY;
139
+ out.max[2] = maxZ;
140
+
141
+ const cx = (minX + maxX) * 0.5;
142
+ const cy = (minY + maxY) * 0.5;
143
+ const cz = (minZ + maxZ) * 0.5;
144
+ out.centre[0] = cx;
145
+ out.centre[1] = cy;
146
+ out.centre[2] = cz;
147
+
148
+ const dx = maxX - cx;
149
+ const dy = maxY - cy;
150
+ const dz = maxZ - cz;
151
+ out.radius = Math.sqrt(dx * dx + dy * dy + dz * dz);
152
+ return out;
153
+ }
@@ -0,0 +1,37 @@
1
+ /** RGB triplet, each channel in [0, 1]. Mutable tuple for direct uniform upload. */
2
+ export type Vec3 = [number, number, number];
3
+
4
+ /** hue in degrees (any range), saturation/lightness in [0, 1]. */
5
+ export function hslToRgb(hue: number, saturation: number, lightness: number): Vec3 {
6
+ const h = ((hue % 360) + 360) % 360;
7
+ const c = (1 - Math.abs(2 * lightness - 1)) * saturation;
8
+ const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
9
+ const m = lightness - c / 2;
10
+
11
+ let r = 0;
12
+ let g = 0;
13
+ let b = 0;
14
+ if (h < 60) [r, g, b] = [c, x, 0];
15
+ else if (h < 120) [r, g, b] = [x, c, 0];
16
+ else if (h < 180) [r, g, b] = [0, c, x];
17
+ else if (h < 240) [r, g, b] = [0, x, c];
18
+ else if (h < 300) [r, g, b] = [x, 0, c];
19
+ else [r, g, b] = [c, 0, x];
20
+
21
+ return [r + m, g + m, b + m];
22
+ }
23
+
24
+ export function mixColor(a: Vec3, b: Vec3, t: number): Vec3 {
25
+ return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t, a[2] + (b[2] - a[2]) * t];
26
+ }
27
+
28
+ /** In-place `mixColor` for per-frame use — allocating here would be a hot-path bug. */
29
+ export function mixColorInto(out: Vec3, a: Vec3, b: Vec3, t: number): void {
30
+ out[0] = a[0] + (b[0] - a[0]) * t;
31
+ out[1] = a[1] + (b[1] - a[1]) * t;
32
+ out[2] = a[2] + (b[2] - a[2]) * t;
33
+ }
34
+
35
+ export function scaleColor(color: Vec3, factor: number): Vec3 {
36
+ return [color[0] * factor, color[1] * factor, color[2] * factor];
37
+ }