@lagless/2d-map-renderer 0.0.48
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/LICENSE +26 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/lib/core/map-object-renderer.d.ts +14 -0
- package/dist/lib/core/map-object-renderer.d.ts.map +1 -0
- package/dist/lib/core/map-object-renderer.js +49 -0
- package/dist/lib/core/map-terrain-renderer.d.ts +12 -0
- package/dist/lib/core/map-terrain-renderer.d.ts.map +1 -0
- package/dist/lib/core/map-terrain-renderer.js +73 -0
- package/dist/lib/core/minimap-renderer.d.ts +10 -0
- package/dist/lib/core/minimap-renderer.d.ts.map +1 -0
- package/dist/lib/core/minimap-renderer.js +89 -0
- package/dist/lib/layers/background-layer.d.ts +3 -0
- package/dist/lib/layers/background-layer.d.ts.map +1 -0
- package/dist/lib/layers/background-layer.js +6 -0
- package/dist/lib/layers/beach-layer.d.ts +4 -0
- package/dist/lib/layers/beach-layer.d.ts.map +1 -0
- package/dist/lib/layers/beach-layer.js +10 -0
- package/dist/lib/layers/grass-layer.d.ts +4 -0
- package/dist/lib/layers/grass-layer.d.ts.map +1 -0
- package/dist/lib/layers/grass-layer.js +8 -0
- package/dist/lib/layers/grid-layer.d.ts +3 -0
- package/dist/lib/layers/grid-layer.d.ts.map +1 -0
- package/dist/lib/layers/grid-layer.js +13 -0
- package/dist/lib/layers/ground-patch-layer.d.ts +4 -0
- package/dist/lib/layers/ground-patch-layer.d.ts.map +1 -0
- package/dist/lib/layers/ground-patch-layer.js +10 -0
- package/dist/lib/layers/ocean-layer.d.ts +4 -0
- package/dist/lib/layers/ocean-layer.d.ts.map +1 -0
- package/dist/lib/layers/ocean-layer.js +9 -0
- package/dist/lib/layers/river-shore-layer.d.ts +4 -0
- package/dist/lib/layers/river-shore-layer.d.ts.map +1 -0
- package/dist/lib/layers/river-shore-layer.js +10 -0
- package/dist/lib/layers/river-water-layer.d.ts +4 -0
- package/dist/lib/layers/river-water-layer.d.ts.map +1 -0
- package/dist/lib/layers/river-water-layer.js +10 -0
- package/dist/lib/utils/jagged-aabb-draw.d.ts +5 -0
- package/dist/lib/utils/jagged-aabb-draw.d.ts.map +1 -0
- package/dist/lib/utils/jagged-aabb-draw.js +12 -0
- package/dist/lib/utils/polygon-draw.d.ts +5 -0
- package/dist/lib/utils/polygon-draw.d.ts.map +1 -0
- package/dist/lib/utils/polygon-draw.js +21 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Creative Commons Attribution-NonCommercial 4.0 International
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Lagless
|
|
4
|
+
|
|
5
|
+
This work is licensed under the Creative Commons
|
|
6
|
+
Attribution-NonCommercial 4.0 International License.
|
|
7
|
+
|
|
8
|
+
You are free to:
|
|
9
|
+
|
|
10
|
+
Share — copy and redistribute the material in any medium or format
|
|
11
|
+
Adapt — remix, transform, and build upon the material
|
|
12
|
+
|
|
13
|
+
Under the following terms:
|
|
14
|
+
|
|
15
|
+
Attribution — You must give appropriate credit, provide a link to
|
|
16
|
+
the license, and indicate if changes were made. You may do so in
|
|
17
|
+
any reasonable manner, but not in any way that suggests the licensor
|
|
18
|
+
endorses you or your use.
|
|
19
|
+
|
|
20
|
+
NonCommercial — You may not use the material for commercial purposes.
|
|
21
|
+
|
|
22
|
+
No additional restrictions — You may not apply legal terms or
|
|
23
|
+
technological measures that legally restrict others from doing
|
|
24
|
+
anything the license permits.
|
|
25
|
+
|
|
26
|
+
Full license text: https://creativecommons.org/licenses/by-nc/4.0/legalcode
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { MapTerrainRenderer } from './lib/core/map-terrain-renderer.js';
|
|
2
|
+
export { MapObjectRenderer } from './lib/core/map-object-renderer.js';
|
|
3
|
+
export { MinimapRenderer } from './lib/core/minimap-renderer.js';
|
|
4
|
+
export { drawPolygon, drawPolygonHole } from './lib/utils/polygon-draw.js';
|
|
5
|
+
export { drawJaggedAabb } from './lib/utils/jagged-aabb-draw.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { MapTerrainRenderer } from './lib/core/map-terrain-renderer.js';
|
|
2
|
+
export { MapObjectRenderer } from './lib/core/map-object-renderer.js';
|
|
3
|
+
export { MinimapRenderer } from './lib/core/minimap-renderer.js';
|
|
4
|
+
export { drawPolygon, drawPolygonHole } from './lib/utils/polygon-draw.js';
|
|
5
|
+
export { drawJaggedAabb } from './lib/utils/jagged-aabb-draw.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ParticleContainer, Texture } from 'pixi.js';
|
|
2
|
+
import type { PlacedObject, MapObjectRegistry } from '@lagless/2d-map-generator';
|
|
3
|
+
export declare class MapObjectRenderer {
|
|
4
|
+
readonly ground: ParticleContainer;
|
|
5
|
+
readonly canopy: ParticleContainer;
|
|
6
|
+
private readonly _canopyParticles;
|
|
7
|
+
constructor(options?: {
|
|
8
|
+
dynamicCanopyAlpha?: boolean;
|
|
9
|
+
});
|
|
10
|
+
build(objects: readonly PlacedObject[], registry: MapObjectRegistry, getTexture: (frameKey: string) => Texture): void;
|
|
11
|
+
setCanopyAlpha(objectIndex: number, alpha: number): void;
|
|
12
|
+
destroy(): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=map-object-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-object-renderer.d.ts","sourceRoot":"","sources":["../../../src/lib/core/map-object-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAY,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGjF,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoC;gBAEzD,OAAO,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE;IAMtD,KAAK,CACH,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GACxC,IAAI;IA4BP,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAOxD,OAAO,IAAI,IAAI;CAKhB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ParticleContainer, Particle } from 'pixi.js';
|
|
2
|
+
import { RenderLayer, sortPlacedObjects } from '@lagless/2d-map-generator';
|
|
3
|
+
export class MapObjectRenderer {
|
|
4
|
+
ground;
|
|
5
|
+
canopy;
|
|
6
|
+
_canopyParticles = new Map();
|
|
7
|
+
constructor(options) {
|
|
8
|
+
const dynamicAlpha = options?.dynamicCanopyAlpha ?? true;
|
|
9
|
+
this.ground = new ParticleContainer({ dynamicProperties: { color: false } });
|
|
10
|
+
this.canopy = new ParticleContainer({ dynamicProperties: { color: dynamicAlpha } });
|
|
11
|
+
}
|
|
12
|
+
build(objects, registry, getTexture) {
|
|
13
|
+
const sorted = sortPlacedObjects(objects);
|
|
14
|
+
for (let i = 0; i < sorted.length; i++) {
|
|
15
|
+
const obj = sorted[i];
|
|
16
|
+
const def = registry.get(obj.typeId);
|
|
17
|
+
if (!def)
|
|
18
|
+
continue;
|
|
19
|
+
for (const visual of def.visuals) {
|
|
20
|
+
const particle = new Particle(getTexture(visual.texture));
|
|
21
|
+
particle.x = obj.posX + (visual.offsetX ?? 0) * obj.scale;
|
|
22
|
+
particle.y = obj.posY + (visual.offsetY ?? 0) * obj.scale;
|
|
23
|
+
particle.rotation = obj.rotation;
|
|
24
|
+
particle.scaleX = obj.scale;
|
|
25
|
+
particle.scaleY = obj.scale;
|
|
26
|
+
particle.anchorX = visual.anchorX ?? 0.5;
|
|
27
|
+
particle.anchorY = visual.anchorY ?? 0.5;
|
|
28
|
+
if (visual.layer === RenderLayer.Ground) {
|
|
29
|
+
this.ground.addParticle(particle);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
this.canopy.addParticle(particle);
|
|
33
|
+
this._canopyParticles.set(i, particle);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
setCanopyAlpha(objectIndex, alpha) {
|
|
39
|
+
const particle = this._canopyParticles.get(objectIndex);
|
|
40
|
+
if (particle) {
|
|
41
|
+
particle.alpha = alpha;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
destroy() {
|
|
45
|
+
this.ground.destroy();
|
|
46
|
+
this.canopy.destroy();
|
|
47
|
+
this._canopyParticles.clear();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import type { IGeneratedMap } from '@lagless/2d-map-generator';
|
|
3
|
+
export interface MapTerrainRendererOptions {
|
|
4
|
+
canvasMode?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class MapTerrainRenderer {
|
|
7
|
+
private _container;
|
|
8
|
+
buildTerrain(map: IGeneratedMap, options?: MapTerrainRendererOptions): Container;
|
|
9
|
+
updateCamera(screenOriginX: number, screenOriginY: number, scaleX: number, scaleY: number): void;
|
|
10
|
+
destroy(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=map-terrain-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-terrain-renderer.d.ts","sourceRoot":"","sources":["../../../src/lib/core/map-terrain-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAqF,MAAM,2BAA2B,CAAC;AAWlJ,MAAM,WAAW,yBAAyB;IACxC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAA0B;IAE5C,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,SAAS;IAyDhF,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMhG,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { BiomeFeature, ShoreFeature, GrassFeature, RiverFeature, LakeFeature, GroundPatchFeature } from '@lagless/2d-map-generator';
|
|
3
|
+
import { createBackgroundLayer } from '../layers/background-layer.js';
|
|
4
|
+
import { createBeachLayer } from '../layers/beach-layer.js';
|
|
5
|
+
import { createGrassLayer } from '../layers/grass-layer.js';
|
|
6
|
+
import { createOceanLayer } from '../layers/ocean-layer.js';
|
|
7
|
+
import { createGridLayer } from '../layers/grid-layer.js';
|
|
8
|
+
import { createRiverShoreLayer } from '../layers/river-shore-layer.js';
|
|
9
|
+
import { createRiverWaterLayer } from '../layers/river-water-layer.js';
|
|
10
|
+
import { createGroundPatchLayer } from '../layers/ground-patch-layer.js';
|
|
11
|
+
export class MapTerrainRenderer {
|
|
12
|
+
_container = null;
|
|
13
|
+
buildTerrain(map, options) {
|
|
14
|
+
const container = new Container();
|
|
15
|
+
const width = map.width;
|
|
16
|
+
const height = map.height;
|
|
17
|
+
const biome = map.get(BiomeFeature);
|
|
18
|
+
const shore = map.get(ShoreFeature);
|
|
19
|
+
const grass = map.get(GrassFeature);
|
|
20
|
+
const riverOutput = map.get(RiverFeature);
|
|
21
|
+
const lakeOutput = map.get(LakeFeature);
|
|
22
|
+
const patchOutput = map.get(GroundPatchFeature);
|
|
23
|
+
const bgColor = biome?.grass ?? 0x80af49;
|
|
24
|
+
container.addChild(createBackgroundLayer(width, height, bgColor));
|
|
25
|
+
if (shore && grass && biome) {
|
|
26
|
+
container.addChild(createBeachLayer(shore, grass, biome.beach));
|
|
27
|
+
if (options?.canvasMode) {
|
|
28
|
+
container.addChild(createGrassLayer(grass, biome.grass));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Patches order=0 (under grid)
|
|
32
|
+
if (patchOutput) {
|
|
33
|
+
const order0 = patchOutput.patches.filter(p => p.order === 0);
|
|
34
|
+
if (order0.length > 0)
|
|
35
|
+
container.addChild(createGroundPatchLayer(order0));
|
|
36
|
+
}
|
|
37
|
+
// Rivers
|
|
38
|
+
const allRivers = [
|
|
39
|
+
...(riverOutput?.rivers ?? []),
|
|
40
|
+
...(lakeOutput?.lakes ?? []),
|
|
41
|
+
];
|
|
42
|
+
if (allRivers.length > 0 && biome) {
|
|
43
|
+
container.addChild(createRiverShoreLayer(allRivers, biome.riverbank));
|
|
44
|
+
container.addChild(createRiverWaterLayer(allRivers, biome.water));
|
|
45
|
+
}
|
|
46
|
+
// Ocean
|
|
47
|
+
if (shore && biome) {
|
|
48
|
+
container.addChild(createOceanLayer(width, height, shore, biome.water));
|
|
49
|
+
}
|
|
50
|
+
// Grid
|
|
51
|
+
container.addChild(createGridLayer(width, height, map.gridSize));
|
|
52
|
+
// Patches order=1 (over grid)
|
|
53
|
+
if (patchOutput) {
|
|
54
|
+
const order1 = patchOutput.patches.filter(p => p.order === 1);
|
|
55
|
+
if (order1.length > 0)
|
|
56
|
+
container.addChild(createGroundPatchLayer(order1));
|
|
57
|
+
}
|
|
58
|
+
this._container = container;
|
|
59
|
+
return container;
|
|
60
|
+
}
|
|
61
|
+
updateCamera(screenOriginX, screenOriginY, scaleX, scaleY) {
|
|
62
|
+
if (!this._container)
|
|
63
|
+
return;
|
|
64
|
+
this._container.position.set(screenOriginX, screenOriginY);
|
|
65
|
+
this._container.scale.set(scaleX, scaleY);
|
|
66
|
+
}
|
|
67
|
+
destroy() {
|
|
68
|
+
if (this._container) {
|
|
69
|
+
this._container.destroy({ children: true });
|
|
70
|
+
this._container = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import type { IGeneratedMap, PlacedObject, MapObjectRegistry, PlacesOutput } from '@lagless/2d-map-generator';
|
|
3
|
+
export declare class MinimapRenderer {
|
|
4
|
+
private _container;
|
|
5
|
+
buildMinimap(map: IGeneratedMap, size: number): Container;
|
|
6
|
+
addObjectShapes(objects: readonly PlacedObject[], registry: MapObjectRegistry): void;
|
|
7
|
+
addPlaceLabels(places: PlacesOutput['places']): void;
|
|
8
|
+
destroy(): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=minimap-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimap-renderer.d.ts","sourceRoot":"","sources":["../../../src/lib/core/minimap-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,SAAS,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAkE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9K,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAA0B;IAE5C,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS;IAmDzD,eAAe,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAuBpF,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,IAAI;IAWpD,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Container, Graphics, Text } from 'pixi.js';
|
|
2
|
+
import { BiomeFeature, ShoreFeature, GrassFeature, RiverFeature, LakeFeature, ShapeType } from '@lagless/2d-map-generator';
|
|
3
|
+
import { drawPolygon } from '../utils/polygon-draw.js';
|
|
4
|
+
export class MinimapRenderer {
|
|
5
|
+
_container = null;
|
|
6
|
+
buildMinimap(map, size) {
|
|
7
|
+
const container = new Container();
|
|
8
|
+
const scaleX = size / map.width;
|
|
9
|
+
const scaleY = size / map.height;
|
|
10
|
+
container.scale.set(scaleX, scaleY);
|
|
11
|
+
const biome = map.get(BiomeFeature);
|
|
12
|
+
const shore = map.get(ShoreFeature);
|
|
13
|
+
const grass = map.get(GrassFeature);
|
|
14
|
+
const riverOutput = map.get(RiverFeature);
|
|
15
|
+
const lakeOutput = map.get(LakeFeature);
|
|
16
|
+
// Background
|
|
17
|
+
const bg = new Graphics();
|
|
18
|
+
bg.rect(0, 0, map.width, map.height).fill({ color: biome?.water ?? 0x3d85c6 });
|
|
19
|
+
container.addChild(bg);
|
|
20
|
+
// Shore
|
|
21
|
+
if (shore && biome) {
|
|
22
|
+
const shoreG = new Graphics();
|
|
23
|
+
drawPolygon(shoreG, shore.polygon.points);
|
|
24
|
+
shoreG.fill({ color: biome.beach });
|
|
25
|
+
container.addChild(shoreG);
|
|
26
|
+
}
|
|
27
|
+
// Grass
|
|
28
|
+
if (grass && biome) {
|
|
29
|
+
const grassG = new Graphics();
|
|
30
|
+
drawPolygon(grassG, grass.polygon.points);
|
|
31
|
+
grassG.fill({ color: biome.grass });
|
|
32
|
+
container.addChild(grassG);
|
|
33
|
+
}
|
|
34
|
+
// Rivers
|
|
35
|
+
const allRivers = [
|
|
36
|
+
...(riverOutput?.rivers ?? []),
|
|
37
|
+
...(lakeOutput?.lakes ?? []),
|
|
38
|
+
];
|
|
39
|
+
if (allRivers.length > 0 && biome) {
|
|
40
|
+
const riverG = new Graphics();
|
|
41
|
+
for (const river of allRivers) {
|
|
42
|
+
drawPolygon(riverG, river.waterPoly.points);
|
|
43
|
+
riverG.fill({ color: biome.water });
|
|
44
|
+
}
|
|
45
|
+
container.addChild(riverG);
|
|
46
|
+
}
|
|
47
|
+
this._container = container;
|
|
48
|
+
return container;
|
|
49
|
+
}
|
|
50
|
+
addObjectShapes(objects, registry) {
|
|
51
|
+
if (!this._container)
|
|
52
|
+
return;
|
|
53
|
+
const g = new Graphics();
|
|
54
|
+
for (const obj of objects) {
|
|
55
|
+
const def = registry.get(obj.typeId);
|
|
56
|
+
if (!def?.mapDisplay)
|
|
57
|
+
continue;
|
|
58
|
+
for (const shape of def.mapDisplay.shapes) {
|
|
59
|
+
if (shape.collider.type === ShapeType.Circle) {
|
|
60
|
+
g.circle(obj.posX, obj.posY, shape.collider.radius * shape.scale);
|
|
61
|
+
g.fill({ color: shape.color });
|
|
62
|
+
}
|
|
63
|
+
else if (shape.collider.type === ShapeType.Cuboid) {
|
|
64
|
+
const hw = shape.collider.halfWidth * shape.scale;
|
|
65
|
+
const hh = shape.collider.halfHeight * shape.scale;
|
|
66
|
+
g.rect(obj.posX - hw, obj.posY - hh, hw * 2, hh * 2);
|
|
67
|
+
g.fill({ color: shape.color });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
this._container.addChild(g);
|
|
72
|
+
}
|
|
73
|
+
addPlaceLabels(places) {
|
|
74
|
+
if (!this._container)
|
|
75
|
+
return;
|
|
76
|
+
for (const place of places) {
|
|
77
|
+
const text = new Text({ text: place.name, style: { fontSize: 12, fill: 0xffffff } });
|
|
78
|
+
text.position.set(place.x, place.y);
|
|
79
|
+
text.anchor.set(0.5, 0.5);
|
|
80
|
+
this._container.addChild(text);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
destroy() {
|
|
84
|
+
if (this._container) {
|
|
85
|
+
this._container.destroy({ children: true });
|
|
86
|
+
this._container = null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/background-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAI5F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beach-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/beach-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG1E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAOhG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import { drawPolygon } from '../utils/polygon-draw.js';
|
|
3
|
+
export function createBeachLayer(shore, grass, color) {
|
|
4
|
+
const g = new Graphics();
|
|
5
|
+
drawPolygon(g, shore.polygon.points);
|
|
6
|
+
g.fill({ color });
|
|
7
|
+
drawPolygon(g, grass.polygon.points);
|
|
8
|
+
g.cut();
|
|
9
|
+
return g;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grass-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/grass-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAK5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/grid-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAazF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
export function createGridLayer(width, height, gridSize) {
|
|
3
|
+
const g = new Graphics();
|
|
4
|
+
const color = 0x000000;
|
|
5
|
+
const alpha = 0.15;
|
|
6
|
+
for (let x = 0; x <= width; x += gridSize) {
|
|
7
|
+
g.moveTo(x, 0).lineTo(x, height).stroke({ color, alpha, width: 0.05 });
|
|
8
|
+
}
|
|
9
|
+
for (let y = 0; y <= height; y += gridSize) {
|
|
10
|
+
g.moveTo(0, y).lineTo(width, y).stroke({ color, alpha, width: 0.05 });
|
|
11
|
+
}
|
|
12
|
+
return g;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ground-patch-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/ground-patch-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,GAAG,QAAQ,CAQzF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
export function createGroundPatchLayer(patches) {
|
|
3
|
+
const g = new Graphics();
|
|
4
|
+
for (const patch of patches) {
|
|
5
|
+
const w = patch.maxX - patch.minX;
|
|
6
|
+
const h = patch.maxY - patch.minY;
|
|
7
|
+
g.rect(patch.minX, patch.minY, w, h).fill({ color: patch.color });
|
|
8
|
+
}
|
|
9
|
+
return g;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ocean-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/ocean-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,GACZ,QAAQ,CAMV"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import { drawPolygon } from '../utils/polygon-draw.js';
|
|
3
|
+
export function createOceanLayer(width, height, shore, color) {
|
|
4
|
+
const g = new Graphics();
|
|
5
|
+
g.rect(0, 0, width, height).fill({ color });
|
|
6
|
+
drawPolygon(g, shore.polygon.points);
|
|
7
|
+
g.cut();
|
|
8
|
+
return g;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"river-shore-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/river-shore-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAOhG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import { drawPolygon } from '../utils/polygon-draw.js';
|
|
3
|
+
export function createRiverShoreLayer(rivers, color) {
|
|
4
|
+
const g = new Graphics();
|
|
5
|
+
for (const river of rivers) {
|
|
6
|
+
drawPolygon(g, river.shorePoly.points);
|
|
7
|
+
g.fill({ color });
|
|
8
|
+
}
|
|
9
|
+
return g;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"river-water-layer.d.ts","sourceRoot":"","sources":["../../../src/lib/layers/river-water-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAOhG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import { drawPolygon } from '../utils/polygon-draw.js';
|
|
3
|
+
export function createRiverWaterLayer(rivers, color) {
|
|
4
|
+
const g = new Graphics();
|
|
5
|
+
for (const river of rivers) {
|
|
6
|
+
drawPolygon(g, river.waterPoly.points);
|
|
7
|
+
g.fill({ color });
|
|
8
|
+
}
|
|
9
|
+
return g;
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Graphics } from 'pixi.js';
|
|
2
|
+
import type { AABB } from '@lagless/2d-map-generator';
|
|
3
|
+
import type { ISeededRandom } from '@lagless/2d-map-generator';
|
|
4
|
+
export declare function drawJaggedAabb(g: Graphics, aabb: AABB, roughness: number, offsetDist: number, color: number, random: ISeededRandom): Graphics;
|
|
5
|
+
//# sourceMappingURL=jagged-aabb-draw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jagged-aabb-draw.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/jagged-aabb-draw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,wBAAgB,cAAc,CAC5B,CAAC,EAAE,QAAQ,EACX,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,aAAa,GACpB,QAAQ,CAUV"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { generateJaggedAabbPoints } from '@lagless/2d-map-generator';
|
|
2
|
+
import { drawPolygon } from './polygon-draw.js';
|
|
3
|
+
export function drawJaggedAabb(g, aabb, roughness, offsetDist, color, random) {
|
|
4
|
+
const w = aabb.max.x - aabb.min.x;
|
|
5
|
+
const h = aabb.max.y - aabb.min.y;
|
|
6
|
+
const divisionsX = Math.max(2, Math.round(w * roughness / Math.max(1, offsetDist)));
|
|
7
|
+
const divisionsY = Math.max(2, Math.round(h * roughness / Math.max(1, offsetDist)));
|
|
8
|
+
const points = generateJaggedAabbPoints(aabb, divisionsX, divisionsY, offsetDist, random);
|
|
9
|
+
drawPolygon(g, points);
|
|
10
|
+
g.fill({ color });
|
|
11
|
+
return g;
|
|
12
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Graphics } from 'pixi.js';
|
|
2
|
+
import type { ReadonlyVec2 } from '@lagless/2d-map-generator';
|
|
3
|
+
export declare function drawPolygon(g: Graphics, points: readonly ReadonlyVec2[]): Graphics;
|
|
4
|
+
export declare function drawPolygonHole(g: Graphics, points: readonly ReadonlyVec2[]): Graphics;
|
|
5
|
+
//# sourceMappingURL=polygon-draw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polygon-draw.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/polygon-draw.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,QAAQ,CAQlF;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,QAAQ,CAStF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function drawPolygon(g, points) {
|
|
2
|
+
if (points.length < 3)
|
|
3
|
+
return g;
|
|
4
|
+
g.moveTo(points[0].x, points[0].y);
|
|
5
|
+
for (let i = 1; i < points.length; i++) {
|
|
6
|
+
g.lineTo(points[i].x, points[i].y);
|
|
7
|
+
}
|
|
8
|
+
g.closePath();
|
|
9
|
+
return g;
|
|
10
|
+
}
|
|
11
|
+
export function drawPolygonHole(g, points) {
|
|
12
|
+
if (points.length < 3)
|
|
13
|
+
return g;
|
|
14
|
+
// Draw in reverse winding to create a hole via even-odd fill rule
|
|
15
|
+
g.moveTo(points[points.length - 1].x, points[points.length - 1].y);
|
|
16
|
+
for (let i = points.length - 2; i >= 0; i--) {
|
|
17
|
+
g.lineTo(points[i].x, points[i].y);
|
|
18
|
+
}
|
|
19
|
+
g.closePath();
|
|
20
|
+
return g;
|
|
21
|
+
}
|