dacha 0.17.0 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/build/contrib/components/index.d.ts +11 -20
  2. package/build/contrib/components/index.js +2 -1
  3. package/build/contrib/components/mesh/index.d.ts +107 -0
  4. package/build/contrib/components/mesh/index.js +115 -0
  5. package/build/contrib/systems/behavior-system/system.js +1 -1
  6. package/build/contrib/systems/index.d.ts +1 -1
  7. package/build/contrib/systems/index.js +1 -1
  8. package/build/contrib/systems/renderer/actor-render-tree.d.ts +5 -3
  9. package/build/contrib/systems/renderer/actor-render-tree.js +4 -2
  10. package/build/contrib/systems/renderer/assets/index.d.ts +3 -1
  11. package/build/contrib/systems/renderer/assets/index.js +21 -24
  12. package/build/contrib/systems/renderer/assets/utils.js +5 -0
  13. package/build/contrib/systems/renderer/builders/index.d.ts +1 -0
  14. package/build/contrib/systems/renderer/builders/index.js +1 -0
  15. package/build/contrib/systems/renderer/builders/mesh-builder/consts.d.ts +2 -0
  16. package/build/contrib/systems/renderer/builders/mesh-builder/consts.js +2 -0
  17. package/build/contrib/systems/renderer/builders/mesh-builder/index.d.ts +22 -0
  18. package/build/contrib/systems/renderer/builders/mesh-builder/index.js +114 -0
  19. package/build/contrib/systems/renderer/builders/sprite-builder/index.d.ts +1 -4
  20. package/build/contrib/systems/renderer/builders/sprite-builder/index.js +7 -56
  21. package/build/contrib/systems/renderer/builders/texture-array-store/index.d.ts +13 -0
  22. package/build/contrib/systems/renderer/builders/texture-array-store/index.js +61 -0
  23. package/build/contrib/systems/renderer/builders/{sprite-builder → texture-array-store}/utils.d.ts +3 -2
  24. package/build/contrib/systems/renderer/builders/{sprite-builder → texture-array-store}/utils.js +3 -3
  25. package/build/contrib/systems/renderer/consts.js +2 -0
  26. package/build/contrib/systems/renderer/filters/filter-effect.d.ts +14 -0
  27. package/build/contrib/systems/renderer/filters/filter-effect.js +3 -0
  28. package/build/contrib/systems/renderer/filters/index.d.ts +21 -0
  29. package/build/contrib/systems/renderer/filters/index.js +64 -0
  30. package/build/contrib/systems/renderer/index.d.ts +2 -0
  31. package/build/contrib/systems/renderer/index.js +2 -0
  32. package/build/contrib/systems/renderer/material/consts.d.ts +2 -0
  33. package/build/contrib/systems/renderer/material/consts.js +36 -0
  34. package/build/contrib/systems/renderer/material/index.d.ts +20 -0
  35. package/build/contrib/systems/renderer/material/index.js +94 -0
  36. package/build/contrib/systems/renderer/material/shader.d.ts +25 -0
  37. package/build/contrib/systems/renderer/material/shader.js +3 -0
  38. package/build/contrib/systems/renderer/renderer.d.ts +6 -2
  39. package/build/contrib/systems/renderer/renderer.js +27 -3
  40. package/build/contrib/systems/renderer/service/index.d.ts +38 -1
  41. package/build/contrib/systems/renderer/service/index.js +44 -1
  42. package/build/contrib/systems/renderer/types.d.ts +10 -0
  43. package/build/types/global.d.ts +12 -0
  44. package/package.json +3 -3
