dacha 0.13.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 (361) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -0
  3. package/build/contrib/components/animatable/comparator-condition-component-value.d.ts +5 -0
  4. package/build/contrib/components/animatable/comparator-condition-component-value.js +12 -0
  5. package/build/contrib/components/animatable/comparator-condition-number-value.d.ts +5 -0
  6. package/build/contrib/components/animatable/comparator-condition-number-value.js +9 -0
  7. package/build/contrib/components/animatable/comparator-condition-props.d.ts +9 -0
  8. package/build/contrib/components/animatable/comparator-condition-props.js +12 -0
  9. package/build/contrib/components/animatable/comparator-condition-values.d.ts +8 -0
  10. package/build/contrib/components/animatable/comparator-condition-values.js +8 -0
  11. package/build/contrib/components/animatable/condition-props.d.ts +6 -0
  12. package/build/contrib/components/animatable/condition-props.js +6 -0
  13. package/build/contrib/components/animatable/condition.d.ts +9 -0
  14. package/build/contrib/components/animatable/condition.js +12 -0
  15. package/build/contrib/components/animatable/event-condition-props.d.ts +4 -0
  16. package/build/contrib/components/animatable/event-condition-props.js +6 -0
  17. package/build/contrib/components/animatable/group-state.d.ts +11 -0
  18. package/build/contrib/components/animatable/group-state.js +16 -0
  19. package/build/contrib/components/animatable/index.d.ts +14 -0
  20. package/build/contrib/components/animatable/index.js +41 -0
  21. package/build/contrib/components/animatable/individual-state.d.ts +7 -0
  22. package/build/contrib/components/animatable/individual-state.js +10 -0
  23. package/build/contrib/components/animatable/one-dimensional-props.d.ts +4 -0
  24. package/build/contrib/components/animatable/one-dimensional-props.js +10 -0
  25. package/build/contrib/components/animatable/pick-props.d.ts +6 -0
  26. package/build/contrib/components/animatable/pick-props.js +6 -0
  27. package/build/contrib/components/animatable/state.d.ts +10 -0
  28. package/build/contrib/components/animatable/state.js +16 -0
  29. package/build/contrib/components/animatable/substate.d.ts +9 -0
  30. package/build/contrib/components/animatable/substate.js +13 -0
  31. package/build/contrib/components/animatable/timeline.d.ts +11 -0
  32. package/build/contrib/components/animatable/timeline.js +28 -0
  33. package/build/contrib/components/animatable/transition.d.ts +9 -0
  34. package/build/contrib/components/animatable/transition.js +14 -0
  35. package/build/contrib/components/animatable/two-dimensional-props.d.ts +5 -0
  36. package/build/contrib/components/animatable/two-dimensional-props.js +12 -0
  37. package/build/contrib/components/animatable/types.d.ts +78 -0
  38. package/build/contrib/components/animatable/types.js +1 -0
  39. package/build/contrib/components/camera/index.d.ts +13 -0
  40. package/build/contrib/components/camera/index.js +21 -0
  41. package/build/contrib/components/collider-container/box-collider.d.ts +7 -0
  42. package/build/contrib/components/collider-container/box-collider.js +12 -0
  43. package/build/contrib/components/collider-container/circle-collider.d.ts +6 -0
  44. package/build/contrib/components/collider-container/circle-collider.js +10 -0
  45. package/build/contrib/components/collider-container/index.d.ts +13 -0
  46. package/build/contrib/components/collider-container/index.js +28 -0
  47. package/build/contrib/components/index.d.ts +20 -0
  48. package/build/contrib/components/index.js +10 -0
  49. package/build/contrib/components/keyboard-control/index.d.ts +28 -0
  50. package/build/contrib/components/keyboard-control/index.js +46 -0
  51. package/build/contrib/components/light/index.d.ts +20 -0
  52. package/build/contrib/components/light/index.js +18 -0
  53. package/build/contrib/components/mouse-control/index.d.ts +25 -0
  54. package/build/contrib/components/mouse-control/index.js +46 -0
  55. package/build/contrib/components/renderable/index.d.ts +44 -0
  56. package/build/contrib/components/renderable/index.js +65 -0
  57. package/build/contrib/components/renderable/material.d.ts +16 -0
  58. package/build/contrib/components/renderable/material.js +8 -0
  59. package/build/contrib/components/rigid-body/index.d.ts +20 -0
  60. package/build/contrib/components/rigid-body/index.js +29 -0
  61. package/build/contrib/components/script-bundle/index.d.ts +14 -0
  62. package/build/contrib/components/script-bundle/index.js +15 -0
  63. package/build/contrib/components/sprite/index.d.ts +35 -0
  64. package/build/contrib/components/sprite/index.js +50 -0
  65. package/build/contrib/components/sprite/material.d.ts +16 -0
  66. package/build/contrib/components/sprite/material.js +8 -0
  67. package/build/contrib/components/transform/index.d.ts +32 -0
  68. package/build/contrib/components/transform/index.js +69 -0
  69. package/build/contrib/events/index.d.ts +63 -0
  70. package/build/contrib/events/index.js +11 -0
  71. package/build/contrib/systems/animator/condition-controllers/comparator-condition-controller.d.ts +10 -0
  72. package/build/contrib/systems/animator/condition-controllers/comparator-condition-controller.js +32 -0
  73. package/build/contrib/systems/animator/condition-controllers/condition-controller.d.ts +3 -0
  74. package/build/contrib/systems/animator/condition-controllers/condition-controller.js +1 -0
  75. package/build/contrib/systems/animator/condition-controllers/event-condition-controller.d.ts +8 -0
  76. package/build/contrib/systems/animator/condition-controllers/event-condition-controller.js +18 -0
  77. package/build/contrib/systems/animator/condition-controllers/index.d.ts +3 -0
  78. package/build/contrib/systems/animator/condition-controllers/index.js +6 -0
  79. package/build/contrib/systems/animator/index.d.ts +15 -0
  80. package/build/contrib/systems/animator/index.js +93 -0
  81. package/build/contrib/systems/animator/substate-pickers/index.d.ts +4 -0
  82. package/build/contrib/systems/animator/substate-pickers/index.js +6 -0
  83. package/build/contrib/systems/animator/substate-pickers/one-dimensional-picker.d.ts +8 -0
  84. package/build/contrib/systems/animator/substate-pickers/one-dimensional-picker.js +25 -0
  85. package/build/contrib/systems/animator/substate-pickers/picker.d.ts +7 -0
  86. package/build/contrib/systems/animator/substate-pickers/picker.js +1 -0
  87. package/build/contrib/systems/animator/substate-pickers/two-dimensional-picker.d.ts +8 -0
  88. package/build/contrib/systems/animator/substate-pickers/two-dimensional-picker.js +27 -0
  89. package/build/contrib/systems/animator/utils.d.ts +3 -0
  90. package/build/contrib/systems/animator/utils.js +32 -0
  91. package/build/contrib/systems/camera-system/index.d.ts +2 -0
  92. package/build/contrib/systems/camera-system/index.js +2 -0
  93. package/build/contrib/systems/camera-system/service.d.ts +13 -0
  94. package/build/contrib/systems/camera-system/service.js +25 -0
  95. package/build/contrib/systems/camera-system/system.d.ts +16 -0
  96. package/build/contrib/systems/camera-system/system.js +65 -0
  97. package/build/contrib/systems/game-stats-meter/index.d.ts +11 -0
  98. package/build/contrib/systems/game-stats-meter/index.js +34 -0
  99. package/build/contrib/systems/index.d.ts +13 -0
  100. package/build/contrib/systems/index.js +11 -0
  101. package/build/contrib/systems/keyboard-control-system/index.d.ts +14 -0
  102. package/build/contrib/systems/keyboard-control-system/index.js +73 -0
  103. package/build/contrib/systems/keyboard-input-system/index.d.ts +10 -0
  104. package/build/contrib/systems/keyboard-input-system/index.js +28 -0
  105. package/build/contrib/systems/keyboard-input-system/input-listener.d.ts +12 -0
  106. package/build/contrib/systems/keyboard-input-system/input-listener.js +36 -0
  107. package/build/contrib/systems/mouse-control-system/index.d.ts +10 -0
  108. package/build/contrib/systems/mouse-control-system/index.js +43 -0
  109. package/build/contrib/systems/mouse-input-system/index.d.ts +10 -0
  110. package/build/contrib/systems/mouse-input-system/index.js +23 -0
  111. package/build/contrib/systems/mouse-input-system/subsystems/coordinates-projector/index.d.ts +9 -0
  112. package/build/contrib/systems/mouse-input-system/subsystems/coordinates-projector/index.js +23 -0
  113. package/build/contrib/systems/mouse-input-system/subsystems/index.d.ts +2 -0
  114. package/build/contrib/systems/mouse-input-system/subsystems/index.js +2 -0
  115. package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/index.d.ts +9 -0
  116. package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/index.js +25 -0
  117. package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/mouse-input-listener.d.ts +11 -0
  118. package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/mouse-input-listener.js +46 -0
  119. package/build/contrib/systems/physics-system/consts.d.ts +4 -0
  120. package/build/contrib/systems/physics-system/consts.js +4 -0
  121. package/build/contrib/systems/physics-system/index.d.ts +13 -0
  122. package/build/contrib/systems/physics-system/index.js +38 -0
  123. package/build/contrib/systems/physics-system/subsystems/collision-broadcast/collision.d.ts +15 -0
  124. package/build/contrib/systems/physics-system/subsystems/collision-broadcast/collision.js +31 -0
  125. package/build/contrib/systems/physics-system/subsystems/collision-broadcast/index.d.ts +12 -0
  126. package/build/contrib/systems/physics-system/subsystems/collision-broadcast/index.js +55 -0
  127. package/build/contrib/systems/physics-system/subsystems/collision-detection/aabb-builders/build-box-aabb.d.ts +2 -0
  128. package/build/contrib/systems/physics-system/subsystems/collision-detection/aabb-builders/build-box-aabb.js +13 -0
  129. package/build/contrib/systems/physics-system/subsystems/collision-detection/aabb-builders/build-circle-aabb.d.ts +2 -0
  130. package/build/contrib/systems/physics-system/subsystems/collision-detection/aabb-builders/build-circle-aabb.js +8 -0
  131. package/build/contrib/systems/physics-system/subsystems/collision-detection/aabb-builders/index.d.ts +3 -0
  132. package/build/contrib/systems/physics-system/subsystems/collision-detection/aabb-builders/index.js +6 -0
  133. package/build/contrib/systems/physics-system/subsystems/collision-detection/dispersion-calculator/index.d.ts +11 -0
  134. package/build/contrib/systems/physics-system/subsystems/collision-detection/dispersion-calculator/index.js +27 -0
  135. package/build/contrib/systems/physics-system/subsystems/collision-detection/geometry-builders/build-box-geometry.d.ts +3 -0
  136. package/build/contrib/systems/physics-system/subsystems/collision-detection/geometry-builders/build-box-geometry.js +46 -0
  137. package/build/contrib/systems/physics-system/subsystems/collision-detection/geometry-builders/build-circle-geometry.d.ts +3 -0
  138. package/build/contrib/systems/physics-system/subsystems/collision-detection/geometry-builders/build-circle-geometry.js +13 -0
  139. package/build/contrib/systems/physics-system/subsystems/collision-detection/geometry-builders/index.d.ts +4 -0
  140. package/build/contrib/systems/physics-system/subsystems/collision-detection/geometry-builders/index.js +6 -0
  141. package/build/contrib/systems/physics-system/subsystems/collision-detection/index.d.ts +29 -0
  142. package/build/contrib/systems/physics-system/subsystems/collision-detection/index.js +235 -0
  143. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/check-box-and-circle-intersection.d.ts +16 -0
  144. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/check-box-and-circle-intersection.js +80 -0
  145. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/check-boxes-intersection.d.ts +6 -0
  146. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/check-boxes-intersection.js +72 -0
  147. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/check-circles-intersection.d.ts +11 -0
  148. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/check-circles-intersection.js +39 -0
  149. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/index.d.ts +3 -0
  150. package/build/contrib/systems/physics-system/subsystems/collision-detection/intersection-checkers/index.js +13 -0
  151. package/build/contrib/systems/physics-system/subsystems/collision-detection/reorientation-checkers/check-collider.d.ts +3 -0
  152. package/build/contrib/systems/physics-system/subsystems/collision-detection/reorientation-checkers/check-collider.js +16 -0
  153. package/build/contrib/systems/physics-system/subsystems/collision-detection/reorientation-checkers/check-transform.d.ts +3 -0
  154. package/build/contrib/systems/physics-system/subsystems/collision-detection/reorientation-checkers/check-transform.js +5 -0
  155. package/build/contrib/systems/physics-system/subsystems/collision-detection/reorientation-checkers/index.d.ts +2 -0
  156. package/build/contrib/systems/physics-system/subsystems/collision-detection/reorientation-checkers/index.js +2 -0
  157. package/build/contrib/systems/physics-system/subsystems/collision-detection/types.d.ts +70 -0
  158. package/build/contrib/systems/physics-system/subsystems/collision-detection/types.js +1 -0
  159. package/build/contrib/systems/physics-system/subsystems/collision-solver/index.d.ts +11 -0
  160. package/build/contrib/systems/physics-system/subsystems/collision-solver/index.js +52 -0
  161. package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.d.ts +15 -0
  162. package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.js +123 -0
  163. package/build/contrib/systems/physics-system/subsystems/index.d.ts +5 -0
  164. package/build/contrib/systems/physics-system/subsystems/index.js +5 -0
  165. package/build/contrib/systems/physics-system/subsystems/physics/index.d.ts +18 -0
  166. package/build/contrib/systems/physics-system/subsystems/physics/index.js +131 -0
  167. package/build/contrib/systems/physics-system/types.d.ts +4 -0
  168. package/build/contrib/systems/physics-system/types.js +1 -0
  169. package/build/contrib/systems/script-system/index.d.ts +18 -0
  170. package/build/contrib/systems/script-system/index.js +68 -0
  171. package/build/contrib/systems/script-system/types.d.ts +20 -0
  172. package/build/contrib/systems/script-system/types.js +3 -0
  173. package/build/contrib/systems/sprite-renderer/index.d.ts +2 -0
  174. package/build/contrib/systems/sprite-renderer/index.js +2 -0
  175. package/build/contrib/systems/sprite-renderer/light-subsystem/index.d.ts +13 -0
  176. package/build/contrib/systems/sprite-renderer/light-subsystem/index.js +51 -0
  177. package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.d.ts +4 -0
  178. package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.js +27 -0
  179. package/build/contrib/systems/sprite-renderer/material-factory/index.d.ts +4 -0
  180. package/build/contrib/systems/sprite-renderer/material-factory/index.js +32 -0
  181. package/build/contrib/systems/sprite-renderer/renderer.d.ts +32 -0
  182. package/build/contrib/systems/sprite-renderer/renderer.js +214 -0
  183. package/build/contrib/systems/sprite-renderer/service/index.d.ts +24 -0
  184. package/build/contrib/systems/sprite-renderer/service/index.js +52 -0
  185. package/build/contrib/systems/sprite-renderer/sort/index.d.ts +8 -0
  186. package/build/contrib/systems/sprite-renderer/sort/index.js +15 -0
  187. package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.d.ts +2 -0
  188. package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.js +12 -0
  189. package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.d.ts +2 -0
  190. package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.js +14 -0
  191. package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.d.ts +2 -0
  192. package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.js +15 -0
  193. package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.d.ts +2 -0
  194. package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.js +15 -0
  195. package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.d.ts +2 -0
  196. package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.js +6 -0
  197. package/build/contrib/systems/sprite-renderer/sort/types.d.ts +2 -0
  198. package/build/contrib/systems/sprite-renderer/sort/types.js +1 -0
  199. package/build/contrib/systems/sprite-renderer/sort/utils.d.ts +1 -0
  200. package/build/contrib/systems/sprite-renderer/sort/utils.js +6 -0
  201. package/build/contrib/systems/sprite-renderer/sprite-cropper.d.ts +8 -0
  202. package/build/contrib/systems/sprite-renderer/sprite-cropper.js +30 -0
  203. package/build/contrib/systems/sprite-renderer/utils.d.ts +8 -0
  204. package/build/contrib/systems/sprite-renderer/utils.js +41 -0
  205. package/build/contrib/systems/ui-bridge/index.d.ts +40 -0
  206. package/build/contrib/systems/ui-bridge/index.js +62 -0
  207. package/build/contrib/systems/ui-bridge/observer/index.d.ts +1 -0
  208. package/build/contrib/systems/ui-bridge/observer/index.js +1 -0
  209. package/build/contrib/systems/ui-bridge/observer/observer.d.ts +8 -0
  210. package/build/contrib/systems/ui-bridge/observer/observer.js +21 -0
  211. package/build/contrib/systems/webgl-render-system/color/color-reader/color-reader.d.ts +3 -0
  212. package/build/contrib/systems/webgl-render-system/color/color-reader/color-reader.js +1 -0
  213. package/build/contrib/systems/webgl-render-system/color/color-reader/consts.d.ts +3 -0
  214. package/build/contrib/systems/webgl-render-system/color/color-reader/consts.js +10 -0
  215. package/build/contrib/systems/webgl-render-system/color/color-reader/hex-color-reader.d.ts +4 -0
  216. package/build/contrib/systems/webgl-render-system/color/color-reader/hex-color-reader.js +14 -0
  217. package/build/contrib/systems/webgl-render-system/color/color-reader/index.d.ts +6 -0
  218. package/build/contrib/systems/webgl-render-system/color/color-reader/index.js +6 -0
  219. package/build/contrib/systems/webgl-render-system/color/color-reader/short-hex-color-reader.d.ts +4 -0
  220. package/build/contrib/systems/webgl-render-system/color/color-reader/short-hex-color-reader.js +11 -0
  221. package/build/contrib/systems/webgl-render-system/color/index.d.ts +7 -0
  222. package/build/contrib/systems/webgl-render-system/color/index.js +41 -0
  223. package/build/contrib/systems/webgl-render-system/consts.d.ts +9 -0
  224. package/build/contrib/systems/webgl-render-system/consts.js +9 -0
  225. package/build/contrib/systems/webgl-render-system/geometry/rectangle.d.ts +6 -0
  226. package/build/contrib/systems/webgl-render-system/geometry/rectangle.js +22 -0
  227. package/build/contrib/systems/webgl-render-system/index.d.ts +66 -0
  228. package/build/contrib/systems/webgl-render-system/index.js +405 -0
  229. package/build/contrib/systems/webgl-render-system/matrix-transformer/index.d.ts +20 -0
  230. package/build/contrib/systems/webgl-render-system/matrix-transformer/index.js +55 -0
  231. package/build/contrib/systems/webgl-render-system/shader-builder/fragment-shader.d.ts +1 -0
  232. package/build/contrib/systems/webgl-render-system/shader-builder/fragment-shader.js +29 -0
  233. package/build/contrib/systems/webgl-render-system/shader-builder/index.d.ts +11 -0
  234. package/build/contrib/systems/webgl-render-system/shader-builder/index.js +39 -0
  235. package/build/contrib/systems/webgl-render-system/shader-builder/shader-provider.d.ts +10 -0
  236. package/build/contrib/systems/webgl-render-system/shader-builder/shader-provider.js +34 -0
  237. package/build/contrib/systems/webgl-render-system/shader-builder/vertex-shader.d.ts +1 -0
  238. package/build/contrib/systems/webgl-render-system/shader-builder/vertex-shader.js +16 -0
  239. package/build/contrib/systems/webgl-render-system/texture-handlers/index.d.ts +7 -0
  240. package/build/contrib/systems/webgl-render-system/texture-handlers/index.js +6 -0
  241. package/build/contrib/systems/webgl-render-system/texture-handlers/sprite-texture-handler.d.ts +10 -0
  242. package/build/contrib/systems/webgl-render-system/texture-handlers/sprite-texture-handler.js +16 -0
  243. package/build/contrib/systems/webgl-render-system/texture-handlers/static-texture-handler.d.ts +9 -0
  244. package/build/contrib/systems/webgl-render-system/texture-handlers/static-texture-handler.js +10 -0
  245. package/build/contrib/systems/webgl-render-system/texture-handlers/texture-handler.d.ts +10 -0
  246. package/build/contrib/systems/webgl-render-system/texture-handlers/texture-handler.js +1 -0
  247. package/build/contrib/systems/webgl-render-system/utils/index.d.ts +1 -0
  248. package/build/contrib/systems/webgl-render-system/utils/index.js +1 -0
  249. package/build/contrib/systems/webgl-render-system/utils/split-to-batch.d.ts +3 -0
  250. package/build/contrib/systems/webgl-render-system/utils/split-to-batch.js +19 -0
  251. package/build/contrib/types/index.d.ts +1 -0
  252. package/build/contrib/types/index.js +1 -0
  253. package/build/contrib/types/input-events.d.ts +21 -0
  254. package/build/contrib/types/input-events.js +1 -0
  255. package/build/contrib/utils/coordinates-projection.d.ts +3 -0
  256. package/build/contrib/utils/coordinates-projection.js +11 -0
  257. package/build/contrib/utils/get-window-node.d.ts +1 -0
  258. package/build/contrib/utils/get-window-node.js +7 -0
  259. package/build/engine/actor/actor-collection.d.ts +31 -0
  260. package/build/engine/actor/actor-collection.js +98 -0
  261. package/build/engine/actor/actor-creator.d.ts +21 -0
  262. package/build/engine/actor/actor-creator.js +82 -0
  263. package/build/engine/actor/actor-spawner.d.ts +7 -0
  264. package/build/engine/actor/actor-spawner.js +12 -0
  265. package/build/engine/actor/actor.d.ts +31 -0
  266. package/build/engine/actor/actor.js +60 -0
  267. package/build/engine/actor/index.d.ts +5 -0
  268. package/build/engine/actor/index.js +4 -0
  269. package/build/engine/component/component.d.ts +13 -0
  270. package/build/engine/component/component.js +21 -0
  271. package/build/engine/component/index.d.ts +2 -0
  272. package/build/engine/component/index.js +1 -0
  273. package/build/engine/controllers/controller.d.ts +7 -0
  274. package/build/engine/controllers/controller.js +1 -0
  275. package/build/engine/controllers/index.d.ts +2 -0
  276. package/build/engine/controllers/index.js +1 -0
  277. package/build/engine/controllers/scene-controller.d.ts +11 -0
  278. package/build/engine/controllers/scene-controller.js +50 -0
  279. package/build/engine/data-lib/index.d.ts +2 -0
  280. package/build/engine/data-lib/index.js +2 -0
  281. package/build/engine/data-lib/queue.d.ts +8 -0
  282. package/build/engine/data-lib/queue.js +34 -0
  283. package/build/engine/data-lib/sort/index.d.ts +1 -0
  284. package/build/engine/data-lib/sort/index.js +1 -0
  285. package/build/engine/data-lib/sort/insertion-sort.d.ts +1 -0
  286. package/build/engine/data-lib/sort/insertion-sort.js +14 -0
  287. package/build/engine/engine.d.ts +22 -0
  288. package/build/engine/engine.js +89 -0
  289. package/build/engine/entity/entity.d.ts +17 -0
  290. package/build/engine/entity/entity.js +40 -0
  291. package/build/engine/entity/index.d.ts +3 -0
  292. package/build/engine/entity/index.js +2 -0
  293. package/build/engine/entity/utils.d.ts +3 -0
  294. package/build/engine/entity/utils.js +26 -0
  295. package/build/engine/event-target/event-queue.d.ts +9 -0
  296. package/build/engine/event-target/event-queue.js +16 -0
  297. package/build/engine/event-target/event-target.d.ts +13 -0
  298. package/build/engine/event-target/event-target.js +59 -0
  299. package/build/engine/event-target/index.d.ts +4 -0
  300. package/build/engine/event-target/index.js +2 -0
  301. package/build/engine/event-target/types.d.ts +12 -0
  302. package/build/engine/event-target/types.js +1 -0
  303. package/build/engine/events/index.d.ts +51 -0
  304. package/build/engine/events/index.js +8 -0
  305. package/build/engine/game-loop.d.ts +14 -0
  306. package/build/engine/game-loop.js +51 -0
  307. package/build/engine/index.d.ts +1 -0
  308. package/build/engine/index.js +1 -0
  309. package/build/engine/math-lib/index.d.ts +3 -0
  310. package/build/engine/math-lib/index.js +3 -0
  311. package/build/engine/math-lib/math/ops.d.ts +14 -0
  312. package/build/engine/math-lib/math/ops.js +52 -0
  313. package/build/engine/math-lib/vector/ops.d.ts +38 -0
  314. package/build/engine/math-lib/vector/ops.js +76 -0
  315. package/build/engine/math-lib/vector/vector2.d.ts +10 -0
  316. package/build/engine/math-lib/vector/vector2.js +25 -0
  317. package/build/engine/resource-loader/index.d.ts +1 -0
  318. package/build/engine/resource-loader/index.js +1 -0
  319. package/build/engine/resource-loader/loaders/image-loader.d.ts +7 -0
  320. package/build/engine/resource-loader/loaders/image-loader.js +21 -0
  321. package/build/engine/resource-loader/loaders/index.d.ts +4 -0
  322. package/build/engine/resource-loader/loaders/index.js +6 -0
  323. package/build/engine/resource-loader/loaders/json-loader.d.ts +7 -0
  324. package/build/engine/resource-loader/loaders/json-loader.js +14 -0
  325. package/build/engine/resource-loader/loaders/loader.d.ts +4 -0
  326. package/build/engine/resource-loader/loaders/loader.js +1 -0
  327. package/build/engine/resource-loader/resource-loader-qualifier.d.ts +7 -0
  328. package/build/engine/resource-loader/resource-loader-qualifier.js +18 -0
  329. package/build/engine/resource-loader/resource-loader.d.ts +5 -0
  330. package/build/engine/resource-loader/resource-loader.js +17 -0
  331. package/build/engine/scene/index.d.ts +3 -0
  332. package/build/engine/scene/index.js +2 -0
  333. package/build/engine/scene/scene-provider.d.ts +50 -0
  334. package/build/engine/scene/scene-provider.js +151 -0
  335. package/build/engine/scene/scene.d.ts +46 -0
  336. package/build/engine/scene/scene.js +98 -0
  337. package/build/engine/system/index.d.ts +2 -0
  338. package/build/engine/system/index.js +1 -0
  339. package/build/engine/system/system.d.ts +25 -0
  340. package/build/engine/system/system.js +3 -0
  341. package/build/engine/template/index.d.ts +2 -0
  342. package/build/engine/template/index.js +2 -0
  343. package/build/engine/template/template-collection.d.ts +13 -0
  344. package/build/engine/template/template-collection.js +44 -0
  345. package/build/engine/template/template.d.ts +17 -0
  346. package/build/engine/template/template.js +43 -0
  347. package/build/engine/types/config.d.ts +47 -0
  348. package/build/engine/types/config.js +1 -0
  349. package/build/engine/types/index.d.ts +1 -0
  350. package/build/engine/types/index.js +1 -0
  351. package/build/events/index.d.ts +4 -0
  352. package/build/events/index.js +2 -0
  353. package/build/index.d.ts +15 -0
  354. package/build/index.js +11 -0
  355. package/build/types/events.d.ts +9 -0
  356. package/build/types/events.js +1 -0
  357. package/build/types/global.d.ts +2 -0
  358. package/build/types/global.js +2 -0
  359. package/build/types/utils.d.ts +1 -0
  360. package/build/types/utils.js +1 -0
  361. package/package.json +63 -0
