@rpgjs/map-builder 0.0.0-stage → 5.0.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/LICENSE +19 -0
- package/README.md +341 -2
- package/dist/authority/authority.d.ts +118 -0
- package/dist/authority/authority.d.ts.map +1 -0
- package/dist/authority/authority.js +289 -0
- package/dist/authority/authority.js.map +1 -0
- package/dist/authority/index.d.ts +3 -0
- package/dist/authority/index.d.ts.map +1 -0
- package/dist/authority/index.js +3 -0
- package/dist/authority/store.d.ts +36 -0
- package/dist/authority/store.d.ts.map +1 -0
- package/dist/authority/store.js +35 -0
- package/dist/authority/store.js.map +1 -0
- package/dist/client/index.d.ts +72 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +200 -0
- package/dist/client/index.js.map +1 -0
- package/dist/embed/client.d.ts +85 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +255 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +112 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +278 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +4 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +4 -0
- package/dist/embed/protocol.d.ts +137 -0
- package/dist/embed/protocol.d.ts.map +1 -0
- package/dist/embed/protocol.js +161 -0
- package/dist/embed/protocol.js.map +1 -0
- package/dist/features/index.d.ts +66 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +157 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/skin.d.ts +9 -0
- package/dist/features/skin.d.ts.map +1 -0
- package/dist/features/skin.js +43 -0
- package/dist/features/skin.js.map +1 -0
- package/dist/features/terrain.d.ts +66 -0
- package/dist/features/terrain.d.ts.map +1 -0
- package/dist/features/terrain.js +291 -0
- package/dist/features/terrain.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/interaction/builtin-intents.d.ts +9 -0
- package/dist/interaction/builtin-intents.d.ts.map +1 -0
- package/dist/interaction/builtin-intents.js +61 -0
- package/dist/interaction/builtin-intents.js.map +1 -0
- package/dist/interaction/catalog.d.ts +24 -0
- package/dist/interaction/catalog.d.ts.map +1 -0
- package/dist/interaction/catalog.js +20 -0
- package/dist/interaction/catalog.js.map +1 -0
- package/dist/interaction/controller.d.ts +137 -0
- package/dist/interaction/controller.d.ts.map +1 -0
- package/dist/interaction/controller.js +215 -0
- package/dist/interaction/controller.js.map +1 -0
- package/dist/interaction/index.d.ts +14 -0
- package/dist/interaction/index.d.ts.map +1 -0
- package/dist/interaction/index.js +13 -0
- package/dist/interaction/input.d.ts +26 -0
- package/dist/interaction/input.d.ts.map +1 -0
- package/dist/interaction/input.js +33 -0
- package/dist/interaction/input.js.map +1 -0
- package/dist/interaction/intents.d.ts +80 -0
- package/dist/interaction/intents.d.ts.map +1 -0
- package/dist/interaction/keyboard.d.ts +26 -0
- package/dist/interaction/keyboard.d.ts.map +1 -0
- package/dist/interaction/keyboard.js +32 -0
- package/dist/interaction/keyboard.js.map +1 -0
- package/dist/interaction/picking.d.ts +33 -0
- package/dist/interaction/picking.d.ts.map +1 -0
- package/dist/interaction/picking.js +35 -0
- package/dist/interaction/picking.js.map +1 -0
- package/dist/interaction/pipeline.d.ts +45 -0
- package/dist/interaction/pipeline.d.ts.map +1 -0
- package/dist/interaction/pipeline.js +26 -0
- package/dist/interaction/pipeline.js.map +1 -0
- package/dist/interaction/placement.d.ts +76 -0
- package/dist/interaction/placement.d.ts.map +1 -0
- package/dist/interaction/placement.js +238 -0
- package/dist/interaction/placement.js.map +1 -0
- package/dist/interaction/selection-tool.d.ts +29 -0
- package/dist/interaction/selection-tool.d.ts.map +1 -0
- package/dist/interaction/selection-tool.js +190 -0
- package/dist/interaction/selection-tool.js.map +1 -0
- package/dist/interaction/steps.d.ts +62 -0
- package/dist/interaction/steps.d.ts.map +1 -0
- package/dist/interaction/steps.js +126 -0
- package/dist/interaction/steps.js.map +1 -0
- package/dist/interaction/store.d.ts +10 -0
- package/dist/interaction/store.d.ts.map +1 -0
- package/dist/interaction/store.js +28 -0
- package/dist/interaction/store.js.map +1 -0
- package/dist/interaction/tools.d.ts +26 -0
- package/dist/interaction/tools.d.ts.map +1 -0
- package/dist/interaction/tools.js +41 -0
- package/dist/interaction/tools.js.map +1 -0
- package/dist/model/assets.d.ts +36 -0
- package/dist/model/assets.d.ts.map +1 -0
- package/dist/model/assets.js +18 -0
- package/dist/model/assets.js.map +1 -0
- package/dist/model/committer.d.ts +66 -0
- package/dist/model/committer.d.ts.map +1 -0
- package/dist/model/committer.js +38 -0
- package/dist/model/committer.js.map +1 -0
- package/dist/model/core-patches.d.ts +2 -0
- package/dist/model/core-patches.d.ts.map +1 -0
- package/dist/model/core-patches.js +193 -0
- package/dist/model/core-patches.js.map +1 -0
- package/dist/model/define-map.d.ts +52 -0
- package/dist/model/define-map.d.ts.map +1 -0
- package/dist/model/define-map.js +66 -0
- package/dist/model/define-map.js.map +1 -0
- package/dist/model/definition.d.ts +57 -0
- package/dist/model/definition.d.ts.map +1 -0
- package/dist/model/definition.js +6 -0
- package/dist/model/definition.js.map +1 -0
- package/dist/model/errors.d.ts +21 -0
- package/dist/model/errors.d.ts.map +1 -0
- package/dist/model/errors.js +14 -0
- package/dist/model/errors.js.map +1 -0
- package/dist/model/history.d.ts +43 -0
- package/dist/model/history.d.ts.map +1 -0
- package/dist/model/history.js +141 -0
- package/dist/model/history.js.map +1 -0
- package/dist/model/index.d.ts +14 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +14 -0
- package/dist/model/json.d.ts +15 -0
- package/dist/model/json.d.ts.map +1 -0
- package/dist/model/json.js +35 -0
- package/dist/model/json.js.map +1 -0
- package/dist/model/model.d.ts +68 -0
- package/dist/model/model.d.ts.map +1 -0
- package/dist/model/model.js +170 -0
- package/dist/model/model.js.map +1 -0
- package/dist/model/parse.d.ts +24 -0
- package/dist/model/parse.d.ts.map +1 -0
- package/dist/model/parse.js +165 -0
- package/dist/model/parse.js.map +1 -0
- package/dist/model/patches.d.ts +100 -0
- package/dist/model/patches.d.ts.map +1 -0
- package/dist/model/patches.js +21 -0
- package/dist/model/patches.js.map +1 -0
- package/dist/model/result.d.ts +22 -0
- package/dist/model/result.d.ts.map +1 -0
- package/dist/model/result.js +10 -0
- package/dist/model/result.js.map +1 -0
- package/dist/model/source.d.ts +52 -0
- package/dist/model/source.d.ts.map +1 -0
- package/dist/model/source.js +75 -0
- package/dist/model/source.js.map +1 -0
- package/dist/protocol/index.d.ts +92 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +106 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/remote/committer.d.ts +43 -0
- package/dist/remote/committer.d.ts.map +1 -0
- package/dist/remote/committer.js +206 -0
- package/dist/remote/committer.js.map +1 -0
- package/dist/remote/index.d.ts +4 -0
- package/dist/remote/index.d.ts.map +1 -0
- package/dist/remote/index.js +4 -0
- package/dist/remote/join.d.ts +30 -0
- package/dist/remote/join.d.ts.map +1 -0
- package/dist/remote/join.js +36 -0
- package/dist/remote/join.js.map +1 -0
- package/dist/remote/memory-transport.d.ts +20 -0
- package/dist/remote/memory-transport.d.ts.map +1 -0
- package/dist/remote/memory-transport.js +48 -0
- package/dist/remote/memory-transport.js.map +1 -0
- package/dist/renderer/effects.d.ts +52 -0
- package/dist/renderer/effects.d.ts.map +1 -0
- package/dist/renderer/effects.js +111 -0
- package/dist/renderer/effects.js.map +1 -0
- package/dist/renderer/feature.d.ts +79 -0
- package/dist/renderer/feature.d.ts.map +1 -0
- package/dist/renderer/feature.js +50 -0
- package/dist/renderer/feature.js.map +1 -0
- package/dist/renderer/geometry.d.ts +59 -0
- package/dist/renderer/geometry.d.ts.map +1 -0
- package/dist/renderer/geometry.js +114 -0
- package/dist/renderer/geometry.js.map +1 -0
- package/dist/renderer/index.d.ts +7 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +7 -0
- package/dist/renderer/scene.d.ts +77 -0
- package/dist/renderer/scene.d.ts.map +1 -0
- package/dist/renderer/scene.js +125 -0
- package/dist/renderer/scene.js.map +1 -0
- package/dist/renderer/textures.d.ts +20 -0
- package/dist/renderer/textures.d.ts.map +1 -0
- package/dist/renderer/textures.js +61 -0
- package/dist/renderer/textures.js.map +1 -0
- package/dist/renderer/view.d.ts +139 -0
- package/dist/renderer/view.d.ts.map +1 -0
- package/dist/renderer/view.js +349 -0
- package/dist/renderer/view.js.map +1 -0
- package/dist/rpgjs/shared.d.ts +41 -0
- package/dist/rpgjs/shared.d.ts.map +1 -0
- package/dist/rpgjs/shared.js +77 -0
- package/dist/rpgjs/shared.js.map +1 -0
- package/dist/server/index.d.ts +64 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +205 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/storage.d.ts +16 -0
- package/dist/server/storage.d.ts.map +1 -0
- package/dist/server/storage.js +52 -0
- package/dist/server/storage.js.map +1 -0
- package/dist/skins/default.d.ts +27 -0
- package/dist/skins/default.d.ts.map +1 -0
- package/dist/skins/default.js +144 -0
- package/dist/skins/default.js.map +1 -0
- package/dist/skins/frames.d.ts +19 -0
- package/dist/skins/frames.d.ts.map +1 -0
- package/dist/skins/frames.js +49 -0
- package/dist/skins/frames.js.map +1 -0
- package/dist/skins/game.d.ts +21 -0
- package/dist/skins/game.d.ts.map +1 -0
- package/dist/skins/game.js +21 -0
- package/dist/skins/game.js.map +1 -0
- package/dist/skins/index.d.ts +5 -0
- package/dist/skins/index.d.ts.map +1 -0
- package/dist/skins/index.js +5 -0
- package/dist/skins/types.d.ts +46 -0
- package/dist/skins/types.d.ts.map +1 -0
- package/dist/skins/types.js +12 -0
- package/dist/skins/types.js.map +1 -0
- package/dist/terrain/data.d.ts +10 -0
- package/dist/terrain/data.d.ts.map +1 -0
- package/dist/terrain/data.js +83 -0
- package/dist/terrain/data.js.map +1 -0
- package/dist/terrain/define.d.ts +72 -0
- package/dist/terrain/define.d.ts.map +1 -0
- package/dist/terrain/define.js +91 -0
- package/dist/terrain/define.js.map +1 -0
- package/dist/terrain/editing.d.ts +54 -0
- package/dist/terrain/editing.d.ts.map +1 -0
- package/dist/terrain/editing.js +169 -0
- package/dist/terrain/editing.js.map +1 -0
- package/dist/terrain/index.d.ts +10 -0
- package/dist/terrain/index.d.ts.map +1 -0
- package/dist/terrain/index.js +10 -0
- package/dist/terrain/kernel.d.ts +57 -0
- package/dist/terrain/kernel.d.ts.map +1 -0
- package/dist/terrain/kernel.js +198 -0
- package/dist/terrain/kernel.js.map +1 -0
- package/dist/terrain/mask.d.ts +37 -0
- package/dist/terrain/mask.d.ts.map +1 -0
- package/dist/terrain/mask.js +244 -0
- package/dist/terrain/mask.js.map +1 -0
- package/dist/terrain/patches.d.ts +32 -0
- package/dist/terrain/patches.d.ts.map +1 -0
- package/dist/terrain/patches.js +135 -0
- package/dist/terrain/patches.js.map +1 -0
- package/dist/terrain/rle.d.ts +4 -0
- package/dist/terrain/rle.d.ts.map +1 -0
- package/dist/terrain/rle.js +68 -0
- package/dist/terrain/rle.js.map +1 -0
- package/dist/terrain/scheduler.d.ts +46 -0
- package/dist/terrain/scheduler.d.ts.map +1 -0
- package/dist/terrain/scheduler.js +148 -0
- package/dist/terrain/scheduler.js.map +1 -0
- package/dist/terrain/types.d.ts +110 -0
- package/dist/terrain/types.d.ts.map +1 -0
- package/dist/terrain/types.js +11 -0
- package/dist/terrain/types.js.map +1 -0
- package/dist/terrain-render/backend.d.ts +66 -0
- package/dist/terrain-render/backend.d.ts.map +1 -0
- package/dist/terrain-render/backend.js +96 -0
- package/dist/terrain-render/backend.js.map +1 -0
- package/dist/terrain-render/host.d.ts +21 -0
- package/dist/terrain-render/host.d.ts.map +1 -0
- package/dist/terrain-render/host.js +62 -0
- package/dist/terrain-render/host.js.map +1 -0
- package/dist/terrain-render/index.d.ts +3 -0
- package/dist/terrain-render/index.d.ts.map +1 -0
- package/dist/terrain-render/index.js +3 -0
- package/dist/terrain-render/worker.d.ts +2 -0
- package/dist/terrain-render/worker.d.ts.map +1 -0
- package/dist/terrain-render/worker.js +34 -0
- package/dist/terrain-render/worker.js.map +1 -0
- package/package.json +124 -3
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { JsonObject } from '../model/json';
|
|
2
|
+
/** Version of the terrain data stored under `extensions.terrain`. */
|
|
3
|
+
export declare const TERRAIN_DATA_VERSION: 1;
|
|
4
|
+
/** The extension id the terrain feature owns. */
|
|
5
|
+
export declare const TERRAIN_EXTENSION_ID = "terrain";
|
|
6
|
+
/** What a mask pixel holds when no material is painted there. */
|
|
7
|
+
export declare const NO_MATERIAL = 65535;
|
|
8
|
+
export type TerrainMode = {
|
|
9
|
+
readonly type: "hard";
|
|
10
|
+
} | {
|
|
11
|
+
readonly type: "fade";
|
|
12
|
+
readonly width?: number;
|
|
13
|
+
readonly curve?: "linear" | "smooth" | "sharp";
|
|
14
|
+
} | {
|
|
15
|
+
readonly type: "nine-slice";
|
|
16
|
+
readonly center: {
|
|
17
|
+
readonly x: number;
|
|
18
|
+
readonly y: number;
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
readonly type: "water";
|
|
24
|
+
readonly border?: boolean;
|
|
25
|
+
readonly foam?: boolean;
|
|
26
|
+
} | {
|
|
27
|
+
readonly type: "custom";
|
|
28
|
+
readonly shaderKey: string;
|
|
29
|
+
readonly params?: JsonObject;
|
|
30
|
+
};
|
|
31
|
+
/** One material of the palette. Its position in `materials` is the value stored in the mask. */
|
|
32
|
+
export interface TerrainMaterial {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
/** Asset reference of the texture (see `AssetResolver`). */
|
|
35
|
+
readonly texture: string;
|
|
36
|
+
readonly mode?: TerrainMode;
|
|
37
|
+
/** Painted over lower priorities. Defaults to the position in the palette. */
|
|
38
|
+
readonly priority?: number;
|
|
39
|
+
/** Collision polygons come from the mask where this material is painted. */
|
|
40
|
+
readonly collision?: boolean;
|
|
41
|
+
readonly specialType?: string;
|
|
42
|
+
/** Period, in world pixels, at which the texture repeats. */
|
|
43
|
+
readonly renderTileSize?: number;
|
|
44
|
+
readonly renderingStyle?: "pixel-art" | "hd-2d";
|
|
45
|
+
}
|
|
46
|
+
export interface TerrainTransition {
|
|
47
|
+
readonly from: string;
|
|
48
|
+
readonly to: string;
|
|
49
|
+
readonly mode: TerrainMode;
|
|
50
|
+
readonly priority?: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The control mask: which material is under each pixel. Stored by chunks of run-length encoded
|
|
54
|
+
* values, so that a patch only rewrites the chunks it touches and the others are shared between states.
|
|
55
|
+
*/
|
|
56
|
+
export interface TerrainMask {
|
|
57
|
+
/** World pixels per mask pixel. 1 is pixel-perfect; more is cheaper in memory. */
|
|
58
|
+
readonly scale: number;
|
|
59
|
+
/** Size of the mask, in mask pixels. */
|
|
60
|
+
readonly width: number;
|
|
61
|
+
readonly height: number;
|
|
62
|
+
/** Side of a chunk, in mask pixels. */
|
|
63
|
+
readonly chunk: number;
|
|
64
|
+
/** Material index of the chunks that are not in `chunks`. */
|
|
65
|
+
readonly fill: number;
|
|
66
|
+
/** `"col,row"` to the run-length encoding of the chunk (see `encodeRuns`). */
|
|
67
|
+
readonly chunks: {
|
|
68
|
+
readonly [key: string]: string;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export interface TerrainData {
|
|
72
|
+
readonly version: typeof TERRAIN_DATA_VERSION;
|
|
73
|
+
readonly materials: readonly TerrainMaterial[];
|
|
74
|
+
readonly transitions?: readonly TerrainTransition[];
|
|
75
|
+
readonly mask: TerrainMask;
|
|
76
|
+
/** Holes and walls drawn by strokes, as the kernel takes them (`@rpgjs/render-map2d`). */
|
|
77
|
+
readonly morphology?: readonly JsonObject[];
|
|
78
|
+
readonly water?: {
|
|
79
|
+
readonly enabled: boolean;
|
|
80
|
+
readonly speed: number;
|
|
81
|
+
readonly intensity: number;
|
|
82
|
+
readonly direction: number;
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** A region of the mask, in mask pixels. */
|
|
86
|
+
export interface MaskRect {
|
|
87
|
+
readonly x: number;
|
|
88
|
+
readonly y: number;
|
|
89
|
+
readonly width: number;
|
|
90
|
+
readonly height: number;
|
|
91
|
+
}
|
|
92
|
+
export type TerrainShape = {
|
|
93
|
+
readonly type: "fill";
|
|
94
|
+
} | {
|
|
95
|
+
readonly type: "circle";
|
|
96
|
+
readonly x: number;
|
|
97
|
+
readonly y: number;
|
|
98
|
+
readonly radius: number;
|
|
99
|
+
} | {
|
|
100
|
+
readonly type: "rect";
|
|
101
|
+
readonly x: number;
|
|
102
|
+
readonly y: number;
|
|
103
|
+
readonly width: number;
|
|
104
|
+
readonly height: number;
|
|
105
|
+
} | {
|
|
106
|
+
readonly type: "stroke";
|
|
107
|
+
readonly points: readonly (readonly [x: number, y: number])[];
|
|
108
|
+
readonly radius: number;
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/terrain/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/terrain/types.ts
|
|
2
|
+
/** Version of the terrain data stored under `extensions.terrain`. */
|
|
3
|
+
var TERRAIN_DATA_VERSION = 1;
|
|
4
|
+
/** The extension id the terrain feature owns. */
|
|
5
|
+
var TERRAIN_EXTENSION_ID = "terrain";
|
|
6
|
+
/** What a mask pixel holds when no material is painted there. */
|
|
7
|
+
var NO_MATERIAL = 65535;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { NO_MATERIAL, TERRAIN_DATA_VERSION, TERRAIN_EXTENSION_ID };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/terrain/types.ts"],"sourcesContent":["import type { JsonObject } from \"../model/json\";\n\n/** Version of the terrain data stored under `extensions.terrain`. */\nexport const TERRAIN_DATA_VERSION = 1 as const;\n\n/** The extension id the terrain feature owns. */\nexport const TERRAIN_EXTENSION_ID = \"terrain\";\n\n/** What a mask pixel holds when no material is painted there. */\nexport const NO_MATERIAL = 0xffff;\n\nexport type TerrainMode =\n | { readonly type: \"hard\" }\n | { readonly type: \"fade\"; readonly width?: number; readonly curve?: \"linear\" | \"smooth\" | \"sharp\" }\n | { readonly type: \"nine-slice\"; readonly center: { readonly x: number; readonly y: number; readonly width: number; readonly height: number } }\n | { readonly type: \"water\"; readonly border?: boolean; readonly foam?: boolean }\n | { readonly type: \"custom\"; readonly shaderKey: string; readonly params?: JsonObject };\n\n/** One material of the palette. Its position in `materials` is the value stored in the mask. */\nexport interface TerrainMaterial {\n readonly id: string;\n /** Asset reference of the texture (see `AssetResolver`). */\n readonly texture: string;\n readonly mode?: TerrainMode;\n /** Painted over lower priorities. Defaults to the position in the palette. */\n readonly priority?: number;\n /** Collision polygons come from the mask where this material is painted. */\n readonly collision?: boolean;\n readonly specialType?: string;\n /** Period, in world pixels, at which the texture repeats. */\n readonly renderTileSize?: number;\n readonly renderingStyle?: \"pixel-art\" | \"hd-2d\";\n}\n\nexport interface TerrainTransition {\n readonly from: string;\n readonly to: string;\n readonly mode: TerrainMode;\n readonly priority?: number;\n}\n\n/**\n * The control mask: which material is under each pixel. Stored by chunks of run-length encoded\n * values, so that a patch only rewrites the chunks it touches and the others are shared between states.\n */\nexport interface TerrainMask {\n /** World pixels per mask pixel. 1 is pixel-perfect; more is cheaper in memory. */\n readonly scale: number;\n /** Size of the mask, in mask pixels. */\n readonly width: number;\n readonly height: number;\n /** Side of a chunk, in mask pixels. */\n readonly chunk: number;\n /** Material index of the chunks that are not in `chunks`. */\n readonly fill: number;\n /** `\"col,row\"` to the run-length encoding of the chunk (see `encodeRuns`). */\n readonly chunks: { readonly [key: string]: string };\n}\n\nexport interface TerrainData {\n readonly version: typeof TERRAIN_DATA_VERSION;\n readonly materials: readonly TerrainMaterial[];\n readonly transitions?: readonly TerrainTransition[];\n readonly mask: TerrainMask;\n /** Holes and walls drawn by strokes, as the kernel takes them (`@rpgjs/render-map2d`). */\n readonly morphology?: readonly JsonObject[];\n readonly water?: { readonly enabled: boolean; readonly speed: number; readonly intensity: number; readonly direction: number };\n}\n\n/** A region of the mask, in mask pixels. */\nexport interface MaskRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport type TerrainShape =\n | { readonly type: \"fill\" }\n | { readonly type: \"circle\"; readonly x: number; readonly y: number; readonly radius: number }\n | { readonly type: \"rect\"; readonly x: number; readonly y: number; readonly width: number; readonly height: number }\n | { readonly type: \"stroke\"; readonly points: readonly (readonly [x: number, y: number])[]; readonly radius: number };\n"],"mappings":";;AAGA,IAAa,uBAAuB;;AAGpC,IAAa,uBAAuB;;AAGpC,IAAa,cAAc"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { TerrainRenderInit } from '../terrain/kernel';
|
|
2
|
+
import { TerrainFrame, WorldRect } from '../terrain/scheduler';
|
|
3
|
+
import { MaskRect } from '../terrain/types';
|
|
4
|
+
/**
|
|
5
|
+
* Where the kernel runs. The terrain feature only talks to this, so the same feature works in the
|
|
6
|
+
* main thread (small maps, tests), in a pool of workers (live painting) or anywhere else.
|
|
7
|
+
*/
|
|
8
|
+
export interface TerrainBackend {
|
|
9
|
+
/** How many renders it can run at once. */
|
|
10
|
+
readonly concurrency: number;
|
|
11
|
+
/** Gives the terrain to render. Called again when the palette or the morphology changes. */
|
|
12
|
+
init(init: TerrainRenderInit): Promise<void>;
|
|
13
|
+
/** Material values over a rectangle of the mask, in the order the patches were applied. */
|
|
14
|
+
updateMask(rect: MaskRect, values: Uint16Array): void;
|
|
15
|
+
render(rect: WorldRect, margin?: number): Promise<TerrainFrame>;
|
|
16
|
+
destroy(): void;
|
|
17
|
+
}
|
|
18
|
+
/** The kernel on the calling thread. A 512 px chunk takes a few hundred milliseconds: fine for tests and small maps. */
|
|
19
|
+
export declare function inlineTerrainBackend(): TerrainBackend;
|
|
20
|
+
/** What travels to a worker and back. */
|
|
21
|
+
export type WorkerRequest = {
|
|
22
|
+
readonly type: "init";
|
|
23
|
+
readonly init: TerrainRenderInit;
|
|
24
|
+
} | {
|
|
25
|
+
readonly type: "mask";
|
|
26
|
+
readonly rect: MaskRect;
|
|
27
|
+
readonly values: Uint16Array;
|
|
28
|
+
} | {
|
|
29
|
+
readonly type: "render";
|
|
30
|
+
readonly job: number;
|
|
31
|
+
readonly rect: WorldRect;
|
|
32
|
+
readonly margin?: number;
|
|
33
|
+
};
|
|
34
|
+
export type WorkerResponse = {
|
|
35
|
+
readonly type: "ready";
|
|
36
|
+
} | {
|
|
37
|
+
readonly type: "frame";
|
|
38
|
+
readonly job: number;
|
|
39
|
+
readonly frame: TerrainFrame;
|
|
40
|
+
} | {
|
|
41
|
+
readonly type: "error";
|
|
42
|
+
readonly job?: number;
|
|
43
|
+
readonly message: string;
|
|
44
|
+
};
|
|
45
|
+
export interface WorkerLike {
|
|
46
|
+
postMessage(message: WorkerRequest, transfer?: Transferable[]): void;
|
|
47
|
+
addEventListener(type: "message", listener: (event: {
|
|
48
|
+
data: WorkerResponse;
|
|
49
|
+
}) => void): void;
|
|
50
|
+
addEventListener(type: "error", listener: (event: {
|
|
51
|
+
message?: string;
|
|
52
|
+
}) => void): void;
|
|
53
|
+
terminate(): void;
|
|
54
|
+
}
|
|
55
|
+
export interface WorkerBackendOptions {
|
|
56
|
+
/** Creates one worker that runs `@rpgjs/map-builder/terrain-render/worker`. */
|
|
57
|
+
readonly createWorker: () => WorkerLike;
|
|
58
|
+
/** Number of workers. Defaults to the number of cores minus one, at most 4. */
|
|
59
|
+
readonly workers?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The kernel in a pool of workers: the main thread only sends patches and receives frames, and stays
|
|
63
|
+
* free while a stroke is painted. Every worker keeps its own copy of the mask and receives every change.
|
|
64
|
+
*/
|
|
65
|
+
export declare function workerTerrainBackend(options: WorkerBackendOptions): TerrainBackend;
|
|
66
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/terrain-render/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4FAA4F;IAC5F,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,2FAA2F;IAC3F,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACtD,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wHAAwH;AACxH,wBAAgB,oBAAoB,IAAI,cAAc,CASrD;AAED,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1G,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IACrE,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC7F,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACvF,SAAS,IAAI,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,+EAA+E;IAC/E,QAAQ,CAAC,YAAY,EAAE,MAAM,UAAU,CAAC;IACxC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,oBAAoB,GAAG,cAAc,CAgElF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { TerrainKernelHost } from "./host.js";
|
|
2
|
+
//#region src/terrain-render/backend.ts
|
|
3
|
+
/** The kernel on the calling thread. A 512 px chunk takes a few hundred milliseconds: fine for tests and small maps. */
|
|
4
|
+
function inlineTerrainBackend() {
|
|
5
|
+
const host = new TerrainKernelHost();
|
|
6
|
+
return {
|
|
7
|
+
concurrency: 1,
|
|
8
|
+
init: async (init) => host.init(init),
|
|
9
|
+
updateMask: (rect, values) => host.updateMask(rect, values),
|
|
10
|
+
render: async (rect, margin) => host.render(rect, margin),
|
|
11
|
+
destroy: () => host.destroy()
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The kernel in a pool of workers: the main thread only sends patches and receives frames, and stays
|
|
16
|
+
* free while a stroke is painted. Every worker keeps its own copy of the mask and receives every change.
|
|
17
|
+
*/
|
|
18
|
+
function workerTerrainBackend(options) {
|
|
19
|
+
const count = Math.max(1, options.workers ?? Math.min(4, Math.max(1, (globalThis.navigator?.hardwareConcurrency ?? 4) - 1)));
|
|
20
|
+
const workers = [];
|
|
21
|
+
const waiting = /* @__PURE__ */ new Map();
|
|
22
|
+
let ready = [];
|
|
23
|
+
let jobs = 0;
|
|
24
|
+
let next = 0;
|
|
25
|
+
const start = () => {
|
|
26
|
+
if (workers.length > 0) return;
|
|
27
|
+
for (let i = 0; i < count; i += 1) {
|
|
28
|
+
const worker = options.createWorker();
|
|
29
|
+
worker.addEventListener("message", ({ data }) => {
|
|
30
|
+
if (data.type === "ready") ready.splice(0, 1)[0]?.();
|
|
31
|
+
else if (data.type === "frame") {
|
|
32
|
+
waiting.get(data.job)?.resolve(data.frame);
|
|
33
|
+
waiting.delete(data.job);
|
|
34
|
+
} else if (data.type === "error" && data.job !== void 0) {
|
|
35
|
+
waiting.get(data.job)?.reject(new Error(data.message));
|
|
36
|
+
waiting.delete(data.job);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
worker.addEventListener("error", (event) => {
|
|
40
|
+
for (const [job, pending] of waiting) {
|
|
41
|
+
pending.reject(new Error(event.message ?? "terrain worker failed"));
|
|
42
|
+
waiting.delete(job);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
workers.push(worker);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return {
|
|
49
|
+
concurrency: count,
|
|
50
|
+
init(init) {
|
|
51
|
+
start();
|
|
52
|
+
return Promise.all(workers.map((worker) => new Promise((resolve) => {
|
|
53
|
+
ready.push(resolve);
|
|
54
|
+
worker.postMessage({
|
|
55
|
+
type: "init",
|
|
56
|
+
init
|
|
57
|
+
});
|
|
58
|
+
}))).then(() => void 0);
|
|
59
|
+
},
|
|
60
|
+
updateMask(rect, values) {
|
|
61
|
+
for (const worker of workers) worker.postMessage({
|
|
62
|
+
type: "mask",
|
|
63
|
+
rect,
|
|
64
|
+
values: values.slice()
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
render(rect, margin) {
|
|
68
|
+
const job = jobs += 1;
|
|
69
|
+
const worker = workers[next++ % workers.length];
|
|
70
|
+
if (!worker) return Promise.reject(/* @__PURE__ */ new Error("terrain backend: not initialised"));
|
|
71
|
+
return new Promise((resolve, reject) => {
|
|
72
|
+
waiting.set(job, {
|
|
73
|
+
resolve,
|
|
74
|
+
reject
|
|
75
|
+
});
|
|
76
|
+
worker.postMessage({
|
|
77
|
+
type: "render",
|
|
78
|
+
job,
|
|
79
|
+
rect,
|
|
80
|
+
...margin !== void 0 ? { margin } : {}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
destroy() {
|
|
85
|
+
for (const worker of workers) worker.terminate();
|
|
86
|
+
workers.length = 0;
|
|
87
|
+
for (const pending of waiting.values()) pending.reject(/* @__PURE__ */ new Error("terrain backend: destroyed"));
|
|
88
|
+
waiting.clear();
|
|
89
|
+
ready = [];
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { inlineTerrainBackend, workerTerrainBackend };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","names":[],"sources":["../../src/terrain-render/backend.ts"],"sourcesContent":["import type { TerrainRenderInit } from \"../terrain/kernel\";\nimport type { TerrainFrame, WorldRect } from \"../terrain/scheduler\";\nimport type { MaskRect } from \"../terrain/types\";\nimport { TerrainKernelHost } from \"./host\";\n\n/**\n * Where the kernel runs. The terrain feature only talks to this, so the same feature works in the\n * main thread (small maps, tests), in a pool of workers (live painting) or anywhere else.\n */\nexport interface TerrainBackend {\n /** How many renders it can run at once. */\n readonly concurrency: number;\n /** Gives the terrain to render. Called again when the palette or the morphology changes. */\n init(init: TerrainRenderInit): Promise<void>;\n /** Material values over a rectangle of the mask, in the order the patches were applied. */\n updateMask(rect: MaskRect, values: Uint16Array): void;\n render(rect: WorldRect, margin?: number): Promise<TerrainFrame>;\n destroy(): void;\n}\n\n/** The kernel on the calling thread. A 512 px chunk takes a few hundred milliseconds: fine for tests and small maps. */\nexport function inlineTerrainBackend(): TerrainBackend {\n const host = new TerrainKernelHost();\n return {\n concurrency: 1,\n init: async (init) => host.init(init),\n updateMask: (rect, values) => host.updateMask(rect, values),\n render: async (rect, margin) => host.render(rect, margin),\n destroy: () => host.destroy(),\n };\n}\n\n/** What travels to a worker and back. */\nexport type WorkerRequest =\n | { readonly type: \"init\"; readonly init: TerrainRenderInit }\n | { readonly type: \"mask\"; readonly rect: MaskRect; readonly values: Uint16Array }\n | { readonly type: \"render\"; readonly job: number; readonly rect: WorldRect; readonly margin?: number };\n\nexport type WorkerResponse =\n | { readonly type: \"ready\" }\n | { readonly type: \"frame\"; readonly job: number; readonly frame: TerrainFrame }\n | { readonly type: \"error\"; readonly job?: number; readonly message: string };\n\nexport interface WorkerLike {\n postMessage(message: WorkerRequest, transfer?: Transferable[]): void;\n addEventListener(type: \"message\", listener: (event: { data: WorkerResponse }) => void): void;\n addEventListener(type: \"error\", listener: (event: { message?: string }) => void): void;\n terminate(): void;\n}\n\nexport interface WorkerBackendOptions {\n /** Creates one worker that runs `@rpgjs/map-builder/terrain-render/worker`. */\n readonly createWorker: () => WorkerLike;\n /** Number of workers. Defaults to the number of cores minus one, at most 4. */\n readonly workers?: number;\n}\n\n/**\n * The kernel in a pool of workers: the main thread only sends patches and receives frames, and stays\n * free while a stroke is painted. Every worker keeps its own copy of the mask and receives every change.\n */\nexport function workerTerrainBackend(options: WorkerBackendOptions): TerrainBackend {\n const count = Math.max(1, options.workers ?? Math.min(4, Math.max(1, ((globalThis as { navigator?: { hardwareConcurrency?: number } }).navigator?.hardwareConcurrency ?? 4) - 1)));\n const workers: WorkerLike[] = [];\n const waiting = new Map<number, { resolve: (frame: TerrainFrame) => void; reject: (error: Error) => void }>();\n let ready: Array<() => void> = [];\n let jobs = 0;\n let next = 0;\n\n const start = (): void => {\n if (workers.length > 0) return;\n for (let i = 0; i < count; i += 1) {\n const worker = options.createWorker();\n worker.addEventListener(\"message\", ({ data }) => {\n if (data.type === \"ready\") ready.splice(0, 1)[0]?.();\n else if (data.type === \"frame\") {\n waiting.get(data.job)?.resolve(data.frame);\n waiting.delete(data.job);\n } else if (data.type === \"error\" && data.job !== undefined) {\n waiting.get(data.job)?.reject(new Error(data.message));\n waiting.delete(data.job);\n }\n });\n worker.addEventListener(\"error\", (event) => {\n for (const [job, pending] of waiting) {\n pending.reject(new Error(event.message ?? \"terrain worker failed\"));\n waiting.delete(job);\n }\n });\n workers.push(worker);\n }\n };\n\n return {\n concurrency: count,\n init(init) {\n start();\n return Promise.all(\n workers.map((worker) => new Promise<void>((resolve) => {\n ready.push(resolve);\n worker.postMessage({ type: \"init\", init });\n })),\n ).then(() => undefined);\n },\n updateMask(rect, values) {\n // Each worker gets its own copy: the buffer is not transferred.\n for (const worker of workers) worker.postMessage({ type: \"mask\", rect, values: values.slice() });\n },\n render(rect, margin) {\n const job = (jobs += 1);\n const worker = workers[next++ % workers.length];\n if (!worker) return Promise.reject(new Error(\"terrain backend: not initialised\"));\n return new Promise<TerrainFrame>((resolve, reject) => {\n waiting.set(job, { resolve, reject });\n worker.postMessage({ type: \"render\", job, rect, ...(margin !== undefined ? { margin } : {}) });\n });\n },\n destroy() {\n for (const worker of workers) worker.terminate();\n workers.length = 0;\n for (const pending of waiting.values()) pending.reject(new Error(\"terrain backend: destroyed\"));\n waiting.clear();\n ready = [];\n },\n };\n}\n"],"mappings":";;;AAqBA,SAAgB,uBAAuC;CACrD,MAAM,OAAO,IAAI,kBAAkB;CACnC,OAAO;EACL,aAAa;EACb,MAAM,OAAO,SAAS,KAAK,KAAK,IAAI;EACpC,aAAa,MAAM,WAAW,KAAK,WAAW,MAAM,MAAM;EAC1D,QAAQ,OAAO,MAAM,WAAW,KAAK,OAAO,MAAM,MAAM;EACxD,eAAe,KAAK,QAAQ;CAC9B;AACF;;;;;AA+BA,SAAgB,qBAAqB,SAA+C;CAClF,MAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAK,WAAgE,WAAW,uBAAuB,KAAK,CAAC,CAAC,CAAC;CACjL,MAAM,UAAwB,CAAC;CAC/B,MAAM,0BAAU,IAAI,IAAwF;CAC5G,IAAI,QAA2B,CAAC;CAChC,IAAI,OAAO;CACX,IAAI,OAAO;CAEX,MAAM,cAAoB;EACxB,IAAI,QAAQ,SAAS,GAAG;EACxB,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;GACjC,MAAM,SAAS,QAAQ,aAAa;GACpC,OAAO,iBAAiB,YAAY,EAAE,WAAW;IAC/C,IAAI,KAAK,SAAS,SAAS,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;SAC9C,IAAI,KAAK,SAAS,SAAS;KAC9B,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,QAAQ,KAAK,KAAK;KACzC,QAAQ,OAAO,KAAK,GAAG;IACzB,OAAO,IAAI,KAAK,SAAS,WAAW,KAAK,QAAQ,KAAA,GAAW;KAC1D,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,IAAI,MAAM,KAAK,OAAO,CAAC;KACrD,QAAQ,OAAO,KAAK,GAAG;IACzB;GACF,CAAC;GACD,OAAO,iBAAiB,UAAU,UAAU;IAC1C,KAAK,MAAM,CAAC,KAAK,YAAY,SAAS;KACpC,QAAQ,OAAO,IAAI,MAAM,MAAM,WAAW,uBAAuB,CAAC;KAClE,QAAQ,OAAO,GAAG;IACpB;GACF,CAAC;GACD,QAAQ,KAAK,MAAM;EACrB;CACF;CAEA,OAAO;EACL,aAAa;EACb,KAAK,MAAM;GACT,MAAM;GACN,OAAO,QAAQ,IACb,QAAQ,KAAK,WAAW,IAAI,SAAe,YAAY;IACrD,MAAM,KAAK,OAAO;IAClB,OAAO,YAAY;KAAE,MAAM;KAAQ;IAAK,CAAC;GAC3C,CAAC,CAAC,CACJ,CAAC,CAAC,WAAW,KAAA,CAAS;EACxB;EACA,WAAW,MAAM,QAAQ;GAEvB,KAAK,MAAM,UAAU,SAAS,OAAO,YAAY;IAAE,MAAM;IAAQ;IAAM,QAAQ,OAAO,MAAM;GAAE,CAAC;EACjG;EACA,OAAO,MAAM,QAAQ;GACnB,MAAM,MAAO,QAAQ;GACrB,MAAM,SAAS,QAAQ,SAAS,QAAQ;GACxC,IAAI,CAAC,QAAQ,OAAO,QAAQ,uBAAO,IAAI,MAAM,kCAAkC,CAAC;GAChF,OAAO,IAAI,SAAuB,SAAS,WAAW;IACpD,QAAQ,IAAI,KAAK;KAAE;KAAS;IAAO,CAAC;IACpC,OAAO,YAAY;KAAE,MAAM;KAAU;KAAK;KAAM,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;IAAG,CAAC;GAC/F,CAAC;EACH;EACA,UAAU;GACR,KAAK,MAAM,UAAU,SAAS,OAAO,UAAU;GAC/C,QAAQ,SAAS;GACjB,KAAK,MAAM,WAAW,QAAQ,OAAO,GAAG,QAAQ,uBAAO,IAAI,MAAM,4BAA4B,CAAC;GAC9F,QAAQ,MAAM;GACd,QAAQ,CAAC;EACX;CACF;AACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TerrainRenderInit } from '../terrain/kernel';
|
|
2
|
+
import { TerrainFrame, WorldRect } from '../terrain/scheduler';
|
|
3
|
+
import { MaskRect } from '../terrain/types';
|
|
4
|
+
/**
|
|
5
|
+
* The kernel and the control image it reads, in one place. The inline backend calls it directly, and a
|
|
6
|
+
* worker calls it from its message handler: same code, same pixels.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TerrainKernelHost {
|
|
9
|
+
private prepared;
|
|
10
|
+
private control;
|
|
11
|
+
private maskWidth;
|
|
12
|
+
private current;
|
|
13
|
+
private hasOverlays;
|
|
14
|
+
init(init: TerrainRenderInit): void;
|
|
15
|
+
private prepare;
|
|
16
|
+
/** Material values over a rectangle of the mask, as a patch changed them. */
|
|
17
|
+
updateMask(rect: MaskRect, values: ArrayLike<number>): void;
|
|
18
|
+
render(rect: WorldRect, margin?: number): TerrainFrame;
|
|
19
|
+
destroy(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/terrain-render/host.ts"],"names":[],"mappings":"AACA,OAAO,EAAmE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC5H,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,WAAW,CAAS;IAE5B,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IASnC,OAAO,CAAC,OAAO;IAKf,6EAA6E;IAC7E,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;IAU3D,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY;IAMtD,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { controlPixels, overlayMaterials, toKernelDocument, writeControl } from "../terrain/kernel.js";
|
|
2
|
+
import { disposeTerrainMap, prepareTerrainMap, renderTerrainRegion } from "@rpgjs/render-map2d";
|
|
3
|
+
//#region src/terrain-render/host.ts
|
|
4
|
+
/**
|
|
5
|
+
* The kernel and the control image it reads, in one place. The inline backend calls it directly, and a
|
|
6
|
+
* worker calls it from its message handler: same code, same pixels.
|
|
7
|
+
*/
|
|
8
|
+
var TerrainKernelHost = class {
|
|
9
|
+
prepared;
|
|
10
|
+
control;
|
|
11
|
+
maskWidth = 0;
|
|
12
|
+
current;
|
|
13
|
+
hasOverlays = false;
|
|
14
|
+
init(init) {
|
|
15
|
+
if (this.prepared) disposeTerrainMap(this.prepared);
|
|
16
|
+
this.current = init;
|
|
17
|
+
this.control = controlPixels(init.data);
|
|
18
|
+
this.maskWidth = init.data.mask.width;
|
|
19
|
+
this.hasOverlays = overlayMaterials(init.data).length > 0;
|
|
20
|
+
this.prepare();
|
|
21
|
+
}
|
|
22
|
+
prepare() {
|
|
23
|
+
if (!this.current || !this.control) return;
|
|
24
|
+
this.prepared = prepareTerrainMap({
|
|
25
|
+
map: toKernelDocument(this.current, this.control),
|
|
26
|
+
textures: { ...this.current.images }
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Material values over a rectangle of the mask, as a patch changed them. */
|
|
30
|
+
updateMask(rect, values) {
|
|
31
|
+
if (!this.control) throw new Error("terrain host: not initialised");
|
|
32
|
+
writeControl(this.control, this.maskWidth, rect, values);
|
|
33
|
+
if (this.hasOverlays) {
|
|
34
|
+
if (this.prepared) disposeTerrainMap(this.prepared);
|
|
35
|
+
this.prepare();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
render(rect, margin) {
|
|
39
|
+
if (!this.prepared) throw new Error("terrain host: not initialised");
|
|
40
|
+
const frame = renderTerrainRegion(this.prepared, {
|
|
41
|
+
bounds: rect,
|
|
42
|
+
...margin !== void 0 ? { margin } : {}
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
x: frame.x,
|
|
46
|
+
y: frame.y,
|
|
47
|
+
width: frame.width,
|
|
48
|
+
height: frame.height,
|
|
49
|
+
pixels: frame.pixels
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
destroy() {
|
|
53
|
+
if (this.prepared) disposeTerrainMap(this.prepared);
|
|
54
|
+
this.prepared = void 0;
|
|
55
|
+
this.control = void 0;
|
|
56
|
+
this.current = void 0;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
//#endregion
|
|
60
|
+
export { TerrainKernelHost };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","names":[],"sources":["../../src/terrain-render/host.ts"],"sourcesContent":["import { disposeTerrainMap, prepareTerrainMap, renderTerrainRegion, type PreparedTerrainMap } from \"@rpgjs/render-map2d\";\nimport { controlPixels, overlayMaterials, toKernelDocument, writeControl, type TerrainRenderInit } from \"../terrain/kernel\";\nimport type { TerrainFrame, WorldRect } from \"../terrain/scheduler\";\nimport type { MaskRect } from \"../terrain/types\";\n\n/**\n * The kernel and the control image it reads, in one place. The inline backend calls it directly, and a\n * worker calls it from its message handler: same code, same pixels.\n */\nexport class TerrainKernelHost {\n private prepared: PreparedTerrainMap | undefined;\n private control: Uint8ClampedArray | undefined;\n private maskWidth = 0;\n private current: TerrainRenderInit | undefined;\n private hasOverlays = false;\n\n init(init: TerrainRenderInit): void {\n if (this.prepared) disposeTerrainMap(this.prepared);\n this.current = init;\n this.control = controlPixels(init.data);\n this.maskWidth = init.data.mask.width;\n this.hasOverlays = overlayMaterials(init.data).length > 0;\n this.prepare();\n }\n\n private prepare(): void {\n if (!this.current || !this.control) return;\n this.prepared = prepareTerrainMap({ map: toKernelDocument(this.current, this.control), textures: { ...this.current.images } });\n }\n\n /** Material values over a rectangle of the mask, as a patch changed them. */\n updateMask(rect: MaskRect, values: ArrayLike<number>): void {\n if (!this.control) throw new Error(\"terrain host: not initialised\");\n writeControl(this.control, this.maskWidth, rect, values);\n // The kernel keeps the overlays of nine-slice and presets, computed on the whole mask: drop them.\n if (this.hasOverlays) {\n if (this.prepared) disposeTerrainMap(this.prepared);\n this.prepare();\n }\n }\n\n render(rect: WorldRect, margin?: number): TerrainFrame {\n if (!this.prepared) throw new Error(\"terrain host: not initialised\");\n const frame = renderTerrainRegion(this.prepared, { bounds: rect, ...(margin !== undefined ? { margin } : {}) });\n return { x: frame.x, y: frame.y, width: frame.width, height: frame.height, pixels: frame.pixels };\n }\n\n destroy(): void {\n if (this.prepared) disposeTerrainMap(this.prepared);\n this.prepared = undefined;\n this.control = undefined;\n this.current = undefined;\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CACA,YAAoB;CACpB;CACA,cAAsB;CAEtB,KAAK,MAA+B;EAClC,IAAI,KAAK,UAAU,kBAAkB,KAAK,QAAQ;EAClD,KAAK,UAAU;EACf,KAAK,UAAU,cAAc,KAAK,IAAI;EACtC,KAAK,YAAY,KAAK,KAAK,KAAK;EAChC,KAAK,cAAc,iBAAiB,KAAK,IAAI,CAAC,CAAC,SAAS;EACxD,KAAK,QAAQ;CACf;CAEA,UAAwB;EACtB,IAAI,CAAC,KAAK,WAAW,CAAC,KAAK,SAAS;EACpC,KAAK,WAAW,kBAAkB;GAAE,KAAK,iBAAiB,KAAK,SAAS,KAAK,OAAO;GAAG,UAAU,EAAE,GAAG,KAAK,QAAQ,OAAO;EAAE,CAAC;CAC/H;;CAGA,WAAW,MAAgB,QAAiC;EAC1D,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,MAAM,+BAA+B;EAClE,aAAa,KAAK,SAAS,KAAK,WAAW,MAAM,MAAM;EAEvD,IAAI,KAAK,aAAa;GACpB,IAAI,KAAK,UAAU,kBAAkB,KAAK,QAAQ;GAClD,KAAK,QAAQ;EACf;CACF;CAEA,OAAO,MAAiB,QAA+B;EACrD,IAAI,CAAC,KAAK,UAAU,MAAM,IAAI,MAAM,+BAA+B;EACnE,MAAM,QAAQ,oBAAoB,KAAK,UAAU;GAAE,QAAQ;GAAM,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;EAAG,CAAC;EAC9G,OAAO;GAAE,GAAG,MAAM;GAAG,GAAG,MAAM;GAAG,OAAO,MAAM;GAAO,QAAQ,MAAM;GAAQ,QAAQ,MAAM;EAAO;CAClG;CAEA,UAAgB;EACd,IAAI,KAAK,UAAU,kBAAkB,KAAK,QAAQ;EAClD,KAAK,WAAW,KAAA;EAChB,KAAK,UAAU,KAAA;EACf,KAAK,UAAU,KAAA;CACjB;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/terrain-render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/terrain-render/worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { TerrainKernelHost } from "./host.js";
|
|
2
|
+
//#region src/terrain-render/worker.ts
|
|
3
|
+
/**
|
|
4
|
+
* Entry of a terrain worker: `new Worker(new URL("@rpgjs/map-builder/terrain-render/worker", import.meta.url), { type: "module" })`.
|
|
5
|
+
* Frames go back as transferables: nothing is copied.
|
|
6
|
+
*/
|
|
7
|
+
var host = new TerrainKernelHost();
|
|
8
|
+
var reply = (message, transfer = []) => self.postMessage(message, transfer);
|
|
9
|
+
self.addEventListener("message", (event) => {
|
|
10
|
+
const message = event.data;
|
|
11
|
+
try {
|
|
12
|
+
if (message.type === "init") {
|
|
13
|
+
host.init(message.init);
|
|
14
|
+
reply({ type: "ready" });
|
|
15
|
+
} else if (message.type === "mask") host.updateMask(message.rect, message.values);
|
|
16
|
+
else {
|
|
17
|
+
const frame = host.render(message.rect, message.margin);
|
|
18
|
+
reply({
|
|
19
|
+
type: "frame",
|
|
20
|
+
job: message.job,
|
|
21
|
+
frame
|
|
22
|
+
}, [frame.pixels.buffer]);
|
|
23
|
+
}
|
|
24
|
+
} catch (error) {
|
|
25
|
+
reply({
|
|
26
|
+
type: "error",
|
|
27
|
+
..."job" in message ? { job: message.job } : {},
|
|
28
|
+
message: error instanceof Error ? error.message : String(error)
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
//#endregion
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","names":[],"sources":["../../src/terrain-render/worker.ts"],"sourcesContent":["/// <reference lib=\"webworker\" />\nimport type { WorkerRequest, WorkerResponse } from \"./backend\";\nimport { TerrainKernelHost } from \"./host\";\n\n/**\n * Entry of a terrain worker: `new Worker(new URL(\"@rpgjs/map-builder/terrain-render/worker\", import.meta.url), { type: \"module\" })`.\n * Frames go back as transferables: nothing is copied.\n */\nconst host = new TerrainKernelHost();\nconst reply = (message: WorkerResponse, transfer: Transferable[] = []): void => (self as unknown as { postMessage(m: WorkerResponse, t: Transferable[]): void }).postMessage(message, transfer);\n\nself.addEventListener(\"message\", (event: MessageEvent<WorkerRequest>) => {\n const message = event.data;\n try {\n if (message.type === \"init\") {\n host.init(message.init);\n reply({ type: \"ready\" });\n } else if (message.type === \"mask\") {\n host.updateMask(message.rect, message.values);\n } else {\n const frame = host.render(message.rect, message.margin);\n reply({ type: \"frame\", job: message.job, frame }, [frame.pixels.buffer]);\n }\n } catch (error) {\n reply({ type: \"error\", ...(\"job\" in message ? { job: message.job } : {}), message: error instanceof Error ? error.message : String(error) });\n }\n});\n"],"mappings":";;;;;;AAQA,IAAM,OAAO,IAAI,kBAAkB;AACnC,IAAM,SAAS,SAAyB,WAA2B,CAAC,MAAa,KAAgF,YAAY,SAAS,QAAQ;AAE9L,KAAK,iBAAiB,YAAY,UAAuC;CACvE,MAAM,UAAU,MAAM;CACtB,IAAI;EACF,IAAI,QAAQ,SAAS,QAAQ;GAC3B,KAAK,KAAK,QAAQ,IAAI;GACtB,MAAM,EAAE,MAAM,QAAQ,CAAC;EACzB,OAAO,IAAI,QAAQ,SAAS,QAC1B,KAAK,WAAW,QAAQ,MAAM,QAAQ,MAAM;OACvC;GACL,MAAM,QAAQ,KAAK,OAAO,QAAQ,MAAM,QAAQ,MAAM;GACtD,MAAM;IAAE,MAAM;IAAS,KAAK,QAAQ;IAAK;GAAM,GAAG,CAAC,MAAM,OAAO,MAAM,CAAC;EACzE;CACF,SAAS,OAAO;EACd,MAAM;GAAE,MAAM;GAAS,GAAI,SAAS,UAAU,EAAE,KAAK,QAAQ,IAAI,IAAI,CAAC;GAAI,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAAE,CAAC;CAC7I;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,127 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rpgjs/map-builder",
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
"repository": {
|
|
4
|
+
"type": "git",
|
|
5
|
+
"url": "github:RSamaium/RPG-JS"
|
|
6
|
+
},
|
|
7
|
+
"version": "5.0.0",
|
|
8
|
+
"description": "Modifiable map model, renderer and editing features for RPGJS games and editors (experimental)",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./model": {
|
|
18
|
+
"import": "./dist/model/index.js",
|
|
19
|
+
"types": "./dist/model/index.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./renderer": {
|
|
22
|
+
"import": "./dist/renderer/index.js",
|
|
23
|
+
"types": "./dist/renderer/index.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./embed": {
|
|
26
|
+
"import": "./dist/embed/index.js",
|
|
27
|
+
"types": "./dist/embed/index.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./terrain": {
|
|
30
|
+
"import": "./dist/terrain/index.js",
|
|
31
|
+
"types": "./dist/terrain/index.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./terrain-render": {
|
|
34
|
+
"import": "./dist/terrain-render/index.js",
|
|
35
|
+
"types": "./dist/terrain-render/index.d.ts"
|
|
36
|
+
},
|
|
37
|
+
"./terrain-render/worker": {
|
|
38
|
+
"import": "./dist/terrain-render/worker.js",
|
|
39
|
+
"types": "./dist/terrain-render/worker.d.ts"
|
|
40
|
+
},
|
|
41
|
+
"./features": {
|
|
42
|
+
"import": "./dist/features/index.js",
|
|
43
|
+
"types": "./dist/features/index.d.ts"
|
|
44
|
+
},
|
|
45
|
+
"./interaction": {
|
|
46
|
+
"import": "./dist/interaction/index.js",
|
|
47
|
+
"types": "./dist/interaction/index.d.ts"
|
|
48
|
+
},
|
|
49
|
+
"./skins": {
|
|
50
|
+
"import": "./dist/skins/index.js",
|
|
51
|
+
"types": "./dist/skins/index.d.ts"
|
|
52
|
+
},
|
|
53
|
+
"./protocol": {
|
|
54
|
+
"import": "./dist/protocol/index.js",
|
|
55
|
+
"types": "./dist/protocol/index.d.ts"
|
|
56
|
+
},
|
|
57
|
+
"./authority": {
|
|
58
|
+
"import": "./dist/authority/index.js",
|
|
59
|
+
"types": "./dist/authority/index.d.ts"
|
|
60
|
+
},
|
|
61
|
+
"./remote": {
|
|
62
|
+
"import": "./dist/remote/index.js",
|
|
63
|
+
"types": "./dist/remote/index.d.ts"
|
|
64
|
+
},
|
|
65
|
+
"./server": {
|
|
66
|
+
"import": "./dist/server/index.js",
|
|
67
|
+
"types": "./dist/server/index.d.ts"
|
|
68
|
+
},
|
|
69
|
+
"./client": {
|
|
70
|
+
"import": "./dist/client/index.js",
|
|
71
|
+
"types": "./dist/client/index.d.ts"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"files": [
|
|
75
|
+
"dist",
|
|
76
|
+
"README.md"
|
|
77
|
+
],
|
|
78
|
+
"license": "MIT",
|
|
79
|
+
"publishConfig": {
|
|
80
|
+
"access": "public"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@types/node": "^25.9.3",
|
|
84
|
+
"canvasengine": "2.5.1",
|
|
85
|
+
"pixi.js": "8.19.0",
|
|
86
|
+
"vite": "^8.0.16",
|
|
87
|
+
"vite-plugin-dts": "^5.0.2",
|
|
88
|
+
"vitest": "^4.1.9",
|
|
89
|
+
"@rpgjs/client": "5.4.0",
|
|
90
|
+
"@rpgjs/render-map2d": "5.0.1",
|
|
91
|
+
"@rpgjs/common": "5.2.0",
|
|
92
|
+
"@rpgjs/server": "5.3.0",
|
|
93
|
+
"@rpgjs/testing": "5.0.4"
|
|
94
|
+
},
|
|
95
|
+
"peerDependencies": {
|
|
96
|
+
"pixi.js": "^8.0.0",
|
|
97
|
+
"canvasengine": "^2.5.1",
|
|
98
|
+
"@rpgjs/common": "5.2.0",
|
|
99
|
+
"@rpgjs/server": "5.3.0",
|
|
100
|
+
"@rpgjs/render-map2d": "5.0.1",
|
|
101
|
+
"@rpgjs/client": "5.4.0"
|
|
102
|
+
},
|
|
103
|
+
"peerDependenciesMeta": {
|
|
104
|
+
"@rpgjs/common": {
|
|
105
|
+
"optional": true
|
|
106
|
+
},
|
|
107
|
+
"@rpgjs/server": {
|
|
108
|
+
"optional": true
|
|
109
|
+
},
|
|
110
|
+
"@rpgjs/client": {
|
|
111
|
+
"optional": true
|
|
112
|
+
},
|
|
113
|
+
"@rpgjs/render-map2d": {
|
|
114
|
+
"optional": true
|
|
115
|
+
},
|
|
116
|
+
"canvasengine": {
|
|
117
|
+
"optional": true
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
"scripts": {
|
|
121
|
+
"build": "vite build",
|
|
122
|
+
"dev": "vite build --watch",
|
|
123
|
+
"test": "vitest run",
|
|
124
|
+
"test:types": "tsc -p tsconfig.test.json",
|
|
125
|
+
"test:rpgjs": "vitest run --root ../.. packages/map-builder/tests"
|
|
126
|
+
}
|
|
6
127
|
}
|