@edv4h/usketch-plugin-character 0.3.1 → 0.5.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 +67 -11
- package/dist/character-input.d.ts +11 -3
- package/dist/character-input.d.ts.map +1 -1
- package/dist/character-input.js +63 -18
- package/dist/character-input.js.map +1 -1
- package/dist/character-key-choices.d.ts +14 -0
- package/dist/character-key-choices.d.ts.map +1 -0
- package/dist/character-key-choices.js +23 -0
- package/dist/character-key-choices.js.map +1 -0
- package/dist/character-layer.d.ts +1 -1
- package/dist/character-layer.d.ts.map +1 -1
- package/dist/character-layer.js +45 -14
- package/dist/character-layer.js.map +1 -1
- package/dist/character-physics.d.ts +156 -2
- package/dist/character-physics.d.ts.map +1 -1
- package/dist/character-physics.js +270 -22
- package/dist/character-physics.js.map +1 -1
- package/dist/character-runtime.d.ts +8 -1
- package/dist/character-runtime.d.ts.map +1 -1
- package/dist/character-runtime.js +90 -8
- package/dist/character-runtime.js.map +1 -1
- package/dist/character-service.d.ts +23 -3
- package/dist/character-service.d.ts.map +1 -1
- package/dist/character-service.js +7 -0
- package/dist/character-service.js.map +1 -1
- package/dist/character-store.d.ts +34 -1
- package/dist/character-store.d.ts.map +1 -1
- package/dist/character-store.js +86 -4
- package/dist/character-store.js.map +1 -1
- package/dist/character-sync.d.ts +11 -1
- package/dist/character-sync.d.ts.map +1 -1
- package/dist/character-sync.js +23 -1
- package/dist/character-sync.js.map +1 -1
- package/dist/character-types.d.ts +31 -2
- package/dist/character-types.d.ts.map +1 -1
- package/dist/character-types.js +2 -1
- package/dist/character-types.js.map +1 -1
- package/dist/character-virtual-input.d.ts +36 -0
- package/dist/character-virtual-input.d.ts.map +1 -0
- package/dist/character-virtual-input.js +48 -0
- package/dist/character-virtual-input.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +13 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +2 -0
- package/dist/plugin.js.map +1 -1
- package/dist/register-character-hud.d.ts.map +1 -1
- package/dist/register-character-hud.js +88 -1
- package/dist/register-character-hud.js.map +1 -1
- package/package.json +2 -2
|
@@ -7,6 +7,19 @@ export interface MoveInput {
|
|
|
7
7
|
right: boolean;
|
|
8
8
|
/** Vehicle: the drift key (only acts when drift is enabled). */
|
|
9
9
|
drift?: boolean;
|
|
10
|
+
/** The drift key was pressed since the previous step (an edge: starts a drift hop). */
|
|
11
|
+
driftPressed?: boolean;
|
|
12
|
+
/** The jump key is held (a release while rising cuts the jump short). */
|
|
13
|
+
jump?: boolean;
|
|
14
|
+
/** The jump key was pressed since the previous step (an edge, so a quick tap counts). */
|
|
15
|
+
jumpPressed?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Analog forward / back, -1 (full reverse / screen down) … 1 (full throttle / screen
|
|
18
|
+
* up), e.g. from a touch stick. When set it replaces `up` / `down`.
|
|
19
|
+
*/
|
|
20
|
+
throttle?: number;
|
|
21
|
+
/** Analog steering, -1 (left) … 1 (right). When set it replaces `left` / `right`. */
|
|
22
|
+
steer?: number;
|
|
10
23
|
}
|
|
11
24
|
export declare const NO_INPUT: MoveInput;
|
|
12
25
|
export interface CharacterPose {
|
|
@@ -28,6 +41,23 @@ export interface CharacterPose {
|
|
|
28
41
|
slip: number;
|
|
29
42
|
/** Vehicle: the running drift's direction, -1 (left) / 1 (right), 0 = not drifting. */
|
|
30
43
|
drift: -1 | 0 | 1;
|
|
44
|
+
/**
|
|
45
|
+
* Height of the character's feet, world units — absolute, like the ground height
|
|
46
|
+
* (0 = the flat board). On the ground it equals the ground height; it rises above it
|
|
47
|
+
* while jumping or falling, so it stays smooth across cliff edges.
|
|
48
|
+
*/
|
|
49
|
+
z: number;
|
|
50
|
+
/** Vertical speed, world units / s (positive = rising). */
|
|
51
|
+
vz: number;
|
|
52
|
+
/** Whether the character is in the air (jumping or falling). */
|
|
53
|
+
airborne: boolean;
|
|
54
|
+
/** Hovering: the jump key held while falling slows the descent (see `HoverParams`). */
|
|
55
|
+
hovering: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Hover gauge, 0 (empty) … 1 (full): drains while hovering, refills on the ground.
|
|
58
|
+
* Stays 1 while hovering is off.
|
|
59
|
+
*/
|
|
60
|
+
hoverGauge: number;
|
|
31
61
|
}
|
|
32
62
|
/** A pose at rest at the origin, facing up. */
|
|
33
63
|
export declare const ORIGIN_POSE: CharacterPose;
|
|
@@ -71,6 +101,13 @@ export interface DriftParams {
|
|
|
71
101
|
steerSlipAngle: number;
|
|
72
102
|
/** How fast the slip follows its target (1/s, exponential). */
|
|
73
103
|
recoveryRate: number;
|
|
104
|
+
/**
|
|
105
|
+
* Pressing the drift key on the ground hops first (a small jump; the drift starts on
|
|
106
|
+
* landing if still held and steering, since a car can't steer in the air).
|
|
107
|
+
*/
|
|
108
|
+
hop: boolean;
|
|
109
|
+
/** Height of that hop, world units. */
|
|
110
|
+
hopHeight: number;
|
|
74
111
|
}
|
|
75
112
|
export declare const DEFAULT_DRIFT: DriftParams;
|
|
76
113
|
/** Unit vector of a heading in world space (0° → (0, -1), 90° → (1, 0)). */
|
|
@@ -82,17 +119,25 @@ export declare function headingVector(deg: number): {
|
|
|
82
119
|
export declare function vectorHeading(x: number, y: number): number;
|
|
83
120
|
/** Move `from` toward `to` by at most `maxStep` degrees, the short way round. */
|
|
84
121
|
export declare function turnToward(from: number, to: number, maxStep: number): number;
|
|
122
|
+
/** Clamp to -1 … 1; a missing or non-finite value counts as 0 (released). */
|
|
123
|
+
export declare const clampUnit: (v: number | undefined) => number;
|
|
124
|
+
/** Forward / back of an input, -1 … 1: the analog `throttle` when set, else up − down. */
|
|
125
|
+
export declare function inputThrottle(input: MoveInput): number;
|
|
126
|
+
/** Left / right of an input, -1 … 1: the analog `steer` when set, else right − left. */
|
|
127
|
+
export declare function inputSteer(input: MoveInput): number;
|
|
85
128
|
/**
|
|
86
129
|
* Advance `pose` by `dt` seconds.
|
|
87
130
|
*
|
|
88
131
|
* - `directional`: the held keys give a SCREEN-space direction (up = screen up),
|
|
89
132
|
* turned into world space through the camera rotation; the character moves that
|
|
90
133
|
* way at `moveSpeed` and its heading turns toward it at `turnRate`. (Turning
|
|
91
|
-
* rather than snapping keeps a heading-following camera from spinning.)
|
|
134
|
+
* rather than snapping keeps a heading-following camera from spinning.) An analog
|
|
135
|
+
* input (`steer` / `throttle`) moves at `moveSpeed` × its length (capped at 1).
|
|
92
136
|
* - `vehicle`: up/down are throttle/reverse along the heading, left/right steer.
|
|
93
137
|
* Steering authority scales with speed (a stopped car can't turn) and inverts
|
|
94
138
|
* when reversing, like a car. With `driftParams`, holding the drift key while
|
|
95
|
-
* steering at speed drifts (see `DriftParams`).
|
|
139
|
+
* steering at speed drifts (see `DriftParams`). An analog `throttle` aims for that
|
|
140
|
+
* fraction of the top speed, and an analog `steer` turns by that fraction.
|
|
96
141
|
*/
|
|
97
142
|
export declare function stepCharacter(pose: CharacterPose, input: MoveInput, dt: number, scheme: ControlScheme, params: MotionParams, cameraRotation?: number, driftParams?: DriftParams | null): CharacterPose;
|
|
98
143
|
/** Ground height at a world point (world units; see `groundHeightService`). */
|
|
@@ -105,4 +150,113 @@ export type HeightAt = (x: number, y: number) => number;
|
|
|
105
150
|
* vehicle also loses its speed, as if it bumped the wall). The heading still turns.
|
|
106
151
|
*/
|
|
107
152
|
export declare function constrainToGround(prev: CharacterPose, next: CharacterPose, heightAt: HeightAt, maxStep: number): CharacterPose;
|
|
153
|
+
/**
|
|
154
|
+
* Jump tuning. The arc is set by its apex `height` and `timeToApex`; gravity and the
|
|
155
|
+
* take-off speed follow from them (see `jumpArc`).
|
|
156
|
+
*/
|
|
157
|
+
export interface JumpParams {
|
|
158
|
+
/** Apex of a jump from the ground, world units above the take-off point. */
|
|
159
|
+
height: number;
|
|
160
|
+
/** Seconds from take-off to the apex. */
|
|
161
|
+
timeToApex: number;
|
|
162
|
+
/** Gravity multiplier while falling (> 1 = floaty rise, snappy fall). */
|
|
163
|
+
fallGravity: number;
|
|
164
|
+
/** Releasing the key while rising scales the vertical speed by this (0 … 1): a short hop. */
|
|
165
|
+
releaseCut: number;
|
|
166
|
+
/** Seconds after walking off a ledge during which a jump still counts as from the ground. */
|
|
167
|
+
coyoteTime: number;
|
|
168
|
+
/** Seconds a press just before landing is remembered and jumps on touchdown. */
|
|
169
|
+
bufferTime: number;
|
|
170
|
+
/** Extra jumps in the air (0 = a single jump, 1 = a double jump …), reset on landing. */
|
|
171
|
+
airJumps: number;
|
|
172
|
+
/** An air jump's height as a fraction of `height` (its take-off speed is × √ratio). */
|
|
173
|
+
airJumpRatio: number;
|
|
174
|
+
/** Hovering while the key is held in a fall, or `null` = off. */
|
|
175
|
+
hover: HoverParams | null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Hover tuning. Once the air jumps are used up (or there are none), holding the jump key
|
|
179
|
+
* while falling fires a thrust and drains a gauge; an empty gauge falls normally. The
|
|
180
|
+
* gauge refills on the ground over `rechargeTime` (not instantly on landing).
|
|
181
|
+
*
|
|
182
|
+
* The thrust is a multiple of gravity (a thrust-to-weight ratio, so no mass is needed):
|
|
183
|
+
* below 1 the character still sinks, at 1 it keeps its vertical speed, above 1 it climbs
|
|
184
|
+
* for as long as the key is held. Sinking is capped at `fallSpeed`, climbing at
|
|
185
|
+
* `riseSpeed`.
|
|
186
|
+
*/
|
|
187
|
+
export interface HoverParams {
|
|
188
|
+
/** Seconds of hover a full gauge lasts. */
|
|
189
|
+
duration: number;
|
|
190
|
+
/** Fastest descent while hovering, world units / s (0 = never sink). */
|
|
191
|
+
fallSpeed: number;
|
|
192
|
+
/** Seconds on the ground to refill an empty gauge. */
|
|
193
|
+
rechargeTime: number;
|
|
194
|
+
/** Thrust as a multiple of gravity: < 1 sinks, 1 balances, > 1 climbs. */
|
|
195
|
+
thrust: number;
|
|
196
|
+
/** Fastest climb while hovering, world units / s. */
|
|
197
|
+
riseSpeed: number;
|
|
198
|
+
}
|
|
199
|
+
export declare const DEFAULT_HOVER: HoverParams;
|
|
200
|
+
export declare const DEFAULT_JUMP: JumpParams;
|
|
201
|
+
/** Gravity (world units / s²) and take-off speed (world units / s) of a jump. */
|
|
202
|
+
export declare function jumpArc(params: JumpParams): {
|
|
203
|
+
gravity: number;
|
|
204
|
+
speed: number;
|
|
205
|
+
};
|
|
206
|
+
/** Per-character jump bookkeeping that is not part of the visible pose. */
|
|
207
|
+
export interface JumpTimers {
|
|
208
|
+
/** Seconds since the character last stood on the ground. */
|
|
209
|
+
sinceGround: number;
|
|
210
|
+
/** Seconds since the jump key was last pressed (`Infinity` = no pending press). */
|
|
211
|
+
sincePress: number;
|
|
212
|
+
/** The current airtime started with a jump (not a fall), so coyote time is spent. */
|
|
213
|
+
jumped: boolean;
|
|
214
|
+
/** The rise has been cut short already (the key was released). */
|
|
215
|
+
cut: boolean;
|
|
216
|
+
/** Air jumps used since the character last stood on the ground. */
|
|
217
|
+
airJumpsUsed: number;
|
|
218
|
+
}
|
|
219
|
+
export declare const IDLE_JUMP: JumpTimers;
|
|
220
|
+
/**
|
|
221
|
+
* Advance the vertical motion by `dt` seconds, after the horizontal step put the
|
|
222
|
+
* character over ground of height `ground`.
|
|
223
|
+
*
|
|
224
|
+
* - On the ground, a step up (already limited to `maxStep` by `constrainToGround`) or a
|
|
225
|
+
* step down of at most `maxStep` keeps the feet on the ground; a bigger drop starts a
|
|
226
|
+
* fall instead of snapping down.
|
|
227
|
+
* - With `jump` tuning, a press (or one buffered for `bufferTime`) jumps from the ground
|
|
228
|
+
* or within `coyoteTime` of leaving it; releasing the key while rising cuts the jump.
|
|
229
|
+
* - A fresh press in the air uses one of the `airJumps` while any remain (`airJumpRatio`
|
|
230
|
+
* of the height); they come back on landing.
|
|
231
|
+
* - With `hover` tuning, once the air jumps are used up, holding the key while falling
|
|
232
|
+
* hovers: the thrust pushes against gravity (see `hoverSpeed`) while the gauge drains,
|
|
233
|
+
* and it keeps firing while the key stays held, also once it climbs; an empty gauge
|
|
234
|
+
* falls normally. On the ground the gauge refills over `rechargeTime`.
|
|
235
|
+
* - A `hopHeight` above 0 (a vehicle's drift hop) makes a drift-key press on the ground
|
|
236
|
+
* hop that high, under the same gravity.
|
|
237
|
+
* - In the air, gravity pulls the feet down (`fallGravity` × while falling) until they
|
|
238
|
+
* meet the ground. Without `jump` the default arc's gravity still drives falls.
|
|
239
|
+
*/
|
|
240
|
+
export declare function stepVertical(pose: CharacterPose, timers: JumpTimers, input: MoveInput, dt: number, ground: number, maxStep: number, jump: JumpParams | null, hopHeight?: number): {
|
|
241
|
+
pose: CharacterPose;
|
|
242
|
+
timers: JumpTimers;
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* The input for the horizontal step on a frame that may start a drift hop: the press
|
|
246
|
+
* that hops doesn't also start the drift (it would carry through the air), so the drift
|
|
247
|
+
* begins on landing if the key is still held and steering.
|
|
248
|
+
*/
|
|
249
|
+
export declare function holdDriftForHop(input: MoveInput, pose: CharacterPose, hopHeight: number): MoveInput;
|
|
250
|
+
/** An air jump's take-off speed: the same gravity reaches `ratio` × the height. */
|
|
251
|
+
export declare function airJumpSpeed(takeoffSpeed: number, ratio: number): number;
|
|
252
|
+
/**
|
|
253
|
+
* The vertical speed after `dt` seconds of hovering from `vz`: the thrust (× `gravity`)
|
|
254
|
+
* against gravity, so the speed changes by (thrust − 1) × gravity per second, kept
|
|
255
|
+
* between −`fallSpeed` (a faster fall is caught at once) and `riseSpeed`.
|
|
256
|
+
*/
|
|
257
|
+
export declare function hoverSpeed(vz: number, dt: number, gravity: number, hover: HoverParams): number;
|
|
258
|
+
/** The hover gauge after `dt` seconds of hovering (a full gauge lasts `duration`). */
|
|
259
|
+
export declare function drainHoverGauge(gauge: number, dt: number, hover: HoverParams): number;
|
|
260
|
+
/** The hover gauge after `dt` seconds on the ground (empty → full in `rechargeTime`). */
|
|
261
|
+
export declare function rechargeHoverGauge(gauge: number, dt: number, hover: HoverParams): number;
|
|
108
262
|
//# sourceMappingURL=character-physics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"character-physics.d.ts","sourceRoot":"","sources":["../src/character-physics.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,SAAS,CAAC;AAEtD,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"character-physics.d.ts","sourceRoot":"","sources":["../src/character-physics.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ export const NO_INPUT = {
|
|
|
8
8
|
left: false,
|
|
9
9
|
right: false,
|
|
10
10
|
drift: false,
|
|
11
|
+
jump: false,
|
|
12
|
+
jumpPressed: false,
|
|
11
13
|
};
|
|
12
14
|
/** A pose at rest at the origin, facing up. */
|
|
13
15
|
export const ORIGIN_POSE = {
|
|
@@ -19,6 +21,11 @@ export const ORIGIN_POSE = {
|
|
|
19
21
|
steering: 0,
|
|
20
22
|
slip: 0,
|
|
21
23
|
drift: 0,
|
|
24
|
+
z: 0,
|
|
25
|
+
vz: 0,
|
|
26
|
+
airborne: false,
|
|
27
|
+
hovering: false,
|
|
28
|
+
hoverGauge: 1,
|
|
22
29
|
};
|
|
23
30
|
export const DEFAULT_MOTION = {
|
|
24
31
|
moveSpeed: 400,
|
|
@@ -36,6 +43,8 @@ export const DEFAULT_DRIFT = {
|
|
|
36
43
|
slipAngle: 28,
|
|
37
44
|
steerSlipAngle: 8,
|
|
38
45
|
recoveryRate: 8,
|
|
46
|
+
hop: false,
|
|
47
|
+
hopHeight: 10,
|
|
39
48
|
};
|
|
40
49
|
/** Unit vector of a heading in world space (0° → (0, -1), 90° → (1, 0)). */
|
|
41
50
|
export function headingVector(deg) {
|
|
@@ -53,6 +62,20 @@ export function turnToward(from, to, maxStep) {
|
|
|
53
62
|
return wrapDeg(to);
|
|
54
63
|
return wrapDeg(from + Math.sign(d) * maxStep);
|
|
55
64
|
}
|
|
65
|
+
/** Clamp to -1 … 1; a missing or non-finite value counts as 0 (released). */
|
|
66
|
+
export const clampUnit = (v) => v !== undefined && Number.isFinite(v) ? Math.max(-1, Math.min(1, v)) : 0;
|
|
67
|
+
/** Forward / back of an input, -1 … 1: the analog `throttle` when set, else up − down. */
|
|
68
|
+
export function inputThrottle(input) {
|
|
69
|
+
if (input.throttle !== undefined)
|
|
70
|
+
return clampUnit(input.throttle);
|
|
71
|
+
return (input.up ? 1 : 0) - (input.down ? 1 : 0);
|
|
72
|
+
}
|
|
73
|
+
/** Left / right of an input, -1 … 1: the analog `steer` when set, else right − left. */
|
|
74
|
+
export function inputSteer(input) {
|
|
75
|
+
if (input.steer !== undefined)
|
|
76
|
+
return clampUnit(input.steer);
|
|
77
|
+
return (input.right ? 1 : 0) - (input.left ? 1 : 0);
|
|
78
|
+
}
|
|
56
79
|
function approach(v, target, step) {
|
|
57
80
|
if (v < target)
|
|
58
81
|
return Math.min(target, v + step);
|
|
@@ -64,51 +87,51 @@ function approach(v, target, step) {
|
|
|
64
87
|
* - `directional`: the held keys give a SCREEN-space direction (up = screen up),
|
|
65
88
|
* turned into world space through the camera rotation; the character moves that
|
|
66
89
|
* way at `moveSpeed` and its heading turns toward it at `turnRate`. (Turning
|
|
67
|
-
* rather than snapping keeps a heading-following camera from spinning.)
|
|
90
|
+
* rather than snapping keeps a heading-following camera from spinning.) An analog
|
|
91
|
+
* input (`steer` / `throttle`) moves at `moveSpeed` × its length (capped at 1).
|
|
68
92
|
* - `vehicle`: up/down are throttle/reverse along the heading, left/right steer.
|
|
69
93
|
* Steering authority scales with speed (a stopped car can't turn) and inverts
|
|
70
94
|
* when reversing, like a car. With `driftParams`, holding the drift key while
|
|
71
|
-
* steering at speed drifts (see `DriftParams`).
|
|
95
|
+
* steering at speed drifts (see `DriftParams`). An analog `throttle` aims for that
|
|
96
|
+
* fraction of the top speed, and an analog `steer` turns by that fraction.
|
|
72
97
|
*/
|
|
73
98
|
export function stepCharacter(pose, input, dt, scheme, params, cameraRotation = 0, driftParams = null) {
|
|
74
99
|
if (dt <= 0)
|
|
75
100
|
return pose;
|
|
76
101
|
if (scheme === "directional") {
|
|
77
|
-
const sx = (input
|
|
78
|
-
const sy =
|
|
102
|
+
const sx = inputSteer(input);
|
|
103
|
+
const sy = -inputThrottle(input);
|
|
79
104
|
if (sx === 0 && sy === 0) {
|
|
80
105
|
return pose.moving || pose.speed !== 0 ? { ...pose, speed: 0, moving: false } : pose;
|
|
81
106
|
}
|
|
82
107
|
// Screen direction → world direction: undo the camera rotation.
|
|
83
108
|
const target = wrapDeg(vectorHeading(sx, sy) - cameraRotation);
|
|
84
109
|
const dir = headingVector(target);
|
|
85
|
-
|
|
110
|
+
// Keys are always full speed (diagonals normalized); an analog stick scales it.
|
|
111
|
+
const moveSpeed = params.moveSpeed * Math.min(1, Math.hypot(sx, sy));
|
|
112
|
+
const dist = moveSpeed * dt;
|
|
86
113
|
return {
|
|
87
114
|
x: pose.x + dir.x * dist,
|
|
88
115
|
y: pose.y + dir.y * dist,
|
|
89
116
|
heading: turnToward(pose.heading, target, params.turnRate * dt),
|
|
90
|
-
speed:
|
|
117
|
+
speed: moveSpeed,
|
|
91
118
|
moving: true,
|
|
92
119
|
steering: 0,
|
|
93
120
|
slip: 0,
|
|
94
121
|
drift: 0,
|
|
122
|
+
z: pose.z,
|
|
123
|
+
vz: pose.vz,
|
|
124
|
+
airborne: pose.airborne,
|
|
125
|
+
hovering: pose.hovering,
|
|
126
|
+
hoverGauge: pose.hoverGauge,
|
|
95
127
|
};
|
|
96
128
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
else if (throttle < 0) {
|
|
105
|
-
const accel = speed > 0 ? params.acceleration + params.friction : params.acceleration;
|
|
106
|
-
speed = approach(speed, -params.moveSpeed * params.reverseRatio, accel * dt);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
speed = approach(speed, 0, params.friction * dt);
|
|
110
|
-
}
|
|
111
|
-
const steering = (input.right ? 1 : 0) - (input.left ? 1 : 0);
|
|
129
|
+
// In the air a car keeps its momentum: no throttle, brakes or steering until it lands.
|
|
130
|
+
const grounded = !pose.airborne;
|
|
131
|
+
const speed = grounded
|
|
132
|
+
? throttledSpeed(pose.speed, inputThrottle(input), dt, params)
|
|
133
|
+
: pose.speed;
|
|
134
|
+
const steering = grounded ? inputSteer(input) : 0;
|
|
112
135
|
const drift = nextDrift(pose.drift, input.drift === true, steering, speed, params, driftParams);
|
|
113
136
|
let turn;
|
|
114
137
|
if (drift !== 0 && driftParams) {
|
|
@@ -138,6 +161,11 @@ export function stepCharacter(pose, input, dt, scheme, params, cameraRotation =
|
|
|
138
161
|
steering,
|
|
139
162
|
slip,
|
|
140
163
|
drift,
|
|
164
|
+
z: pose.z,
|
|
165
|
+
vz: pose.vz,
|
|
166
|
+
airborne: pose.airborne,
|
|
167
|
+
hovering: pose.hovering,
|
|
168
|
+
hoverGauge: pose.hoverGauge,
|
|
141
169
|
};
|
|
142
170
|
}
|
|
143
171
|
/**
|
|
@@ -150,7 +178,10 @@ export function stepCharacter(pose, input, dt, scheme, params, cameraRotation =
|
|
|
150
178
|
export function constrainToGround(prev, next, heightAt, maxStep) {
|
|
151
179
|
if (next.x === prev.x && next.y === prev.y)
|
|
152
180
|
return next;
|
|
153
|
-
|
|
181
|
+
// Measured from the feet: on the ground that is the ground itself, in the air it is
|
|
182
|
+
// higher, so a jump clears cliffs the step alone can't.
|
|
183
|
+
const feet = Math.max(heightAt(prev.x, prev.y), prev.z ?? 0);
|
|
184
|
+
const limit = feet + Math.max(0, maxStep);
|
|
154
185
|
const ok = (x, y) => heightAt(x, y) <= limit;
|
|
155
186
|
if (ok(next.x, next.y))
|
|
156
187
|
return next;
|
|
@@ -160,6 +191,223 @@ export function constrainToGround(prev, next, heightAt, maxStep) {
|
|
|
160
191
|
return { ...next, x: prev.x };
|
|
161
192
|
return { ...next, x: prev.x, y: prev.y, speed: 0, moving: false };
|
|
162
193
|
}
|
|
194
|
+
export const DEFAULT_HOVER = {
|
|
195
|
+
duration: 1.5,
|
|
196
|
+
fallSpeed: 15,
|
|
197
|
+
rechargeTime: 0.8,
|
|
198
|
+
thrust: 0,
|
|
199
|
+
riseSpeed: 60,
|
|
200
|
+
};
|
|
201
|
+
export const DEFAULT_JUMP = {
|
|
202
|
+
height: 40,
|
|
203
|
+
timeToApex: 0.32,
|
|
204
|
+
fallGravity: 1.5,
|
|
205
|
+
releaseCut: 0.5,
|
|
206
|
+
coyoteTime: 0.1,
|
|
207
|
+
bufferTime: 0.1,
|
|
208
|
+
airJumps: 0,
|
|
209
|
+
airJumpRatio: 0.8,
|
|
210
|
+
hover: null,
|
|
211
|
+
};
|
|
212
|
+
/** Gravity (world units / s²) and take-off speed (world units / s) of a jump. */
|
|
213
|
+
export function jumpArc(params) {
|
|
214
|
+
const t = Math.max(0.01, params.timeToApex);
|
|
215
|
+
return { gravity: (2 * params.height) / (t * t), speed: (2 * params.height) / t };
|
|
216
|
+
}
|
|
217
|
+
export const IDLE_JUMP = {
|
|
218
|
+
sinceGround: 0,
|
|
219
|
+
sincePress: Number.POSITIVE_INFINITY,
|
|
220
|
+
jumped: false,
|
|
221
|
+
cut: false,
|
|
222
|
+
airJumpsUsed: 0,
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Advance the vertical motion by `dt` seconds, after the horizontal step put the
|
|
226
|
+
* character over ground of height `ground`.
|
|
227
|
+
*
|
|
228
|
+
* - On the ground, a step up (already limited to `maxStep` by `constrainToGround`) or a
|
|
229
|
+
* step down of at most `maxStep` keeps the feet on the ground; a bigger drop starts a
|
|
230
|
+
* fall instead of snapping down.
|
|
231
|
+
* - With `jump` tuning, a press (or one buffered for `bufferTime`) jumps from the ground
|
|
232
|
+
* or within `coyoteTime` of leaving it; releasing the key while rising cuts the jump.
|
|
233
|
+
* - A fresh press in the air uses one of the `airJumps` while any remain (`airJumpRatio`
|
|
234
|
+
* of the height); they come back on landing.
|
|
235
|
+
* - With `hover` tuning, once the air jumps are used up, holding the key while falling
|
|
236
|
+
* hovers: the thrust pushes against gravity (see `hoverSpeed`) while the gauge drains,
|
|
237
|
+
* and it keeps firing while the key stays held, also once it climbs; an empty gauge
|
|
238
|
+
* falls normally. On the ground the gauge refills over `rechargeTime`.
|
|
239
|
+
* - A `hopHeight` above 0 (a vehicle's drift hop) makes a drift-key press on the ground
|
|
240
|
+
* hop that high, under the same gravity.
|
|
241
|
+
* - In the air, gravity pulls the feet down (`fallGravity` × while falling) until they
|
|
242
|
+
* meet the ground. Without `jump` the default arc's gravity still drives falls.
|
|
243
|
+
*/
|
|
244
|
+
export function stepVertical(pose, timers, input, dt, ground, maxStep, jump, hopHeight = 0) {
|
|
245
|
+
if (dt <= 0)
|
|
246
|
+
return { pose, timers };
|
|
247
|
+
let { z, vz, airborne, hoverGauge } = pose;
|
|
248
|
+
let hovering = false;
|
|
249
|
+
let { sinceGround, sincePress, jumped, cut, airJumpsUsed } = timers;
|
|
250
|
+
if (!airborne) {
|
|
251
|
+
if (z - ground > Math.max(0, maxStep)) {
|
|
252
|
+
airborne = true; // walked off a cliff: fall
|
|
253
|
+
vz = 0;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
z = ground;
|
|
257
|
+
jumped = false; // e.g. teleported mid-jump
|
|
258
|
+
cut = false;
|
|
259
|
+
airJumpsUsed = 0;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else if (z < ground) {
|
|
263
|
+
z = ground; // reached a ledge within the step mid-air: stand on its edge
|
|
264
|
+
}
|
|
265
|
+
sinceGround = airborne ? sinceGround + dt : 0;
|
|
266
|
+
const arc = jumpArc(jump ?? DEFAULT_JUMP);
|
|
267
|
+
if (hopHeight > 0 && input.driftPressed && !airborne) {
|
|
268
|
+
// A drift hop: spends the ground jump (no coyote jump after it), never cut short.
|
|
269
|
+
airborne = true;
|
|
270
|
+
vz = Math.sqrt(2 * arc.gravity * hopHeight);
|
|
271
|
+
jumped = true;
|
|
272
|
+
cut = true;
|
|
273
|
+
}
|
|
274
|
+
const hover = jump?.hover ?? null;
|
|
275
|
+
if (jump) {
|
|
276
|
+
sincePress = input.jumpPressed ? 0 : sincePress + dt;
|
|
277
|
+
const fromGround = !airborne || (!jumped && sinceGround <= jump.coyoteTime);
|
|
278
|
+
if (sincePress <= jump.bufferTime && fromGround) {
|
|
279
|
+
airborne = true;
|
|
280
|
+
vz = arc.speed;
|
|
281
|
+
jumped = true;
|
|
282
|
+
cut = false;
|
|
283
|
+
sincePress = Number.POSITIVE_INFINITY;
|
|
284
|
+
}
|
|
285
|
+
else if (input.jumpPressed && airborne && airJumpsUsed < Math.max(0, jump.airJumps)) {
|
|
286
|
+
vz = airJumpSpeed(arc.speed, jump.airJumpRatio);
|
|
287
|
+
airJumpsUsed++;
|
|
288
|
+
jumped = true;
|
|
289
|
+
cut = false;
|
|
290
|
+
sincePress = Number.POSITIVE_INFINITY;
|
|
291
|
+
}
|
|
292
|
+
else if (jumped && !cut && vz > 0 && !input.jump) {
|
|
293
|
+
vz *= Math.min(1, Math.max(0, jump.releaseCut));
|
|
294
|
+
cut = true;
|
|
295
|
+
}
|
|
296
|
+
// Hover: the air jumps used up, the key held, falling (or already hovering: a thrust
|
|
297
|
+
// above gravity climbs), and gauge left.
|
|
298
|
+
hovering =
|
|
299
|
+
hover !== null &&
|
|
300
|
+
airborne &&
|
|
301
|
+
airJumpsUsed >= Math.max(0, jump.airJumps) &&
|
|
302
|
+
input.jump === true &&
|
|
303
|
+
(vz <= 0 || pose.hovering) &&
|
|
304
|
+
hoverGauge > 0;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
sincePress = Number.POSITIVE_INFINITY;
|
|
308
|
+
}
|
|
309
|
+
if (hovering && hover) {
|
|
310
|
+
vz = hoverSpeed(vz, dt, arc.gravity, hover);
|
|
311
|
+
z += vz * dt;
|
|
312
|
+
hoverGauge = drainHoverGauge(hoverGauge, dt, hover);
|
|
313
|
+
}
|
|
314
|
+
else if (airborne) {
|
|
315
|
+
const gravity = vz > 0 ? arc.gravity : arc.gravity * (jump ?? DEFAULT_JUMP).fallGravity;
|
|
316
|
+
vz -= gravity * dt;
|
|
317
|
+
z += vz * dt;
|
|
318
|
+
}
|
|
319
|
+
if (airborne && z <= ground) {
|
|
320
|
+
z = ground;
|
|
321
|
+
vz = 0;
|
|
322
|
+
airborne = false;
|
|
323
|
+
hovering = false;
|
|
324
|
+
jumped = false;
|
|
325
|
+
cut = false;
|
|
326
|
+
airJumpsUsed = 0;
|
|
327
|
+
sinceGround = 0;
|
|
328
|
+
}
|
|
329
|
+
// The gauge refills only on the ground; with hover off it stays full.
|
|
330
|
+
if (!hover)
|
|
331
|
+
hoverGauge = 1;
|
|
332
|
+
else if (!airborne)
|
|
333
|
+
hoverGauge = rechargeHoverGauge(hoverGauge, dt, hover);
|
|
334
|
+
const nextTimers = sinceGround === timers.sinceGround &&
|
|
335
|
+
sincePress === timers.sincePress &&
|
|
336
|
+
jumped === timers.jumped &&
|
|
337
|
+
cut === timers.cut &&
|
|
338
|
+
airJumpsUsed === timers.airJumpsUsed
|
|
339
|
+
? timers
|
|
340
|
+
: { sinceGround, sincePress, jumped, cut, airJumpsUsed };
|
|
341
|
+
const nextPose = z === pose.z &&
|
|
342
|
+
vz === pose.vz &&
|
|
343
|
+
airborne === pose.airborne &&
|
|
344
|
+
hovering === pose.hovering &&
|
|
345
|
+
hoverGauge === pose.hoverGauge
|
|
346
|
+
? pose
|
|
347
|
+
: { ...pose, z, vz, airborne, hovering, hoverGauge };
|
|
348
|
+
return { pose: nextPose, timers: nextTimers };
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* The input for the horizontal step on a frame that may start a drift hop: the press
|
|
352
|
+
* that hops doesn't also start the drift (it would carry through the air), so the drift
|
|
353
|
+
* begins on landing if the key is still held and steering.
|
|
354
|
+
*/
|
|
355
|
+
export function holdDriftForHop(input, pose, hopHeight) {
|
|
356
|
+
return hopHeight > 0 && input.driftPressed && !pose.airborne && input.drift
|
|
357
|
+
? { ...input, drift: false }
|
|
358
|
+
: input;
|
|
359
|
+
}
|
|
360
|
+
/** An air jump's take-off speed: the same gravity reaches `ratio` × the height. */
|
|
361
|
+
export function airJumpSpeed(takeoffSpeed, ratio) {
|
|
362
|
+
return takeoffSpeed * Math.sqrt(Math.max(0, Number.isFinite(ratio) ? ratio : 0));
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* The vertical speed after `dt` seconds of hovering from `vz`: the thrust (× `gravity`)
|
|
366
|
+
* against gravity, so the speed changes by (thrust − 1) × gravity per second, kept
|
|
367
|
+
* between −`fallSpeed` (a faster fall is caught at once) and `riseSpeed`.
|
|
368
|
+
*/
|
|
369
|
+
export function hoverSpeed(vz, dt, gravity, hover) {
|
|
370
|
+
const thrust = Number.isFinite(hover.thrust) ? Math.max(0, hover.thrust) : 0;
|
|
371
|
+
const next = vz + (thrust - 1) * gravity * dt;
|
|
372
|
+
return Math.min(Math.max(0, hover.riseSpeed), Math.max(-Math.max(0, hover.fallSpeed), next));
|
|
373
|
+
}
|
|
374
|
+
/** The hover gauge after `dt` seconds of hovering (a full gauge lasts `duration`). */
|
|
375
|
+
export function drainHoverGauge(gauge, dt, hover) {
|
|
376
|
+
if (!(hover.duration > 0))
|
|
377
|
+
return 0;
|
|
378
|
+
return Math.max(0, gauge - dt / hover.duration);
|
|
379
|
+
}
|
|
380
|
+
/** The hover gauge after `dt` seconds on the ground (empty → full in `rechargeTime`). */
|
|
381
|
+
export function rechargeHoverGauge(gauge, dt, hover) {
|
|
382
|
+
if (!(hover.rechargeTime > 0))
|
|
383
|
+
return 1;
|
|
384
|
+
return Math.min(1, gauge + dt / hover.rechargeTime);
|
|
385
|
+
}
|
|
386
|
+
/** Vehicle speed after a step of throttle (1), reverse (-1) or coasting (0). */
|
|
387
|
+
function throttledSpeed(speed, throttle, dt, params) {
|
|
388
|
+
if (throttle > 0) {
|
|
389
|
+
// Partial (analog) throttle aims for that fraction of the top speed; easing off
|
|
390
|
+
// above it slows down like coasting. Braking from reverse uses friction + throttle
|
|
391
|
+
// for a snappier stop.
|
|
392
|
+
const target = params.moveSpeed * throttle;
|
|
393
|
+
let accel = params.acceleration;
|
|
394
|
+
if (speed < 0)
|
|
395
|
+
accel = params.acceleration + params.friction;
|
|
396
|
+
else if (speed > target && throttle < 1)
|
|
397
|
+
accel = params.friction;
|
|
398
|
+
return approach(speed, target, accel * dt);
|
|
399
|
+
}
|
|
400
|
+
if (throttle < 0) {
|
|
401
|
+
const target = params.moveSpeed * params.reverseRatio * throttle;
|
|
402
|
+
let accel = params.acceleration;
|
|
403
|
+
if (speed > 0)
|
|
404
|
+
accel = params.acceleration + params.friction;
|
|
405
|
+
else if (speed < target && throttle > -1)
|
|
406
|
+
accel = params.friction;
|
|
407
|
+
return approach(speed, target, accel * dt);
|
|
408
|
+
}
|
|
409
|
+
return approach(speed, 0, params.friction * dt);
|
|
410
|
+
}
|
|
163
411
|
function nextDrift(current, held, steering, speed, params, driftParams) {
|
|
164
412
|
// Drifts only run forward: a stopped car never spins in place, whatever the tuning.
|
|
165
413
|
if (!driftParams || !held || speed <= 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"character-physics.js","sourceRoot":"","sources":["../src/character-physics.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"character-physics.js","sourceRoot":"","sources":["../src/character-physics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { type PluginContext, type Point } from "@edv4h/usketch-shared";
|
|
2
|
-
import type
|
|
2
|
+
import { type CharacterStore } from "./character-store.js";
|
|
3
3
|
import { type CharacterAwareness } from "./character-sync.js";
|
|
4
4
|
import type { CharacterKeys } from "./character-types.js";
|
|
5
|
+
import { type VirtualInput } from "./character-virtual-input.js";
|
|
5
6
|
export declare const CHARACTER_LAYER_ID = "character";
|
|
6
7
|
/** `viewport:claimed` priority: above start-position (10), below deep links (100). */
|
|
7
8
|
export declare const CHARACTER_VIEWPORT_PRIORITY = 20;
|
|
@@ -23,7 +24,13 @@ export interface CharacterRuntime {
|
|
|
23
24
|
placeAtAnchor(): void;
|
|
24
25
|
/** The screen-px anchor (for rotating the camera about the character's spot). */
|
|
25
26
|
anchorPoint(): Point;
|
|
27
|
+
/** Jump on the next frame, as a full (held) jump. No-op while jumping is off. */
|
|
28
|
+
jump(): void;
|
|
26
29
|
setKeys(keys: CharacterKeys): void;
|
|
30
|
+
getKeys(): CharacterKeys;
|
|
31
|
+
/** Feed analog input from a host control (touch stick …); `null` releases it. */
|
|
32
|
+
setVirtualInput(input: Partial<VirtualInput> | null): void;
|
|
33
|
+
getVirtualInput(): VirtualInput | null;
|
|
27
34
|
dispose(): void;
|
|
28
35
|
}
|
|
29
36
|
export declare function setupCharacterRuntime(ctx: PluginContext, store: CharacterStore, options: CharacterRuntimeOptions): CharacterRuntime;
|