@zylem/game-lib 0.4.1 → 0.5.1

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 (362) hide show
  1. package/README.md +23 -41
  2. package/dist/actions.d.ts +25 -0
  3. package/dist/actions.js +287 -8
  4. package/dist/actions.js.map +1 -0
  5. package/dist/behaviors.d.ts +108 -0
  6. package/dist/behaviors.js +396 -6
  7. package/dist/behaviors.js.map +1 -0
  8. package/dist/{lib/camera/zylem-camera.d.ts → camera-Dk-fOVZE.d.ts} +55 -8
  9. package/dist/camera.d.ts +5 -0
  10. package/dist/camera.js +504 -4
  11. package/dist/camera.js.map +1 -0
  12. package/dist/core-C2mjetAd.d.ts +431 -0
  13. package/dist/core.d.ts +9 -0
  14. package/dist/core.js +4780 -9
  15. package/dist/core.js.map +1 -0
  16. package/dist/entities.d.ts +269 -0
  17. package/dist/entities.js +2161 -17
  18. package/dist/entities.js.map +1 -0
  19. package/dist/entity-bQElAdpo.d.ts +347 -0
  20. package/dist/entity-spawner-DNnLYnZq.d.ts +11 -0
  21. package/dist/main.d.ts +135 -0
  22. package/dist/main.js +6599 -56
  23. package/dist/main.js.map +1 -0
  24. package/dist/moveable-B_vyA6cw.d.ts +67 -0
  25. package/dist/stage-CrmY7V0i.d.ts +287 -0
  26. package/dist/stage.d.ts +26 -0
  27. package/dist/stage.js +2229 -15
  28. package/dist/stage.js.map +1 -0
  29. package/dist/transformable-CUhvyuYO.d.ts +67 -0
  30. package/package.json +12 -42
  31. package/LICENSE +0 -21
  32. package/dist/.vite/manifest.json +0 -676
  33. package/dist/api/actions.d.ts +0 -5
  34. package/dist/api/actions.d.ts.map +0 -1
  35. package/dist/api/behaviors.d.ts +0 -4
  36. package/dist/api/behaviors.d.ts.map +0 -1
  37. package/dist/api/camera.d.ts +0 -4
  38. package/dist/api/camera.d.ts.map +0 -1
  39. package/dist/api/core.d.ts +0 -6
  40. package/dist/api/core.d.ts.map +0 -1
  41. package/dist/api/entities.d.ts +0 -9
  42. package/dist/api/entities.d.ts.map +0 -1
  43. package/dist/api/main.d.ts +0 -32
  44. package/dist/api/main.d.ts.map +0 -1
  45. package/dist/api/stage.d.ts +0 -6
  46. package/dist/api/stage.d.ts.map +0 -1
  47. package/dist/assets/zylem-logo.png +0 -0
  48. package/dist/lib/actions/behaviors/actions.d.ts +0 -11
  49. package/dist/lib/actions/behaviors/actions.d.ts.map +0 -1
  50. package/dist/lib/actions/behaviors/actions.js +0 -35
  51. package/dist/lib/actions/behaviors/behavior.d.ts +0 -6
  52. package/dist/lib/actions/behaviors/behavior.d.ts.map +0 -1
  53. package/dist/lib/actions/behaviors/boundaries/boundary.d.ts +0 -37
  54. package/dist/lib/actions/behaviors/boundaries/boundary.d.ts.map +0 -1
  55. package/dist/lib/actions/behaviors/boundaries/boundary.js +0 -40
  56. package/dist/lib/actions/behaviors/character-controller.d.ts +0 -6
  57. package/dist/lib/actions/behaviors/character-controller.d.ts.map +0 -1
  58. package/dist/lib/actions/behaviors/debug/debug-collision.d.ts +0 -6
  59. package/dist/lib/actions/behaviors/debug/debug-collision.d.ts.map +0 -1
  60. package/dist/lib/actions/behaviors/debug/debug-update.d.ts +0 -5
  61. package/dist/lib/actions/behaviors/debug/debug-update.d.ts.map +0 -1
  62. package/dist/lib/actions/behaviors/debug/debug.d.ts +0 -10
  63. package/dist/lib/actions/behaviors/debug/debug.d.ts.map +0 -1
  64. package/dist/lib/actions/behaviors/movement/movement-sequence-2d.d.ts +0 -24
  65. package/dist/lib/actions/behaviors/movement/movement-sequence-2d.d.ts.map +0 -1
  66. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-collision.d.ts +0 -11
  67. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-collision.d.ts.map +0 -1
  68. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-collision.js +0 -100
  69. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.d.ts +0 -12
  70. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.d.ts.map +0 -1
  71. package/dist/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.js +0 -37
  72. package/dist/lib/actions/behaviors/ricochet/ricochet.d.ts +0 -44
  73. package/dist/lib/actions/behaviors/ricochet/ricochet.d.ts.map +0 -1
  74. package/dist/lib/actions/behaviors/ricochet/ricochet.js +0 -6
  75. package/dist/lib/actions/behaviors/zylem-behavior.d.ts +0 -2
  76. package/dist/lib/actions/behaviors/zylem-behavior.d.ts.map +0 -1
  77. package/dist/lib/actions/capabilities/moveable.d.ts +0 -125
  78. package/dist/lib/actions/capabilities/moveable.d.ts.map +0 -1
  79. package/dist/lib/actions/capabilities/moveable.js +0 -108
  80. package/dist/lib/actions/capabilities/rotatable.d.ts +0 -111
  81. package/dist/lib/actions/capabilities/rotatable.d.ts.map +0 -1
  82. package/dist/lib/actions/capabilities/rotatable.js +0 -82
  83. package/dist/lib/actions/capabilities/transformable.d.ts +0 -7
  84. package/dist/lib/actions/capabilities/transformable.d.ts.map +0 -1
  85. package/dist/lib/actions/capabilities/transformable.js +0 -9
  86. package/dist/lib/actions/global-change.d.ts +0 -23
  87. package/dist/lib/actions/global-change.d.ts.map +0 -1
  88. package/dist/lib/actions/global-change.js +0 -40
  89. package/dist/lib/camera/camera.d.ts +0 -16
  90. package/dist/lib/camera/camera.d.ts.map +0 -1
  91. package/dist/lib/camera/camera.js +0 -19
  92. package/dist/lib/camera/fixed-2d.d.ts +0 -32
  93. package/dist/lib/camera/fixed-2d.d.ts.map +0 -1
  94. package/dist/lib/camera/fixed-2d.js +0 -30
  95. package/dist/lib/camera/perspective.d.ts +0 -9
  96. package/dist/lib/camera/perspective.d.ts.map +0 -1
  97. package/dist/lib/camera/perspective.js +0 -10
  98. package/dist/lib/camera/third-person.d.ts +0 -32
  99. package/dist/lib/camera/third-person.d.ts.map +0 -1
  100. package/dist/lib/camera/third-person.js +0 -42
  101. package/dist/lib/camera/zylem-camera.d.ts.map +0 -1
  102. package/dist/lib/camera/zylem-camera.js +0 -208
  103. package/dist/lib/collision/collision-builder.d.ts +0 -17
  104. package/dist/lib/collision/collision-builder.d.ts.map +0 -1
  105. package/dist/lib/collision/collision-builder.js +0 -46
  106. package/dist/lib/collision/collision-delegate.d.ts +0 -6
  107. package/dist/lib/collision/collision-delegate.d.ts.map +0 -1
  108. package/dist/lib/collision/collision-delegate.js +0 -6
  109. package/dist/lib/collision/collision-group.d.ts +0 -11
  110. package/dist/lib/collision/collision-group.d.ts.map +0 -1
  111. package/dist/lib/collision/collision-mask.d.ts +0 -18
  112. package/dist/lib/collision/collision-mask.d.ts.map +0 -1
  113. package/dist/lib/collision/collision.d.ts +0 -19
  114. package/dist/lib/collision/collision.d.ts.map +0 -1
  115. package/dist/lib/collision/utils.d.ts +0 -15
  116. package/dist/lib/collision/utils.d.ts.map +0 -1
  117. package/dist/lib/collision/utils.js +0 -24
  118. package/dist/lib/collision/world.d.ts +0 -23
  119. package/dist/lib/collision/world.d.ts.map +0 -1
  120. package/dist/lib/collision/world.js +0 -77
  121. package/dist/lib/core/asset-manager.d.ts +0 -2
  122. package/dist/lib/core/asset-manager.d.ts.map +0 -1
  123. package/dist/lib/core/base-node-life-cycle.d.ts +0 -68
  124. package/dist/lib/core/base-node-life-cycle.d.ts.map +0 -1
  125. package/dist/lib/core/base-node.d.ts +0 -37
  126. package/dist/lib/core/base-node.d.ts.map +0 -1
  127. package/dist/lib/core/base-node.js +0 -62
  128. package/dist/lib/core/entity-asset-loader.d.ts +0 -16
  129. package/dist/lib/core/entity-asset-loader.d.ts.map +0 -1
  130. package/dist/lib/core/entity-asset-loader.js +0 -54
  131. package/dist/lib/core/errors.d.ts +0 -5
  132. package/dist/lib/core/errors.d.ts.map +0 -1
  133. package/dist/lib/core/flags.d.ts +0 -3
  134. package/dist/lib/core/flags.d.ts.map +0 -1
  135. package/dist/lib/core/index.d.ts +0 -5
  136. package/dist/lib/core/index.d.ts.map +0 -1
  137. package/dist/lib/core/lazy-loader.d.ts +0 -80
  138. package/dist/lib/core/lazy-loader.d.ts.map +0 -1
  139. package/dist/lib/core/lifecycle-base.d.ts +0 -17
  140. package/dist/lib/core/lifecycle-base.d.ts.map +0 -1
  141. package/dist/lib/core/lifecycle-base.js +0 -20
  142. package/dist/lib/core/preset-shader.d.ts +0 -8
  143. package/dist/lib/core/preset-shader.d.ts.map +0 -1
  144. package/dist/lib/core/preset-shader.js +0 -26
  145. package/dist/lib/core/three-addons/Timer.d.ts +0 -92
  146. package/dist/lib/core/three-addons/Timer.d.ts.map +0 -1
  147. package/dist/lib/core/three-addons/Timer.js +0 -103
  148. package/dist/lib/core/utility/nodes.d.ts +0 -13
  149. package/dist/lib/core/utility/nodes.d.ts.map +0 -1
  150. package/dist/lib/core/utility/nodes.js +0 -31
  151. package/dist/lib/core/utility/strings.d.ts +0 -3
  152. package/dist/lib/core/utility/strings.d.ts.map +0 -1
  153. package/dist/lib/core/utility/strings.js +0 -14
  154. package/dist/lib/core/utility/vector.d.ts +0 -8
  155. package/dist/lib/core/utility/vector.d.ts.map +0 -1
  156. package/dist/lib/core/utility/vector.js +0 -8
  157. package/dist/lib/core/vector.d.ts +0 -4
  158. package/dist/lib/core/vector.d.ts.map +0 -1
  159. package/dist/lib/core/vessel.d.ts +0 -13
  160. package/dist/lib/core/vessel.d.ts.map +0 -1
  161. package/dist/lib/core/vessel.js +0 -26
  162. package/dist/lib/debug/console/console-state.d.ts +0 -20
  163. package/dist/lib/debug/console/console-state.d.ts.map +0 -1
  164. package/dist/lib/debug/console/console-state.js +0 -11
  165. package/dist/lib/debug/console/console-store.d.ts +0 -6
  166. package/dist/lib/debug/console/console-store.d.ts.map +0 -1
  167. package/dist/lib/debug/debug-state.d.ts +0 -38
  168. package/dist/lib/debug/debug-state.d.ts.map +0 -1
  169. package/dist/lib/debug/debug-state.js +0 -40
  170. package/dist/lib/debug/debug-store.d.ts +0 -15
  171. package/dist/lib/debug/debug-store.d.ts.map +0 -1
  172. package/dist/lib/debug/state-based-debug-loader.d.ts +0 -8
  173. package/dist/lib/debug/state-based-debug-loader.d.ts.map +0 -1
  174. package/dist/lib/device/aspect-ratio.d.ts +0 -38
  175. package/dist/lib/device/aspect-ratio.d.ts.map +0 -1
  176. package/dist/lib/device/aspect-ratio.js +0 -44
  177. package/dist/lib/device/desktop.d.ts +0 -2
  178. package/dist/lib/device/desktop.d.ts.map +0 -1
  179. package/dist/lib/device/mobile.d.ts +0 -2
  180. package/dist/lib/device/mobile.d.ts.map +0 -1
  181. package/dist/lib/device/tablet.d.ts +0 -2
  182. package/dist/lib/device/tablet.d.ts.map +0 -1
  183. package/dist/lib/entities/actor.d.ts +0 -44
  184. package/dist/lib/entities/actor.d.ts.map +0 -1
  185. package/dist/lib/entities/actor.js +0 -122
  186. package/dist/lib/entities/box.d.ts +0 -27
  187. package/dist/lib/entities/box.d.ts.map +0 -1
  188. package/dist/lib/entities/box.js +0 -68
  189. package/dist/lib/entities/builder.d.ts +0 -28
  190. package/dist/lib/entities/builder.d.ts.map +0 -1
  191. package/dist/lib/entities/builder.js +0 -79
  192. package/dist/lib/entities/create.d.ts +0 -15
  193. package/dist/lib/entities/create.d.ts.map +0 -1
  194. package/dist/lib/entities/create.js +0 -31
  195. package/dist/lib/entities/delegates/animation.d.ts +0 -33
  196. package/dist/lib/entities/delegates/animation.d.ts.map +0 -1
  197. package/dist/lib/entities/delegates/animation.js +0 -58
  198. package/dist/lib/entities/delegates/debug.d.ts +0 -29
  199. package/dist/lib/entities/delegates/debug.d.ts.map +0 -1
  200. package/dist/lib/entities/delegates/debug.js +0 -71
  201. package/dist/lib/entities/delegates/loader.d.ts +0 -12
  202. package/dist/lib/entities/delegates/loader.d.ts.map +0 -1
  203. package/dist/lib/entities/delegates/loader.js +0 -19
  204. package/dist/lib/entities/destroy.d.ts +0 -4
  205. package/dist/lib/entities/destroy.d.ts.map +0 -1
  206. package/dist/lib/entities/destroy.js +0 -15
  207. package/dist/lib/entities/entity.d.ts +0 -96
  208. package/dist/lib/entities/entity.d.ts.map +0 -1
  209. package/dist/lib/entities/entity.js +0 -120
  210. package/dist/lib/entities/index.d.ts +0 -12
  211. package/dist/lib/entities/index.d.ts.map +0 -1
  212. package/dist/lib/entities/plane.d.ts +0 -36
  213. package/dist/lib/entities/plane.d.ts.map +0 -1
  214. package/dist/lib/entities/plane.js +0 -81
  215. package/dist/lib/entities/rect.d.ts +0 -63
  216. package/dist/lib/entities/rect.d.ts.map +0 -1
  217. package/dist/lib/entities/rect.js +0 -160
  218. package/dist/lib/entities/sphere.d.ts +0 -29
  219. package/dist/lib/entities/sphere.d.ts.map +0 -1
  220. package/dist/lib/entities/sphere.js +0 -68
  221. package/dist/lib/entities/sprite.d.ts +0 -53
  222. package/dist/lib/entities/sprite.d.ts.map +0 -1
  223. package/dist/lib/entities/sprite.js +0 -118
  224. package/dist/lib/entities/text.d.ts +0 -49
  225. package/dist/lib/entities/text.d.ts.map +0 -1
  226. package/dist/lib/entities/text.js +0 -140
  227. package/dist/lib/entities/zone.d.ts +0 -54
  228. package/dist/lib/entities/zone.d.ts.map +0 -1
  229. package/dist/lib/entities/zone.js +0 -103
  230. package/dist/lib/game/game-blueprint.d.ts +0 -38
  231. package/dist/lib/game/game-blueprint.d.ts.map +0 -1
  232. package/dist/lib/game/game-canvas.d.ts +0 -35
  233. package/dist/lib/game/game-canvas.d.ts.map +0 -1
  234. package/dist/lib/game/game-canvas.js +0 -57
  235. package/dist/lib/game/game-config.d.ts +0 -59
  236. package/dist/lib/game/game-config.d.ts.map +0 -1
  237. package/dist/lib/game/game-config.js +0 -78
  238. package/dist/lib/game/game-default.d.ts +0 -14
  239. package/dist/lib/game/game-default.d.ts.map +0 -1
  240. package/dist/lib/game/game-default.js +0 -23
  241. package/dist/lib/game/game-interfaces.d.ts +0 -29
  242. package/dist/lib/game/game-interfaces.d.ts.map +0 -1
  243. package/dist/lib/game/game-retro-resolutions.d.ts +0 -25
  244. package/dist/lib/game/game-retro-resolutions.d.ts.map +0 -1
  245. package/dist/lib/game/game-retro-resolutions.js +0 -80
  246. package/dist/lib/game/game-state.d.ts +0 -11
  247. package/dist/lib/game/game-state.d.ts.map +0 -1
  248. package/dist/lib/game/game-state.js +0 -17
  249. package/dist/lib/game/game.d.ts +0 -37
  250. package/dist/lib/game/game.d.ts.map +0 -1
  251. package/dist/lib/game/game.js +0 -109
  252. package/dist/lib/game/zylem-game.d.ts +0 -58
  253. package/dist/lib/game/zylem-game.d.ts.map +0 -1
  254. package/dist/lib/game/zylem-game.js +0 -140
  255. package/dist/lib/graphics/geometries/XZPlaneGeometry.d.ts +0 -8
  256. package/dist/lib/graphics/geometries/XZPlaneGeometry.d.ts.map +0 -1
  257. package/dist/lib/graphics/geometries/XZPlaneGeometry.js +0 -34
  258. package/dist/lib/graphics/material.d.ts +0 -29
  259. package/dist/lib/graphics/material.d.ts.map +0 -1
  260. package/dist/lib/graphics/material.js +0 -64
  261. package/dist/lib/graphics/mesh.d.ts +0 -19
  262. package/dist/lib/graphics/mesh.d.ts.map +0 -1
  263. package/dist/lib/graphics/mesh.js +0 -14
  264. package/dist/lib/graphics/render-pass.d.ts +0 -17
  265. package/dist/lib/graphics/render-pass.d.ts.map +0 -1
  266. package/dist/lib/graphics/render-pass.js +0 -56
  267. package/dist/lib/graphics/shaders/fragment/debug.glsl.js +0 -23
  268. package/dist/lib/graphics/shaders/fragment/fire.glsl.js +0 -52
  269. package/dist/lib/graphics/shaders/fragment/standard.glsl.js +0 -11
  270. package/dist/lib/graphics/shaders/fragment/stars.glsl.js +0 -44
  271. package/dist/lib/graphics/shaders/vertex/debug.glsl.js +0 -15
  272. package/dist/lib/graphics/shaders/vertex/object-shader.glsl.js +0 -11
  273. package/dist/lib/graphics/shaders/vertex/standard.glsl.js +0 -9
  274. package/dist/lib/graphics/zylem-scene.d.ts +0 -50
  275. package/dist/lib/graphics/zylem-scene.d.ts.map +0 -1
  276. package/dist/lib/graphics/zylem-scene.js +0 -75
  277. package/dist/lib/input/gamepad-provider.d.ts +0 -14
  278. package/dist/lib/input/gamepad-provider.d.ts.map +0 -1
  279. package/dist/lib/input/gamepad-provider.js +0 -58
  280. package/dist/lib/input/input-manager.d.ts +0 -15
  281. package/dist/lib/input/input-manager.d.ts.map +0 -1
  282. package/dist/lib/input/input-manager.js +0 -70
  283. package/dist/lib/input/input-provider.d.ts +0 -7
  284. package/dist/lib/input/input-provider.d.ts.map +0 -1
  285. package/dist/lib/input/input.d.ts +0 -48
  286. package/dist/lib/input/input.d.ts.map +0 -1
  287. package/dist/lib/input/keyboard-provider.d.ts +0 -21
  288. package/dist/lib/input/keyboard-provider.d.ts.map +0 -1
  289. package/dist/lib/input/keyboard-provider.js +0 -120
  290. package/dist/lib/interfaces/entity.d.ts +0 -26
  291. package/dist/lib/interfaces/entity.d.ts.map +0 -1
  292. package/dist/lib/sounds/index.d.ts +0 -3
  293. package/dist/lib/sounds/index.d.ts.map +0 -1
  294. package/dist/lib/sounds/ping-pong-sound.d.ts +0 -5
  295. package/dist/lib/sounds/ping-pong-sound.d.ts.map +0 -1
  296. package/dist/lib/sounds/ricochet-sound.d.ts +0 -5
  297. package/dist/lib/sounds/ricochet-sound.d.ts.map +0 -1
  298. package/dist/lib/stage/debug-entity-cursor.d.ts +0 -24
  299. package/dist/lib/stage/debug-entity-cursor.d.ts.map +0 -1
  300. package/dist/lib/stage/debug-entity-cursor.js +0 -53
  301. package/dist/lib/stage/entity-spawner.d.ts +0 -9
  302. package/dist/lib/stage/entity-spawner.d.ts.map +0 -1
  303. package/dist/lib/stage/entity-spawner.js +0 -27
  304. package/dist/lib/stage/stage-blueprint.d.ts +0 -45
  305. package/dist/lib/stage/stage-blueprint.d.ts.map +0 -1
  306. package/dist/lib/stage/stage-blueprint.js +0 -56
  307. package/dist/lib/stage/stage-camera-debug-delegate.d.ts +0 -14
  308. package/dist/lib/stage/stage-camera-debug-delegate.d.ts.map +0 -1
  309. package/dist/lib/stage/stage-debug-delegate.d.ts +0 -26
  310. package/dist/lib/stage/stage-debug-delegate.d.ts.map +0 -1
  311. package/dist/lib/stage/stage-debug-delegate.js +0 -100
  312. package/dist/lib/stage/stage-default.d.ts +0 -3
  313. package/dist/lib/stage/stage-default.d.ts.map +0 -1
  314. package/dist/lib/stage/stage-default.js +0 -32
  315. package/dist/lib/stage/stage-state.d.ts +0 -14
  316. package/dist/lib/stage/stage-state.d.ts.map +0 -1
  317. package/dist/lib/stage/stage-state.js +0 -36
  318. package/dist/lib/stage/stage.d.ts +0 -33
  319. package/dist/lib/stage/stage.d.ts.map +0 -1
  320. package/dist/lib/stage/stage.js +0 -60
  321. package/dist/lib/stage/zylem-stage.d.ts +0 -128
  322. package/dist/lib/stage/zylem-stage.d.ts.map +0 -1
  323. package/dist/lib/stage/zylem-stage.js +0 -268
  324. package/dist/lib/systems/test-system.d.ts +0 -2
  325. package/dist/lib/systems/test-system.d.ts.map +0 -1
  326. package/dist/lib/systems/transformable.system.d.ts +0 -25
  327. package/dist/lib/systems/transformable.system.d.ts.map +0 -1
  328. package/dist/lib/systems/transformable.system.js +0 -43
  329. package/dist/lib/types/entity-types.d.ts +0 -24
  330. package/dist/lib/types/entity-types.d.ts.map +0 -1
  331. package/dist/lib/types/index.d.ts +0 -3
  332. package/dist/lib/types/index.d.ts.map +0 -1
  333. package/dist/lib/types/stage-types.d.ts +0 -26
  334. package/dist/lib/types/stage-types.d.ts.map +0 -1
  335. package/dist/lib/ui/Debug.d.ts +0 -6
  336. package/dist/lib/ui/Debug.d.ts.map +0 -1
  337. package/dist/lib/ui/console/Console.d.ts +0 -7
  338. package/dist/lib/ui/console/Console.d.ts.map +0 -1
  339. package/dist/lib/ui/debug-panel/AccordionMenu.d.ts +0 -7
  340. package/dist/lib/ui/debug-panel/AccordionMenu.d.ts.map +0 -1
  341. package/dist/lib/ui/debug-panel/Menu.d.ts +0 -6
  342. package/dist/lib/ui/debug-panel/Menu.d.ts.map +0 -1
  343. package/dist/lib/ui/debug-panel/sections/EntitiesSection.d.ts +0 -4
  344. package/dist/lib/ui/debug-panel/sections/EntitiesSection.d.ts.map +0 -1
  345. package/dist/lib/ui/debug-panel/sections/GameSection.d.ts +0 -3
  346. package/dist/lib/ui/debug-panel/sections/GameSection.d.ts.map +0 -1
  347. package/dist/lib/ui/debug-panel/sections/StagesSection.d.ts +0 -3
  348. package/dist/lib/ui/debug-panel/sections/StagesSection.d.ts.map +0 -1
  349. package/dist/lib/ui/debug-panel/sections/all.d.ts +0 -4
  350. package/dist/lib/ui/debug-panel/sections/all.d.ts.map +0 -1
  351. package/dist/lib/ui/toolbar/Toolbar.d.ts +0 -6
  352. package/dist/lib/ui/toolbar/Toolbar.d.ts.map +0 -1
  353. package/dist/tests/integration/debug.sim.spec.d.ts +0 -2
  354. package/dist/tests/integration/debug.sim.spec.d.ts.map +0 -1
  355. package/dist/tests/unit/collision/collision.spec.d.ts +0 -2
  356. package/dist/tests/unit/collision/collision.spec.d.ts.map +0 -1
  357. package/dist/tests/unit/core/game.spec.d.ts +0 -2
  358. package/dist/tests/unit/core/game.spec.d.ts.map +0 -1
  359. package/dist/tests/unit/core/stage.spec.d.ts +0 -2
  360. package/dist/tests/unit/core/stage.spec.d.ts.map +0 -1
  361. package/dist/tests/unit/core/vessel.spec.d.ts +0 -2
  362. package/dist/tests/unit/core/vessel.spec.d.ts.map +0 -1
