@inglorious/engine 0.1.1 → 0.3.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 +75 -72
- package/package.json +15 -37
- package/src/{engine/ai → ai}/movement/dynamic/align.js +9 -9
- package/src/{engine/ai → ai}/movement/dynamic/arrive.js +9 -10
- package/src/{engine/ai → ai}/movement/dynamic/evade.js +9 -9
- package/src/{engine/ai → ai}/movement/dynamic/face.js +5 -6
- package/src/{engine/ai/movement/dynamic/seek.js → ai/movement/dynamic/flee.js} +8 -7
- package/src/ai/movement/dynamic/look-where-youre-going.js +16 -0
- package/src/{engine/ai → ai}/movement/dynamic/match-velocity.js +9 -8
- package/src/{engine/ai → ai}/movement/dynamic/pursue.js +9 -9
- package/src/{engine/ai/movement/dynamic/flee.js → ai/movement/dynamic/seek.js} +7 -8
- package/src/{engine/ai → ai}/movement/dynamic/wander.js +9 -10
- package/src/{engine/ai → ai}/movement/kinematic/align.js +7 -7
- package/src/{engine/ai → ai}/movement/kinematic/arrive.js +8 -8
- package/src/{engine/ai → ai}/movement/kinematic/face.js +5 -6
- package/src/{engine/ai → ai}/movement/kinematic/flee.js +5 -5
- package/src/{engine/ai → ai}/movement/kinematic/seek.js +5 -5
- package/src/{engine/ai → ai}/movement/kinematic/seek.test.js +10 -10
- package/src/{engine/ai → ai}/movement/kinematic/wander-as-seek.js +9 -9
- package/src/{engine/ai → ai}/movement/kinematic/wander.js +5 -5
- package/src/animation/sprite.js +101 -0
- package/src/animation/ticker.js +38 -0
- package/src/behaviors/camera.js +68 -0
- package/src/behaviors/controls/dynamic/modern.js +76 -0
- package/src/behaviors/controls/dynamic/shooter.js +84 -0
- package/src/behaviors/controls/dynamic/tank.js +69 -0
- package/src/behaviors/controls/event-handlers.js +17 -0
- package/src/behaviors/controls/kinematic/modern.js +76 -0
- package/src/behaviors/controls/kinematic/shooter.js +82 -0
- package/src/behaviors/controls/kinematic/tank.js +67 -0
- package/src/behaviors/debug/collision.js +29 -0
- package/src/behaviors/fps.js +29 -0
- package/src/behaviors/fsm.js +33 -0
- package/src/{game/decorators → behaviors}/fsm.test.js +15 -22
- package/src/behaviors/game.js +15 -0
- package/src/behaviors/input/controls.js +37 -0
- package/src/behaviors/input/gamepad.js +114 -0
- package/src/behaviors/input/input.js +48 -0
- package/src/behaviors/input/keyboard.js +64 -0
- package/src/behaviors/input/mouse.js +91 -0
- package/src/behaviors/physics/bouncy.js +25 -0
- package/src/behaviors/physics/clamped.js +36 -0
- package/src/{game/decorators/collisions.js → behaviors/physics/collidable.js} +3 -7
- package/src/behaviors/physics/jumpable.js +145 -0
- package/src/behaviors/ui/button.js +17 -0
- package/src/collision/detection.js +110 -0
- package/src/core/api.js +34 -0
- package/src/core/dev-tools.js +135 -0
- package/src/core/engine.js +119 -0
- package/src/core/loop.js +15 -0
- package/src/{engine/loop → core/loops}/animation-frame.js +1 -2
- package/src/{engine/loop → core/loops}/elapsed.js +1 -2
- package/src/{engine/loop → core/loops}/fixed.js +1 -2
- package/src/{engine/loop → core/loops}/flash.js +1 -2
- package/src/{engine/loop → core/loops}/lag.js +1 -2
- package/src/core/select.js +26 -0
- package/src/core/store.js +178 -0
- package/src/core/store.test.js +110 -0
- package/src/main.js +7 -2
- package/src/{engine/movement → movement}/dynamic/modern.js +3 -6
- package/src/{engine/movement → movement}/dynamic/tank.js +9 -9
- package/src/{engine/movement → movement}/kinematic/modern.js +3 -3
- package/src/movement/kinematic/modern.test.js +27 -0
- package/src/{engine/movement → movement}/kinematic/tank.js +5 -5
- package/src/physics/bounds.js +138 -0
- package/src/physics/position.js +43 -0
- package/src/physics/position.test.js +80 -0
- package/src/systems/sprite-animation.js +27 -0
- package/src/engine/ai/movement/dynamic/look-where-youre-going.js +0 -17
- package/src/engine/collision/detection.js +0 -115
- package/src/engine/loop.js +0 -15
- package/src/engine/movement/kinematic/modern.test.js +0 -27
- 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/character.js +0 -35
- package/src/ui/canvas/form/button.js +0 -25
- package/src/ui/canvas/fps.js +0 -18
- package/src/ui/canvas/image/hitmask.js +0 -37
- package/src/ui/canvas/image/image.js +0 -37
- package/src/ui/canvas/image/sprite.js +0 -49
- package/src/ui/canvas/image/tilemap.js +0 -64
- package/src/ui/canvas/mouse.js +0 -37
- package/src/ui/canvas/shapes/circle.js +0 -31
- package/src/ui/canvas/shapes/rectangle.js +0 -31
- package/src/ui/canvas.js +0 -81
- package/src/ui/react/game/character/character.module.scss +0 -17
- package/src/ui/react/game/character/index.jsx +0 -30
- package/src/ui/react/game/cursor/cursor.module.scss +0 -47
- package/src/ui/react/game/cursor/index.jsx +0 -20
- package/src/ui/react/game/form/fields/field/field.module.scss +0 -5
- package/src/ui/react/game/form/fields/field/index.jsx +0 -56
- package/src/ui/react/game/form/fields/fields.module.scss +0 -48
- package/src/ui/react/game/form/fields/index.jsx +0 -12
- package/src/ui/react/game/form/form.module.scss +0 -18
- package/src/ui/react/game/form/index.jsx +0 -22
- package/src/ui/react/game/fps/index.jsx +0 -16
- package/src/ui/react/game/game.jsx +0 -71
- package/src/ui/react/game/index.jsx +0 -29
- package/src/ui/react/game/platform/index.jsx +0 -30
- package/src/ui/react/game/platform/platform.module.scss +0 -7
- package/src/ui/react/game/scene/index.jsx +0 -25
- package/src/ui/react/game/scene/scene.module.scss +0 -9
- package/src/ui/react/game/sprite/index.jsx +0 -58
- package/src/ui/react/game/sprite/sprite.module.css +0 -3
- package/src/ui/react/game/stats/index.jsx +0 -22
- package/src/ui/react/hocs/with-absolute-position/index.jsx +0 -20
- package/src/ui/react/hocs/with-absolute-position/with-absolute-position.module.scss +0 -5
- package/src/ui/react/index.jsx +0 -9
- package/src/utils/algorithms/decision-tree.js +0 -24
- package/src/utils/algorithms/decision-tree.test.js +0 -102
- package/src/utils/algorithms/path-finding.js +0 -155
- package/src/utils/algorithms/path-finding.test.js +0 -151
- package/src/utils/algorithms/types.d.ts +0 -28
- package/src/utils/data-structures/array.js +0 -83
- package/src/utils/data-structures/array.test.js +0 -173
- package/src/utils/data-structures/board.js +0 -159
- package/src/utils/data-structures/board.test.js +0 -242
- package/src/utils/data-structures/boolean.js +0 -9
- package/src/utils/data-structures/heap.js +0 -164
- package/src/utils/data-structures/heap.test.js +0 -103
- package/src/utils/data-structures/object.js +0 -102
- package/src/utils/data-structures/object.test.js +0 -121
- package/src/utils/data-structures/objects.js +0 -48
- package/src/utils/data-structures/objects.test.js +0 -99
- package/src/utils/data-structures/tree.js +0 -36
- package/src/utils/data-structures/tree.test.js +0 -33
- package/src/utils/data-structures/types.d.ts +0 -4
- package/src/utils/functions/functions.js +0 -19
- package/src/utils/functions/functions.test.js +0 -23
- package/src/utils/math/geometry/circle.js +0 -117
- package/src/utils/math/geometry/circle.test.js +0 -97
- package/src/utils/math/geometry/hitmask.js +0 -39
- package/src/utils/math/geometry/hitmask.test.js +0 -84
- package/src/utils/math/geometry/line.js +0 -35
- package/src/utils/math/geometry/line.test.js +0 -49
- package/src/utils/math/geometry/platform.js +0 -42
- package/src/utils/math/geometry/platform.test.js +0 -133
- package/src/utils/math/geometry/point.js +0 -71
- package/src/utils/math/geometry/point.test.js +0 -81
- package/src/utils/math/geometry/rectangle.js +0 -45
- package/src/utils/math/geometry/rectangle.test.js +0 -42
- package/src/utils/math/geometry/segment.js +0 -80
- package/src/utils/math/geometry/segment.test.js +0 -183
- package/src/utils/math/geometry/triangle.js +0 -15
- package/src/utils/math/geometry/triangle.test.js +0 -11
- package/src/utils/math/geometry/types.d.ts +0 -23
- package/src/utils/math/linear-algebra/2d.js +0 -28
- package/src/utils/math/linear-algebra/2d.test.js +0 -17
- package/src/utils/math/linear-algebra/quaternion.js +0 -22
- package/src/utils/math/linear-algebra/quaternion.test.js +0 -25
- package/src/utils/math/linear-algebra/quaternions.js +0 -20
- package/src/utils/math/linear-algebra/quaternions.test.js +0 -29
- package/src/utils/math/linear-algebra/types.d.ts +0 -4
- package/src/utils/math/linear-algebra/vector.js +0 -302
- package/src/utils/math/linear-algebra/vector.test.js +0 -257
- package/src/utils/math/linear-algebra/vectors.js +0 -122
- package/src/utils/math/linear-algebra/vectors.test.js +0 -65
- package/src/utils/math/numbers.js +0 -90
- package/src/utils/math/numbers.test.js +0 -137
- package/src/utils/math/rng.js +0 -44
- package/src/utils/math/rng.test.js +0 -39
- package/src/utils/math/statistics.js +0 -43
- package/src/utils/math/statistics.test.js +0 -47
- package/src/utils/math/trigonometry.js +0 -89
- package/src/utils/math/trigonometry.test.js +0 -52
- package/src/utils/physics/acceleration.js +0 -63
- package/src/utils/physics/friction.js +0 -30
- package/src/utils/physics/friction.test.js +0 -44
- package/src/utils/physics/gravity.js +0 -71
- package/src/utils/physics/gravity.test.js +0 -80
- package/src/utils/physics/jump.js +0 -41
- package/src/utils/physics/velocity.js +0 -38
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "vitest"
|
|
2
|
-
|
|
3
|
-
import { zero } from "../math/linear-algebra/vector.js"
|
|
4
|
-
import { applyFriction } from "./friction.js"
|
|
5
|
-
|
|
6
|
-
test("it should apply no friction on no velocity", () => {
|
|
7
|
-
const friction = 250
|
|
8
|
-
const dt = 1
|
|
9
|
-
|
|
10
|
-
expect(applyFriction({ friction }, { dt })).toStrictEqual(zero())
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
test("it should apply no friction if no friction is passed", () => {
|
|
14
|
-
const velocity = [0, 0, 0]
|
|
15
|
-
const dt = 1
|
|
16
|
-
|
|
17
|
-
expect(applyFriction({ velocity }, { dt })).toBe(velocity)
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
test("it should apply no friction if no time passed", () => {
|
|
21
|
-
const velocity = [0, 0, 0]
|
|
22
|
-
const friction = 5
|
|
23
|
-
|
|
24
|
-
expect(applyFriction({ velocity, friction })).toBe(velocity)
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
test("it should apply friction to some velocity", () => {
|
|
28
|
-
const velocity = [8, 0, 6]
|
|
29
|
-
const friction = 5
|
|
30
|
-
const dt = 1
|
|
31
|
-
const expectedResult = [4, 0, 3]
|
|
32
|
-
|
|
33
|
-
expect(applyFriction({ velocity, friction }, { dt })).toStrictEqual(
|
|
34
|
-
expectedResult,
|
|
35
|
-
)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
test("it should stop movement when friction is equal to velocity", () => {
|
|
39
|
-
const velocity = [8, 0, 6]
|
|
40
|
-
const friction = 5
|
|
41
|
-
const dt = 2
|
|
42
|
-
|
|
43
|
-
expect(applyFriction({ velocity, friction }, { dt })).toStrictEqual(zero())
|
|
44
|
-
})
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {import('@inglorious/utils/math/linear-algebra/types').Vector3} Vector3
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/* eslint-disable no-magic-numbers */
|
|
6
|
-
|
|
7
|
-
import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
|
|
8
|
-
|
|
9
|
-
const DEFAULT_OPTIONS = { dt: 0 } // Default options for the applyGravity function.
|
|
10
|
-
const DEFAULT_JUMP = 0 // Default maximum jump height.
|
|
11
|
-
const DEFAULT_LEAP = 0 // Default maximum leap distance.
|
|
12
|
-
const DEFAULT_SPEED = 0 // Default maximum speed.
|
|
13
|
-
const NO_VELOCITY = 0 // No initial velocity.
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Applies gravity to an object based on its current velocity and position.
|
|
17
|
-
*
|
|
18
|
-
* @see https://youtu.be/hG9SzQxaCm8
|
|
19
|
-
*
|
|
20
|
-
* Projectile equations:
|
|
21
|
-
* 1. a(t) = g
|
|
22
|
-
* 2. v(t) = g*t + v_0
|
|
23
|
-
* 3. y(t) = 1/2*g*t^2 + v_0*t + y_0
|
|
24
|
-
*
|
|
25
|
-
* Known values:
|
|
26
|
-
* 1. y_0 = 0
|
|
27
|
-
* 2. v(t_h) = 0 -> 2. 0 = g*t_h + v_0 -> v_0 = -g*t_h
|
|
28
|
-
* 3. y_h = h -> 3. h = 1/2*g*t_h^2 (-g*t_h)*t_h = -1/2*g*t_h^2 -> g = -2*h/t_h^2
|
|
29
|
-
* 4. v_0 = -g*t_h = (-2*h/t_h^2)*t_h = 2*h/t_h
|
|
30
|
-
*
|
|
31
|
-
* Transforming time into space:
|
|
32
|
-
* 1. t_h = x_h/v_x
|
|
33
|
-
* 2. v0 = 2*h/t_h = 2*h*v_x/x_h
|
|
34
|
-
* 3. g = -2*h/t_h^2 = -2*h*v_x^2/x_h^2
|
|
35
|
-
*
|
|
36
|
-
* Euler's Integration:
|
|
37
|
-
* 1. v += a * dt
|
|
38
|
-
* 2. p += v * dt + 1/2 * a * dt * dt
|
|
39
|
-
*
|
|
40
|
-
* @param {Object} params - Parameters for gravity calculation.
|
|
41
|
-
* @param {number} params.maxJump - Maximum jump height. Defaults to 0.
|
|
42
|
-
* @param {number} params.maxLeap - Maximum leap distance. Defaults to 0.
|
|
43
|
-
* @param {number} params.maxSpeed - Maximum speed. Defaults to 0.
|
|
44
|
-
* @param {number} params.vy - Current vertical velocity. Defaults to 0.
|
|
45
|
-
* @param {Vector3} params.position - Current position vector.
|
|
46
|
-
* @param {Object} [options=DEFAULT_OPTIONS] - Additional options.
|
|
47
|
-
* @param {number} options.dt - Time delta for the calculation.
|
|
48
|
-
* @returns {Object} Updated acceleration, velocity, and position.
|
|
49
|
-
* @throws {Error} If maxLeap is not provided.
|
|
50
|
-
*/
|
|
51
|
-
export function applyGravity(params, options = DEFAULT_OPTIONS) {
|
|
52
|
-
let {
|
|
53
|
-
maxJump = DEFAULT_JUMP,
|
|
54
|
-
maxLeap = DEFAULT_LEAP,
|
|
55
|
-
maxSpeed = DEFAULT_SPEED,
|
|
56
|
-
vy = NO_VELOCITY,
|
|
57
|
-
position = zero(),
|
|
58
|
-
} = params
|
|
59
|
-
|
|
60
|
-
if (!maxLeap) {
|
|
61
|
-
throw new Error("Missing maxLeap")
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const { dt } = options
|
|
65
|
-
const ay = (-2 * maxJump * maxSpeed ** 2) / maxLeap ** 2
|
|
66
|
-
vy += ay * dt
|
|
67
|
-
const [x, y, z] = position
|
|
68
|
-
const py = y + vy * dt + 0.5 * ay * dt * dt
|
|
69
|
-
|
|
70
|
-
return { ay, vy, position: [x, py, z] }
|
|
71
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "vitest"
|
|
2
|
-
|
|
3
|
-
import { applyGravity } from "./gravity.js"
|
|
4
|
-
|
|
5
|
-
test("it should compute no gravity when max jump height is not set", () => {
|
|
6
|
-
const params = {
|
|
7
|
-
maxLeap: 10,
|
|
8
|
-
maxSpeed: 10,
|
|
9
|
-
vy: 10,
|
|
10
|
-
position: [0, 10, 0],
|
|
11
|
-
}
|
|
12
|
-
const dt = 1
|
|
13
|
-
|
|
14
|
-
expect(applyGravity(params, { dt })).toStrictEqual({
|
|
15
|
-
ay: -0,
|
|
16
|
-
vy: 10,
|
|
17
|
-
position: [0, 20, 0],
|
|
18
|
-
})
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
test("it should throw an error when max leap distance is not set", () => {
|
|
22
|
-
const params = {
|
|
23
|
-
maxJump: 10,
|
|
24
|
-
maxSpeed: 10,
|
|
25
|
-
vy: 10,
|
|
26
|
-
position: [0, 10, 0],
|
|
27
|
-
}
|
|
28
|
-
const dt = 1
|
|
29
|
-
|
|
30
|
-
expect(() => applyGravity(params, { dt })).toThrow()
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
test("it should compute no gravity when max movement speed is not set", () => {
|
|
34
|
-
const params = {
|
|
35
|
-
maxJump: 10,
|
|
36
|
-
maxLeap: 10,
|
|
37
|
-
vy: 10,
|
|
38
|
-
position: [0, 10, 0],
|
|
39
|
-
}
|
|
40
|
-
const dt = 1
|
|
41
|
-
|
|
42
|
-
expect(applyGravity(params, { dt })).toStrictEqual({
|
|
43
|
-
ay: -0,
|
|
44
|
-
vy: 10,
|
|
45
|
-
position: [0, 20, 0],
|
|
46
|
-
})
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
test("it should apply no gravity when no time has passed (gravity is calculated but not applied)", () => {
|
|
50
|
-
const params = {
|
|
51
|
-
maxJump: 10,
|
|
52
|
-
maxLeap: 10,
|
|
53
|
-
maxSpeed: 10,
|
|
54
|
-
vy: 10,
|
|
55
|
-
position: [0, 10, 0],
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
expect(applyGravity(params)).toStrictEqual({
|
|
59
|
-
ay: -20,
|
|
60
|
-
vy: 10,
|
|
61
|
-
position: [0, 10, 0],
|
|
62
|
-
})
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
test("it should apply gravity based on input parameters", () => {
|
|
66
|
-
const params = {
|
|
67
|
-
maxJump: 10,
|
|
68
|
-
maxLeap: 10,
|
|
69
|
-
maxSpeed: 10,
|
|
70
|
-
vy: 10,
|
|
71
|
-
position: [0, 10, 0],
|
|
72
|
-
}
|
|
73
|
-
const dt = 1
|
|
74
|
-
|
|
75
|
-
expect(applyGravity(params, { dt })).toStrictEqual({
|
|
76
|
-
ay: -20,
|
|
77
|
-
vy: -10,
|
|
78
|
-
position: [0, -10, 0],
|
|
79
|
-
})
|
|
80
|
-
})
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {import('@inglorious/utils/math/linear-algebra/types').Vector3} Vector3
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
/* eslint-disable no-magic-numbers */
|
|
6
|
-
|
|
7
|
-
import { zero } from "@inglorious/utils/math/linear-algebra/vector.js"
|
|
8
|
-
|
|
9
|
-
const DEFAULT_OPTIONS = { dt: 0 } // Default options for the jump function.
|
|
10
|
-
const DEFAULT_MAX_JUMP = 0 // Default maximum jump height.
|
|
11
|
-
const DEFAULT_MAX_LEAP = 0 // Default maximum leap distance.
|
|
12
|
-
const DEFAULT_MAX_SPEED = 0 // Default maximum speed.
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Calculates the vertical velocity (vy) and updates the Y position
|
|
16
|
-
* based on the provided parameters and options.
|
|
17
|
-
*
|
|
18
|
-
* @param {Object} params - Parameters for the jump calculation.
|
|
19
|
-
* @param {number} params.maxJump - Maximum jump height. Defaults to 0.
|
|
20
|
-
* @param {number} params.maxLeap - Maximum leap distance. Defaults to 0.
|
|
21
|
-
* @param {number} params.maxSpeed - Maximum speed. Defaults to 0.
|
|
22
|
-
* @param {Vector3} params.position - Current position vector.
|
|
23
|
-
* @param {Object} [options=DEFAULT_OPTIONS] - Options for the jump calculation.
|
|
24
|
-
* @param {number} options.dt - Delta time for the calculation. Defaults to 0.
|
|
25
|
-
* @returns {Object} An object containing the vertical velocity (vy) and updated position.
|
|
26
|
-
*/
|
|
27
|
-
export function jump(params, options = DEFAULT_OPTIONS) {
|
|
28
|
-
let {
|
|
29
|
-
maxJump = DEFAULT_MAX_JUMP,
|
|
30
|
-
maxLeap = DEFAULT_MAX_LEAP,
|
|
31
|
-
maxSpeed = DEFAULT_MAX_SPEED,
|
|
32
|
-
position = zero(),
|
|
33
|
-
} = params
|
|
34
|
-
const { dt } = options
|
|
35
|
-
|
|
36
|
-
const vy = (2 * maxJump * maxSpeed) / maxLeap
|
|
37
|
-
const [x, y, z] = position
|
|
38
|
-
const py = y + vy * dt
|
|
39
|
-
|
|
40
|
-
return { vy, position: [x, py, z] }
|
|
41
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {import('@inglorious/utils/math/linear-algebra/types').Vector3} Vector3
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
clamp,
|
|
7
|
-
multiply,
|
|
8
|
-
zero,
|
|
9
|
-
} from "@inglorious/utils/math/linear-algebra/vector.js"
|
|
10
|
-
import { sum } from "@inglorious/utils/math/linear-algebra/vectors.js"
|
|
11
|
-
|
|
12
|
-
const DEFAULT_OPTIONS = { dt: 0 } // Default options for the applyVelocity function.
|
|
13
|
-
const DEFAULT_MAX_SPEED = 0 // Default maximum speed for velocity clamping.
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Applies velocity to a position based on the given parameters and options.
|
|
17
|
-
*
|
|
18
|
-
* @param {Object} params - The parameters for velocity application.
|
|
19
|
-
* @param {number} [params.maxSpeed] - The maximum speed for clamping the velocity. Defaults to 0.
|
|
20
|
-
* @param {Vector3} [params.velocity] - The current velocity vector. Defaults to a zero vector.
|
|
21
|
-
* @param {Vector3} [params.position] - The current position vector. Defaults to a zero vector.
|
|
22
|
-
* @param {Object} [options=DEFAULT_OPTIONS] - Additional options for velocity application.
|
|
23
|
-
* @param {number} [options.dt=0] - The time delta for the calculation. Defaults to 0.
|
|
24
|
-
* @returns {Object} The updated velocity and position.
|
|
25
|
-
*/
|
|
26
|
-
export function applyVelocity(params, options = DEFAULT_OPTIONS) {
|
|
27
|
-
let {
|
|
28
|
-
maxSpeed = DEFAULT_MAX_SPEED,
|
|
29
|
-
velocity = zero(),
|
|
30
|
-
position = zero(),
|
|
31
|
-
} = params
|
|
32
|
-
const { dt } = options
|
|
33
|
-
|
|
34
|
-
velocity = clamp(velocity, -maxSpeed, maxSpeed)
|
|
35
|
-
|
|
36
|
-
position = sum(position, multiply(velocity, dt))
|
|
37
|
-
return { velocity, position }
|
|
38
|
-
}
|