@@ -1,23 +1,14 @@
1
- export { Camera } from './camera';
2
- export type { CameraConfig } from './camera';
3
- export { KeyboardControl } from './keyboard-control';
4
- export type { KeyboardControlConfig } from './keyboard-control';
5
- export { Collider } from './collider';
6
- export type { ColliderConfig } from './collider';
7
- export { RigidBody } from './rigid-body';
8
- export type { RigidBodyConfig } from './rigid-body';
9
- export { Animatable } from './animatable';
10
- export type { AnimatableConfig } from './animatable';
11
- export { Sprite } from './sprite';
12
- export type { SpriteConfig } from './sprite';
13
- export { Transform } from './transform';
14
- export type { TransformConfig } from './transform';
15
- export { MouseControl } from './mouse-control';
16
- export type { MouseControlConfig } from './mouse-control';
17
- export { Behaviors } from './behaviors';
18
- export type { BehaviorsConfig } from './behaviors';
19
- export { AudioSource } from './audio-source';
20
- export type { AudioSourceConfig } from './audio-source';
1
+ export { Camera, type CameraConfig } from './camera';
2
+ export { KeyboardControl, type KeyboardControlConfig, } from './keyboard-control';
3
+ export { Collider, type ColliderConfig } from './collider';
4
+ export { RigidBody, type RigidBodyConfig } from './rigid-body';
5
+ export { Animatable, type AnimatableConfig } from './animatable';
6
+ export { Sprite, type SpriteConfig } from './sprite';
7
+ export { Transform, type TransformConfig } from './transform';
8
+ export { MouseControl, type MouseControlConfig } from './mouse-control';
9
+ export { Behaviors, type BehaviorsConfig } from './behaviors';
10
+ export { AudioSource, type AudioSourceConfig } from './audio-source';
21
11
  export { Shape, type ShapeConfig } from './shape';
22
12
  export { PixiView } from './pixi-view';
23
13
  export { BitmapText, type BitmapTextConfig } from './bitmap-text';
14
+ export { Mesh, type MeshConfig } from './mesh';
@@ -1,5 +1,5 @@
1
1
  export { Camera } from './camera';
2
- export { KeyboardControl } from './keyboard-control';
2
+ export { KeyboardControl, } from './keyboard-control';
3
3
  export { Collider } from './collider';
4
4
  export { RigidBody } from './rigid-body';
5
5
  export { Animatable } from './animatable';
@@ -11,3 +11,4 @@ export { AudioSource } from './audio-source';
11
11
  export { Shape } from './shape';
12
12
  export { PixiView } from './pixi-view';
13
13
  export { BitmapText } from './bitmap-text';