package/dist/behaviors.js CHANGED
@@ -1,8 +1,398 @@
1
- import { boundary2d as e } from "./lib/actions/behaviors/boundaries/boundary.js";
2
- import { ricochet2DInBounds as c } from "./lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.js";
3
- import { ricochet2DCollision as n } from "./lib/actions/behaviors/ricochet/ricochet-2d-collision.js";
1
+ // src/lib/actions/behaviors/boundaries/boundary.ts
2
+ var defaultBoundaryOptions = {
3
+ boundaries: {
4
+ top: 0,
5
+ bottom: 0,
6
+ left: 0,
7
+ right: 0
8
+ },
9
+ stopMovement: true
10
+ };
11
+ function boundary2d(options = {}) {
12
+ return {
13
+ type: "update",
14
+ handler: (updateContext) => {
15
+ _boundary2d(updateContext, options);
16
+ }
17
+ };
18
+ }
19
+ function _boundary2d(updateContext, options) {
20
+ const { me: entity } = updateContext;
21
+ const { boundaries, onBoundary } = {
22
+ ...defaultBoundaryOptions,
23
+ ...options
24
+ };
25
+ const position = entity.getPosition();
26
+ if (!position) return;
27
+ let boundariesHit = { top: false, bottom: false, left: false, right: false };
28
+ if (position.x <= boundaries.left) {
29
+ boundariesHit.left = true;
30
+ } else if (position.x >= boundaries.right) {
31
+ boundariesHit.right = true;
32
+ }
33
+ if (position.y <= boundaries.bottom) {
34
+ boundariesHit.bottom = true;
35
+ } else if (position.y >= boundaries.top) {
36
+ boundariesHit.top = true;
37
+ }
38
+ const stopMovement = options.stopMovement ?? true;
39
+ if (stopMovement && boundariesHit) {
40
+ const velocity = entity.getVelocity() ?? { x: 0, y: 0, z: 0 };
41
+ let { x: newX, y: newY } = velocity;
42
+ if (velocity?.y < 0 && boundariesHit.bottom) {
43
+ newY = 0;
44
+ } else if (velocity?.y > 0 && boundariesHit.top) {
45
+ newY = 0;
46
+ }
47
+ if (velocity?.x < 0 && boundariesHit.left) {
48
+ newX = 0;
49
+ } else if (velocity?.x > 0 && boundariesHit.right) {
50
+ newX = 0;
51
+ }
52
+ entity.moveXY(newX, newY);
53
+ }
54
+ if (onBoundary && boundariesHit) {
55
+ onBoundary({
56
+ me: entity,
57
+ boundary: boundariesHit,
58
+ position: { x: position.x, y: position.y, z: position.z },
59
+ updateContext
60
+ });
61
+ }
62
+ }
63
+
64
+ // src/lib/collision/collision-builder.ts
65
+ import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from "@dimforge/rapier3d-compat";
66
+ var typeToGroup = /* @__PURE__ */ new Map();
67
+ var nextGroupId = 0;
68
+ function getOrCreateCollisionGroupId(type) {
69
+ let groupId = typeToGroup.get(type);
70
+ if (groupId === void 0) {
71
+ groupId = nextGroupId++ % 16;
72
+ typeToGroup.set(type, groupId);
73
+ }
74
+ return groupId;
75
+ }
76
+
77
+ // src/lib/collision/utils.ts
78
+ function matchesCollisionSelector(other, selector) {
79
+ if (!selector) return true;
80
+ const otherName = other.name ?? "";
81
+ if ("name" in selector) {
82
+ const sel = selector.name;
83
+ if (sel instanceof RegExp) {
84
+ return sel.test(otherName);
85
+ } else if (Array.isArray(sel)) {
86
+ return sel.some((s) => s === otherName);
87
+ } else {
88
+ return otherName === sel;
89
+ }
90
+ } else if ("mask" in selector) {
91
+ const m = selector.mask;
92
+ if (m instanceof RegExp) {
93
+ const type = other.collisionType ?? "";
94
+ return m.test(type);
95
+ } else {
96
+ const type = other.collisionType ?? "";
97
+ const gid = getOrCreateCollisionGroupId(type);
98
+ return (m & 1 << gid) !== 0;
99
+ }
100
+ } else if ("test" in selector) {
101
+ return !!selector.test(other);
102
+ }
103
+ return true;
104
+ }
105
+
106
+ // src/lib/actions/behaviors/ricochet/ricochet-2d-collision.ts
107
+ function ricochet2DCollision(options = {}, callback) {
108
+ return {
109
+ type: "collision",
110
+ handler: (collisionContext) => {
111
+ _handleRicochet2DCollision(collisionContext, options, callback);
112
+ }
113
+ };
114
+ }
115
+ function _handleRicochet2DCollision(collisionContext, options, callback) {
116
+ const { entity, other } = collisionContext;
117
+ const self = entity;
118
+ if (other.collider?.isSensor()) return;
119
+ const {
120
+ minSpeed = 2,
121
+ maxSpeed = 20,
122
+ separation = 0,
123
+ collisionWith = void 0
124
+ } = {
125
+ ...options
126
+ };
127
+ const reflectionMode = options?.reflectionMode ?? "angled";
128
+ const maxAngleDeg = options?.maxAngleDeg ?? 60;
129
+ const speedUpFactor = options?.speedUpFactor ?? 1.05;
130
+ const minOffsetForAngle = options?.minOffsetForAngle ?? 0.15;
131
+ const centerRetentionFactor = options?.centerRetentionFactor ?? 0.5;
132
+ if (!matchesCollisionSelector(other, collisionWith)) return;
133
+ const selfPos = self.getPosition();
134
+ const otherPos = other.body?.translation();
135
+ const vel = self.getVelocity();
136
+ if (!selfPos || !otherPos || !vel) return;
137
+ let newVelX = vel.x;
138
+ let newVelY = vel.y;
139
+ let newX = selfPos.x;
140
+ let newY = selfPos.y;
141
+ const dx = selfPos.x - otherPos.x;
142
+ const dy = selfPos.y - otherPos.y;
143
+ let extentX = null;
144
+ let extentY = null;
145
+ const colliderShape = other.collider?.shape;
146
+ if (colliderShape) {
147
+ if (colliderShape.halfExtents) {
148
+ extentX = Math.abs(colliderShape.halfExtents.x ?? colliderShape.halfExtents[0] ?? null);
149
+ extentY = Math.abs(colliderShape.halfExtents.y ?? colliderShape.halfExtents[1] ?? null);
150
+ }
151
+ if ((extentX == null || extentY == null) && typeof colliderShape.radius === "number") {
152
+ extentX = extentX ?? Math.abs(colliderShape.radius);
153
+ extentY = extentY ?? Math.abs(colliderShape.radius);
154
+ }
155
+ }
156
+ if ((extentX == null || extentY == null) && typeof other.collider?.halfExtents === "function") {
157
+ const he = other.collider.halfExtents();
158
+ if (he) {
159
+ extentX = extentX ?? Math.abs(he.x);
160
+ extentY = extentY ?? Math.abs(he.y);
161
+ }
162
+ }
163
+ if ((extentX == null || extentY == null) && typeof other.collider?.radius === "function") {
164
+ const r = other.collider.radius();
165
+ if (typeof r === "number") {
166
+ extentX = extentX ?? Math.abs(r);
167
+ extentY = extentY ?? Math.abs(r);
168
+ }
169
+ }
170
+ let relX = 0;
171
+ let relY = 0;
172
+ if (extentX && extentY) {
173
+ relX = clamp(dx / extentX, -1, 1);
174
+ relY = clamp(dy / extentY, -1, 1);
175
+ } else {
176
+ relX = Math.sign(dx);
177
+ relY = Math.sign(dy);
178
+ }
179
+ let bounceVertical = Math.abs(dy) >= Math.abs(dx);
180
+ let selfExtentX = null;
181
+ let selfExtentY = null;
182
+ const selfShape = self.collider?.shape;
183
+ if (selfShape) {
184
+ if (selfShape.halfExtents) {
185
+ selfExtentX = Math.abs(selfShape.halfExtents.x ?? selfShape.halfExtents[0] ?? null);
186
+ selfExtentY = Math.abs(selfShape.halfExtents.y ?? selfShape.halfExtents[1] ?? null);
187
+ }
188
+ if ((selfExtentX == null || selfExtentY == null) && typeof selfShape.radius === "number") {
189
+ selfExtentX = selfExtentX ?? Math.abs(selfShape.radius);
190
+ selfExtentY = selfExtentY ?? Math.abs(selfShape.radius);
191
+ }
192
+ }
193
+ if ((selfExtentX == null || selfExtentY == null) && typeof self.collider?.halfExtents === "function") {
194
+ const heS = self.collider.halfExtents();
195
+ if (heS) {
196
+ selfExtentX = selfExtentX ?? Math.abs(heS.x);
197
+ selfExtentY = selfExtentY ?? Math.abs(heS.y);
198
+ }
199
+ }
200
+ if ((selfExtentX == null || selfExtentY == null) && typeof self.collider?.radius === "function") {
201
+ const rS = self.collider.radius();
202
+ if (typeof rS === "number") {
203
+ selfExtentX = selfExtentX ?? Math.abs(rS);
204
+ selfExtentY = selfExtentY ?? Math.abs(rS);
205
+ }
206
+ }
207
+ if (extentX != null && extentY != null && selfExtentX != null && selfExtentY != null) {
208
+ const penX = selfExtentX + extentX - Math.abs(dx);
209
+ const penY = selfExtentY + extentY - Math.abs(dy);
210
+ if (!Number.isNaN(penX) && !Number.isNaN(penY)) {
211
+ bounceVertical = penY <= penX;
212
+ }
213
+ }
214
+ let usedAngleDeflection = false;
215
+ if (bounceVertical) {
216
+ const resolvedY = (extentY ?? 0) + (selfExtentY ?? 0) + separation;
217
+ newY = otherPos.y + (dy > 0 ? resolvedY : -resolvedY);
218
+ newX = selfPos.x;
219
+ const isHorizontalPaddle = extentX != null && extentY != null && extentX > extentY;
220
+ if (isHorizontalPaddle && reflectionMode === "angled") {
221
+ const maxAngleRad = maxAngleDeg * Math.PI / 180;
222
+ const deadzone = Math.max(0, Math.min(1, minOffsetForAngle));
223
+ const clampedOffsetX = clamp(relX, -1, 1);
224
+ const absOff = Math.abs(clampedOffsetX);
225
+ const baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);
226
+ const speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);
227
+ if (absOff > deadzone) {
228
+ const t = (absOff - deadzone) / (1 - deadzone);
229
+ const angle = Math.sign(clampedOffsetX) * (t * maxAngleRad);
230
+ const cosA = Math.cos(angle);
231
+ const sinA = Math.sin(angle);
232
+ const vy = Math.abs(speed * cosA);
233
+ const vx = speed * sinA;
234
+ newVelY = dy > 0 ? vy : -vy;
235
+ newVelX = vx;
236
+ } else {
237
+ const vx = vel.x * centerRetentionFactor;
238
+ const vyMagSquared = Math.max(0, speed * speed - vx * vx);
239
+ const vy = Math.sqrt(vyMagSquared);
240
+ newVelY = dy > 0 ? vy : -vy;
241
+ newVelX = vx;
242
+ }
243
+ usedAngleDeflection = true;
244
+ } else {
245
+ newVelY = dy > 0 ? Math.abs(vel.y) : -Math.abs(vel.y);
246
+ if (reflectionMode === "simple") usedAngleDeflection = true;
247
+ }
248
+ } else {
249
+ const resolvedX = (extentX ?? 0) + (selfExtentX ?? 0) + separation;
250
+ newX = otherPos.x + (dx > 0 ? resolvedX : -resolvedX);
251
+ newY = selfPos.y;
252
+ if (reflectionMode === "angled") {
253
+ const maxAngleRad = maxAngleDeg * Math.PI / 180;
254
+ const deadzone = Math.max(0, Math.min(1, minOffsetForAngle));
255
+ const clampedOffsetY = clamp(relY, -1, 1);
256
+ const absOff = Math.abs(clampedOffsetY);
257
+ const baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);
258
+ const speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);
259
+ if (absOff > deadzone) {
260
+ const t = (absOff - deadzone) / (1 - deadzone);
261
+ const angle = Math.sign(clampedOffsetY) * (t * maxAngleRad);
262
+ const cosA = Math.cos(angle);
263
+ const sinA = Math.sin(angle);
264
+ const vx = Math.abs(speed * cosA);
265
+ const vy = speed * sinA;
266
+ newVelX = dx > 0 ? vx : -vx;
267
+ newVelY = vy;
268
+ } else {
269
+ const vy = vel.y * centerRetentionFactor;
270
+ const vxMagSquared = Math.max(0, speed * speed - vy * vy);
271
+ const vx = Math.sqrt(vxMagSquared);
272
+ newVelX = dx > 0 ? vx : -vx;
273
+ newVelY = vy;
274
+ }
275
+ usedAngleDeflection = true;
276
+ } else {
277
+ newVelX = dx > 0 ? Math.abs(vel.x) : -Math.abs(vel.x);
278
+ newVelY = vel.y;
279
+ usedAngleDeflection = true;
280
+ }
281
+ }
282
+ if (!usedAngleDeflection) {
283
+ const additionBaseX = Math.abs(newVelX);
284
+ const additionBaseY = Math.abs(newVelY);
285
+ const addX = Math.sign(relX) * Math.abs(relX) * additionBaseX;
286
+ const addY = Math.sign(relY) * Math.abs(relY) * additionBaseY;
287
+ newVelX += addX;
288
+ newVelY += addY;
289
+ }
290
+ const currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);
291
+ if (currentSpeed > 0) {
292
+ const targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);
293
+ if (targetSpeed !== currentSpeed) {
294
+ const scale = targetSpeed / currentSpeed;
295
+ newVelX *= scale;
296
+ newVelY *= scale;
297
+ }
298
+ }
299
+ if (newX !== selfPos.x || newY !== selfPos.y) {
300
+ self.setPosition(newX, newY, selfPos.z);
301
+ self.moveXY(newVelX, newVelY);
302
+ if (callback) {
303
+ const velocityAfter = self.getVelocity();
304
+ if (velocityAfter) {
305
+ callback({
306
+ position: { x: newX, y: newY, z: selfPos.z },
307
+ ...collisionContext
308
+ });
309
+ }
310
+ }
311
+ }
312
+ }
313
+
314
+ // src/lib/actions/behaviors/ricochet/ricochet.ts
315
+ function clamp(value, min, max) {
316
+ return Math.max(min, Math.min(max, value));
317
+ }
318
+
319
+ // src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.ts
320
+ function ricochet2DInBounds(options = {}, callback) {
321
+ return {
322
+ type: "update",
323
+ handler: (updateContext) => {
324
+ _handleRicochet2DInBounds(updateContext, options, callback);
325
+ }
326
+ };
327
+ }
328
+ function _handleRicochet2DInBounds(updateContext, options, callback) {
329
+ const { me } = updateContext;
330
+ const {
331
+ restitution = 0,
332
+ minSpeed = 2,
333
+ maxSpeed = 20,
334
+ boundaries = { top: 5, bottom: -5, left: -6.5, right: 6.5 },
335
+ separation = 0
336
+ } = { ...options };
337
+ const position = me.getPosition();
338
+ const velocity = me.getVelocity();
339
+ if (!position || !velocity) return;
340
+ let newVelX = velocity.x;
341
+ let newVelY = velocity.y;
342
+ let newX = position.x;
343
+ let newY = position.y;
344
+ let ricochetBoundary = null;
345
+ if (position.x <= boundaries.left) {
346
+ newVelX = Math.abs(velocity.x);
347
+ newX = boundaries.left + separation;
348
+ ricochetBoundary = "left";
349
+ } else if (position.x >= boundaries.right) {
350
+ newVelX = -Math.abs(velocity.x);
351
+ newX = boundaries.right - separation;
352
+ ricochetBoundary = "right";
353
+ }
354
+ if (position.y <= boundaries.bottom) {
355
+ newVelY = Math.abs(velocity.y);
356
+ newY = boundaries.bottom + separation;
357
+ ricochetBoundary = "bottom";
358
+ } else if (position.y >= boundaries.top) {
359
+ newVelY = -Math.abs(velocity.y);
360
+ newY = boundaries.top - separation;
361
+ ricochetBoundary = "top";
362
+ }
363
+ const currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);
364
+ if (currentSpeed > 0) {
365
+ const targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);
366
+ if (targetSpeed !== currentSpeed) {
367
+ const scale = targetSpeed / currentSpeed;
368
+ newVelX *= scale;
369
+ newVelY *= scale;
370
+ }
371
+ }
372
+ if (restitution) {
373
+ newVelX *= restitution;
374
+ newVelY *= restitution;
375
+ }
376
+ if (newX !== position.x || newY !== position.y) {
377
+ me.setPosition(newX, newY, position.z);
378
+ me.moveXY(newVelX, newVelY);
379
+ if (callback && ricochetBoundary) {
380
+ const velocityAfter = me.getVelocity();
381
+ if (velocityAfter) {
382
+ callback({
383
+ boundary: ricochetBoundary,
384
+ position: { x: newX, y: newY, z: position.z },
385
+ velocityBefore: velocity,
386
+ velocityAfter,
387
+ ...updateContext
388
+ });
389
+ }
390
+ }
391
+ }
392
+ }
4
393
  export {
5
- e as boundary2d,
6
- n as ricochet2DCollision,
7
- c as ricochet2DInBounds
394
+ boundary2d,
395
+ ricochet2DCollision,
396
+ ricochet2DInBounds
8
397
  };
