@combos-fun/plugin-matterjs 0.0.45 → 0.0.47
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/agent-skill.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# `@combos-fun/plugin-matterjs` — Agent notes
|
|
2
2
|
|
|
3
|
-
2D physics for Combos Fun
|
|
3
|
+
**2D** physics for Combos Fun, backed by `matter-js` ^0.20. Use
|
|
4
|
+
`@combos-fun/plugin-cannon` for **3D** physics.
|
|
4
5
|
|
|
5
6
|
## When to read
|
|
6
7
|
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
type PhysicsParams,
|
|
17
18
|
type PhysicsPartParams,
|
|
18
19
|
type PhysicsVertex,
|
|
20
|
+
type PhysicsBodyOptions,
|
|
19
21
|
type PhysicsSystemParams,
|
|
20
22
|
} from '@combos-fun/plugin-matterjs';
|
|
21
23
|
```
|
|
@@ -38,14 +40,14 @@ import {
|
|
|
38
40
|
|
|
39
41
|
### Coordinates
|
|
40
42
|
|
|
41
|
-
`vertices`, `vertexSets`, `from`, `to`, and each part's `position` are **local** to the
|
|
43
|
+
`vertices`, `vertexSets`, `from`, `to`, and each part's `position` are **local** to the **body origin** (`bodyParams.position`, or `transform.position + anchor × parent.size`). Do not pass world-space vertices.
|
|
42
44
|
|
|
43
45
|
### `Physics` Component params
|
|
44
46
|
|
|
45
47
|
| Field | Type | Notes |
|
|
46
48
|
|-------|------|-------|
|
|
47
49
|
| `type` | `PhysicsType?` | Body shape. Required when the object enters the scene |
|
|
48
|
-
| `bodyOptions` | `
|
|
50
|
+
| `bodyOptions` | `PhysicsBodyOptions?` | Matter Body options: `isStatic`, `restitution`, `frictionAir`, `density`, `friction`, `angle`, ... |
|
|
49
51
|
| `position` | `{x, y}?` | Body origin in world space. If omitted, taken from the GameObject transform |
|
|
50
52
|
| `width` / `height` | `number?` | Rectangle / trapezoid / capsule fallback size |
|
|
51
53
|
| `sides` / `radius` | `number?` | Regular polygon / circle / capsule cap |
|
|
@@ -77,24 +79,34 @@ Compound / capsule / chain collisions arrive on the **parent** `Physics` (the en
|
|
|
77
79
|
| Field | Type | Notes |
|
|
78
80
|
|-------|------|-------|
|
|
79
81
|
| `world` | `DeepPartial<IWorldDefinition>` | **Required**. Must include `gravity: { x, y, scale }` (e.g. `{ x: 0, y: 1, scale: 0.001 }`) |
|
|
80
|
-
| `resolution` | `number?` | **
|
|
81
|
-
| `fps` | `number?` |
|
|
82
|
+
| `resolution` | `number?` | Default `1`; **must match `RendererSystem.resolution`** |
|
|
83
|
+
| `fps` | `number?` | Default `60`; Matter runner step rate |
|
|
82
84
|
| `isTest` | `boolean?` | Adds a Pixi debug overlay drawn from Matter renderer (compound parts are outlined individually) |
|
|
83
85
|
| `mouse` | `{ open, constraint? }?` | Optional Matter mouse constraint |
|
|
84
86
|
| `element` / `canvas` | optional | Debug renderer mount points |
|
|
87
|
+
| `deltaSampleSize` | `number?` | When `> 1`, enables Matter `frameDeltaSmoothing` |
|
|
85
88
|
|
|
86
89
|
## Required setup
|
|
87
90
|
|
|
88
91
|
- Add `RendererSystem` (from `plugin-renderer`) **before** `PhysicsSystem`.
|
|
89
92
|
- Match `resolution` between renderer and physics.
|
|
90
|
-
-
|
|
91
|
-
|
|
93
|
+
- Body origin uses **`Transform.anchor`**, not `origin`. `Physics.update()` also
|
|
94
|
+
forces `anchor` to `{ x: 0, y: 0 }` each frame after the body exists. Center a
|
|
95
|
+
sprite with `Transform.origin`; do not expect `origin` to move the Matter body.
|
|
92
96
|
- Bodies are created lazily when the `GameObject` is added to a scene.
|
|
93
97
|
|
|
94
98
|
## Runtime behaviour
|
|
95
99
|
|
|
96
|
-
-
|
|
97
|
-
|
|
100
|
+
- The engine runs all Component `update`/`lateUpdate` hooks before System updates.
|
|
101
|
+
`Physics.update()` first copies the body's current pose into `Transform`, so
|
|
102
|
+
the visual reads the result of the previous `PhysicsSystem` step.
|
|
103
|
+
- Later in that frame, `PhysicsSystem.update()` processes body changes and
|
|
104
|
+
advances Matter via `Runner.tick`. Matter collision events fire during that
|
|
105
|
+
step; the resulting pose is rendered by `Physics.update()` on the next frame.
|
|
106
|
+
- Matter writes body world coordinates directly into the GameObject's
|
|
107
|
+
`Transform`; unlike Cannon, it does **not** convert world pose to local pose
|
|
108
|
+
for a parented object. Put physics GameObjects directly under `scene` unless
|
|
109
|
+
you intentionally handle the coordinate mismatch yourself.
|
|
98
110
|
- Pause / resume: `PhysicsSystem` automatically stops / starts the Matter
|
|
99
111
|
runner when `Game.pause()` / `Game.resume()` is called.
|
|
100
112
|
- Changing `bodyParams` (deep observer) rebuilds the Matter body.
|
|
@@ -109,6 +121,7 @@ Compound / capsule / chain collisions arrive on the **parent** `Physics` (the en
|
|
|
109
121
|
| Bodies pile up at origin | Set `position: { x, y }` on `Physics` constructor params |
|
|
110
122
|
| Cannot tap through bodies | Disable mouse constraint or `pointer-events: none` on the canvas overlay |
|
|
111
123
|
| `FROM_VERTICES` / `CHAIN` in the wrong place | Vertices are local to the body origin, not world space |
|
|
124
|
+
| Parented body drifts or jumps | Matter has no world→local sync; attach the physics GameObject directly to `scene` |
|
|
112
125
|
| Nested `COMPOUND` throws | Flatten into one `parts` list, or use `CAPSULE` / `CHAIN` as a part |
|
|
113
126
|
| Soft rope expected from `CHAIN` | `CHAIN` is a rigid polyline. Soft ropes need constraints, not this type |
|
|
114
127
|
| Collision events missing on capsule / compound | Listen on the parent `Physics`; do not read `pair.bodyA.component` yourself |
|
|
@@ -121,60 +134,33 @@ import { RendererSystem } from '@combos-fun/plugin-renderer';
|
|
|
121
134
|
import { GraphicsSystem, Graphics } from '@combos-fun/plugin-renderer-graphics';
|
|
122
135
|
import { PhysicsSystem, Physics, PhysicsType } from '@combos-fun/plugin-matterjs';
|
|
123
136
|
|
|
137
|
+
const canvas = document.querySelector<HTMLCanvasElement>('canvas')!;
|
|
124
138
|
const game = new Game({
|
|
125
139
|
systems: [
|
|
126
|
-
new RendererSystem({ canvas, width: 750, height: 1334 }),
|
|
140
|
+
new RendererSystem({ canvas, width: 750, height: 1334, resolution: 1 }),
|
|
127
141
|
new GraphicsSystem(),
|
|
128
|
-
new PhysicsSystem({
|
|
142
|
+
new PhysicsSystem({
|
|
143
|
+
resolution: 1,
|
|
144
|
+
fps: 60,
|
|
145
|
+
world: { gravity: { x: 0, y: 1, scale: 0.001 } },
|
|
146
|
+
}),
|
|
129
147
|
],
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const ball = new GameObject('ball', {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
vertices: [{ x: -40, y: 20 }, { x: 40, y: 20 }, { x: 0, y: -40 }],
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
new Physics({ type: PhysicsType.TRAPEZOID, width: 80, height: 40, slope: 0.4 });
|
|
146
|
-
|
|
147
|
-
new Physics({ type: PhysicsType.CAPSULE, length: 80, radius: 16 });
|
|
148
|
-
|
|
149
|
-
new Physics({
|
|
150
|
-
type: PhysicsType.COMPOUND,
|
|
151
|
-
parts: [
|
|
152
|
-
{ type: PhysicsType.RECTANGLE, width: 80, height: 20 },
|
|
153
|
-
{ type: PhysicsType.CIRCLE, radius: 16, position: { x: -40, y: 0 } },
|
|
154
|
-
{ type: PhysicsType.CIRCLE, radius: 16, position: { x: 40, y: 0 } },
|
|
155
|
-
],
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
new Physics({
|
|
159
|
-
type: PhysicsType.EDGE,
|
|
160
|
-
from: { x: -100, y: 0 },
|
|
161
|
-
to: { x: 100, y: 20 },
|
|
162
|
-
thickness: 4,
|
|
163
|
-
bodyOptions: { isStatic: true },
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
new Physics({
|
|
167
|
-
type: PhysicsType.CHAIN,
|
|
168
|
-
vertices: [{ x: -200, y: 0 }, { x: 0, y: 40 }, { x: 200, y: 0 }],
|
|
169
|
-
thickness: 4,
|
|
170
|
-
bodyOptions: { isStatic: true },
|
|
148
|
+
onSystemsBootstrapComplete: (readyGame, error) => {
|
|
149
|
+
if (error) return;
|
|
150
|
+
const ball = new GameObject('ball', {
|
|
151
|
+
size: { width: 50, height: 50 },
|
|
152
|
+
position: { x: 375, y: 100 },
|
|
153
|
+
origin: { x: 0.5, y: 0.5 },
|
|
154
|
+
});
|
|
155
|
+
const g = ball.addComponent(new Graphics());
|
|
156
|
+
g.graphics.circle(25, 25, 25).fill({ color: 0xff6b6b });
|
|
157
|
+
ball.addComponent(new Physics({ type: PhysicsType.CIRCLE, radius: 25 }));
|
|
158
|
+
readyGame.scene.addChild(ball);
|
|
159
|
+
},
|
|
171
160
|
});
|
|
172
161
|
```
|
|
173
162
|
|
|
174
163
|
## Verification
|
|
175
164
|
|
|
176
165
|
- `pnpm --filter @combos-fun/plugin-matterjs run build`
|
|
177
|
-
- Run a 2D example
|
|
178
|
-
and stay aligned with sprites.
|
|
179
|
-
- For new hulls: a static `CHAIN` / `EDGE` should support falling circles;
|
|
180
|
-
a `CAPSULE` / `COMPOUND` should emit `collisionStart` on the parent `Physics`.
|
|
166
|
+
- Run a 2D example and verify falling, collisions, and render alignment.
|
|
@@ -561,7 +561,7 @@ var PhysicsSystem = PhysicsSystem$1;
|
|
|
561
561
|
/** Auto-generated by scripts/build-package.mjs — do not edit. */
|
|
562
562
|
Object.assign(PhysicsSystem, {
|
|
563
563
|
packageName: "@combos-fun/plugin-matterjs",
|
|
564
|
-
packageVersion: "0.0.
|
|
564
|
+
packageVersion: "0.0.47",
|
|
565
565
|
});
|
|
566
566
|
|
|
567
567
|
exports.Physics = Physics;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-matterjs.cjs.js","sources":["../lib/Physics.ts","../lib/BodiesFactory.ts","../lib/MatterPixiDebugRenderer.ts","../lib/PhysicsEngine.ts","../lib/PhysicsSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport Matter from 'matter-js';\n\nexport enum PhysicsType {\n RECTANGLE = 'rectangle',\n CIRCLE = 'circle',\n POLYGON = 'polygon',\n TRAPEZOID = 'trapezoid',\n FROM_VERTICES = 'fromVertices',\n CAPSULE = 'capsule',\n COMPOUND = 'compound',\n EDGE = 'edge',\n CHAIN = 'chain',\n}\n\nexport interface PhysicsVertex {\n x: number\n y: number\n}\n\nexport interface PhysicsBodyOptions {\n isStatic?: boolean,\n restitution?: number,\n density?: number,\n [propName: string]: any,\n}\n\n/** One piece of a `COMPOUND` body. Nested `COMPOUND` is not allowed. */\nexport interface PhysicsPartParams {\n type: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n}\n\nexport interface PhysicsParams {\n type?: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n stopRotation?: boolean\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n parts?: PhysicsPartParams[]\n}\n\nexport class Physics extends Component<PhysicsParams> {\n static componentName: string = 'Physics';\n public bodyParams: PhysicsParams;\n public body: Matter.Body;\n private PhysicsEngine: Matter.Engine;\n\n init(params: PhysicsParams) {\n this.bodyParams = params;\n }\n\n update() {\n if (this.body && this.gameObject) {\n this.gameObject.transform.anchor.x = 0;\n this.gameObject.transform.anchor.y = 0;\n this.gameObject.transform.position.x = this.body.position.x;\n this.gameObject.transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n this.gameObject.transform.rotation = this.body.angle;\n }\n }\n }\n onDestroy() {\n Matter.World.remove(this.PhysicsEngine.world, this.body, true);\n }\n}\n","import Matter from 'matter-js';\nimport decomp from 'poly-decomp';\nimport { PhysicsType, Physics, PhysicsParams, PhysicsPartParams } from './Physics';\nimport { GameObject } from '@combos-fun/engine';\n\ntype ShapeParams = PhysicsParams | PhysicsPartParams;\n\ninterface ShapeContext {\n x: number\n y: number\n transformWidth: number\n transformHeight: number\n defaultRadius: number\n}\n\ninterface Vector2 {\n x: number\n y: number\n}\n\nconst DEFAULT_THICKNESS = 4;\nconst MIN_SEGMENT = 0.5;\n\nlet decompRegistered = false;\n\nfunction ensureDecomp() {\n if (decompRegistered) {\n return;\n }\n const lib = (decomp as any)?.quickDecomp ? decomp : (decomp as any)?.default;\n if (lib?.quickDecomp) {\n Matter.Common.setDecomp(lib);\n }\n decompRegistered = true;\n}\n\nexport default class BodiesFactory {\n private Bodies: typeof Matter.Bodies;\n constructor() {\n this.Bodies = Matter.Bodies;\n ensureDecomp();\n }\n\n public create(component: Physics): Matter.Body {\n const { gameObject, bodyParams } = component;\n const coordinate = this.getCoordinate(gameObject);\n const x = bodyParams.position ? bodyParams.position.x : coordinate.x;\n const y = bodyParams.position ? bodyParams.position.y : coordinate.y;\n const transformWidth =\n gameObject.transform.size.width * gameObject.transform.scale.x;\n const transformHeight =\n gameObject.transform.size.height * gameObject.transform.scale.y;\n /** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */\n const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);\n const body = this.createShape(bodyParams, {\n x,\n y,\n transformWidth,\n transformHeight,\n defaultRadius,\n }, false);\n if (!body) {\n throw new Error(\n `[plugin-matterjs] Failed to create body for type ${String(bodyParams.type)}`,\n );\n }\n return body;\n }\n\n private createShape(\n params: ShapeParams,\n ctx: ShapeContext,\n isPart: boolean,\n ): Matter.Body {\n const options = params.bodyOptions;\n switch (params.type) {\n case PhysicsType.RECTANGLE: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n return this.Bodies.rectangle(ctx.x, ctx.y, width, height, options);\n }\n case PhysicsType.CIRCLE: {\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n case PhysicsType.POLYGON: {\n const sides = Math.max(3, params.sides ?? 6);\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.polygon(ctx.x, ctx.y, sides, radius, options);\n }\n case PhysicsType.TRAPEZOID: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n const slope = Math.min(Math.max(params.slope ?? 0.5, 0), 0.999);\n return this.Bodies.trapezoid(ctx.x, ctx.y, width, height, slope, options);\n }\n case PhysicsType.FROM_VERTICES:\n return this.createFromVertices(params, ctx, options);\n case PhysicsType.CAPSULE:\n return this.createCapsule(params, ctx, options);\n case PhysicsType.EDGE:\n return this.createEdge(params, ctx, options);\n case PhysicsType.CHAIN:\n return this.createChain(params, ctx, options);\n case PhysicsType.COMPOUND:\n if (isPart) {\n throw new Error('[plugin-matterjs] Nested COMPOUND parts are not supported');\n }\n return this.createCompound(params, ctx, options);\n default:\n throw new Error(\n `[plugin-matterjs] Unsupported PhysicsType: ${String(params.type)}`,\n );\n }\n }\n\n private createFromVertices(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const sets = params.vertexSets ?? (params.vertices ? [params.vertices] : []);\n if (!sets.length || sets.some(set => !set || set.length < 3)) {\n throw new Error(\n '[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each',\n );\n }\n ensureDecomp();\n const body = this.Bodies.fromVertices(\n ctx.x,\n ctx.y,\n sets as Matter.Vector[][],\n options,\n true,\n );\n if (!body) {\n throw new Error('[plugin-matterjs] FROM_VERTICES produced an empty body');\n }\n return body;\n }\n\n private createCapsule(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const radius = Math.max(1, params.radius ?? ctx.defaultRadius);\n const length = Math.max(radius * 2, params.length ?? ctx.transformWidth);\n const shaft = length - radius * 2;\n if (shaft < MIN_SEGMENT) {\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n const parts = [\n this.Bodies.rectangle(ctx.x, ctx.y, shaft, radius * 2),\n this.Bodies.circle(ctx.x - shaft / 2, ctx.y, radius),\n this.Bodies.circle(ctx.x + shaft / 2, ctx.y, radius),\n ];\n return Matter.Body.create({ ...options, parts });\n }\n\n private createEdge(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n if (!params.from || !params.to) {\n throw new Error('[plugin-matterjs] EDGE requires from and to');\n }\n const x1 = ctx.x + params.from.x;\n const y1 = ctx.y + params.from.y;\n const x2 = ctx.x + params.to.x;\n const y2 = ctx.y + params.to.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n throw new Error('[plugin-matterjs] EDGE from/to are too close');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const { angle: _ignored, ...rest } = options ?? {};\n return this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, {\n ...rest,\n angle: Math.atan2(dy, dx),\n });\n }\n\n private createChain(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const verts = params.vertices;\n if (!verts || verts.length < 2) {\n throw new Error('[plugin-matterjs] CHAIN requires vertices with at least 2 points');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const parts: Matter.Body[] = [];\n for (let i = 0; i < verts.length - 1; i++) {\n const a = verts[i];\n const b = verts[i + 1];\n const x1 = ctx.x + a.x;\n const y1 = ctx.y + a.y;\n const x2 = ctx.x + b.x;\n const y2 = ctx.y + b.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n continue;\n }\n parts.push(this.Bodies.rectangle(\n (x1 + x2) / 2,\n (y1 + y2) / 2,\n len,\n thickness,\n { angle: Math.atan2(dy, dx) },\n ));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] CHAIN has no usable segments');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n private createCompound(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const partParams = (params as PhysicsParams).parts;\n if (!partParams?.length) {\n throw new Error('[plugin-matterjs] COMPOUND requires a non-empty parts array');\n }\n const parts: Matter.Body[] = [];\n for (let i = 0; i < partParams.length; i++) {\n const part = partParams[i];\n const ox = ctx.x + (part.position?.x ?? 0);\n const oy = ctx.y + (part.position?.y ?? 0);\n const partBody = this.createShape(part, { ...ctx, x: ox, y: oy }, true);\n parts.push(...this.asParts(partBody));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] COMPOUND produced no parts');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n /** Unwrap a compound wrapper so it can be merged into another parent. */\n private asParts(body: Matter.Body): Matter.Body[] {\n if (body.parts && body.parts.length > 1) {\n return body.parts.slice(1);\n }\n return [body];\n }\n\n private getCoordinate(gameObject: GameObject): Vector2 {\n const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;\n const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;\n return {\n x,\n y,\n };\n }\n}\n","import Matter from 'matter-js';\nimport { Application, Graphics } from 'pixi.js';\n\nexport interface MatterPixiDebugOptions {\n engine: Matter.Engine;\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n resolution?: number;\n}\n\n/** WebGL wireframe overlay for Matter bodies in test mode. */\nexport class MatterPixiDebugRenderer {\n private readonly engine: Matter.Engine;\n private readonly opts: MatterPixiDebugOptions;\n private app: Application | null = null;\n private graphics: Graphics | null = null;\n private readonly onAfterUpdate: () => void;\n\n constructor(opts: MatterPixiDebugOptions) {\n this.opts = opts;\n this.engine = opts.engine;\n this.onAfterUpdate = () => this.redraw();\n }\n\n async init(): Promise<void> {\n const { canvas, width, height, resolution = 1 } = this.opts;\n const app = new Application();\n await app.init({\n canvas,\n width,\n height,\n resolution,\n autoDensity: true,\n antialias: true,\n backgroundAlpha: 0.12,\n preference: 'webgl',\n });\n this.app = app;\n this.graphics = new Graphics();\n app.stage.addChild(this.graphics);\n Matter.Events.on(this.engine, 'afterUpdate', this.onAfterUpdate);\n }\n\n private redraw(): void {\n const g = this.graphics;\n if (!g) {\n return;\n }\n g.clear();\n const bodies = Matter.Composite.allBodies(this.engine.world);\n for (let b = 0; b < bodies.length; b++) {\n const body = bodies[b];\n if (body.render?.visible === false) {\n continue;\n }\n const pieces = body.parts && body.parts.length > 1 ? body.parts.slice(1) : [body];\n for (let p = 0; p < pieces.length; p++) {\n const verts = pieces[p].vertices;\n if (!verts?.length) {\n continue;\n }\n const v0 = verts[0];\n g.moveTo(v0.x, v0.y);\n for (let i = 1; i < verts.length; i++) {\n g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });\n }\n }\n }\n\n destroy(): void {\n Matter.Events.off(this.engine, 'afterUpdate', this.onAfterUpdate);\n if (this.app) {\n this.app.destroy(true, { children: true, texture: true });\n this.app = null;\n }\n this.graphics = null;\n }\n}\n","import Matter from 'matter-js';\n\nimport BodiesFactory from './BodiesFactory';\nimport { Game } from '@combos-fun/engine';\nimport type { PhysicsSystemParams } from './PhysicsSystem';\nimport type { Physics } from './Physics';\nimport { MatterPixiDebugRenderer } from './MatterPixiDebugRenderer';\n\nexport interface PhysicsLinkedBody extends Matter.Body {\n component: Physics;\n}\n\n/** Collision pairs often report a compound part, not the parent body. */\nfunction resolveLinkedComponent(body: Matter.Body): Physics | undefined {\n let current: Matter.Body | undefined = body;\n while (current) {\n const linked = current as PhysicsLinkedBody;\n if (linked.component) {\n return linked.component;\n }\n if (!current.parent || current.parent === current) {\n break;\n }\n current = current.parent;\n }\n return undefined;\n}\n\nexport default class PhysicsEngine {\n private Engine: typeof Matter.Engine;\n private World: typeof Matter.World;\n private engine: Matter.Engine;\n private bodiesFactory: BodiesFactory;\n private collisionEvents: string[];\n private bodyEvents: string[];\n private options: PhysicsSystemParams;\n private game: Game;\n private Runner: typeof Matter.Runner;\n private Constraint: typeof Matter.Constraint;\n private mouseConstraint: Matter.MouseConstraint;\n private runner: Matter.Runner;\n private debugRenderer: MatterPixiDebugRenderer | null = null;\n public enabled: boolean = false;\n constructor(game: Game, options: PhysicsSystemParams) {\n this.Engine = Matter.Engine;\n this.World = Matter.World;\n this.bodiesFactory = new BodiesFactory();\n this.Runner = Matter.Runner;\n this.Constraint = Matter.Constraint;\n this.game = game;\n\n this.collisionEvents = ['collisionStart', 'collisionActive', 'collisionEnd'];\n this.bodyEvents = ['tick', 'beforeUpdate', 'afterUpdate', 'beforeRender', 'afterRender', 'afterTick'];\n this.options = options;\n this.runner = this.Runner.create({\n delta: 1000 / (this.options.fps || 60),\n frameDeltaSmoothing: (this.options.deltaSampleSize ?? 1) > 1,\n });\n }\n\n public start() {\n this.engine = this.Engine.create();\n const world = this.World.create(this.options.world as Matter.IWorldDefinition);\n this.engine.world = world;\n if (this.options.isTest) {\n const ownCanvas = !this.options.canvas;\n const canvas = this.options.canvas ?? document.createElement('canvas');\n if (ownCanvas && this.options.element) {\n this.options.element.appendChild(canvas);\n }\n const resolution = this.options.resolution || 1;\n this.debugRenderer = new MatterPixiDebugRenderer({\n engine: this.engine,\n canvas,\n width: this.game.canvas.width / resolution,\n height: this.game.canvas.height / resolution,\n resolution,\n });\n void this.debugRenderer.init().catch(err => {\n console.error('[plugin-matterjs] MatterPixiDebugRenderer init failed', err);\n });\n this.Runner.run(this.runner, this.engine);\n }\n this.enabled = true;\n this.initMouse();\n this.initCollisionEvents();\n this.initBodyEvents();\n }\n\n public update(e) {\n if (!this.engine) {\n return;\n }\n if (!this.options.isTest) {\n this.Runner.tick(this.runner, this.engine, e.currentTime);\n }\n }\n\n public stop() {\n this.enabled = false;\n this.runner.enabled = false;\n }\n\n public destroy() {\n this.debugRenderer?.destroy();\n this.debugRenderer = null;\n if (this.engine) {\n Matter.Runner.stop(this.runner);\n Matter.Engine.clear(this.engine);\n }\n }\n\n public awake() {\n this.enabled = true;\n this.runner.enabled = true;\n }\n public add(component) {\n const body = this.createBodies(component);\n this.World.add(this.engine.world, [body]);\n this.linkComponent(component, body);\n }\n\n public change(component: Physics) {\n const newBody = this.createBodies(component);\n this.World.remove(this.engine.world, component.body, true);\n this.World.add(this.engine.world, [newBody]);\n this.linkComponent(component, newBody);\n }\n public remove(component: Physics) {\n this.World.remove(this.engine.world, component.body, true);\n component.body = undefined;\n }\n\n private createBodies(params): PhysicsLinkedBody {\n const body = this.bodiesFactory.create(params) as PhysicsLinkedBody;\n if (!body) {\n throw new Error('[plugin-matterjs] Failed to create Matter body');\n }\n return body;\n }\n\n private linkComponent(component, body: PhysicsLinkedBody) {\n component.body = body;\n component.Body = Matter.Body;\n component.PhysicsEngine = this.engine;\n component.Constraint = this.Constraint;\n component.mouseConstraint = this.mouseConstraint;\n component.World = this.World;\n body.component = component;\n }\n\n private initCollisionEvents() {\n (this.collisionEvents as Array<'collisionStart' | 'collisionActive' | 'collisionEnd'>).forEach(eventName => {\n Matter.Events.on(this.engine, eventName, (event: Matter.IEventCollision<Matter.Engine>) => {\n const pairs = event.pairs ?? [];\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n const { bodyA, bodyB } = pair;\n const componentA = resolveLinkedComponent(bodyA);\n const componentB = resolveLinkedComponent(bodyB);\n if (!componentA || !componentB) {\n continue;\n }\n componentA.emit(eventName, componentB.gameObject, componentA.gameObject);\n componentB.emit(eventName, componentA.gameObject, componentB.gameObject);\n }\n });\n });\n }\n\n private initMouse() {\n if (this.options.mouse && this.options.mouse.open) {\n const mouse = Matter.Mouse.create(this.game.canvas);\n let options = this.options.mouse.constraint ? {\n mouse,\n constraint: this.options.mouse.constraint\n } : {\n mouse\n };\n this.mouseConstraint = Matter.MouseConstraint.create(this.engine, options);\n this.World.add(this.engine.world, this.mouseConstraint);\n }\n }\n\n private initBodyEvents() {\n this.bodyEvents.forEach(eventName => {\n Matter.Events.on(this.engine, eventName, e => {\n const bodies = e.source.world.bodies;\n bodies.forEach(body => {\n const linked = body as PhysicsLinkedBody;\n linked.component?.emit(eventName, body, linked.component.gameObject);\n });\n });\n });\n }\n}\n","import { System, decorators, OBSERVER_TYPE, Transform } from '@combos-fun/engine';\nimport type { ComponentChanged } from \"@combos-fun/engine\";\nimport PhysicsEngine from './PhysicsEngine';\nimport { Physics } from './Physics';\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Object ? DeepPartial<T[P]> : T[P];\n}\n\nexport interface PhysicsSystemParams {\n resolution?: number\n fps?: number\n isTest?: boolean\n element?: HTMLElement\n canvas?: HTMLCanvasElement\n deltaSampleSize?: number\n mouse?: {\n open: boolean\n constraint?: Matter.Constraint\n }\n world: DeepPartial<Matter.IWorldDefinition>\n}\n\n@decorators.componentObserver({\n Physics: [{ prop: ['bodyParams'], deep: true }],\n Transform: ['_parent'],\n})\nexport default class PhysicsSystem extends System<PhysicsSystemParams> {\n static systemName = 'PhysicsSystem';\n private engine: PhysicsEngine;\n\n /**\n * System init: configure params before the game starts.\n * @param param init params\n */\n init(param?: PhysicsSystemParams) {\n this.engine = new PhysicsEngine(this.game, param);\n this.game.canvas.setAttribute('data-pixel-ratio', (param.resolution || '1') as string);\n }\n /**\n * Called when the System is installed; if the game has not started, it runs when the\n * game starts. Use it for setup work such as initializing data.\n */\n awake() { }\n\n /**\n * Called after the System is installed and all systems' `awake` have run.\n */\n start() {\n this.engine.start();\n }\n /**\n * Called on every game loop; can perform operations and change component properties.\n */\n update(e) {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n if (changed) {\n this.componentChanged(changed);\n }\n }\n this.engine.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.component instanceof Physics) {\n switch (changed.type) {\n case OBSERVER_TYPE.ADD: {\n if (changed.gameObject.transform.parent && !changed.gameObject.getComponent(Physics).body) {\n this.engine.add(changed.component);\n }\n break;\n }\n case OBSERVER_TYPE.CHANGE: {\n this.engine.change(changed.component);\n break;\n }\n case OBSERVER_TYPE.REMOVE: {\n break;\n }\n }\n } else {\n switch (changed.type) {\n case OBSERVER_TYPE.CHANGE: {\n if ((changed.component as Transform).parent) {\n let physics = changed.gameObject.getComponent(Physics);\n if (physics && !physics.body) {\n this.engine.add(physics);\n }\n } else {\n let physics = changed.gameObject.getComponent(Physics);\n physics && this.engine.remove(physics);\n }\n }\n }\n }\n }\n /**\n * Like `update`, but called after every System's and component's `update` has run.\n */\n lateUpdate() { }\n /**\n * Called when the game starts or resumes playing after a pause.\n */\n onResume() {\n if (!this.engine.enabled) {\n this.engine.awake();\n }\n }\n /**\n * Called when the game is paused.\n */\n onPause() {\n this.engine.stop();\n }\n /**\n * Called when the system is destroyed.\n */\n onDestroy() {\n this.engine?.destroy();\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport PhysicsSystem from './PhysicsSystem';\n\nObject.assign(PhysicsSystem, {\n packageName: \"@combos-fun/plugin-matterjs\",\n packageVersion: \"0.0.45\",\n});\n"],"names":["PhysicsType","Component","Matter","decomp","Application","Graphics","PhysicsSystem","System","OBSERVER_TYPE","__decorate","decorators"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin-matterjs.cjs.js","sources":["../lib/Physics.ts","../lib/BodiesFactory.ts","../lib/MatterPixiDebugRenderer.ts","../lib/PhysicsEngine.ts","../lib/PhysicsSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport Matter from 'matter-js';\n\nexport enum PhysicsType {\n RECTANGLE = 'rectangle',\n CIRCLE = 'circle',\n POLYGON = 'polygon',\n TRAPEZOID = 'trapezoid',\n FROM_VERTICES = 'fromVertices',\n CAPSULE = 'capsule',\n COMPOUND = 'compound',\n EDGE = 'edge',\n CHAIN = 'chain',\n}\n\nexport interface PhysicsVertex {\n x: number\n y: number\n}\n\nexport interface PhysicsBodyOptions {\n isStatic?: boolean,\n restitution?: number,\n density?: number,\n [propName: string]: any,\n}\n\n/** One piece of a `COMPOUND` body. Nested `COMPOUND` is not allowed. */\nexport interface PhysicsPartParams {\n type: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n}\n\nexport interface PhysicsParams {\n type?: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n stopRotation?: boolean\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n parts?: PhysicsPartParams[]\n}\n\nexport class Physics extends Component<PhysicsParams> {\n static componentName: string = 'Physics';\n public bodyParams: PhysicsParams;\n public body: Matter.Body;\n private PhysicsEngine: Matter.Engine;\n\n init(params: PhysicsParams) {\n this.bodyParams = params;\n }\n\n update() {\n if (this.body && this.gameObject) {\n this.gameObject.transform.anchor.x = 0;\n this.gameObject.transform.anchor.y = 0;\n this.gameObject.transform.position.x = this.body.position.x;\n this.gameObject.transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n this.gameObject.transform.rotation = this.body.angle;\n }\n }\n }\n onDestroy() {\n Matter.World.remove(this.PhysicsEngine.world, this.body, true);\n }\n}\n","import Matter from 'matter-js';\nimport decomp from 'poly-decomp';\nimport { PhysicsType, Physics, PhysicsParams, PhysicsPartParams } from './Physics';\nimport { GameObject } from '@combos-fun/engine';\n\ntype ShapeParams = PhysicsParams | PhysicsPartParams;\n\ninterface ShapeContext {\n x: number\n y: number\n transformWidth: number\n transformHeight: number\n defaultRadius: number\n}\n\ninterface Vector2 {\n x: number\n y: number\n}\n\nconst DEFAULT_THICKNESS = 4;\nconst MIN_SEGMENT = 0.5;\n\nlet decompRegistered = false;\n\nfunction ensureDecomp() {\n if (decompRegistered) {\n return;\n }\n const lib = (decomp as any)?.quickDecomp ? decomp : (decomp as any)?.default;\n if (lib?.quickDecomp) {\n Matter.Common.setDecomp(lib);\n }\n decompRegistered = true;\n}\n\nexport default class BodiesFactory {\n private Bodies: typeof Matter.Bodies;\n constructor() {\n this.Bodies = Matter.Bodies;\n ensureDecomp();\n }\n\n public create(component: Physics): Matter.Body {\n const { gameObject, bodyParams } = component;\n const coordinate = this.getCoordinate(gameObject);\n const x = bodyParams.position ? bodyParams.position.x : coordinate.x;\n const y = bodyParams.position ? bodyParams.position.y : coordinate.y;\n const transformWidth =\n gameObject.transform.size.width * gameObject.transform.scale.x;\n const transformHeight =\n gameObject.transform.size.height * gameObject.transform.scale.y;\n /** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */\n const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);\n const body = this.createShape(bodyParams, {\n x,\n y,\n transformWidth,\n transformHeight,\n defaultRadius,\n }, false);\n if (!body) {\n throw new Error(\n `[plugin-matterjs] Failed to create body for type ${String(bodyParams.type)}`,\n );\n }\n return body;\n }\n\n private createShape(\n params: ShapeParams,\n ctx: ShapeContext,\n isPart: boolean,\n ): Matter.Body {\n const options = params.bodyOptions;\n switch (params.type) {\n case PhysicsType.RECTANGLE: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n return this.Bodies.rectangle(ctx.x, ctx.y, width, height, options);\n }\n case PhysicsType.CIRCLE: {\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n case PhysicsType.POLYGON: {\n const sides = Math.max(3, params.sides ?? 6);\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.polygon(ctx.x, ctx.y, sides, radius, options);\n }\n case PhysicsType.TRAPEZOID: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n const slope = Math.min(Math.max(params.slope ?? 0.5, 0), 0.999);\n return this.Bodies.trapezoid(ctx.x, ctx.y, width, height, slope, options);\n }\n case PhysicsType.FROM_VERTICES:\n return this.createFromVertices(params, ctx, options);\n case PhysicsType.CAPSULE:\n return this.createCapsule(params, ctx, options);\n case PhysicsType.EDGE:\n return this.createEdge(params, ctx, options);\n case PhysicsType.CHAIN:\n return this.createChain(params, ctx, options);\n case PhysicsType.COMPOUND:\n if (isPart) {\n throw new Error('[plugin-matterjs] Nested COMPOUND parts are not supported');\n }\n return this.createCompound(params, ctx, options);\n default:\n throw new Error(\n `[plugin-matterjs] Unsupported PhysicsType: ${String(params.type)}`,\n );\n }\n }\n\n private createFromVertices(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const sets = params.vertexSets ?? (params.vertices ? [params.vertices] : []);\n if (!sets.length || sets.some(set => !set || set.length < 3)) {\n throw new Error(\n '[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each',\n );\n }\n ensureDecomp();\n const body = this.Bodies.fromVertices(\n ctx.x,\n ctx.y,\n sets as Matter.Vector[][],\n options,\n true,\n );\n if (!body) {\n throw new Error('[plugin-matterjs] FROM_VERTICES produced an empty body');\n }\n return body;\n }\n\n private createCapsule(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const radius = Math.max(1, params.radius ?? ctx.defaultRadius);\n const length = Math.max(radius * 2, params.length ?? ctx.transformWidth);\n const shaft = length - radius * 2;\n if (shaft < MIN_SEGMENT) {\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n const parts = [\n this.Bodies.rectangle(ctx.x, ctx.y, shaft, radius * 2),\n this.Bodies.circle(ctx.x - shaft / 2, ctx.y, radius),\n this.Bodies.circle(ctx.x + shaft / 2, ctx.y, radius),\n ];\n return Matter.Body.create({ ...options, parts });\n }\n\n private createEdge(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n if (!params.from || !params.to) {\n throw new Error('[plugin-matterjs] EDGE requires from and to');\n }\n const x1 = ctx.x + params.from.x;\n const y1 = ctx.y + params.from.y;\n const x2 = ctx.x + params.to.x;\n const y2 = ctx.y + params.to.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n throw new Error('[plugin-matterjs] EDGE from/to are too close');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const { angle: _ignored, ...rest } = options ?? {};\n return this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, {\n ...rest,\n angle: Math.atan2(dy, dx),\n });\n }\n\n private createChain(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const verts = params.vertices;\n if (!verts || verts.length < 2) {\n throw new Error('[plugin-matterjs] CHAIN requires vertices with at least 2 points');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const parts: Matter.Body[] = [];\n for (let i = 0; i < verts.length - 1; i++) {\n const a = verts[i];\n const b = verts[i + 1];\n const x1 = ctx.x + a.x;\n const y1 = ctx.y + a.y;\n const x2 = ctx.x + b.x;\n const y2 = ctx.y + b.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n continue;\n }\n parts.push(this.Bodies.rectangle(\n (x1 + x2) / 2,\n (y1 + y2) / 2,\n len,\n thickness,\n { angle: Math.atan2(dy, dx) },\n ));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] CHAIN has no usable segments');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n private createCompound(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const partParams = (params as PhysicsParams).parts;\n if (!partParams?.length) {\n throw new Error('[plugin-matterjs] COMPOUND requires a non-empty parts array');\n }\n const parts: Matter.Body[] = [];\n for (let i = 0; i < partParams.length; i++) {\n const part = partParams[i];\n const ox = ctx.x + (part.position?.x ?? 0);\n const oy = ctx.y + (part.position?.y ?? 0);\n const partBody = this.createShape(part, { ...ctx, x: ox, y: oy }, true);\n parts.push(...this.asParts(partBody));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] COMPOUND produced no parts');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n /** Unwrap a compound wrapper so it can be merged into another parent. */\n private asParts(body: Matter.Body): Matter.Body[] {\n if (body.parts && body.parts.length > 1) {\n return body.parts.slice(1);\n }\n return [body];\n }\n\n private getCoordinate(gameObject: GameObject): Vector2 {\n const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;\n const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;\n return {\n x,\n y,\n };\n }\n}\n","import Matter from 'matter-js';\nimport { Application, Graphics } from 'pixi.js';\n\nexport interface MatterPixiDebugOptions {\n engine: Matter.Engine;\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n resolution?: number;\n}\n\n/** WebGL wireframe overlay for Matter bodies in test mode. */\nexport class MatterPixiDebugRenderer {\n private readonly engine: Matter.Engine;\n private readonly opts: MatterPixiDebugOptions;\n private app: Application | null = null;\n private graphics: Graphics | null = null;\n private readonly onAfterUpdate: () => void;\n\n constructor(opts: MatterPixiDebugOptions) {\n this.opts = opts;\n this.engine = opts.engine;\n this.onAfterUpdate = () => this.redraw();\n }\n\n async init(): Promise<void> {\n const { canvas, width, height, resolution = 1 } = this.opts;\n const app = new Application();\n await app.init({\n canvas,\n width,\n height,\n resolution,\n autoDensity: true,\n antialias: true,\n backgroundAlpha: 0.12,\n preference: 'webgl',\n });\n this.app = app;\n this.graphics = new Graphics();\n app.stage.addChild(this.graphics);\n Matter.Events.on(this.engine, 'afterUpdate', this.onAfterUpdate);\n }\n\n private redraw(): void {\n const g = this.graphics;\n if (!g) {\n return;\n }\n g.clear();\n const bodies = Matter.Composite.allBodies(this.engine.world);\n for (let b = 0; b < bodies.length; b++) {\n const body = bodies[b];\n if (body.render?.visible === false) {\n continue;\n }\n const pieces = body.parts && body.parts.length > 1 ? body.parts.slice(1) : [body];\n for (let p = 0; p < pieces.length; p++) {\n const verts = pieces[p].vertices;\n if (!verts?.length) {\n continue;\n }\n const v0 = verts[0];\n g.moveTo(v0.x, v0.y);\n for (let i = 1; i < verts.length; i++) {\n g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });\n }\n }\n }\n\n destroy(): void {\n Matter.Events.off(this.engine, 'afterUpdate', this.onAfterUpdate);\n if (this.app) {\n this.app.destroy(true, { children: true, texture: true });\n this.app = null;\n }\n this.graphics = null;\n }\n}\n","import Matter from 'matter-js';\n\nimport BodiesFactory from './BodiesFactory';\nimport { Game } from '@combos-fun/engine';\nimport type { PhysicsSystemParams } from './PhysicsSystem';\nimport type { Physics } from './Physics';\nimport { MatterPixiDebugRenderer } from './MatterPixiDebugRenderer';\n\nexport interface PhysicsLinkedBody extends Matter.Body {\n component: Physics;\n}\n\n/** Collision pairs often report a compound part, not the parent body. */\nfunction resolveLinkedComponent(body: Matter.Body): Physics | undefined {\n let current: Matter.Body | undefined = body;\n while (current) {\n const linked = current as PhysicsLinkedBody;\n if (linked.component) {\n return linked.component;\n }\n if (!current.parent || current.parent === current) {\n break;\n }\n current = current.parent;\n }\n return undefined;\n}\n\nexport default class PhysicsEngine {\n private Engine: typeof Matter.Engine;\n private World: typeof Matter.World;\n private engine: Matter.Engine;\n private bodiesFactory: BodiesFactory;\n private collisionEvents: string[];\n private bodyEvents: string[];\n private options: PhysicsSystemParams;\n private game: Game;\n private Runner: typeof Matter.Runner;\n private Constraint: typeof Matter.Constraint;\n private mouseConstraint: Matter.MouseConstraint;\n private runner: Matter.Runner;\n private debugRenderer: MatterPixiDebugRenderer | null = null;\n public enabled: boolean = false;\n constructor(game: Game, options: PhysicsSystemParams) {\n this.Engine = Matter.Engine;\n this.World = Matter.World;\n this.bodiesFactory = new BodiesFactory();\n this.Runner = Matter.Runner;\n this.Constraint = Matter.Constraint;\n this.game = game;\n\n this.collisionEvents = ['collisionStart', 'collisionActive', 'collisionEnd'];\n this.bodyEvents = ['tick', 'beforeUpdate', 'afterUpdate', 'beforeRender', 'afterRender', 'afterTick'];\n this.options = options;\n this.runner = this.Runner.create({\n delta: 1000 / (this.options.fps || 60),\n frameDeltaSmoothing: (this.options.deltaSampleSize ?? 1) > 1,\n });\n }\n\n public start() {\n this.engine = this.Engine.create();\n const world = this.World.create(this.options.world as Matter.IWorldDefinition);\n this.engine.world = world;\n if (this.options.isTest) {\n const ownCanvas = !this.options.canvas;\n const canvas = this.options.canvas ?? document.createElement('canvas');\n if (ownCanvas && this.options.element) {\n this.options.element.appendChild(canvas);\n }\n const resolution = this.options.resolution || 1;\n this.debugRenderer = new MatterPixiDebugRenderer({\n engine: this.engine,\n canvas,\n width: this.game.canvas.width / resolution,\n height: this.game.canvas.height / resolution,\n resolution,\n });\n void this.debugRenderer.init().catch(err => {\n console.error('[plugin-matterjs] MatterPixiDebugRenderer init failed', err);\n });\n this.Runner.run(this.runner, this.engine);\n }\n this.enabled = true;\n this.initMouse();\n this.initCollisionEvents();\n this.initBodyEvents();\n }\n\n public update(e) {\n if (!this.engine) {\n return;\n }\n if (!this.options.isTest) {\n this.Runner.tick(this.runner, this.engine, e.currentTime);\n }\n }\n\n public stop() {\n this.enabled = false;\n this.runner.enabled = false;\n }\n\n public destroy() {\n this.debugRenderer?.destroy();\n this.debugRenderer = null;\n if (this.engine) {\n Matter.Runner.stop(this.runner);\n Matter.Engine.clear(this.engine);\n }\n }\n\n public awake() {\n this.enabled = true;\n this.runner.enabled = true;\n }\n public add(component) {\n const body = this.createBodies(component);\n this.World.add(this.engine.world, [body]);\n this.linkComponent(component, body);\n }\n\n public change(component: Physics) {\n const newBody = this.createBodies(component);\n this.World.remove(this.engine.world, component.body, true);\n this.World.add(this.engine.world, [newBody]);\n this.linkComponent(component, newBody);\n }\n public remove(component: Physics) {\n this.World.remove(this.engine.world, component.body, true);\n component.body = undefined;\n }\n\n private createBodies(params): PhysicsLinkedBody {\n const body = this.bodiesFactory.create(params) as PhysicsLinkedBody;\n if (!body) {\n throw new Error('[plugin-matterjs] Failed to create Matter body');\n }\n return body;\n }\n\n private linkComponent(component, body: PhysicsLinkedBody) {\n component.body = body;\n component.Body = Matter.Body;\n component.PhysicsEngine = this.engine;\n component.Constraint = this.Constraint;\n component.mouseConstraint = this.mouseConstraint;\n component.World = this.World;\n body.component = component;\n }\n\n private initCollisionEvents() {\n (this.collisionEvents as Array<'collisionStart' | 'collisionActive' | 'collisionEnd'>).forEach(eventName => {\n Matter.Events.on(this.engine, eventName, (event: Matter.IEventCollision<Matter.Engine>) => {\n const pairs = event.pairs ?? [];\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n const { bodyA, bodyB } = pair;\n const componentA = resolveLinkedComponent(bodyA);\n const componentB = resolveLinkedComponent(bodyB);\n if (!componentA || !componentB) {\n continue;\n }\n componentA.emit(eventName, componentB.gameObject, componentA.gameObject);\n componentB.emit(eventName, componentA.gameObject, componentB.gameObject);\n }\n });\n });\n }\n\n private initMouse() {\n if (this.options.mouse && this.options.mouse.open) {\n const mouse = Matter.Mouse.create(this.game.canvas);\n let options = this.options.mouse.constraint ? {\n mouse,\n constraint: this.options.mouse.constraint\n } : {\n mouse\n };\n this.mouseConstraint = Matter.MouseConstraint.create(this.engine, options);\n this.World.add(this.engine.world, this.mouseConstraint);\n }\n }\n\n private initBodyEvents() {\n this.bodyEvents.forEach(eventName => {\n Matter.Events.on(this.engine, eventName, e => {\n const bodies = e.source.world.bodies;\n bodies.forEach(body => {\n const linked = body as PhysicsLinkedBody;\n linked.component?.emit(eventName, body, linked.component.gameObject);\n });\n });\n });\n }\n}\n","import { System, decorators, OBSERVER_TYPE, Transform } from '@combos-fun/engine';\nimport type { ComponentChanged } from \"@combos-fun/engine\";\nimport PhysicsEngine from './PhysicsEngine';\nimport { Physics } from './Physics';\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Object ? DeepPartial<T[P]> : T[P];\n}\n\nexport interface PhysicsSystemParams {\n resolution?: number\n fps?: number\n isTest?: boolean\n element?: HTMLElement\n canvas?: HTMLCanvasElement\n deltaSampleSize?: number\n mouse?: {\n open: boolean\n constraint?: Matter.Constraint\n }\n world: DeepPartial<Matter.IWorldDefinition>\n}\n\n@decorators.componentObserver({\n Physics: [{ prop: ['bodyParams'], deep: true }],\n Transform: ['_parent'],\n})\nexport default class PhysicsSystem extends System<PhysicsSystemParams> {\n static systemName = 'PhysicsSystem';\n private engine: PhysicsEngine;\n\n /**\n * System init: configure params before the game starts.\n * @param param init params\n */\n init(param?: PhysicsSystemParams) {\n this.engine = new PhysicsEngine(this.game, param);\n this.game.canvas.setAttribute('data-pixel-ratio', (param.resolution || '1') as string);\n }\n /**\n * Called when the System is installed; if the game has not started, it runs when the\n * game starts. Use it for setup work such as initializing data.\n */\n awake() { }\n\n /**\n * Called after the System is installed and all systems' `awake` have run.\n */\n start() {\n this.engine.start();\n }\n /**\n * Called on every game loop; can perform operations and change component properties.\n */\n update(e) {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n if (changed) {\n this.componentChanged(changed);\n }\n }\n this.engine.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.component instanceof Physics) {\n switch (changed.type) {\n case OBSERVER_TYPE.ADD: {\n if (changed.gameObject.transform.parent && !changed.gameObject.getComponent(Physics).body) {\n this.engine.add(changed.component);\n }\n break;\n }\n case OBSERVER_TYPE.CHANGE: {\n this.engine.change(changed.component);\n break;\n }\n case OBSERVER_TYPE.REMOVE: {\n break;\n }\n }\n } else {\n switch (changed.type) {\n case OBSERVER_TYPE.CHANGE: {\n if ((changed.component as Transform).parent) {\n let physics = changed.gameObject.getComponent(Physics);\n if (physics && !physics.body) {\n this.engine.add(physics);\n }\n } else {\n let physics = changed.gameObject.getComponent(Physics);\n physics && this.engine.remove(physics);\n }\n }\n }\n }\n }\n /**\n * Like `update`, but called after every System's and component's `update` has run.\n */\n lateUpdate() { }\n /**\n * Called when the game starts or resumes playing after a pause.\n */\n onResume() {\n if (!this.engine.enabled) {\n this.engine.awake();\n }\n }\n /**\n * Called when the game is paused.\n */\n onPause() {\n this.engine.stop();\n }\n /**\n * Called when the system is destroyed.\n */\n onDestroy() {\n this.engine?.destroy();\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport PhysicsSystem from './PhysicsSystem';\n\nObject.assign(PhysicsSystem, {\n packageName: \"@combos-fun/plugin-matterjs\",\n packageVersion: \"0.0.47\",\n});\n"],"names":["PhysicsType","Component","Matter","decomp","Application","Graphics","PhysicsSystem","System","OBSERVER_TYPE","__decorate","decorators"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var t=require("tslib"),e=require("@combos-fun/engine"),s=require("matter-js"),i=require("poly-decomp"),n=require("pixi.js");function o(t){return t&&t.__esModule?t:{default:t}}var r,a=o(s),h=o(i);exports.PhysicsType=void 0,(r=exports.PhysicsType||(exports.PhysicsType={})).RECTANGLE="rectangle",r.CIRCLE="circle",r.POLYGON="polygon",r.TRAPEZOID="trapezoid",r.FROM_VERTICES="fromVertices",r.CAPSULE="capsule",r.COMPOUND="compound",r.EDGE="edge",r.CHAIN="chain";class c extends e.Component{static{this.componentName="Physics"}init(t){this.bodyParams=t}update(){this.body&&this.gameObject&&(this.gameObject.transform.anchor.x=0,this.gameObject.transform.anchor.y=0,this.gameObject.transform.position.x=this.body.position.x,this.gameObject.transform.position.y=this.body.position.y,this.bodyParams.stopRotation||(this.gameObject.transform.rotation=this.body.angle))}onDestroy(){a.default.World.remove(this.PhysicsEngine.world,this.body,!0)}}let d=!1;function p(){if(d)return;const t=h.default?.quickDecomp?h.default:h.default?.default;t?.quickDecomp&&a.default.Common.setDecomp(t),d=!0}class l{constructor(){this.Bodies=a.default.Bodies,p()}create(t){const{gameObject:e,bodyParams:s}=t,i=this.getCoordinate(e),n=s.position?s.position.x:i.x,o=s.position?s.position.y:i.y,r=e.transform.size.width*e.transform.scale.x,a=e.transform.size.height*e.transform.scale.y,h=Math.max(1,Math.min(r,a)/2),c=this.createShape(s,{x:n,y:o,transformWidth:r,transformHeight:a,defaultRadius:h},!1);if(!c)throw new Error(`[plugin-matterjs] Failed to create body for type ${String(s.type)}`);return c}createShape(t,e,s){const i=t.bodyOptions;switch(t.type){case exports.PhysicsType.RECTANGLE:{const s=t.width??e.transformWidth,n=t.height??e.transformHeight;return this.Bodies.rectangle(e.x,e.y,s,n,i)}case exports.PhysicsType.CIRCLE:{const s=t.radius??e.defaultRadius;return this.Bodies.circle(e.x,e.y,s,i)}case exports.PhysicsType.POLYGON:{const s=Math.max(3,t.sides??6),n=t.radius??e.defaultRadius;return this.Bodies.polygon(e.x,e.y,s,n,i)}case exports.PhysicsType.TRAPEZOID:{const s=t.width??e.transformWidth,n=t.height??e.transformHeight,o=Math.min(Math.max(t.slope??.5,0),.999);return this.Bodies.trapezoid(e.x,e.y,s,n,o,i)}case exports.PhysicsType.FROM_VERTICES:return this.createFromVertices(t,e,i);case exports.PhysicsType.CAPSULE:return this.createCapsule(t,e,i);case exports.PhysicsType.EDGE:return this.createEdge(t,e,i);case exports.PhysicsType.CHAIN:return this.createChain(t,e,i);case exports.PhysicsType.COMPOUND:if(s)throw new Error("[plugin-matterjs] Nested COMPOUND parts are not supported");return this.createCompound(t,e,i);default:throw new Error(`[plugin-matterjs] Unsupported PhysicsType: ${String(t.type)}`)}}createFromVertices(t,e,s){const i=t.vertexSets??(t.vertices?[t.vertices]:[]);if(!i.length||i.some(t=>!t||t.length<3))throw new Error("[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each");p();const n=this.Bodies.fromVertices(e.x,e.y,i,s,!0);if(!n)throw new Error("[plugin-matterjs] FROM_VERTICES produced an empty body");return n}createCapsule(t,e,s){const i=Math.max(1,t.radius??e.defaultRadius),n=Math.max(2*i,t.length??e.transformWidth)-2*i;if(n<.5)return this.Bodies.circle(e.x,e.y,i,s);const o=[this.Bodies.rectangle(e.x,e.y,n,2*i),this.Bodies.circle(e.x-n/2,e.y,i),this.Bodies.circle(e.x+n/2,e.y,i)];return a.default.Body.create({...s,parts:o})}createEdge(t,e,s){if(!t.from||!t.to)throw new Error("[plugin-matterjs] EDGE requires from and to");const i=e.x+t.from.x,n=e.y+t.from.y,o=e.x+t.to.x,r=e.y+t.to.y,a=o-i,h=r-n,c=Math.hypot(a,h);if(c<.5)throw new Error("[plugin-matterjs] EDGE from/to are too close");const d=Math.max(1,t.thickness??4),{angle:p,...l}=s??{};return this.Bodies.rectangle((i+o)/2,(n+r)/2,c,d,{...l,angle:Math.atan2(h,a)})}createChain(t,e,s){const i=t.vertices;if(!i||i.length<2)throw new Error("[plugin-matterjs] CHAIN requires vertices with at least 2 points");const n=Math.max(1,t.thickness??4),o=[];for(let t=0;t<i.length-1;t++){const s=i[t],r=i[t+1],a=e.x+s.x,h=e.y+s.y,c=e.x+r.x,d=e.y+r.y,p=c-a,l=d-h,u=Math.hypot(p,l);u<.5||o.push(this.Bodies.rectangle((a+c)/2,(h+d)/2,u,n,{angle:Math.atan2(l,p)}))}if(!o.length)throw new Error("[plugin-matterjs] CHAIN has no usable segments");return a.default.Body.create({...s,parts:o})}createCompound(t,e,s){const i=t.parts;if(!i?.length)throw new Error("[plugin-matterjs] COMPOUND requires a non-empty parts array");const n=[];for(let t=0;t<i.length;t++){const s=i[t],o=e.x+(s.position?.x??0),r=e.y+(s.position?.y??0),a=this.createShape(s,{...e,x:o,y:r},!0);n.push(...this.asParts(a))}if(!n.length)throw new Error("[plugin-matterjs] COMPOUND produced no parts");return a.default.Body.create({...s,parts:n})}asParts(t){return t.parts&&t.parts.length>1?t.parts.slice(1):[t]}getCoordinate(t){return{x:t.transform.position.x+t.transform.anchor.x*t.parent.transform.size.width,y:t.transform.position.y+t.transform.anchor.y*t.parent.transform.size.height}}}class u{constructor(t){this.app=null,this.graphics=null,this.opts=t,this.engine=t.engine,this.onAfterUpdate=()=>this.redraw()}async init(){const{canvas:t,width:e,height:s,resolution:i=1}=this.opts,o=new n.Application;await o.init({canvas:t,width:e,height:s,resolution:i,autoDensity:!0,antialias:!0,backgroundAlpha:.12,preference:"webgl"}),this.app=o,this.graphics=new n.Graphics,o.stage.addChild(this.graphics),a.default.Events.on(this.engine,"afterUpdate",this.onAfterUpdate)}redraw(){const t=this.graphics;if(!t)return;t.clear();const e=a.default.Composite.allBodies(this.engine.world);for(let s=0;s<e.length;s++){const i=e[s];if(!1===i.render?.visible)continue;const n=i.parts&&i.parts.length>1?i.parts.slice(1):[i];for(let e=0;e<n.length;e++){const s=n[e].vertices;if(!s?.length)continue;const i=s[0];t.moveTo(i.x,i.y);for(let e=1;e<s.length;e++)t.lineTo(s[e].x,s[e].y);t.closePath(),t.stroke({width:1,color:58998,alpha:.9})}}}destroy(){a.default.Events.off(this.engine,"afterUpdate",this.onAfterUpdate),this.app&&(this.app.destroy(!0,{children:!0,texture:!0}),this.app=null),this.graphics=null}}function m(t){let e=t;for(;e;){const t=e;if(t.component)return t.component;if(!e.parent||e.parent===e)break;e=e.parent}}class g{constructor(t,e){this.debugRenderer=null,this.enabled=!1,this.Engine=a.default.Engine,this.World=a.default.World,this.bodiesFactory=new l,this.Runner=a.default.Runner,this.Constraint=a.default.Constraint,this.game=t,this.collisionEvents=["collisionStart","collisionActive","collisionEnd"],this.bodyEvents=["tick","beforeUpdate","afterUpdate","beforeRender","afterRender","afterTick"],this.options=e,this.runner=this.Runner.create({delta:1e3/(this.options.fps||60),frameDeltaSmoothing:(this.options.deltaSampleSize??1)>1})}start(){this.engine=this.Engine.create();const t=this.World.create(this.options.world);if(this.engine.world=t,this.options.isTest){const t=!this.options.canvas,e=this.options.canvas??document.createElement("canvas");t&&this.options.element&&this.options.element.appendChild(e);const s=this.options.resolution||1;this.debugRenderer=new u({engine:this.engine,canvas:e,width:this.game.canvas.width/s,height:this.game.canvas.height/s,resolution:s}),this.debugRenderer.init().catch(t=>{console.error("[plugin-matterjs] MatterPixiDebugRenderer init failed",t)}),this.Runner.run(this.runner,this.engine)}this.enabled=!0,this.initMouse(),this.initCollisionEvents(),this.initBodyEvents()}update(t){this.engine&&(this.options.isTest||this.Runner.tick(this.runner,this.engine,t.currentTime))}stop(){this.enabled=!1,this.runner.enabled=!1}destroy(){this.debugRenderer?.destroy(),this.debugRenderer=null,this.engine&&(a.default.Runner.stop(this.runner),a.default.Engine.clear(this.engine))}awake(){this.enabled=!0,this.runner.enabled=!0}add(t){const e=this.createBodies(t);this.World.add(this.engine.world,[e]),this.linkComponent(t,e)}change(t){const e=this.createBodies(t);this.World.remove(this.engine.world,t.body,!0),this.World.add(this.engine.world,[e]),this.linkComponent(t,e)}remove(t){this.World.remove(this.engine.world,t.body,!0),t.body=void 0}createBodies(t){const e=this.bodiesFactory.create(t);if(!e)throw new Error("[plugin-matterjs] Failed to create Matter body");return e}linkComponent(t,e){t.body=e,t.Body=a.default.Body,t.PhysicsEngine=this.engine,t.Constraint=this.Constraint,t.mouseConstraint=this.mouseConstraint,t.World=this.World,e.component=t}initCollisionEvents(){this.collisionEvents.forEach(t=>{a.default.Events.on(this.engine,t,e=>{const s=e.pairs??[];for(let e=0;e<s.length;e++){const i=s[e],{bodyA:n,bodyB:o}=i,r=m(n),a=m(o);r&&a&&(r.emit(t,a.gameObject,r.gameObject),a.emit(t,r.gameObject,a.gameObject))}})})}initMouse(){if(this.options.mouse&&this.options.mouse.open){const t=a.default.Mouse.create(this.game.canvas);let e=this.options.mouse.constraint?{mouse:t,constraint:this.options.mouse.constraint}:{mouse:t};this.mouseConstraint=a.default.MouseConstraint.create(this.engine,e),this.World.add(this.engine.world,this.mouseConstraint)}}initBodyEvents(){this.bodyEvents.forEach(t=>{a.default.Events.on(this.engine,t,e=>{e.source.world.bodies.forEach(e=>{const s=e;s.component?.emit(t,e,s.component.gameObject)})})})}}let y=class extends e.System{static{this.systemName="PhysicsSystem"}init(t){this.engine=new g(this.game,t),this.game.canvas.setAttribute("data-pixel-ratio",t.resolution||"1")}awake(){}start(){this.engine.start()}update(t){const e=this.componentObserver.clear();for(const t of e)t&&this.componentChanged(t);this.engine.update(t)}componentChanged(t){if(t.component instanceof c)switch(t.type){case e.OBSERVER_TYPE.ADD:t.gameObject.transform.parent&&!t.gameObject.getComponent(c).body&&this.engine.add(t.component);break;case e.OBSERVER_TYPE.CHANGE:this.engine.change(t.component);case e.OBSERVER_TYPE.REMOVE:}else if(t.type===e.OBSERVER_TYPE.CHANGE)if(t.component.parent){let e=t.gameObject.getComponent(c);e&&!e.body&&this.engine.add(e)}else{let e=t.gameObject.getComponent(c);e&&this.engine.remove(e)}}lateUpdate(){}onResume(){this.engine.enabled||this.engine.awake()}onPause(){this.engine.stop()}onDestroy(){this.engine?.destroy()}};y=t.__decorate([e.decorators.componentObserver({Physics:[{prop:["bodyParams"],deep:!0}],Transform:["_parent"]})],y);var f=y;Object.assign(f,{packageName:"@combos-fun/plugin-matterjs",packageVersion:"0.0.45"}),exports.Physics=c,exports.PhysicsSystem=f;
|
|
1
|
+
"use strict";var t=require("tslib"),e=require("@combos-fun/engine"),s=require("matter-js"),i=require("poly-decomp"),n=require("pixi.js");function o(t){return t&&t.__esModule?t:{default:t}}var r,a=o(s),h=o(i);exports.PhysicsType=void 0,(r=exports.PhysicsType||(exports.PhysicsType={})).RECTANGLE="rectangle",r.CIRCLE="circle",r.POLYGON="polygon",r.TRAPEZOID="trapezoid",r.FROM_VERTICES="fromVertices",r.CAPSULE="capsule",r.COMPOUND="compound",r.EDGE="edge",r.CHAIN="chain";class c extends e.Component{static{this.componentName="Physics"}init(t){this.bodyParams=t}update(){this.body&&this.gameObject&&(this.gameObject.transform.anchor.x=0,this.gameObject.transform.anchor.y=0,this.gameObject.transform.position.x=this.body.position.x,this.gameObject.transform.position.y=this.body.position.y,this.bodyParams.stopRotation||(this.gameObject.transform.rotation=this.body.angle))}onDestroy(){a.default.World.remove(this.PhysicsEngine.world,this.body,!0)}}let d=!1;function p(){if(d)return;const t=h.default?.quickDecomp?h.default:h.default?.default;t?.quickDecomp&&a.default.Common.setDecomp(t),d=!0}class l{constructor(){this.Bodies=a.default.Bodies,p()}create(t){const{gameObject:e,bodyParams:s}=t,i=this.getCoordinate(e),n=s.position?s.position.x:i.x,o=s.position?s.position.y:i.y,r=e.transform.size.width*e.transform.scale.x,a=e.transform.size.height*e.transform.scale.y,h=Math.max(1,Math.min(r,a)/2),c=this.createShape(s,{x:n,y:o,transformWidth:r,transformHeight:a,defaultRadius:h},!1);if(!c)throw new Error(`[plugin-matterjs] Failed to create body for type ${String(s.type)}`);return c}createShape(t,e,s){const i=t.bodyOptions;switch(t.type){case exports.PhysicsType.RECTANGLE:{const s=t.width??e.transformWidth,n=t.height??e.transformHeight;return this.Bodies.rectangle(e.x,e.y,s,n,i)}case exports.PhysicsType.CIRCLE:{const s=t.radius??e.defaultRadius;return this.Bodies.circle(e.x,e.y,s,i)}case exports.PhysicsType.POLYGON:{const s=Math.max(3,t.sides??6),n=t.radius??e.defaultRadius;return this.Bodies.polygon(e.x,e.y,s,n,i)}case exports.PhysicsType.TRAPEZOID:{const s=t.width??e.transformWidth,n=t.height??e.transformHeight,o=Math.min(Math.max(t.slope??.5,0),.999);return this.Bodies.trapezoid(e.x,e.y,s,n,o,i)}case exports.PhysicsType.FROM_VERTICES:return this.createFromVertices(t,e,i);case exports.PhysicsType.CAPSULE:return this.createCapsule(t,e,i);case exports.PhysicsType.EDGE:return this.createEdge(t,e,i);case exports.PhysicsType.CHAIN:return this.createChain(t,e,i);case exports.PhysicsType.COMPOUND:if(s)throw new Error("[plugin-matterjs] Nested COMPOUND parts are not supported");return this.createCompound(t,e,i);default:throw new Error(`[plugin-matterjs] Unsupported PhysicsType: ${String(t.type)}`)}}createFromVertices(t,e,s){const i=t.vertexSets??(t.vertices?[t.vertices]:[]);if(!i.length||i.some(t=>!t||t.length<3))throw new Error("[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each");p();const n=this.Bodies.fromVertices(e.x,e.y,i,s,!0);if(!n)throw new Error("[plugin-matterjs] FROM_VERTICES produced an empty body");return n}createCapsule(t,e,s){const i=Math.max(1,t.radius??e.defaultRadius),n=Math.max(2*i,t.length??e.transformWidth)-2*i;if(n<.5)return this.Bodies.circle(e.x,e.y,i,s);const o=[this.Bodies.rectangle(e.x,e.y,n,2*i),this.Bodies.circle(e.x-n/2,e.y,i),this.Bodies.circle(e.x+n/2,e.y,i)];return a.default.Body.create({...s,parts:o})}createEdge(t,e,s){if(!t.from||!t.to)throw new Error("[plugin-matterjs] EDGE requires from and to");const i=e.x+t.from.x,n=e.y+t.from.y,o=e.x+t.to.x,r=e.y+t.to.y,a=o-i,h=r-n,c=Math.hypot(a,h);if(c<.5)throw new Error("[plugin-matterjs] EDGE from/to are too close");const d=Math.max(1,t.thickness??4),{angle:p,...l}=s??{};return this.Bodies.rectangle((i+o)/2,(n+r)/2,c,d,{...l,angle:Math.atan2(h,a)})}createChain(t,e,s){const i=t.vertices;if(!i||i.length<2)throw new Error("[plugin-matterjs] CHAIN requires vertices with at least 2 points");const n=Math.max(1,t.thickness??4),o=[];for(let t=0;t<i.length-1;t++){const s=i[t],r=i[t+1],a=e.x+s.x,h=e.y+s.y,c=e.x+r.x,d=e.y+r.y,p=c-a,l=d-h,u=Math.hypot(p,l);u<.5||o.push(this.Bodies.rectangle((a+c)/2,(h+d)/2,u,n,{angle:Math.atan2(l,p)}))}if(!o.length)throw new Error("[plugin-matterjs] CHAIN has no usable segments");return a.default.Body.create({...s,parts:o})}createCompound(t,e,s){const i=t.parts;if(!i?.length)throw new Error("[plugin-matterjs] COMPOUND requires a non-empty parts array");const n=[];for(let t=0;t<i.length;t++){const s=i[t],o=e.x+(s.position?.x??0),r=e.y+(s.position?.y??0),a=this.createShape(s,{...e,x:o,y:r},!0);n.push(...this.asParts(a))}if(!n.length)throw new Error("[plugin-matterjs] COMPOUND produced no parts");return a.default.Body.create({...s,parts:n})}asParts(t){return t.parts&&t.parts.length>1?t.parts.slice(1):[t]}getCoordinate(t){return{x:t.transform.position.x+t.transform.anchor.x*t.parent.transform.size.width,y:t.transform.position.y+t.transform.anchor.y*t.parent.transform.size.height}}}class u{constructor(t){this.app=null,this.graphics=null,this.opts=t,this.engine=t.engine,this.onAfterUpdate=()=>this.redraw()}async init(){const{canvas:t,width:e,height:s,resolution:i=1}=this.opts,o=new n.Application;await o.init({canvas:t,width:e,height:s,resolution:i,autoDensity:!0,antialias:!0,backgroundAlpha:.12,preference:"webgl"}),this.app=o,this.graphics=new n.Graphics,o.stage.addChild(this.graphics),a.default.Events.on(this.engine,"afterUpdate",this.onAfterUpdate)}redraw(){const t=this.graphics;if(!t)return;t.clear();const e=a.default.Composite.allBodies(this.engine.world);for(let s=0;s<e.length;s++){const i=e[s];if(!1===i.render?.visible)continue;const n=i.parts&&i.parts.length>1?i.parts.slice(1):[i];for(let e=0;e<n.length;e++){const s=n[e].vertices;if(!s?.length)continue;const i=s[0];t.moveTo(i.x,i.y);for(let e=1;e<s.length;e++)t.lineTo(s[e].x,s[e].y);t.closePath(),t.stroke({width:1,color:58998,alpha:.9})}}}destroy(){a.default.Events.off(this.engine,"afterUpdate",this.onAfterUpdate),this.app&&(this.app.destroy(!0,{children:!0,texture:!0}),this.app=null),this.graphics=null}}function m(t){let e=t;for(;e;){const t=e;if(t.component)return t.component;if(!e.parent||e.parent===e)break;e=e.parent}}class g{constructor(t,e){this.debugRenderer=null,this.enabled=!1,this.Engine=a.default.Engine,this.World=a.default.World,this.bodiesFactory=new l,this.Runner=a.default.Runner,this.Constraint=a.default.Constraint,this.game=t,this.collisionEvents=["collisionStart","collisionActive","collisionEnd"],this.bodyEvents=["tick","beforeUpdate","afterUpdate","beforeRender","afterRender","afterTick"],this.options=e,this.runner=this.Runner.create({delta:1e3/(this.options.fps||60),frameDeltaSmoothing:(this.options.deltaSampleSize??1)>1})}start(){this.engine=this.Engine.create();const t=this.World.create(this.options.world);if(this.engine.world=t,this.options.isTest){const t=!this.options.canvas,e=this.options.canvas??document.createElement("canvas");t&&this.options.element&&this.options.element.appendChild(e);const s=this.options.resolution||1;this.debugRenderer=new u({engine:this.engine,canvas:e,width:this.game.canvas.width/s,height:this.game.canvas.height/s,resolution:s}),this.debugRenderer.init().catch(t=>{console.error("[plugin-matterjs] MatterPixiDebugRenderer init failed",t)}),this.Runner.run(this.runner,this.engine)}this.enabled=!0,this.initMouse(),this.initCollisionEvents(),this.initBodyEvents()}update(t){this.engine&&(this.options.isTest||this.Runner.tick(this.runner,this.engine,t.currentTime))}stop(){this.enabled=!1,this.runner.enabled=!1}destroy(){this.debugRenderer?.destroy(),this.debugRenderer=null,this.engine&&(a.default.Runner.stop(this.runner),a.default.Engine.clear(this.engine))}awake(){this.enabled=!0,this.runner.enabled=!0}add(t){const e=this.createBodies(t);this.World.add(this.engine.world,[e]),this.linkComponent(t,e)}change(t){const e=this.createBodies(t);this.World.remove(this.engine.world,t.body,!0),this.World.add(this.engine.world,[e]),this.linkComponent(t,e)}remove(t){this.World.remove(this.engine.world,t.body,!0),t.body=void 0}createBodies(t){const e=this.bodiesFactory.create(t);if(!e)throw new Error("[plugin-matterjs] Failed to create Matter body");return e}linkComponent(t,e){t.body=e,t.Body=a.default.Body,t.PhysicsEngine=this.engine,t.Constraint=this.Constraint,t.mouseConstraint=this.mouseConstraint,t.World=this.World,e.component=t}initCollisionEvents(){this.collisionEvents.forEach(t=>{a.default.Events.on(this.engine,t,e=>{const s=e.pairs??[];for(let e=0;e<s.length;e++){const i=s[e],{bodyA:n,bodyB:o}=i,r=m(n),a=m(o);r&&a&&(r.emit(t,a.gameObject,r.gameObject),a.emit(t,r.gameObject,a.gameObject))}})})}initMouse(){if(this.options.mouse&&this.options.mouse.open){const t=a.default.Mouse.create(this.game.canvas);let e=this.options.mouse.constraint?{mouse:t,constraint:this.options.mouse.constraint}:{mouse:t};this.mouseConstraint=a.default.MouseConstraint.create(this.engine,e),this.World.add(this.engine.world,this.mouseConstraint)}}initBodyEvents(){this.bodyEvents.forEach(t=>{a.default.Events.on(this.engine,t,e=>{e.source.world.bodies.forEach(e=>{const s=e;s.component?.emit(t,e,s.component.gameObject)})})})}}let y=class extends e.System{static{this.systemName="PhysicsSystem"}init(t){this.engine=new g(this.game,t),this.game.canvas.setAttribute("data-pixel-ratio",t.resolution||"1")}awake(){}start(){this.engine.start()}update(t){const e=this.componentObserver.clear();for(const t of e)t&&this.componentChanged(t);this.engine.update(t)}componentChanged(t){if(t.component instanceof c)switch(t.type){case e.OBSERVER_TYPE.ADD:t.gameObject.transform.parent&&!t.gameObject.getComponent(c).body&&this.engine.add(t.component);break;case e.OBSERVER_TYPE.CHANGE:this.engine.change(t.component);case e.OBSERVER_TYPE.REMOVE:}else if(t.type===e.OBSERVER_TYPE.CHANGE)if(t.component.parent){let e=t.gameObject.getComponent(c);e&&!e.body&&this.engine.add(e)}else{let e=t.gameObject.getComponent(c);e&&this.engine.remove(e)}}lateUpdate(){}onResume(){this.engine.enabled||this.engine.awake()}onPause(){this.engine.stop()}onDestroy(){this.engine?.destroy()}};y=t.__decorate([e.decorators.componentObserver({Physics:[{prop:["bodyParams"],deep:!0}],Transform:["_parent"]})],y);var f=y;Object.assign(f,{packageName:"@combos-fun/plugin-matterjs",packageVersion:"0.0.47"}),exports.Physics=c,exports.PhysicsSystem=f;
|
|
@@ -554,7 +554,7 @@ var PhysicsSystem$1 = PhysicsSystem;
|
|
|
554
554
|
/** Auto-generated by scripts/build-package.mjs — do not edit. */
|
|
555
555
|
Object.assign(PhysicsSystem$1, {
|
|
556
556
|
packageName: "@combos-fun/plugin-matterjs",
|
|
557
|
-
packageVersion: "0.0.
|
|
557
|
+
packageVersion: "0.0.47",
|
|
558
558
|
});
|
|
559
559
|
|
|
560
560
|
export { Physics, PhysicsSystem$1 as PhysicsSystem, PhysicsType };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-matterjs.esm.js","sources":["../lib/Physics.ts","../lib/BodiesFactory.ts","../lib/MatterPixiDebugRenderer.ts","../lib/PhysicsEngine.ts","../lib/PhysicsSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport Matter from 'matter-js';\n\nexport enum PhysicsType {\n RECTANGLE = 'rectangle',\n CIRCLE = 'circle',\n POLYGON = 'polygon',\n TRAPEZOID = 'trapezoid',\n FROM_VERTICES = 'fromVertices',\n CAPSULE = 'capsule',\n COMPOUND = 'compound',\n EDGE = 'edge',\n CHAIN = 'chain',\n}\n\nexport interface PhysicsVertex {\n x: number\n y: number\n}\n\nexport interface PhysicsBodyOptions {\n isStatic?: boolean,\n restitution?: number,\n density?: number,\n [propName: string]: any,\n}\n\n/** One piece of a `COMPOUND` body. Nested `COMPOUND` is not allowed. */\nexport interface PhysicsPartParams {\n type: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n}\n\nexport interface PhysicsParams {\n type?: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n stopRotation?: boolean\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n parts?: PhysicsPartParams[]\n}\n\nexport class Physics extends Component<PhysicsParams> {\n static componentName: string = 'Physics';\n public bodyParams: PhysicsParams;\n public body: Matter.Body;\n private PhysicsEngine: Matter.Engine;\n\n init(params: PhysicsParams) {\n this.bodyParams = params;\n }\n\n update() {\n if (this.body && this.gameObject) {\n this.gameObject.transform.anchor.x = 0;\n this.gameObject.transform.anchor.y = 0;\n this.gameObject.transform.position.x = this.body.position.x;\n this.gameObject.transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n this.gameObject.transform.rotation = this.body.angle;\n }\n }\n }\n onDestroy() {\n Matter.World.remove(this.PhysicsEngine.world, this.body, true);\n }\n}\n","import Matter from 'matter-js';\nimport decomp from 'poly-decomp';\nimport { PhysicsType, Physics, PhysicsParams, PhysicsPartParams } from './Physics';\nimport { GameObject } from '@combos-fun/engine';\n\ntype ShapeParams = PhysicsParams | PhysicsPartParams;\n\ninterface ShapeContext {\n x: number\n y: number\n transformWidth: number\n transformHeight: number\n defaultRadius: number\n}\n\ninterface Vector2 {\n x: number\n y: number\n}\n\nconst DEFAULT_THICKNESS = 4;\nconst MIN_SEGMENT = 0.5;\n\nlet decompRegistered = false;\n\nfunction ensureDecomp() {\n if (decompRegistered) {\n return;\n }\n const lib = (decomp as any)?.quickDecomp ? decomp : (decomp as any)?.default;\n if (lib?.quickDecomp) {\n Matter.Common.setDecomp(lib);\n }\n decompRegistered = true;\n}\n\nexport default class BodiesFactory {\n private Bodies: typeof Matter.Bodies;\n constructor() {\n this.Bodies = Matter.Bodies;\n ensureDecomp();\n }\n\n public create(component: Physics): Matter.Body {\n const { gameObject, bodyParams } = component;\n const coordinate = this.getCoordinate(gameObject);\n const x = bodyParams.position ? bodyParams.position.x : coordinate.x;\n const y = bodyParams.position ? bodyParams.position.y : coordinate.y;\n const transformWidth =\n gameObject.transform.size.width * gameObject.transform.scale.x;\n const transformHeight =\n gameObject.transform.size.height * gameObject.transform.scale.y;\n /** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */\n const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);\n const body = this.createShape(bodyParams, {\n x,\n y,\n transformWidth,\n transformHeight,\n defaultRadius,\n }, false);\n if (!body) {\n throw new Error(\n `[plugin-matterjs] Failed to create body for type ${String(bodyParams.type)}`,\n );\n }\n return body;\n }\n\n private createShape(\n params: ShapeParams,\n ctx: ShapeContext,\n isPart: boolean,\n ): Matter.Body {\n const options = params.bodyOptions;\n switch (params.type) {\n case PhysicsType.RECTANGLE: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n return this.Bodies.rectangle(ctx.x, ctx.y, width, height, options);\n }\n case PhysicsType.CIRCLE: {\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n case PhysicsType.POLYGON: {\n const sides = Math.max(3, params.sides ?? 6);\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.polygon(ctx.x, ctx.y, sides, radius, options);\n }\n case PhysicsType.TRAPEZOID: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n const slope = Math.min(Math.max(params.slope ?? 0.5, 0), 0.999);\n return this.Bodies.trapezoid(ctx.x, ctx.y, width, height, slope, options);\n }\n case PhysicsType.FROM_VERTICES:\n return this.createFromVertices(params, ctx, options);\n case PhysicsType.CAPSULE:\n return this.createCapsule(params, ctx, options);\n case PhysicsType.EDGE:\n return this.createEdge(params, ctx, options);\n case PhysicsType.CHAIN:\n return this.createChain(params, ctx, options);\n case PhysicsType.COMPOUND:\n if (isPart) {\n throw new Error('[plugin-matterjs] Nested COMPOUND parts are not supported');\n }\n return this.createCompound(params, ctx, options);\n default:\n throw new Error(\n `[plugin-matterjs] Unsupported PhysicsType: ${String(params.type)}`,\n );\n }\n }\n\n private createFromVertices(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const sets = params.vertexSets ?? (params.vertices ? [params.vertices] : []);\n if (!sets.length || sets.some(set => !set || set.length < 3)) {\n throw new Error(\n '[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each',\n );\n }\n ensureDecomp();\n const body = this.Bodies.fromVertices(\n ctx.x,\n ctx.y,\n sets as Matter.Vector[][],\n options,\n true,\n );\n if (!body) {\n throw new Error('[plugin-matterjs] FROM_VERTICES produced an empty body');\n }\n return body;\n }\n\n private createCapsule(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const radius = Math.max(1, params.radius ?? ctx.defaultRadius);\n const length = Math.max(radius * 2, params.length ?? ctx.transformWidth);\n const shaft = length - radius * 2;\n if (shaft < MIN_SEGMENT) {\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n const parts = [\n this.Bodies.rectangle(ctx.x, ctx.y, shaft, radius * 2),\n this.Bodies.circle(ctx.x - shaft / 2, ctx.y, radius),\n this.Bodies.circle(ctx.x + shaft / 2, ctx.y, radius),\n ];\n return Matter.Body.create({ ...options, parts });\n }\n\n private createEdge(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n if (!params.from || !params.to) {\n throw new Error('[plugin-matterjs] EDGE requires from and to');\n }\n const x1 = ctx.x + params.from.x;\n const y1 = ctx.y + params.from.y;\n const x2 = ctx.x + params.to.x;\n const y2 = ctx.y + params.to.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n throw new Error('[plugin-matterjs] EDGE from/to are too close');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const { angle: _ignored, ...rest } = options ?? {};\n return this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, {\n ...rest,\n angle: Math.atan2(dy, dx),\n });\n }\n\n private createChain(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const verts = params.vertices;\n if (!verts || verts.length < 2) {\n throw new Error('[plugin-matterjs] CHAIN requires vertices with at least 2 points');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const parts: Matter.Body[] = [];\n for (let i = 0; i < verts.length - 1; i++) {\n const a = verts[i];\n const b = verts[i + 1];\n const x1 = ctx.x + a.x;\n const y1 = ctx.y + a.y;\n const x2 = ctx.x + b.x;\n const y2 = ctx.y + b.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n continue;\n }\n parts.push(this.Bodies.rectangle(\n (x1 + x2) / 2,\n (y1 + y2) / 2,\n len,\n thickness,\n { angle: Math.atan2(dy, dx) },\n ));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] CHAIN has no usable segments');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n private createCompound(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const partParams = (params as PhysicsParams).parts;\n if (!partParams?.length) {\n throw new Error('[plugin-matterjs] COMPOUND requires a non-empty parts array');\n }\n const parts: Matter.Body[] = [];\n for (let i = 0; i < partParams.length; i++) {\n const part = partParams[i];\n const ox = ctx.x + (part.position?.x ?? 0);\n const oy = ctx.y + (part.position?.y ?? 0);\n const partBody = this.createShape(part, { ...ctx, x: ox, y: oy }, true);\n parts.push(...this.asParts(partBody));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] COMPOUND produced no parts');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n /** Unwrap a compound wrapper so it can be merged into another parent. */\n private asParts(body: Matter.Body): Matter.Body[] {\n if (body.parts && body.parts.length > 1) {\n return body.parts.slice(1);\n }\n return [body];\n }\n\n private getCoordinate(gameObject: GameObject): Vector2 {\n const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;\n const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;\n return {\n x,\n y,\n };\n }\n}\n","import Matter from 'matter-js';\nimport { Application, Graphics } from 'pixi.js';\n\nexport interface MatterPixiDebugOptions {\n engine: Matter.Engine;\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n resolution?: number;\n}\n\n/** WebGL wireframe overlay for Matter bodies in test mode. */\nexport class MatterPixiDebugRenderer {\n private readonly engine: Matter.Engine;\n private readonly opts: MatterPixiDebugOptions;\n private app: Application | null = null;\n private graphics: Graphics | null = null;\n private readonly onAfterUpdate: () => void;\n\n constructor(opts: MatterPixiDebugOptions) {\n this.opts = opts;\n this.engine = opts.engine;\n this.onAfterUpdate = () => this.redraw();\n }\n\n async init(): Promise<void> {\n const { canvas, width, height, resolution = 1 } = this.opts;\n const app = new Application();\n await app.init({\n canvas,\n width,\n height,\n resolution,\n autoDensity: true,\n antialias: true,\n backgroundAlpha: 0.12,\n preference: 'webgl',\n });\n this.app = app;\n this.graphics = new Graphics();\n app.stage.addChild(this.graphics);\n Matter.Events.on(this.engine, 'afterUpdate', this.onAfterUpdate);\n }\n\n private redraw(): void {\n const g = this.graphics;\n if (!g) {\n return;\n }\n g.clear();\n const bodies = Matter.Composite.allBodies(this.engine.world);\n for (let b = 0; b < bodies.length; b++) {\n const body = bodies[b];\n if (body.render?.visible === false) {\n continue;\n }\n const pieces = body.parts && body.parts.length > 1 ? body.parts.slice(1) : [body];\n for (let p = 0; p < pieces.length; p++) {\n const verts = pieces[p].vertices;\n if (!verts?.length) {\n continue;\n }\n const v0 = verts[0];\n g.moveTo(v0.x, v0.y);\n for (let i = 1; i < verts.length; i++) {\n g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });\n }\n }\n }\n\n destroy(): void {\n Matter.Events.off(this.engine, 'afterUpdate', this.onAfterUpdate);\n if (this.app) {\n this.app.destroy(true, { children: true, texture: true });\n this.app = null;\n }\n this.graphics = null;\n }\n}\n","import Matter from 'matter-js';\n\nimport BodiesFactory from './BodiesFactory';\nimport { Game } from '@combos-fun/engine';\nimport type { PhysicsSystemParams } from './PhysicsSystem';\nimport type { Physics } from './Physics';\nimport { MatterPixiDebugRenderer } from './MatterPixiDebugRenderer';\n\nexport interface PhysicsLinkedBody extends Matter.Body {\n component: Physics;\n}\n\n/** Collision pairs often report a compound part, not the parent body. */\nfunction resolveLinkedComponent(body: Matter.Body): Physics | undefined {\n let current: Matter.Body | undefined = body;\n while (current) {\n const linked = current as PhysicsLinkedBody;\n if (linked.component) {\n return linked.component;\n }\n if (!current.parent || current.parent === current) {\n break;\n }\n current = current.parent;\n }\n return undefined;\n}\n\nexport default class PhysicsEngine {\n private Engine: typeof Matter.Engine;\n private World: typeof Matter.World;\n private engine: Matter.Engine;\n private bodiesFactory: BodiesFactory;\n private collisionEvents: string[];\n private bodyEvents: string[];\n private options: PhysicsSystemParams;\n private game: Game;\n private Runner: typeof Matter.Runner;\n private Constraint: typeof Matter.Constraint;\n private mouseConstraint: Matter.MouseConstraint;\n private runner: Matter.Runner;\n private debugRenderer: MatterPixiDebugRenderer | null = null;\n public enabled: boolean = false;\n constructor(game: Game, options: PhysicsSystemParams) {\n this.Engine = Matter.Engine;\n this.World = Matter.World;\n this.bodiesFactory = new BodiesFactory();\n this.Runner = Matter.Runner;\n this.Constraint = Matter.Constraint;\n this.game = game;\n\n this.collisionEvents = ['collisionStart', 'collisionActive', 'collisionEnd'];\n this.bodyEvents = ['tick', 'beforeUpdate', 'afterUpdate', 'beforeRender', 'afterRender', 'afterTick'];\n this.options = options;\n this.runner = this.Runner.create({\n delta: 1000 / (this.options.fps || 60),\n frameDeltaSmoothing: (this.options.deltaSampleSize ?? 1) > 1,\n });\n }\n\n public start() {\n this.engine = this.Engine.create();\n const world = this.World.create(this.options.world as Matter.IWorldDefinition);\n this.engine.world = world;\n if (this.options.isTest) {\n const ownCanvas = !this.options.canvas;\n const canvas = this.options.canvas ?? document.createElement('canvas');\n if (ownCanvas && this.options.element) {\n this.options.element.appendChild(canvas);\n }\n const resolution = this.options.resolution || 1;\n this.debugRenderer = new MatterPixiDebugRenderer({\n engine: this.engine,\n canvas,\n width: this.game.canvas.width / resolution,\n height: this.game.canvas.height / resolution,\n resolution,\n });\n void this.debugRenderer.init().catch(err => {\n console.error('[plugin-matterjs] MatterPixiDebugRenderer init failed', err);\n });\n this.Runner.run(this.runner, this.engine);\n }\n this.enabled = true;\n this.initMouse();\n this.initCollisionEvents();\n this.initBodyEvents();\n }\n\n public update(e) {\n if (!this.engine) {\n return;\n }\n if (!this.options.isTest) {\n this.Runner.tick(this.runner, this.engine, e.currentTime);\n }\n }\n\n public stop() {\n this.enabled = false;\n this.runner.enabled = false;\n }\n\n public destroy() {\n this.debugRenderer?.destroy();\n this.debugRenderer = null;\n if (this.engine) {\n Matter.Runner.stop(this.runner);\n Matter.Engine.clear(this.engine);\n }\n }\n\n public awake() {\n this.enabled = true;\n this.runner.enabled = true;\n }\n public add(component) {\n const body = this.createBodies(component);\n this.World.add(this.engine.world, [body]);\n this.linkComponent(component, body);\n }\n\n public change(component: Physics) {\n const newBody = this.createBodies(component);\n this.World.remove(this.engine.world, component.body, true);\n this.World.add(this.engine.world, [newBody]);\n this.linkComponent(component, newBody);\n }\n public remove(component: Physics) {\n this.World.remove(this.engine.world, component.body, true);\n component.body = undefined;\n }\n\n private createBodies(params): PhysicsLinkedBody {\n const body = this.bodiesFactory.create(params) as PhysicsLinkedBody;\n if (!body) {\n throw new Error('[plugin-matterjs] Failed to create Matter body');\n }\n return body;\n }\n\n private linkComponent(component, body: PhysicsLinkedBody) {\n component.body = body;\n component.Body = Matter.Body;\n component.PhysicsEngine = this.engine;\n component.Constraint = this.Constraint;\n component.mouseConstraint = this.mouseConstraint;\n component.World = this.World;\n body.component = component;\n }\n\n private initCollisionEvents() {\n (this.collisionEvents as Array<'collisionStart' | 'collisionActive' | 'collisionEnd'>).forEach(eventName => {\n Matter.Events.on(this.engine, eventName, (event: Matter.IEventCollision<Matter.Engine>) => {\n const pairs = event.pairs ?? [];\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n const { bodyA, bodyB } = pair;\n const componentA = resolveLinkedComponent(bodyA);\n const componentB = resolveLinkedComponent(bodyB);\n if (!componentA || !componentB) {\n continue;\n }\n componentA.emit(eventName, componentB.gameObject, componentA.gameObject);\n componentB.emit(eventName, componentA.gameObject, componentB.gameObject);\n }\n });\n });\n }\n\n private initMouse() {\n if (this.options.mouse && this.options.mouse.open) {\n const mouse = Matter.Mouse.create(this.game.canvas);\n let options = this.options.mouse.constraint ? {\n mouse,\n constraint: this.options.mouse.constraint\n } : {\n mouse\n };\n this.mouseConstraint = Matter.MouseConstraint.create(this.engine, options);\n this.World.add(this.engine.world, this.mouseConstraint);\n }\n }\n\n private initBodyEvents() {\n this.bodyEvents.forEach(eventName => {\n Matter.Events.on(this.engine, eventName, e => {\n const bodies = e.source.world.bodies;\n bodies.forEach(body => {\n const linked = body as PhysicsLinkedBody;\n linked.component?.emit(eventName, body, linked.component.gameObject);\n });\n });\n });\n }\n}\n","import { System, decorators, OBSERVER_TYPE, Transform } from '@combos-fun/engine';\nimport type { ComponentChanged } from \"@combos-fun/engine\";\nimport PhysicsEngine from './PhysicsEngine';\nimport { Physics } from './Physics';\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Object ? DeepPartial<T[P]> : T[P];\n}\n\nexport interface PhysicsSystemParams {\n resolution?: number\n fps?: number\n isTest?: boolean\n element?: HTMLElement\n canvas?: HTMLCanvasElement\n deltaSampleSize?: number\n mouse?: {\n open: boolean\n constraint?: Matter.Constraint\n }\n world: DeepPartial<Matter.IWorldDefinition>\n}\n\n@decorators.componentObserver({\n Physics: [{ prop: ['bodyParams'], deep: true }],\n Transform: ['_parent'],\n})\nexport default class PhysicsSystem extends System<PhysicsSystemParams> {\n static systemName = 'PhysicsSystem';\n private engine: PhysicsEngine;\n\n /**\n * System init: configure params before the game starts.\n * @param param init params\n */\n init(param?: PhysicsSystemParams) {\n this.engine = new PhysicsEngine(this.game, param);\n this.game.canvas.setAttribute('data-pixel-ratio', (param.resolution || '1') as string);\n }\n /**\n * Called when the System is installed; if the game has not started, it runs when the\n * game starts. Use it for setup work such as initializing data.\n */\n awake() { }\n\n /**\n * Called after the System is installed and all systems' `awake` have run.\n */\n start() {\n this.engine.start();\n }\n /**\n * Called on every game loop; can perform operations and change component properties.\n */\n update(e) {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n if (changed) {\n this.componentChanged(changed);\n }\n }\n this.engine.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.component instanceof Physics) {\n switch (changed.type) {\n case OBSERVER_TYPE.ADD: {\n if (changed.gameObject.transform.parent && !changed.gameObject.getComponent(Physics).body) {\n this.engine.add(changed.component);\n }\n break;\n }\n case OBSERVER_TYPE.CHANGE: {\n this.engine.change(changed.component);\n break;\n }\n case OBSERVER_TYPE.REMOVE: {\n break;\n }\n }\n } else {\n switch (changed.type) {\n case OBSERVER_TYPE.CHANGE: {\n if ((changed.component as Transform).parent) {\n let physics = changed.gameObject.getComponent(Physics);\n if (physics && !physics.body) {\n this.engine.add(physics);\n }\n } else {\n let physics = changed.gameObject.getComponent(Physics);\n physics && this.engine.remove(physics);\n }\n }\n }\n }\n }\n /**\n * Like `update`, but called after every System's and component's `update` has run.\n */\n lateUpdate() { }\n /**\n * Called when the game starts or resumes playing after a pause.\n */\n onResume() {\n if (!this.engine.enabled) {\n this.engine.awake();\n }\n }\n /**\n * Called when the game is paused.\n */\n onPause() {\n this.engine.stop();\n }\n /**\n * Called when the system is destroyed.\n */\n onDestroy() {\n this.engine?.destroy();\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport PhysicsSystem from './PhysicsSystem';\n\nObject.assign(PhysicsSystem, {\n packageName: \"@combos-fun/plugin-matterjs\",\n packageVersion: \"0.0.45\",\n});\n"],"names":["PhysicsSystem"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin-matterjs.esm.js","sources":["../lib/Physics.ts","../lib/BodiesFactory.ts","../lib/MatterPixiDebugRenderer.ts","../lib/PhysicsEngine.ts","../lib/PhysicsSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport Matter from 'matter-js';\n\nexport enum PhysicsType {\n RECTANGLE = 'rectangle',\n CIRCLE = 'circle',\n POLYGON = 'polygon',\n TRAPEZOID = 'trapezoid',\n FROM_VERTICES = 'fromVertices',\n CAPSULE = 'capsule',\n COMPOUND = 'compound',\n EDGE = 'edge',\n CHAIN = 'chain',\n}\n\nexport interface PhysicsVertex {\n x: number\n y: number\n}\n\nexport interface PhysicsBodyOptions {\n isStatic?: boolean,\n restitution?: number,\n density?: number,\n [propName: string]: any,\n}\n\n/** One piece of a `COMPOUND` body. Nested `COMPOUND` is not allowed. */\nexport interface PhysicsPartParams {\n type: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n}\n\nexport interface PhysicsParams {\n type?: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n stopRotation?: boolean\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n parts?: PhysicsPartParams[]\n}\n\nexport class Physics extends Component<PhysicsParams> {\n static componentName: string = 'Physics';\n public bodyParams: PhysicsParams;\n public body: Matter.Body;\n private PhysicsEngine: Matter.Engine;\n\n init(params: PhysicsParams) {\n this.bodyParams = params;\n }\n\n update() {\n if (this.body && this.gameObject) {\n this.gameObject.transform.anchor.x = 0;\n this.gameObject.transform.anchor.y = 0;\n this.gameObject.transform.position.x = this.body.position.x;\n this.gameObject.transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n this.gameObject.transform.rotation = this.body.angle;\n }\n }\n }\n onDestroy() {\n Matter.World.remove(this.PhysicsEngine.world, this.body, true);\n }\n}\n","import Matter from 'matter-js';\nimport decomp from 'poly-decomp';\nimport { PhysicsType, Physics, PhysicsParams, PhysicsPartParams } from './Physics';\nimport { GameObject } from '@combos-fun/engine';\n\ntype ShapeParams = PhysicsParams | PhysicsPartParams;\n\ninterface ShapeContext {\n x: number\n y: number\n transformWidth: number\n transformHeight: number\n defaultRadius: number\n}\n\ninterface Vector2 {\n x: number\n y: number\n}\n\nconst DEFAULT_THICKNESS = 4;\nconst MIN_SEGMENT = 0.5;\n\nlet decompRegistered = false;\n\nfunction ensureDecomp() {\n if (decompRegistered) {\n return;\n }\n const lib = (decomp as any)?.quickDecomp ? decomp : (decomp as any)?.default;\n if (lib?.quickDecomp) {\n Matter.Common.setDecomp(lib);\n }\n decompRegistered = true;\n}\n\nexport default class BodiesFactory {\n private Bodies: typeof Matter.Bodies;\n constructor() {\n this.Bodies = Matter.Bodies;\n ensureDecomp();\n }\n\n public create(component: Physics): Matter.Body {\n const { gameObject, bodyParams } = component;\n const coordinate = this.getCoordinate(gameObject);\n const x = bodyParams.position ? bodyParams.position.x : coordinate.x;\n const y = bodyParams.position ? bodyParams.position.y : coordinate.y;\n const transformWidth =\n gameObject.transform.size.width * gameObject.transform.scale.x;\n const transformHeight =\n gameObject.transform.size.height * gameObject.transform.scale.y;\n /** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */\n const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);\n const body = this.createShape(bodyParams, {\n x,\n y,\n transformWidth,\n transformHeight,\n defaultRadius,\n }, false);\n if (!body) {\n throw new Error(\n `[plugin-matterjs] Failed to create body for type ${String(bodyParams.type)}`,\n );\n }\n return body;\n }\n\n private createShape(\n params: ShapeParams,\n ctx: ShapeContext,\n isPart: boolean,\n ): Matter.Body {\n const options = params.bodyOptions;\n switch (params.type) {\n case PhysicsType.RECTANGLE: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n return this.Bodies.rectangle(ctx.x, ctx.y, width, height, options);\n }\n case PhysicsType.CIRCLE: {\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n case PhysicsType.POLYGON: {\n const sides = Math.max(3, params.sides ?? 6);\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.polygon(ctx.x, ctx.y, sides, radius, options);\n }\n case PhysicsType.TRAPEZOID: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n const slope = Math.min(Math.max(params.slope ?? 0.5, 0), 0.999);\n return this.Bodies.trapezoid(ctx.x, ctx.y, width, height, slope, options);\n }\n case PhysicsType.FROM_VERTICES:\n return this.createFromVertices(params, ctx, options);\n case PhysicsType.CAPSULE:\n return this.createCapsule(params, ctx, options);\n case PhysicsType.EDGE:\n return this.createEdge(params, ctx, options);\n case PhysicsType.CHAIN:\n return this.createChain(params, ctx, options);\n case PhysicsType.COMPOUND:\n if (isPart) {\n throw new Error('[plugin-matterjs] Nested COMPOUND parts are not supported');\n }\n return this.createCompound(params, ctx, options);\n default:\n throw new Error(\n `[plugin-matterjs] Unsupported PhysicsType: ${String(params.type)}`,\n );\n }\n }\n\n private createFromVertices(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const sets = params.vertexSets ?? (params.vertices ? [params.vertices] : []);\n if (!sets.length || sets.some(set => !set || set.length < 3)) {\n throw new Error(\n '[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each',\n );\n }\n ensureDecomp();\n const body = this.Bodies.fromVertices(\n ctx.x,\n ctx.y,\n sets as Matter.Vector[][],\n options,\n true,\n );\n if (!body) {\n throw new Error('[plugin-matterjs] FROM_VERTICES produced an empty body');\n }\n return body;\n }\n\n private createCapsule(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const radius = Math.max(1, params.radius ?? ctx.defaultRadius);\n const length = Math.max(radius * 2, params.length ?? ctx.transformWidth);\n const shaft = length - radius * 2;\n if (shaft < MIN_SEGMENT) {\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n const parts = [\n this.Bodies.rectangle(ctx.x, ctx.y, shaft, radius * 2),\n this.Bodies.circle(ctx.x - shaft / 2, ctx.y, radius),\n this.Bodies.circle(ctx.x + shaft / 2, ctx.y, radius),\n ];\n return Matter.Body.create({ ...options, parts });\n }\n\n private createEdge(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n if (!params.from || !params.to) {\n throw new Error('[plugin-matterjs] EDGE requires from and to');\n }\n const x1 = ctx.x + params.from.x;\n const y1 = ctx.y + params.from.y;\n const x2 = ctx.x + params.to.x;\n const y2 = ctx.y + params.to.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n throw new Error('[plugin-matterjs] EDGE from/to are too close');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const { angle: _ignored, ...rest } = options ?? {};\n return this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, {\n ...rest,\n angle: Math.atan2(dy, dx),\n });\n }\n\n private createChain(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const verts = params.vertices;\n if (!verts || verts.length < 2) {\n throw new Error('[plugin-matterjs] CHAIN requires vertices with at least 2 points');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const parts: Matter.Body[] = [];\n for (let i = 0; i < verts.length - 1; i++) {\n const a = verts[i];\n const b = verts[i + 1];\n const x1 = ctx.x + a.x;\n const y1 = ctx.y + a.y;\n const x2 = ctx.x + b.x;\n const y2 = ctx.y + b.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n continue;\n }\n parts.push(this.Bodies.rectangle(\n (x1 + x2) / 2,\n (y1 + y2) / 2,\n len,\n thickness,\n { angle: Math.atan2(dy, dx) },\n ));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] CHAIN has no usable segments');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n private createCompound(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const partParams = (params as PhysicsParams).parts;\n if (!partParams?.length) {\n throw new Error('[plugin-matterjs] COMPOUND requires a non-empty parts array');\n }\n const parts: Matter.Body[] = [];\n for (let i = 0; i < partParams.length; i++) {\n const part = partParams[i];\n const ox = ctx.x + (part.position?.x ?? 0);\n const oy = ctx.y + (part.position?.y ?? 0);\n const partBody = this.createShape(part, { ...ctx, x: ox, y: oy }, true);\n parts.push(...this.asParts(partBody));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] COMPOUND produced no parts');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n /** Unwrap a compound wrapper so it can be merged into another parent. */\n private asParts(body: Matter.Body): Matter.Body[] {\n if (body.parts && body.parts.length > 1) {\n return body.parts.slice(1);\n }\n return [body];\n }\n\n private getCoordinate(gameObject: GameObject): Vector2 {\n const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;\n const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;\n return {\n x,\n y,\n };\n }\n}\n","import Matter from 'matter-js';\nimport { Application, Graphics } from 'pixi.js';\n\nexport interface MatterPixiDebugOptions {\n engine: Matter.Engine;\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n resolution?: number;\n}\n\n/** WebGL wireframe overlay for Matter bodies in test mode. */\nexport class MatterPixiDebugRenderer {\n private readonly engine: Matter.Engine;\n private readonly opts: MatterPixiDebugOptions;\n private app: Application | null = null;\n private graphics: Graphics | null = null;\n private readonly onAfterUpdate: () => void;\n\n constructor(opts: MatterPixiDebugOptions) {\n this.opts = opts;\n this.engine = opts.engine;\n this.onAfterUpdate = () => this.redraw();\n }\n\n async init(): Promise<void> {\n const { canvas, width, height, resolution = 1 } = this.opts;\n const app = new Application();\n await app.init({\n canvas,\n width,\n height,\n resolution,\n autoDensity: true,\n antialias: true,\n backgroundAlpha: 0.12,\n preference: 'webgl',\n });\n this.app = app;\n this.graphics = new Graphics();\n app.stage.addChild(this.graphics);\n Matter.Events.on(this.engine, 'afterUpdate', this.onAfterUpdate);\n }\n\n private redraw(): void {\n const g = this.graphics;\n if (!g) {\n return;\n }\n g.clear();\n const bodies = Matter.Composite.allBodies(this.engine.world);\n for (let b = 0; b < bodies.length; b++) {\n const body = bodies[b];\n if (body.render?.visible === false) {\n continue;\n }\n const pieces = body.parts && body.parts.length > 1 ? body.parts.slice(1) : [body];\n for (let p = 0; p < pieces.length; p++) {\n const verts = pieces[p].vertices;\n if (!verts?.length) {\n continue;\n }\n const v0 = verts[0];\n g.moveTo(v0.x, v0.y);\n for (let i = 1; i < verts.length; i++) {\n g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });\n }\n }\n }\n\n destroy(): void {\n Matter.Events.off(this.engine, 'afterUpdate', this.onAfterUpdate);\n if (this.app) {\n this.app.destroy(true, { children: true, texture: true });\n this.app = null;\n }\n this.graphics = null;\n }\n}\n","import Matter from 'matter-js';\n\nimport BodiesFactory from './BodiesFactory';\nimport { Game } from '@combos-fun/engine';\nimport type { PhysicsSystemParams } from './PhysicsSystem';\nimport type { Physics } from './Physics';\nimport { MatterPixiDebugRenderer } from './MatterPixiDebugRenderer';\n\nexport interface PhysicsLinkedBody extends Matter.Body {\n component: Physics;\n}\n\n/** Collision pairs often report a compound part, not the parent body. */\nfunction resolveLinkedComponent(body: Matter.Body): Physics | undefined {\n let current: Matter.Body | undefined = body;\n while (current) {\n const linked = current as PhysicsLinkedBody;\n if (linked.component) {\n return linked.component;\n }\n if (!current.parent || current.parent === current) {\n break;\n }\n current = current.parent;\n }\n return undefined;\n}\n\nexport default class PhysicsEngine {\n private Engine: typeof Matter.Engine;\n private World: typeof Matter.World;\n private engine: Matter.Engine;\n private bodiesFactory: BodiesFactory;\n private collisionEvents: string[];\n private bodyEvents: string[];\n private options: PhysicsSystemParams;\n private game: Game;\n private Runner: typeof Matter.Runner;\n private Constraint: typeof Matter.Constraint;\n private mouseConstraint: Matter.MouseConstraint;\n private runner: Matter.Runner;\n private debugRenderer: MatterPixiDebugRenderer | null = null;\n public enabled: boolean = false;\n constructor(game: Game, options: PhysicsSystemParams) {\n this.Engine = Matter.Engine;\n this.World = Matter.World;\n this.bodiesFactory = new BodiesFactory();\n this.Runner = Matter.Runner;\n this.Constraint = Matter.Constraint;\n this.game = game;\n\n this.collisionEvents = ['collisionStart', 'collisionActive', 'collisionEnd'];\n this.bodyEvents = ['tick', 'beforeUpdate', 'afterUpdate', 'beforeRender', 'afterRender', 'afterTick'];\n this.options = options;\n this.runner = this.Runner.create({\n delta: 1000 / (this.options.fps || 60),\n frameDeltaSmoothing: (this.options.deltaSampleSize ?? 1) > 1,\n });\n }\n\n public start() {\n this.engine = this.Engine.create();\n const world = this.World.create(this.options.world as Matter.IWorldDefinition);\n this.engine.world = world;\n if (this.options.isTest) {\n const ownCanvas = !this.options.canvas;\n const canvas = this.options.canvas ?? document.createElement('canvas');\n if (ownCanvas && this.options.element) {\n this.options.element.appendChild(canvas);\n }\n const resolution = this.options.resolution || 1;\n this.debugRenderer = new MatterPixiDebugRenderer({\n engine: this.engine,\n canvas,\n width: this.game.canvas.width / resolution,\n height: this.game.canvas.height / resolution,\n resolution,\n });\n void this.debugRenderer.init().catch(err => {\n console.error('[plugin-matterjs] MatterPixiDebugRenderer init failed', err);\n });\n this.Runner.run(this.runner, this.engine);\n }\n this.enabled = true;\n this.initMouse();\n this.initCollisionEvents();\n this.initBodyEvents();\n }\n\n public update(e) {\n if (!this.engine) {\n return;\n }\n if (!this.options.isTest) {\n this.Runner.tick(this.runner, this.engine, e.currentTime);\n }\n }\n\n public stop() {\n this.enabled = false;\n this.runner.enabled = false;\n }\n\n public destroy() {\n this.debugRenderer?.destroy();\n this.debugRenderer = null;\n if (this.engine) {\n Matter.Runner.stop(this.runner);\n Matter.Engine.clear(this.engine);\n }\n }\n\n public awake() {\n this.enabled = true;\n this.runner.enabled = true;\n }\n public add(component) {\n const body = this.createBodies(component);\n this.World.add(this.engine.world, [body]);\n this.linkComponent(component, body);\n }\n\n public change(component: Physics) {\n const newBody = this.createBodies(component);\n this.World.remove(this.engine.world, component.body, true);\n this.World.add(this.engine.world, [newBody]);\n this.linkComponent(component, newBody);\n }\n public remove(component: Physics) {\n this.World.remove(this.engine.world, component.body, true);\n component.body = undefined;\n }\n\n private createBodies(params): PhysicsLinkedBody {\n const body = this.bodiesFactory.create(params) as PhysicsLinkedBody;\n if (!body) {\n throw new Error('[plugin-matterjs] Failed to create Matter body');\n }\n return body;\n }\n\n private linkComponent(component, body: PhysicsLinkedBody) {\n component.body = body;\n component.Body = Matter.Body;\n component.PhysicsEngine = this.engine;\n component.Constraint = this.Constraint;\n component.mouseConstraint = this.mouseConstraint;\n component.World = this.World;\n body.component = component;\n }\n\n private initCollisionEvents() {\n (this.collisionEvents as Array<'collisionStart' | 'collisionActive' | 'collisionEnd'>).forEach(eventName => {\n Matter.Events.on(this.engine, eventName, (event: Matter.IEventCollision<Matter.Engine>) => {\n const pairs = event.pairs ?? [];\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n const { bodyA, bodyB } = pair;\n const componentA = resolveLinkedComponent(bodyA);\n const componentB = resolveLinkedComponent(bodyB);\n if (!componentA || !componentB) {\n continue;\n }\n componentA.emit(eventName, componentB.gameObject, componentA.gameObject);\n componentB.emit(eventName, componentA.gameObject, componentB.gameObject);\n }\n });\n });\n }\n\n private initMouse() {\n if (this.options.mouse && this.options.mouse.open) {\n const mouse = Matter.Mouse.create(this.game.canvas);\n let options = this.options.mouse.constraint ? {\n mouse,\n constraint: this.options.mouse.constraint\n } : {\n mouse\n };\n this.mouseConstraint = Matter.MouseConstraint.create(this.engine, options);\n this.World.add(this.engine.world, this.mouseConstraint);\n }\n }\n\n private initBodyEvents() {\n this.bodyEvents.forEach(eventName => {\n Matter.Events.on(this.engine, eventName, e => {\n const bodies = e.source.world.bodies;\n bodies.forEach(body => {\n const linked = body as PhysicsLinkedBody;\n linked.component?.emit(eventName, body, linked.component.gameObject);\n });\n });\n });\n }\n}\n","import { System, decorators, OBSERVER_TYPE, Transform } from '@combos-fun/engine';\nimport type { ComponentChanged } from \"@combos-fun/engine\";\nimport PhysicsEngine from './PhysicsEngine';\nimport { Physics } from './Physics';\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Object ? DeepPartial<T[P]> : T[P];\n}\n\nexport interface PhysicsSystemParams {\n resolution?: number\n fps?: number\n isTest?: boolean\n element?: HTMLElement\n canvas?: HTMLCanvasElement\n deltaSampleSize?: number\n mouse?: {\n open: boolean\n constraint?: Matter.Constraint\n }\n world: DeepPartial<Matter.IWorldDefinition>\n}\n\n@decorators.componentObserver({\n Physics: [{ prop: ['bodyParams'], deep: true }],\n Transform: ['_parent'],\n})\nexport default class PhysicsSystem extends System<PhysicsSystemParams> {\n static systemName = 'PhysicsSystem';\n private engine: PhysicsEngine;\n\n /**\n * System init: configure params before the game starts.\n * @param param init params\n */\n init(param?: PhysicsSystemParams) {\n this.engine = new PhysicsEngine(this.game, param);\n this.game.canvas.setAttribute('data-pixel-ratio', (param.resolution || '1') as string);\n }\n /**\n * Called when the System is installed; if the game has not started, it runs when the\n * game starts. Use it for setup work such as initializing data.\n */\n awake() { }\n\n /**\n * Called after the System is installed and all systems' `awake` have run.\n */\n start() {\n this.engine.start();\n }\n /**\n * Called on every game loop; can perform operations and change component properties.\n */\n update(e) {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n if (changed) {\n this.componentChanged(changed);\n }\n }\n this.engine.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.component instanceof Physics) {\n switch (changed.type) {\n case OBSERVER_TYPE.ADD: {\n if (changed.gameObject.transform.parent && !changed.gameObject.getComponent(Physics).body) {\n this.engine.add(changed.component);\n }\n break;\n }\n case OBSERVER_TYPE.CHANGE: {\n this.engine.change(changed.component);\n break;\n }\n case OBSERVER_TYPE.REMOVE: {\n break;\n }\n }\n } else {\n switch (changed.type) {\n case OBSERVER_TYPE.CHANGE: {\n if ((changed.component as Transform).parent) {\n let physics = changed.gameObject.getComponent(Physics);\n if (physics && !physics.body) {\n this.engine.add(physics);\n }\n } else {\n let physics = changed.gameObject.getComponent(Physics);\n physics && this.engine.remove(physics);\n }\n }\n }\n }\n }\n /**\n * Like `update`, but called after every System's and component's `update` has run.\n */\n lateUpdate() { }\n /**\n * Called when the game starts or resumes playing after a pause.\n */\n onResume() {\n if (!this.engine.enabled) {\n this.engine.awake();\n }\n }\n /**\n * Called when the game is paused.\n */\n onPause() {\n this.engine.stop();\n }\n /**\n * Called when the system is destroyed.\n */\n onDestroy() {\n this.engine?.destroy();\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport PhysicsSystem from './PhysicsSystem';\n\nObject.assign(PhysicsSystem, {\n packageName: \"@combos-fun/plugin-matterjs\",\n packageVersion: \"0.0.47\",\n});\n"],"names":["PhysicsSystem"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@combos-fun/plugin-matterjs",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"description": "2D physics",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "dist/plugin-matterjs.esm.js",
|
|
@@ -40,7 +40,8 @@
|
|
|
40
40
|
"matter-js": "^0.20.0",
|
|
41
41
|
"pixi.js": "^8.18.1",
|
|
42
42
|
"poly-decomp": "^0.3.0",
|
|
43
|
-
"@combos-fun/engine": "0.0.
|
|
43
|
+
"@combos-fun/engine": "0.0.47",
|
|
44
|
+
"@combos-fun/plugin-renderer": "0.0.47"
|
|
44
45
|
},
|
|
45
46
|
"scripts": {
|
|
46
47
|
"build": "node ../../scripts/build-package.mjs"
|