14
+ export { Mesh } from './mesh';
@@ -0,0 +1,107 @@
1
+ import type { Mesh as PixiMesh } from 'pixi.js';
2
+ import { Component } from '../../../engine/component';
3
+ import { type BlendingMode } from '../../types/view';
4
+ interface RenderData {
5
+ view: PixiMesh;
6
+ textureSourceKey?: string;
7
+ textureArrayKey?: string;
8
+ }
9
+ export { type BlendingMode } from '../../types/view';
10
+ export interface MaterialConfig {
11
+ name: string;
12
+ options: Record<string, unknown>;
13
+ }
14
+ export interface MeshConfig {
15
+ src: string;
16
+ width: number;
17
+ height: number;
18
+ slice: number;
19
+ flipX: boolean;
20
+ flipY: boolean;
21
+ sortingLayer: string;
22
+ sortCenter: [number, number];
23
+ color: string;
24
+ blending: BlendingMode;
25
+ opacity: number;
26
+ material?: MaterialConfig;
27
+ disabled: boolean;
28
+ }
29
+ /**
30
+ * Mesh component for rendering 2D textures with a custom shader.
31
+ *
32
+ * Handles the visual representation of an actor using a texture.
33
+ * The material field specifies a shader and its options for the mesh.
34
+ * Similar to Sprite component,
35
+ * it can render a single texture or a frame from a sprite sheet.
36
+ * When a material is not provided, the default shader is used.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * // Create a mesh with a custom material shader
41
+ * const mesh = new Mesh({
42
+ * src: 'assets/flame.png',
43
+ * width: 64,
44
+ * height: 64,
45
+ * slice: 4,
46
+ * flipX: false,
47
+ * flipY: false,
48
+ * sortingLayer: 'units',
49
+ * sortCenter: [0, 0],
50
+ * color: '#ffffff',
51
+ * blending: 'normal',
52
+ * opacity: 1,
53
+ * disabled: false,
54
+ * material: {
55
+ * name: 'HeatDistort',
56
+ * options: { strength: 0.2 }
57
+ * }
58
+ * });
59
+ *
60
+ * // Add to actor
61
+ * actor.setComponent(mesh);
62
+ *
63
+ * // Modify properties
64
+ * mesh.material = undefined; // Remove the heat-distort shader and apply the default one instead
65
+ * ```
66
+ *
67
+ * @category Components
68
+ */
69
+ export declare class Mesh extends Component {
70
+ /** Path to the texture image file */
71
+ src: string;
72
+ /** Width of the mesh in pixels */
73
+ width: number;
74
+ /** Height of the mesh in pixels */
75
+ height: number;
76
+ /** Amount of frames in the sprite sheet */
77
+ slice: number;
78
+ /** Whether to flip the mesh horizontally */
79
+ flipX: boolean;
80
+ /** Whether to flip the mesh vertically */
81
+ flipY: boolean;
82
+ /** Whether the mesh is disabled and should not render */
83
+ disabled: boolean;
84
+ /** Sorting layer name for rendering order */
85
+ sortingLayer: string;
86
+ /** Center point for sorting calculations */
87
+ sortCenter: [number, number];
88
+ /** Current frame to render */
89
+ currentFrame: number;
90
+ /** Color tint applied to the mesh */
91
+ color: string;
92
+ /** Blending mode for rendering */
93
+ blending: BlendingMode;
94
+ /** Opacity from 0 (transparent) to 1 (opaque) */
95
+ opacity: number;
96
+ /** Material describes a shader and its options applied to a texture (optional). */
97
+ material?: MaterialConfig;
98
+ /** Internal rendering data */
99
+ renderData?: RenderData;
100
+ /**
101
+ * Creates a new Mesh component.
102
+ *
103
+ * @param config - Configuration for the sprite
104
+ */
105
+ constructor(config: MeshConfig);
106
+ clone(): Mesh;
107
+ }
@@ -0,0 +1,115 @@
1
+ import { Component } from '../../../engine/component';
2
+ /**
3
+ * Mesh component for rendering 2D textures with a custom shader.
4
+ *
5
+ * Handles the visual representation of an actor using a texture.
6
+ * The material field specifies a shader and its options for the mesh.
7
+ * Similar to Sprite component,
8
+ * it can render a single texture or a frame from a sprite sheet.
9
+ * When a material is not provided, the default shader is used.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Create a mesh with a custom material shader
14
+ * const mesh = new Mesh({
15
+ * src: 'assets/flame.png',
16
+ * width: 64,
17
+ * height: 64,
18
+ * slice: 4,
19
+ * flipX: false,
20
+ * flipY: false,
21
+ * sortingLayer: 'units',
22
+ * sortCenter: [0, 0],
23
+ * color: '#ffffff',
24
+ * blending: 'normal',
25
+ * opacity: 1,
26
+ * disabled: false,
27
+ * material: {
28
+ * name: 'HeatDistort',
29
+ * options: { strength: 0.2 }
30
+ * }
31
+ * });
32
+ *
33
+ * // Add to actor
34
+ * actor.setComponent(mesh);
35
+ *
36
+ * // Modify properties
37
+ * mesh.material = undefined; // Remove the heat-distort shader and apply the default one instead
38
+ * ```
39
+ *
40
+ * @category Components
41
+ */
42
+ export class Mesh extends Component {
43
+ /** Path to the texture image file */
44
+ src;
45
+ /** Width of the mesh in pixels */
46
+ width;
47
+ /** Height of the mesh in pixels */
48
+ height;
49
+ /** Amount of frames in the sprite sheet */
50
+ slice;
51
+ /** Whether to flip the mesh horizontally */
52
+ flipX;
53
+ /** Whether to flip the mesh vertically */
54
+ flipY;
55
+ /** Whether the mesh is disabled and should not render */
56
+ disabled;
57
+ /** Sorting layer name for rendering order */
58
+ sortingLayer;
59
+ /** Center point for sorting calculations */
60
+ sortCenter;
61
+ /** Current frame to render */
62
+ currentFrame;
63
+ /** Color tint applied to the mesh */
64
+ color;
65
+ /** Blending mode for rendering */
66
+ blending;
67
+ /** Opacity from 0 (transparent) to 1 (opaque) */
68
+ opacity;
69
+ /** Material describes a shader and its options applied to a texture (optional). */
70
+ material;
71
+ /** Internal rendering data */
72
+ renderData;
73
+ /**
74
+ * Creates a new Mesh component.
75
+ *
76
+ * @param config - Configuration for the sprite
77
+ */
78
+ constructor(config) {
79
+ super();
80
+ this.src = config.src;
81
+ this.width = config.width;
82
+ this.height = config.height;
83
+ this.slice = config.slice;
84
+ this.currentFrame = 0;
85
+ this.flipX = config.flipX;
86
+ this.flipY = config.flipY;
87
+ this.disabled = config.disabled;
88
+ this.sortingLayer = config.sortingLayer;
89
+ this.sortCenter = config.sortCenter;
90
+ this.color = config.color ?? '#ffffff';
91
+ this.blending = config.blending ?? 'normal';
92
+ this.opacity = config.opacity ?? 1;
93
+ this.material = config.material;
94
+ }
95
+ clone() {
96
+ return new Mesh({
97
+ src: this.src,
98
+ width: this.width,
99
+ height: this.height,
100
+ slice: this.slice,
101
+ flipX: this.flipX,
102
+ flipY: this.flipY,
103
+ disabled: this.disabled,
104
+ sortingLayer: this.sortingLayer,
105
+ sortCenter: this.sortCenter.slice(0),
106
+ color: this.color,
107
+ blending: this.blending,
108
+ opacity: this.opacity,
109
+ material: this.material
110
+ ? { name: this.material.name, options: { ...this.material.options } }
111
+ : undefined,
112
+ });
113
+ }
114
+ }
115
+ Mesh.componentName = 'Mesh';
@@ -20,7 +20,7 @@ export class BehaviorSystem extends SceneSystem {
20
20
  activeBehaviors;
21
21
  constructor(options) {
22
22
  super();
23
- const { actorSpawner, world, scene, globalOptions, resources = {}, } = options;
23
+ const { actorSpawner, world, scene, globalOptions, resources = [], } = options;
24
24
  this.world = world;
25
25
  this.scene = scene;
26
26
  this.behaviorQuery = new ActorQuery({
@@ -11,4 +11,4 @@ export type { BehaviorOptions } from './behavior-system';
11
11
  export { UIBridge } from './ui-bridge';
12
12
  export type { UIOptions, UIInitFn, UIDestroyFn, LoadUIFn } from './ui-bridge';
13
13
  export { AudioSystem } from './audio-system';
14
- export { Renderer, RendererService } from './renderer';
14
+ export { Renderer, RendererService, FilterEffect, Shader } from './renderer';
@@ -9,4 +9,4 @@ export { PhysicsSystem } from './physics-system';
9
9
  export { BehaviorSystem, Behavior } from './behavior-system';
10
10
  export { UIBridge } from './ui-bridge';
11
11
  export { AudioSystem } from './audio-system';
12
- export { Renderer, RendererService } from './renderer';
12
+ export { Renderer, RendererService, FilterEffect, Shader } from './renderer';
@@ -1,11 +1,13 @@
1
- import { Container, type ViewContainer, type IRenderLayer } from 'pixi.js';
1
+ import { Container, type ViewContainer, type RenderLayer } from 'pixi.js';
2
2
  import { type Scene } from '../../../engine/scene';
3
3
  import type { Assets } from './assets';
4
+ import { MaterialSystem } from './material';
4
5
  interface ActorRenderTreeOptions {
5
6
  worldContainer: Container;
6
7
  scene: Scene;
7
8
  assets: Assets;
8
- sortingLayers: Map<string, IRenderLayer>;
9
+ sortingLayers: Map<string, RenderLayer>;
10
+ materialSystem: MaterialSystem;
9
11
  }
10
12
  export declare class ActorRenderTree {
11
13
  private scene;
@@ -16,7 +18,7 @@ export declare class ActorRenderTree {
16
18
  private builders;
17
19
  private actorContainerMap;
18
20
  private actorParentMap;
19
- constructor({ scene, worldContainer, assets, sortingLayers, }: ActorRenderTreeOptions);
21
+ constructor({ scene, worldContainer, assets, sortingLayers, materialSystem, }: ActorRenderTreeOptions);
20
22
  private handleAddComponent;
21
23
  private handleRemoveComponent;
22
24
  private handleAddChildEntity;
@@ -5,9 +5,10 @@ import { Sprite } from '../../components/sprite';
5
5
  import { Shape } from '../../components/shape';
6
6
  import { PixiView } from '../../components/pixi-view';
7
7
  import { BitmapText } from '../../components/bitmap-text';
8
+ import { Mesh } from '../../components/mesh';
8
9
  import { traverseEntity } from '../../../engine/entity';
9
10
  import { AddComponent, RemoveComponent, AddChildEntity, RemoveChildEntity, } from '../../../engine/events';
10
- import { SpriteBuilder, ShapeBuilder, PixiViewBuilder, BitmapTextBuilder, } from './builders';
11
+ import { SpriteBuilder, ShapeBuilder, PixiViewBuilder, BitmapTextBuilder, MeshBuilder, } from './builders';
11
12
  import { floatEquals } from './utils';
12
13
  export class ActorRenderTree {
13
14
  scene;
@@ -18,7 +19,7 @@ export class ActorRenderTree {
18
19
  builders;
19
20
  actorContainerMap;
20
21
  actorParentMap;
21
- constructor({ scene, worldContainer, assets, sortingLayers, }) {
22
+ constructor({ scene, worldContainer, assets, sortingLayers, materialSystem, }) {
22
23
  this.scene = scene;
23
24
  this.worldContainer = worldContainer;
24
25
  this.assets = assets;
@@ -31,6 +32,7 @@ export class ActorRenderTree {
31
32
  this.builders.set(Shape.componentName, new ShapeBuilder());
32
33
  this.builders.set(PixiView.componentName, new PixiViewBuilder());
33
34
  this.builders.set(BitmapText.componentName, new BitmapTextBuilder({ assets }));
35
+ this.builders.set(Mesh.componentName, new MeshBuilder({ assets, materialSystem }));
34
36
  this.scene.children.forEach((actor) => traverseEntity(actor, (entry) => this.add(entry)));
35
37
  this.scene.addEventListener(AddComponent, this.handleAddComponent);
36
38
  this.scene.addEventListener(RemoveComponent, this.handleRemoveComponent);
@@ -3,6 +3,7 @@ import { Actor } from '../../../../engine/actor';
3
3
  import { Scene } from '../../../../engine/scene';
4
4
  import { type TemplateCollection } from '../../../../engine/template';
5
5
  import { Sprite } from '../../../components/sprite';
6
+ import { Mesh } from '../../../components/mesh';
6
7
  import { BitmapText } from '../../../components/bitmap-text';
7
8
  import type { ViewComponent } from '../types';
8
9
  interface AssetsOptions {
@@ -14,7 +15,8 @@ export declare class Assets {
14
15
  constructor({ templateCollection }: AssetsOptions);
15
16
  load(entity: Actor | Scene | ViewComponent): Promise<void>;
16
17
  unload(entity: Scene | Actor | ViewComponent): void;
17
- get(view: Sprite): HTMLImageElement | undefined;
18
+ get(view: Sprite | Mesh): HTMLImageElement | undefined;
18
19
  get(view: BitmapText): BitmapFont | undefined;
20
+ private loadViewImage;
19
21
  }
20
22
  export {};
@@ -2,6 +2,7 @@ import { Assets as PixiAssets } from 'pixi.js';
2
2
  import { Actor } from '../../../../engine/actor';
3
3
  import { Scene } from '../../../../engine/scene';
4
4
  import { Sprite } from '../../../components/sprite';
5
+ import { Mesh } from '../../../components/mesh';
5
6
  import { BitmapText } from '../../../components/bitmap-text';
6
7
  import { CacheStore } from '../../../../engine/data-lib';
7
8
  import { getAllImageSources, getAllFontSources, loadImage } from './utils';
@@ -39,17 +40,11 @@ export class Assets {
39
40
  if (entity instanceof Actor) {
40
41
  const sprite = entity.getComponent(Sprite);
41
42
  if (sprite) {
42
- const { src } = sprite;
43
- if (this.imageStore.has(src)) {
44
- this.imageStore.retain(src);
45
- }
46
- else {
47
- const image = await loadImage(src);
48
- if (image) {
49
- this.imageStore.add(src, image);
50
- this.imageStore.retain(src);
51
- }
52
- }
43
+ await this.loadViewImage(sprite.src);
44
+ }
45
+ const mesh = entity.getComponent(Mesh);
46
+ if (mesh) {
47
+ await this.loadViewImage(mesh.src);
53
48
  }
54
49
  const text = entity.getComponent(BitmapText);
55
50
  if (text) {
@@ -57,18 +52,8 @@ export class Assets {
57
52
  }
58
53
  return;
59
54
  }
60
- if (entity instanceof Sprite) {
61
- const { src } = entity;
62
- if (this.imageStore.has(src)) {
63
- this.imageStore.retain(src);
64
- }
65
- else {
66
- const image = await loadImage(src);
67
- if (image) {
68
- this.imageStore.add(src, image);
69
- this.imageStore.retain(src);
70
- }
71
- }
55
+ if (entity instanceof Sprite || entity instanceof Mesh) {
56
+ await this.loadViewImage(entity.src);
72
57
  }
73
58
  }
74
59
  unload(entity) {
@@ -93,7 +78,7 @@ export class Assets {
93
78
  }
94
79
  }
95
80
  get(view) {
96
- if (view instanceof Sprite) {
81
+ if (view instanceof Sprite || view instanceof Mesh) {
97
82
  return this.imageStore.get(view.src);
98
83
  }
99
84
  if (view instanceof BitmapText) {
@@ -101,4 +86,16 @@ export class Assets {
101
86
  return PixiAssets.cache._cache.get(view.font);
102
87
  }
103
88
  }
89
+ async loadViewImage(src) {
90
+ if (this.imageStore.has(src)) {
91
+ this.imageStore.retain(src);
92
+ }
93
+ else {
94
+ const image = await loadImage(src);
95
+ if (image) {
96
+ this.imageStore.add(src, image);
97
+ this.imageStore.retain(src);
98
+ }
99
+ }
100
+ }
104
101
  }
@@ -1,4 +1,5 @@
1
1
  import { Sprite } from '../../../components/sprite';
2
+ import { Mesh } from '../../../components/mesh';
2
3
  import { BitmapText } from '../../../components/bitmap-text';
3
4
  import { ResourceLoader } from '../../../../engine/resource-loader';
4
5
  import { traverseEntity } from '../../../../engine/entity';
@@ -24,6 +25,10 @@ export const getAllImageSources = (actors) => {
24
25
  if (sprite?.src) {
25
26
  sources.push(sprite.src);
26
27
  }
28
+ const mesh = entity.getComponent(Mesh);
29
+ if (mesh?.src) {
30
+ sources.push(mesh.src);
31
+ }
27
32
  });
28
33
  });
29
34
  return sources;
@@ -2,4 +2,5 @@ export { SpriteBuilder } from './sprite-builder';
2
2
  export { ShapeBuilder } from './shape-builder';
3
3
  export { PixiViewBuilder } from './pixi-view-builder';
4
4
  export { BitmapTextBuilder } from './bitmap-text-builder';
5
+ export { MeshBuilder } from './mesh-builder';
5
6
  export type { Builder } from './builder';
@@ -2,3 +2,4 @@ export { SpriteBuilder } from './sprite-builder';
2
2
  export { ShapeBuilder } from './shape-builder';
3
3
  export { PixiViewBuilder } from './pixi-view-builder';
4
4
  export { BitmapTextBuilder } from './bitmap-text-builder';
5
+ export { MeshBuilder } from './mesh-builder';
@@ -0,0 +1,2 @@
1
+ export declare const GEOMETRY_POSITIONS: Float32Array;
2
+ export declare const GEOMETRY_INDICES: Uint32Array;
@@ -0,0 +1,2 @@
1
+ export const GEOMETRY_POSITIONS = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);
2
+ export const GEOMETRY_INDICES = new Uint32Array([0, 1, 2, 0, 2, 3]);
@@ -0,0 +1,22 @@
1
+ import { Mesh as PixiMesh } from 'pixi.js';
2
+ import type { MaterialSystem } from '../../material';
3
+ import type { Assets } from '../../assets';
4
+ import type { Builder } from '../builder';
5
+ import { Mesh } from '../../../../components/mesh';
6
+ import type { Actor } from '../../../../../engine/actor';
7
+ interface MeshBuilderOptions {
8
+ assets: Assets;
9
+ materialSystem: MaterialSystem;
10
+ }
11
+ export declare class MeshBuilder implements Builder<Mesh> {
12
+ private assets;
13
+ private materialSystem;
14
+ private textureArrayStore;
15
+ constructor({ assets, materialSystem }: MeshBuilderOptions);
16
+ destroy(mesh: Mesh): void;
17
+ buildView(mesh: Mesh, actor: Actor): PixiMesh;
18
+ updateView(mesh: Mesh): void;
19
+ private updateGeometry;
20
+ private updateTexture;
21
+ }
22
+ export {};
@@ -0,0 +1,114 @@
1
+ import { Texture, Mesh as PixiMesh, MeshGeometry } from 'pixi.js';
2
+ import { BLEND_MODE_MAPPING } from '../../consts';
3
+ import { Mesh } from '../../../../components/mesh';
4
+ import { TextureArrayStore } from '../texture-array-store';
5
+ import { GEOMETRY_POSITIONS, GEOMETRY_INDICES } from './consts';
6
+ export class MeshBuilder {
7
+ assets;
8
+ materialSystem;
9
+ textureArrayStore;
10
+ constructor({ assets, materialSystem }) {
11
+ this.assets = assets;
12
+ this.materialSystem = materialSystem;
13
+ this.textureArrayStore = new TextureArrayStore(assets);
14
+ }
15
+ destroy(mesh) {
16
+ this.textureArrayStore.removeTextureArray(mesh);
17
+ this.materialSystem.destroyShader(mesh);
18
+ mesh.renderData?.view.destroy();
19
+ mesh.renderData = undefined;
20
+ }
21
+ buildView(mesh, actor) {
22
+ const view = new PixiMesh({
23
+ geometry: new MeshGeometry({
24
+ positions: GEOMETRY_POSITIONS,
25
+ uvs: new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),
26
+ indices: GEOMETRY_INDICES,
27
+ }),
28
+ pivot: 0.5,
29
+ });
30
+ mesh.renderData = { view };
31
+ view.__dacha = {
32
+ actor,
33
+ builderKey: Mesh.componentName,
34
+ viewComponent: mesh,
35
+ meta: {},
36
+ };
37
+ this.updateView(mesh);
38
+ return view;
39
+ }
40
+ updateView(mesh) {
41
+ const view = mesh.renderData.view;
42
+ const meta = view.__dacha.meta;
43
+ if (mesh.disabled !== meta.disabled) {
44
+ view.visible = !mesh.disabled;
45
+ meta.disabled = mesh.disabled;
46
+ }
47
+ if (mesh.color !== meta.color) {
48
+ view.tint = mesh.color;
49
+ meta.color = mesh.color;
50
+ }
51
+ if (mesh.blending !== meta.blending) {
52
+ view.blendMode = BLEND_MODE_MAPPING[mesh.blending];
53
+ meta.blending = mesh.blending;
54
+ }
55
+ if (mesh.opacity !== meta.opacity) {
56
+ view.alpha = mesh.opacity;
57
+ meta.opacity = mesh.opacity;
58
+ }
59
+ if (mesh.src !== meta.src ||
60
+ mesh.slice !== meta.slice ||
61
+ mesh.currentFrame !== meta.currentFrame) {
62
+ this.updateTexture(mesh);
63
+ }
64
+ const scaleX = mesh.flipX ? -1 : 1;
65
+ const scaleY = mesh.flipY ? -1 : 1;
66
+ if (scaleX !== meta.scaleX ||
67
+ scaleY !== meta.scaleY ||
68
+ mesh.width !== meta.width ||
69
+ mesh.height !== meta.height) {
70
+ view.scale.set(mesh.width * scaleX, mesh.height * scaleY);
71
+ meta.scaleX = scaleX;
72
+ meta.scaleY = scaleY;
73
+ meta.width = mesh.width;
74
+ meta.height = mesh.height;
75
+ }
76
+ this.materialSystem.updateShader(mesh);
77
+ }
78
+ updateGeometry(mesh) {
79
+ const view = mesh.renderData.view;
80
+ const texture = view.texture;
81
+ const geometry = view.geometry;
82
+ const uvs = texture?.uvs;
83
+ if (!uvs) {
84
+ return;
85
+ }
86
+ const uvAttr = geometry.getAttribute('aUV');
87
+ const uvBuffer = uvAttr.buffer.data;
88
+ uvBuffer[0] = uvs.x0;
89
+ uvBuffer[1] = uvs.y0;
90
+ uvBuffer[2] = uvs.x1;
91
+ uvBuffer[3] = uvs.y1;
92
+ uvBuffer[4] = uvs.x2;
93
+ uvBuffer[5] = uvs.y2;
94
+ uvBuffer[6] = uvs.x3;
95
+ uvBuffer[7] = uvs.y3;
96
+ uvAttr.buffer.update();
97
+ }
98
+ updateTexture(mesh) {
99
+ const view = mesh.renderData.view;
100
+ const meta = view.__dacha.meta;
101
+ if (this.assets.get(mesh) &&
102
+ (mesh.src !== meta.src || mesh.slice !== meta.slice)) {
103
+ view.label = mesh.src;
104
+ this.textureArrayStore.updateTextureArray(mesh);
105
+ meta.src = mesh.src;
106
+ meta.slice = mesh.slice;
107
+ }
108
+ const textureArray = this.textureArrayStore.getTextureArray(mesh);
109
+ const texture = textureArray?.[mesh.currentFrame];
110
+ view.texture = texture ?? Texture.WHITE;
111
+ meta.currentFrame = mesh.currentFrame;
112
+ this.updateGeometry(mesh);
113
+ }
114
+ }
@@ -8,13 +8,10 @@ interface SpriteBuilderOptions {
8
8
  }
9
9
  export declare class SpriteBuilder implements Builder<Sprite> {
10
10
  private assets;
11
- private textureSourceMap;
12
- private textureArrayMap;
11
+ private textureArrayStore;
13
12
  constructor({ assets }: SpriteBuilderOptions);
14
13
  destroy(sprite: Sprite): void;
15
14
  buildView(sprite: Sprite, actor: Actor): PixiSprite | TilingSprite;
16
15
  updateView(sprite: Sprite): void;
17
- private updateTextureArray;
18
- private getTextureArray;
19
16
  }
20
17
  export {};