@cyclonium/physics-2d 0.0.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/lib/body-collider-link.d.ts +32 -0
  2. package/lib/body-collider-link.js +164 -0
  3. package/lib/character-controller-2d.d.ts +69 -0
  4. package/lib/character-controller-2d.js +399 -0
  5. package/lib/collider-2d.d.ts +81 -0
  6. package/lib/collider-2d.js +364 -0
  7. package/lib/colliders/box-collider-2d.d.ts +20 -0
  8. package/lib/colliders/box-collider-2d.js +84 -0
  9. package/lib/colliders/capsule-collider-2d.d.ts +17 -0
  10. package/lib/colliders/capsule-collider-2d.js +78 -0
  11. package/lib/colliders/circle-collider-2d.d.ts +14 -0
  12. package/lib/colliders/circle-collider-2d.js +59 -0
  13. package/lib/colliders/polygon-collider-2d.d.ts +17 -0
  14. package/lib/colliders/polygon-collider-2d.js +77 -0
  15. package/lib/collision-matrix.d.ts +12 -0
  16. package/lib/collision-matrix.js +70 -0
  17. package/lib/contact.d.ts +7 -0
  18. package/lib/contact.js +2 -0
  19. package/lib/exchange.d.ts +5 -0
  20. package/lib/exchange.js +23 -0
  21. package/lib/gizmo-headless.d.ts +7 -0
  22. package/lib/gizmo-headless.js +7 -0
  23. package/lib/gizmo.d.ts +13 -0
  24. package/lib/gizmo.js +122 -0
  25. package/lib/index.d.ts +20 -0
  26. package/lib/index.js +20 -0
  27. package/lib/physics-2d-debugger-headless.d.ts +6 -0
  28. package/lib/physics-2d-debugger-headless.js +9 -0
  29. package/lib/physics-2d-debugger.d.ts +11 -0
  30. package/lib/physics-2d-debugger.js +146 -0
  31. package/lib/physics-2d-settings.d.ts +13 -0
  32. package/lib/physics-2d-settings.js +53 -0
  33. package/lib/physics-component-2d-base.d.ts +22 -0
  34. package/lib/physics-component-2d-base.js +85 -0
  35. package/lib/physics-world-2d-scene-component.d.ts +20 -0
  36. package/lib/physics-world-2d-scene-component.js +107 -0
  37. package/lib/physics-world-2d.d.ts +103 -0
  38. package/lib/physics-world-2d.js +506 -0
  39. package/lib/physics-world-registry.d.ts +6 -0
  40. package/lib/physics-world-registry.js +26 -0
  41. package/lib/px2-impl.d.ts +4 -0
  42. package/lib/px2-impl.js +18 -0
  43. package/lib/rigid-body-2d.d.ts +72 -0
  44. package/lib/rigid-body-2d.js +391 -0
  45. package/lib/scene-query-probe-2d.d.ts +102 -0
  46. package/lib/scene-query-probe-2d.js +223 -0
  47. package/lib/scene-query-probes/box-scene-query-probe-2d.d.ts +21 -0
  48. package/lib/scene-query-probes/box-scene-query-probe-2d.js +62 -0
  49. package/lib/scene-query-probes/capsule-scene-query-probe-2d.d.ts +27 -0
  50. package/lib/scene-query-probes/capsule-scene-query-probe-2d.js +96 -0
  51. package/lib/scene-query-probes/circle-scene-query-probe-2d.d.ts +20 -0
  52. package/lib/scene-query-probes/circle-scene-query-probe-2d.js +64 -0
  53. package/lib/scene-query.d.ts +67 -0
  54. package/lib/scene-query.js +128 -0
  55. package/lib/shared.d.ts +9 -0
  56. package/lib/shared.js +42 -0
  57. package/lib/utils/3-to-2.d.ts +3 -0
  58. package/lib/utils/3-to-2.js +12 -0
  59. package/lib/wasm-binary-helper/index.d.ts +6 -0
  60. package/lib/wasm-binary-helper/index.js +14 -0
  61. package/lib/wasm-binary-helper/wasm-binary-id.d.ts +2 -0
  62. package/lib/wasm-binary-helper/wasm-binary-id.js +2 -0
  63. package/lib/wasm-binary-helper.d.ts +6 -0
  64. package/lib/wasm-binary-helper.js +6 -0
  65. package/package.json +50 -0
