@typeonce/ritmo-math 0.12.0 → 0.14.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/CHANGELOG.md +60 -0
- package/README.md +3 -3
- package/dist/Aabb.d.ts +15 -15
- package/dist/Aabb.d.ts.map +1 -1
- package/dist/Aabb.js +13 -5
- package/dist/Aabb.js.map +1 -1
- package/dist/Collide2.d.ts +48 -14
- package/dist/Collide2.d.ts.map +1 -1
- package/dist/Collide2.js +140 -17
- package/dist/Collide2.js.map +1 -1
- package/dist/Random.d.ts +16 -6
- package/dist/Random.d.ts.map +1 -1
- package/dist/Random.js +13 -3
- package/dist/Random.js.map +1 -1
- package/dist/Scalar.d.ts +26 -7
- package/dist/Scalar.d.ts.map +1 -1
- package/dist/Scalar.js +6 -3
- package/dist/Scalar.js.map +1 -1
- package/dist/Segment2.d.ts +56 -0
- package/dist/Segment2.d.ts.map +1 -0
- package/dist/Segment2.js +32 -0
- package/dist/Segment2.js.map +1 -0
- package/dist/Size2.d.ts +15 -15
- package/dist/Size2.d.ts.map +1 -1
- package/dist/Size2.js +13 -5
- package/dist/Size2.js.map +1 -1
- package/dist/Vector2.d.ts +15 -15
- package/dist/Vector2.d.ts.map +1 -1
- package/dist/Vector2.js +13 -5
- package/dist/Vector2.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/internal/aabb.d.ts +9 -2
- package/dist/internal/aabb.d.ts.map +1 -1
- package/dist/internal/aabb.js +3 -1
- package/dist/internal/aabb.js.map +1 -1
- package/dist/internal/codec.d.ts +9 -0
- package/dist/internal/codec.d.ts.map +1 -0
- package/dist/internal/codec.js +16 -0
- package/dist/internal/codec.js.map +1 -0
- package/dist/internal/scalar.d.ts +3 -4
- package/dist/internal/scalar.d.ts.map +1 -1
- package/dist/internal/scalar.js +19 -12
- package/dist/internal/scalar.js.map +1 -1
- package/dist/internal/size2.d.ts +9 -2
- package/dist/internal/size2.d.ts.map +1 -1
- package/dist/internal/size2.js +3 -1
- package/dist/internal/size2.js.map +1 -1
- package/dist/internal/vector2.d.ts +9 -2
- package/dist/internal/vector2.d.ts.map +1 -1
- package/dist/internal/vector2.js +3 -1
- package/dist/internal/vector2.js.map +1 -1
- package/package.json +2 -2
- package/src/Aabb.ts +15 -16
- package/src/Collide2.ts +153 -22
- package/src/Random.ts +21 -7
- package/src/Scalar.ts +27 -7
- package/src/Segment2.ts +71 -0
- package/src/Size2.ts +15 -16
- package/src/Vector2.ts +15 -16
- package/src/index.ts +6 -4
- package/src/internal/aabb.ts +8 -2
- package/src/internal/codec.ts +21 -0
- package/src/internal/scalar.ts +24 -13
- package/src/internal/size2.ts +8 -2
- package/src/internal/vector2.ts +8 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,65 @@
|
|
|
1
1
|
# @typeonce/ritmo-math
|
|
2
2
|
|
|
3
|
+
## 0.14.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e169263: **`Collide2` collides circles with line segments, so walls can run at any angle.** The new `Segment2` module is the plain segment `Collide2` reads every frame (`Segment2.between(a, b)`, `closestPoint`, `overlapsCircle`), like `Box2` for boxes. A segment is a two-sided wall with round ends; both ends at one point make a round post. `Collide2.sweepCircleSegment` finds the first contact with one, next to `sweepCircleBox`. A map traced from survey data, a slanted fence, or a polygon's edges no longer need a hand-written port of `moveCircle`.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
const fence = Segment2.between({ x: 0, y: 0 }, { x: 40, y: 30 });
|
|
11
|
+
const moved = Collide2.moveCircle(position, delta, radius, {
|
|
12
|
+
boxes: rooms,
|
|
13
|
+
segments: [fence],
|
|
14
|
+
});
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **Breaking: `moveCircle` and `pushOut` take the walls by kind, as `Collide2.Walls`** (`{ boxes?, segments? }`), instead of an array of boxes. An array no longer compiles (`pass walls by kind: { boxes: walls } or { segments: walls }`):
|
|
18
|
+
|
|
19
|
+
```diff
|
|
20
|
+
-Collide2.moveCircle(position, delta, radius, walls)
|
|
21
|
+
+Collide2.moveCircle(position, delta, radius, { boxes: walls })
|
|
22
|
+
-Collide2.pushOut(position, radius, walls)
|
|
23
|
+
+Collide2.pushOut(position, radius, { boxes: walls })
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
- **Breaking: `sweepCircleBoxes` is `sweepCircle`**, the first contact with any of the walls (line of sight with a radius of 0, as before):
|
|
27
|
+
|
|
28
|
+
```diff
|
|
29
|
+
-Collide2.sweepCircleBoxes(eye, Vec2.subtract(target, eye), 0, walls) === undefined
|
|
30
|
+
+Collide2.sweepCircle(eye, Vec2.subtract(target, eye), 0, { boxes: walls }) === undefined
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Results against boxes are unchanged.
|
|
34
|
+
|
|
35
|
+
### Patch Changes
|
|
36
|
+
|
|
37
|
+
- Updated dependencies [c3719a5]
|
|
38
|
+
- Updated dependencies [70d054e]
|
|
39
|
+
- Updated dependencies [adb4066]
|
|
40
|
+
- Updated dependencies [97e95fb]
|
|
41
|
+
- Updated dependencies [dbfbd9d]
|
|
42
|
+
- Updated dependencies [343660e]
|
|
43
|
+
- Updated dependencies [d24258e]
|
|
44
|
+
- Updated dependencies [cfe332a]
|
|
45
|
+
- Updated dependencies [8aa1e85]
|
|
46
|
+
- @typeonce/ritmo@0.14.0
|
|
47
|
+
|
|
48
|
+
## 0.13.0
|
|
49
|
+
|
|
50
|
+
### Minor Changes
|
|
51
|
+
|
|
52
|
+
- 835f6ba: **Each validated type has one `codec`, a Standard Schema, and a guard `is` that takes `unknown`.** `Vector2.codec`, `Size2.codec`, `Aabb.codec`, `Random.codec`, and `Scalar.Finite.codec` / `NonNegative.codec` / `Positive.codec` go straight into `Descriptor.ConstructedComponent(...)` or `ConstructedResource(...)`; inside a game's own schema, build the field from `is` (`Schema.declare(Vector2.is)`, `z.custom(Vector2.is)`). The scalar constructors are typed `Scalar.Constructor<T>`, which replaces `Brand.Constructor`.
|
|
53
|
+
|
|
54
|
+
- **Breaking: `Vector2.decode`, `Size2.decode`, `Aabb.decode`, `Random.decode`, and their `DecodeError` are removed.** `Descriptor.ConstructedComponent(Vector2)` becomes `Descriptor.ConstructedComponent(Vector2.codec)`; to check a value, use `Vector2.is(raw)` or `Vector2.result(raw)`, which stay.
|
|
55
|
+
|
|
56
|
+
### Patch Changes
|
|
57
|
+
|
|
58
|
+
- Updated dependencies [791b52a]
|
|
59
|
+
- Updated dependencies [b3d6502]
|
|
60
|
+
- Updated dependencies [835f6ba]
|
|
61
|
+
- @typeonce/ritmo@0.13.0
|
|
62
|
+
|
|
3
63
|
## 0.12.0
|
|
4
64
|
|
|
5
65
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Math for ritmo games, in two kinds:
|
|
4
4
|
|
|
5
|
-
- **Validated values**: `Scalar`, `
|
|
6
|
-
- **Hot-path helpers** on plain numbers, for code that runs every step: `Vec2` vector arithmetic (validated `Vector2` values pass straight in), `Box2` edge boxes, `Collide2` swept circle collision that slides along walls and never tunnels through them, a `SpatialGrid` broad phase that allocates nothing per step, a `FlowField` that leads bodies around walls, a deterministic `Random` whose whole state is one integer (keep it in a resource, so runs replay), and `Ops`, math functions that return the same bits on every engine.
|
|
5
|
+
- **Validated values**: `Scalar` (`Finite`, `NonNegative`, `Positive`), `Vector2`, `Size2`, and `Aabb`. Each has constructors that validate input (`result`, `option`), a guard `is`, and one `codec`, a Standard Schema: `Descriptor.ConstructedComponent(Vector2.codec)` saves the value and checks it on restore. Inside a game's own schema, build the field from the guard (`Schema.declare(Vector2.is)` in Effect, `z.custom(Vector2.is)` in Zod). `Random.codec` does the same for a generator kept in a resource.
|
|
6
|
+
- **Hot-path helpers** on plain numbers, for code that runs every step: `Vec2` vector arithmetic (validated `Vector2` values pass straight in), `Box2` edge boxes, `Segment2` walls at any angle, `Collide2` swept circle collision against both that slides along walls and never tunnels through them, a `SpatialGrid` broad phase that allocates nothing per step, a `FlowField` that leads bodies around walls, a deterministic `Random` whose whole state is one integer (keep it in a resource, so runs replay), and `Ops`, math functions that return the same bits on every engine.
|
|
7
7
|
|
|
8
8
|
```ts
|
|
9
9
|
import { Collide2, FlowField, Random, SpatialGrid, Vec2 } from "@typeonce/ritmo-math"
|
|
@@ -12,7 +12,7 @@ import { Collide2, FlowField, Random, SpatialGrid, Vec2 } from "@typeonce/ritmo-
|
|
|
12
12
|
paths.setWalls(walls, radius)
|
|
13
13
|
paths.setGoal(player)
|
|
14
14
|
const way = paths.way(enemy) ?? Vec2.normalizeOr(Vec2.subtract(player, enemy), Vec2.zero)
|
|
15
|
-
const moved = Collide2.moveCircle(enemy, Vec2.scale(way, speed * dt), radius, walls)
|
|
15
|
+
const moved = Collide2.moveCircle(enemy, Vec2.scale(way, speed * dt), radius, { boxes: walls })
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
```sh
|
package/dist/Aabb.d.ts
CHANGED
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
* Immutable geometry helpers for translation and overlap checks.
|
|
36
36
|
*/
|
|
37
37
|
import type * as Brand from "@typeonce/ritmo/Brand";
|
|
38
|
+
import type { StandardSchema } from "@typeonce/ritmo/Descriptor";
|
|
38
39
|
import type * as Result from "@typeonce/ritmo/Result";
|
|
39
40
|
import type * as Scalar from "./Scalar.ts";
|
|
40
41
|
import type * as Size2 from "./Size2.ts";
|
|
@@ -71,15 +72,6 @@ export type Error = {
|
|
|
71
72
|
readonly error: Size2.Error;
|
|
72
73
|
readonly input: Raw;
|
|
73
74
|
};
|
|
74
|
-
/**
|
|
75
|
-
* Failure produced by `decode` when the input does not have the raw shape.
|
|
76
|
-
*
|
|
77
|
-
* @category AABB Types
|
|
78
|
-
*/
|
|
79
|
-
export type DecodeError = {
|
|
80
|
-
readonly tag: "Aabb/Malformed";
|
|
81
|
-
readonly input: unknown;
|
|
82
|
-
};
|
|
83
75
|
/**
|
|
84
76
|
* Validates one raw AABB and returns an explicit result.
|
|
85
77
|
*
|
|
@@ -95,13 +87,20 @@ export type DecodeError = {
|
|
|
95
87
|
*/
|
|
96
88
|
export declare const result: (raw: Raw) => Result.Result<Aabb, Error>;
|
|
97
89
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
90
|
+
* The codec of `Aabb` (a Standard Schema, see `Descriptor.Codec`): give it to
|
|
91
|
+
* `Descriptor.ConstructedComponent(...)` so raw input and saves are validated.
|
|
92
|
+
* Its saved form is the raw shape, so it needs no `encode`. To put a `Aabb`
|
|
93
|
+
* inside your own object schema, use {@link is} with your library's guard
|
|
94
|
+
* schema (`Schema.declare`, `z.custom`).
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* const Position = Descriptor.ConstructedComponent(Aabb.codec)("Game/Position")
|
|
99
|
+
* ```
|
|
101
100
|
*
|
|
102
101
|
* @category Construction
|
|
103
102
|
*/
|
|
104
|
-
export declare const
|
|
103
|
+
export declare const codec: StandardSchema<Raw, Aabb>;
|
|
105
104
|
/**
|
|
106
105
|
* Validates one raw AABB and returns `null` on failure.
|
|
107
106
|
*
|
|
@@ -109,11 +108,12 @@ export declare const decode: (raw: unknown) => Result.Result<Aabb, Error | Decod
|
|
|
109
108
|
*/
|
|
110
109
|
export declare const option: (raw: Raw) => Aabb | null;
|
|
111
110
|
/**
|
|
112
|
-
*
|
|
111
|
+
* Whether any value is a valid `Aabb`: a guard, also for building a
|
|
112
|
+
* `Aabb` field in your own schema (`Schema.declare(Aabb.is)`).
|
|
113
113
|
*
|
|
114
114
|
* @category Construction
|
|
115
115
|
*/
|
|
116
|
-
export declare const is: (raw:
|
|
116
|
+
export declare const is: (raw: unknown) => raw is Aabb;
|
|
117
117
|
/**
|
|
118
118
|
* Reads the center position of one AABB.
|
|
119
119
|
*
|
package/dist/Aabb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Aabb.d.ts","sourceRoot":"","sources":["../src/Aabb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"Aabb.d.ts","sourceRoot":"","sources":["../src/Aabb.ts"],"names":[],"mappings":"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"}
|
package/dist/Aabb.js
CHANGED
|
@@ -14,13 +14,20 @@ import * as internal from "./internal/aabb.js";
|
|
|
14
14
|
*/
|
|
15
15
|
export const result = internal.result;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* The codec of `Aabb` (a Standard Schema, see `Descriptor.Codec`): give it to
|
|
18
|
+
* `Descriptor.ConstructedComponent(...)` so raw input and saves are validated.
|
|
19
|
+
* Its saved form is the raw shape, so it needs no `encode`. To put a `Aabb`
|
|
20
|
+
* inside your own object schema, use {@link is} with your library's guard
|
|
21
|
+
* schema (`Schema.declare`, `z.custom`).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* const Position = Descriptor.ConstructedComponent(Aabb.codec)("Game/Position")
|
|
26
|
+
* ```
|
|
20
27
|
*
|
|
21
28
|
* @category Construction
|
|
22
29
|
*/
|
|
23
|
-
export const
|
|
30
|
+
export const codec = internal.codec;
|
|
24
31
|
/**
|
|
25
32
|
* Validates one raw AABB and returns `null` on failure.
|
|
26
33
|
*
|
|
@@ -28,7 +35,8 @@ export const decode = internal.decode;
|
|
|
28
35
|
*/
|
|
29
36
|
export const option = internal.option;
|
|
30
37
|
/**
|
|
31
|
-
*
|
|
38
|
+
* Whether any value is a valid `Aabb`: a guard, also for building a
|
|
39
|
+
* `Aabb` field in your own schema (`Schema.declare(Aabb.is)`).
|
|
32
40
|
*
|
|
33
41
|
* @category Construction
|
|
34
42
|
*/
|
package/dist/Aabb.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Aabb.js","sourceRoot":"","sources":["../src/Aabb.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Aabb.js","sourceRoot":"","sources":["../src/Aabb.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AAmC9C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,MAAM,GAA6C,QAAQ,CAAC,MAAM,CAAA;AAC/E;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,KAAK,GAA8B,QAAQ,CAAC,KAAK,CAAA;AAC9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAA8B,QAAQ,CAAC,MAAM,CAAA;AAChE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,EAAE,GAAkC,QAAQ,CAAC,EAAE,CAAA;AAC5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAoC,QAAQ,CAAC,QAAQ,CAAA;AAC1E;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAgC,QAAQ,CAAC,IAAI,CAAA;AAC9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAkC,QAAQ,CAAC,IAAI,CAAA;AAChE;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAkC,QAAQ,CAAC,KAAK,CAAA;AAClE;;;;GAIG;AACH,MAAM,CAAC,MAAM,GAAG,GAAkC,QAAQ,CAAC,GAAG,CAAA;AAC9D;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAkC,QAAQ,CAAC,MAAM,CAAA;AACpE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAA2C,QAAQ,CAAC,UAAU,CAAA;AACrF;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA2C,QAAQ,CAAC,oBAAoB,CAAA;AACzG;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2C,QAAQ,CAAC,kBAAkB,CAAA;AACrG;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAiD,QAAQ,CAAC,SAAS,CAAA"}
|
package/dist/Collide2.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Continuous collision for moving circles against static
|
|
2
|
+
* Continuous collision for moving circles against static walls (axis-aligned
|
|
3
|
+
* boxes and line segments) and circles.
|
|
3
4
|
*
|
|
4
|
-
* Movement is swept, not sampled: `
|
|
5
|
+
* Movement is swept, not sampled: `sweepCircle` finds the first time of
|
|
5
6
|
* contact along the whole displacement, so fast movers (dashes, projectiles)
|
|
6
7
|
* cannot skip over a wall between two steps. `moveCircle` stops at walls and
|
|
7
|
-
* slides along them.
|
|
8
|
+
* slides along them. Walls are passed as {@link Walls}: `Box2` boxes for a
|
|
9
|
+
* grid of rooms, `Segment2` segments for walls at any angle, or both.
|
|
8
10
|
*
|
|
9
11
|
* Every query returns `undefined` for "no contact", never throws, and
|
|
10
12
|
* allocates only its result. Inputs are expected to be finite.
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
* @example
|
|
13
15
|
* ```ts
|
|
14
16
|
* // Move a body by its velocity this step, sliding along the walls.
|
|
15
|
-
* const moved = Collide2.moveCircle(position, Vec2.scale(velocity, dt), radius, walls)
|
|
17
|
+
* const moved = Collide2.moveCircle(position, Vec2.scale(velocity, dt), radius, { boxes: walls })
|
|
16
18
|
* if (moved.blocked) bumpedWall()
|
|
17
19
|
* ```
|
|
18
20
|
*
|
|
@@ -29,6 +31,7 @@
|
|
|
29
31
|
* Moving a circle through walls with sliding.
|
|
30
32
|
*/
|
|
31
33
|
import type { Box2 } from "./Box2.ts";
|
|
34
|
+
import type { Segment2 } from "./Segment2.ts";
|
|
32
35
|
import type { Vec2 } from "./Vec2.ts";
|
|
33
36
|
/**
|
|
34
37
|
* A contact along a sweep.
|
|
@@ -38,10 +41,22 @@ import type { Vec2 } from "./Vec2.ts";
|
|
|
38
41
|
export interface Hit {
|
|
39
42
|
/** Fraction of the displacement travelled before contact, in [0, 1]. */
|
|
40
43
|
readonly time: number;
|
|
41
|
-
/** Unit contact normal, pointing away from the
|
|
44
|
+
/** Unit contact normal, pointing away from the wall. */
|
|
42
45
|
readonly nx: number;
|
|
43
46
|
readonly ny: number;
|
|
44
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* The static walls a circle collides with: axis-aligned `boxes`, line
|
|
50
|
+
* `segments`, or both. A missing list is no walls of that kind.
|
|
51
|
+
*
|
|
52
|
+
* @category Collision Types
|
|
53
|
+
*/
|
|
54
|
+
export interface Walls {
|
|
55
|
+
readonly boxes?: ReadonlyArray<Box2>;
|
|
56
|
+
readonly segments?: ReadonlyArray<Segment2>;
|
|
57
|
+
/** Not a setting: an array of walls is passed by kind. */
|
|
58
|
+
readonly length?: "pass walls by kind: { boxes: walls } or { segments: walls }";
|
|
59
|
+
}
|
|
45
60
|
/**
|
|
46
61
|
* Where a moved circle ended up.
|
|
47
62
|
*
|
|
@@ -79,7 +94,18 @@ export declare const rayCircle: (ox: number, oy: number, dx: number, dy: number,
|
|
|
79
94
|
*/
|
|
80
95
|
export declare const sweepCircleBox: (origin: Vec2, delta: Vec2, radius: number, box: Box2) => Hit | undefined;
|
|
81
96
|
/**
|
|
82
|
-
* First contact of a
|
|
97
|
+
* First contact of a circle of `radius` at `origin` moving by `delta` with
|
|
98
|
+
* `segment`, or `undefined`. Contact is computed against the segment
|
|
99
|
+
* thickened by the radius with round ends (the exact Minkowski sum), so the
|
|
100
|
+
* circle slides along it and around its ends. A circle that starts exactly
|
|
101
|
+
* touching it and moves into it hits at time 0. A circle that starts
|
|
102
|
+
* overlapping the segment is not reported; resolve it with `pushOut` first.
|
|
103
|
+
*
|
|
104
|
+
* @category Queries
|
|
105
|
+
*/
|
|
106
|
+
export declare const sweepCircleSegment: (origin: Vec2, delta: Vec2, radius: number, segment: Segment2) => Hit | undefined;
|
|
107
|
+
/**
|
|
108
|
+
* First contact of a moving circle with any of `walls`, or `undefined`.
|
|
83
109
|
*
|
|
84
110
|
* With a `radius` of 0 the circle is a point and the sweep is a segment, so
|
|
85
111
|
* this is also line of sight: `undefined` means nothing blocks the line from
|
|
@@ -88,12 +114,12 @@ export declare const sweepCircleBox: (origin: Vec2, delta: Vec2, radius: number,
|
|
|
88
114
|
*
|
|
89
115
|
* @example
|
|
90
116
|
* ```ts
|
|
91
|
-
* const sees = Collide2.
|
|
117
|
+
* const sees = Collide2.sweepCircle(eye, Vec2.subtract(target, eye), 0, { boxes: walls }) === undefined
|
|
92
118
|
* ```
|
|
93
119
|
*
|
|
94
120
|
* @category Queries
|
|
95
121
|
*/
|
|
96
|
-
export declare const
|
|
122
|
+
export declare const sweepCircle: (origin: Vec2, delta: Vec2, radius: number, walls: Walls) => Hit | undefined;
|
|
97
123
|
/**
|
|
98
124
|
* First time in [0, 1] at which a circle of `radius` moving from `origin` by
|
|
99
125
|
* `delta` touches a circle of `targetRadius` at `target`, or `undefined`. A
|
|
@@ -103,20 +129,28 @@ export declare const sweepCircleBoxes: (origin: Vec2, delta: Vec2, radius: numbe
|
|
|
103
129
|
*/
|
|
104
130
|
export declare const sweepCircleCircle: (origin: Vec2, delta: Vec2, radius: number, target: Vec2, targetRadius: number) => number | undefined;
|
|
105
131
|
/**
|
|
106
|
-
* Pushes a circle out of every
|
|
107
|
-
* between it and each wall. Returns
|
|
132
|
+
* Pushes a circle out of every wall it overlaps, boxes first and then
|
|
133
|
+
* segments, each in order, leaving `skin` between it and each wall. Returns
|
|
134
|
+
* the corrected center. A center inside a box leaves through the nearest
|
|
135
|
+
* side; a center exactly on a segment leaves along the segment's left normal.
|
|
108
136
|
*
|
|
109
137
|
* @category Movement
|
|
110
138
|
*/
|
|
111
|
-
export declare const pushOut: (center: Vec2, radius: number,
|
|
139
|
+
export declare const pushOut: (center: Vec2, radius: number, walls: Walls, skin?: number) => Vec2;
|
|
112
140
|
/**
|
|
113
141
|
* Moves a circle by `delta`, stopping at walls and sliding along them (up to
|
|
114
142
|
* four contacts per call). The whole path is swept, so no displacement can
|
|
115
143
|
* tunnel through a wall. A circle that starts inside a wall is pushed out
|
|
116
|
-
* first. A circle meeting a box's corner dead-on goes
|
|
117
|
-
* stopping against it.
|
|
144
|
+
* first. A circle meeting a box's corner or a segment's end dead-on goes
|
|
145
|
+
* around it rather than stopping against it.
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```ts
|
|
149
|
+
* // A map traced from survey data: every wall is a segment.
|
|
150
|
+
* const moved = Collide2.moveCircle(position, delta, radius, { segments: nearbyWalls })
|
|
151
|
+
* ```
|
|
118
152
|
*
|
|
119
153
|
* @category Movement
|
|
120
154
|
*/
|
|
121
|
-
export declare const moveCircle: (start: Vec2, delta: Vec2, radius: number,
|
|
155
|
+
export declare const moveCircle: (start: Vec2, delta: Vec2, radius: number, walls: Walls, skin?: number) => MoveResult;
|
|
122
156
|
//# sourceMappingURL=Collide2.d.ts.map
|
package/dist/Collide2.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collide2.d.ts","sourceRoot":"","sources":["../src/Collide2.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Collide2.d.ts","sourceRoot":"","sources":["../src/Collide2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC;;;;GAIG;AACH,MAAM,WAAW,GAAG;IAClB,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC3C,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,6DAA6D,CAAA;CAChF;AAKD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAA;IACvB,oCAAoC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,OAAO,CAAA;AAE/B;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,OAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,MAAM,KAAG,MAAM,GAAG,SAWtH,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,WAAY,IAAI,SAAS,IAAI,UAAU,MAAM,OAAO,IAAI,KAAG,GAAG,GAAG,SAyE3F,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,WAAY,IAAI,SAAS,IAAI,UAAU,MAAM,WAAW,QAAQ,KAAG,GAAG,GAAG,SA0CvG,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,WAAY,IAAI,SAAS,IAAI,UAAU,MAAM,SAAS,KAAK,KAAG,GAAG,GAAG,SAW3F,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,WACpB,IAAI,SACL,IAAI,UACH,MAAM,UACN,IAAI,gBACE,MAAM,KACnB,MAAM,GAAG,SAMX,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,WAAY,IAAI,UAAU,MAAM,SAAS,KAAK,SAAQ,MAAM,KAAiB,IAqDhG,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU,UAAW,IAAI,SAAS,IAAI,UAAU,MAAM,SAAS,KAAK,SAAQ,MAAM,KAAiB,UAyD/G,CAAA"}
|
package/dist/Collide2.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as Ops from "./Ops.js";
|
|
2
|
+
const noBoxes = [];
|
|
3
|
+
const noSegments = [];
|
|
2
4
|
/**
|
|
3
5
|
* The distance `pushOut` and `moveCircle` keep from walls after a contact
|
|
4
6
|
* (in world units), so the next sweep starts outside the wall.
|
|
@@ -120,7 +122,64 @@ export const sweepCircleBox = (origin, delta, radius, box) => {
|
|
|
120
122
|
return { time: enter, nx, ny };
|
|
121
123
|
};
|
|
122
124
|
/**
|
|
123
|
-
* First contact of a
|
|
125
|
+
* First contact of a circle of `radius` at `origin` moving by `delta` with
|
|
126
|
+
* `segment`, or `undefined`. Contact is computed against the segment
|
|
127
|
+
* thickened by the radius with round ends (the exact Minkowski sum), so the
|
|
128
|
+
* circle slides along it and around its ends. A circle that starts exactly
|
|
129
|
+
* touching it and moves into it hits at time 0. A circle that starts
|
|
130
|
+
* overlapping the segment is not reported; resolve it with `pushOut` first.
|
|
131
|
+
*
|
|
132
|
+
* @category Queries
|
|
133
|
+
*/
|
|
134
|
+
export const sweepCircleSegment = (origin, delta, radius, segment) => {
|
|
135
|
+
const ex = segment.bx - segment.ax;
|
|
136
|
+
const ey = segment.by - segment.ay;
|
|
137
|
+
const lengthSquared = ex * ex + ey * ey;
|
|
138
|
+
if (lengthSquared > 1e-12) {
|
|
139
|
+
// The flat side facing the circle, `radius` away from the segment's line.
|
|
140
|
+
const length = Math.sqrt(lengthSquared);
|
|
141
|
+
let nx = -ey / length;
|
|
142
|
+
let ny = ex / length;
|
|
143
|
+
let side = (origin.x - segment.ax) * nx + (origin.y - segment.ay) * ny;
|
|
144
|
+
if (side < 0) {
|
|
145
|
+
nx = -nx;
|
|
146
|
+
ny = -ny;
|
|
147
|
+
side = -side;
|
|
148
|
+
}
|
|
149
|
+
if (side < radius) {
|
|
150
|
+
// Beside the line: overlapping when level with the segment, otherwise
|
|
151
|
+
// only its ends are in the way.
|
|
152
|
+
const along = ((origin.x - segment.ax) * ex + (origin.y - segment.ay) * ey) / lengthSquared;
|
|
153
|
+
if (along >= 0 && along <= 1)
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const into = delta.x * nx + delta.y * ny;
|
|
158
|
+
if (into < 0) {
|
|
159
|
+
// `0 +` turns a -0 (touching at the start) into 0.
|
|
160
|
+
const time = 0 + (radius - side) / into;
|
|
161
|
+
if (time <= 1) {
|
|
162
|
+
const along = ((origin.x + delta.x * time - segment.ax) * ex + (origin.y + delta.y * time - segment.ay) * ey) / lengthSquared;
|
|
163
|
+
// The thickened segment is convex, so entering through its flat side is the first contact.
|
|
164
|
+
if (along >= 0 && along <= 1)
|
|
165
|
+
return { time, nx, ny };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const atA = rayCircle(origin.x, origin.y, delta.x, delta.y, segment.ax, segment.ay, radius);
|
|
171
|
+
const atB = lengthSquared > 1e-12 ? rayCircle(origin.x, origin.y, delta.x, delta.y, segment.bx, segment.by, radius) : undefined;
|
|
172
|
+
if (atA === undefined && atB === undefined)
|
|
173
|
+
return undefined;
|
|
174
|
+
const fromA = atB === undefined || (atA !== undefined && atA <= atB);
|
|
175
|
+
const time = fromA ? atA : atB;
|
|
176
|
+
const cx = origin.x + delta.x * time - (fromA ? segment.ax : segment.bx);
|
|
177
|
+
const cy = origin.y + delta.y * time - (fromA ? segment.ay : segment.by);
|
|
178
|
+
const length = Ops.hypot(cx, cy) || 1;
|
|
179
|
+
return { time, nx: cx / length, ny: cy / length };
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* First contact of a moving circle with any of `walls`, or `undefined`.
|
|
124
183
|
*
|
|
125
184
|
* With a `radius` of 0 the circle is a point and the sweep is a segment, so
|
|
126
185
|
* this is also line of sight: `undefined` means nothing blocks the line from
|
|
@@ -129,18 +188,23 @@ export const sweepCircleBox = (origin, delta, radius, box) => {
|
|
|
129
188
|
*
|
|
130
189
|
* @example
|
|
131
190
|
* ```ts
|
|
132
|
-
* const sees = Collide2.
|
|
191
|
+
* const sees = Collide2.sweepCircle(eye, Vec2.subtract(target, eye), 0, { boxes: walls }) === undefined
|
|
133
192
|
* ```
|
|
134
193
|
*
|
|
135
194
|
* @category Queries
|
|
136
195
|
*/
|
|
137
|
-
export const
|
|
196
|
+
export const sweepCircle = (origin, delta, radius, walls) => {
|
|
138
197
|
let first;
|
|
139
|
-
for (const box of boxes) {
|
|
198
|
+
for (const box of walls.boxes ?? noBoxes) {
|
|
140
199
|
const hit = sweepCircleBox(origin, delta, radius, box);
|
|
141
200
|
if (hit !== undefined && (first === undefined || hit.time < first.time))
|
|
142
201
|
first = hit;
|
|
143
202
|
}
|
|
203
|
+
for (const segment of walls.segments ?? noSegments) {
|
|
204
|
+
const hit = sweepCircleSegment(origin, delta, radius, segment);
|
|
205
|
+
if (hit !== undefined && (first === undefined || hit.time < first.time))
|
|
206
|
+
first = hit;
|
|
207
|
+
}
|
|
144
208
|
return first;
|
|
145
209
|
};
|
|
146
210
|
/**
|
|
@@ -159,15 +223,17 @@ export const sweepCircleCircle = (origin, delta, radius, target, targetRadius) =
|
|
|
159
223
|
return rayCircle(origin.x, origin.y, delta.x, delta.y, target.x, target.y, r);
|
|
160
224
|
};
|
|
161
225
|
/**
|
|
162
|
-
* Pushes a circle out of every
|
|
163
|
-
* between it and each wall. Returns
|
|
226
|
+
* Pushes a circle out of every wall it overlaps, boxes first and then
|
|
227
|
+
* segments, each in order, leaving `skin` between it and each wall. Returns
|
|
228
|
+
* the corrected center. A center inside a box leaves through the nearest
|
|
229
|
+
* side; a center exactly on a segment leaves along the segment's left normal.
|
|
164
230
|
*
|
|
165
231
|
* @category Movement
|
|
166
232
|
*/
|
|
167
|
-
export const pushOut = (center, radius,
|
|
233
|
+
export const pushOut = (center, radius, walls, skin = defaultSkin) => {
|
|
168
234
|
let x = center.x;
|
|
169
235
|
let y = center.y;
|
|
170
|
-
for (const box of boxes) {
|
|
236
|
+
for (const box of walls.boxes ?? noBoxes) {
|
|
171
237
|
const closestX = Math.max(box.minX, Math.min(x, box.maxX));
|
|
172
238
|
const closestY = Math.max(box.minY, Math.min(y, box.maxY));
|
|
173
239
|
const dx = x - closestX;
|
|
@@ -197,26 +263,83 @@ export const pushOut = (center, radius, boxes, skin = defaultSkin) => {
|
|
|
197
263
|
y = box.maxY + radius + skin;
|
|
198
264
|
}
|
|
199
265
|
}
|
|
266
|
+
for (const segment of walls.segments ?? noSegments) {
|
|
267
|
+
const ex = segment.bx - segment.ax;
|
|
268
|
+
const ey = segment.by - segment.ay;
|
|
269
|
+
const lengthSquared = ex * ex + ey * ey;
|
|
270
|
+
const along = lengthSquared > 1e-12 ? Math.max(0, Math.min(1, ((x - segment.ax) * ex + (y - segment.ay) * ey) / lengthSquared)) : 0;
|
|
271
|
+
const closestX = segment.ax + ex * along;
|
|
272
|
+
const closestY = segment.ay + ey * along;
|
|
273
|
+
const dx = x - closestX;
|
|
274
|
+
const dy = y - closestY;
|
|
275
|
+
const distanceSquared = dx * dx + dy * dy;
|
|
276
|
+
if (distanceSquared >= radius * radius)
|
|
277
|
+
continue;
|
|
278
|
+
if (distanceSquared > 1e-12) {
|
|
279
|
+
const distance = Math.sqrt(distanceSquared);
|
|
280
|
+
x = closestX + (dx / distance) * (radius + skin);
|
|
281
|
+
y = closestY + (dy / distance) * (radius + skin);
|
|
282
|
+
}
|
|
283
|
+
else if (lengthSquared > 1e-12) {
|
|
284
|
+
// Center on the segment: leave along its left normal.
|
|
285
|
+
const length = Math.sqrt(lengthSquared);
|
|
286
|
+
x = closestX - (ey / length) * (radius + skin);
|
|
287
|
+
y = closestY + (ex / length) * (radius + skin);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
// Center on a round post: leave along +x.
|
|
291
|
+
x = closestX + radius + skin;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
200
294
|
return { x, y };
|
|
201
295
|
};
|
|
202
296
|
/**
|
|
203
297
|
* Moves a circle by `delta`, stopping at walls and sliding along them (up to
|
|
204
298
|
* four contacts per call). The whole path is swept, so no displacement can
|
|
205
299
|
* tunnel through a wall. A circle that starts inside a wall is pushed out
|
|
206
|
-
* first. A circle meeting a box's corner dead-on goes
|
|
207
|
-
* stopping against it.
|
|
300
|
+
* first. A circle meeting a box's corner or a segment's end dead-on goes
|
|
301
|
+
* around it rather than stopping against it.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```ts
|
|
305
|
+
* // A map traced from survey data: every wall is a segment.
|
|
306
|
+
* const moved = Collide2.moveCircle(position, delta, radius, { segments: nearbyWalls })
|
|
307
|
+
* ```
|
|
208
308
|
*
|
|
209
309
|
* @category Movement
|
|
210
310
|
*/
|
|
211
|
-
export const moveCircle = (start, delta, radius,
|
|
212
|
-
let position = pushOut(start, radius,
|
|
311
|
+
export const moveCircle = (start, delta, radius, walls, skin = defaultSkin) => {
|
|
312
|
+
let position = pushOut(start, radius, walls, skin);
|
|
213
313
|
let rx = delta.x;
|
|
214
314
|
let ry = delta.y;
|
|
215
315
|
let blocked = false;
|
|
216
316
|
for (let iteration = 0; iteration < 4; iteration++) {
|
|
217
317
|
if (rx * rx + ry * ry < 1e-12)
|
|
218
318
|
break;
|
|
219
|
-
const
|
|
319
|
+
const step = { x: rx, y: ry };
|
|
320
|
+
// The first contact, and whether it is round (a box's corner or a
|
|
321
|
+
// segment's end) rather than a flat side.
|
|
322
|
+
let hit;
|
|
323
|
+
let round = false;
|
|
324
|
+
for (const box of walls.boxes ?? noBoxes) {
|
|
325
|
+
const found = sweepCircleBox(position, step, radius, box);
|
|
326
|
+
if (found === undefined || (hit !== undefined && found.time >= hit.time))
|
|
327
|
+
continue;
|
|
328
|
+
hit = found;
|
|
329
|
+
round = found.nx !== 0 && found.ny !== 0;
|
|
330
|
+
}
|
|
331
|
+
for (const segment of walls.segments ?? noSegments) {
|
|
332
|
+
const found = sweepCircleSegment(position, step, radius, segment);
|
|
333
|
+
if (found === undefined || (hit !== undefined && found.time >= hit.time))
|
|
334
|
+
continue;
|
|
335
|
+
hit = found;
|
|
336
|
+
const ex = segment.bx - segment.ax;
|
|
337
|
+
const ey = segment.by - segment.ay;
|
|
338
|
+
const lengthSquared = ex * ex + ey * ey;
|
|
339
|
+
const along = found.nx * ex + found.ny * ey;
|
|
340
|
+
// A flat side's normal is perpendicular to the segment.
|
|
341
|
+
round = lengthSquared < 1e-12 || along * along > 1e-18 * lengthSquared;
|
|
342
|
+
}
|
|
220
343
|
if (hit === undefined) {
|
|
221
344
|
position = { x: position.x + rx, y: position.y + ry };
|
|
222
345
|
break;
|
|
@@ -234,10 +357,10 @@ export const moveCircle = (start, delta, radius, boxes, skin = defaultSkin) => {
|
|
|
234
357
|
if (into < 0) {
|
|
235
358
|
rx -= into * hit.nx;
|
|
236
359
|
ry -= into * hit.ny;
|
|
237
|
-
// Dead-on into a rounded corner (as an exact diagonal meets an
|
|
238
|
-
// axis-aligned box) nothing is left to slide along: go around
|
|
239
|
-
//
|
|
240
|
-
if (
|
|
360
|
+
// Dead-on into a rounded corner or end (as an exact diagonal meets an
|
|
361
|
+
// axis-aligned box) nothing is left to slide along: go around it
|
|
362
|
+
// instead of stopping against it.
|
|
363
|
+
if (round && rx * rx + ry * ry < 1e-12 * into * into) {
|
|
241
364
|
const side = rx * -hit.ny + ry * hit.nx < 0 ? -1 : 1;
|
|
242
365
|
rx = -hit.ny * -into * side;
|
|
243
366
|
ry = hit.nx * -into * side;
|
package/dist/Collide2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Collide2.js","sourceRoot":"","sources":["../src/Collide2.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Collide2.js","sourceRoot":"","sources":["../src/Collide2.ts"],"names":[],"mappings":"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"}
|