@combos-fun/plugin-matterjs 0.0.54 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/agent-skill.md
CHANGED
|
@@ -90,21 +90,21 @@ Compound / capsule / chain collisions arrive on the **parent** `Physics` (the en
|
|
|
90
90
|
|
|
91
91
|
- Add `RendererSystem` (from `plugin-renderer`) **before** `PhysicsSystem`.
|
|
92
92
|
- Match `resolution` between renderer and physics.
|
|
93
|
-
- Body origin uses **`
|
|
93
|
+
- Body origin uses **`Transform2D.anchor`**, not `origin`. `Physics.update()` also
|
|
94
94
|
forces `anchor` to `{ x: 0, y: 0 }` each frame after the body exists. Center a
|
|
95
|
-
sprite with `
|
|
95
|
+
sprite with `Transform2D.origin`; do not expect `origin` to move the Matter body.
|
|
96
96
|
- Bodies are created lazily when the `GameObject` is added to a scene.
|
|
97
97
|
|
|
98
98
|
## Runtime behaviour
|
|
99
99
|
|
|
100
100
|
- The engine runs all Component `update`/`lateUpdate` hooks before System updates.
|
|
101
|
-
`Physics.update()` first copies the body's current pose into `
|
|
101
|
+
`Physics.update()` first copies the body's current pose into `Transform2D`, so
|
|
102
102
|
the visual reads the result of the previous `PhysicsSystem` step.
|
|
103
103
|
- Later in that frame, `PhysicsSystem.update()` processes body changes and
|
|
104
104
|
advances Matter via `Runner.tick`. Matter collision events fire during that
|
|
105
105
|
step; the resulting pose is rendered by `Physics.update()` on the next frame.
|
|
106
106
|
- Matter writes body world coordinates directly into the GameObject's
|
|
107
|
-
`
|
|
107
|
+
`Transform2D`; unlike Cannon, it does **not** convert world pose to local pose
|
|
108
108
|
for a parented object. Put physics GameObjects directly under `scene` unless
|
|
109
109
|
you intentionally handle the coordinate mismatch yourself.
|
|
110
110
|
- Pause / resume: `PhysicsSystem` automatically stops / starts the Matter
|
|
@@ -130,7 +130,7 @@ Compound / capsule / chain collisions arrive on the **parent** `Physics` (the en
|
|
|
130
130
|
|
|
131
131
|
```ts
|
|
132
132
|
import { Game, GameObject } from '@combos-fun/engine';
|
|
133
|
-
import { RendererSystem } from '@combos-fun/plugin-renderer';
|
|
133
|
+
import { RendererSystem, Transform2D } from '@combos-fun/plugin-renderer';
|
|
134
134
|
import { GraphicsSystem, Graphics } from '@combos-fun/plugin-renderer-graphics';
|
|
135
135
|
import { PhysicsSystem, Physics, PhysicsType } from '@combos-fun/plugin-matterjs';
|
|
136
136
|
|
|
@@ -147,11 +147,12 @@ const game = new Game({
|
|
|
147
147
|
],
|
|
148
148
|
onSystemsBootstrapComplete: (readyGame, error) => {
|
|
149
149
|
if (error) return;
|
|
150
|
-
const ball = new GameObject('ball'
|
|
150
|
+
const ball = new GameObject('ball');
|
|
151
|
+
ball.addComponent(new Transform2D({
|
|
151
152
|
size: { width: 50, height: 50 },
|
|
152
153
|
position: { x: 375, y: 100 },
|
|
153
154
|
origin: { x: 0.5, y: 0.5 },
|
|
154
|
-
});
|
|
155
|
+
}));
|
|
155
156
|
const g = ball.addComponent(new Graphics());
|
|
156
157
|
g.graphics.circle(25, 25, 25).fill({ color: 0xff6b6b });
|
|
157
158
|
ball.addComponent(new Physics({ type: PhysicsType.CIRCLE, radius: 25 }));
|
|
@@ -4,6 +4,7 @@ var tslib = require('tslib');
|
|
|
4
4
|
var engine = require('@combos-fun/engine');
|
|
5
5
|
var Matter = require('matter-js');
|
|
6
6
|
var decomp = require('poly-decomp');
|
|
7
|
+
var pluginRenderer = require('@combos-fun/plugin-renderer');
|
|
7
8
|
var pixi_js = require('pixi.js');
|
|
8
9
|
|
|
9
10
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -30,12 +31,15 @@ class Physics extends engine.Component {
|
|
|
30
31
|
}
|
|
31
32
|
update() {
|
|
32
33
|
if (this.body && this.gameObject) {
|
|
33
|
-
this.gameObject.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
const transform = this.gameObject.getComponent(pluginRenderer.Transform2D);
|
|
35
|
+
if (!transform)
|
|
36
|
+
return;
|
|
37
|
+
transform.anchor.x = 0;
|
|
38
|
+
transform.anchor.y = 0;
|
|
39
|
+
transform.position.x = this.body.position.x;
|
|
40
|
+
transform.position.y = this.body.position.y;
|
|
37
41
|
if (!this.bodyParams.stopRotation) {
|
|
38
|
-
|
|
42
|
+
transform.rotation = this.body.angle;
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
}
|
|
@@ -67,8 +71,9 @@ class BodiesFactory {
|
|
|
67
71
|
const coordinate = this.getCoordinate(gameObject);
|
|
68
72
|
const x = bodyParams.position ? bodyParams.position.x : coordinate.x;
|
|
69
73
|
const y = bodyParams.position ? bodyParams.position.y : coordinate.y;
|
|
70
|
-
const
|
|
71
|
-
const
|
|
74
|
+
const transform = gameObject.getComponent(pluginRenderer.Transform2D);
|
|
75
|
+
const transformWidth = (transform?.size.width ?? 0) * (transform?.scale.x ?? 1);
|
|
76
|
+
const transformHeight = (transform?.size.height ?? 0) * (transform?.scale.y ?? 1);
|
|
72
77
|
/** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */
|
|
73
78
|
const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);
|
|
74
79
|
const body = this.createShape(bodyParams, {
|
|
@@ -223,8 +228,10 @@ class BodiesFactory {
|
|
|
223
228
|
return [body];
|
|
224
229
|
}
|
|
225
230
|
getCoordinate(gameObject) {
|
|
226
|
-
const
|
|
227
|
-
const
|
|
231
|
+
const transform = gameObject.getComponent(pluginRenderer.Transform2D);
|
|
232
|
+
const parentSize = gameObject.parent?.getComponent(pluginRenderer.Transform2D)?.size;
|
|
233
|
+
const x = (transform?.position.x ?? 0) + (transform?.anchor.x ?? 0) * (parentSize?.width ?? 0);
|
|
234
|
+
const y = (transform?.position.y ?? 0) + (transform?.anchor.y ?? 0) * (parentSize?.height ?? 0);
|
|
228
235
|
return {
|
|
229
236
|
x,
|
|
230
237
|
y,
|
|
@@ -494,7 +501,7 @@ let PhysicsSystem$1 = class PhysicsSystem extends engine.System {
|
|
|
494
501
|
if (changed.component instanceof Physics) {
|
|
495
502
|
switch (changed.type) {
|
|
496
503
|
case engine.OBSERVER_TYPE.ADD: {
|
|
497
|
-
if (changed.gameObject.
|
|
504
|
+
if (changed.gameObject.parent && !changed.gameObject.getComponent(Physics).body) {
|
|
498
505
|
this.engine.add(changed.component);
|
|
499
506
|
}
|
|
500
507
|
break;
|
|
@@ -511,7 +518,7 @@ let PhysicsSystem$1 = class PhysicsSystem extends engine.System {
|
|
|
511
518
|
else {
|
|
512
519
|
switch (changed.type) {
|
|
513
520
|
case engine.OBSERVER_TYPE.CHANGE: {
|
|
514
|
-
if (changed.
|
|
521
|
+
if (changed.gameObject.parent) {
|
|
515
522
|
let physics = changed.gameObject.getComponent(Physics);
|
|
516
523
|
if (physics && !physics.body) {
|
|
517
524
|
this.engine.add(physics);
|
|
@@ -553,7 +560,7 @@ let PhysicsSystem$1 = class PhysicsSystem extends engine.System {
|
|
|
553
560
|
PhysicsSystem$1 = tslib.__decorate([
|
|
554
561
|
engine.decorators.componentObserver({
|
|
555
562
|
Physics: [{ prop: ['bodyParams'], deep: true }],
|
|
556
|
-
|
|
563
|
+
GameObject: ['parent'],
|
|
557
564
|
})
|
|
558
565
|
], PhysicsSystem$1);
|
|
559
566
|
var PhysicsSystem = PhysicsSystem$1;
|
|
@@ -561,7 +568,7 @@ var PhysicsSystem = PhysicsSystem$1;
|
|
|
561
568
|
/** Auto-generated by scripts/build-package.mjs — do not edit. */
|
|
562
569
|
Object.assign(PhysicsSystem, {
|
|
563
570
|
packageName: "@combos-fun/plugin-matterjs",
|
|
564
|
-
packageVersion: "0.0
|
|
571
|
+
packageVersion: "0.2.0",
|
|
565
572
|
});
|
|
566
573
|
|
|
567
574
|
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.54\",\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 { Transform2D } from '@combos-fun/plugin-renderer';\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 const transform = this.gameObject.getComponent(Transform2D);\n if (!transform) return;\n transform.anchor.x = 0;\n transform.anchor.y = 0;\n transform.position.x = this.body.position.x;\n transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n 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';\nimport { Transform2D } from '@combos-fun/plugin-renderer';\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 transform = gameObject.getComponent(Transform2D);\n const transformWidth =\n (transform?.size.width ?? 0) * (transform?.scale.x ?? 1);\n const transformHeight =\n (transform?.size.height ?? 0) * (transform?.scale.y ?? 1);\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 transform = gameObject.getComponent(Transform2D);\n const parentSize = gameObject.parent?.getComponent(Transform2D)?.size;\n const x = (transform?.position.x ?? 0) + (transform?.anchor.x ?? 0) * (parentSize?.width ?? 0);\n const y = (transform?.position.y ?? 0) + (transform?.anchor.y ?? 0) * (parentSize?.height ?? 0);\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 } 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 GameObject: ['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.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.gameObject.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.2.0\",\n});\n"],"names":["PhysicsType","Component","Transform2D","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.54"}),exports.Physics=c,exports.PhysicsSystem=f;
|
|
1
|
+
"use strict";var e=require("tslib"),t=require("@combos-fun/engine"),s=require("matter-js"),i=require("poly-decomp"),n=require("@combos-fun/plugin-renderer"),o=require("pixi.js");function r(e){return e&&e.__esModule?e:{default:e}}var a,h=r(s),c=r(i);exports.PhysicsType=void 0,(a=exports.PhysicsType||(exports.PhysicsType={})).RECTANGLE="rectangle",a.CIRCLE="circle",a.POLYGON="polygon",a.TRAPEZOID="trapezoid",a.FROM_VERTICES="fromVertices",a.CAPSULE="capsule",a.COMPOUND="compound",a.EDGE="edge",a.CHAIN="chain";class d extends t.Component{static{this.componentName="Physics"}init(e){this.bodyParams=e}update(){if(this.body&&this.gameObject){const e=this.gameObject.getComponent(n.Transform2D);if(!e)return;e.anchor.x=0,e.anchor.y=0,e.position.x=this.body.position.x,e.position.y=this.body.position.y,this.bodyParams.stopRotation||(e.rotation=this.body.angle)}}onDestroy(){h.default.World.remove(this.PhysicsEngine.world,this.body,!0)}}let p=!1;function l(){if(p)return;const e=c.default?.quickDecomp?c.default:c.default?.default;e?.quickDecomp&&h.default.Common.setDecomp(e),p=!0}class u{constructor(){this.Bodies=h.default.Bodies,l()}create(e){const{gameObject:t,bodyParams:s}=e,i=this.getCoordinate(t),o=s.position?s.position.x:i.x,r=s.position?s.position.y:i.y,a=t.getComponent(n.Transform2D),h=(a?.size.width??0)*(a?.scale.x??1),c=(a?.size.height??0)*(a?.scale.y??1),d=Math.max(1,Math.min(h,c)/2),p=this.createShape(s,{x:o,y:r,transformWidth:h,transformHeight:c,defaultRadius:d},!1);if(!p)throw new Error(`[plugin-matterjs] Failed to create body for type ${String(s.type)}`);return p}createShape(e,t,s){const i=e.bodyOptions;switch(e.type){case exports.PhysicsType.RECTANGLE:{const s=e.width??t.transformWidth,n=e.height??t.transformHeight;return this.Bodies.rectangle(t.x,t.y,s,n,i)}case exports.PhysicsType.CIRCLE:{const s=e.radius??t.defaultRadius;return this.Bodies.circle(t.x,t.y,s,i)}case exports.PhysicsType.POLYGON:{const s=Math.max(3,e.sides??6),n=e.radius??t.defaultRadius;return this.Bodies.polygon(t.x,t.y,s,n,i)}case exports.PhysicsType.TRAPEZOID:{const s=e.width??t.transformWidth,n=e.height??t.transformHeight,o=Math.min(Math.max(e.slope??.5,0),.999);return this.Bodies.trapezoid(t.x,t.y,s,n,o,i)}case exports.PhysicsType.FROM_VERTICES:return this.createFromVertices(e,t,i);case exports.PhysicsType.CAPSULE:return this.createCapsule(e,t,i);case exports.PhysicsType.EDGE:return this.createEdge(e,t,i);case exports.PhysicsType.CHAIN:return this.createChain(e,t,i);case exports.PhysicsType.COMPOUND:if(s)throw new Error("[plugin-matterjs] Nested COMPOUND parts are not supported");return this.createCompound(e,t,i);default:throw new Error(`[plugin-matterjs] Unsupported PhysicsType: ${String(e.type)}`)}}createFromVertices(e,t,s){const i=e.vertexSets??(e.vertices?[e.vertices]:[]);if(!i.length||i.some(e=>!e||e.length<3))throw new Error("[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each");l();const n=this.Bodies.fromVertices(t.x,t.y,i,s,!0);if(!n)throw new Error("[plugin-matterjs] FROM_VERTICES produced an empty body");return n}createCapsule(e,t,s){const i=Math.max(1,e.radius??t.defaultRadius),n=Math.max(2*i,e.length??t.transformWidth)-2*i;if(n<.5)return this.Bodies.circle(t.x,t.y,i,s);const o=[this.Bodies.rectangle(t.x,t.y,n,2*i),this.Bodies.circle(t.x-n/2,t.y,i),this.Bodies.circle(t.x+n/2,t.y,i)];return h.default.Body.create({...s,parts:o})}createEdge(e,t,s){if(!e.from||!e.to)throw new Error("[plugin-matterjs] EDGE requires from and to");const i=t.x+e.from.x,n=t.y+e.from.y,o=t.x+e.to.x,r=t.y+e.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,e.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(e,t,s){const i=e.vertices;if(!i||i.length<2)throw new Error("[plugin-matterjs] CHAIN requires vertices with at least 2 points");const n=Math.max(1,e.thickness??4),o=[];for(let e=0;e<i.length-1;e++){const s=i[e],r=i[e+1],a=t.x+s.x,h=t.y+s.y,c=t.x+r.x,d=t.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 h.default.Body.create({...s,parts:o})}createCompound(e,t,s){const i=e.parts;if(!i?.length)throw new Error("[plugin-matterjs] COMPOUND requires a non-empty parts array");const n=[];for(let e=0;e<i.length;e++){const s=i[e],o=t.x+(s.position?.x??0),r=t.y+(s.position?.y??0),a=this.createShape(s,{...t,x:o,y:r},!0);n.push(...this.asParts(a))}if(!n.length)throw new Error("[plugin-matterjs] COMPOUND produced no parts");return h.default.Body.create({...s,parts:n})}asParts(e){return e.parts&&e.parts.length>1?e.parts.slice(1):[e]}getCoordinate(e){const t=e.getComponent(n.Transform2D),s=e.parent?.getComponent(n.Transform2D)?.size;return{x:(t?.position.x??0)+(t?.anchor.x??0)*(s?.width??0),y:(t?.position.y??0)+(t?.anchor.y??0)*(s?.height??0)}}}class g{constructor(e){this.app=null,this.graphics=null,this.opts=e,this.engine=e.engine,this.onAfterUpdate=()=>this.redraw()}async init(){const{canvas:e,width:t,height:s,resolution:i=1}=this.opts,n=new o.Application;await n.init({canvas:e,width:t,height:s,resolution:i,autoDensity:!0,antialias:!0,backgroundAlpha:.12,preference:"webgl"}),this.app=n,this.graphics=new o.Graphics,n.stage.addChild(this.graphics),h.default.Events.on(this.engine,"afterUpdate",this.onAfterUpdate)}redraw(){const e=this.graphics;if(!e)return;e.clear();const t=h.default.Composite.allBodies(this.engine.world);for(let s=0;s<t.length;s++){const i=t[s];if(!1===i.render?.visible)continue;const n=i.parts&&i.parts.length>1?i.parts.slice(1):[i];for(let t=0;t<n.length;t++){const s=n[t].vertices;if(!s?.length)continue;const i=s[0];e.moveTo(i.x,i.y);for(let t=1;t<s.length;t++)e.lineTo(s[t].x,s[t].y);e.closePath(),e.stroke({width:1,color:58998,alpha:.9})}}}destroy(){h.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(e){let t=e;for(;t;){const e=t;if(e.component)return e.component;if(!t.parent||t.parent===t)break;t=t.parent}}class y{constructor(e,t){this.debugRenderer=null,this.enabled=!1,this.Engine=h.default.Engine,this.World=h.default.World,this.bodiesFactory=new u,this.Runner=h.default.Runner,this.Constraint=h.default.Constraint,this.game=e,this.collisionEvents=["collisionStart","collisionActive","collisionEnd"],this.bodyEvents=["tick","beforeUpdate","afterUpdate","beforeRender","afterRender","afterTick"],this.options=t,this.runner=this.Runner.create({delta:1e3/(this.options.fps||60),frameDeltaSmoothing:(this.options.deltaSampleSize??1)>1})}start(){this.engine=this.Engine.create();const e=this.World.create(this.options.world);if(this.engine.world=e,this.options.isTest){const e=!this.options.canvas,t=this.options.canvas??document.createElement("canvas");e&&this.options.element&&this.options.element.appendChild(t);const s=this.options.resolution||1;this.debugRenderer=new g({engine:this.engine,canvas:t,width:this.game.canvas.width/s,height:this.game.canvas.height/s,resolution:s}),this.debugRenderer.init().catch(e=>{console.error("[plugin-matterjs] MatterPixiDebugRenderer init failed",e)}),this.Runner.run(this.runner,this.engine)}this.enabled=!0,this.initMouse(),this.initCollisionEvents(),this.initBodyEvents()}update(e){this.engine&&(this.options.isTest||this.Runner.tick(this.runner,this.engine,e.currentTime))}stop(){this.enabled=!1,this.runner.enabled=!1}destroy(){this.debugRenderer?.destroy(),this.debugRenderer=null,this.engine&&(h.default.Runner.stop(this.runner),h.default.Engine.clear(this.engine))}awake(){this.enabled=!0,this.runner.enabled=!0}add(e){const t=this.createBodies(e);this.World.add(this.engine.world,[t]),this.linkComponent(e,t)}change(e){const t=this.createBodies(e);this.World.remove(this.engine.world,e.body,!0),this.World.add(this.engine.world,[t]),this.linkComponent(e,t)}remove(e){this.World.remove(this.engine.world,e.body,!0),e.body=void 0}createBodies(e){const t=this.bodiesFactory.create(e);if(!t)throw new Error("[plugin-matterjs] Failed to create Matter body");return t}linkComponent(e,t){e.body=t,e.Body=h.default.Body,e.PhysicsEngine=this.engine,e.Constraint=this.Constraint,e.mouseConstraint=this.mouseConstraint,e.World=this.World,t.component=e}initCollisionEvents(){this.collisionEvents.forEach(e=>{h.default.Events.on(this.engine,e,t=>{const s=t.pairs??[];for(let t=0;t<s.length;t++){const i=s[t],{bodyA:n,bodyB:o}=i,r=m(n),a=m(o);r&&a&&(r.emit(e,a.gameObject,r.gameObject),a.emit(e,r.gameObject,a.gameObject))}})})}initMouse(){if(this.options.mouse&&this.options.mouse.open){const e=h.default.Mouse.create(this.game.canvas);let t=this.options.mouse.constraint?{mouse:e,constraint:this.options.mouse.constraint}:{mouse:e};this.mouseConstraint=h.default.MouseConstraint.create(this.engine,t),this.World.add(this.engine.world,this.mouseConstraint)}}initBodyEvents(){this.bodyEvents.forEach(e=>{h.default.Events.on(this.engine,e,t=>{t.source.world.bodies.forEach(t=>{const s=t;s.component?.emit(e,t,s.component.gameObject)})})})}}let f=class extends t.System{static{this.systemName="PhysicsSystem"}init(e){this.engine=new y(this.game,e),this.game.canvas.setAttribute("data-pixel-ratio",e.resolution||"1")}awake(){}start(){this.engine.start()}update(e){const t=this.componentObserver.clear();for(const e of t)e&&this.componentChanged(e);this.engine.update(e)}componentChanged(e){if(e.component instanceof d)switch(e.type){case t.OBSERVER_TYPE.ADD:e.gameObject.parent&&!e.gameObject.getComponent(d).body&&this.engine.add(e.component);break;case t.OBSERVER_TYPE.CHANGE:this.engine.change(e.component);case t.OBSERVER_TYPE.REMOVE:}else if(e.type===t.OBSERVER_TYPE.CHANGE)if(e.gameObject.parent){let t=e.gameObject.getComponent(d);t&&!t.body&&this.engine.add(t)}else{let t=e.gameObject.getComponent(d);t&&this.engine.remove(t)}}lateUpdate(){}onResume(){this.engine.enabled||this.engine.awake()}onPause(){this.engine.stop()}onDestroy(){this.engine?.destroy()}};f=e.__decorate([t.decorators.componentObserver({Physics:[{prop:["bodyParams"],deep:!0}],GameObject:["parent"]})],f);var E=f;Object.assign(E,{packageName:"@combos-fun/plugin-matterjs",packageVersion:"0.2.0"}),exports.Physics=d,exports.PhysicsSystem=E;
|
|
@@ -2,6 +2,7 @@ import { __decorate } from 'tslib';
|
|
|
2
2
|
import { Component, System, OBSERVER_TYPE, decorators } from '@combos-fun/engine';
|
|
3
3
|
import Matter from 'matter-js';
|
|
4
4
|
import decomp from 'poly-decomp';
|
|
5
|
+
import { Transform2D } from '@combos-fun/plugin-renderer';
|
|
5
6
|
import { Application, Graphics } from 'pixi.js';
|
|
6
7
|
|
|
7
8
|
var PhysicsType;
|
|
@@ -23,12 +24,15 @@ class Physics extends Component {
|
|
|
23
24
|
}
|
|
24
25
|
update() {
|
|
25
26
|
if (this.body && this.gameObject) {
|
|
26
|
-
this.gameObject.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const transform = this.gameObject.getComponent(Transform2D);
|
|
28
|
+
if (!transform)
|
|
29
|
+
return;
|
|
30
|
+
transform.anchor.x = 0;
|
|
31
|
+
transform.anchor.y = 0;
|
|
32
|
+
transform.position.x = this.body.position.x;
|
|
33
|
+
transform.position.y = this.body.position.y;
|
|
30
34
|
if (!this.bodyParams.stopRotation) {
|
|
31
|
-
|
|
35
|
+
transform.rotation = this.body.angle;
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
}
|
|
@@ -60,8 +64,9 @@ class BodiesFactory {
|
|
|
60
64
|
const coordinate = this.getCoordinate(gameObject);
|
|
61
65
|
const x = bodyParams.position ? bodyParams.position.x : coordinate.x;
|
|
62
66
|
const y = bodyParams.position ? bodyParams.position.y : coordinate.y;
|
|
63
|
-
const
|
|
64
|
-
const
|
|
67
|
+
const transform = gameObject.getComponent(Transform2D);
|
|
68
|
+
const transformWidth = (transform?.size.width ?? 0) * (transform?.scale.x ?? 1);
|
|
69
|
+
const transformHeight = (transform?.size.height ?? 0) * (transform?.scale.y ?? 1);
|
|
65
70
|
/** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */
|
|
66
71
|
const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);
|
|
67
72
|
const body = this.createShape(bodyParams, {
|
|
@@ -216,8 +221,10 @@ class BodiesFactory {
|
|
|
216
221
|
return [body];
|
|
217
222
|
}
|
|
218
223
|
getCoordinate(gameObject) {
|
|
219
|
-
const
|
|
220
|
-
const
|
|
224
|
+
const transform = gameObject.getComponent(Transform2D);
|
|
225
|
+
const parentSize = gameObject.parent?.getComponent(Transform2D)?.size;
|
|
226
|
+
const x = (transform?.position.x ?? 0) + (transform?.anchor.x ?? 0) * (parentSize?.width ?? 0);
|
|
227
|
+
const y = (transform?.position.y ?? 0) + (transform?.anchor.y ?? 0) * (parentSize?.height ?? 0);
|
|
221
228
|
return {
|
|
222
229
|
x,
|
|
223
230
|
y,
|
|
@@ -487,7 +494,7 @@ let PhysicsSystem = class PhysicsSystem extends System {
|
|
|
487
494
|
if (changed.component instanceof Physics) {
|
|
488
495
|
switch (changed.type) {
|
|
489
496
|
case OBSERVER_TYPE.ADD: {
|
|
490
|
-
if (changed.gameObject.
|
|
497
|
+
if (changed.gameObject.parent && !changed.gameObject.getComponent(Physics).body) {
|
|
491
498
|
this.engine.add(changed.component);
|
|
492
499
|
}
|
|
493
500
|
break;
|
|
@@ -504,7 +511,7 @@ let PhysicsSystem = class PhysicsSystem extends System {
|
|
|
504
511
|
else {
|
|
505
512
|
switch (changed.type) {
|
|
506
513
|
case OBSERVER_TYPE.CHANGE: {
|
|
507
|
-
if (changed.
|
|
514
|
+
if (changed.gameObject.parent) {
|
|
508
515
|
let physics = changed.gameObject.getComponent(Physics);
|
|
509
516
|
if (physics && !physics.body) {
|
|
510
517
|
this.engine.add(physics);
|
|
@@ -546,7 +553,7 @@ let PhysicsSystem = class PhysicsSystem extends System {
|
|
|
546
553
|
PhysicsSystem = __decorate([
|
|
547
554
|
decorators.componentObserver({
|
|
548
555
|
Physics: [{ prop: ['bodyParams'], deep: true }],
|
|
549
|
-
|
|
556
|
+
GameObject: ['parent'],
|
|
550
557
|
})
|
|
551
558
|
], PhysicsSystem);
|
|
552
559
|
var PhysicsSystem$1 = PhysicsSystem;
|
|
@@ -554,7 +561,7 @@ var PhysicsSystem$1 = PhysicsSystem;
|
|
|
554
561
|
/** Auto-generated by scripts/build-package.mjs — do not edit. */
|
|
555
562
|
Object.assign(PhysicsSystem$1, {
|
|
556
563
|
packageName: "@combos-fun/plugin-matterjs",
|
|
557
|
-
packageVersion: "0.0
|
|
564
|
+
packageVersion: "0.2.0",
|
|
558
565
|
});
|
|
559
566
|
|
|
560
567
|
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.54\",\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 { Transform2D } from '@combos-fun/plugin-renderer';\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 const transform = this.gameObject.getComponent(Transform2D);\n if (!transform) return;\n transform.anchor.x = 0;\n transform.anchor.y = 0;\n transform.position.x = this.body.position.x;\n transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n 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';\nimport { Transform2D } from '@combos-fun/plugin-renderer';\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 transform = gameObject.getComponent(Transform2D);\n const transformWidth =\n (transform?.size.width ?? 0) * (transform?.scale.x ?? 1);\n const transformHeight =\n (transform?.size.height ?? 0) * (transform?.scale.y ?? 1);\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 transform = gameObject.getComponent(Transform2D);\n const parentSize = gameObject.parent?.getComponent(Transform2D)?.size;\n const x = (transform?.position.x ?? 0) + (transform?.anchor.x ?? 0) * (parentSize?.width ?? 0);\n const y = (transform?.position.y ?? 0) + (transform?.anchor.y ?? 0) * (parentSize?.height ?? 0);\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 } 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 GameObject: ['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.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.gameObject.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.2.0\",\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.2.0",
|
|
4
4
|
"description": "2D physics",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "dist/plugin-matterjs.esm.js",
|
|
@@ -40,8 +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
|
|
44
|
-
"@combos-fun/plugin-renderer": "0.0
|
|
43
|
+
"@combos-fun/engine": "0.2.0",
|
|
44
|
+
"@combos-fun/plugin-renderer": "0.2.0"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "node ../../scripts/build-package.mjs"
|