@edv4h/usketch-plugin-map 0.6.0 → 0.8.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/README.md +34 -0
- package/dist/autotile.d.ts +22 -0
- package/dist/autotile.d.ts.map +1 -1
- package/dist/autotile.js +46 -0
- package/dist/autotile.js.map +1 -1
- package/dist/base-terrain.d.ts +58 -0
- package/dist/base-terrain.d.ts.map +1 -0
- package/dist/base-terrain.js +107 -0
- package/dist/base-terrain.js.map +1 -0
- package/dist/generators/noise.d.ts +3 -1
- package/dist/generators/noise.d.ts.map +1 -1
- package/dist/generators/noise.js +8 -3
- package/dist/generators/noise.js.map +1 -1
- package/dist/generators/rng.d.ts +6 -1
- package/dist/generators/rng.d.ts.map +1 -1
- package/dist/generators/rng.js +7 -1
- package/dist/generators/rng.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/infinite-terrain.d.ts +34 -0
- package/dist/infinite-terrain.d.ts.map +1 -0
- package/dist/infinite-terrain.js +64 -0
- package/dist/infinite-terrain.js.map +1 -0
- package/dist/map-layer.d.ts.map +1 -1
- package/dist/map-layer.js +107 -9
- package/dist/map-layer.js.map +1 -1
- package/dist/map-tool.d.ts.map +1 -1
- package/dist/map-tool.js +93 -30
- package/dist/map-tool.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +58 -1
- package/dist/plugin.js.map +1 -1
- package/dist/tilemap-shape.d.ts +30 -0
- package/dist/tilemap-shape.d.ts.map +1 -1
- package/dist/tilemap-shape.js +35 -0
- package/dist/tilemap-shape.js.map +1 -1
- package/dist/use-infinite-terrain.d.ts +19 -0
- package/dist/use-infinite-terrain.d.ts.map +1 -0
- package/dist/use-infinite-terrain.js +45 -0
- package/dist/use-infinite-terrain.js.map +1 -0
- package/package.json +1 -1
package/dist/tilemap-shape.js
CHANGED
|
@@ -6,6 +6,41 @@ export const DEFAULT_TILE = 40;
|
|
|
6
6
|
export function isTileMap(shape) {
|
|
7
7
|
return shape.type === TILEMAP_TYPE;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* The tilemap that owns the infinite-terrain seed, chosen **deterministically**
|
|
11
|
+
* (lowest `id`) so every synced client resolves the same seed even if several
|
|
12
|
+
* seeded tilemaps coexist — `getShapes()` insertion order is not guaranteed
|
|
13
|
+
* identical across peers, so we must not rely on "first found". Returns `null`
|
|
14
|
+
* when no tilemap carries a seed.
|
|
15
|
+
*/
|
|
16
|
+
export function seededTilemap(shapes) {
|
|
17
|
+
let best = null;
|
|
18
|
+
// Require an INTEGER seed (step:1): synced shape data could carry NaN/Infinity
|
|
19
|
+
// (→ HUD garbage, `fbm(NaN, …)` behaves as seed 0) or a fraction like 1.9,
|
|
20
|
+
// which the HUD shows verbatim but `hash2` truncates to 1 via ToInt32 — the
|
|
21
|
+
// two would disagree. Integer-only keeps the display and the effective seed in
|
|
22
|
+
// sync.
|
|
23
|
+
for (const s of shapes)
|
|
24
|
+
if (isTileMap(s) &&
|
|
25
|
+
s.baseSeed != null &&
|
|
26
|
+
Number.isInteger(s.baseSeed) &&
|
|
27
|
+
(best === null || s.id < best.id))
|
|
28
|
+
best = s;
|
|
29
|
+
return best;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The lowest-`id` tilemap on the board (of any kind), or `null` if there are
|
|
33
|
+
* none. Used to pick a **deterministic** stamp target when enabling the infinite
|
|
34
|
+
* base — `resolveTilemap`'s "first in insertion order" isn't stable across synced
|
|
35
|
+
* clients, so two peers could otherwise seed different tilemaps.
|
|
36
|
+
*/
|
|
37
|
+
export function lowestTilemap(shapes) {
|
|
38
|
+
let best = null;
|
|
39
|
+
for (const s of shapes)
|
|
40
|
+
if (isTileMap(s) && (best === null || s.id < best.id))
|
|
41
|
+
best = s;
|
|
42
|
+
return best;
|
|
43
|
+
}
|
|
9
44
|
/** Create a new empty tilemap (locked substrate). */
|
|
10
45
|
export function makeTileMap(tile) {
|
|
11
46
|
const bounds = { x: 0, y: 0, width: 0, height: 0 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tilemap-shape.js","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAc,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"tilemap-shape.js","sourceRoot":"","sources":["../src/tilemap-shape.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BoardStore } from "@edv4h/usketch-shared";
|
|
2
|
+
import { type EnableInfiniteTerrainOptions } from "./infinite-terrain.js";
|
|
3
|
+
export interface InfiniteTerrainControls {
|
|
4
|
+
/** Current effective seed, or `null` when disabled. Reactive. */
|
|
5
|
+
seed: number | null;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
/** Enable / re-seed; returns the applied integer seed. */
|
|
8
|
+
enable: (opts?: EnableInfiniteTerrainOptions) => number;
|
|
9
|
+
disable: () => void;
|
|
10
|
+
/** Number enables/re-seeds, `null` disables. */
|
|
11
|
+
setSeed: (seed: number | null) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Subscribe a component to the board's infinite-terrain seed and get controls to
|
|
15
|
+
* change it. Re-renders when the seed changes (incl. edits from another client),
|
|
16
|
+
* not on pan/zoom — it listens to shape mutations only.
|
|
17
|
+
*/
|
|
18
|
+
export declare function useInfiniteTerrain(store: BoardStore): InfiniteTerrainControls;
|
|
19
|
+
//# sourceMappingURL=use-infinite-terrain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-terrain.d.ts","sourceRoot":"","sources":["../src/use-infinite-terrain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAEN,KAAK,4BAA4B,EAIjC,MAAM,uBAAuB,CAAC;AAG/B,MAAM,WAAW,uBAAuB;IACvC,iEAAiE;IACjE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,4BAA4B,KAAK,MAAM,CAAC;IACxD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gDAAgD;IAChD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,uBAAuB,CAoC7E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { useSyncExternalStore } from "react";
|
|
2
|
+
import { disableInfiniteTerrain, enableInfiniteTerrain, getInfiniteSeed, setInfiniteSeed, } from "./infinite-terrain.js";
|
|
3
|
+
import { isTileMap } from "./tilemap-shape.js";
|
|
4
|
+
/**
|
|
5
|
+
* Subscribe a component to the board's infinite-terrain seed and get controls to
|
|
6
|
+
* change it. Re-renders when the seed changes (incl. edits from another client),
|
|
7
|
+
* not on pan/zoom — it listens to shape mutations only.
|
|
8
|
+
*/
|
|
9
|
+
export function useInfiniteTerrain(store) {
|
|
10
|
+
const seed = useSyncExternalStore((onChange) => store.onMutation((e) => {
|
|
11
|
+
// Only recompute the seed when something could actually change it — not on
|
|
12
|
+
// every edit (tile painting fires shape:updated on the tilemap constantly,
|
|
13
|
+
// changing cells/bounds but not baseSeed).
|
|
14
|
+
if (e.type === "shape:updated") {
|
|
15
|
+
const { before, after } = e.payload;
|
|
16
|
+
if (isTileMap(after)) {
|
|
17
|
+
const prev = isTileMap(before) ? before.baseSeed : undefined;
|
|
18
|
+
if (prev !== after.baseSeed)
|
|
19
|
+
onChange(); // baseSeed actually changed
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
else if (e.type === "shape:added") {
|
|
23
|
+
// A new tilemap affects the effective seed only if it already carries one.
|
|
24
|
+
const seededAdded = e.payload.ids.some((id) => {
|
|
25
|
+
const s = store.getShape(id);
|
|
26
|
+
return s != null && isTileMap(s) && s.baseSeed != null;
|
|
27
|
+
});
|
|
28
|
+
if (seededAdded)
|
|
29
|
+
onChange();
|
|
30
|
+
}
|
|
31
|
+
else if (e.type === "shape:removed") {
|
|
32
|
+
// The removed shapes are already gone (can't inspect); a removed seeded
|
|
33
|
+
// tilemap can change the effective seed, so recompute conservatively.
|
|
34
|
+
onChange();
|
|
35
|
+
}
|
|
36
|
+
}), () => getInfiniteSeed(store), () => getInfiniteSeed(store));
|
|
37
|
+
return {
|
|
38
|
+
seed,
|
|
39
|
+
enabled: seed != null,
|
|
40
|
+
enable: (opts) => enableInfiniteTerrain(store, opts),
|
|
41
|
+
disable: () => disableInfiniteTerrain(store),
|
|
42
|
+
setSeed: (s) => setInfiniteSeed(store, s),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=use-infinite-terrain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-infinite-terrain.js","sourceRoot":"","sources":["../src/use-infinite-terrain.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EACN,sBAAsB,EAEtB,qBAAqB,EACrB,eAAe,EACf,eAAe,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAa/C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IACnD,MAAM,IAAI,GAAG,oBAAoB,CAChC,CAAC,QAAQ,EAAE,EAAE,CACZ,KAAK,CAAC,UAAU,CAAC,CAAC,CAAa,EAAE,EAAE;QAClC,2EAA2E;QAC3E,2EAA2E;QAC3E,2CAA2C;QAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAChC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC;YACpC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC7D,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ;oBAAE,QAAQ,EAAE,CAAC,CAAC,4BAA4B;YACtE,CAAC;QACF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACrC,2EAA2E;YAC3E,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO,CAAC,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC;YACxD,CAAC,CAAC,CAAC;YACH,IAAI,WAAW;gBAAE,QAAQ,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACvC,wEAAwE;YACxE,sEAAsE;YACtE,QAAQ,EAAE,CAAC;QACZ,CAAC;IACF,CAAC,CAAC,EACH,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EAC5B,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAC5B,CAAC;IACF,OAAO;QACN,IAAI;QACJ,OAAO,EAAE,IAAI,IAAI,IAAI;QACrB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC;QACpD,OAAO,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC;KACzC,CAAC;AACH,CAAC"}
|