398
+ //# sourceMappingURL=behaviors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/actions/behaviors/boundaries/boundary.ts","../src/lib/collision/collision-builder.ts","../src/lib/collision/utils.ts","../src/lib/actions/behaviors/ricochet/ricochet-2d-collision.ts","../src/lib/actions/behaviors/ricochet/ricochet.ts","../src/lib/actions/behaviors/ricochet/ricochet-2d-in-bounds.ts"],"sourcesContent":["import { UpdateContext } from \"../../../core/base-node-life-cycle\";\nimport { MoveableEntity } from \"../../capabilities/moveable\";\nimport { Vector } from \"@dimforge/rapier3d-compat\";\nimport { BehaviorCallbackType } from \"../../../entities/entity\";\n\nexport interface BoundaryEvent {\n\tme: MoveableEntity;\n\tboundary: BoundaryHits;\n\tposition: Vector;\n\tupdateContext: UpdateContext<MoveableEntity>;\n}\n\nexport interface BoundaryOptions {\n\tboundaries: {\n\t\ttop: number;\n\t\tbottom: number;\n\t\tleft: number;\n\t\tright: number;\n\t};\n\tonBoundary?: (event: BoundaryEvent) => void;\n\tstopMovement?: boolean;\n}\n\nconst defaultBoundaryOptions: BoundaryOptions = {\n\tboundaries: {\n\t\ttop: 0,\n\t\tbottom: 0,\n\t\tleft: 0,\n\t\tright: 0\n\t},\n\tstopMovement: true\n};\n\n/**\n * Checks if the entity has hit a boundary and stops its movement if it has\n * \n * @param options Configuration options for the boundary behavior\n * @param options.boundaries The boundaries of the stage\n * @param options.onBoundary A callback function that is called when the entity hits a boundary\n * @param options.stopMovement Whether to stop the entity's movement when it hits a boundary\n * @returns A behavior callback with type 'update' and a handler function\n */\nexport function boundary2d(\n\toptions: Partial<BoundaryOptions> = {}\n): { type: BehaviorCallbackType; handler: (ctx: UpdateContext<MoveableEntity>) => void } {\n\treturn {\n\t\ttype: 'update' as BehaviorCallbackType,\n\t\thandler: (updateContext: UpdateContext<MoveableEntity>) => {\n\t\t\t_boundary2d(updateContext, options);\n\t\t}\n\t};\n}\n\ntype BoundaryHit = 'top' | 'bottom' | 'left' | 'right';\n\ntype BoundaryHits = Record<BoundaryHit, boolean>;\n\nfunction _boundary2d(updateContext: UpdateContext<MoveableEntity>, options: Partial<BoundaryOptions>) {\n\tconst { me: entity } = updateContext;\n\tconst { boundaries, onBoundary } = {\n\t\t...defaultBoundaryOptions,\n\t\t...options\n\t};\n\n\tconst position = entity.getPosition();\n\tif (!position) return;\n\n\tlet boundariesHit: BoundaryHits = { top: false, bottom: false, left: false, right: false };\n\n\tif (position.x <= boundaries.left) {\n\t\tboundariesHit.left = true;\n\t} else if (position.x >= boundaries.right) {\n\t\tboundariesHit.right = true;\n\t}\n\n\tif (position.y <= boundaries.bottom) {\n\t\tboundariesHit.bottom = true;\n\t} else if (position.y >= boundaries.top) {\n\t\tboundariesHit.top = true;\n\t}\n\n\tconst stopMovement = options.stopMovement ?? true;\n\tif (stopMovement && boundariesHit) {\n\t\tconst velocity = entity.getVelocity() ?? { x: 0, y: 0, z: 0 };\n\t\tlet { x: newX, y: newY } = velocity;\n\t\tif (velocity?.y < 0 && boundariesHit.bottom) {\n\t\t\tnewY = 0;\n\t\t} else if (velocity?.y > 0 && boundariesHit.top) {\n\t\t\tnewY = 0;\n\t\t}\n\t\tif (velocity?.x < 0 && boundariesHit.left) {\n\t\t\tnewX = 0;\n\t\t} else if (velocity?.x > 0 && boundariesHit.right) {\n\t\t\tnewX = 0;\n\t\t}\n\t\tentity.moveXY(newX, newY);\n\t}\n\tif (onBoundary && boundariesHit) {\n\t\tonBoundary({\n\t\t\tme: entity,\n\t\t\tboundary: boundariesHit,\n\t\t\tposition: { x: position.x, y: position.y, z: position.z },\n\t\t\tupdateContext\n\t\t});\n\t}\n}","import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from \"@dimforge/rapier3d-compat\";\nimport { Vec3 } from \"../core/vector\";\nimport { CollisionOptions } from \"./collision\";\n\nconst typeToGroup = new Map<string, number>();\nlet nextGroupId = 0;\n\nexport function getOrCreateCollisionGroupId(type: string): number {\n\tlet groupId = typeToGroup.get(type);\n\tif (groupId === undefined) {\n\t\tgroupId = nextGroupId++ % 16;\n\t\ttypeToGroup.set(type, groupId);\n\t}\n\treturn groupId;\n}\n\nexport function createCollisionFilter(allowedTypes: string[]): number {\n\tlet filter = 0;\n\tallowedTypes.forEach(type => {\n\t\tconst groupId = getOrCreateCollisionGroupId(type);\n\t\tfilter |= (1 << groupId);\n\t});\n\treturn filter;\n}\n\nexport class CollisionBuilder {\n\tstatic: boolean = false;\n\tsensor: boolean = false;\n\tgravity: Vec3 = new Vector3(0, 0, 0);\n\n\tbuild(options: Partial<CollisionOptions>): [RigidBodyDesc, ColliderDesc] {\n\t\tconst bodyDesc = this.bodyDesc({\n\t\t\tisDynamicBody: !this.static\n\t\t});\n\t\tconst collider = this.collider(options);\n\t\tconst type = options.collisionType;\n\t\tif (type) {\n\t\t\tlet groupId = getOrCreateCollisionGroupId(type);\n\t\t\tlet filter = 0b1111111111111111;\n\t\t\tif (options.collisionFilter) {\n\t\t\t\tfilter = createCollisionFilter(options.collisionFilter);\n\t\t\t}\n\t\t\tcollider.setCollisionGroups((groupId << 16) | filter);\n\t\t}\n\t\tconst { KINEMATIC_FIXED, DEFAULT } = ActiveCollisionTypes;\n\t\tcollider.activeCollisionTypes = (this.sensor) ? KINEMATIC_FIXED : DEFAULT;\n\t\treturn [bodyDesc, collider];\n\t}\n\n\twithCollision(collisionOptions: Partial<CollisionOptions>): this {\n\t\tthis.sensor = collisionOptions?.sensor ?? this.sensor;\n\t\tthis.static = collisionOptions?.static ?? this.static;\n\t\treturn this;\n\t}\n\n\tcollider(options: CollisionOptions): ColliderDesc {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n\n\tbodyDesc({ isDynamicBody = true }): RigidBodyDesc {\n\t\tconst type = isDynamicBody ? RigidBodyType.Dynamic : RigidBodyType.Fixed;\n\t\tconst bodyDesc = new RigidBodyDesc(type)\n\t\t\t.setTranslation(0, 0, 0)\n\t\t\t.setGravityScale(1.0)\n\t\t\t.setCanSleep(false)\n\t\t\t.setCcdEnabled(true);\n\t\treturn bodyDesc;\n\t}\n}","import type { GameEntity } from \"../entities/entity\";\nimport type { CollisionMask } from \"./collision-mask\";\nimport { getOrCreateCollisionGroupId } from \"./collision-builder\";\n\nexport type NameSelector = string | string[] | RegExp;\n\nexport type CollisionSelector =\n\t| { name: NameSelector }\n\t| { mask: CollisionMask | RegExp }\n\t| { test: (other: GameEntity<any>) => boolean };\n\n/**\n * Returns true if the `other` entity matches the provided selector.\n */\nexport function matchesCollisionSelector(other: GameEntity<any>, selector?: CollisionSelector): boolean {\n\tif (!selector) return true;\n\tconst otherName = other.name ?? '';\n\tif ('name' in selector) {\n\t\tconst sel = selector.name as NameSelector;\n\t\tif (sel instanceof RegExp) {\n\t\t\treturn sel.test(otherName);\n\t\t} else if (Array.isArray(sel)) {\n\t\t\treturn sel.some(s => s === otherName);\n\t\t} else {\n\t\t\treturn otherName === sel;\n\t\t}\n\t} else if ('mask' in selector) {\n\t\tconst m = selector.mask as CollisionMask | RegExp;\n\t\tif (m instanceof RegExp) {\n\t\t\tconst type = other.collisionType ?? '';\n\t\t\treturn m.test(type);\n\t\t} else {\n\t\t\tconst type = other.collisionType ?? '';\n\t\t\tconst gid = getOrCreateCollisionGroupId(type);\n\t\t\treturn ((m as number) & (1 << gid)) !== 0;\n\t\t}\n\t} else if ('test' in selector) {\n\t\treturn !!selector.test(other);\n\t}\n\treturn true;\n}\n\n\n","import { CollisionContext, GameEntity } from '../../../entities/entity';\nimport { MoveableEntity } from '../../capabilities/moveable';\nimport { matchesCollisionSelector } from '../../../collision/utils';\nimport { Ricochet2DCollisionOptions, clamp, Ricochet2DCollisionCallback } from './ricochet';\n\n/**\n * Behavior for ricocheting an entity off other objects in 2D\n */\nexport function ricochet2DCollision(\n\toptions: Partial<Ricochet2DCollisionOptions> = {},\n\tcallback?: Ricochet2DCollisionCallback\n): { type: 'collision'; handler: (ctx: CollisionContext<MoveableEntity, GameEntity<any>>) => void } {\n\treturn {\n\t\ttype: 'collision',\n\t\thandler: (collisionContext: CollisionContext<MoveableEntity, GameEntity<any>>) => {\n\t\t\t_handleRicochet2DCollision(collisionContext, options, callback);\n\t\t},\n\t};\n}\n\nfunction _handleRicochet2DCollision(\n\tcollisionContext: CollisionContext<MoveableEntity, GameEntity<any>>,\n\toptions: Partial<Ricochet2DCollisionOptions>,\n\tcallback?: Ricochet2DCollisionCallback\n) {\n\tconst { entity, other } = collisionContext;\n\tconst self = entity as unknown as GameEntity<any> & MoveableEntity;\n\tif (other.collider?.isSensor()) return;\n\n\tconst {\n\t\tminSpeed = 2,\n\t\tmaxSpeed = 20,\n\t\tseparation = 0,\n\t\tcollisionWith = undefined,\n\t} = {\n\t\t...options,\n\t} as Ricochet2DCollisionOptions;\n\tconst reflectionMode: 'simple' | 'angled' = (options as any)?.reflectionMode ?? 'angled';\n\tconst maxAngleDeg = (options as any)?.maxAngleDeg ?? 60;\n\tconst speedUpFactor = (options as any)?.speedUpFactor ?? 1.05;\n\tconst minOffsetForAngle = (options as any)?.minOffsetForAngle ?? 0.15; // 0..1\n\tconst centerRetentionFactor = (options as any)?.centerRetentionFactor ?? 0.5; // keep some Y on center hits\n\n\tif (!matchesCollisionSelector(other, collisionWith)) return;\n\n\tconst selfPos = self.getPosition();\n\tconst otherPos = other.body?.translation();\n\tconst vel = self.getVelocity();\n\tif (!selfPos || !otherPos || !vel) return;\n\n\tlet newVelX = vel.x;\n\tlet newVelY = vel.y;\n\tlet newX = selfPos.x;\n\tlet newY = selfPos.y;\n\n\tconst dx = selfPos.x - otherPos.x;\n\tconst dy = selfPos.y - otherPos.y;\n\n\tlet extentX: number | null = null;\n\tlet extentY: number | null = null;\n\tconst colliderShape: any = other.collider?.shape as any;\n\tif (colliderShape) {\n\t\tif (colliderShape.halfExtents) {\n\t\t\textentX = Math.abs(colliderShape.halfExtents.x ?? colliderShape.halfExtents[0] ?? null);\n\t\t\textentY = Math.abs(colliderShape.halfExtents.y ?? colliderShape.halfExtents[1] ?? null);\n\t\t}\n\t\tif ((extentX == null || extentY == null) && (typeof colliderShape.radius === 'number')) {\n\t\t\textentX = extentX ?? Math.abs(colliderShape.radius);\n\t\t\textentY = extentY ?? Math.abs(colliderShape.radius);\n\t\t}\n\t}\n\tif ((extentX == null || extentY == null) && typeof (other.collider as any)?.halfExtents === 'function') {\n\t\tconst he = (other.collider as any).halfExtents();\n\t\tif (he) {\n\t\t\textentX = extentX ?? Math.abs(he.x);\n\t\t\textentY = extentY ?? Math.abs(he.y);\n\t\t}\n\t}\n\tif ((extentX == null || extentY == null) && typeof (other.collider as any)?.radius === 'function') {\n\t\tconst r = (other.collider as any).radius();\n\t\tif (typeof r === 'number') {\n\t\t\textentX = extentX ?? Math.abs(r);\n\t\t\textentY = extentY ?? Math.abs(r);\n\t\t}\n\t}\n\n\tlet relX = 0;\n\tlet relY = 0;\n\tif (extentX && extentY) {\n\t\trelX = clamp(dx / extentX, -1, 1);\n\t\trelY = clamp(dy / extentY, -1, 1);\n\t} else {\n\t\trelX = Math.sign(dx);\n\t\trelY = Math.sign(dy);\n\t}\n\tlet bounceVertical = Math.abs(dy) >= Math.abs(dx);\n\n\tlet selfExtentX: number | null = null;\n\tlet selfExtentY: number | null = null;\n\tconst selfShape: any = self.collider?.shape as any;\n\tif (selfShape) {\n\t\tif (selfShape.halfExtents) {\n\t\t\tselfExtentX = Math.abs(selfShape.halfExtents.x ?? selfShape.halfExtents[0] ?? null);\n\t\t\tselfExtentY = Math.abs(selfShape.halfExtents.y ?? selfShape.halfExtents[1] ?? null);\n\t\t}\n\t\tif ((selfExtentX == null || selfExtentY == null) && (typeof selfShape.radius === 'number')) {\n\t\t\tselfExtentX = selfExtentX ?? Math.abs(selfShape.radius);\n\t\t\tselfExtentY = selfExtentY ?? Math.abs(selfShape.radius);\n\t\t}\n\t}\n\tif ((selfExtentX == null || selfExtentY == null) && typeof (self.collider as any)?.halfExtents === 'function') {\n\t\tconst heS = (self.collider as any).halfExtents();\n\t\tif (heS) {\n\t\t\tselfExtentX = selfExtentX ?? Math.abs(heS.x);\n\t\t\tselfExtentY = selfExtentY ?? Math.abs(heS.y);\n\t\t}\n\t}\n\tif ((selfExtentX == null || selfExtentY == null) && typeof (self.collider as any)?.radius === 'function') {\n\t\tconst rS = (self.collider as any).radius();\n\t\tif (typeof rS === 'number') {\n\t\t\tselfExtentX = selfExtentX ?? Math.abs(rS);\n\t\t\tselfExtentY = selfExtentY ?? Math.abs(rS);\n\t\t}\n\t}\n\n\tif (extentX != null && extentY != null && selfExtentX != null && selfExtentY != null) {\n\t\tconst penX = (selfExtentX + extentX) - Math.abs(dx);\n\t\tconst penY = (selfExtentY + extentY) - Math.abs(dy);\n\t\tif (!Number.isNaN(penX) && !Number.isNaN(penY)) {\n\t\t\tbounceVertical = penY <= penX;\n\t\t}\n\t}\n\n\tlet usedAngleDeflection = false;\n\tif (bounceVertical) {\n\t\tconst resolvedY = (extentY ?? 0) + (selfExtentY ?? 0) + separation;\n\t\tnewY = otherPos.y + (dy > 0 ? resolvedY : -resolvedY);\n\t\tnewX = selfPos.x;\n\n\t\tconst isHorizontalPaddle = extentX != null && extentY != null && extentX > extentY;\n\t\tif (isHorizontalPaddle && reflectionMode === 'angled') {\n\t\t\tconst maxAngleRad = (maxAngleDeg * Math.PI) / 180;\n\t\t\tconst deadzone = Math.max(0, Math.min(1, minOffsetForAngle));\n\t\t\tconst clampedOffsetX = clamp(relX, -1, 1);\n\t\t\tconst absOff = Math.abs(clampedOffsetX);\n\t\t\tconst baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);\n\t\t\tconst speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);\n\t\t\tif (absOff > deadzone) {\n\t\t\t\tconst t = (absOff - deadzone) / (1 - deadzone);\n\t\t\t\tconst angle = Math.sign(clampedOffsetX) * (t * maxAngleRad);\n\t\t\t\tconst cosA = Math.cos(angle);\n\t\t\t\tconst sinA = Math.sin(angle);\n\t\t\t\tconst vy = Math.abs(speed * cosA);\n\t\t\t\tconst vx = speed * sinA;\n\t\t\t\tnewVelY = dy > 0 ? vy : -vy;\n\t\t\t\tnewVelX = vx;\n\t\t\t} else {\n\t\t\t\tconst vx = vel.x * centerRetentionFactor;\n\t\t\t\tconst vyMagSquared = Math.max(0, speed * speed - vx * vx);\n\t\t\t\tconst vy = Math.sqrt(vyMagSquared);\n\t\t\t\tnewVelY = dy > 0 ? vy : -vy;\n\t\t\t\tnewVelX = vx;\n\t\t\t}\n\t\t\tusedAngleDeflection = true;\n\t\t} else {\n\t\t\t// Simple vertical reflection (or non-paddle surface)\n\t\t\tnewVelY = dy > 0 ? Math.abs(vel.y) : -Math.abs(vel.y);\n\t\t\tif (reflectionMode === 'simple') usedAngleDeflection = true;\n\t\t}\n\t} else {\n\t\tconst resolvedX = (extentX ?? 0) + (selfExtentX ?? 0) + separation;\n\t\tnewX = otherPos.x + (dx > 0 ? resolvedX : -resolvedX);\n\t\tnewY = selfPos.y;\n\n\t\tif (reflectionMode === 'angled') {\n\t\t\tconst maxAngleRad = (maxAngleDeg * Math.PI) / 180;\n\t\t\tconst deadzone = Math.max(0, Math.min(1, minOffsetForAngle));\n\t\t\tconst clampedOffsetY = clamp(relY, -1, 1);\n\t\t\tconst absOff = Math.abs(clampedOffsetY);\n\t\t\tconst baseSpeed = Math.sqrt(vel.x * vel.x + vel.y * vel.y);\n\t\t\tconst speed = clamp(baseSpeed * speedUpFactor, minSpeed, maxSpeed);\n\t\t\tif (absOff > deadzone) {\n\t\t\t\tconst t = (absOff - deadzone) / (1 - deadzone);\n\t\t\t\tconst angle = Math.sign(clampedOffsetY) * (t * maxAngleRad);\n\t\t\t\tconst cosA = Math.cos(angle);\n\t\t\t\tconst sinA = Math.sin(angle);\n\t\t\t\tconst vx = Math.abs(speed * cosA);\n\t\t\t\tconst vy = speed * sinA;\n\t\t\t\tnewVelX = dx > 0 ? vx : -vx;\n\t\t\t\tnewVelY = vy;\n\t\t\t} else {\n\t\t\t\tconst vy = vel.y * centerRetentionFactor;\n\t\t\t\tconst vxMagSquared = Math.max(0, speed * speed - vy * vy);\n\t\t\t\tconst vx = Math.sqrt(vxMagSquared);\n\t\t\t\tnewVelX = dx > 0 ? vx : -vx;\n\t\t\t\tnewVelY = vy;\n\t\t\t}\n\t\t\tusedAngleDeflection = true;\n\t\t} else {\n\t\t\tnewVelX = dx > 0 ? Math.abs(vel.x) : -Math.abs(vel.x);\n\t\t\tnewVelY = vel.y;\n\t\t\tusedAngleDeflection = true;\n\t\t}\n\t}\n\n\tif (!usedAngleDeflection) {\n\t\tconst additionBaseX = Math.abs(newVelX);\n\t\tconst additionBaseY = Math.abs(newVelY);\n\t\tconst addX = Math.sign(relX) * Math.abs(relX) * additionBaseX;\n\t\tconst addY = Math.sign(relY) * Math.abs(relY) * additionBaseY;\n\t\tnewVelX += addX;\n\t\tnewVelY += addY;\n\t}\n\tconst currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);\n\tif (currentSpeed > 0) {\n\t\tconst targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);\n\t\tif (targetSpeed !== currentSpeed) {\n\t\t\tconst scale = targetSpeed / currentSpeed;\n\t\t\tnewVelX *= scale;\n\t\t\tnewVelY *= scale;\n\t\t}\n\t}\n\n\tif (newX !== selfPos.x || newY !== selfPos.y) {\n\t\tself.setPosition(newX, newY, selfPos.z);\n\t\tself.moveXY(newVelX, newVelY);\n\t\tif (callback) {\n\t\t\tconst velocityAfter = self.getVelocity();\n\t\t\tif (velocityAfter) {\n\t\t\t\tcallback({\n\t\t\t\t\tposition: { x: newX, y: newY, z: selfPos.z },\n\t\t\t\t\t...collisionContext,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}","import { Vector } from '@dimforge/rapier3d-compat';\nimport { MoveableEntity } from '../../capabilities/moveable';\nimport { CollisionContext, GameEntity } from '../../../entities/entity';\nimport { UpdateContext } from '../../../core/base-node-life-cycle';\nimport { CollisionSelector } from '../../../collision/utils';\n\nexport interface RicochetEvent extends Partial<UpdateContext<MoveableEntity>> {\n\tboundary?: 'top' | 'bottom' | 'left' | 'right';\n\tposition: Vector;\n\tvelocityBefore: Vector;\n\tvelocityAfter: Vector;\n}\n\nexport interface RicochetCollisionEvent extends CollisionContext<MoveableEntity, GameEntity<any>> {\n\tposition: Vector;\n}\n\nexport interface Ricochet2DInBoundsOptions {\n\trestitution?: number;\n\tminSpeed?: number;\n\tmaxSpeed?: number;\n\tboundaries: {\n\t\ttop: number;\n\t\tbottom: number;\n\t\tleft: number;\n\t\tright: number;\n\t};\n\tseparation?: number;\n}\n\nexport interface Ricochet2DCollisionOptions {\n\trestitution?: number;\n\tminSpeed?: number;\n\tmaxSpeed?: number;\n\tseparation?: number;\n\tcollisionWith?: CollisionSelector;\n\t/**\n\t * Choose between simple axis inversion or angled (paddle-style) reflection.\n\t * Defaults to 'angled'.\n\t */\n\treflectionMode?: 'simple' | 'angled';\n}\n\nexport type Ricochet2DCallback = (event: RicochetEvent) => void;\nexport type Ricochet2DCollisionCallback = (event: RicochetCollisionEvent) => void;\n\nexport function clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n\nexport { ricochet2DInBounds } from './ricochet-2d-in-bounds';\nexport { ricochet2DCollision } from './ricochet-2d-collision';","import { UpdateContext } from '../../../core/base-node-life-cycle';\nimport { MoveableEntity } from '../../capabilities/moveable';\nimport { Ricochet2DInBoundsOptions, Ricochet2DCallback, clamp } from './ricochet';\nimport { BehaviorCallbackType } from '../../../entities/entity';\n\n/**\n * Behavior for ricocheting an entity within fixed 2D boundaries\n */\nexport function ricochet2DInBounds(\n\toptions: Partial<Ricochet2DInBoundsOptions> = {},\n\tcallback?: Ricochet2DCallback\n): { type: BehaviorCallbackType; handler: (ctx: UpdateContext<MoveableEntity>) => void } {\n\treturn {\n\t\ttype: 'update' as BehaviorCallbackType,\n\t\thandler: (updateContext: UpdateContext<MoveableEntity>) => {\n\t\t\t_handleRicochet2DInBounds(updateContext, options, callback);\n\t\t},\n\t};\n}\n\nfunction _handleRicochet2DInBounds(\n\tupdateContext: UpdateContext<MoveableEntity>,\n\toptions: Partial<Ricochet2DInBoundsOptions>,\n\tcallback?: Ricochet2DCallback\n) {\n\tconst { me } = updateContext;\n\tconst {\n\t\trestitution = 0,\n\t\tminSpeed = 2,\n\t\tmaxSpeed = 20,\n\t\tboundaries = { top: 5, bottom: -5, left: -6.5, right: 6.5 },\n\t\tseparation = 0.0\n\t} = { ...options } as Ricochet2DInBoundsOptions;\n\n\tconst position = me.getPosition();\n\tconst velocity = me.getVelocity();\n\tif (!position || !velocity) return;\n\n\tlet newVelX = velocity.x;\n\tlet newVelY = velocity.y;\n\tlet newX = position.x;\n\tlet newY = position.y;\n\tlet ricochetBoundary: 'top' | 'bottom' | 'left' | 'right' | null = null;\n\n\tif (position.x <= boundaries.left) {\n\t\tnewVelX = Math.abs(velocity.x);\n\t\tnewX = boundaries.left + separation;\n\t\tricochetBoundary = 'left';\n\t} else if (position.x >= boundaries.right) {\n\t\tnewVelX = -Math.abs(velocity.x);\n\t\tnewX = boundaries.right - separation;\n\t\tricochetBoundary = 'right';\n\t}\n\n\tif (position.y <= boundaries.bottom) {\n\t\tnewVelY = Math.abs(velocity.y);\n\t\tnewY = boundaries.bottom + separation;\n\t\tricochetBoundary = 'bottom';\n\t} else if (position.y >= boundaries.top) {\n\t\tnewVelY = -Math.abs(velocity.y);\n\t\tnewY = boundaries.top - separation;\n\t\tricochetBoundary = 'top';\n\t}\n\n\tconst currentSpeed = Math.sqrt(newVelX * newVelX + newVelY * newVelY);\n\tif (currentSpeed > 0) {\n\t\tconst targetSpeed = clamp(currentSpeed, minSpeed, maxSpeed);\n\t\tif (targetSpeed !== currentSpeed) {\n\t\t\tconst scale = targetSpeed / currentSpeed;\n\t\t\tnewVelX *= scale;\n\t\t\tnewVelY *= scale;\n\t\t}\n\t}\n\n\tif (restitution) {\n\t\tnewVelX *= restitution;\n\t\tnewVelY *= restitution;\n\t}\n\n\tif (newX !== position.x || newY !== position.y) {\n\t\tme.setPosition(newX, newY, position.z);\n\t\tme.moveXY(newVelX, newVelY);\n\n\t\tif (callback && ricochetBoundary) {\n\t\t\tconst velocityAfter = me.getVelocity();\n\t\t\tif (velocityAfter) {\n\t\t\t\tcallback({\n\t\t\t\t\tboundary: ricochetBoundary,\n\t\t\t\t\tposition: { x: newX, y: newY, z: position.z },\n\t\t\t\t\tvelocityBefore: velocity,\n\t\t\t\t\tvelocityAfter,\n\t\t\t\t\t...updateContext,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n}"],"mappings":"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","names":[]}
@@ -1,12 +1,45 @@
1
- import { Vector2, Camera, Vector3, Object3D, WebGLRenderer, Scene } from 'three';
1
+ import { Group, Mesh, Object3D, Camera, Vector2, WebGLRenderer, Scene, Vector3 } from 'three';
2
2
  import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
