@inglorious/engine 0.1.0 → 0.2.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 (292) hide show
  1. package/README.md +39 -36
  2. package/package.json +20 -33
  3. package/src/engine/ai/movement/dynamic/align.js +63 -63
  4. package/src/engine/ai/movement/dynamic/arrive.js +42 -43
  5. package/src/engine/ai/movement/dynamic/evade.js +38 -38
  6. package/src/engine/ai/movement/dynamic/face.js +19 -20
  7. package/src/engine/ai/movement/dynamic/flee.js +45 -45
  8. package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
  9. package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
  10. package/src/engine/ai/movement/dynamic/pursue.js +38 -38
  11. package/src/engine/ai/movement/dynamic/seek.js +44 -44
  12. package/src/engine/ai/movement/dynamic/wander.js +31 -32
  13. package/src/engine/ai/movement/kinematic/align.js +37 -37
  14. package/src/engine/ai/movement/kinematic/arrive.js +42 -42
  15. package/src/engine/ai/movement/kinematic/face.js +19 -20
  16. package/src/engine/ai/movement/kinematic/flee.js +26 -26
  17. package/src/engine/ai/movement/kinematic/seek.js +26 -26
  18. package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
  19. package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
  20. package/src/engine/ai/movement/kinematic/wander.js +27 -27
  21. package/src/engine/animation/sprite.js +101 -0
  22. package/src/engine/animation/ticker.js +38 -0
  23. package/src/engine/behaviors/camera.js +68 -0
  24. package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
  25. package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
  26. package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
  27. package/src/engine/behaviors/controls/event-handlers.js +17 -0
  28. package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
  29. package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
  30. package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
  31. package/src/engine/behaviors/debug/collision.js +35 -0
  32. package/src/engine/behaviors/fps.js +29 -0
  33. package/src/engine/behaviors/fsm.js +33 -0
  34. package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
  35. package/src/engine/behaviors/game.js +15 -0
  36. package/src/engine/behaviors/input/controls.js +37 -0
  37. package/src/engine/behaviors/input/gamepad.js +114 -0
  38. package/src/engine/behaviors/input/input.js +48 -0
  39. package/src/engine/behaviors/input/keyboard.js +64 -0
  40. package/src/engine/behaviors/input/mouse.js +91 -0
  41. package/src/engine/behaviors/physics/bouncy.js +25 -0
  42. package/src/engine/behaviors/physics/clamped.js +36 -0
  43. package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
  44. package/src/engine/behaviors/physics/jumpable.js +145 -0
  45. package/src/engine/behaviors/ui/button.js +17 -0
  46. package/src/engine/collision/detection.js +110 -115
  47. package/src/engine/core/api.js +34 -0
  48. package/src/engine/core/dev-tools.js +135 -0
  49. package/src/engine/core/engine.js +119 -0
  50. package/src/engine/core/loop.js +15 -0
  51. package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
  52. package/src/engine/{loop → core/loops}/elapsed.js +22 -23
  53. package/src/engine/{loop → core/loops}/fixed.js +27 -28
  54. package/src/engine/{loop → core/loops}/flash.js +13 -14
  55. package/src/engine/{loop → core/loops}/lag.js +26 -27
  56. package/src/engine/core/select.js +26 -0
  57. package/src/engine/core/store.js +178 -0
  58. package/src/engine/core/store.test.js +110 -0
  59. package/src/engine/movement/dynamic/modern.js +21 -24
  60. package/src/engine/movement/dynamic/tank.js +43 -43
  61. package/src/engine/movement/kinematic/modern.js +16 -16
  62. package/src/engine/movement/kinematic/modern.test.js +27 -27
  63. package/src/engine/movement/kinematic/tank.js +27 -27
  64. package/src/engine/physics/bounds.js +138 -0
  65. package/src/engine/physics/position.js +43 -0
  66. package/src/engine/physics/position.test.js +80 -0
  67. package/src/engine/systems/sprite-animation.js +27 -0
  68. package/src/main.js +10 -5
  69. package/src/renderers/canvas/absolute-position.js +18 -0
  70. package/src/renderers/canvas/camera.js +13 -0
  71. package/src/renderers/canvas/canvas-renderer.js +68 -0
  72. package/src/{ui → renderers}/canvas/character.js +38 -35
  73. package/src/{ui → renderers}/canvas/form/button.js +25 -25
  74. package/src/{ui → renderers}/canvas/fps.js +18 -18
  75. package/src/renderers/canvas/image/hitmask.js +51 -0
  76. package/src/{ui → renderers}/canvas/image/image.js +34 -37
  77. package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
  78. package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
  79. package/src/{ui → renderers}/canvas/mouse.js +37 -37
  80. package/src/renderers/canvas/rendering-system.js +79 -0
  81. package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
  82. package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
  83. package/src/renderers/react/game/character/index.jsx +20 -0
  84. package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
  85. package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
  86. package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
  87. package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
  88. package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
  89. package/src/{ui → renderers}/react/game/game.jsx +72 -71
  90. package/src/{ui → renderers}/react/game/index.jsx +29 -29
  91. package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
  92. package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
  93. package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
  94. package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
  95. package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
  96. package/src/{ui → renderers}/react/index.jsx +9 -9
  97. package/src/utils/algorithms/decision-tree.js +24 -24
  98. package/src/utils/algorithms/decision-tree.test.js +153 -102
  99. package/src/utils/algorithms/path-finding.js +155 -155
  100. package/src/utils/algorithms/path-finding.test.js +151 -151
  101. package/src/utils/data-structures/array.js +83 -83
  102. package/src/utils/data-structures/array.test.js +173 -173
  103. package/src/utils/data-structures/board.js +159 -159
  104. package/src/utils/data-structures/board.test.js +242 -242
  105. package/src/utils/data-structures/boolean.js +9 -9
  106. package/src/utils/data-structures/heap.js +164 -164
  107. package/src/utils/data-structures/heap.test.js +103 -103
  108. package/src/utils/data-structures/object.js +138 -102
  109. package/src/utils/data-structures/object.test.js +218 -121
  110. package/src/utils/data-structures/objects.js +66 -48
  111. package/src/utils/data-structures/objects.test.js +99 -99
  112. package/src/utils/data-structures/tree.js +36 -36
  113. package/src/utils/data-structures/tree.test.js +33 -33
  114. package/src/utils/functions/functions.js +19 -19
  115. package/src/utils/functions/functions.test.js +23 -23
  116. package/src/utils/math/geometry/circle.js +70 -117
  117. package/src/utils/math/geometry/circle.test.js +97 -97
  118. package/src/utils/math/geometry/hitmask.js +70 -39
  119. package/src/utils/math/geometry/hitmask.test.js +155 -84
  120. package/src/utils/math/geometry/line.js +35 -35
  121. package/src/utils/math/geometry/line.test.js +49 -49
  122. package/src/utils/math/geometry/point.js +78 -71
  123. package/src/utils/math/geometry/point.test.js +81 -81
  124. package/src/utils/math/geometry/rectangle.js +76 -45
  125. package/src/utils/math/geometry/rectangle.test.js +42 -42
  126. package/src/utils/math/geometry/segment.js +80 -80
  127. package/src/utils/math/geometry/segment.test.js +183 -183
  128. package/src/utils/math/geometry/triangle.js +15 -15
  129. package/src/utils/math/geometry/triangle.test.js +11 -11
  130. package/src/utils/math/linear-algebra/2d.js +28 -28
  131. package/src/utils/math/linear-algebra/2d.test.js +17 -17
  132. package/src/utils/math/linear-algebra/quaternion.js +22 -22
  133. package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
  134. package/src/utils/math/linear-algebra/quaternions.js +20 -20
  135. package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
  136. package/src/utils/math/linear-algebra/vector.js +327 -302
  137. package/src/utils/math/linear-algebra/vector.test.js +265 -257
  138. package/src/utils/math/linear-algebra/vectors.js +122 -122
  139. package/src/utils/math/linear-algebra/vectors.test.js +65 -65
  140. package/src/utils/math/linear-interpolation.js +9 -0
  141. package/src/utils/math/numbers.js +90 -90
  142. package/src/utils/math/numbers.test.js +137 -137
  143. package/src/utils/math/rng.js +44 -44
  144. package/src/utils/math/rng.test.js +39 -39
  145. package/src/utils/math/statistics.js +43 -43
  146. package/src/utils/math/statistics.test.js +47 -47
  147. package/src/utils/math/trigonometry.js +89 -89
  148. package/src/utils/math/trigonometry.test.js +52 -52
  149. package/src/utils/physics/acceleration.js +61 -63
  150. package/src/utils/physics/friction.js +28 -30
  151. package/src/utils/physics/friction.test.js +42 -44
  152. package/src/utils/physics/gravity.js +69 -71
  153. package/src/utils/physics/gravity.test.js +77 -80
  154. package/src/utils/physics/jump.js +31 -41
  155. package/src/utils/physics/velocity.js +36 -38
  156. package/src/docs/ai/movement/dynamic/align.js +0 -131
  157. package/src/docs/ai/movement/dynamic/arrive.js +0 -88
  158. package/src/docs/ai/movement/dynamic/dynamic.mdx +0 -99
  159. package/src/docs/ai/movement/dynamic/dynamic.stories.js +0 -58
  160. package/src/docs/ai/movement/dynamic/evade.js +0 -72
  161. package/src/docs/ai/movement/dynamic/face.js +0 -90
  162. package/src/docs/ai/movement/dynamic/flee.js +0 -38
  163. package/src/docs/ai/movement/dynamic/look-where-youre-going.js +0 -114
  164. package/src/docs/ai/movement/dynamic/match-velocity.js +0 -92
  165. package/src/docs/ai/movement/dynamic/pursue.js +0 -72
  166. package/src/docs/ai/movement/dynamic/seek.js +0 -37
  167. package/src/docs/ai/movement/dynamic/wander.js +0 -71
  168. package/src/docs/ai/movement/kinematic/align.js +0 -122
  169. package/src/docs/ai/movement/kinematic/arrive.js +0 -78
  170. package/src/docs/ai/movement/kinematic/face.js +0 -82
  171. package/src/docs/ai/movement/kinematic/flee.js +0 -36
  172. package/src/docs/ai/movement/kinematic/kinematic.mdx +0 -67
  173. package/src/docs/ai/movement/kinematic/kinematic.stories.js +0 -42
  174. package/src/docs/ai/movement/kinematic/seek.js +0 -34
  175. package/src/docs/ai/movement/kinematic/wander-as-seek.js +0 -62
  176. package/src/docs/ai/movement/kinematic/wander.js +0 -28
  177. package/src/docs/bounds.js +0 -7
  178. package/src/docs/code-reuse.js +0 -35
  179. package/src/docs/collision/circles.js +0 -58
  180. package/src/docs/collision/collision.mdx +0 -27
  181. package/src/docs/collision/collision.stories.js +0 -22
  182. package/src/docs/collision/platform.js +0 -76
  183. package/src/docs/collision/tilemap.js +0 -181
  184. package/src/docs/empty.js +0 -1
  185. package/src/docs/engine.mdx +0 -81
  186. package/src/docs/engine.stories.js +0 -37
  187. package/src/docs/event-handlers.js +0 -68
  188. package/src/docs/framerate.js +0 -37
  189. package/src/docs/game.jsx +0 -15
  190. package/src/docs/image/image.js +0 -19
  191. package/src/docs/image/image.stories.js +0 -22
  192. package/src/docs/image/sprite.js +0 -39
  193. package/src/docs/image/tilemap.js +0 -84
  194. package/src/docs/input/controls.js +0 -67
  195. package/src/docs/input/gamepad.js +0 -67
  196. package/src/docs/input/input.mdx +0 -55
  197. package/src/docs/input/input.stories.js +0 -27
  198. package/src/docs/input/keyboard.js +0 -58
  199. package/src/docs/input/mouse.js +0 -32
  200. package/src/docs/instances.js +0 -49
  201. package/src/docs/player/dynamic/double-jump.js +0 -90
  202. package/src/docs/player/dynamic/dynamic.stories.js +0 -32
  203. package/src/docs/player/dynamic/jump.js +0 -83
  204. package/src/docs/player/dynamic/modern-controls.js +0 -57
  205. package/src/docs/player/dynamic/shooter-controls.js +0 -51
  206. package/src/docs/player/dynamic/tank-controls.js +0 -44
  207. package/src/docs/player/kinematic/double-jump.js +0 -90
  208. package/src/docs/player/kinematic/jump.js +0 -82
  209. package/src/docs/player/kinematic/kinematic.stories.js +0 -32
  210. package/src/docs/player/kinematic/modern-controls.js +0 -56
  211. package/src/docs/player/kinematic/shooter-controls.js +0 -48
  212. package/src/docs/player/kinematic/tank-controls.js +0 -42
  213. package/src/docs/quick-start/first-game.js +0 -49
  214. package/src/docs/quick-start/hello-world.js +0 -1
  215. package/src/docs/quick-start.mdx +0 -127
  216. package/src/docs/quick-start.stories.js +0 -17
  217. package/src/docs/recipes/add-and-remove.js +0 -71
  218. package/src/docs/recipes/add-instance.js +0 -42
  219. package/src/docs/recipes/decision-tree.js +0 -169
  220. package/src/docs/recipes/random-instances.js +0 -25
  221. package/src/docs/recipes/recipes.mdx +0 -81
  222. package/src/docs/recipes/recipes.stories.js +0 -37
  223. package/src/docs/recipes/remove-instance.js +0 -52
  224. package/src/docs/recipes/states.js +0 -64
  225. package/src/docs/ui/button.js +0 -28
  226. package/src/docs/ui/form.stories.js +0 -55
  227. package/src/docs/ui-chooser.jsx +0 -6
  228. package/src/docs/utils/data-structures/object.mdx +0 -47
  229. package/src/docs/utils/data-structures/objects.mdx +0 -30
  230. package/src/docs/utils/functions/functions.mdx +0 -34
  231. package/src/docs/utils/math/geometry/circle.mdx +0 -55
  232. package/src/docs/utils/math/geometry/point.mdx +0 -38
  233. package/src/docs/utils/math/geometry/rectangle.mdx +0 -24
  234. package/src/docs/utils/math/geometry/segment.mdx +0 -55
  235. package/src/docs/utils/math/geometry/triangle.mdx +0 -22
  236. package/src/docs/utils/math/linear-algebra/2d.mdx +0 -22
  237. package/src/docs/utils/math/linear-algebra/quaternion.mdx +0 -21
  238. package/src/docs/utils/math/linear-algebra/quaternions.mdx +0 -22
  239. package/src/docs/utils/math/linear-algebra/vector.mdx +0 -177
  240. package/src/docs/utils/math/linear-algebra/vectors.mdx +0 -58
  241. package/src/docs/utils/math/numbers.mdx +0 -76
  242. package/src/docs/utils/math/random.mdx +0 -35
  243. package/src/docs/utils/math/statistics.mdx +0 -38
  244. package/src/docs/utils/math/trigonometry.mdx +0 -85
  245. package/src/docs/utils/physics/friction.mdx +0 -20
  246. package/src/docs/utils/physics/gravity.mdx +0 -28
  247. package/src/engine/loop.js +0 -15
  248. package/src/engine/store.js +0 -174
  249. package/src/engine/store.test.js +0 -256
  250. package/src/engine.js +0 -74
  251. package/src/game/animation.js +0 -26
  252. package/src/game/bounds.js +0 -66
  253. package/src/game/decorators/character.js +0 -5
  254. package/src/game/decorators/clamp-to-bounds.js +0 -15
  255. package/src/game/decorators/controls/dynamic/modern.js +0 -48
  256. package/src/game/decorators/controls/dynamic/shooter.js +0 -47
  257. package/src/game/decorators/controls/dynamic/tank.js +0 -55
  258. package/src/game/decorators/controls/kinematic/modern.js +0 -49
  259. package/src/game/decorators/controls/kinematic/shooter.js +0 -45
  260. package/src/game/decorators/controls/kinematic/tank.js +0 -52
  261. package/src/game/decorators/debug/collisions.js +0 -32
  262. package/src/game/decorators/double-jump.js +0 -70
  263. package/src/game/decorators/fps.js +0 -30
  264. package/src/game/decorators/fsm.js +0 -27
  265. package/src/game/decorators/game.js +0 -11
  266. package/src/game/decorators/image/image.js +0 -5
  267. package/src/game/decorators/image/sprite.js +0 -5
  268. package/src/game/decorators/image/tilemap.js +0 -5
  269. package/src/game/decorators/input/controls.js +0 -27
  270. package/src/game/decorators/input/gamepad.js +0 -74
  271. package/src/game/decorators/input/input.js +0 -41
  272. package/src/game/decorators/input/keyboard.js +0 -49
  273. package/src/game/decorators/input/mouse.js +0 -65
  274. package/src/game/decorators/jump.js +0 -72
  275. package/src/game/decorators/platform.js +0 -5
  276. package/src/game/decorators/ui/button.js +0 -21
  277. package/src/game/sprite.js +0 -119
  278. package/src/ui/canvas/absolute-position.js +0 -17
  279. package/src/ui/canvas/image/hitmask.js +0 -37
  280. package/src/ui/canvas.js +0 -81
  281. package/src/ui/react/game/character/index.jsx +0 -30
  282. package/src/utils/math/geometry/platform.js +0 -42
  283. package/src/utils/math/geometry/platform.test.js +0 -133
  284. /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
  285. /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
  286. /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
  287. /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
  288. /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
  289. /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
  290. /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
  291. /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
  292. /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