@@ -0,0 +1,13 @@
1
+ export const buildBoxAABB = (geometry) => {
2
+ const { points } = geometry;
3
+ return {
4
+ min: {
5
+ x: Math.min(points[0].x, points[1].x, points[2].x, points[3].x),
6
+ y: Math.min(points[0].y, points[1].y, points[2].y, points[3].y),
7
+ },
8
+ max: {
9
+ x: Math.max(points[0].x, points[1].x, points[2].x, points[3].x),
10
+ y: Math.max(points[0].y, points[1].y, points[2].y, points[3].y),
11
+ },
12
+ };
13
+ };
@@ -0,0 +1,2 @@
1
+ import type { AABB, Geometry } from '../types';
2
+ export declare const buildCircleAABB: (geometry: Geometry) => AABB;
@@ -0,0 +1,8 @@
1
+ export const buildCircleAABB = (geometry) => {
2
+ const { radius } = geometry;
3
+ const { x: centerX, y: centerY } = geometry.center;
4
+ return {
5
+ min: { x: centerX - radius, y: centerY - radius },
6
+ max: { x: centerX + radius, y: centerY + radius },
7
+ };
8
+ };
@@ -0,0 +1,3 @@
1
+ import type { AABB, Geometry } from '../types';
2
+ export type BuildAABBFn = (geometry: Geometry) => AABB;
3
+ export declare const aabbBuilders: Record<string, BuildAABBFn>;
@@ -0,0 +1,6 @@
1
+ import { buildBoxAABB } from './build-box-aabb';
2
+ import { buildCircleAABB } from './build-circle-aabb';
3
+ export const aabbBuilders = {
4
+ boxCollider: buildBoxAABB,
5
+ circleCollider: buildCircleAABB,
6
+ };
@@ -0,0 +1,11 @@
1
+ import type { Axis, AABB } from '../types';
2
+ export declare class DispersionCalculator {
3
+ private axis;
4
+ private sampleSize;
5
+ private sum;
6
+ private squaredSum;
7
+ constructor(axis: Axis);
8
+ addToSample(aabb: AABB): void;
9
+ removeFromSample(aabb: AABB): void;
10
+ getDispersion(): number;
11
+ }
@@ -0,0 +1,27 @@
1
+ export class DispersionCalculator {
2
+ axis;
3
+ sampleSize;
4
+ sum;
5
+ squaredSum;
6
+ constructor(axis) {
7
+ this.axis = axis;
8
+ this.sampleSize = 0;
9
+ this.sum = 0;
10
+ this.squaredSum = 0;
11
+ }
12
+ addToSample(aabb) {
13
+ const average = (aabb.min[this.axis] + aabb.max[this.axis]) * 0.5;
14
+ this.sum += average;
15
+ this.squaredSum += average ** 2;
16
+ this.sampleSize += 1;
17
+ }
18
+ removeFromSample(aabb) {
19
+ const average = (aabb.min[this.axis] + aabb.max[this.axis]) * 0.5;
20
+ this.sum -= average;
21
+ this.squaredSum -= average ** 2;
22
+ this.sampleSize -= 1;
23
+ }
24
+ getDispersion() {
25
+ return (this.squaredSum / this.sampleSize) - (this.sum / this.sampleSize) ** 2;
26
+ }
27
+ }
@@ -0,0 +1,3 @@
1
+ import type { ColliderContainer, Transform } from '../../../../../components';
2
+ import type { BoxGeometry } from '../types';
3
+ export declare const buildBoxGeometry: (container: ColliderContainer, transform: Transform) => BoxGeometry;
@@ -0,0 +1,46 @@
1
+ import { VectorOps } from '../../../../../../engine/math-lib';
2
+ export const buildBoxGeometry = (container, transform) => {
3
+ const { offsetX, offsetY, scaleX, scaleY, rotation, } = transform;
4
+ let { centerX, centerY } = container.collider;
5
+ const { sizeX, sizeY } = container.collider;
6
+ const x1 = -(sizeX / 2);
7
+ const x2 = (sizeX / 2);
8
+ const y1 = -(sizeY / 2);
9
+ const y2 = (sizeY / 2);
10
+ const angle = (rotation * Math.PI) / 180;
11
+ const cos = Math.cos(angle);
12
+ const sin = Math.sin(angle);
13
+ centerX += offsetX;
14
+ centerY += offsetY;
15
+ const points = [
16
+ { x: x1, y: y1 },
17
+ { x: x1, y: y2 },
18
+ { x: x2, y: y2 },
19
+ { x: x2, y: y1 },
20
+ ];
21
+ points.forEach((point) => {
22
+ const { x, y } = point;
23
+ const scaledX = x * scaleX;
24
+ const scaledY = y * scaleY;
25
+ const rotatedX = scaledX * cos - scaledY * sin;
26
+ const rotatedY = scaledX * sin + scaledY * cos;
27
+ point.x = rotatedX + centerX;
28
+ point.y = rotatedY + centerY;
29
+ });
30
+ const edges = points.map((point1, index, array) => {
31
+ const point2 = array[(index + 1) % array.length];
32
+ return {
33
+ point1,
34
+ point2,
35
+ normal: VectorOps.getNormal(point1.x, point2.x, point1.y, point2.y),
36
+ };
37
+ });
38
+ return {
39
+ center: {
40
+ x: centerX,
41
+ y: centerY,
42
+ },
43
+ points,
44
+ edges,
45
+ };
46
+ };
@@ -0,0 +1,3 @@
1
+ import type { ColliderContainer, Transform } from '../../../../../components';
2
+ import type { CircleGeometry } from '../types';
3
+ export declare const buildCircleGeometry: (container: ColliderContainer, transform: Transform) => CircleGeometry;
@@ -0,0 +1,13 @@
1
+ export const buildCircleGeometry = (container, transform) => {
2
+ const { offsetX, offsetY, scaleX, scaleY, } = transform;
3
+ const { centerX, centerY, radius } = container.collider;
4
+ const center = {
5
+ x: centerX + offsetX,
6
+ y: centerY + offsetY,
7
+ };
8
+ const scaledRadius = radius * Math.max(scaleX, scaleY);
9
+ return {
10
+ center,
11
+ radius: scaledRadius,
12
+ };
13
+ };
@@ -0,0 +1,4 @@
1
+ import type { ColliderContainer, Transform } from '../../../../../components';
2
+ import type { Geometry } from '../types';
3
+ export type BuildGeometryFn = (container: ColliderContainer, transform: Transform) => Geometry;
4
+ export declare const geometryBuilders: Record<string, BuildGeometryFn>;
@@ -0,0 +1,6 @@
1
+ import { buildBoxGeometry } from './build-box-geometry';
2
+ import { buildCircleGeometry } from './build-circle-geometry';
3
+ export const geometryBuilders = {
4
+ boxCollider: buildBoxGeometry,
5
+ circleCollider: buildCircleGeometry,
6
+ };
@@ -0,0 +1,29 @@
1
+ import type { SystemOptions } from '../../../../../engine/system';
2
+ export declare class CollisionDetectionSubsystem {
3
+ private actorCollection;
4
+ private scene;
5
+ private axis;
6
+ private entriesMap;
7
+ private collisionPairs;
8
+ private entriesToDelete;
9
+ constructor(options: SystemOptions);
10
+ mount(): void;
11
+ unmount(): void;
12
+ private handleActorAdd;
13
+ private handleActorRemove;
14
+ private checkOnReorientation;
15
+ private getOrientationData;
16
+ private addCollisionEntry;
17
+ private updateCollisionEntry;
18
+ private addToSortedList;
19
+ private updateSortedList;
20
+ private clearSortedList;
21
+ private getAxes;
22
+ private areStaticBodies;
23
+ private testAABB;
24
+ private sweepAndPrune;
25
+ private checkOnIntersection;
26
+ private sendCollisionEvent;
27
+ private clearDeletedEntries;
28
+ update(): void;
29
+ }
@@ -0,0 +1,235 @@
1
+ import { ActorCollection } from '../../../../../engine/actor';
2
+ import { Transform, ColliderContainer, RigidBody, } from '../../../../components';
3
+ import { AddActor, RemoveActor } from '../../../../../engine/events';
4
+ import { Collision } from '../../../../events';
5
+ import { insertionSort } from '../../../../../engine/data-lib';
6
+ import { geometryBuilders } from './geometry-builders';
7
+ import { aabbBuilders } from './aabb-builders';
8
+ import { intersectionCheckers } from './intersection-checkers';
9
+ import { DispersionCalculator } from './dispersion-calculator';
10
+ import { checkTransform, checkCollider } from './reorientation-checkers';
11
+ export class CollisionDetectionSubsystem {
12
+ actorCollection;
13
+ scene;
14
+ axis;
15
+ entriesMap;
16
+ collisionPairs;
17
+ entriesToDelete;
18
+ constructor(options) {
19
+ this.actorCollection = new ActorCollection(options.scene, {
20
+ components: [
21
+ ColliderContainer,
22
+ Transform,
23
+ ],
24
+ });
25
+ this.scene = options.scene;
26
+ this.axis = {
27
+ x: {
28
+ sortedList: [],
29
+ dispersionCalculator: new DispersionCalculator('x'),
30
+ },
31
+ y: {
32
+ sortedList: [],
33
+ dispersionCalculator: new DispersionCalculator('y'),
34
+ },
35
+ };
36
+ this.entriesMap = new Map();
37
+ this.collisionPairs = [];
38
+ this.entriesToDelete = new Set();
39
+ }
40
+ mount() {
41
+ this.actorCollection.forEach((actor) => this.addCollisionEntry(actor));
42
+ this.actorCollection.addEventListener(AddActor, this.handleActorAdd);
43
+ this.actorCollection.addEventListener(RemoveActor, this.handleActorRemove);
44
+ }
45
+ unmount() {
46
+ this.actorCollection.removeEventListener(AddActor, this.handleActorAdd);
47
+ this.actorCollection.removeEventListener(RemoveActor, this.handleActorRemove);
48
+ }
49
+ handleActorAdd = (event) => {
50
+ this.addCollisionEntry(event.actor);
51
+ };
52
+ handleActorRemove = (event) => {
53
+ this.entriesToDelete.add(event.actor.id);
54
+ };
55
+ checkOnReorientation(actor) {
56
+ const entry = this.entriesMap.get(actor.id);
57
+ if (!entry) {
58
+ return true;
59
+ }
60
+ const transform = actor.getComponent(Transform);
61
+ const colliderContainer = actor.getComponent(ColliderContainer);
62
+ const transformOld = entry.orientationData.transform;
63
+ const colliderOld = entry.orientationData.collider;
64
+ return checkTransform(transform, transformOld) || checkCollider(colliderContainer, colliderOld);
65
+ }
66
+ getOrientationData(actor) {
67
+ const transform = actor.getComponent(Transform);
68
+ const colliderContainer = actor.getComponent(ColliderContainer);
69
+ return {
70
+ transform: {
71
+ offsetX: transform.offsetX,
72
+ offsetY: transform.offsetY,
73
+ rotation: transform.rotation,
74
+ scaleX: transform.scaleX,
75
+ scaleY: transform.scaleY,
76
+ },
77
+ collider: {
78
+ type: colliderContainer.type,
79
+ centerX: colliderContainer.collider.centerX,
80
+ centerY: colliderContainer.collider.centerY,
81
+ sizeX: colliderContainer.collider.sizeX,
82
+ sizeY: colliderContainer.collider.sizeY,
83
+ radius: colliderContainer.collider.radius,
84
+ },
85
+ };
86
+ }
87
+ addCollisionEntry(actor) {
88
+ const transform = actor.getComponent(Transform);
89
+ const colliderContainer = actor.getComponent(ColliderContainer);
90
+ const geometry = geometryBuilders[colliderContainer.type](colliderContainer, transform);
91
+ const aabb = aabbBuilders[colliderContainer.type](geometry);
92
+ const entry = {
93
+ actor,
94
+ aabb,
95
+ geometry,
96
+ orientationData: this.getOrientationData(actor),
97
+ };
98
+ this.axis.x.dispersionCalculator.addToSample(aabb);
99
+ this.addToSortedList(entry, 'x');
100
+ this.axis.y.dispersionCalculator.addToSample(aabb);
101
+ this.addToSortedList(entry, 'y');
102
+ this.entriesMap.set(actor.id, entry);
103
+ }
104
+ updateCollisionEntry(actor) {
105
+ const transform = actor.getComponent(Transform);
106
+ const colliderContainer = actor.getComponent(ColliderContainer);
107
+ const geometry = geometryBuilders[colliderContainer.type](colliderContainer, transform);
108
+ const aabb = aabbBuilders[colliderContainer.type](geometry);
109
+ const entry = this.entriesMap.get(actor.id);
110
+ const prevAABB = entry.aabb;
111
+ entry.aabb = aabb;
112
+ entry.geometry = geometry;
113
+ entry.orientationData = this.getOrientationData(actor);
114
+ this.axis.x.dispersionCalculator.removeFromSample(prevAABB);
115
+ this.axis.x.dispersionCalculator.addToSample(aabb);
116
+ this.updateSortedList(entry, 'x');
117
+ this.axis.y.dispersionCalculator.removeFromSample(prevAABB);
118
+ this.axis.y.dispersionCalculator.addToSample(aabb);
119
+ this.updateSortedList(entry, 'y');
120
+ }
121
+ addToSortedList(entry, axis) {
122
+ const min = { value: entry.aabb.min[axis], entry };
123
+ const max = { value: entry.aabb.max[axis], entry };
124
+ this.axis[axis].sortedList.push(min, max);
125
+ entry.edges ??= {};
126
+ entry.edges[axis] = [min, max];
127
+ }
128
+ updateSortedList(entry, axis) {
129
+ const [min, max] = entry.edges[axis];
130
+ min.value = entry.aabb.min[axis];
131
+ min.entry = entry;
132
+ max.value = entry.aabb.max[axis];
133
+ max.entry = entry;
134
+ }
135
+ clearSortedList(axis) {
136
+ this.axis[axis].sortedList = this.axis[axis].sortedList.filter((item) => !this.entriesToDelete.has(item.entry.actor.id));
137
+ }
138
+ getAxes() {
139
+ const xDispersion = this.axis.x.dispersionCalculator.getDispersion();
140
+ const yDispersion = this.axis.y.dispersionCalculator.getDispersion();
141
+ return xDispersion >= yDispersion ? ['x', 'y'] : ['y', 'x'];
142
+ }
143
+ areStaticBodies(entry1, entry2) {
144
+ const { actor: actor1 } = entry1;
145
+ const { actor: actor2 } = entry2;
146
+ const rigidBody1 = actor1.getComponent(RigidBody);
147
+ const rigidBody2 = actor2.getComponent(RigidBody);
148
+ return rigidBody1?.type === 'static' && rigidBody2?.type === 'static';
149
+ }
150
+ testAABB(entry1, entry2, axis) {
151
+ const aabb1 = entry1.aabb;
152
+ const aabb2 = entry2.aabb;
153
+ return aabb1.max[axis] > aabb2.min[axis] && aabb1.min[axis] < aabb2.max[axis];
154
+ }
155
+ sweepAndPrune() {
156
+ const [mainAxis, secondAxis] = this.getAxes();
157
+ const { sortedList } = this.axis[mainAxis];
158
+ insertionSort(sortedList, (arg1, arg2) => arg1.value - arg2.value);
159
+ const activeEntries = new Set();
160
+ let collisionIndex = 0;
161
+ for (const item of sortedList) {
162
+ const { entry } = item;
163
+ if (!activeEntries.has(entry)) {
164
+ activeEntries.forEach((activeEntry) => {
165
+ if (!this.testAABB(entry, activeEntry, secondAxis)) {
166
+ return;
167
+ }
168
+ if (this.areStaticBodies(entry, activeEntry)) {
169
+ return;
170
+ }
171
+ this.collisionPairs[collisionIndex] = [entry, activeEntry];
172
+ collisionIndex += 1;
173
+ });
174
+ activeEntries.add(entry);
175
+ }
176
+ else {
177
+ activeEntries.delete(entry);
178
+ }
179
+ }
180
+ if (this.collisionPairs.length > collisionIndex) {
181
+ this.collisionPairs.length = collisionIndex;
182
+ }
183
+ }
184
+ checkOnIntersection(pair) {
185
+ const [arg1, arg2] = pair;
186
+ const type1 = arg1.actor.getComponent(ColliderContainer).type;
187
+ const type2 = arg2.actor.getComponent(ColliderContainer).type;
188
+ return intersectionCheckers[type1][type2](arg1, arg2);
189
+ }
190
+ sendCollisionEvent(actor1, actor2, intersection) {
191
+ const { mtv1, mtv2 } = intersection;
192
+ this.scene.dispatchEventImmediately(Collision, {
193
+ actor1,
194
+ actor2,
195
+ mtv1,
196
+ mtv2,
197
+ });
198
+ this.scene.dispatchEventImmediately(Collision, {
199
+ actor1: actor2,
200
+ actor2: actor1,
201
+ mtv1: mtv2,
202
+ mtv2: mtv1,
203
+ });
204
+ }
205
+ clearDeletedEntries() {
206
+ if (this.entriesToDelete.size === 0) {
207
+ return;
208
+ }
209
+ this.clearSortedList('x');
210
+ this.clearSortedList('y');
211
+ this.entriesToDelete.forEach((id) => {
212
+ const entry = this.entriesMap.get(id);
213
+ this.axis.x.dispersionCalculator.removeFromSample(entry.aabb);
214
+ this.axis.y.dispersionCalculator.removeFromSample(entry.aabb);
215
+ this.entriesMap.delete(id);
216
+ });
217
+ this.entriesToDelete.clear();
218
+ }
219
+ update() {
220
+ this.clearDeletedEntries();
221
+ this.actorCollection.forEach((actor) => {
222
+ if (!this.checkOnReorientation(actor)) {
223
+ return;
224
+ }
225
+ this.updateCollisionEntry(actor);
226
+ });
227
+ this.sweepAndPrune();
228
+ this.collisionPairs.forEach((pair) => {
229
+ const intersection = this.checkOnIntersection(pair);
230
+ if (intersection) {
231
+ this.sendCollisionEvent(pair[0].actor, pair[1].actor, intersection);
232
+ }
233
+ });
234
+ }
235
+ }
@@ -0,0 +1,16 @@
1
+ import type { CollisionEntry, Intersection } from '../types';
2
+ /**
3
+ * Checks box and circle colliders at the intersection.
4
+ * The main target is to check two possible scenarios:
5
+ * - circle lies inside box
6
+ * - circle intersects one of the boxe's edges
7
+ * Steps of the algorithm:
8
+ * 1. Find the nearest edge to circle center and check wether it intersects with circle or not
9
+ * For each edge three points should be considered: corners and circle center projection
10
+ * 2. Determine is the circle center lies inside of the box or not.
11
+ * This affects how we should compute mtv distance
12
+ * 3. If circle doesn't have any intersection with boxe's edges
13
+ * and circle center lies outside of the box – return false.
14
+ * Otherwise compute mtv vectors considering relative position of circle and box centers
15
+ */
16
+ export declare const checkBoxAndCircleIntersection: (arg1: CollisionEntry, arg2: CollisionEntry) => Intersection | false;
@@ -0,0 +1,80 @@
1
+ import { ColliderContainer } from '../../../../../components';
2
+ import { MathOps, Vector2, VectorOps } from '../../../../../../engine/math-lib';
3
+ const getMtvs = (axis, overlap, point1, point2) => {
4
+ axis.multiplyNumber((1 / axis.magnitude) * overlap);
5
+ const positiveX = Math.abs(axis.x);
6
+ const negativeX = -Math.abs(axis.x);
7
+ const positiveY = Math.abs(axis.y);
8
+ const negativeY = -Math.abs(axis.y);
9
+ return {
10
+ mtv1: new Vector2(point1.x < point2.x ? negativeX : positiveX, point1.y < point2.y ? negativeY : positiveY),
11
+ mtv2: new Vector2(point2.x > point1.x ? positiveX : negativeX, point2.y > point1.y ? positiveY : negativeY),
12
+ };
13
+ };
14
+ /**
15
+ * Checks box and circle colliders at the intersection.
16
+ * The main target is to check two possible scenarios:
17
+ * - circle lies inside box
18
+ * - circle intersects one of the boxe's edges
19
+ * Steps of the algorithm:
20
+ * 1. Find the nearest edge to circle center and check wether it intersects with circle or not
21
+ * For each edge three points should be considered: corners and circle center projection
22
+ * 2. Determine is the circle center lies inside of the box or not.
23
+ * This affects how we should compute mtv distance
24
+ * 3. If circle doesn't have any intersection with boxe's edges
25
+ * and circle center lies outside of the box – return false.
26
+ * Otherwise compute mtv vectors considering relative position of circle and box centers
27
+ */
28
+ export const checkBoxAndCircleIntersection = (arg1, arg2) => {
29
+ let box;
30
+ let circle;
31
+ if (arg1.actor.getComponent(ColliderContainer).type === 'boxCollider') {
32
+ box = arg1.geometry;
33
+ circle = arg2.geometry;
34
+ }
35
+ else {
36
+ box = arg2.geometry;
37
+ circle = arg1.geometry;
38
+ }
39
+ let isIntersection = false;
40
+ let minDistance = Infinity;
41
+ let minDistanceAxis;
42
+ const { center: circleCenter } = circle;
43
+ for (const edge of box.edges) {
44
+ const projectedPoint = VectorOps.projectPointToEdge(circleCenter, edge);
45
+ const minX = Math.min(edge.point1.x, edge.point2.x);
46
+ const maxX = Math.max(edge.point1.x, edge.point2.x);
47
+ const minY = Math.min(edge.point1.y, edge.point2.y);
48
+ const maxY = Math.max(edge.point1.y, edge.point2.y);
49
+ const isPointOnEdge = projectedPoint.x >= minX
50
+ && projectedPoint.x <= maxX
51
+ && projectedPoint.y >= minY
52
+ && projectedPoint.y <= maxY;
53
+ const distanceProjection = isPointOnEdge ? MathOps.getDistanceBetweenTwoPoints(circleCenter.x, projectedPoint.x, circleCenter.y, projectedPoint.y) : Infinity;
54
+ const distance1 = MathOps.getDistanceBetweenTwoPoints(circleCenter.x, edge.point1.x, circleCenter.y, edge.point1.y);
55
+ const distance2 = MathOps.getDistanceBetweenTwoPoints(circleCenter.x, edge.point2.x, circleCenter.y, edge.point2.y);
56
+ const isInsideCircle = Math.min(distanceProjection, distance1, distance2) < circle.radius;
57
+ isIntersection = isIntersection || isInsideCircle;
58
+ if (isPointOnEdge && distanceProjection < minDistance) {
59
+ minDistance = distanceProjection;
60
+ minDistanceAxis = edge.normal.clone();
61
+ }
62
+ if (distance1 < minDistance) {
63
+ minDistance = distance1;
64
+ minDistanceAxis = minDistance !== 0
65
+ ? new Vector2(edge.point1.x - circleCenter.x, edge.point1.y - circleCenter.y)
66
+ : edge.normal.clone();
67
+ }
68
+ if (distance2 < minDistance) {
69
+ minDistance = distance2;
70
+ minDistanceAxis = minDistance !== 0
71
+ ? new Vector2(edge.point2.x - circleCenter.x, edge.point2.y - circleCenter.y)
72
+ : edge.normal.clone();
73
+ }
74
+ }
75
+ const isInsidePolygon = VectorOps.isPointInPolygon(circleCenter, box.edges);
76
+ if (!isIntersection && !isInsidePolygon) {
77
+ return false;
78
+ }
79
+ return getMtvs(minDistanceAxis, isInsidePolygon ? circle.radius + minDistance : circle.radius - minDistance, arg1.geometry.center, arg2.geometry.center);
80
+ };
@@ -0,0 +1,6 @@
1
+ import type { CollisionEntry, Intersection } from '../types';
2
+ /**
3
+ * Checks boxes colliders at the intersection.
4
+ * The SAT (separating axis theorem) is used to determine an intersection and mtvs.
5
+ */
6
+ export declare const checkBoxesIntersection: (arg1: CollisionEntry, arg2: CollisionEntry) => Intersection | false;
@@ -0,0 +1,72 @@
1
+ import { Vector2, VectorOps } from '../../../../../../engine/math-lib';
2
+ const projectPolygon = (polygon, axisVector) => {
3
+ const initialProjectionValue = VectorOps.dotProduct(polygon.edges[0].point1, axisVector);
4
+ const projection = {
5
+ min: initialProjectionValue,
6
+ max: initialProjectionValue,
7
+ };
8
+ for (let i = 1; i < polygon.edges.length; i += 1) {
9
+ const projectionValue = VectorOps.dotProduct(polygon.edges[i].point1, axisVector);
10
+ if (projectionValue < projection.min) {
11
+ projection.min = projectionValue;
12
+ }
13
+ else if (projectionValue > projection.max) {
14
+ projection.max = projectionValue;
15
+ }
16
+ }
17
+ return projection;
18
+ };
19
+ /**
20
+ * Checks boxes colliders at the intersection.
21
+ * The SAT (separating axis theorem) is used to determine an intersection and mtvs.
22
+ */
23
+ export const checkBoxesIntersection = (arg1, arg2) => {
24
+ let overlap = Infinity;
25
+ let normal;
26
+ const geometry1 = arg1.geometry;
27
+ const geometry2 = arg2.geometry;
28
+ // Consider arg1 box normals as axes
29
+ for (const edge of geometry1.edges) {
30
+ const axis = edge.normal;
31
+ const aProjection = projectPolygon(geometry1, axis);
32
+ const bProjection = projectPolygon(geometry2, axis);
33
+ const aDistance = aProjection.min - bProjection.max;
34
+ const bDistance = bProjection.min - aProjection.max;
35
+ if (aDistance > 0 || bDistance > 0) {
36
+ return false;
37
+ }
38
+ const axisOverlap = Math.min(Math.abs(aDistance), Math.abs(bDistance));
39
+ if (axisOverlap < overlap) {
40
+ overlap = axisOverlap;
41
+ normal = axis;
42
+ }
43
+ }
44
+ // Consider arg2 box normals as axes
45
+ for (const edge of geometry2.edges) {
46
+ const axis = edge.normal;
47
+ const aProjection = projectPolygon(geometry1, axis);
48
+ const bProjection = projectPolygon(geometry2, axis);
49
+ const aDistance = aProjection.min - bProjection.max;
50
+ const bDistance = bProjection.min - aProjection.max;
51
+ if (aDistance > 0 || bDistance > 0) {
52
+ return false;
53
+ }
54
+ const axisOverlap = Math.min(Math.abs(aDistance), Math.abs(bDistance));
55
+ if (axisOverlap < overlap) {
56
+ overlap = axisOverlap;
57
+ normal = axis;
58
+ }
59
+ }
60
+ const { x: xArg1, y: yArg1 } = geometry1.center;
61
+ const { x: xArg2, y: yArg2 } = geometry2.center;
62
+ const mtv = normal.clone();
63
+ mtv.multiplyNumber(overlap);
64
+ const positiveX = Math.abs(mtv.x);
65
+ const negativeX = -Math.abs(mtv.x);
66
+ const positiveY = Math.abs(mtv.y);
67
+ const negativeY = -Math.abs(mtv.y);
68
+ return {
69
+ mtv1: new Vector2(xArg1 < xArg2 ? negativeX : positiveX, yArg1 < yArg2 ? negativeY : positiveY),
70
+ mtv2: new Vector2(xArg2 > xArg1 ? positiveX : negativeX, yArg2 > yArg1 ? positiveY : negativeY),
71
+ };
72
+ };
@@ -0,0 +1,11 @@
1
+ import type { CollisionEntry, Intersection } from '../types';
2
+ /**
3
+ * Checks circles at the intersection.
4
+ * Steps of the alghorith:
5
+ * 1. Calculate distance between circles centers.
6
+ * 2. If distance greater or equal to summ of circles radiuses then is no intersection.
7
+ * 3. If distance is zero then circles centers lie at the same point, so just X axis used for mtv.
8
+ * 4. If distance less than summ of circles radiuses and it's non-zero
9
+ * then circles centers used to get the axis.
10
+ */
11
+ export declare const checkCirclesIntersection: (arg1: CollisionEntry, arg2: CollisionEntry) => Intersection | false;
@@ -0,0 +1,39 @@
1
+ import { Vector2 } from '../../../../../../engine/math-lib';
2
+ /**
3
+ * Checks circles at the intersection.
4
+ * Steps of the alghorith:
5
+ * 1. Calculate distance between circles centers.
6
+ * 2. If distance greater or equal to summ of circles radiuses then is no intersection.
7
+ * 3. If distance is zero then circles centers lie at the same point, so just X axis used for mtv.
8
+ * 4. If distance less than summ of circles radiuses and it's non-zero
9
+ * then circles centers used to get the axis.
10
+ */
11
+ export const checkCirclesIntersection = (arg1, arg2) => {
12
+ const { radius: rArg1 } = arg1.geometry;
13
+ const { radius: rArg2 } = arg2.geometry;
14
+ const { x: xArg1, y: yArg1 } = arg1.geometry.center;
15
+ const { x: xArg2, y: yArg2 } = arg2.geometry.center;
16
+ const x = xArg1 - xArg2;
17
+ const y = yArg1 - yArg2;
18
+ const distance = Math.sqrt((x ** 2) + (y ** 2));
19
+ if (distance >= rArg1 + rArg2) {
20
+ return false;
21
+ }
22
+ if (distance === 0) {
23
+ return {
24
+ mtv1: new Vector2(rArg1 + rArg2, 0),
25
+ mtv2: new Vector2(-(rArg1 + rArg2), 0),
26
+ };
27
+ }
28
+ const mtv = new Vector2(x, y);
29
+ const overlap = rArg1 + rArg2 - distance;
30
+ mtv.multiplyNumber((1 / distance) * overlap);
31
+ const positiveX = Math.abs(mtv.x);
32
+ const negativeX = -Math.abs(mtv.x);
33
+ const positiveY = Math.abs(mtv.y);
34
+ const negativeY = -Math.abs(mtv.y);
35
+ return {
36
+ mtv1: new Vector2(xArg1 < xArg2 ? negativeX : positiveX, yArg1 < yArg2 ? negativeY : positiveY),
37
+ mtv2: new Vector2(xArg2 < xArg1 ? negativeX : positiveX, yArg2 < yArg1 ? negativeY : positiveY),
38
+ };
39
+ };
@@ -0,0 +1,3 @@
1
+ import type { CollisionEntry, Intersection } from '../types';
2
+ export type CheckIntersectionFn = (arg1: CollisionEntry, arg2: CollisionEntry) => Intersection | false;
3
+ export declare const intersectionCheckers: Record<string, Record<string, CheckIntersectionFn>>;