3
- import { PerspectiveType } from './perspective';
4
3
  import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
5
- import { StageEntity } from '../interfaces/entity';
4
+ import { RigidBody, Collider, KinematicCharacterController } from '@dimforge/rapier3d-compat';
5
+
6
+ declare const Perspectives: {
7
+ readonly FirstPerson: "first-person";
8
+ readonly ThirdPerson: "third-person";
9
+ readonly Isometric: "isometric";
10
+ readonly Flat2D: "flat-2d";
11
+ readonly Fixed2D: "fixed-2d";
12
+ };
13
+ type PerspectiveType = (typeof Perspectives)[keyof typeof Perspectives];
14
+
15
+ type LifecycleFunction<T> = (params?: any) => void;
16
+ interface Entity<T = any> {
17
+ setup: (entity: T) => void;
18
+ destroy: () => void;
19
+ update: LifecycleFunction<T>;
20
+ type: string;
21
+ _collision?: (entity: any, other: any, globals?: any) => void;
22
+ _destroy?: (globals?: any) => void;
23
+ name?: string;
24
+ tag?: Set<string>;
25
+ }
26
+ interface StageEntity extends Entity {
27
+ uuid: string;
28
+ body: RigidBody;
29
+ group: Group;
30
+ mesh: Mesh;
31
+ instanceId: number;
32
+ collider: Collider;
33
+ controlledRotation: boolean;
34
+ characterController: KinematicCharacterController;
35
+ name: string;
36
+ markedForRemoval: boolean;
37
+ }
38
+
6
39
  /**
7
40
  * Interface for perspective-specific camera controllers
8
41
  */