@@ -1,81 +1,81 @@
1
- import { expect, test } from "vitest"
2
-
3
- import {
4
- intersectsCircle,
5
- intersectsPoint,
6
- intersectsRectangle,
7
- } from "./point.js"
8
-
9
- test("it should prove that two equal points intersect", () => {
10
- const point1 = [1.5, 1.5, 0]
11
- const point2 = [1.5, 1.5, 0]
12
-
13
- expect(intersectsPoint(point1, point2)).toBe(true)
14
- })
15
-
16
- test("it should prove that two different points do not intersect", () => {
17
- const point1 = [1.5, 1.5, 0]
18
- const point2 = [2, 1, 0]
19
-
20
- expect(intersectsPoint(point1, point2)).toBe(false)
21
- })
22
-
23
- test("it should prove that a point inside of a circle intersects with it", () => {
24
- const point = [1.5, 1.5, 0]
25
- const circle = {
26
- position: [1, 1, 0],
27
- radius: 1,
28
- }
29
-
30
- expect(intersectsCircle(point, circle)).toBe(true)
31
- })
32
-
33
- test("it should prove that a point on the border of a circle intersects with it", () => {
34
- const point = [2, 1, 0]
35
- const circle = {
36
- position: [1, 1, 0],
37
- radius: 1,
38
- }
39
-
40
- expect(intersectsCircle(point, circle)).toBe(true)
41
- })
42
-
43
- test("it should prove that a point outside of a circle does not intersect with it", () => {
44
- const point = [2, 2, 0]
45
- const circle = {
46
- position: [1, 1, 0],
47
- radius: 1,
48
- }
49
-
50
- expect(intersectsCircle(point, circle)).toBe(false)
51
- })
52
-
53
- test("it should prove that a point inside of a rectangle intersects with it", () => {
54
- const point = [1.5, 1.5, 0]
55
- const rectangle = {
56
- position: [1, 1, 0],
57
- size: [2, 2, 0],
58
- }
59
-
60
- expect(intersectsRectangle(point, rectangle)).toBe(true)
61
- })
62
-
63
- test("it should prove that a point on the border of a rectangle intersects with it", () => {
64
- const point = [2, 1, 0]
65
- const rectangle = {
66
- position: [1, 1, 0],
67
- size: [2, 2, 0],
68
- }
69
-
70
- expect(intersectsRectangle(point, rectangle)).toBe(true)
71
- })
72
-
73
- test("it should prove that a point outside of a rectangle does not intersect with it", () => {
74
- const point = [2.5, 2.5, 0]
75
- const rectangle = {
76
- position: [1, 1, 0],
77
- size: [2, 2, 0],
78
- }
79
-
80
- expect(intersectsRectangle(point, rectangle)).toBe(false)
81
- })
1
+ import { expect, test } from "vitest"
2
+
3
+ import {
4
+ intersectsCircle,
5
+ intersectsPoint,
6
+ intersectsRectangle,
7
+ } from "./point.js"
8
+
9
+ test("it should prove that two equal points intersect", () => {
10
+ const point1 = [1.5, 1.5, 0]
11
+ const point2 = [1.5, 1.5, 0]
12
+
13
+ expect(intersectsPoint(point1, point2)).toBe(true)
14
+ })
15
+
16
+ test("it should prove that two different points do not intersect", () => {
17
+ const point1 = [1.5, 1.5, 0]
18
+ const point2 = [2, 1, 0]
19
+
20
+ expect(intersectsPoint(point1, point2)).toBe(false)
21
+ })
22
+
23
+ test("it should prove that a point inside of a circle intersects with it", () => {
24
+ const point = [1.5, 1.5, 0]
25
+ const circle = {
26
+ position: [1, 1, 0],
27
+ radius: 1,
28
+ }
29
+
30
+ expect(intersectsCircle(point, circle)).toBe(true)
31
+ })
32
+
33
+ test("it should prove that a point on the border of a circle intersects with it", () => {
34
+ const point = [2, 1, 0]
35
+ const circle = {
36
+ position: [1, 1, 0],
37
+ radius: 1,
38
+ }
39
+
40
+ expect(intersectsCircle(point, circle)).toBe(true)
41
+ })
42
+
43
+ test("it should prove that a point outside of a circle does not intersect with it", () => {
44
+ const point = [2, 2, 0]
45
+ const circle = {
46
+ position: [1, 1, 0],
47
+ radius: 1,
48
+ }
49
+
50
+ expect(intersectsCircle(point, circle)).toBe(false)
51
+ })
52
+
53
+ test("it should prove that a point inside of a rectangle intersects with it", () => {
54
+ const point = [1.5, 1.5, 0]
55
+ const rectangle = {
56
+ position: [1, 1, 0],
57
+ size: [2, 2, 0],
58
+ }
59
+
60
+ expect(intersectsRectangle(point, rectangle)).toBe(true)
61
+ })
62
+
63
+ test("it should prove that a point on the border of a rectangle intersects with it", () => {
64
+ const point = [2, 1, 0]
65
+ const rectangle = {
66
+ position: [1, 1, 0],
67
+ size: [2, 2, 0],
68
+ }
69
+
70
+ expect(intersectsRectangle(point, rectangle)).toBe(true)
71
+ })
72
+
73
+ test("it should prove that a point outside of a rectangle does not intersect with it", () => {
74
+ const point = [2.5, 2.5, 0]
75
+ const rectangle = {
76
+ position: [1, 1, 0],
77
+ size: [2, 2, 0],
78
+ }
79
+
80
+ expect(intersectsRectangle(point, rectangle)).toBe(false)
81
+ })
@@ -1,45 +1,76 @@
1
- /**
2
- * @typedef {import("./types").Rectangle} Rectangle
3
- * @typedef {import("./types").Platform} Platform
4
- */
5
-
6
- import { intersectsRectangle as circleIntersectsRectangle } from "./circle.js"
7
- import { intersectsRectangle as platformIntersectsRectangle } from "./platform.js"
8
-
9
- export function intersectsCircle(rectangle, circle) {
10
- return circleIntersectsRectangle(circle, rectangle)
11
- }
12
-
13
- /**
14
- * Determines whether a rectangle intersects another in 3D space.
15
- *
16
- * @param {Rectangle} rectangle1 - The rectangle defined by its position (x, y, z) and size (width, height, depth).
17
- * @param {Rectangle} rectangle2 - The other rectangle defined by its position (z, y, z) and size (width, height, depth).
18
- * @returns {boolean} True if the two rectangles intersect, false otherwise.
19
- */
20
- export function intersectsRectangle(rectangle1, rectangle2) {
21
- const [x1, y1, z1] = rectangle1.position
22
- const [w1, h1, d1] = rectangle1.size
23
-
24
- const [x2, y2, z2] = rectangle2.position
25
- const [w2, h2, d2] = rectangle2.size
26
-
27
- return (
28
- x1 <= x2 + w2 &&
29
- x1 + w1 >= x2 &&
30
- y1 <= y2 + h2 &&
31
- y1 + h1 >= y2 &&
32
- z1 <= z2 + d2 &&
33
- z1 + d1 >= z2
34
- )
35
- }
36
-
37
- /**
38
- * Checks if a rectangle intersects with a platform.
39
- * @param {Rectangle} rectangle - The rectangle to check.
40
- * @param {Platform} platform - The platform to check.
41
- * @returns {boolean} True if the rectangle intersects the platform, false otherwise.
42
- */
43
- export function intersectsPlatform(rectangle, platform) {
44
- return platformIntersectsRectangle(platform, rectangle)
45
- }
1
+ /**
2
+ * @typedef {import("./types").Circle} Circle
3
+ * @typedef {import("./types").Rectangle} Rectangle
4
+ * @typedef {import("./types").Platform} Platform
5
+ */
6
+
7
+ import { intersectsRectangle as circleIntersectsRectangle } from "./circle.js"
8
+ import { intersectsRectangle as pointIntersectsRectangle } from "./point.js"
9
+
10
+ const HALF = 2
11
+
12
+ /**
13
+ * Checks if a rectangle intersects with a point.
14
+ * @param {Rectangle} rectangle - The rectangle to check.
15
+ * @param {Point} point - The point to check.
16
+ * @returns {boolean} True if the point intersects the circle, false otherwise.
17
+ */
18
+ export function intersectsPoint(rectangle, point) {
19
+ return pointIntersectsRectangle(point, rectangle)
20
+ }
21
+
22
+ /**
23
+ * Checks if a rectangle intersects with a circle.
24
+ *
25
+ * @param {Rectangle} rectangle - The rectangle to check.
26
+ * @param {Circle} circle - The circle to check.
27
+ * @returns {boolean} True if the rectangle intersects the circle, false otherwise.
28
+ */
29
+ export function intersectsCircle(rectangle, circle) {
30
+ return circleIntersectsRectangle(circle, rectangle)
31
+ }
32
+
33
+ /**
34
+ * Determines whether a rectangle intersects another in 3D space.
35
+ *
36
+ * @param {Rectangle} rectangle1 - The first rectangle, defined by its position (x, y, z) and size (width, height, depth).
37
+ * @param {Rectangle} rectangle2 - The second rectangle, defined by its position (x, y, z) and size (width, height, depth).
38
+ * @returns {boolean} True if the two rectangles intersect, false otherwise.
39
+ */
40
+ export function intersectsRectangle(rectangle1, rectangle2) {
41
+ const [x1, y1, z1] = rectangle1.position
42
+ const [w1, h1, d1] = rectangle1.size
43
+ const halfW1 = w1 / HALF
44
+ const halfH1 = h1 / HALF
45
+ const halfD1 = d1 / HALF
46
+
47
+ const left1 = x1 - halfW1
48
+ const right1 = x1 + halfW1
49
+ const bottom1 = y1 - halfH1
50
+ const top1 = y1 + halfH1
51
+ const back1 = z1 - halfD1
52
+ const front1 = z1 + halfD1
53
+
54
+ const [x2, y2, z2] = rectangle2.position
55
+ const [w2, h2, d2] = rectangle2.size
56
+ const halfW2 = w2 / HALF
57
+ const halfH2 = h2 / HALF
58
+ const halfD2 = d2 / HALF
59
+
60
+ const left2 = x2 - halfW2
61
+ const right2 = x2 + halfW2
62
+ const bottom2 = y2 - halfH2
63
+ const top2 = y2 + halfH2
64
+ const back2 = z2 - halfD2
65
+ const front2 = z2 + halfD2
66
+
67
+ // AABB intersection test
68
+ return (
69
+ left1 <= right2 &&
70
+ right1 >= left2 &&
71
+ bottom1 <= top2 &&
72
+ top1 >= bottom2 &&
73
+ back1 <= front2 &&
74
+ front1 >= back2
75
+ )
76
+ }
@@ -1,42 +1,42 @@
1
- import { expect, test } from "vitest"
2
-
3
- import { intersectsRectangle } from "./rectangle.js"
4
-
5
- test("it should prove that a rectangle crossing another one intersects with it", () => {
6
- const rectangle1 = {
7
- position: [0, 0, 0],
8
- size: [2, 2, 2],
9
- }
10
- const rectangle2 = {
11
- position: [1, 1, 1],
12
- size: [2, 2, 2],
13
- }
14
-
15
- expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
16
- })
17
-
18
- test("it should prove that a rectangle right on top of another intersects with it", () => {
19
- const rectangle1 = {
20
- position: [0, 0, 0],
21
- size: [2, 2, 2],
22
- }
23
- const rectangle2 = {
24
- position: [0, 0, 0],
25
- size: [2, 0, 2],
26
- }
27
-
28
- expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
29
- })
30
-
31
- test("it should prove that a rectangle not crossing another one does not intersect with it", () => {
32
- const rectangle1 = {
33
- position: [0, 0, 0],
34
- size: [2, 2, 2],
35
- }
36
- const rectangle2 = {
37
- position: [3, 3, 3],
38
- size: [2, 2, 2],
39
- }
40
-
41
- expect(intersectsRectangle(rectangle1, rectangle2)).toBe(false)
42
- })
1
+ import { expect, test } from "vitest"
2
+
3
+ import { intersectsRectangle } from "./rectangle.js"
4
+
5
+ test("it should prove that a rectangle crossing another one intersects with it", () => {
6
+ const rectangle1 = {
7
+ position: [0, 0, 0],
8
+ size: [2, 2, 2],
9
+ }
10
+ const rectangle2 = {
11
+ position: [1, 1, 1],
12
+ size: [2, 2, 2],
13
+ }
14
+
15
+ expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
16
+ })
17
+
18
+ test("it should prove that a rectangle right on top of another intersects with it", () => {
19
+ const rectangle1 = {
20
+ position: [0, 0, 0],
21
+ size: [2, 2, 2],
22
+ }
23
+ const rectangle2 = {
24
+ position: [0, 0, 0],
25
+ size: [2, 0, 2],
26
+ }
27
+
28
+ expect(intersectsRectangle(rectangle1, rectangle2)).toBe(true)
29
+ })
30
+
31
+ test("it should prove that a rectangle not crossing another one does not intersect with it", () => {
32
+ const rectangle1 = {
33
+ position: [0, 0, 0],
34
+ size: [2, 2, 2],
35
+ }
36
+ const rectangle2 = {
37
+ position: [3, 3, 3],
38
+ size: [2, 2, 2],
39
+ }
40
+
41
+ expect(intersectsRectangle(rectangle1, rectangle2)).toBe(false)
42
+ })
@@ -1,80 +1,80 @@
1
- /**
2
- * @typedef {import("./types").Segment} Segment
3
- * @typedef {import("./types").Point} Point
4
- * @typedef {import("./types").Circle} Circle
5
- */
6
-
7
- import {
8
- magnitude,
9
- setMagnitude,
10
- } from "@inglorious/utils/math/linear-algebra/vector.js"
11
- import {
12
- distance,
13
- dot,
14
- subtract,
15
- sum,
16
- } from "@inglorious/utils/math/linear-algebra/vectors.js"
17
-
18
- const BEFORE_SEGMENT = 0
19
-
20
- /**
21
- * Calculates the coefficients [a, b, c] of the line equation ax + bz + c = 0
22
- * for a given segment in 2D space.
23
- *
24
- * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
25
- * @returns {[number, number, number]} An array [a, b, c] representing the line equation.
26
- */
27
- export function coefficients(segment) {
28
- const [x1, , z1] = segment.from
29
- const [x2, , z2] = segment.to
30
- return [z1 - z2, x2 - x1, (x1 - x2) * z1 + x1 * (z2 - z1)]
31
- }
32
-
33
- /**
34
- * Finds the closest point on a segment to a given point in 3D space.
35
- *
36
- * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
37
- * @param {Point} point - The point in 3D space represented as [x, y, z].
38
- * @returns {Point} The closest point on the segment to the given point.
39
- */
40
- export function closestPoint(segment, point) {
41
- const shiftedSegment = subtract(segment.to, segment.from)
42
- const shiftedPoint = subtract(point, segment.from)
43
-
44
- const projectionLength =
45
- dot(shiftedSegment, shiftedPoint) / magnitude(shiftedSegment)
46
-
47
- if (projectionLength < BEFORE_SEGMENT) {
48
- return segment.from
49
- }
50
-
51
- if (projectionLength > magnitude(shiftedSegment)) {
52
- return segment.to
53
- }
54
-
55
- const projectedPoint = setMagnitude(shiftedSegment, projectionLength)
56
- return sum(segment.from, projectedPoint)
57
- }
58
-
59
- /**
60
- * Calculates the shortest distance from a point to a segment in 3D space.
61
- *
62
- * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
63
- * @param {Point} point - The point in 3D space represented as [x, y, z].
64
- * @returns {number} The shortest distance from the point to the segment.
65
- */
66
- export function distanceFromPoint(segment, point) {
67
- const closest = closestPoint(segment, point)
68
- return distance(point, closest)
69
- }
70
-
71
- /**
72
- * Determines whether a segment intersects with the perimeter of a circle.
73
- *
74
- * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
75
- * @param {Circle} circle - The circle defined by its position (center) and radius.
76
- * @returns {boolean} `true` if the segment intersects the circle's perimeter, otherwise `false`.
77
- */
78
- export function intersectsCircle(segment, circle) {
79
- return distanceFromPoint(segment, circle.position) <= circle.radius
80
- }
1
+ /**
2
+ * @typedef {import("./types").Segment} Segment
3
+ * @typedef {import("./types").Point} Point
4
+ * @typedef {import("./types").Circle} Circle
5
+ */
6
+
7
+ import {
8
+ magnitude,
9
+ setMagnitude,
10
+ } from "@inglorious/utils/math/linear-algebra/vector.js"
11
+ import {
12
+ distance,
13
+ dot,
14
+ subtract,
15
+ sum,
16
+ } from "@inglorious/utils/math/linear-algebra/vectors.js"
17
+
18
+ const BEFORE_SEGMENT = 0
19
+
20
+ /**
21
+ * Calculates the coefficients [a, b, c] of the line equation ax + bz + c = 0
22
+ * for a given segment in 2D space.
23
+ *
24
+ * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
25
+ * @returns {[number, number, number]} An array [a, b, c] representing the line equation.
26
+ */
27
+ export function coefficients(segment) {
28
+ const [x1, , z1] = segment.from
29
+ const [x2, , z2] = segment.to
30
+ return [z1 - z2, x2 - x1, (x1 - x2) * z1 + x1 * (z2 - z1)]
31
+ }
32
+
33
+ /**
34
+ * Finds the closest point on a segment to a given point in 3D space.
35
+ *
36
+ * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
37
+ * @param {Point} point - The point in 3D space represented as [x, y, z].
38
+ * @returns {Point} The closest point on the segment to the given point.
39
+ */
40
+ export function closestPoint(segment, point) {
41
+ const shiftedSegment = subtract(segment.to, segment.from)
42
+ const shiftedPoint = subtract(point, segment.from)
43
+
44
+ const projectionLength =
45
+ dot(shiftedSegment, shiftedPoint) / magnitude(shiftedSegment)
46
+
47
+ if (projectionLength < BEFORE_SEGMENT) {
48
+ return segment.from
49
+ }
50
+
51
+ if (projectionLength > magnitude(shiftedSegment)) {
52
+ return segment.to
53
+ }
54
+
55
+ const projectedPoint = setMagnitude(shiftedSegment, projectionLength)
56
+ return sum(segment.from, projectedPoint)
57
+ }
58
+
59
+ /**
60
+ * Calculates the shortest distance from a point to a segment in 3D space.
61
+ *
62
+ * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
63
+ * @param {Point} point - The point in 3D space represented as [x, y, z].
64
+ * @returns {number} The shortest distance from the point to the segment.
65
+ */
66
+ export function distanceFromPoint(segment, point) {
67
+ const closest = closestPoint(segment, point)
68
+ return distance(point, closest)
69
+ }
70
+
71
+ /**
72
+ * Determines whether a segment intersects with the perimeter of a circle.
73
+ *
74
+ * @param {Segment} segment - The segment defined by its start (`from`) and end (`to`) points.
75
+ * @param {Circle} circle - The circle defined by its position (center) and radius.
76
+ * @returns {boolean} `true` if the segment intersects the circle's perimeter, otherwise `false`.
77
+ */
78
+ export function intersectsCircle(segment, circle) {
79
+ return distanceFromPoint(segment, circle.position) <= circle.radius
80
+ }