@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,479 @@
1
+ /** Collision-safe, configurable third-person orbit camera rig. */
2
+ /**
3
+ * Stations along the arm at which the ground is queried.
4
+ *
5
+ * Eight over a five-metre boom is a station every 60 cm, which is finer than the
6
+ * `Boom` smoothing that consumes the answer can respond to anyway. The cost is eight
7
+ * surface queries a frame on a path that already does a box sweep.
8
+ */
9
+ const GROUND_SAMPLES = 8;
10
+ import { clamp, damp, dampTracking } from '../math/scalar.js';
11
+ import { Boom } from './boom.js';
12
+ import { segmentHit } from '@driftengine/physics';
13
+ import { createSurfaceHit } from '../physics/ribbonSurface.js';
14
+ import { Camera } from './camera.js';
15
+ /**
16
+ * Generic camera mechanism. The caller supplies its already-resolved target
17
+ * height and desired FOV, keeping crouch rules and speed effects in the game.
18
+ */
19
+ export class ThirdPersonCamera {
20
+ colliders;
21
+ options;
22
+ surface;
23
+ obstruction;
24
+ camera = new Camera();
25
+ smoothX = 0;
26
+ smoothY = 0;
27
+ smoothZ = 0;
28
+ /**
29
+ * Where the target was last frame, so its velocity can be differenced out of it.
30
+ *
31
+ * **Differenced here rather than asked of the caller**, because every caller already hands the
32
+ * target over each frame and a second parameter for something derivable from the first is a
33
+ * signature every consumer has to be told about. It is exact for a target moving smoothly, which
34
+ * a vehicle under a fixed step with interpolation is: the engine's own harness measures the
35
+ * subject holding its world speed to within a twentieth of a per cent through frame jitter that
36
+ * moves this camera by 5%.
37
+ */
38
+ /**
39
+ * The frame the arm is built in. World axes unless a caller says otherwise.
40
+ *
41
+ * **The arm used to be a spherical boom about world Y** — `-sin(yaw) cos(pitch)`, `-sin(pitch)`,
42
+ * `cos(yaw) cos(pitch)` — so a subject standing on a wall or a ceiling got an arm that still
43
+ * swung about world up, and the rig placed the eye through the surface the subject was standing
44
+ * on. `groundClear` cut the arm where the eye would go under the deck, which is the same
45
+ * assumption a second time.
46
+ *
47
+ * The rig already anticipated this case and stopped one step short of it: `targetRoll`'s comment
48
+ * says the rig knows nothing about banked surfaces, only that a camera can be tilted, and damps
49
+ * roll here so a subject snapping between surfaces cannot snap the view. The arm is carried the
50
+ * same distance now. Yaw and pitch keep their meaning and become angles inside this frame, so a
51
+ * caller that never sets one gets exactly the arm it always got.
52
+ */
53
+ boomUpX = 0;
54
+ boomUpY = 1;
55
+ boomUpZ = 0;
56
+ /**
57
+ * The frame's forward, **readable because a caller that sets one needs to know what it became**.
58
+ *
59
+ * Both `setBoomUp` and `setBoomForward` orthogonalise against the other axis, so what the rig
60
+ * holds is rarely the vector it was handed — and a caller computing a roll, or asking where its
61
+ * subject's heading ended up, needs the one the arm is actually built from. Assigning these
62
+ * directly does not rebuild the frame; the two setters are what keep the three axes orthonormal.
63
+ */
64
+ boomForwardX = 0;
65
+ boomForwardY = 0;
66
+ boomForwardZ = 1;
67
+ boomRightX = 1;
68
+ boomRightY = 0;
69
+ boomRightZ = 0;
70
+ lastTargetX = 0;
71
+ lastTargetY = 0;
72
+ lastTargetZ = 0;
73
+ fov;
74
+ roll = 0;
75
+ snapped = false;
76
+ /**
77
+ * The arm out to the camera, and its speed limits.
78
+ *
79
+ * This rig used to apply the collision query's fraction directly. The query is a
80
+ * step function — a railing either blocks the arm or it does not — so the camera
81
+ * jumped by up to 4 m in a single frame every time one swept across it. That is
82
+ * the same artefact the replay camera was fixed for after it was reported as
83
+ * juddering and jumpy; this rig simply never got the fix, and a railed descent
84
+ * is where it would be worst.
85
+ */
86
+ boom;
87
+ /** Reused by the ground query; the rig allocates nothing per frame. */
88
+ groundHit = createSurfaceHit();
89
+ /**
90
+ * @param surface The walkable ground, where the caller has one. **Not optional in
91
+ * practice**, and the reason is worth stating: `colliders` is not the whole world.
92
+ * A consumer whose drivable surface is a banked ribbon cannot put it in the collider
93
+ * set — a world-axis box around a banked cross-section has a flat lid at its highest
94
+ * corner, which is floor where nothing is drawn and a wall where the next slab's lid
95
+ * stands above the character's feet. So that surface is invisible to `segmentHit`, and a
96
+ * boom tested only against boxes passes straight through the deck.
97
+ *
98
+ * Which is exactly what it did. On a descent, pitching the view down put the eye
99
+ * *under the track*, with the deck between the camera and the character: the rig sees the
100
+ * underside of the surface instead of the character, because dynamic surfaces are not
101
+ * part of what it tests against. Worse in replays, where the camera moves far more than
102
+ * a player ever moves it.
103
+ */
104
+ constructor(colliders, options, surface = null,
105
+ /**
106
+ * A world query for the arm, instead of the collider set.
107
+ *
108
+ * Fourth and defaulted, so no existing call site changes — the same shape `surface` was added
109
+ * in. When it is given, `colliders` is not consulted at all: a caller with one has the whole
110
+ * world behind it and a set of boxes beside it would be a second, partial answer to the same
111
+ * question. See `BoomObstruction` for why one consumer could not supply the set.
112
+ */
113
+ obstruction = null) {
114
+ this.colliders = colliders;
115
+ this.options = options;
116
+ this.surface = surface;
117
+ this.obstruction = obstruction;
118
+ validateOptions(options);
119
+ this.boom = new Boom(options.boomTiming);
120
+ this.camera.pitch = options.initialPitch;
121
+ this.camera.fovYDeg = options.initialFovYDeg;
122
+ this.fov = options.initialFovYDeg;
123
+ }
124
+ /**
125
+ * Place the rig outright on the next update instead of gliding to it.
126
+ *
127
+ * The first update already does this — a camera that eases in from the origin
128
+ * on the first frame of a session is a swoop nobody asked for. This re-arms it,
129
+ * for a subject that has *moved without travelling*: a scrub bar dropped
130
+ * somewhere else in a replay, or a character put back on a checkpoint. Smoothing
131
+ * across that is a camera flying the length of the route with nothing in frame,
132
+ * which the replay camera has already been measured doing at 124 m in a single
133
+ * shot.
134
+ *
135
+ * Only the caller can tell that apart from a legitimately fast frame, which is
136
+ * why it is a method here rather than a distance threshold in `update`.
137
+ */
138
+ /**
139
+ * How far out the arm may reach before the eye would drop below the ground, as a
140
+ * fraction of its length. 1 when the ground is nowhere near it.
141
+ *
142
+ * Sampled from the far end inward and returned on the first clear station, because the
143
+ * useful answer is the *longest* arm that works. `boomRadius` of clearance, so the eye
144
+ * stops above the deck rather than grazing it — the same margin the box query uses.
145
+ */
146
+ groundClear(boomX, boomY, boomZ, minFraction) {
147
+ const surface = this.surface;
148
+ if (surface === null)
149
+ return 1;
150
+ /*
151
+ * **A surface answers a height for an (x, z), so it describes a world-Y deck and nothing
152
+ * else.** "Under the deck" and "behind the support plane" are the same sentence only while up
153
+ * is world up; in any other frame this sampler has already chosen which axis is vertical and
154
+ * there is no reading of it that means what this test means. So it is skipped rather than
155
+ * approximated, and the arm is left to the collision sweep, which is frame-agnostic and is the
156
+ * instrument that actually stops the eye entering geometry.
157
+ */
158
+ if (this.boomUpY < 0.999)
159
+ return 1;
160
+ const hit = this.groundHit;
161
+ const clearance = this.options.boomRadius;
162
+ for (let i = GROUND_SAMPLES; i >= 1; i--) {
163
+ const t = i / GROUND_SAMPLES;
164
+ if (t < minFraction)
165
+ break;
166
+ const y = this.smoothY + boomY * t;
167
+ if (!surface.sample(this.smoothX + boomX * t, this.smoothZ + boomZ * t, hit, y))
168
+ return t;
169
+ if (y >= hit.y + clearance)
170
+ return t;
171
+ }
172
+ return minFraction;
173
+ }
174
+ /**
175
+ * Point the boom's up at a direction; the rest of the frame follows it.
176
+ *
177
+ * **Forward is carried from the frame it had rather than derived from a world axis**, which is
178
+ * what makes a body walking from a floor onto a wall and onto a ceiling continuous. Deriving it
179
+ * from a fixed reference would be one line shorter and would put a pole wherever `up` lined up
180
+ * with that reference: the arm would swing through a half turn as a subject crossed it, on a rig
181
+ * whose whole job is that the view does not snap.
182
+ *
183
+ * The fallbacks are only reached when the carried forward has become parallel to the new up,
184
+ * which a continuous rotation cannot do in one step and a teleport can. World Z first and world
185
+ * X behind it, so there is always an answer and it is never a normalised zero.
186
+ *
187
+ * A zero-length vector keeps the frame it had, for the reason `setUp` on the character
188
+ * controller gives: a NaN basis is a camera that is nowhere, and every number downstream of it
189
+ * reads as a rig that has failed rather than as an argument that was refused.
190
+ */
191
+ setBoomUp(x, y, z) {
192
+ const length = Math.sqrt(x * x + y * y + z * z);
193
+ if (length < 1e-6)
194
+ return;
195
+ const ux = x / length;
196
+ const uy = y / length;
197
+ const uz = z / length;
198
+ if (this.setBasis(ux, uy, uz, this.boomForwardX, this.boomForwardY, this.boomForwardZ))
199
+ return;
200
+ if (this.setBasis(ux, uy, uz, 0, 0, 1))
201
+ return;
202
+ this.setBasis(ux, uy, uz, 1, 0, 0);
203
+ }
204
+ /**
205
+ * Point the boom's forward at a direction; the up is kept and the arm is rebuilt around it.
206
+ *
207
+ * **For a subject that has a heading of its own, which the carried forward cannot express.**
208
+ * `setBoomUp` keeps whatever forward the frame had, re-projected — the right default, because it
209
+ * is what makes a body walking from a floor onto a wall continuous, and because most subjects
210
+ * have no heading to speak of. What it cannot say is "behind *this*": a yaw of π puts the eye
211
+ * opposite a forward the caller never chose and, until this existed, could not read either. A
212
+ * subject spawning face-on to a wall got a shot framed at random, and a caller trying to work out
213
+ * how far to roll so that the support surface sits at the bottom of the picture had to know where
214
+ * the arm was — an azimuth measured from an axis nothing reported.
215
+ *
216
+ * **This is not a reversal of the carried forward and does not change it for anyone.** A caller
217
+ * that never calls this carries its forward exactly as before, and one that does still has it
218
+ * re-orthogonalised by every `setBoomUp` — the heading is a direction in the world, and the frame
219
+ * it lands in is the surface's.
220
+ *
221
+ * A zero-length vector, or one parallel to the current up, keeps the frame it had. **Deliberately
222
+ * not the fallback chain `setBoomUp` uses**, and the asymmetry is the point: that method must
223
+ * produce *some* forward because the up is what changed and a frame needs one, so an arbitrary
224
+ * axis is better than none. Here the forward is the argument, and answering a direction the
225
+ * caller did not ask for is precisely the failure this exists to fix.
226
+ */
227
+ setBoomForward(x, y, z) {
228
+ const length = Math.sqrt(x * x + y * y + z * z);
229
+ if (length < 1e-6)
230
+ return;
231
+ this.setBasis(this.boomUpX, this.boomUpY, this.boomUpZ, x / length, y / length, z / length);
232
+ }
233
+ /**
234
+ * Build the three axes from an up and a candidate forward, or answer false and change nothing.
235
+ *
236
+ * Shared by both setters so that "orthogonalised against the other axis" means one piece of
237
+ * arithmetic rather than two that have to be kept in step. False is the parallel case: there is
238
+ * no forward perpendicular to an up it is already parallel to, and what each caller does about
239
+ * that is the one thing they do differently.
240
+ */
241
+ setBasis(ux, uy, uz, fx, fy, fz) {
242
+ const into = fx * ux + fy * uy + fz * uz;
243
+ const px = fx - ux * into;
244
+ const py = fy - uy * into;
245
+ const pz = fz - uz * into;
246
+ const len = Math.sqrt(px * px + py * py + pz * pz);
247
+ if (len <= 1e-4)
248
+ return false;
249
+ this.boomUpX = ux;
250
+ this.boomUpY = uy;
251
+ this.boomUpZ = uz;
252
+ this.boomForwardX = px / len;
253
+ this.boomForwardY = py / len;
254
+ this.boomForwardZ = pz / len;
255
+ /* Right-handed with the pair above, which is what makes yaw turn the way it always did. */
256
+ this.boomRightX = uy * this.boomForwardZ - uz * this.boomForwardY;
257
+ this.boomRightY = uz * this.boomForwardX - ux * this.boomForwardZ;
258
+ this.boomRightZ = ux * this.boomForwardY - uy * this.boomForwardX;
259
+ return true;
260
+ }
261
+ snap() {
262
+ this.snapped = false;
263
+ }
264
+ /**
265
+ * How much of the arm is clear of the world, from whichever source the rig was given.
266
+ *
267
+ * The injected query wins outright where there is one, for the reason its own type gives: a
268
+ * caller with the whole world behind it does not also want a partial answer from a box set.
269
+ */
270
+ blockedFraction(boomX, boomY, boomZ) {
271
+ const radius = this.options.boomRadius;
272
+ if (this.obstruction === null) {
273
+ return segmentHit(this.smoothX, this.smoothY, this.smoothZ, boomX, boomY, boomZ, this.colliders, radius);
274
+ }
275
+ const metres = this.obstruction.distance(this.smoothX, this.smoothY, this.smoothZ, boomX, boomY, boomZ, radius);
276
+ if (metres === null)
277
+ return 1;
278
+ /* The arm's own length rather than the option's, because the arm is what was tested: a pitched
279
+ boom is `boomDistance` long by construction, and reading the option instead would be right
280
+ until somebody changes how the arm is built. */
281
+ const length = Math.sqrt(boomX * boomX + boomY * boomY + boomZ * boomZ);
282
+ if (length <= 1e-6)
283
+ return 1;
284
+ return clamp(metres / length, 0, 1);
285
+ }
286
+ update(frameDt, yaw, pitch, targetX, targetY, targetZ, targetFovYDeg,
287
+ /**
288
+ * Roll, radians. The caller's policy: this rig knows nothing about banked
289
+ * surfaces, only that a camera can be tilted. Damped here rather than by
290
+ * the caller so a subject snapping between surfaces cannot snap the view.
291
+ */
292
+ targetRoll = 0) {
293
+ const cam = this.camera;
294
+ const options = this.options;
295
+ cam.yaw = yaw;
296
+ /*
297
+ * Damped unless the caller has already done it. See `ThirdPersonCameraOptions.dampRoll`: a
298
+ * consumer with a comfort setting on roll damps it once and applies the same value elsewhere,
299
+ * and damping it again here means the setting no longer says what it asserts.
300
+ */
301
+ this.roll =
302
+ options.dampRoll === false
303
+ ? targetRoll
304
+ : damp(this.roll, targetRoll, options.fovLambda, frameDt);
305
+ cam.roll = this.roll;
306
+ /*
307
+ * Absolute pitch, not a delta. Accumulating here would make the rig own how
308
+ * fast look responds, which is the caller's policy — and a caller whose
309
+ * pitch is simulation state (so an aim ray can be replayed) cannot let a
310
+ * render-rate camera hold the authoritative value. Still clamped, so a
311
+ * caller with no limits of its own cannot invert the view.
312
+ */
313
+ cam.pitch = clamp(pitch, options.pitchMin, options.pitchMax);
314
+ // Captured before the placing branch clears it, because the arm below has to
315
+ // know whether this is the frame that places the rig.
316
+ const placing = !this.snapped;
317
+ if (!this.snapped) {
318
+ this.smoothX = targetX;
319
+ this.smoothY = targetY;
320
+ this.smoothZ = targetZ;
321
+ this.snapped = true;
322
+ }
323
+ else {
324
+ /*
325
+ * **Tracking rather than a hold, and it is the default rather than an option.**
326
+ *
327
+ * `damp` is exact for a target standing still, and this one is a subject somebody is
328
+ * driving. Holding it still across the interval made the settled distance a function of the
329
+ * frame time — 1.586 m at 60 Hz against 1.376 m at 28 Hz for a 25 m/s subject at this
330
+ * lambda, so a machine that dropped rate re-framed the shot — and made the gap oscillate
331
+ * under uneven frames, which is what a consumer reported as the subject snapping about
332
+ * inside the picture. A camera arm following something that stands still is the rare case,
333
+ * which is why this is not a flag.
334
+ *
335
+ * The velocity is differenced from the target rather than asked for. See `lastTarget*`.
336
+ */
337
+ const inverseDt = frameDt > 0 ? 1 / frameDt : 0;
338
+ const lambda = options.positionLambda;
339
+ const vx = (targetX - this.lastTargetX) * inverseDt;
340
+ const vy = (targetY - this.lastTargetY) * inverseDt;
341
+ const vz = (targetZ - this.lastTargetZ) * inverseDt;
342
+ this.smoothX = dampTracking(this.smoothX, targetX, vx, lambda, frameDt);
343
+ this.smoothY = dampTracking(this.smoothY, targetY, vy, lambda, frameDt);
344
+ this.smoothZ = dampTracking(this.smoothZ, targetZ, vz, lambda, frameDt);
345
+ }
346
+ this.lastTargetX = targetX;
347
+ this.lastTargetY = targetY;
348
+ this.lastTargetZ = targetZ;
349
+ /*
350
+ * **Roll and the field of view keep the hold, deliberately.** Both follow targets that step —
351
+ * a surface change, a speed band — and a one-frame `delta/dt` across a step is a spike, which
352
+ * `dampTracking` would then aim `v/lambda` beyond. The defect measured was the position lag,
353
+ * and a subject's position is the one of the three that moves smoothly by construction.
354
+ */
355
+ this.fov = damp(this.fov, targetFovYDeg, options.fovLambda, frameDt);
356
+ cam.fovYDeg = this.fov;
357
+ const cosPitch = Math.cos(cam.pitch);
358
+ /*
359
+ * The same three terms as before, placed in the boom's frame rather than on the world axes.
360
+ * With the frame left at world up this is identical arithmetic: right is X, up is Y, forward
361
+ * is Z, and each term lands on the axis it used to be written against.
362
+ */
363
+ const alongRight = -Math.sin(cam.yaw) * cosPitch * options.boomDistance;
364
+ const alongUp = -Math.sin(cam.pitch) * options.boomDistance;
365
+ const alongForward = Math.cos(cam.yaw) * cosPitch * options.boomDistance;
366
+ const boomX = this.boomRightX * alongRight + this.boomUpX * alongUp + this.boomForwardX * alongForward;
367
+ const boomY = this.boomRightY * alongRight + this.boomUpY * alongUp + this.boomForwardY * alongForward;
368
+ const boomZ = this.boomRightZ * alongRight + this.boomUpZ * alongUp + this.boomForwardZ * alongForward;
369
+ const blocked = this.blockedFraction(boomX, boomY, boomZ);
370
+ const minFraction = options.boomMinDistance / options.boomDistance;
371
+ /*
372
+ * The ground blocks the arm as surely as a wall does, and it is not in `colliders`.
373
+ * Stepped rather than solved: the surface is an arbitrary query, not a plane, so the
374
+ * arm is sampled along its length and cut at the first station that would put the eye
375
+ * under the deck. A step function is all `segmentHit` returns either, and `Boom`
376
+ * already exists to smooth exactly that.
377
+ */
378
+ const clearOfGround = this.groundClear(boomX, boomY, boomZ, minFraction);
379
+ const clear = Math.max(Math.min(blocked, clearOfGround), minFraction);
380
+ if (placing)
381
+ this.boom.reset(clear);
382
+ else
383
+ this.boom.step(clear, options.boomDistance, frameDt);
384
+ const fraction = this.boom.fraction;
385
+ cam.position[0] = this.smoothX + boomX * fraction;
386
+ cam.position[1] = this.smoothY + boomY * fraction;
387
+ cam.position[2] = this.smoothZ + boomZ * fraction;
388
+ this.aimAlongArm(boomX, boomY, boomZ);
389
+ }
390
+ /**
391
+ * Point the camera back down the arm, in the frame the arm was built in.
392
+ *
393
+ * **The arm moved into the boom's basis and the aim did not, and that half-migration is what this
394
+ * closes.** `update` placed the eye using `boomRight`/`boomUp`/`boomForward` and then set
395
+ * `cam.yaw`, `cam.pitch` and `cam.roll` — which `Camera.updateMatrices` reads against the *world*
396
+ * axes. The two agree only while up is world Y. With up at +X, an arm built at yaw 0 lies along
397
+ * the frame's forward while a camera at yaw 0 looks down world −Z: a right angle apart, so the
398
+ * rig put the eye in the right place and rendered the scene beside the subject, with no error
399
+ * anywhere. Reported from outside, where recovering the aim meant inverting this rig's own boom
400
+ * formula from outside it, against a sign convention nothing stated.
401
+ *
402
+ * **Derived rather than taken, so `update`'s signature is unchanged** — the same property R2 held
403
+ * to when it added `setBoomUp` rather than a `basis` parameter.
404
+ *
405
+ * The decomposition is exact and is the inverse of `updateMatrices`' own construction: forward
406
+ * fixes yaw and pitch, and the roll is the angle from the basis that construction would build at
407
+ * those two onto the up the arm was built against. **At the world basis every line here returns
408
+ * what was passed in**, which is asserted rather than assumed — `up` is world Y orthogonalised
409
+ * against forward, which is precisely the up `updateMatrices` derives, so the base roll is zero
410
+ * and the caller's damped roll is all that is left.
411
+ */
412
+ aimAlongArm(boomX, boomY, boomZ) {
413
+ const cam = this.camera;
414
+ /* From the eye toward the subject, which is the arm reversed. The eye sits on that ray at any
415
+ boom fraction, so shortening the arm cannot change where the camera looks. */
416
+ const length = Math.sqrt(boomX * boomX + boomY * boomY + boomZ * boomZ);
417
+ if (length <= 1e-6)
418
+ return;
419
+ const forwardX = -boomX / length;
420
+ const forwardY = -boomY / length;
421
+ const forwardZ = -boomZ / length;
422
+ /* `updateMatrices` reads exactly these two out of the direction it is given. */
423
+ const flat = Math.sqrt(forwardX * forwardX + forwardZ * forwardZ);
424
+ if (flat > 1e-6)
425
+ cam.yaw = Math.atan2(forwardX, -forwardZ);
426
+ cam.pitch = Math.atan2(forwardY, flat);
427
+ /*
428
+ * The roll that carries the camera's own up onto the arm's.
429
+ *
430
+ * `updateMatrices` builds an unrolled pair from yaw and pitch and then turns it by `roll`,
431
+ * with `up' = up·cos(roll) − right·sin(roll)`. So the roll wanted here is the angle from that
432
+ * unrolled up onto the boom's up, and the caller's damped roll is added on top of it — a lean
433
+ * about the view, which is what a caller means by roll whatever frame it is standing in.
434
+ */
435
+ const cosPitch = Math.cos(cam.pitch);
436
+ const sinPitch = Math.sin(cam.pitch);
437
+ const cosYaw = Math.cos(cam.yaw);
438
+ const sinYaw = Math.sin(cam.yaw);
439
+ const lean = cosPitch < 0 ? -1 : 1;
440
+ const rightX = lean * cosYaw;
441
+ const rightZ = lean * sinYaw;
442
+ const upX = -lean * sinYaw * sinPitch;
443
+ const upY = lean * cosPitch;
444
+ const upZ = lean * cosYaw * sinPitch;
445
+ /* The boom's up, with any component along the view removed: a roll is measured in the plane
446
+ across the view, and the two are not perpendicular for an arm that is pitched. */
447
+ const into = this.boomUpX * forwardX + this.boomUpY * forwardY + this.boomUpZ * forwardZ;
448
+ const wantX = this.boomUpX - forwardX * into;
449
+ const wantY = this.boomUpY - forwardY * into;
450
+ const wantZ = this.boomUpZ - forwardZ * into;
451
+ const wantLength = Math.sqrt(wantX * wantX + wantY * wantY + wantZ * wantZ);
452
+ if (wantLength <= 1e-6) {
453
+ /* Looking straight along the frame's own up: there is no plane to measure a roll in, so the
454
+ caller's is all there is, and the arm is at a pole where yaw is already arbitrary. */
455
+ cam.roll = this.roll;
456
+ return;
457
+ }
458
+ const nx = wantX / wantLength;
459
+ const ny = wantY / wantLength;
460
+ const nz = wantZ / wantLength;
461
+ const alongUp = nx * upX + ny * upY + nz * upZ;
462
+ const alongRight = nx * rightX + nz * rightZ;
463
+ cam.roll = Math.atan2(-alongRight, alongUp) + this.roll;
464
+ }
465
+ }
466
+ function validateOptions(options) {
467
+ if (options.boomDistance <= 0) {
468
+ throw new Error(`ThirdPersonCamera.boomDistance must be positive, got ${options.boomDistance}`);
469
+ }
470
+ if (options.boomRadius < 0) {
471
+ throw new Error(`ThirdPersonCamera.boomRadius must be non-negative, got ${options.boomRadius}`);
472
+ }
473
+ if (options.boomMinDistance < 0 || options.boomMinDistance > options.boomDistance) {
474
+ throw new Error(`ThirdPersonCamera.boomMinDistance must be between 0 and boomDistance, got ${options.boomMinDistance}`);
475
+ }
476
+ if (options.pitchMin > options.pitchMax) {
477
+ throw new Error('ThirdPersonCamera.pitchMin must not exceed pitchMax');
478
+ }
479
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Where something heavy has just been: a small set of recent presses, decaying.
3
+ *
4
+ * For foliage. Grass a character has gone through should lie down and come back up,
5
+ * and the two obvious ways to do that are both wrong for this engine. Re-uploading
6
+ * the instance buffer would write megabytes a frame for an effect a metre wide, and
7
+ * baking a texture would need a render target, a lookup and a resolution nobody can
8
+ * defend. So the *field* is a handful of points, the flattening happens in the
9
+ * vertex shader, and the per-frame cost is one `uniform4fv`.
10
+ *
11
+ * Generic on purpose: it knows about world positions and strengths, and nothing
12
+ * about characters, grass or what a press means. The renderer hands it to whichever
13
+ * shader wants to answer to it.
14
+ */
15
+ /**
16
+ * How many presses are remembered at once.
17
+ *
18
+ * Eight, and the number is a shader loop as much as a memory budget — every plant
19
+ * vertex walks all of them. It is enough for a couple of seconds of trail at
20
+ * running pace, which is what "it comes back up behind you" needs; a longer memory
21
+ * would be a longer loop in the hottest shader in the game for footprints nobody is
22
+ * looking at any more.
23
+ */
24
+ export declare const TRAMPLE_SLOTS = 8;
25
+ export declare class TrampleField {
26
+ /**
27
+ * Seconds for a press to fade away completely.
28
+ *
29
+ * Pressed foliage fades back to its original position after a few seconds:
30
+ * long enough that a trail is visible behind a character at speed,
31
+ * short enough that a field does not stay combed for the rest of the run.
32
+ */
33
+ private readonly recoverySec;
34
+ /** `[x, y, z, strength]` per slot; strength 0 means empty. */
35
+ readonly data: Float32Array<ArrayBuffer>;
36
+ /** Next slot to claim when every one of them is in use. */
37
+ private cursor;
38
+ constructor(
39
+ /**
40
+ * Seconds for a press to fade away completely.
41
+ *
42
+ * Pressed foliage fades back to its original position after a few seconds:
43
+ * long enough that a trail is visible behind a character at speed,
44
+ * short enough that a field does not stay combed for the rest of the run.
45
+ */
46
+ recoverySec?: number);
47
+ /**
48
+ * Record a press, or deepen the one already there.
49
+ *
50
+ * Allocation-free: called every frame the character is on the ground.
51
+ */
52
+ press(x: number, y: number, z: number): void;
53
+ /** Let every press recover. Once per rendered frame. */
54
+ update(frameDt: number): void;
55
+ /** How pressed a point is, 0–1. For tests and for anything not on the GPU. */
56
+ strengthAt(x: number, y: number, z: number, radiusM: number): number;
57
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Where something heavy has just been: a small set of recent presses, decaying.
3
+ *
4
+ * For foliage. Grass a character has gone through should lie down and come back up,
5
+ * and the two obvious ways to do that are both wrong for this engine. Re-uploading
6
+ * the instance buffer would write megabytes a frame for an effect a metre wide, and
7
+ * baking a texture would need a render target, a lookup and a resolution nobody can
8
+ * defend. So the *field* is a handful of points, the flattening happens in the
9
+ * vertex shader, and the per-frame cost is one `uniform4fv`.
10
+ *
11
+ * Generic on purpose: it knows about world positions and strengths, and nothing
12
+ * about characters, grass or what a press means. The renderer hands it to whichever
13
+ * shader wants to answer to it.
14
+ */
15
+ /**
16
+ * How many presses are remembered at once.
17
+ *
18
+ * Eight, and the number is a shader loop as much as a memory budget — every plant
19
+ * vertex walks all of them. It is enough for a couple of seconds of trail at
20
+ * running pace, which is what "it comes back up behind you" needs; a longer memory
21
+ * would be a longer loop in the hottest shader in the game for footprints nobody is
22
+ * looking at any more.
23
+ */
24
+ export const TRAMPLE_SLOTS = 8;
25
+ /** Floats per press: world x, y, z, strength. */
26
+ const STRIDE = 4;
27
+ /**
28
+ * How far apart two presses have to be before they take separate slots, metres.
29
+ *
30
+ * Without this a character standing still would spend every slot in a second on the
31
+ * same square metre, and the trail behind them would vanish. Refreshing the nearest
32
+ * press instead is also the truthful model: standing in one place presses that
33
+ * place harder, not eight places once.
34
+ */
35
+ const MERGE_RADIUS_M = 0.55;
36
+ export class TrampleField {
37
+ recoverySec;
38
+ /** `[x, y, z, strength]` per slot; strength 0 means empty. */
39
+ data = new Float32Array(TRAMPLE_SLOTS * STRIDE);
40
+ /** Next slot to claim when every one of them is in use. */
41
+ cursor = 0;
42
+ constructor(
43
+ /**
44
+ * Seconds for a press to fade away completely.
45
+ *
46
+ * Pressed foliage fades back to its original position after a few seconds:
47
+ * long enough that a trail is visible behind a character at speed,
48
+ * short enough that a field does not stay combed for the rest of the run.
49
+ */
50
+ recoverySec = 1.6) {
51
+ this.recoverySec = recoverySec;
52
+ }
53
+ /**
54
+ * Record a press, or deepen the one already there.
55
+ *
56
+ * Allocation-free: called every frame the character is on the ground.
57
+ */
58
+ press(x, y, z) {
59
+ let nearest = -1;
60
+ let nearestDistSq = MERGE_RADIUS_M * MERGE_RADIUS_M;
61
+ let emptySlot = -1;
62
+ for (let i = 0; i < TRAMPLE_SLOTS; i++) {
63
+ const o = i * STRIDE;
64
+ if ((this.data[o + 3] ?? 0) <= 0) {
65
+ if (emptySlot < 0)
66
+ emptySlot = i;
67
+ continue;
68
+ }
69
+ const dx = (this.data[o] ?? 0) - x;
70
+ const dy = (this.data[o + 1] ?? 0) - y;
71
+ const dz = (this.data[o + 2] ?? 0) - z;
72
+ // Height is part of the distance, so a character on a bridge does not flatten
73
+ // the grass under it.
74
+ const distSq = dx * dx + dy * dy + dz * dz;
75
+ if (distSq < nearestDistSq) {
76
+ nearestDistSq = distSq;
77
+ nearest = i;
78
+ }
79
+ }
80
+ if (nearest >= 0) {
81
+ const o = nearest * STRIDE;
82
+ // Follow the foot rather than holding the old centre: a character crossing a
83
+ // patch slowly should leave one moving press, not a stutter of stale ones.
84
+ this.data[o] = x;
85
+ this.data[o + 1] = y;
86
+ this.data[o + 2] = z;
87
+ this.data[o + 3] = 1;
88
+ return;
89
+ }
90
+ /*
91
+ * A free slot if there is one, otherwise the oldest by rotation. Round-robin
92
+ * rather than weakest-first: the weakest press is the one about to disappear
93
+ * anyway, and taking it makes a fast trail eat its own tail.
94
+ */
95
+ const slot = emptySlot >= 0 ? emptySlot : this.cursor;
96
+ this.cursor = (this.cursor + 1) % TRAMPLE_SLOTS;
97
+ const o = slot * STRIDE;
98
+ this.data[o] = x;
99
+ this.data[o + 1] = y;
100
+ this.data[o + 2] = z;
101
+ this.data[o + 3] = 1;
102
+ }
103
+ /** Let every press recover. Once per rendered frame. */
104
+ update(frameDt) {
105
+ const drop = Math.max(frameDt, 0) / Math.max(this.recoverySec, 1e-3);
106
+ for (let i = 0; i < TRAMPLE_SLOTS; i++) {
107
+ const o = i * STRIDE + 3;
108
+ const strength = this.data[o] ?? 0;
109
+ if (strength <= 0)
110
+ continue;
111
+ this.data[o] = Math.max(strength - drop, 0);
112
+ }
113
+ }
114
+ /** How pressed a point is, 0–1. For tests and for anything not on the GPU. */
115
+ strengthAt(x, y, z, radiusM) {
116
+ let strongest = 0;
117
+ for (let i = 0; i < TRAMPLE_SLOTS; i++) {
118
+ const o = i * STRIDE;
119
+ const strength = this.data[o + 3] ?? 0;
120
+ if (strength <= 0)
121
+ continue;
122
+ const dx = (this.data[o] ?? 0) - x;
123
+ const dy = (this.data[o + 1] ?? 0) - y;
124
+ const dz = (this.data[o + 2] ?? 0) - z;
125
+ const dist = Math.hypot(dx, dy, dz);
126
+ if (dist >= radiusM)
127
+ continue;
128
+ // Same falloff the shader applies, so a test measures what a player sees.
129
+ const fade = 1 - dist / radiusM;
130
+ strongest = Math.max(strongest, strength * fade * fade);
131
+ }
132
+ return strongest;
133
+ }
134
+ }