dacha 0.15.2 → 0.16.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/build/contrib/components/animatable/comparator-condition-component-value.d.ts +1 -1
- package/build/contrib/components/animatable/group-state.d.ts +1 -1
- package/build/contrib/components/animatable/index.d.ts +1 -1
- package/build/contrib/components/animatable/one-dimensional-props.d.ts +1 -1
- package/build/contrib/components/animatable/one-dimensional-props.js +1 -3
- package/build/contrib/components/animatable/state.d.ts +1 -1
- package/build/contrib/components/animatable/timeline.d.ts +2 -2
- package/build/contrib/components/animatable/transition.d.ts +1 -1
- package/build/contrib/components/animatable/two-dimensional-props.d.ts +1 -1
- package/build/contrib/components/animatable/two-dimensional-props.js +1 -3
- package/build/contrib/components/animatable/types.d.ts +9 -9
- package/build/contrib/components/bitmap-text/index.d.ts +36 -0
- package/build/contrib/components/bitmap-text/index.js +42 -0
- package/build/contrib/components/index.d.ts +3 -2
- package/build/contrib/components/index.js +3 -1
- package/build/contrib/components/keyboard-control/index.d.ts +6 -8
- package/build/contrib/components/keyboard-control/index.js +8 -2
- package/build/contrib/components/mouse-control/index.d.ts +3 -7
- package/build/contrib/components/mouse-control/index.js +4 -1
- package/build/contrib/components/pixi-view/index.d.ts +20 -0
- package/build/contrib/components/pixi-view/index.js +24 -0
- package/build/contrib/components/shape/index.d.ts +64 -0
- package/build/contrib/components/shape/index.js +60 -0
- package/build/contrib/components/sprite/index.d.ts +17 -6
- package/build/contrib/components/sprite/index.js +10 -4
- package/build/contrib/systems/animator/index.d.ts +1 -1
- package/build/contrib/systems/animator/index.js +9 -9
- package/build/contrib/systems/animator/substate-pickers/index.d.ts +2 -3
- package/build/contrib/systems/animator/substate-pickers/one-dimensional-picker.d.ts +1 -1
- package/build/contrib/systems/animator/substate-pickers/picker.d.ts +1 -1
- package/build/contrib/systems/animator/substate-pickers/two-dimensional-picker.d.ts +1 -1
- package/build/contrib/systems/animator/utils.d.ts +2 -2
- package/build/contrib/systems/animator/utils.js +0 -1
- package/build/contrib/systems/audio-system/index.d.ts +1 -1
- package/build/contrib/systems/audio-system/index.js +20 -18
- package/build/contrib/systems/audio-system/types.d.ts +6 -6
- package/build/contrib/systems/behavior-system/system.d.ts +2 -0
- package/build/contrib/systems/behavior-system/system.js +18 -5
- package/build/contrib/systems/camera-system/system.d.ts +1 -1
- package/build/contrib/systems/camera-system/system.js +16 -10
- package/build/contrib/systems/game-stats-meter/index.d.ts +1 -1
- package/build/contrib/systems/game-stats-meter/index.js +6 -6
- package/build/contrib/systems/index.d.ts +2 -2
- package/build/contrib/systems/index.js +1 -1
- package/build/contrib/systems/keyboard-control-system/index.d.ts +1 -1
- package/build/contrib/systems/keyboard-control-system/index.js +5 -7
- package/build/contrib/systems/keyboard-input-system/input-listener.d.ts +1 -1
- package/build/contrib/systems/mouse-control-system/index.d.ts +1 -1
- package/build/contrib/systems/mouse-control-system/index.js +5 -7
- package/build/contrib/systems/mouse-input-system/subsystems/input-subsystem/mouse-input-listener.d.ts +1 -1
- package/build/contrib/systems/physics-system/subsystems/collision-detection/index.d.ts +1 -1
- package/build/contrib/systems/physics-system/subsystems/collision-detection/index.js +17 -16
- package/build/contrib/systems/physics-system/subsystems/collision-detection/types.d.ts +9 -9
- package/build/contrib/systems/physics-system/subsystems/collision-detection/types.js +3 -0
- package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.d.ts +0 -1
- package/build/contrib/systems/physics-system/subsystems/constraint-solver/index.js +46 -59
- package/build/contrib/systems/physics-system/subsystems/physics/index.d.ts +1 -1
- package/build/contrib/systems/physics-system/subsystems/physics/index.js +10 -14
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/index.d.ts +8 -0
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/index.js +115 -0
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/utils.d.ts +2 -0
- package/build/contrib/systems/renderer/builders/bitmap-text-builder/utils.js +7 -0
- package/build/contrib/systems/renderer/builders/builder.d.ts +7 -0
- package/build/contrib/systems/renderer/builders/index.d.ts +5 -0
- package/build/contrib/systems/renderer/builders/index.js +4 -0
- package/build/contrib/systems/renderer/builders/pixi-view-builder/index.d.ts +8 -0
- package/build/contrib/systems/renderer/builders/pixi-view-builder/index.js +31 -0
- package/build/contrib/systems/renderer/builders/shape-builder/index.d.ts +12 -0
- package/build/contrib/systems/renderer/builders/shape-builder/index.js +128 -0
- package/build/contrib/systems/renderer/builders/shape-builder/utils.d.ts +4 -0
- package/build/contrib/systems/renderer/builders/shape-builder/utils.js +85 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/index.d.ts +19 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/index.js +166 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/utils.d.ts +4 -0
- package/build/contrib/systems/renderer/builders/sprite-builder/utils.js +16 -0
- package/build/contrib/systems/renderer/builders/utils.d.ts +1 -0
- package/build/contrib/systems/renderer/builders/utils.js +4 -0
- package/build/contrib/systems/renderer/consts.d.ts +5 -0
- package/build/contrib/systems/renderer/consts.js +12 -0
- package/build/contrib/systems/renderer/index.d.ts +2 -0
- package/build/contrib/systems/renderer/index.js +2 -0
- package/build/contrib/systems/renderer/renderer.d.ts +31 -0
- package/build/contrib/systems/renderer/renderer.js +249 -0
- package/build/contrib/systems/renderer/service/index.d.ts +20 -0
- package/build/contrib/systems/renderer/service/index.js +70 -0
- package/build/contrib/systems/{sprite-renderer → renderer}/sort/index.d.ts +1 -3
- package/build/contrib/systems/{sprite-renderer → renderer}/sort/index.js +2 -4
- package/build/contrib/systems/renderer/sort/sort-by-layer.d.ts +2 -0
- package/build/contrib/systems/renderer/sort/sort-by-layer.js +13 -0
- package/build/contrib/systems/renderer/sort/sort-by-x-axis.d.ts +2 -0
- package/build/contrib/systems/renderer/sort/sort-by-x-axis.js +9 -0
- package/build/contrib/systems/renderer/sort/sort-by-y-axis.d.ts +2 -0
- package/build/contrib/systems/renderer/sort/sort-by-y-axis.js +9 -0
- package/build/contrib/systems/renderer/sort/types.d.ts +2 -0
- package/build/contrib/systems/{sprite-renderer → renderer}/sort/utils.d.ts +1 -1
- package/build/contrib/systems/renderer/types.d.ts +26 -0
- package/build/contrib/systems/renderer/types.js +1 -0
- package/build/contrib/systems/renderer/utils.d.ts +5 -0
- package/build/contrib/systems/renderer/utils.js +42 -0
- package/build/contrib/types/input-events.d.ts +1 -1
- package/build/contrib/types/view.d.ts +1 -0
- package/build/contrib/types/view.js +1 -0
- package/build/engine/actor/actor-collection.d.ts +4 -1
- package/build/engine/actor/actor-collection.js +4 -1
- package/build/engine/actor/actor-creator.d.ts +3 -3
- package/build/engine/actor/actor-query.d.ts +29 -0
- package/build/engine/actor/actor-query.js +85 -0
- package/build/engine/actor/actor.d.ts +3 -4
- package/build/engine/actor/index.d.ts +2 -0
- package/build/engine/actor/index.js +1 -0
- package/build/engine/component/component.d.ts +2 -2
- package/build/engine/data-lib/cache-store.d.ts +2 -1
- package/build/engine/data-lib/cache-store.js +7 -1
- package/build/engine/engine.d.ts +28 -6
- package/build/engine/engine.js +35 -27
- package/build/engine/entity/entity.d.ts +1 -1
- package/build/engine/event-target/event-target.d.ts +1 -1
- package/build/engine/math-lib/vector/ops.d.ts +4 -4
- package/build/engine/math-lib/vector/ops.js +2 -3
- package/build/engine/resource-loader/loaders/image-loader.d.ts +1 -1
- package/build/engine/resource-loader/loaders/index.d.ts +2 -3
- package/build/engine/resource-loader/loaders/json-loader.d.ts +1 -1
- package/build/engine/resource-loader/loaders/loader.d.ts +1 -1
- package/build/engine/scene/scene-manager.js +7 -1
- package/build/engine/template/template-collection.d.ts +2 -2
- package/build/engine/template/template.d.ts +2 -2
- package/build/index.d.ts +2 -2
- package/build/index.js +1 -1
- package/build/types/global.d.ts +20 -0
- package/package.json +13 -10
- package/build/contrib/components/light/index.d.ts +0 -20
- package/build/contrib/components/light/index.js +0 -18
- package/build/contrib/components/renderable/index.d.ts +0 -44
- package/build/contrib/components/renderable/index.js +0 -65
- package/build/contrib/components/renderable/material.d.ts +0 -16
- package/build/contrib/components/renderable/material.js +0 -8
- package/build/contrib/components/sprite/material.d.ts +0 -16
- package/build/contrib/components/sprite/material.js +0 -8
- package/build/contrib/systems/sprite-renderer/index.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/index.js +0 -2
- package/build/contrib/systems/sprite-renderer/light-subsystem/index.d.ts +0 -13
- package/build/contrib/systems/sprite-renderer/light-subsystem/index.js +0 -62
- package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.d.ts +0 -4
- package/build/contrib/systems/sprite-renderer/light-subsystem/light-factory.js +0 -27
- package/build/contrib/systems/sprite-renderer/material-factory/index.d.ts +0 -4
- package/build/contrib/systems/sprite-renderer/material-factory/index.js +0 -32
- package/build/contrib/systems/sprite-renderer/renderer.d.ts +0 -36
- package/build/contrib/systems/sprite-renderer/renderer.js +0 -249
- package/build/contrib/systems/sprite-renderer/service/index.d.ts +0 -24
- package/build/contrib/systems/sprite-renderer/service/index.js +0 -52
- package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-fit.js +0 -12
- package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-layer.js +0 -14
- package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-x-axis.js +0 -15
- package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-y-axis.js +0 -15
- package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sort/sort-by-z-axis.js +0 -6
- package/build/contrib/systems/sprite-renderer/sort/types.d.ts +0 -2
- package/build/contrib/systems/sprite-renderer/sprite-cropper.d.ts +0 -8
- package/build/contrib/systems/sprite-renderer/sprite-cropper.js +0 -30
- package/build/contrib/systems/sprite-renderer/types.d.ts +0 -7
- package/build/contrib/systems/sprite-renderer/utils.d.ts +0 -9
- package/build/contrib/systems/sprite-renderer/utils.js +0 -47
- /package/build/contrib/systems/{sprite-renderer/sort/types.js → renderer/builders/builder.js} +0 -0
- /package/build/contrib/systems/{sprite-renderer → renderer/sort}/types.js +0 -0
- /package/build/contrib/systems/{sprite-renderer → renderer}/sort/utils.js +0 -0
|
@@ -1,38 +1,31 @@
|
|
|
1
1
|
import { Vector2 } from '../../../../../engine/math-lib';
|
|
2
|
-
import { ActorCollection } from '../../../../../engine/actor';
|
|
3
2
|
import { RigidBody } from '../../../../components/rigid-body';
|
|
4
3
|
import { Transform } from '../../../../components/transform';
|
|
5
4
|
import { Collision } from '../../../../events';
|
|
6
5
|
import { RIGID_BODY_TYPE } from '../../consts';
|
|
7
6
|
export class ConstraintSolver {
|
|
8
|
-
actorCollection;
|
|
9
7
|
scene;
|
|
10
8
|
processedPairs;
|
|
11
9
|
mtvMap;
|
|
12
10
|
constructor(options) {
|
|
13
|
-
this.actorCollection = new ActorCollection(options.scene, {
|
|
14
|
-
components: [
|
|
15
|
-
RigidBody,
|
|
16
|
-
Transform,
|
|
17
|
-
],
|
|
18
|
-
});
|
|
19
11
|
this.scene = options.scene;
|
|
20
|
-
this.processedPairs =
|
|
21
|
-
this.mtvMap =
|
|
12
|
+
this.processedPairs = new Map();
|
|
13
|
+
this.mtvMap = new Map();
|
|
22
14
|
this.scene.addEventListener(Collision, this.handleCollision);
|
|
23
15
|
}
|
|
24
16
|
destroy() {
|
|
25
17
|
this.scene.removeEventListener(Collision, this.handleCollision);
|
|
26
18
|
}
|
|
27
19
|
handleCollision = (event) => {
|
|
28
|
-
const { actor1, actor2, mtv1, mtv2
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
if (this.processedPairs[id2] && this.processedPairs[id2][id1]) {
|
|
20
|
+
const { actor1, actor2, mtv1, mtv2 } = event;
|
|
21
|
+
if (this.processedPairs.has(actor2) &&
|
|
22
|
+
this.processedPairs.get(actor2).has(actor1)) {
|
|
32
23
|
return;
|
|
33
24
|
}
|
|
34
|
-
this.processedPairs
|
|
35
|
-
|
|
25
|
+
if (!this.processedPairs.has(actor1)) {
|
|
26
|
+
this.processedPairs.set(actor1, new Set());
|
|
27
|
+
}
|
|
28
|
+
this.processedPairs.get(actor1).add(actor2);
|
|
36
29
|
if (!this.validateCollision(actor1, actor2)) {
|
|
37
30
|
return;
|
|
38
31
|
}
|
|
@@ -44,64 +37,58 @@ export class ConstraintSolver {
|
|
|
44
37
|
if (!rigidBody1 || !rigidBody2) {
|
|
45
38
|
return false;
|
|
46
39
|
}
|
|
47
|
-
if (rigidBody1.type === RIGID_BODY_TYPE.STATIC &&
|
|
40
|
+
if (rigidBody1.type === RIGID_BODY_TYPE.STATIC &&
|
|
41
|
+
rigidBody2.type === RIGID_BODY_TYPE.STATIC) {
|
|
48
42
|
return false;
|
|
49
43
|
}
|
|
50
|
-
if (rigidBody1.type === RIGID_BODY_TYPE.STATIC ||
|
|
44
|
+
if (rigidBody1.type === RIGID_BODY_TYPE.STATIC ||
|
|
45
|
+
rigidBody2.type === RIGID_BODY_TYPE.STATIC) {
|
|
51
46
|
return !rigidBody1.ghost && !rigidBody2.ghost;
|
|
52
47
|
}
|
|
53
|
-
return !rigidBody1.ghost &&
|
|
54
|
-
|
|
48
|
+
return (!rigidBody1.ghost &&
|
|
49
|
+
!rigidBody1.isPermeable &&
|
|
50
|
+
!rigidBody2.ghost &&
|
|
51
|
+
!rigidBody2.isPermeable);
|
|
55
52
|
}
|
|
56
|
-
setMtv(
|
|
57
|
-
this.mtvMap
|
|
58
|
-
|
|
59
|
-
|
|
53
|
+
setMtv(actor, mtvX, mtvY, type) {
|
|
54
|
+
if (!this.mtvMap.has(actor)) {
|
|
55
|
+
this.mtvMap.set(actor, {});
|
|
56
|
+
}
|
|
57
|
+
const mtvs = this.mtvMap.get(actor);
|
|
58
|
+
if (!mtvs?.[type]) {
|
|
59
|
+
mtvs[type] = new Vector2(mtvX, mtvY);
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
static:
|
|
64
|
-
|
|
65
|
-
? mtvX
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
this.mtvMap[id][type].y += mtvY;
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
settingStrategy[type]();
|
|
62
|
+
switch (type) {
|
|
63
|
+
case 'static':
|
|
64
|
+
mtvs[type].x =
|
|
65
|
+
Math.abs(mtvX) > Math.abs(mtvs[type].x) ? mtvX : mtvs[type].x;
|
|
66
|
+
mtvs[type].y =
|
|
67
|
+
Math.abs(mtvY) > Math.abs(mtvs[type].y) ? mtvY : mtvs[type].y;
|
|
68
|
+
break;
|
|
69
|
+
case 'dynamic':
|
|
70
|
+
mtvs[type].x += mtvX;
|
|
71
|
+
mtvs[type].y += mtvY;
|
|
72
|
+
}
|
|
77
73
|
}
|
|
78
74
|
resolveCollision(actor1, actor2, mtv1, mtv2) {
|
|
79
|
-
const id1 = actor1.id;
|
|
80
|
-
const id2 = actor2.id;
|
|
81
75
|
const rigidBody1 = actor1.getComponent(RigidBody);
|
|
82
76
|
const rigidBody2 = actor2.getComponent(RigidBody);
|
|
83
77
|
if (rigidBody1.type === RIGID_BODY_TYPE.STATIC) {
|
|
84
|
-
this.setMtv(
|
|
78
|
+
this.setMtv(actor2, mtv2.x, mtv2.y, rigidBody1.type);
|
|
85
79
|
}
|
|
86
80
|
else if (rigidBody2.type === RIGID_BODY_TYPE.STATIC) {
|
|
87
|
-
this.setMtv(
|
|
81
|
+
this.setMtv(actor1, mtv1.x, mtv1.y, rigidBody2.type);
|
|
88
82
|
}
|
|
89
83
|
else {
|
|
90
|
-
this.setMtv(
|
|
91
|
-
this.setMtv(
|
|
84
|
+
this.setMtv(actor1, mtv1.x / 2, mtv1.y / 2, rigidBody2.type);
|
|
85
|
+
this.setMtv(actor2, mtv2.x / 2, mtv2.y / 2, rigidBody1.type);
|
|
92
86
|
}
|
|
93
87
|
}
|
|
94
88
|
update() {
|
|
95
|
-
|
|
96
|
-
const actor = this.actorCollection.getById(id);
|
|
89
|
+
for (const [actor, entry] of this.mtvMap) {
|
|
97
90
|
const transform = actor.getComponent(Transform);
|
|
98
|
-
const
|
|
99
|
-
if (mtvs.length === 1) {
|
|
100
|
-
transform.offsetX += this.mtvMap[id][mtvs[0]].x;
|
|
101
|
-
transform.offsetY += this.mtvMap[id][mtvs[0]].y;
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
const { static: staticMtv, dynamic: dynamicMtv } = this.mtvMap[id];
|
|
91
|
+
const { static: staticMtv, dynamic: dynamicMtv } = entry;
|
|
105
92
|
/*
|
|
106
93
|
* TODO:: Enable this part when it will be possible to run
|
|
107
94
|
* phycics pipeline several times per single game loop iteration
|
|
@@ -112,10 +99,10 @@ export class ConstraintSolver {
|
|
|
112
99
|
// transform.offsetY += Math.sign(staticMtv.y) === Math.sign(dynamicMtv.y)
|
|
113
100
|
// ? staticMtv.y + dynamicMtv.y
|
|
114
101
|
// : staticMtv.y || dynamicMtv.y;
|
|
115
|
-
transform.offsetX += staticMtv
|
|
116
|
-
transform.offsetY += staticMtv
|
|
117
|
-
}
|
|
118
|
-
this.processedPairs
|
|
119
|
-
this.mtvMap
|
|
102
|
+
transform.offsetX += (staticMtv?.x ?? 0) + (dynamicMtv?.x ?? 0);
|
|
103
|
+
transform.offsetY += (staticMtv?.y ?? 0) + (dynamicMtv?.y ?? 0);
|
|
104
|
+
}
|
|
105
|
+
this.processedPairs.clear();
|
|
106
|
+
this.mtvMap.clear();
|
|
120
107
|
}
|
|
121
108
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SceneSystemOptions, UpdateOptions } from '../../../../../engine/system';
|
|
2
2
|
export declare class PhysicsSubsystem {
|
|
3
3
|
private scene;
|
|
4
|
-
private
|
|
4
|
+
private actorQuery;
|
|
5
5
|
private gravity;
|
|
6
6
|
private actorVectors;
|
|
7
7
|
constructor(options: SceneSystemOptions);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Vector2 } from '../../../../../engine/math-lib';
|
|
2
|
-
import {
|
|
2
|
+
import { ActorQuery } from '../../../../../engine/actor';
|
|
3
3
|
import { RigidBody } from '../../../../components/rigid-body';
|
|
4
4
|
import { Transform } from '../../../../components/transform';
|
|
5
|
-
import { AddForce, AddImpulse, StopMovement
|
|
5
|
+
import { AddForce, AddImpulse, StopMovement } from '../../../../events';
|
|
6
6
|
import { RemoveActor } from '../../../../../engine/events';
|
|
7
7
|
const DIRECTION_VECTOR = {
|
|
8
8
|
UP: new Vector2(0, -1),
|
|
@@ -12,27 +12,22 @@ const DIRECTION_VECTOR = {
|
|
|
12
12
|
};
|
|
13
13
|
export class PhysicsSubsystem {
|
|
14
14
|
scene;
|
|
15
|
-
|
|
15
|
+
actorQuery;
|
|
16
16
|
gravity;
|
|
17
17
|
actorVectors;
|
|
18
18
|
constructor(options) {
|
|
19
|
-
const { gravity, scene
|
|
19
|
+
const { gravity, scene } = options;
|
|
20
20
|
this.scene = scene;
|
|
21
|
-
this.
|
|
22
|
-
components: [
|
|
23
|
-
RigidBody,
|
|
24
|
-
Transform,
|
|
25
|
-
],
|
|
26
|
-
});
|
|
21
|
+
this.actorQuery = new ActorQuery({ scene, filter: [RigidBody, Transform] });
|
|
27
22
|
this.gravity = gravity;
|
|
28
23
|
this.actorVectors = {};
|
|
29
|
-
this.
|
|
24
|
+
this.actorQuery.addEventListener(RemoveActor, this.handleActorRemove);
|
|
30
25
|
this.scene.addEventListener(StopMovement, this.handleStopMovement);
|
|
31
26
|
this.scene.addEventListener(AddForce, this.handleAddForce);
|
|
32
27
|
this.scene.addEventListener(AddImpulse, this.handleAddImpulse);
|
|
33
28
|
}
|
|
34
29
|
destroy() {
|
|
35
|
-
this.
|
|
30
|
+
this.actorQuery.removeEventListener(RemoveActor, this.handleActorRemove);
|
|
36
31
|
this.scene.removeEventListener(StopMovement, this.handleStopMovement);
|
|
37
32
|
this.scene.removeEventListener(AddForce, this.handleAddForce);
|
|
38
33
|
this.scene.removeEventListener(AddImpulse, this.handleAddImpulse);
|
|
@@ -85,7 +80,8 @@ export class PhysicsSubsystem {
|
|
|
85
80
|
const slowdown = velocity.clone();
|
|
86
81
|
slowdown.multiplyNumber(slowdownValue * normalizationMultiplier);
|
|
87
82
|
velocity.add(slowdown);
|
|
88
|
-
if (Math.sign(velocity.x) !== velocitySignX &&
|
|
83
|
+
if (Math.sign(velocity.x) !== velocitySignX &&
|
|
84
|
+
Math.sign(velocity.y) !== velocitySignY) {
|
|
89
85
|
velocity.multiplyNumber(0);
|
|
90
86
|
}
|
|
91
87
|
}
|
|
@@ -102,7 +98,7 @@ export class PhysicsSubsystem {
|
|
|
102
98
|
const { deltaTime } = options;
|
|
103
99
|
const deltaTimeInMsec = deltaTime;
|
|
104
100
|
const deltaTimeInSeconds = deltaTimeInMsec / 1000;
|
|
105
|
-
this.
|
|
101
|
+
this.actorQuery.getActors().forEach((actor) => {
|
|
106
102
|
const rigidBody = actor.getComponent(RigidBody);
|
|
107
103
|
const transform = actor.getComponent(Transform);
|
|
108
104
|
const { mass } = rigidBody;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BitmapText as PixiBitmapText } from 'pixi.js';
|
|
2
|
+
import type { Builder } from '../builder';
|
|
3
|
+
import type { Actor } from '../../../../../engine/actor';
|
|
4
|
+
export declare class BitmapTextBuilder implements Builder {
|
|
5
|
+
destroy(actor: Actor): void;
|
|
6
|
+
buildView(actor: Actor): PixiBitmapText | undefined;
|
|
7
|
+
updateView(actor: Actor): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { BitmapText as PixiBitmapText, Bounds, Assets } from 'pixi.js';
|
|
2
|
+
import { BLEND_MODE_MAPPING } from '../../consts';
|
|
3
|
+
import { Transform } from '../../../../components/transform';
|
|
4
|
+
import { BitmapText } from '../../../../components/bitmap-text';
|
|
5
|
+
import { floatEquals } from '../utils';
|
|
6
|
+
import { filterUnsupportedChars } from './utils';
|
|
7
|
+
export class BitmapTextBuilder {
|
|
8
|
+
destroy(actor) {
|
|
9
|
+
const text = actor.getComponent(BitmapText);
|
|
10
|
+
text.renderData?.view.destroy();
|
|
11
|
+
text.renderData = undefined;
|
|
12
|
+
}
|
|
13
|
+
buildView(actor) {
|
|
14
|
+
const text = actor.getComponent(BitmapText);
|
|
15
|
+
if (!text) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
const { offsetX, offsetY } = actor.getComponent(Transform);
|
|
19
|
+
const view = new PixiBitmapText({
|
|
20
|
+
anchor: 0.5,
|
|
21
|
+
style: {
|
|
22
|
+
fontFamily: 'sans-serif',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
text.renderData = { view };
|
|
26
|
+
view.__dacha = {
|
|
27
|
+
actor,
|
|
28
|
+
builderKey: BitmapText.componentName,
|
|
29
|
+
viewComponent: text,
|
|
30
|
+
bounds: new Bounds(offsetX, offsetY, offsetX, offsetY),
|
|
31
|
+
meta: {},
|
|
32
|
+
didChange: false,
|
|
33
|
+
};
|
|
34
|
+
return view;
|
|
35
|
+
}
|
|
36
|
+
updateView(actor) {
|
|
37
|
+
const transform = actor.getComponent(Transform);
|
|
38
|
+
const text = actor.getComponent(BitmapText);
|
|
39
|
+
if (!text) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const view = text.renderData.view;
|
|
43
|
+
const meta = view.__dacha.meta;
|
|
44
|
+
view.__dacha.didChange = false;
|
|
45
|
+
if (text.disabled !== meta.disabled) {
|
|
46
|
+
view.visible = !text.disabled;
|
|
47
|
+
meta.disabled = text.disabled;
|
|
48
|
+
view.__dacha.didChange = true;
|
|
49
|
+
}
|
|
50
|
+
if (text.blending !== meta.blending) {
|
|
51
|
+
view.blendMode = BLEND_MODE_MAPPING[text.blending];
|
|
52
|
+
meta.blending = text.blending;
|
|
53
|
+
view.__dacha.didChange = true;
|
|
54
|
+
}
|
|
55
|
+
if (text.opacity !== meta.opacity) {
|
|
56
|
+
view.alpha = text.opacity;
|
|
57
|
+
meta.opacity = text.opacity;
|
|
58
|
+
view.__dacha.didChange = true;
|
|
59
|
+
}
|
|
60
|
+
// @ts-expect-error, comment: In order to avoid warning spam if value is missing
|
|
61
|
+
const font = Assets.cache._cache.get(text.font);
|
|
62
|
+
if (font && font.fontFamily !== meta.fontFamily) {
|
|
63
|
+
view.style.fontFamily = font.fontFamily;
|
|
64
|
+
meta.fontFamily = font.fontFamily;
|
|
65
|
+
view.__dacha.didChange = true;
|
|
66
|
+
}
|
|
67
|
+
if (text.text !== meta.text) {
|
|
68
|
+
const filteredText = font
|
|
69
|
+
? filterUnsupportedChars(text.text, font)
|
|
70
|
+
: text.text;
|
|
71
|
+
if (filteredText.length !== text.text.length) {
|
|
72
|
+
console.warn(`Font contains unsupported characters: "${text.text}". Displaying filtered text instead.`);
|
|
73
|
+
}
|
|
74
|
+
view.text = filteredText;
|
|
75
|
+
meta.text = text.text;
|
|
76
|
+
view.__dacha.didChange = true;
|
|
77
|
+
}
|
|
78
|
+
if (text.fontSize !== meta.fontSize) {
|
|
79
|
+
view.style.fontSize = text.fontSize;
|
|
80
|
+
meta.fontSize = text.fontSize;
|
|
81
|
+
view.__dacha.didChange = true;
|
|
82
|
+
}
|
|
83
|
+
if (text.align !== meta.align) {
|
|
84
|
+
view.style.align = text.align;
|
|
85
|
+
meta.align = text.align;
|
|
86
|
+
view.__dacha.didChange = true;
|
|
87
|
+
}
|
|
88
|
+
if (text.color !== meta.color) {
|
|
89
|
+
view.style.fill = text.color;
|
|
90
|
+
meta.color = text.color;
|
|
91
|
+
view.__dacha.didChange = true;
|
|
92
|
+
}
|
|
93
|
+
const angle = transform.rotation;
|
|
94
|
+
if (angle !== meta.angle) {
|
|
95
|
+
view.angle = angle;
|
|
96
|
+
meta.angle = angle;
|
|
97
|
+
view.__dacha.didChange = true;
|
|
98
|
+
}
|
|
99
|
+
const { offsetX, offsetY } = transform;
|
|
100
|
+
if (!floatEquals(offsetX, meta.offsetX) ||
|
|
101
|
+
!floatEquals(offsetY, meta.offsetY)) {
|
|
102
|
+
view.position.set(offsetX, offsetY);
|
|
103
|
+
meta.offsetX = offsetX;
|
|
104
|
+
meta.offsetY = offsetY;
|
|
105
|
+
view.__dacha.didChange = true;
|
|
106
|
+
}
|
|
107
|
+
const { scaleX, scaleY } = transform;
|
|
108
|
+
if (scaleX !== meta.scaleX || scaleY !== meta.scaleY) {
|
|
109
|
+
view.scale.set(scaleX, scaleY);
|
|
110
|
+
meta.scaleX = scaleX;
|
|
111
|
+
meta.scaleY = scaleY;
|
|
112
|
+
view.__dacha.didChange = true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ViewContainer } from 'pixi.js';
|
|
2
|
+
import type { Builder } from '../builder';
|
|
3
|
+
import type { Actor } from '../../../../../engine/actor';
|
|
4
|
+
export declare class PixiViewBuilder implements Builder {
|
|
5
|
+
destroy(actor: Actor): void;
|
|
6
|
+
buildView(actor: Actor): ViewContainer | undefined;
|
|
7
|
+
updateView(): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Bounds } from 'pixi.js';
|
|
2
|
+
import { Transform } from '../../../../components/transform';
|
|
3
|
+
import { PixiView } from '../../../../components/pixi-view';
|
|
4
|
+
export class PixiViewBuilder {
|
|
5
|
+
destroy(actor) {
|
|
6
|
+
const pixiView = actor.getComponent(PixiView);
|
|
7
|
+
pixiView.renderData?.view.destroy();
|
|
8
|
+
pixiView.renderData = undefined;
|
|
9
|
+
}
|
|
10
|
+
buildView(actor) {
|
|
11
|
+
const pixiView = actor.getComponent(PixiView);
|
|
12
|
+
if (!pixiView) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const { offsetX, offsetY } = actor.getComponent(Transform);
|
|
16
|
+
const view = pixiView.createView();
|
|
17
|
+
pixiView.renderData = { view };
|
|
18
|
+
view.__dacha = {
|
|
19
|
+
actor,
|
|
20
|
+
builderKey: PixiView.componentName,
|
|
21
|
+
viewComponent: pixiView,
|
|
22
|
+
bounds: new Bounds(offsetX, offsetY, offsetX, offsetY),
|
|
23
|
+
meta: {},
|
|
24
|
+
didChange: false,
|
|
25
|
+
};
|
|
26
|
+
return view;
|
|
27
|
+
}
|
|
28
|
+
updateView() {
|
|
29
|
+
// nothing to do
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import type { Builder } from '../builder';
|
|
3
|
+
import type { Actor } from '../../../../../engine/actor';
|
|
4
|
+
export declare class ShapeBuilder implements Builder {
|
|
5
|
+
private graphicsContextMap;
|
|
6
|
+
constructor();
|
|
7
|
+
destroy(actor: Actor): void;
|
|
8
|
+
buildView(actor: Actor): Graphics | undefined;
|
|
9
|
+
updateView(actor: Actor): void;
|
|
10
|
+
private updateGraphicsContext;
|
|
11
|
+
private getGraphicsContext;
|
|
12
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Graphics, Bounds } from 'pixi.js';
|
|
2
|
+
import { BLEND_MODE_MAPPING } from '../../consts';
|
|
3
|
+
import { Transform } from '../../../../components/transform';
|
|
4
|
+
import { Shape } from '../../../../components/shape';
|
|
5
|
+
import { CacheStore } from '../../../../../engine/data-lib';
|
|
6
|
+
import { floatEquals } from '../utils';
|
|
7
|
+
import { getGraphicsContext, getGraphicsContextKey } from './utils';
|
|
8
|
+
export class ShapeBuilder {
|
|
9
|
+
graphicsContextMap;
|
|
10
|
+
constructor() {
|
|
11
|
+
this.graphicsContextMap = new CacheStore();
|
|
12
|
+
}
|
|
13
|
+
destroy(actor) {
|
|
14
|
+
const shape = actor.getComponent(Shape);
|
|
15
|
+
const graphicsContextKey = shape.renderData?.graphicsContextKey;
|
|
16
|
+
if (graphicsContextKey) {
|
|
17
|
+
this.graphicsContextMap.release(graphicsContextKey, true);
|
|
18
|
+
}
|
|
19
|
+
shape.renderData?.view.destroy();
|
|
20
|
+
shape.renderData = undefined;
|
|
21
|
+
}
|
|
22
|
+
buildView(actor) {
|
|
23
|
+
const shape = actor.getComponent(Shape);
|
|
24
|
+
if (!shape) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const { offsetX, offsetY } = actor.getComponent(Transform);
|
|
28
|
+
const view = new Graphics();
|
|
29
|
+
shape.renderData = { view };
|
|
30
|
+
view.__dacha = {
|
|
31
|
+
actor,
|
|
32
|
+
builderKey: Shape.componentName,
|
|
33
|
+
viewComponent: shape,
|
|
34
|
+
bounds: new Bounds(offsetX, offsetY, offsetX, offsetY),
|
|
35
|
+
meta: {},
|
|
36
|
+
didChange: false,
|
|
37
|
+
};
|
|
38
|
+
return view;
|
|
39
|
+
}
|
|
40
|
+
updateView(actor) {
|
|
41
|
+
const transform = actor.getComponent(Transform);
|
|
42
|
+
const shape = actor.getComponent(Shape);
|
|
43
|
+
if (!shape) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const view = shape.renderData.view;
|
|
47
|
+
const meta = view.__dacha.meta;
|
|
48
|
+
view.__dacha.didChange = false;
|
|
49
|
+
if (shape.disabled !== meta.disabled) {
|
|
50
|
+
view.visible = !shape.disabled;
|
|
51
|
+
meta.disabled = shape.disabled;
|
|
52
|
+
view.__dacha.didChange = true;
|
|
53
|
+
}
|
|
54
|
+
if (shape.blending !== meta.blending) {
|
|
55
|
+
view.blendMode = BLEND_MODE_MAPPING[shape.blending];
|
|
56
|
+
meta.blending = shape.blending;
|
|
57
|
+
view.__dacha.didChange = true;
|
|
58
|
+
}
|
|
59
|
+
if (shape.opacity !== meta.opacity) {
|
|
60
|
+
view.alpha = shape.opacity;
|
|
61
|
+
meta.opacity = shape.opacity;
|
|
62
|
+
view.__dacha.didChange = true;
|
|
63
|
+
}
|
|
64
|
+
const angle = transform.rotation;
|
|
65
|
+
if (angle !== meta.angle) {
|
|
66
|
+
view.angle = angle;
|
|
67
|
+
meta.angle = angle;
|
|
68
|
+
view.__dacha.didChange = true;
|
|
69
|
+
}
|
|
70
|
+
const { offsetX, offsetY } = transform;
|
|
71
|
+
if (!floatEquals(offsetX, meta.offsetX) ||
|
|
72
|
+
!floatEquals(offsetY, meta.offsetY)) {
|
|
73
|
+
view.position.set(offsetX, offsetY);
|
|
74
|
+
meta.offsetX = offsetX;
|
|
75
|
+
meta.offsetY = offsetY;
|
|
76
|
+
view.__dacha.didChange = true;
|
|
77
|
+
}
|
|
78
|
+
if (shape.type !== meta.type ||
|
|
79
|
+
shape.strokeWidth !== meta.strokeWidth ||
|
|
80
|
+
shape.strokeColor !== meta.strokeColor ||
|
|
81
|
+
shape.fill !== meta.fill ||
|
|
82
|
+
shape.width !== meta.width ||
|
|
83
|
+
shape.height !== meta.height ||
|
|
84
|
+
shape.radius !== meta.radius ||
|
|
85
|
+
shape.radiusX !== meta.radiusX ||
|
|
86
|
+
shape.radiusY !== meta.radiusY) {
|
|
87
|
+
view.label = shape.type;
|
|
88
|
+
this.updateGraphicsContext(shape);
|
|
89
|
+
meta.type = shape.type;
|
|
90
|
+
meta.strokeWidth = shape.strokeWidth;
|
|
91
|
+
meta.strokeColor = shape.strokeColor;
|
|
92
|
+
meta.fill = shape.fill;
|
|
93
|
+
meta.width = shape.width;
|
|
94
|
+
meta.height = shape.height;
|
|
95
|
+
meta.radius = shape.radius;
|
|
96
|
+
meta.radiusX = shape.radiusX;
|
|
97
|
+
meta.radiusY = shape.radiusY;
|
|
98
|
+
view.__dacha.didChange = true;
|
|
99
|
+
}
|
|
100
|
+
const graphicsContext = this.getGraphicsContext(shape);
|
|
101
|
+
view.context = graphicsContext;
|
|
102
|
+
const { scaleX, scaleY } = transform;
|
|
103
|
+
if (scaleX !== meta.scaleX || scaleY !== meta.scaleY) {
|
|
104
|
+
view.scale.set(scaleX, scaleY);
|
|
105
|
+
meta.scaleX = scaleX;
|
|
106
|
+
meta.scaleY = scaleY;
|
|
107
|
+
view.__dacha.didChange = true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
updateGraphicsContext(shape) {
|
|
111
|
+
const oldGraphicsContextKey = shape.renderData.graphicsContextKey;
|
|
112
|
+
if (oldGraphicsContextKey) {
|
|
113
|
+
this.graphicsContextMap.release(oldGraphicsContextKey, true);
|
|
114
|
+
}
|
|
115
|
+
shape.renderData.graphicsContextKey = getGraphicsContextKey(shape);
|
|
116
|
+
const graphicsContextKey = shape.renderData.graphicsContextKey;
|
|
117
|
+
if (this.graphicsContextMap.has(graphicsContextKey)) {
|
|
118
|
+
this.graphicsContextMap.retain(graphicsContextKey);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const graphicsContext = getGraphicsContext(shape);
|
|
122
|
+
this.graphicsContextMap.add(graphicsContextKey, graphicsContext);
|
|
123
|
+
this.graphicsContextMap.retain(graphicsContextKey);
|
|
124
|
+
}
|
|
125
|
+
getGraphicsContext(shape) {
|
|
126
|
+
return this.graphicsContextMap.get(shape.renderData.graphicsContextKey);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { GraphicsContext } from 'pixi.js';
|
|
2
|
+
export const getGraphicsContext = (shape) => {
|
|
3
|
+
switch (shape.type) {
|
|
4
|
+
case 'rectangle': {
|
|
5
|
+
const { width, height, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
6
|
+
const rectangle = new GraphicsContext()
|
|
7
|
+
.rect(-width / 2, -height / 2, width, height)
|
|
8
|
+
.stroke({
|
|
9
|
+
width: strokeWidth,
|
|
10
|
+
alignment: strokeAlignment,
|
|
11
|
+
color: strokeColor,
|
|
12
|
+
pixelLine,
|
|
13
|
+
});
|
|
14
|
+
if (fill) {
|
|
15
|
+
rectangle.fill(fill);
|
|
16
|
+
}
|
|
17
|
+
return rectangle;
|
|
18
|
+
}
|
|
19
|
+
case 'roundRectangle': {
|
|
20
|
+
const { width, height, radius, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
21
|
+
const rectangle = new GraphicsContext()
|
|
22
|
+
.roundRect(-width / 2, -height / 2, width, height, radius)
|
|
23
|
+
.stroke({
|
|
24
|
+
width: strokeWidth,
|
|
25
|
+
alignment: strokeAlignment,
|
|
26
|
+
color: strokeColor,
|
|
27
|
+
pixelLine,
|
|
28
|
+
});
|
|
29
|
+
if (fill) {
|
|
30
|
+
rectangle.fill(fill);
|
|
31
|
+
}
|
|
32
|
+
return rectangle;
|
|
33
|
+
}
|
|
34
|
+
case 'circle': {
|
|
35
|
+
const { radius, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
36
|
+
const circle = new GraphicsContext()
|
|
37
|
+
.circle(0, 0, radius)
|
|
38
|
+
.stroke({
|
|
39
|
+
width: strokeWidth,
|
|
40
|
+
alignment: strokeAlignment,
|
|
41
|
+
color: strokeColor,
|
|
42
|
+
pixelLine,
|
|
43
|
+
});
|
|
44
|
+
if (fill) {
|
|
45
|
+
circle.fill(fill);
|
|
46
|
+
}
|
|
47
|
+
return circle;
|
|
48
|
+
}
|
|
49
|
+
case 'ellipse': {
|
|
50
|
+
const { radiusX, radiusY, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
51
|
+
const ellipse = new GraphicsContext()
|
|
52
|
+
.ellipse(0, 0, radiusX, radiusY)
|
|
53
|
+
.stroke({
|
|
54
|
+
width: strokeWidth,
|
|
55
|
+
alignment: strokeAlignment,
|
|
56
|
+
color: strokeColor,
|
|
57
|
+
pixelLine,
|
|
58
|
+
});
|
|
59
|
+
if (fill) {
|
|
60
|
+
ellipse.fill(fill);
|
|
61
|
+
}
|
|
62
|
+
return ellipse;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
export const getGraphicsContextKey = (shape) => {
|
|
67
|
+
switch (shape.type) {
|
|
68
|
+
case 'rectangle': {
|
|
69
|
+
const { type, width, height, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
70
|
+
return `${type}_${width}_${height}_${strokeWidth}_${strokeColor}_${strokeAlignment}_${fill}_${pixelLine}`;
|
|
71
|
+
}
|
|
72
|
+
case 'roundRectangle': {
|
|
73
|
+
const { type, width, height, radius, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
74
|
+
return `${type}_${width}_${height}_${radius}_${strokeWidth}_${strokeColor}_${strokeAlignment}_${fill}_${pixelLine}`;
|
|
75
|
+
}
|
|
76
|
+
case 'circle': {
|
|
77
|
+
const { type, radius, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
78
|
+
return `${type}_${radius}_${strokeWidth}_${strokeColor}_${strokeAlignment}_${fill}_${pixelLine}`;
|
|
79
|
+
}
|
|
80
|
+
case 'ellipse': {
|
|
81
|
+
const { type, radiusX, radiusY, strokeWidth, strokeColor, strokeAlignment, fill, pixelLine, } = shape;
|
|
82
|
+
return `${type}_${radiusX}_${radiusY}_${strokeWidth}_${strokeColor}_${strokeAlignment}_${fill}_${pixelLine}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|