@@ -0,0 +1,32 @@
1
+ import { RigidBody2D } from './rigid-body-2d.js';
2
+ import { Collider2D } from './collider-2d.js';
3
+ export declare class BodyColliderLink {
4
+ constructor(rigidBody: RigidBody2D);
5
+ get rigidBody(): RigidBody2D;
6
+ get colliders(): Collider2D[];
7
+ disband(): void;
8
+ linkCollider(collider: Collider2D): void;
9
+ removeCollider(collider: Collider2D): boolean;
10
+ enableCollisionEventsFromBody(value: boolean): void;
11
+ setBodyActiveCollisionTypes(value: number): void;
12
+ setBodyCollisionGroups(value: number): void;
13
+ setBodySolverGroups(value: number): void;
14
+ private _rigidBody;
15
+ private _colliders;
16
+ private _isBodyRequiresCollisionEvents;
17
+ private _bodyActiveCollisionTypes;
18
+ private _bodyCollisionGroups;
19
+ private _bodySolverGroups;
20
+ }
21
+ export declare class BodyColliderLinkManager {
22
+ getLinkedRigidBody(collider: Collider2D): BodyColliderLink | null;
23
+ joinRigidBody(rigidBody: RigidBody2D): BodyColliderLink;
24
+ removeRigidBody(rigidBody: RigidBody2D): boolean;
25
+ joinCollider(collider: Collider2D): void;
26
+ removeCollider(collider: Collider2D): boolean;
27
+ private _colliderLinks;
28
+ private _rigidBodyLinks;
29
+ private _findRigidBodyToAttach;
30
+ private _findBelongingColliders;
31
+ }
32
+ //# sourceMappingURL=body-collider-link.d.ts.map
@@ -0,0 +1,164 @@
1
+ import { Scene } from 'cc';
2
+ import { RigidBody2D } from './rigid-body-2d.js';
3
+ import { Collider2D } from './collider-2d.js';
4
+ import { logger } from '@cyclonium/core/log';
5
+ export class BodyColliderLink {
6
+ constructor(rigidBody) {
7
+ this._rigidBody = rigidBody;
8
+ }
9
+ get rigidBody() {
10
+ return this._rigidBody;
11
+ }
12
+ get colliders() {
13
+ return this._colliders;
14
+ }
15
+ disband() {
16
+ for (const collider of this._colliders) {
17
+ collider._enableCollisionEventsSinceBody(false);
18
+ collider._responseToBodyCollisionGroups(0);
19
+ collider._responseToBodySolverGroups(0);
20
+ collider._responseToBodyActiveCollisionTypes(0);
21
+ }
22
+ this._colliders.length = 0;
23
+ }
24
+ linkCollider(collider) {
25
+ if (this._colliders.indexOf(collider) >= 0) {
26
+ throw new Error(`Collider ${collider.name} already joined to body ${this._rigidBody?.name}.`);
27
+ }
28
+ this._colliders.push(collider);
29
+ if (this._isBodyRequiresCollisionEvents) {
30
+ collider._enableCollisionEventsSinceBody(true);
31
+ }
32
+ collider._responseToBodyCollisionGroups(this._bodyCollisionGroups);
33
+ collider._responseToBodySolverGroups(this._bodySolverGroups);
34
+ collider._responseToBodyActiveCollisionTypes(this._bodyActiveCollisionTypes);
35
+ }
36
+ removeCollider(collider) {
37
+ const index = this._colliders.indexOf(collider);
38
+ if (index >= 0) {
39
+ this._colliders.splice(index, 1);
40
+ return true;
41
+ }
42
+ return false;
43
+ }
44
+ enableCollisionEventsFromBody(value) {
45
+ this._isBodyRequiresCollisionEvents = value;
46
+ for (const collider of this._colliders) {
47
+ collider._enableCollisionEventsSinceBody(value);
48
+ }
49
+ }
50
+ setBodyActiveCollisionTypes(value) {
51
+ this._bodyActiveCollisionTypes = value;
52
+ for (const collider of this._colliders) {
53
+ collider._responseToBodyActiveCollisionTypes(value);
54
+ }
55
+ }
56
+ setBodyCollisionGroups(value) {
57
+ this._bodyCollisionGroups = value;
58
+ for (const collider of this._colliders) {
59
+ collider._responseToBodyCollisionGroups(value);
60
+ }
61
+ }
62
+ setBodySolverGroups(value) {
63
+ this._bodySolverGroups = value;
64
+ for (const collider of this._colliders) {
65
+ collider._responseToBodySolverGroups(value);
66
+ }
67
+ }
68
+ _rigidBody;
69
+ _colliders = [];
70
+ _isBodyRequiresCollisionEvents = false;
71
+ _bodyActiveCollisionTypes = 0;
72
+ _bodyCollisionGroups = 0;
73
+ _bodySolverGroups = 0;
74
+ }
75
+ export class BodyColliderLinkManager {
76
+ getLinkedRigidBody(collider) {
77
+ return this._colliderLinks.get(collider) ?? null;
78
+ }
79
+ joinRigidBody(rigidBody) {
80
+ if (rigidBody.node.getComponents(RigidBody2D).length > 1) {
81
+ throw new Error(`RigidBody is not unique in node ${rigidBody.node.name}.`);
82
+ }
83
+ if (this._rigidBodyLinks.has(rigidBody)) {
84
+ throw new Error(`RigidBody ${rigidBody.name} already joined.`);
85
+ }
86
+ const link = new BodyColliderLink(rigidBody);
87
+ this._rigidBodyLinks.set(rigidBody, link);
88
+ for (const collider of this._findBelongingColliders(rigidBody)) {
89
+ const oldLink = this._colliderLinks.get(collider);
90
+ if (oldLink === undefined) {
91
+ // Never joined.
92
+ continue;
93
+ }
94
+ if (oldLink) {
95
+ logger.warn(`Note: relinking collider ${collider.name} to body ${rigidBody.name}(previous: ${oldLink.rigidBody.name}).`);
96
+ oldLink.removeCollider(collider);
97
+ }
98
+ link.linkCollider(collider);
99
+ this._colliderLinks.set(collider, link);
100
+ }
101
+ return link;
102
+ }
103
+ removeRigidBody(rigidBody) {
104
+ const link = this._rigidBodyLinks.get(rigidBody);
105
+ if (!link) {
106
+ return false;
107
+ }
108
+ // TODO: should relink colliders to another body?
109
+ for (const collider of link.colliders) {
110
+ this._colliderLinks.set(collider, null);
111
+ }
112
+ link.disband();
113
+ this._rigidBodyLinks.delete(rigidBody);
114
+ return true;
115
+ }
116
+ joinCollider(collider) {
117
+ const attachedRigidBody = this._findRigidBodyToAttach(collider);
118
+ const bodyLink = attachedRigidBody
119
+ ? this._rigidBodyLinks.get(attachedRigidBody) ?? null
120
+ : null;
121
+ if (bodyLink) {
122
+ bodyLink.linkCollider(collider);
123
+ }
124
+ this._colliderLinks.set(collider, bodyLink);
125
+ }
126
+ removeCollider(collider) {
127
+ const bodyLink = this._colliderLinks.get(collider);
128
+ if (bodyLink === undefined) {
129
+ // Never joined.
130
+ return false;
131
+ }
132
+ if (!bodyLink) {
133
+ // Joined, but not linked to a rigid body.
134
+ return true;
135
+ }
136
+ const success = bodyLink.removeCollider(collider);
137
+ return success;
138
+ }
139
+ _colliderLinks = new Map();
140
+ _rigidBodyLinks = new Map();
141
+ _findRigidBodyToAttach(collider) {
142
+ for (let current = collider.node; current && !(current instanceof Scene); current = current.parent) {
143
+ const rigidBody = RigidBody2D.ofOrNull(current);
144
+ if (rigidBody) {
145
+ return rigidBody;
146
+ }
147
+ }
148
+ return null;
149
+ }
150
+ *_findBelongingColliders(rigidBody) {
151
+ yield* lsNode(rigidBody.node);
152
+ function* lsNode(node) {
153
+ const colliders = node.getComponents(Collider2D);
154
+ yield* colliders;
155
+ for (const child of node.children) {
156
+ if (RigidBody2D.ofOrNull(child)) {
157
+ continue;
158
+ }
159
+ yield* lsNode(child);
160
+ }
161
+ }
162
+ }
163
+ }
164
+ //# sourceMappingURL=body-collider-link.js.map
@@ -0,0 +1,69 @@
1
+ import { Vec2 } from '@cyclonium/core/math/vec2';
2
+ import { px2Impl } from './px2-impl.js';
3
+ import { PhysicsComponent2DBase } from './physics-component-2d-base.js';
4
+ import type { PhysicsWorld2D } from './physics-world-2d.js';
5
+ import { Collider2D } from './collider-2d.js';
6
+ export declare class KinematicCharacterController2D extends PhysicsComponent2DBase {
7
+ get skinWidth(): number;
8
+ set skinWidth(value: number);
9
+ get up(): Vec2;
10
+ set up(value: Vec2);
11
+ get slideEnabled(): boolean;
12
+ set slideEnabled(value: boolean);
13
+ get minSlopeSlideAngle(): number;
14
+ set minSlopeSlideAngle(value: number);
15
+ get maxSlopeClimbAngle(): number;
16
+ set maxSlopeClimbAngle(value: number);
17
+ get autoStepEnabled(): boolean;
18
+ set autoStepEnabled(value: boolean);
19
+ get autoStepMaxHeight(): number;
20
+ set autoStepMaxHeight(value: number);
21
+ get autoStepMinWidth(): number;
22
+ set autoStepMinWidth(value: number);
23
+ get autoStepIncludeDynamicBodies(): boolean;
24
+ set autoStepIncludeDynamicBodies(value: boolean);
25
+ get snapToGroundEnabled(): boolean;
26
+ set snapToGroundEnabled(value: boolean);
27
+ get snapToGroundDistance(): number;
28
+ set snapToGroundDistance(value: number);
29
+ get applyImpulsesToDynamicBodies(): boolean;
30
+ set applyImpulsesToDynamicBodies(value: boolean);
31
+ get lastMovement(): Vec2;
32
+ get grounded(): boolean;
33
+ get listenersOnCollisionBegin(): import("@cyclonium/event").EventListenerRegistry<[CharacterCollision]>;
34
+ get listenersOnCollisionStay(): import("@cyclonium/event").EventListenerRegistry<[CharacterCollision]>;
35
+ get listenersOnCollisionEnd(): import("@cyclonium/event").EventListenerRegistry<[CharacterCollision]>;
36
+ get impl(): px2Impl.KinematicCharacterController | undefined;
37
+ move(desiredMovement: Vec2, deltaTime: number): void;
38
+ protected onDestroy(): void;
39
+ protected onAttachToWorld(world: PhysicsWorld2D): void;
40
+ protected onDetachFromWorld(world: PhysicsWorld2D): void;
41
+ protected onAfterPhysicsStep(): void;
42
+ private _impl;
43
+ private _skinWidth;
44
+ private _up;
45
+ private _slideEnabled;
46
+ private _minSlopeSlideAngle;
47
+ private _maxSlopeClimbAngle;
48
+ private _autoStepEnabled;
49
+ private _autoStepMaxHeight;
50
+ private _autoStepMinWidth;
51
+ private _autoStepIncludeDynamicBodies;
52
+ private _snapToGroundEnabled;
53
+ private _snapToGroundDistance;
54
+ private _applyImpulsesToDynamicBodies;
55
+ private _lastMovement;
56
+ private _collisionRecords;
57
+ private _emitterOnCollisionBegin;
58
+ private _emitterOnCollisionStay;
59
+ private _emitterOnCollisionEnd;
60
+ private _updateSlideEnabled;
61
+ private _updateAutoStepParams;
62
+ private _updateSnapToGroundParams;
63
+ private _destroyImpl;
64
+ private _emitCharacterCollisionEvents;
65
+ }
66
+ export interface CharacterCollision {
67
+ collider: Collider2D;
68
+ }
69
+ //# sourceMappingURL=character-controller-2d.d.ts.map
@@ -0,0 +1,399 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { editable, idem, idemBy, serializable } from '@cyclonium/core/legacy-decorator';
8
+ import { Vec2 } from '@cyclonium/core/math/vec2';
9
+ import { fromPx2ImplVec2, toPx2ImplVec2 } from './exchange.js';
10
+ import { px2Impl } from './px2-impl.js';
11
+ import { PhysicsComponent2DBase } from './physics-component-2d-base.js';
12
+ import { cycloBuiltinClass } from '@cyclonium/core/internal';
13
+ import { assert } from '@cyclonium/core/utils';
14
+ import { Collider2D } from './collider-2d.js';
15
+ import { RigidBody2DType } from './rigid-body-2d.js';
16
+ import { Transform2DComponent } from '@cyclonium/core/2d';
17
+ import { toRadians } from '@cyclonium/core/math/trigonometry';
18
+ import { ManagedEventEmitter } from '@cyclonium/event';
19
+ import { logger } from '@cyclonium/core/log';
20
+ import { prune } from '@cyclonium/algorithm/prune';
21
+ var PropertyGroup;
22
+ (function (PropertyGroup) {
23
+ PropertyGroup["common"] = "Common";
24
+ PropertyGroup["slope"] = "Slope";
25
+ PropertyGroup["autoStep"] = "Auto Step";
26
+ PropertyGroup["snapToGround"] = "Snap To Ground";
27
+ })(PropertyGroup || (PropertyGroup = {}));
28
+ let KinematicCharacterController2D = class KinematicCharacterController2D extends PhysicsComponent2DBase {
29
+ get skinWidth() {
30
+ return this._skinWidth;
31
+ }
32
+ set skinWidth(value) {
33
+ this._skinWidth = value;
34
+ this._impl?.setOffset(value);
35
+ }
36
+ get up() {
37
+ return this._up;
38
+ }
39
+ set up(value) {
40
+ Vec2.assign(this._up, value);
41
+ this._impl?.setUp(toPx2ImplVec2(value));
42
+ }
43
+ get slideEnabled() {
44
+ return this._slideEnabled;
45
+ }
46
+ set slideEnabled(value) {
47
+ this._slideEnabled = value;
48
+ this._updateSlideEnabled();
49
+ }
50
+ get minSlopeSlideAngle() {
51
+ return this._minSlopeSlideAngle;
52
+ }
53
+ set minSlopeSlideAngle(value) {
54
+ this._minSlopeSlideAngle = value;
55
+ this._impl?.setMinSlopeSlideAngle(value);
56
+ }
57
+ get maxSlopeClimbAngle() {
58
+ return this._maxSlopeClimbAngle;
59
+ }
60
+ set maxSlopeClimbAngle(value) {
61
+ this._maxSlopeClimbAngle = value;
62
+ this._impl?.setMaxSlopeClimbAngle(value);
63
+ }
64
+ get autoStepEnabled() {
65
+ return this._autoStepEnabled;
66
+ }
67
+ set autoStepEnabled(value) {
68
+ this._autoStepEnabled = value;
69
+ this._updateAutoStepParams();
70
+ }
71
+ get autoStepMaxHeight() {
72
+ return this._autoStepMaxHeight;
73
+ }
74
+ set autoStepMaxHeight(value) {
75
+ this._autoStepMaxHeight = value;
76
+ this._updateAutoStepParams();
77
+ }
78
+ get autoStepMinWidth() {
79
+ return this._autoStepMinWidth;
80
+ }
81
+ set autoStepMinWidth(value) {
82
+ this._autoStepMinWidth = value;
83
+ this._updateAutoStepParams();
84
+ }
85
+ get autoStepIncludeDynamicBodies() {
86
+ return this._autoStepIncludeDynamicBodies;
87
+ }
88
+ set autoStepIncludeDynamicBodies(value) {
89
+ this._autoStepIncludeDynamicBodies = value;
90
+ this._updateAutoStepParams();
91
+ }
92
+ get snapToGroundEnabled() {
93
+ return this._snapToGroundEnabled;
94
+ }
95
+ set snapToGroundEnabled(value) {
96
+ this._snapToGroundEnabled = value;
97
+ this._updateSnapToGroundParams();
98
+ }
99
+ get snapToGroundDistance() {
100
+ return this._snapToGroundDistance;
101
+ }
102
+ set snapToGroundDistance(value) {
103
+ this._snapToGroundDistance = value;
104
+ this._updateSnapToGroundParams();
105
+ }
106
+ get applyImpulsesToDynamicBodies() {
107
+ return this._applyImpulsesToDynamicBodies;
108
+ }
109
+ set applyImpulsesToDynamicBodies(value) {
110
+ this._applyImpulsesToDynamicBodies = value;
111
+ this._impl?.setApplyImpulsesToDynamicBodies(value);
112
+ }
113
+ get lastMovement() {
114
+ return this._lastMovement;
115
+ }
116
+ get grounded() {
117
+ return this._impl?.computedGrounded() ?? false;
118
+ }
119
+ get listenersOnCollisionBegin() {
120
+ return this._emitterOnCollisionBegin.registry;
121
+ }
122
+ get listenersOnCollisionStay() {
123
+ return this._emitterOnCollisionStay.registry;
124
+ }
125
+ get listenersOnCollisionEnd() {
126
+ return this._emitterOnCollisionEnd.registry;
127
+ }
128
+ get impl() {
129
+ return this._impl;
130
+ }
131
+ move(desiredMovement, deltaTime) {
132
+ const impl = this._impl;
133
+ if (!impl) {
134
+ return;
135
+ }
136
+ const collider = Collider2D.ofOrNull(this);
137
+ if (!collider || !collider.impl_internal) {
138
+ return;
139
+ }
140
+ const world = this.world;
141
+ if (!world) {
142
+ return;
143
+ }
144
+ impl.computeColliderMovement(collider.impl_internal, toPx2ImplVec2(desiredMovement), undefined, collider.impl_internal.collisionGroups());
145
+ const movement = fromPx2ImplVec2(impl.computedMovement());
146
+ Vec2.assign(this._lastMovement, movement);
147
+ const rigidBody = collider.attachedRigidBody;
148
+ if (!rigidBody || !rigidBody.impl) {
149
+ const newPosition = fromPx2ImplVec2(collider.impl_internal.translation()).add(movement);
150
+ Transform2DComponent.of(collider).position = newPosition;
151
+ collider.impl_internal.setTranslation(toPx2ImplVec2(newPosition));
152
+ }
153
+ else if (rigidBody.type === RigidBody2DType.kinematicVelocityBased) {
154
+ rigidBody.linearVelocity = movement.mulScalar(1 / deltaTime);
155
+ }
156
+ else {
157
+ const currentPosition = fromPx2ImplVec2(rigidBody.impl.nextTranslation());
158
+ const newPosition = fromPx2ImplVec2(currentPosition).add(movement);
159
+ Transform2DComponent.of(collider).position = newPosition;
160
+ rigidBody.impl.setNextKinematicTranslation(toPx2ImplVec2(newPosition));
161
+ }
162
+ this._emitCharacterCollisionEvents(impl, world);
163
+ }
164
+ onDestroy() {
165
+ super.onDestroy();
166
+ this._destroyImpl();
167
+ }
168
+ onAttachToWorld(world) {
169
+ assert(!this._impl);
170
+ const impl = this._impl = world.impl.createCharacterController(this._skinWidth);
171
+ impl.setOffset(this._skinWidth);
172
+ impl.setMinSlopeSlideAngle(this._minSlopeSlideAngle);
173
+ impl.setMaxSlopeClimbAngle(this._maxSlopeClimbAngle);
174
+ impl.setUp(toPx2ImplVec2(this._up));
175
+ this._updateSlideEnabled();
176
+ this._updateAutoStepParams();
177
+ this._updateSnapToGroundParams();
178
+ impl.setApplyImpulsesToDynamicBodies(this._applyImpulsesToDynamicBodies);
179
+ }
180
+ onDetachFromWorld(world) {
181
+ void world;
182
+ this._destroyImpl();
183
+ }
184
+ onAfterPhysicsStep() {
185
+ void 0;
186
+ }
187
+ _impl;
188
+ _skinWidth = 0.01;
189
+ _up = Vec2.UNIT_Y.clone();
190
+ _slideEnabled = true;
191
+ _minSlopeSlideAngle = toRadians(30);
192
+ _maxSlopeClimbAngle = toRadians(45);
193
+ _autoStepEnabled = true;
194
+ _autoStepMaxHeight = 0.1;
195
+ _autoStepMinWidth = 0.1;
196
+ _autoStepIncludeDynamicBodies = false;
197
+ _snapToGroundEnabled = true;
198
+ _snapToGroundDistance = 0.1;
199
+ _applyImpulsesToDynamicBodies = false;
200
+ _lastMovement = Vec2.ZERO.clone();
201
+ _collisionRecords = [];
202
+ _emitterOnCollisionBegin = new ManagedEventEmitter();
203
+ _emitterOnCollisionStay = new ManagedEventEmitter();
204
+ _emitterOnCollisionEnd = new ManagedEventEmitter();
205
+ _updateSlideEnabled() {
206
+ this._impl?.setSlideEnabled(this._slideEnabled);
207
+ }
208
+ _updateAutoStepParams() {
209
+ if (this._autoStepEnabled) {
210
+ this._impl?.enableAutostep(this._autoStepMaxHeight, this._autoStepMinWidth, this._autoStepIncludeDynamicBodies);
211
+ }
212
+ else {
213
+ this._impl?.disableAutostep();
214
+ }
215
+ }
216
+ _updateSnapToGroundParams() {
217
+ if (this._snapToGroundEnabled) {
218
+ this._impl?.enableSnapToGround(this._snapToGroundDistance);
219
+ }
220
+ else {
221
+ this._impl?.disableSnapToGround();
222
+ }
223
+ }
224
+ _destroyImpl() {
225
+ if (!this._impl) {
226
+ return;
227
+ }
228
+ const world = this.world;
229
+ world?.impl.removeCharacterController(this._impl);
230
+ this._impl = undefined;
231
+ }
232
+ _emitCharacterCollisionEvents(impl, world) {
233
+ const nComputedCollisions = impl.numComputedCollisions();
234
+ for (let i = 0; i < nComputedCollisions; i++) {
235
+ const collision = impl.computedCollision(i);
236
+ assert(collision);
237
+ if (!collision.collider) {
238
+ logger.warn('a computed collision with null collider.');
239
+ continue;
240
+ }
241
+ const collider = world._getCollider(collision.collider);
242
+ if (!collider) {
243
+ logger.warn('a computed collision with a collider that is not(or has been destroyed) in our physics world.');
244
+ continue;
245
+ }
246
+ const iExistingRecord = this._collisionRecords.findIndex((record) => record.collider === collider);
247
+ if (iExistingRecord < 0) {
248
+ // new collision
249
+ this._collisionRecords.push({
250
+ collider,
251
+ colliderName_debug: collider.node.getPathInHierarchy(),
252
+ state: CollisionRecordState.begin,
253
+ });
254
+ }
255
+ else {
256
+ const record = this._collisionRecords[iExistingRecord];
257
+ if (record.state === CollisionRecordState.stayStale) {
258
+ record.state = CollisionRecordState.stay;
259
+ }
260
+ else {
261
+ // That indeed happens.
262
+ // logger.warn(`Received more than once collision with collider ${collider.node.getPathInHierarchy()}?`);
263
+ }
264
+ }
265
+ }
266
+ for (const record of this._collisionRecords) {
267
+ const collision = {
268
+ collider: record.collider,
269
+ };
270
+ switch (record.state) {
271
+ case CollisionRecordState.begin:
272
+ record.state = CollisionRecordState.stayStale;
273
+ this._emitterOnCollisionBegin.emit(collision);
274
+ break;
275
+ case CollisionRecordState.stay:
276
+ record.state = CollisionRecordState.stayStale;
277
+ this._emitterOnCollisionStay.emit(collision);
278
+ break;
279
+ case CollisionRecordState.stayStale:
280
+ record.state = CollisionRecordState.end;
281
+ if (!record.collider.isValid) {
282
+ logger.verbose(`[NOTICE] a previous-colliding collider ${record.colliderName_debug ?? '<the name was not recorded>'} is no longer valid, no collision end event will be emitted.`);
283
+ continue;
284
+ }
285
+ this._emitterOnCollisionEnd.emit(collision);
286
+ break;
287
+ }
288
+ }
289
+ prune(this._collisionRecords, (record) => record.state !== CollisionRecordState.end);
290
+ }
291
+ };
292
+ __decorate([
293
+ editable,
294
+ idem
295
+ ], KinematicCharacterController2D.prototype, "skinWidth", null);
296
+ __decorate([
297
+ editable,
298
+ idemBy(Vec2.strictEquals)
299
+ ], KinematicCharacterController2D.prototype, "up", null);
300
+ __decorate([
301
+ editable,
302
+ idem
303
+ ], KinematicCharacterController2D.prototype, "slideEnabled", null);
304
+ __decorate([
305
+ editable({ group: PropertyGroup.slope, radian: true }),
306
+ idem
307
+ ], KinematicCharacterController2D.prototype, "minSlopeSlideAngle", null);
308
+ __decorate([
309
+ editable({ group: PropertyGroup.slope, radian: true }),
310
+ idem
311
+ ], KinematicCharacterController2D.prototype, "maxSlopeClimbAngle", null);
312
+ __decorate([
313
+ editable({ group: PropertyGroup.autoStep }),
314
+ idem
315
+ ], KinematicCharacterController2D.prototype, "autoStepEnabled", null);
316
+ __decorate([
317
+ editable({ group: PropertyGroup.autoStep }),
318
+ idem
319
+ ], KinematicCharacterController2D.prototype, "autoStepMaxHeight", null);
320
+ __decorate([
321
+ editable({ group: PropertyGroup.autoStep }),
322
+ idem
323
+ ], KinematicCharacterController2D.prototype, "autoStepMinWidth", null);
324
+ __decorate([
325
+ editable({ group: PropertyGroup.autoStep }),
326
+ idem
327
+ ], KinematicCharacterController2D.prototype, "autoStepIncludeDynamicBodies", null);
328
+ __decorate([
329
+ editable({ group: PropertyGroup.snapToGround }),
330
+ idem
331
+ ], KinematicCharacterController2D.prototype, "snapToGroundEnabled", null);
332
+ __decorate([
333
+ editable({ group: PropertyGroup.snapToGround }),
334
+ idem
335
+ ], KinematicCharacterController2D.prototype, "snapToGroundDistance", null);
336
+ __decorate([
337
+ editable,
338
+ idem
339
+ ], KinematicCharacterController2D.prototype, "applyImpulsesToDynamicBodies", null);
340
+ __decorate([
341
+ serializable
342
+ ], KinematicCharacterController2D.prototype, "_skinWidth", void 0);
343
+ __decorate([
344
+ serializable
345
+ ], KinematicCharacterController2D.prototype, "_up", void 0);
346
+ __decorate([
347
+ serializable
348
+ ], KinematicCharacterController2D.prototype, "_slideEnabled", void 0);
349
+ __decorate([
350
+ serializable
351
+ ], KinematicCharacterController2D.prototype, "_minSlopeSlideAngle", void 0);
352
+ __decorate([
353
+ serializable
354
+ ], KinematicCharacterController2D.prototype, "_maxSlopeClimbAngle", void 0);
355
+ __decorate([
356
+ serializable
357
+ ], KinematicCharacterController2D.prototype, "_autoStepEnabled", void 0);
358
+ __decorate([
359
+ serializable
360
+ ], KinematicCharacterController2D.prototype, "_autoStepMaxHeight", void 0);
361
+ __decorate([
362
+ serializable
363
+ ], KinematicCharacterController2D.prototype, "_autoStepMinWidth", void 0);
364
+ __decorate([
365
+ serializable
366
+ ], KinematicCharacterController2D.prototype, "_autoStepIncludeDynamicBodies", void 0);
367
+ __decorate([
368
+ serializable
369
+ ], KinematicCharacterController2D.prototype, "_snapToGroundEnabled", void 0);
370
+ __decorate([
371
+ serializable
372
+ ], KinematicCharacterController2D.prototype, "_snapToGroundDistance", void 0);
373
+ __decorate([
374
+ serializable
375
+ ], KinematicCharacterController2D.prototype, "_applyImpulsesToDynamicBodies", void 0);
376
+ KinematicCharacterController2D = __decorate([
377
+ cycloBuiltinClass('KinematicCharacterController2D')
378
+ ], KinematicCharacterController2D);
379
+ export { KinematicCharacterController2D };
380
+ var CollisionRecordState;
381
+ (function (CollisionRecordState) {
382
+ /**
383
+ * The character controller has just started colliding with the collider in this computation.
384
+ */
385
+ CollisionRecordState[CollisionRecordState["begin"] = 0] = "begin";
386
+ /**
387
+ * The character controller was colliding with the collider after last computation.
388
+ */
389
+ CollisionRecordState[CollisionRecordState["stayStale"] = 1] = "stayStale";
390
+ /**
391
+ * The character controller is colliding with the collider in this computation.
392
+ */
393
+ CollisionRecordState[CollisionRecordState["stay"] = 2] = "stay";
394
+ /**
395
+ * The character controller was not colliding with the collider in this computation.
396
+ */
397
+ CollisionRecordState[CollisionRecordState["end"] = 3] = "end";
398
+ })(CollisionRecordState || (CollisionRecordState = {}));
399
+ //# sourceMappingURL=character-controller-2d.js.map