@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.
- package/README.md +39 -36
- package/package.json +20 -33
- package/src/engine/ai/movement/dynamic/align.js +63 -63
- package/src/engine/ai/movement/dynamic/arrive.js +42 -43
- package/src/engine/ai/movement/dynamic/evade.js +38 -38
- package/src/engine/ai/movement/dynamic/face.js +19 -20
- package/src/engine/ai/movement/dynamic/flee.js +45 -45
- package/src/engine/ai/movement/dynamic/look-where-youre-going.js +16 -17
- package/src/engine/ai/movement/dynamic/match-velocity.js +51 -50
- package/src/engine/ai/movement/dynamic/pursue.js +38 -38
- package/src/engine/ai/movement/dynamic/seek.js +44 -44
- package/src/engine/ai/movement/dynamic/wander.js +31 -32
- package/src/engine/ai/movement/kinematic/align.js +37 -37
- package/src/engine/ai/movement/kinematic/arrive.js +42 -42
- package/src/engine/ai/movement/kinematic/face.js +19 -20
- package/src/engine/ai/movement/kinematic/flee.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.js +26 -26
- package/src/engine/ai/movement/kinematic/seek.test.js +42 -42
- package/src/engine/ai/movement/kinematic/wander-as-seek.js +31 -31
- package/src/engine/ai/movement/kinematic/wander.js +27 -27
- package/src/engine/animation/sprite.js +101 -0
- package/src/engine/animation/ticker.js +38 -0
- package/src/engine/behaviors/camera.js +68 -0
- package/src/engine/behaviors/controls/dynamic/modern.js +76 -0
- package/src/engine/behaviors/controls/dynamic/shooter.js +84 -0
- package/src/engine/behaviors/controls/dynamic/tank.js +69 -0
- package/src/engine/behaviors/controls/event-handlers.js +17 -0
- package/src/engine/behaviors/controls/kinematic/modern.js +76 -0
- package/src/engine/behaviors/controls/kinematic/shooter.js +82 -0
- package/src/engine/behaviors/controls/kinematic/tank.js +67 -0
- package/src/engine/behaviors/debug/collision.js +35 -0
- package/src/engine/behaviors/fps.js +29 -0
- package/src/engine/behaviors/fsm.js +33 -0
- package/src/{game/decorators → engine/behaviors}/fsm.test.js +49 -56
- package/src/engine/behaviors/game.js +15 -0
- package/src/engine/behaviors/input/controls.js +37 -0
- package/src/engine/behaviors/input/gamepad.js +114 -0
- package/src/engine/behaviors/input/input.js +48 -0
- package/src/engine/behaviors/input/keyboard.js +64 -0
- package/src/engine/behaviors/input/mouse.js +91 -0
- package/src/engine/behaviors/physics/bouncy.js +25 -0
- package/src/engine/behaviors/physics/clamped.js +36 -0
- package/src/{game/decorators/collisions.js → engine/behaviors/physics/collidable.js} +20 -24
- package/src/engine/behaviors/physics/jumpable.js +145 -0
- package/src/engine/behaviors/ui/button.js +17 -0
- package/src/engine/collision/detection.js +110 -115
- package/src/engine/core/api.js +34 -0
- package/src/engine/core/dev-tools.js +135 -0
- package/src/engine/core/engine.js +119 -0
- package/src/engine/core/loop.js +15 -0
- package/src/engine/{loop → core/loops}/animation-frame.js +25 -26
- package/src/engine/{loop → core/loops}/elapsed.js +22 -23
- package/src/engine/{loop → core/loops}/fixed.js +27 -28
- package/src/engine/{loop → core/loops}/flash.js +13 -14
- package/src/engine/{loop → core/loops}/lag.js +26 -27
- package/src/engine/core/select.js +26 -0
- package/src/engine/core/store.js +178 -0
- package/src/engine/core/store.test.js +110 -0
- package/src/engine/movement/dynamic/modern.js +21 -24
- package/src/engine/movement/dynamic/tank.js +43 -43
- package/src/engine/movement/kinematic/modern.js +16 -16
- package/src/engine/movement/kinematic/modern.test.js +27 -27
- package/src/engine/movement/kinematic/tank.js +27 -27
- package/src/engine/physics/bounds.js +138 -0
- package/src/engine/physics/position.js +43 -0
- package/src/engine/physics/position.test.js +80 -0
- package/src/engine/systems/sprite-animation.js +27 -0
- package/src/main.js +10 -5
- package/src/renderers/canvas/absolute-position.js +18 -0
- package/src/renderers/canvas/camera.js +13 -0
- package/src/renderers/canvas/canvas-renderer.js +68 -0
- package/src/{ui → renderers}/canvas/character.js +38 -35
- package/src/{ui → renderers}/canvas/form/button.js +25 -25
- package/src/{ui → renderers}/canvas/fps.js +18 -18
- package/src/renderers/canvas/image/hitmask.js +51 -0
- package/src/{ui → renderers}/canvas/image/image.js +34 -37
- package/src/{ui → renderers}/canvas/image/sprite.js +49 -49
- package/src/{ui → renderers}/canvas/image/tilemap.js +66 -64
- package/src/{ui → renderers}/canvas/mouse.js +37 -37
- package/src/renderers/canvas/rendering-system.js +79 -0
- package/src/{ui → renderers}/canvas/shapes/circle.js +29 -31
- package/src/{ui → renderers}/canvas/shapes/rectangle.js +27 -31
- package/src/renderers/react/game/character/index.jsx +20 -0
- package/src/{ui → renderers}/react/game/cursor/index.jsx +20 -20
- package/src/{ui → renderers}/react/game/form/fields/field/index.jsx +56 -56
- package/src/{ui → renderers}/react/game/form/fields/index.jsx +12 -12
- package/src/{ui → renderers}/react/game/form/index.jsx +22 -22
- package/src/{ui → renderers}/react/game/fps/index.jsx +16 -16
- package/src/{ui → renderers}/react/game/game.jsx +72 -71
- package/src/{ui → renderers}/react/game/index.jsx +29 -29
- package/src/{ui → renderers}/react/game/platform/index.jsx +30 -30
- package/src/{ui → renderers}/react/game/scene/index.jsx +27 -25
- package/src/{ui → renderers}/react/game/sprite/index.jsx +60 -58
- package/src/{ui → renderers}/react/game/stats/index.jsx +22 -22
- package/src/{ui → renderers}/react/hocs/with-absolute-position/index.jsx +20 -20
- package/src/{ui → renderers}/react/index.jsx +9 -9
- package/src/utils/algorithms/decision-tree.js +24 -24
- package/src/utils/algorithms/decision-tree.test.js +153 -102
- package/src/utils/algorithms/path-finding.js +155 -155
- package/src/utils/algorithms/path-finding.test.js +151 -151
- package/src/utils/data-structures/array.js +83 -83
- package/src/utils/data-structures/array.test.js +173 -173
- package/src/utils/data-structures/board.js +159 -159
- package/src/utils/data-structures/board.test.js +242 -242
- package/src/utils/data-structures/boolean.js +9 -9
- package/src/utils/data-structures/heap.js +164 -164
- package/src/utils/data-structures/heap.test.js +103 -103
- package/src/utils/data-structures/object.js +138 -102
- package/src/utils/data-structures/object.test.js +218 -121
- package/src/utils/data-structures/objects.js +66 -48
- package/src/utils/data-structures/objects.test.js +99 -99
- package/src/utils/data-structures/tree.js +36 -36
- package/src/utils/data-structures/tree.test.js +33 -33
- package/src/utils/functions/functions.js +19 -19
- package/src/utils/functions/functions.test.js +23 -23
- package/src/utils/math/geometry/circle.js +70 -117
- package/src/utils/math/geometry/circle.test.js +97 -97
- package/src/utils/math/geometry/hitmask.js +70 -39
- package/src/utils/math/geometry/hitmask.test.js +155 -84
- package/src/utils/math/geometry/line.js +35 -35
- package/src/utils/math/geometry/line.test.js +49 -49
- package/src/utils/math/geometry/point.js +78 -71
- package/src/utils/math/geometry/point.test.js +81 -81
- package/src/utils/math/geometry/rectangle.js +76 -45
- package/src/utils/math/geometry/rectangle.test.js +42 -42
- package/src/utils/math/geometry/segment.js +80 -80
- package/src/utils/math/geometry/segment.test.js +183 -183
- package/src/utils/math/geometry/triangle.js +15 -15
- package/src/utils/math/geometry/triangle.test.js +11 -11
- package/src/utils/math/linear-algebra/2d.js +28 -28
- package/src/utils/math/linear-algebra/2d.test.js +17 -17
- package/src/utils/math/linear-algebra/quaternion.js +22 -22
- package/src/utils/math/linear-algebra/quaternion.test.js +25 -25
- package/src/utils/math/linear-algebra/quaternions.js +20 -20
- package/src/utils/math/linear-algebra/quaternions.test.js +29 -29
- package/src/utils/math/linear-algebra/vector.js +327 -302
- package/src/utils/math/linear-algebra/vector.test.js +265 -257
- package/src/utils/math/linear-algebra/vectors.js +122 -122
- package/src/utils/math/linear-algebra/vectors.test.js +65 -65
- package/src/utils/math/linear-interpolation.js +9 -0
- package/src/utils/math/numbers.js +90 -90
- package/src/utils/math/numbers.test.js +137 -137
- package/src/utils/math/rng.js +44 -44
- package/src/utils/math/rng.test.js +39 -39
- package/src/utils/math/statistics.js +43 -43
- package/src/utils/math/statistics.test.js +47 -47
- package/src/utils/math/trigonometry.js +89 -89
- package/src/utils/math/trigonometry.test.js +52 -52
- package/src/utils/physics/acceleration.js +61 -63
- package/src/utils/physics/friction.js +28 -30
- package/src/utils/physics/friction.test.js +42 -44
- package/src/utils/physics/gravity.js +69 -71
- package/src/utils/physics/gravity.test.js +77 -80
- package/src/utils/physics/jump.js +31 -41
- package/src/utils/physics/velocity.js +36 -38
- package/src/docs/ai/movement/dynamic/align.js +0 -131
- package/src/docs/ai/movement/dynamic/arrive.js +0 -88
- package/src/docs/ai/movement/dynamic/dynamic.mdx +0 -99
- package/src/docs/ai/movement/dynamic/dynamic.stories.js +0 -58
- package/src/docs/ai/movement/dynamic/evade.js +0 -72
- package/src/docs/ai/movement/dynamic/face.js +0 -90
- package/src/docs/ai/movement/dynamic/flee.js +0 -38
- package/src/docs/ai/movement/dynamic/look-where-youre-going.js +0 -114
- package/src/docs/ai/movement/dynamic/match-velocity.js +0 -92
- package/src/docs/ai/movement/dynamic/pursue.js +0 -72
- package/src/docs/ai/movement/dynamic/seek.js +0 -37
- package/src/docs/ai/movement/dynamic/wander.js +0 -71
- package/src/docs/ai/movement/kinematic/align.js +0 -122
- package/src/docs/ai/movement/kinematic/arrive.js +0 -78
- package/src/docs/ai/movement/kinematic/face.js +0 -82
- package/src/docs/ai/movement/kinematic/flee.js +0 -36
- package/src/docs/ai/movement/kinematic/kinematic.mdx +0 -67
- package/src/docs/ai/movement/kinematic/kinematic.stories.js +0 -42
- package/src/docs/ai/movement/kinematic/seek.js +0 -34
- package/src/docs/ai/movement/kinematic/wander-as-seek.js +0 -62
- package/src/docs/ai/movement/kinematic/wander.js +0 -28
- package/src/docs/bounds.js +0 -7
- package/src/docs/code-reuse.js +0 -35
- package/src/docs/collision/circles.js +0 -58
- package/src/docs/collision/collision.mdx +0 -27
- package/src/docs/collision/collision.stories.js +0 -22
- package/src/docs/collision/platform.js +0 -76
- package/src/docs/collision/tilemap.js +0 -181
- package/src/docs/empty.js +0 -1
- package/src/docs/engine.mdx +0 -81
- package/src/docs/engine.stories.js +0 -37
- package/src/docs/event-handlers.js +0 -68
- package/src/docs/framerate.js +0 -37
- package/src/docs/game.jsx +0 -15
- package/src/docs/image/image.js +0 -19
- package/src/docs/image/image.stories.js +0 -22
- package/src/docs/image/sprite.js +0 -39
- package/src/docs/image/tilemap.js +0 -84
- package/src/docs/input/controls.js +0 -67
- package/src/docs/input/gamepad.js +0 -67
- package/src/docs/input/input.mdx +0 -55
- package/src/docs/input/input.stories.js +0 -27
- package/src/docs/input/keyboard.js +0 -58
- package/src/docs/input/mouse.js +0 -32
- package/src/docs/instances.js +0 -49
- package/src/docs/player/dynamic/double-jump.js +0 -90
- package/src/docs/player/dynamic/dynamic.stories.js +0 -32
- package/src/docs/player/dynamic/jump.js +0 -83
- package/src/docs/player/dynamic/modern-controls.js +0 -57
- package/src/docs/player/dynamic/shooter-controls.js +0 -51
- package/src/docs/player/dynamic/tank-controls.js +0 -44
- package/src/docs/player/kinematic/double-jump.js +0 -90
- package/src/docs/player/kinematic/jump.js +0 -82
- package/src/docs/player/kinematic/kinematic.stories.js +0 -32
- package/src/docs/player/kinematic/modern-controls.js +0 -56
- package/src/docs/player/kinematic/shooter-controls.js +0 -48
- package/src/docs/player/kinematic/tank-controls.js +0 -42
- package/src/docs/quick-start/first-game.js +0 -49
- package/src/docs/quick-start/hello-world.js +0 -1
- package/src/docs/quick-start.mdx +0 -127
- package/src/docs/quick-start.stories.js +0 -17
- package/src/docs/recipes/add-and-remove.js +0 -71
- package/src/docs/recipes/add-instance.js +0 -42
- package/src/docs/recipes/decision-tree.js +0 -169
- package/src/docs/recipes/random-instances.js +0 -25
- package/src/docs/recipes/recipes.mdx +0 -81
- package/src/docs/recipes/recipes.stories.js +0 -37
- package/src/docs/recipes/remove-instance.js +0 -52
- package/src/docs/recipes/states.js +0 -64
- package/src/docs/ui/button.js +0 -28
- package/src/docs/ui/form.stories.js +0 -55
- package/src/docs/ui-chooser.jsx +0 -6
- package/src/docs/utils/data-structures/object.mdx +0 -47
- package/src/docs/utils/data-structures/objects.mdx +0 -30
- package/src/docs/utils/functions/functions.mdx +0 -34
- package/src/docs/utils/math/geometry/circle.mdx +0 -55
- package/src/docs/utils/math/geometry/point.mdx +0 -38
- package/src/docs/utils/math/geometry/rectangle.mdx +0 -24
- package/src/docs/utils/math/geometry/segment.mdx +0 -55
- package/src/docs/utils/math/geometry/triangle.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/2d.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/quaternion.mdx +0 -21
- package/src/docs/utils/math/linear-algebra/quaternions.mdx +0 -22
- package/src/docs/utils/math/linear-algebra/vector.mdx +0 -177
- package/src/docs/utils/math/linear-algebra/vectors.mdx +0 -58
- package/src/docs/utils/math/numbers.mdx +0 -76
- package/src/docs/utils/math/random.mdx +0 -35
- package/src/docs/utils/math/statistics.mdx +0 -38
- package/src/docs/utils/math/trigonometry.mdx +0 -85
- package/src/docs/utils/physics/friction.mdx +0 -20
- package/src/docs/utils/physics/gravity.mdx +0 -28
- package/src/engine/loop.js +0 -15
- package/src/engine/store.js +0 -174
- package/src/engine/store.test.js +0 -256
- package/src/engine.js +0 -74
- package/src/game/animation.js +0 -26
- package/src/game/bounds.js +0 -66
- package/src/game/decorators/character.js +0 -5
- package/src/game/decorators/clamp-to-bounds.js +0 -15
- package/src/game/decorators/controls/dynamic/modern.js +0 -48
- package/src/game/decorators/controls/dynamic/shooter.js +0 -47
- package/src/game/decorators/controls/dynamic/tank.js +0 -55
- package/src/game/decorators/controls/kinematic/modern.js +0 -49
- package/src/game/decorators/controls/kinematic/shooter.js +0 -45
- package/src/game/decorators/controls/kinematic/tank.js +0 -52
- package/src/game/decorators/debug/collisions.js +0 -32
- package/src/game/decorators/double-jump.js +0 -70
- package/src/game/decorators/fps.js +0 -30
- package/src/game/decorators/fsm.js +0 -27
- package/src/game/decorators/game.js +0 -11
- package/src/game/decorators/image/image.js +0 -5
- package/src/game/decorators/image/sprite.js +0 -5
- package/src/game/decorators/image/tilemap.js +0 -5
- package/src/game/decorators/input/controls.js +0 -27
- package/src/game/decorators/input/gamepad.js +0 -74
- package/src/game/decorators/input/input.js +0 -41
- package/src/game/decorators/input/keyboard.js +0 -49
- package/src/game/decorators/input/mouse.js +0 -65
- package/src/game/decorators/jump.js +0 -72
- package/src/game/decorators/platform.js +0 -5
- package/src/game/decorators/ui/button.js +0 -21
- package/src/game/sprite.js +0 -119
- package/src/ui/canvas/absolute-position.js +0 -17
- package/src/ui/canvas/image/hitmask.js +0 -37
- package/src/ui/canvas.js +0 -81
- package/src/ui/react/game/character/index.jsx +0 -30
- package/src/utils/math/geometry/platform.js +0 -42
- package/src/utils/math/geometry/platform.test.js +0 -133
- /package/src/{ui → renderers}/react/game/character/character.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/cursor/cursor.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/field/field.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/fields/fields.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/form/form.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/platform/platform.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/scene/scene.module.scss +0 -0
- /package/src/{ui → renderers}/react/game/sprite/sprite.module.css +0 -0
- /package/src/{ui → renderers}/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -0
|
@@ -1,257 +1,265 @@
|
|
|
1
|
-
import { sqrt } from "@inglorious/utils/math/numbers.js"
|
|
2
|
-
import { cos, pi, sin } from "@inglorious/utils/math/trigonometry.js"
|
|
3
|
-
import { expect, test } from "vitest"
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
abs,
|
|
7
|
-
angle,
|
|
8
|
-
clamp,
|
|
9
|
-
conjugate,
|
|
10
|
-
createVector,
|
|
11
|
-
divide,
|
|
12
|
-
fromAngle,
|
|
13
|
-
magnitude,
|
|
14
|
-
mod,
|
|
15
|
-
multiply,
|
|
16
|
-
normalize,
|
|
17
|
-
rotate,
|
|
18
|
-
setAngle,
|
|
19
|
-
setMagnitude,
|
|
20
|
-
shift,
|
|
21
|
-
snap,
|
|
22
|
-
toCartesian,
|
|
23
|
-
toCylindrical,
|
|
24
|
-
toPolar,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
const
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
const
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
const
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
const
|
|
246
|
-
const expectedResult = "[
|
|
247
|
-
|
|
248
|
-
expect(toString(vector
|
|
249
|
-
})
|
|
250
|
-
|
|
251
|
-
test("it should create a
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
expect(
|
|
257
|
-
})
|
|
1
|
+
import { sqrt } from "@inglorious/utils/math/numbers.js"
|
|
2
|
+
import { cos, pi, sin } from "@inglorious/utils/math/trigonometry.js"
|
|
3
|
+
import { expect, test } from "vitest"
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
abs,
|
|
7
|
+
angle,
|
|
8
|
+
clamp,
|
|
9
|
+
conjugate,
|
|
10
|
+
createVector,
|
|
11
|
+
divide,
|
|
12
|
+
fromAngle,
|
|
13
|
+
magnitude,
|
|
14
|
+
mod,
|
|
15
|
+
multiply,
|
|
16
|
+
normalize,
|
|
17
|
+
rotate,
|
|
18
|
+
setAngle,
|
|
19
|
+
setMagnitude,
|
|
20
|
+
shift,
|
|
21
|
+
snap,
|
|
22
|
+
toCartesian,
|
|
23
|
+
toCylindrical,
|
|
24
|
+
toPolar,
|
|
25
|
+
toSpherical,
|
|
26
|
+
toString,
|
|
27
|
+
unit,
|
|
28
|
+
} from "./vector.js"
|
|
29
|
+
|
|
30
|
+
test("it should compute the absolute value of a vector's coordinates", () => {
|
|
31
|
+
const vector = [-2, 0, 3]
|
|
32
|
+
const expectedResult = [2, 0, 3]
|
|
33
|
+
|
|
34
|
+
expect(abs(vector)).toStrictEqual(expectedResult)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
test("it should compute the angle of a 2D vector", () => {
|
|
38
|
+
const vector = [1, 1]
|
|
39
|
+
const expectedResult = pi() / 4
|
|
40
|
+
|
|
41
|
+
expect(angle(vector)).toBe(expectedResult)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test("it should compute the angle of a 3D vector", () => {
|
|
45
|
+
const vector = [1, 0, 1]
|
|
46
|
+
const expectedResult = pi() / 4
|
|
47
|
+
|
|
48
|
+
expect(angle(vector)).toBe(expectedResult)
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
test("it should clamp the magnitude of a vector to a certain length if too long", () => {
|
|
52
|
+
const vector = [6, 8]
|
|
53
|
+
const min = 0
|
|
54
|
+
const max = 5
|
|
55
|
+
const expectedResult = [3, 4]
|
|
56
|
+
|
|
57
|
+
expect(clamp(vector, min, max)).toStrictEqual(expectedResult)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
test("it should not clamp the magnitude of a vector to a certain length if not too long", () => {
|
|
61
|
+
const vector = [3, 4]
|
|
62
|
+
const min = 0
|
|
63
|
+
const max = 6
|
|
64
|
+
const expectedResult = [3, 4]
|
|
65
|
+
|
|
66
|
+
expect(clamp(vector, min, max)).toStrictEqual(expectedResult)
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test("it should clamp the magnitude of a vector to the values of other vector bounds", () => {
|
|
70
|
+
const vector = [6, 8]
|
|
71
|
+
const lowerBound = [0, 0]
|
|
72
|
+
const upperBound = [3, 4]
|
|
73
|
+
const expectedResult = [3, 4]
|
|
74
|
+
|
|
75
|
+
expect(clamp(vector, lowerBound, upperBound)).toStrictEqual(expectedResult)
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
test("it should conjugate a vector", () => {
|
|
79
|
+
const vector = [1, 2, 3]
|
|
80
|
+
const expectedResult = [1, -2, -3]
|
|
81
|
+
|
|
82
|
+
expect(conjugate(vector)).toStrictEqual(expectedResult)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
test("it should create a 3D vector given its magnitude and angle", () => {
|
|
86
|
+
const magnitude = sqrt(2)
|
|
87
|
+
const angle = pi() / 4
|
|
88
|
+
const expectedResult = [1, -0, 1.0000000000000002] // close to [1, 0, 1]
|
|
89
|
+
|
|
90
|
+
expect(createVector(magnitude, angle)).toStrictEqual(expectedResult)
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
test("it should divide a vector by a scalar", () => {
|
|
94
|
+
const vector = [4, 8, 12]
|
|
95
|
+
const scalar = 4
|
|
96
|
+
const expectedResult = [1, 2, 3]
|
|
97
|
+
|
|
98
|
+
expect(divide(vector, scalar)).toStrictEqual(expectedResult)
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
test("it should create a 3D unit vector from an angle", () => {
|
|
102
|
+
const angle = pi() / 4
|
|
103
|
+
const expectedResult = [0.7071067811865475, -0, 0.7071067811865476] // close to [cos(angle), 0, sin(angle)]
|
|
104
|
+
|
|
105
|
+
expect(fromAngle(angle)).toStrictEqual(expectedResult)
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
test("it should compute the magnitude of a vector (aka length)", () => {
|
|
109
|
+
const vector = [3, 4]
|
|
110
|
+
const expectedResult = 5
|
|
111
|
+
|
|
112
|
+
expect(magnitude(vector)).toBe(expectedResult)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
test("it should apply the mod operator (aka remainder) on a vector", () => {
|
|
116
|
+
const vector = [10, 12, -18]
|
|
117
|
+
const divisor = 12
|
|
118
|
+
const expectedResult = [10, 0, 6]
|
|
119
|
+
|
|
120
|
+
expect(mod(vector, divisor)).toStrictEqual(expectedResult)
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
test("it should multiply a vector with a scalar (aka times)", () => {
|
|
124
|
+
const vector = [1, 2, 3]
|
|
125
|
+
const scalar = 4
|
|
126
|
+
const expectedResult = [4, 8, 12]
|
|
127
|
+
|
|
128
|
+
expect(multiply(vector, scalar)).toStrictEqual(expectedResult)
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
test("it should normalize a vector so it has unit length", () => {
|
|
132
|
+
const vector = [3, 4]
|
|
133
|
+
const expectedResult = [0.6, 0.8]
|
|
134
|
+
|
|
135
|
+
expect(normalize(vector)).toStrictEqual(expectedResult)
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
test("it should normalize a negative vector", () => {
|
|
139
|
+
const vector = [-3, -4]
|
|
140
|
+
const expectedResult = [-0.6, -0.8]
|
|
141
|
+
|
|
142
|
+
expect(normalize(vector)).toStrictEqual(expectedResult)
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
test("it should rotate a 2D vector by a certain angle", () => {
|
|
146
|
+
const vector = [1, 0]
|
|
147
|
+
const angle = pi() / 4
|
|
148
|
+
const expectedResult = [0.7071067811865475, 0.7071067811865476] // close to [cos(pi/4), sin(pi/4)]
|
|
149
|
+
|
|
150
|
+
expect(rotate(vector, angle)).toStrictEqual(expectedResult)
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
test("it should not rotate a vector when the angle is zero", () => {
|
|
154
|
+
const vector = [1, 0, 0]
|
|
155
|
+
const angle = 0
|
|
156
|
+
const expectedResult = [1, 0, 0]
|
|
157
|
+
|
|
158
|
+
expect(rotate(vector, angle)).toStrictEqual(expectedResult)
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
test("it should rotate a vector by a certain angle", () => {
|
|
162
|
+
const vector = [1, 0, 0]
|
|
163
|
+
const angle = pi() / 4
|
|
164
|
+
const expectedResult = [0.7071067811865475, -0, 0.7071067811865476] // close to [cos(pi/4), 0, sin(pi/4)]
|
|
165
|
+
|
|
166
|
+
expect(rotate(vector, angle)).toStrictEqual(expectedResult)
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
test("it should rotate a vector that faces left by a certain angle", () => {
|
|
170
|
+
const vector = [-1, 0, 0]
|
|
171
|
+
const angle = pi() / 4
|
|
172
|
+
const expectedResult = [-0.7071067811865475, -0, -0.7071067811865476] // close to [cos(-3/4pi), 0, sin(-3/4pi)]
|
|
173
|
+
|
|
174
|
+
expect(rotate(vector, angle)).toStrictEqual(expectedResult)
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
test("it should change the angle of a vector", () => {
|
|
178
|
+
const vector = [cos(pi() / 4), 0, sin(pi() / 4)]
|
|
179
|
+
const expectedResult = [6.123233995736766e-17, 0, 1] // close to [0, 0, 1]
|
|
180
|
+
|
|
181
|
+
expect(setAngle(vector, 1.5707963267948966)).toStrictEqual(expectedResult)
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
test("it should change magnitude of a vector (aka setLength)", () => {
|
|
185
|
+
const vector = [3, 4]
|
|
186
|
+
const magnitude = 10
|
|
187
|
+
const expectedResult = [6, 8]
|
|
188
|
+
|
|
189
|
+
expect(setMagnitude(vector, magnitude)).toStrictEqual(expectedResult)
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
test("it should change magnitude of a negative vector", () => {
|
|
193
|
+
const vector = [-3, -4]
|
|
194
|
+
const magnitude = 10
|
|
195
|
+
const expectedResult = [-6, -8]
|
|
196
|
+
|
|
197
|
+
expect(setMagnitude(vector, magnitude)).toStrictEqual(expectedResult)
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
test("it should shift a vector at a certain index", () => {
|
|
201
|
+
const vector = [1, 2, 3, 4, 5]
|
|
202
|
+
const index = 2
|
|
203
|
+
const expectedResult = [3, 4, 5, 1, 2]
|
|
204
|
+
|
|
205
|
+
expect(shift(vector, index)).toStrictEqual(expectedResult)
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
test("it should snap a floating vector to a certain precision", () => {
|
|
209
|
+
const vector = [1, 1.5, 1.7]
|
|
210
|
+
const precision = 1
|
|
211
|
+
const expectedResult = [1, 1, 2]
|
|
212
|
+
|
|
213
|
+
expect(snap(vector, precision)).toStrictEqual(expectedResult)
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
test("it should convert a 2D polar vector to cartesian coordinates", () => {
|
|
217
|
+
const vector = [sqrt(2), pi() / 4]
|
|
218
|
+
const expectedResult = [1.0000000000000002, 1]
|
|
219
|
+
|
|
220
|
+
expect(toCartesian(vector)).toStrictEqual(expectedResult)
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
test("it should convert a 3D cartesian vector to cylindrical coordinates", () => {
|
|
224
|
+
const vector = [1, 1, 1]
|
|
225
|
+
const expectedResult = [1.2247448713915892, 1.224744871391589, 1]
|
|
226
|
+
|
|
227
|
+
expect(toCylindrical(vector)).toStrictEqual(expectedResult)
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
test("it should convert a 2D cartesian vector to polar coordinates", () => {
|
|
231
|
+
const vector = [1, 1]
|
|
232
|
+
const expectedResult = [sqrt(2), pi() / 4]
|
|
233
|
+
|
|
234
|
+
expect(toPolar(vector)).toStrictEqual(expectedResult)
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
test("it should convert a 3D cartesian vector to spherical coordinates", () => {
|
|
238
|
+
const vector = [1, 1, 1]
|
|
239
|
+
const expectedResult = [sqrt(3), Math.acos(1 / sqrt(3)), pi() / 4]
|
|
240
|
+
|
|
241
|
+
expect(toSpherical(vector)).toStrictEqual(expectedResult)
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
test("it should create a string representation of an integer vector", () => {
|
|
245
|
+
const vector = [3, 4]
|
|
246
|
+
const expectedResult = "[3, 4]"
|
|
247
|
+
|
|
248
|
+
expect(toString(vector)).toBe(expectedResult)
|
|
249
|
+
})
|
|
250
|
+
|
|
251
|
+
test("it should create a string representation of a float vector", () => {
|
|
252
|
+
const vector = [pi() / 4, pi() / 4]
|
|
253
|
+
const decimals = 2
|
|
254
|
+
const expectedResult = "[0.79, 0.79]"
|
|
255
|
+
|
|
256
|
+
expect(toString(vector, decimals)).toBe(expectedResult)
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
test("it should create a unit vector oriented on the X-axis", () => {
|
|
260
|
+
expect(unit()).toStrictEqual([1, 0, 0])
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
test("it should create a unit vector oriented on the Z-axis", () => {
|
|
264
|
+
expect(unit(pi() / 2)).toStrictEqual([6.123233995736766e-17, 0, 1]) // close to [0, 0, 1]
|
|
265
|
+
})
|