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,249 +0,0 @@
|
|
|
1
|
-
import { Scene as ThreeJSScene, OrthographicCamera, WebGLRenderer, PlaneGeometry, Mesh, Color, } from 'three/src/Three';
|
|
2
|
-
import { AddActor, RemoveActor } from '../../../engine/events';
|
|
3
|
-
import { WorldSystem } from '../../../engine/system';
|
|
4
|
-
import { ActorCollection } from '../../../engine/actor';
|
|
5
|
-
import { Transform } from '../../components/transform';
|
|
6
|
-
import { Sprite } from '../../components/sprite';
|
|
7
|
-
import { Camera } from '../../components/camera';
|
|
8
|
-
import { CameraService } from '../camera-system';
|
|
9
|
-
import { MathOps } from '../../../engine/math-lib';
|
|
10
|
-
import { CacheStore } from '../../../engine/data-lib';
|
|
11
|
-
import { getWindowNode } from '../../utils/get-window-node';
|
|
12
|
-
import { SpriteRendererService } from './service';
|
|
13
|
-
import { composeSort, createSortByLayer, sortByYAxis, sortByXAxis, sortByZAxis, sortByFit, } from './sort';
|
|
14
|
-
import { parseSortingLayers } from './sort/utils';
|
|
15
|
-
import { LightSubsystem } from './light-subsystem';
|
|
16
|
-
import { createMaterial, updateMaterial } from './material-factory';
|
|
17
|
-
import { loadImage, prepareSprite, getAllSources, getTextureMapKey, cloneTexture, } from './utils';
|
|
18
|
-
export class SpriteRenderer extends WorldSystem {
|
|
19
|
-
actorCollection;
|
|
20
|
-
window;
|
|
21
|
-
renderScene;
|
|
22
|
-
currentCamera;
|
|
23
|
-
renderer;
|
|
24
|
-
imageStore;
|
|
25
|
-
spriteCache;
|
|
26
|
-
textureMap;
|
|
27
|
-
actorsMap;
|
|
28
|
-
sortFn;
|
|
29
|
-
lightSubsystem;
|
|
30
|
-
viewWidth;
|
|
31
|
-
viewHeight;
|
|
32
|
-
templateCollection;
|
|
33
|
-
cameraService;
|
|
34
|
-
constructor(options) {
|
|
35
|
-
super();
|
|
36
|
-
const { globalOptions, windowNodeId, backgroundColor, backgroundAlpha, templateCollection, world, } = options;
|
|
37
|
-
this.templateCollection = templateCollection;
|
|
38
|
-
this.window = getWindowNode(windowNodeId);
|
|
39
|
-
this.sortFn = composeSort([
|
|
40
|
-
createSortByLayer(parseSortingLayers(globalOptions.sortingLayers?.layers)),
|
|
41
|
-
sortByYAxis,
|
|
42
|
-
sortByXAxis,
|
|
43
|
-
sortByZAxis,
|
|
44
|
-
sortByFit,
|
|
45
|
-
]);
|
|
46
|
-
this.viewWidth = 0;
|
|
47
|
-
this.viewHeight = 0;
|
|
48
|
-
this.renderScene = new ThreeJSScene();
|
|
49
|
-
this.currentCamera = new OrthographicCamera();
|
|
50
|
-
this.renderer = new WebGLRenderer();
|
|
51
|
-
this.renderer.setClearColor(new Color(backgroundColor), backgroundAlpha);
|
|
52
|
-
this.renderer.setPixelRatio(window.devicePixelRatio);
|
|
53
|
-
this.lightSubsystem = new LightSubsystem(this.renderScene);
|
|
54
|
-
// TODO: Figure out how to set up camera correctly to avoid scale usage
|
|
55
|
-
this.renderScene.scale.set(1, -1, 1);
|
|
56
|
-
this.imageStore = new CacheStore();
|
|
57
|
-
this.actorsMap = new Map();
|
|
58
|
-
this.spriteCache = new Map();
|
|
59
|
-
this.textureMap = new Map();
|
|
60
|
-
this.cameraService = world.getService(CameraService);
|
|
61
|
-
world.addService(new SpriteRendererService({
|
|
62
|
-
threeScene: this.renderScene,
|
|
63
|
-
threeCamera: this.currentCamera,
|
|
64
|
-
window: this.window,
|
|
65
|
-
sortFn: this.sortFn,
|
|
66
|
-
cameraService: this.cameraService,
|
|
67
|
-
}));
|
|
68
|
-
window.addEventListener('resize', this.handleWindowResize);
|
|
69
|
-
this.window.appendChild(this.renderer.domElement);
|
|
70
|
-
}
|
|
71
|
-
async onSceneLoad(scene) {
|
|
72
|
-
const allSources = [
|
|
73
|
-
...getAllSources(this.templateCollection.getAll()),
|
|
74
|
-
...getAllSources(scene.children),
|
|
75
|
-
];
|
|
76
|
-
const uniqueSources = [...new Set(allSources)];
|
|
77
|
-
const images = await Promise.all(uniqueSources.map((src) => {
|
|
78
|
-
return !this.imageStore.has(src) ? this.loadImage(src) : undefined;
|
|
79
|
-
}));
|
|
80
|
-
uniqueSources.forEach((src, index) => {
|
|
81
|
-
if (images[index]) {
|
|
82
|
-
this.imageStore.add(src, images[index]);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
allSources.forEach((src) => this.imageStore.retain(src));
|
|
86
|
-
}
|
|
87
|
-
onSceneEnter(scene) {
|
|
88
|
-
this.actorCollection = new ActorCollection(scene, {
|
|
89
|
-
components: [Sprite, Transform],
|
|
90
|
-
});
|
|
91
|
-
this.handleWindowResize();
|
|
92
|
-
this.lightSubsystem.onSceneEnter(scene);
|
|
93
|
-
this.actorCollection.addEventListener(AddActor, this.handleActorAdd);
|
|
94
|
-
this.actorCollection.addEventListener(RemoveActor, this.handleActorRemove);
|
|
95
|
-
}
|
|
96
|
-
onSceneExit() {
|
|
97
|
-
this.actorCollection?.removeEventListener(AddActor, this.handleActorAdd);
|
|
98
|
-
this.actorCollection?.removeEventListener(RemoveActor, this.handleActorRemove);
|
|
99
|
-
this.lightSubsystem.onSceneExit();
|
|
100
|
-
this.actorsMap.clear();
|
|
101
|
-
this.spriteCache.clear();
|
|
102
|
-
this.textureMap.clear();
|
|
103
|
-
this.renderScene.clear();
|
|
104
|
-
this.actorCollection = undefined;
|
|
105
|
-
}
|
|
106
|
-
onSceneDestroy(scene) {
|
|
107
|
-
const allSources = [
|
|
108
|
-
...getAllSources(this.templateCollection.getAll()),
|
|
109
|
-
...getAllSources(scene.children),
|
|
110
|
-
];
|
|
111
|
-
allSources.forEach((src) => this.imageStore.release(src));
|
|
112
|
-
this.imageStore.cleanReleased();
|
|
113
|
-
}
|
|
114
|
-
onWorldDestroy() {
|
|
115
|
-
window.removeEventListener('resize', this.handleWindowResize);
|
|
116
|
-
this.window.removeChild(this.renderer.domElement);
|
|
117
|
-
}
|
|
118
|
-
handleActorAdd = (event) => {
|
|
119
|
-
const { actor } = event;
|
|
120
|
-
const { src } = actor.getComponent(Sprite);
|
|
121
|
-
if (this.imageStore.has(src)) {
|
|
122
|
-
this.imageStore.retain(src);
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
void this.loadImage(src).then((image) => {
|
|
126
|
-
if (image) {
|
|
127
|
-
this.imageStore.add(src, image);
|
|
128
|
-
this.imageStore.retain(src);
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
handleActorRemove = (event) => {
|
|
134
|
-
const { actor } = event;
|
|
135
|
-
const { src } = actor.getComponent(Sprite);
|
|
136
|
-
this.imageStore.release(src);
|
|
137
|
-
const objectId = this.actorsMap.get(actor.id);
|
|
138
|
-
if (objectId) {
|
|
139
|
-
const object = this.renderScene.getObjectById(objectId);
|
|
140
|
-
if (object) {
|
|
141
|
-
this.renderScene.remove(object);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
this.actorsMap.delete(actor.id);
|
|
145
|
-
};
|
|
146
|
-
handleWindowResize = () => {
|
|
147
|
-
this.viewWidth = this.window.clientWidth;
|
|
148
|
-
this.viewHeight = this.window.clientHeight;
|
|
149
|
-
this.currentCamera.left = this.viewWidth / -2;
|
|
150
|
-
this.currentCamera.top = this.viewHeight / 2;
|
|
151
|
-
this.currentCamera.right = this.viewWidth / 2;
|
|
152
|
-
this.currentCamera.bottom = this.viewHeight / -2;
|
|
153
|
-
this.currentCamera.updateProjectionMatrix();
|
|
154
|
-
this.renderer.setSize(this.viewWidth, this.viewHeight);
|
|
155
|
-
};
|
|
156
|
-
async loadImage(src) {
|
|
157
|
-
if (!src) {
|
|
158
|
-
return undefined;
|
|
159
|
-
}
|
|
160
|
-
try {
|
|
161
|
-
const image = await loadImage(src);
|
|
162
|
-
return image;
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
console.warn(`Can't load image by the following url: ${src}`, error);
|
|
166
|
-
return undefined;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
getTextureArray(sprite) {
|
|
170
|
-
const { src, slice } = sprite;
|
|
171
|
-
const image = this.imageStore.get(src);
|
|
172
|
-
if (!image) {
|
|
173
|
-
return undefined;
|
|
174
|
-
}
|
|
175
|
-
if (!this.spriteCache.has(src)) {
|
|
176
|
-
this.spriteCache.set(src, {});
|
|
177
|
-
}
|
|
178
|
-
const spriteCache = this.spriteCache.get(src);
|
|
179
|
-
if (!spriteCache[slice]) {
|
|
180
|
-
spriteCache[slice] = prepareSprite(image, sprite);
|
|
181
|
-
}
|
|
182
|
-
const textureKey = getTextureMapKey(sprite);
|
|
183
|
-
if (!this.textureMap.has(textureKey)) {
|
|
184
|
-
this.textureMap.set(textureKey, spriteCache[slice].map((frame) => cloneTexture(sprite, frame)));
|
|
185
|
-
}
|
|
186
|
-
return this.textureMap.get(textureKey);
|
|
187
|
-
}
|
|
188
|
-
setUpActor(actor) {
|
|
189
|
-
const sprite = actor.getComponent(Sprite);
|
|
190
|
-
const material = createMaterial(sprite.material.type);
|
|
191
|
-
const geometry = new PlaneGeometry(sprite.width, sprite.height);
|
|
192
|
-
const object = new Mesh(geometry, material);
|
|
193
|
-
object.userData.actor = actor;
|
|
194
|
-
this.actorsMap.set(actor.id, object.id);
|
|
195
|
-
this.renderScene.add(object);
|
|
196
|
-
}
|
|
197
|
-
normalizeOffset(value) {
|
|
198
|
-
const currentCamera = this.cameraService.getCurrentCamera();
|
|
199
|
-
const camera = currentCamera?.getComponent(Camera);
|
|
200
|
-
const zoom = camera?.zoom ?? 1;
|
|
201
|
-
const ratio = 1 / (window.devicePixelRatio * zoom);
|
|
202
|
-
return Math.round(value / ratio) * ratio;
|
|
203
|
-
}
|
|
204
|
-
updateCamera() {
|
|
205
|
-
const currentCamera = this.cameraService.getCurrentCamera();
|
|
206
|
-
const transform = currentCamera?.getComponent(Transform);
|
|
207
|
-
const camera = currentCamera?.getComponent(Camera);
|
|
208
|
-
const offsetX = transform?.offsetX ?? 0;
|
|
209
|
-
const offsetY = transform?.offsetY ?? 0;
|
|
210
|
-
const zoom = camera?.zoom ?? 1;
|
|
211
|
-
this.currentCamera.zoom = zoom;
|
|
212
|
-
// TODO: Figure out how to set up camera correctly to avoid negative transform by y axis
|
|
213
|
-
this.currentCamera.position.set(this.normalizeOffset(offsetX), -this.normalizeOffset(offsetY), 1);
|
|
214
|
-
this.currentCamera.updateProjectionMatrix();
|
|
215
|
-
}
|
|
216
|
-
updateActors() {
|
|
217
|
-
this.actorCollection?.forEach((actor, index) => {
|
|
218
|
-
const transform = actor.getComponent(Transform);
|
|
219
|
-
const sprite = actor.getComponent(Sprite);
|
|
220
|
-
if (!this.actorsMap.has(actor.id)) {
|
|
221
|
-
this.setUpActor(actor);
|
|
222
|
-
}
|
|
223
|
-
const object = this.renderScene.getObjectById(this.actorsMap.get(actor.id));
|
|
224
|
-
if (!object) {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
object.visible = !sprite.disabled;
|
|
228
|
-
if (!object.visible) {
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
object.scale.set((sprite.flipX ? -1 : 1) * transform.scaleX, (sprite.flipY ? -1 : 1) * transform.scaleY, 1);
|
|
232
|
-
object.rotation.set(0, 0, MathOps.degToRad(transform.rotation + sprite.rotation));
|
|
233
|
-
object.position.set(this.normalizeOffset(transform.offsetX), this.normalizeOffset(transform.offsetY), 0);
|
|
234
|
-
object.renderOrder = index;
|
|
235
|
-
const material = object.material;
|
|
236
|
-
const textureArray = this.getTextureArray(sprite);
|
|
237
|
-
const texture = textureArray?.[sprite.currentFrame || 0];
|
|
238
|
-
updateMaterial(sprite.material.type, material, sprite.material.options, texture);
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
update() {
|
|
242
|
-
this.updateCamera();
|
|
243
|
-
this.lightSubsystem.update();
|
|
244
|
-
this.actorCollection?.sort(this.sortFn);
|
|
245
|
-
this.updateActors();
|
|
246
|
-
this.renderer.render(this.renderScene, this.currentCamera);
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
SpriteRenderer.systemName = 'SpriteRenderer';
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Scene, Camera } from 'three/src/Three';
|
|
2
|
-
import type { CameraService } from '../../camera-system';
|
|
3
|
-
import type { Actor } from '../../../../engine/actor';
|
|
4
|
-
import type { SortFn } from '../sort';
|
|
5
|
-
interface SpriteRendererServiceOptions {
|
|
6
|
-
threeScene: Scene;
|
|
7
|
-
threeCamera: Camera;
|
|
8
|
-
window: HTMLElement;
|
|
9
|
-
sortFn: SortFn;
|
|
10
|
-
cameraService: CameraService;
|
|
11
|
-
}
|
|
12
|
-
export declare class SpriteRendererService {
|
|
13
|
-
private threeScene;
|
|
14
|
-
private threeCamera;
|
|
15
|
-
private window;
|
|
16
|
-
private raycaster;
|
|
17
|
-
private sortFn;
|
|
18
|
-
private cameraService;
|
|
19
|
-
constructor({ threeScene, threeCamera, window, sortFn, cameraService, }: SpriteRendererServiceOptions);
|
|
20
|
-
private getNormalizedCoordinates;
|
|
21
|
-
intersectsWithPoint(x: number, y: number): Actor[];
|
|
22
|
-
intersectsWithRectangle(minX: number, minY: number, maxX: number, maxY: number): Actor[];
|
|
23
|
-
}
|
|
24
|
-
export {};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { Raycaster, Vector2 } from 'three/src/Three';
|
|
2
|
-
import { getProjectedX, getProjectedY } from '../../../utils/coordinates-projection';
|
|
3
|
-
export class SpriteRendererService {
|
|
4
|
-
threeScene;
|
|
5
|
-
threeCamera;
|
|
6
|
-
window;
|
|
7
|
-
raycaster;
|
|
8
|
-
sortFn;
|
|
9
|
-
cameraService;
|
|
10
|
-
constructor({ threeScene, threeCamera, window, sortFn, cameraService, }) {
|
|
11
|
-
this.threeScene = threeScene;
|
|
12
|
-
this.threeCamera = threeCamera;
|
|
13
|
-
this.window = window;
|
|
14
|
-
this.sortFn = sortFn;
|
|
15
|
-
this.cameraService = cameraService;
|
|
16
|
-
this.raycaster = new Raycaster();
|
|
17
|
-
}
|
|
18
|
-
getNormalizedCoordinates(x, y) {
|
|
19
|
-
const { clientWidth, clientHeight } = this.window;
|
|
20
|
-
return new Vector2((x / clientWidth) * 2 - 1, -(y / clientHeight) * 2 + 1);
|
|
21
|
-
}
|
|
22
|
-
intersectsWithPoint(x, y) {
|
|
23
|
-
this.raycaster.setFromCamera(this.getNormalizedCoordinates(x, y), this.threeCamera);
|
|
24
|
-
const intersects = this.raycaster.intersectObjects(this.threeScene.children, true);
|
|
25
|
-
const actors = intersects.map((intersect) => intersect.object.userData.actor);
|
|
26
|
-
// TODO: Find more efficient way to return intersected objects in right order
|
|
27
|
-
// according to posititon and sorting layer
|
|
28
|
-
return actors
|
|
29
|
-
.sort(this.sortFn)
|
|
30
|
-
.reverse();
|
|
31
|
-
}
|
|
32
|
-
intersectsWithRectangle(minX, minY, maxX, maxY) {
|
|
33
|
-
const actors = [];
|
|
34
|
-
const camera = this.cameraService.getCurrentCamera();
|
|
35
|
-
if (!camera) {
|
|
36
|
-
return actors;
|
|
37
|
-
}
|
|
38
|
-
const projectedMinX = getProjectedX(minX, camera);
|
|
39
|
-
const projectedMinY = getProjectedY(minY, camera);
|
|
40
|
-
const projectedMaxX = getProjectedX(maxX, camera);
|
|
41
|
-
const projectedMaxY = getProjectedY(maxY, camera);
|
|
42
|
-
this.threeScene.traverse((object) => {
|
|
43
|
-
if (object.userData.actor !== undefined) {
|
|
44
|
-
const { x, y } = object.position;
|
|
45
|
-
if (x >= projectedMinX && x <= projectedMaxX && y >= projectedMinY && y <= projectedMaxY) {
|
|
46
|
-
actors.push(object.userData.actor);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
return actors;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Sprite } from '../../../components/sprite';
|
|
2
|
-
export const sortByFit = (a, b) => {
|
|
3
|
-
const aSprite = a.getComponent(Sprite);
|
|
4
|
-
const bSprite = b.getComponent(Sprite);
|
|
5
|
-
if (aSprite.fit > bSprite.fit) {
|
|
6
|
-
return 1;
|
|
7
|
-
}
|
|
8
|
-
if (aSprite.fit < bSprite.fit) {
|
|
9
|
-
return -1;
|
|
10
|
-
}
|
|
11
|
-
return 0;
|
|
12
|
-
};
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Sprite } from '../../../components/sprite';
|
|
2
|
-
export const createSortByLayer = (sortingLayers) => {
|
|
3
|
-
const sortingLayer = sortingLayers.reduce((storage, layer, index) => {
|
|
4
|
-
storage[layer] = index;
|
|
5
|
-
return storage;
|
|
6
|
-
}, {});
|
|
7
|
-
return (a, b) => {
|
|
8
|
-
const aSprite = a.getComponent(Sprite);
|
|
9
|
-
const bSprite = b.getComponent(Sprite);
|
|
10
|
-
const aSortingLayerOrder = sortingLayer[aSprite.sortingLayer];
|
|
11
|
-
const bSortingLayerOrder = sortingLayer[bSprite.sortingLayer];
|
|
12
|
-
return aSortingLayerOrder - bSortingLayerOrder;
|
|
13
|
-
};
|
|
14
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Sprite } from '../../../components/sprite';
|
|
2
|
-
import { Transform } from '../../../components/transform';
|
|
3
|
-
export const sortByXAxis = (a, b) => {
|
|
4
|
-
const aSprite = a.getComponent(Sprite);
|
|
5
|
-
const bSprite = b.getComponent(Sprite);
|
|
6
|
-
const aTransform = a.getComponent(Transform);
|
|
7
|
-
const bTransform = b.getComponent(Transform);
|
|
8
|
-
const aOffsetX = aTransform.offsetX
|
|
9
|
-
+ aSprite.sortCenter[0]
|
|
10
|
-
+ ((aTransform.scaleX * aSprite.width) / 2);
|
|
11
|
-
const bOffsetX = bTransform.offsetX
|
|
12
|
-
+ bSprite.sortCenter[0]
|
|
13
|
-
+ ((bTransform.scaleX * bSprite.width) / 2);
|
|
14
|
-
return aOffsetX - bOffsetX;
|
|
15
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Sprite } from '../../../components/sprite';
|
|
2
|
-
import { Transform } from '../../../components/transform';
|
|
3
|
-
export const sortByYAxis = (a, b) => {
|
|
4
|
-
const aSprite = a.getComponent(Sprite);
|
|
5
|
-
const bSprite = b.getComponent(Sprite);
|
|
6
|
-
const aTransform = a.getComponent(Transform);
|
|
7
|
-
const bTransform = b.getComponent(Transform);
|
|
8
|
-
const aOffsetY = aTransform.offsetY
|
|
9
|
-
+ aSprite.sortCenter[1]
|
|
10
|
-
+ ((aTransform.scaleY * aSprite.height) / 2);
|
|
11
|
-
const bOffsetY = bTransform.offsetY
|
|
12
|
-
+ bSprite.sortCenter[1]
|
|
13
|
-
+ ((bTransform.scaleY * bSprite.height) / 2);
|
|
14
|
-
return aOffsetY - bOffsetY;
|
|
15
|
-
};
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Texture } from 'three/src/Three';
|
|
2
|
-
import type { Sprite } from '../../components/sprite';
|
|
3
|
-
export declare class SpriteCropper {
|
|
4
|
-
private canvas;
|
|
5
|
-
private canvasContext;
|
|
6
|
-
constructor();
|
|
7
|
-
crop(spriteTexture: HTMLImageElement, sprite: Sprite): Array<Texture>;
|
|
8
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Texture } from 'three/src/Three';
|
|
2
|
-
export class SpriteCropper {
|
|
3
|
-
canvas;
|
|
4
|
-
canvasContext;
|
|
5
|
-
constructor() {
|
|
6
|
-
this.canvas = document.createElement('canvas');
|
|
7
|
-
this.canvasContext = this.canvas.getContext('2d', { willReadFrequently: true });
|
|
8
|
-
}
|
|
9
|
-
crop(spriteTexture, sprite) {
|
|
10
|
-
const frames = sprite.slice;
|
|
11
|
-
if (frames <= 0) {
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
const width = Math.max(spriteTexture.width / frames, 1);
|
|
15
|
-
const height = Math.max(spriteTexture.height, 1);
|
|
16
|
-
this.canvas.width = width;
|
|
17
|
-
this.canvas.height = height;
|
|
18
|
-
const textures = new Array(frames);
|
|
19
|
-
for (let i = 0; i < frames; i += 1) {
|
|
20
|
-
this.canvasContext.clearRect(0, 0, width, height);
|
|
21
|
-
this.canvasContext.drawImage(spriteTexture, width * i, 0, width, height, 0, 0, width, height);
|
|
22
|
-
const frameImageData = this.canvasContext.getImageData(0, 0, width, height);
|
|
23
|
-
// Some issue with three.js d.ts probably,
|
|
24
|
-
// cause it should take ImageData as first argument
|
|
25
|
-
const texture = new Texture(frameImageData);
|
|
26
|
-
textures[i] = texture;
|
|
27
|
-
}
|
|
28
|
-
return textures;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Texture } from 'three/src/Three';
|
|
2
|
-
import { Sprite } from '../../components/sprite';
|
|
3
|
-
import type { Actor } from '../../../engine/actor';
|
|
4
|
-
import type { Template } from '../../../engine/template';
|
|
5
|
-
export declare const loadImage: (spriteSourcePath: string) => Promise<HTMLImageElement>;
|
|
6
|
-
export declare const prepareSprite: (image: HTMLImageElement, sprite: Sprite) => Texture[];
|
|
7
|
-
export declare const getAllSources: (actors: (Actor | Template)[]) => string[];
|
|
8
|
-
export declare const getTextureMapKey: ({ slice, fit, width, height, src, }: Sprite) => string;
|
|
9
|
-
export declare const cloneTexture: (sprite: Sprite, texture: Texture) => Texture;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { NearestFilter, RepeatWrapping, ClampToEdgeWrapping, } from 'three/src/Three';
|
|
2
|
-
import { Sprite } from '../../components/sprite';
|
|
3
|
-
import { ResourceLoader } from '../../../engine/resource-loader';
|
|
4
|
-
import { traverseEntity } from '../../../engine/entity';
|
|
5
|
-
import { SpriteCropper } from './sprite-cropper';
|
|
6
|
-
const spriteCropper = new SpriteCropper();
|
|
7
|
-
const resourceLoader = new ResourceLoader();
|
|
8
|
-
export const loadImage = (spriteSourcePath) => resourceLoader.load(spriteSourcePath);
|
|
9
|
-
export const prepareSprite = (image, sprite) => {
|
|
10
|
-
const textures = spriteCropper.crop(image, sprite);
|
|
11
|
-
textures.forEach((texture) => {
|
|
12
|
-
texture.magFilter = NearestFilter;
|
|
13
|
-
texture.minFilter = NearestFilter;
|
|
14
|
-
texture.flipY = false;
|
|
15
|
-
});
|
|
16
|
-
return textures;
|
|
17
|
-
};
|
|
18
|
-
export const getAllSources = (actors) => {
|
|
19
|
-
const sources = [];
|
|
20
|
-
actors.forEach((actor) => {
|
|
21
|
-
traverseEntity(actor, (entity) => {
|
|
22
|
-
const sprite = entity.getComponent(Sprite);
|
|
23
|
-
if (sprite?.src) {
|
|
24
|
-
sources.push(sprite.src);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
return sources;
|
|
29
|
-
};
|
|
30
|
-
export const getTextureMapKey = ({ slice, fit, width = 0, height = 0, src, }) => `${slice}_${fit}_${width}_${height}_${src}`;
|
|
31
|
-
export const cloneTexture = (sprite, texture) => {
|
|
32
|
-
const { fit, width = 0, height = 0 } = sprite;
|
|
33
|
-
const repeatX = fit === 'repeat' ? width / texture.image.width : 1;
|
|
34
|
-
const repeatY = fit === 'repeat' ? height / texture.image.height : 1;
|
|
35
|
-
const newTexture = texture.clone();
|
|
36
|
-
if (fit === 'repeat') {
|
|
37
|
-
newTexture.wrapS = RepeatWrapping;
|
|
38
|
-
newTexture.wrapT = RepeatWrapping;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
newTexture.wrapS = ClampToEdgeWrapping;
|
|
42
|
-
newTexture.wrapT = ClampToEdgeWrapping;
|
|
43
|
-
}
|
|
44
|
-
newTexture.repeat.set(repeatX, repeatY);
|
|
45
|
-
newTexture.needsUpdate = true;
|
|
46
|
-
return newTexture;
|
|
47
|
-
};
|
/package/build/contrib/systems/{sprite-renderer/sort/types.js → renderer/builders/builder.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|