9
- export interface PerspectiveController {
42
+ interface PerspectiveController {
10
43
  setup(params: {
11
44
  screenResolution: Vector2;
12
45
  renderer: WebGLRenderer;
@@ -16,15 +49,15 @@ export interface PerspectiveController {
16
49
  update(delta: number): void;
17
50
  resize(width: number, height: number): void;
18
51
  }
19
- export interface CameraDebugState {
52
+ interface CameraDebugState {
20
53
  enabled: boolean;
21
54
  selected: string[];
22
55
  }
23
- export interface CameraDebugDelegate {
56
+ interface CameraDebugDelegate {
24
57
  subscribe(listener: (state: CameraDebugState) => void): () => void;
25
58
  resolveTarget(uuid: string): Object3D | null;
26
59
  }
27
- export declare class ZylemCamera {
60
+ declare class ZylemCamera {
28
61
  cameraRig: Object3D;
29
62
  camera: Camera;
30
63
  screenResolution: Vector2;
@@ -92,4 +125,18 @@ export declare class ZylemCamera {
92
125
  private updateOrbitTargetFromSelection;
93
126
  private detachDebugDelegate;
94
127
  }
95
- //# sourceMappingURL=zylem-camera.d.ts.map
128
+
129
+ interface CameraOptions {
130
+ perspective?: PerspectiveType;
131
+ position?: Vector3;
132
+ target?: Vector3;
133
+ zoom?: number;
134
+ screenResolution?: Vector2;
135
+ }
136
+ declare class CameraWrapper {
137
+ cameraRef: ZylemCamera;
138
+ constructor(camera: ZylemCamera);
139
+ }
140
+ declare function camera(options: CameraOptions): CameraWrapper;
141
+
142
+ export { type CameraDebugDelegate as C, type Entity as E, type LifecycleFunction as L, type PerspectiveType as P, ZylemCamera as Z, Perspectives as a, type CameraDebugState as b, camera as c, CameraWrapper as d };
@@ -0,0 +1,5 @@
1
+ export { P as PerspectiveType, a as Perspectives, c as camera } from './camera-Dk-fOVZE.js';
2
+ import 'three';
3
+ import 'three/addons/controls/OrbitControls.js';
4
+ import 'three/examples/jsm/postprocessing/EffectComposer.js';
5
+ import '@dimforge/rapier3d-compat';