@automatajs/core 0.2.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 +21 -0
- package/README.md +461 -0
- package/dist/engine.d.ts +103 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +255 -0
- package/dist/engine.js.map +1 -0
- package/dist/grid.d.ts +55 -0
- package/dist/grid.d.ts.map +1 -0
- package/dist/grid.js +186 -0
- package/dist/grid.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +44 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +145 -0
- package/dist/interaction.js.map +1 -0
- package/dist/presets.d.ts +62 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +158 -0
- package/dist/presets.js.map +1 -0
- package/dist/renderer.d.ts +51 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +150 -0
- package/dist/renderer.js.map +1 -0
- package/dist/types.d.ts +113 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles mouse/touch interaction on the canvas.
|
|
3
|
+
* - Click toggles a cell
|
|
4
|
+
* - Drag paints alive cells
|
|
5
|
+
*/
|
|
6
|
+
export class Interaction {
|
|
7
|
+
constructor(canvas, renderer, grid) {
|
|
8
|
+
this.enabled = true;
|
|
9
|
+
this.isDragging = false;
|
|
10
|
+
this.lastCell = null;
|
|
11
|
+
this.onClickCb = null;
|
|
12
|
+
this.onDragCb = null;
|
|
13
|
+
this.canvas = canvas;
|
|
14
|
+
this.renderer = renderer;
|
|
15
|
+
this.grid = grid;
|
|
16
|
+
this.handleMouseDown = this._onMouseDown.bind(this);
|
|
17
|
+
this.handleMouseMove = this._onMouseMove.bind(this);
|
|
18
|
+
this.handleMouseUp = this._onMouseUp.bind(this);
|
|
19
|
+
this.handleTouchStart = this._onTouchStart.bind(this);
|
|
20
|
+
this.handleTouchMove = this._onTouchMove.bind(this);
|
|
21
|
+
this.handleTouchEnd = this._onTouchEnd.bind(this);
|
|
22
|
+
this.attach();
|
|
23
|
+
}
|
|
24
|
+
attach() {
|
|
25
|
+
this.canvas.addEventListener("mousedown", this.handleMouseDown);
|
|
26
|
+
this.canvas.addEventListener("mousemove", this.handleMouseMove);
|
|
27
|
+
window.addEventListener("mouseup", this.handleMouseUp);
|
|
28
|
+
this.canvas.addEventListener("touchstart", this.handleTouchStart, {
|
|
29
|
+
passive: false,
|
|
30
|
+
});
|
|
31
|
+
this.canvas.addEventListener("touchmove", this.handleTouchMove, {
|
|
32
|
+
passive: false,
|
|
33
|
+
});
|
|
34
|
+
window.addEventListener("touchend", this.handleTouchEnd);
|
|
35
|
+
}
|
|
36
|
+
/** Update grid reference (e.g., after reset). */
|
|
37
|
+
setGrid(grid) {
|
|
38
|
+
this.grid = grid;
|
|
39
|
+
}
|
|
40
|
+
/** Set custom click callback. */
|
|
41
|
+
onCellClick(fn) {
|
|
42
|
+
this.onClickCb = fn;
|
|
43
|
+
}
|
|
44
|
+
/** Set custom drag callback. */
|
|
45
|
+
onCellDrag(fn) {
|
|
46
|
+
this.onDragCb = fn;
|
|
47
|
+
}
|
|
48
|
+
enable() {
|
|
49
|
+
this.enabled = true;
|
|
50
|
+
}
|
|
51
|
+
disable() {
|
|
52
|
+
this.enabled = false;
|
|
53
|
+
}
|
|
54
|
+
getCanvasCoords(e) {
|
|
55
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
56
|
+
return {
|
|
57
|
+
x: e.clientX - rect.left,
|
|
58
|
+
y: e.clientY - rect.top,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
_onMouseDown(e) {
|
|
62
|
+
if (!this.enabled)
|
|
63
|
+
return;
|
|
64
|
+
this.isDragging = true;
|
|
65
|
+
const coords = this.getCanvasCoords(e);
|
|
66
|
+
const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
|
|
67
|
+
if (cell) {
|
|
68
|
+
this.lastCell = cell;
|
|
69
|
+
if (this.onClickCb) {
|
|
70
|
+
this.onClickCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.grid.toggle(cell.x, cell.y);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
_onMouseMove(e) {
|
|
78
|
+
if (!this.enabled || !this.isDragging)
|
|
79
|
+
return;
|
|
80
|
+
const coords = this.getCanvasCoords(e);
|
|
81
|
+
const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
|
|
82
|
+
if (cell && (!this.lastCell || cell.x !== this.lastCell.x || cell.y !== this.lastCell.y)) {
|
|
83
|
+
this.lastCell = cell;
|
|
84
|
+
if (this.onDragCb) {
|
|
85
|
+
this.onDragCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.grid.set(cell.x, cell.y, 1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
_onMouseUp() {
|
|
93
|
+
this.isDragging = false;
|
|
94
|
+
this.lastCell = null;
|
|
95
|
+
}
|
|
96
|
+
_onTouchStart(e) {
|
|
97
|
+
if (!this.enabled)
|
|
98
|
+
return;
|
|
99
|
+
e.preventDefault();
|
|
100
|
+
const touch = e.touches[0];
|
|
101
|
+
const coords = this.getCanvasCoords(touch);
|
|
102
|
+
const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
|
|
103
|
+
if (cell) {
|
|
104
|
+
this.isDragging = true;
|
|
105
|
+
this.lastCell = cell;
|
|
106
|
+
if (this.onClickCb) {
|
|
107
|
+
this.onClickCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
this.grid.toggle(cell.x, cell.y);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
_onTouchMove(e) {
|
|
115
|
+
if (!this.enabled || !this.isDragging)
|
|
116
|
+
return;
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
const touch = e.touches[0];
|
|
119
|
+
const coords = this.getCanvasCoords(touch);
|
|
120
|
+
const cell = this.renderer.canvasToGrid(coords.x, coords.y, this.grid);
|
|
121
|
+
if (cell && (!this.lastCell || cell.x !== this.lastCell.x || cell.y !== this.lastCell.y)) {
|
|
122
|
+
this.lastCell = cell;
|
|
123
|
+
if (this.onDragCb) {
|
|
124
|
+
this.onDragCb(cell.x, cell.y, this.grid.get(cell.x, cell.y));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
this.grid.set(cell.x, cell.y, 1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
_onTouchEnd() {
|
|
132
|
+
this.isDragging = false;
|
|
133
|
+
this.lastCell = null;
|
|
134
|
+
}
|
|
135
|
+
/** Remove all event listeners. */
|
|
136
|
+
destroy() {
|
|
137
|
+
this.canvas.removeEventListener("mousedown", this.handleMouseDown);
|
|
138
|
+
this.canvas.removeEventListener("mousemove", this.handleMouseMove);
|
|
139
|
+
window.removeEventListener("mouseup", this.handleMouseUp);
|
|
140
|
+
this.canvas.removeEventListener("touchstart", this.handleTouchStart);
|
|
141
|
+
this.canvas.removeEventListener("touchmove", this.handleTouchMove);
|
|
142
|
+
window.removeEventListener("touchend", this.handleTouchEnd);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=interaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../src/interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { RuleFunction } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Conway's Game of Life (B3/S23)
|
|
4
|
+
* - A dead cell with exactly 3 neighbors becomes alive.
|
|
5
|
+
* - A live cell with 2 or 3 neighbors survives.
|
|
6
|
+
* - All other cells die or stay dead.
|
|
7
|
+
*/
|
|
8
|
+
export declare const gameOfLife: RuleFunction;
|
|
9
|
+
/**
|
|
10
|
+
* HighLife (B36/S23)
|
|
11
|
+
* Like Game of Life but also births at 6 neighbors. Famous for replicators.
|
|
12
|
+
*/
|
|
13
|
+
export declare const highLife: RuleFunction;
|
|
14
|
+
/**
|
|
15
|
+
* Seeds (B2/S)
|
|
16
|
+
* Dead cells with exactly 2 neighbors come alive; all live cells die.
|
|
17
|
+
* Creates explosive growth patterns.
|
|
18
|
+
*/
|
|
19
|
+
export declare const seeds: RuleFunction;
|
|
20
|
+
/**
|
|
21
|
+
* Day & Night (B3678/S34678)
|
|
22
|
+
* Symmetric rule — patterns behave the same inverted.
|
|
23
|
+
*/
|
|
24
|
+
export declare const dayAndNight: RuleFunction;
|
|
25
|
+
/**
|
|
26
|
+
* Diamoeba (B35678/S5678)
|
|
27
|
+
* Creates large diamond-shaped regions.
|
|
28
|
+
*/
|
|
29
|
+
export declare const diamoeba: RuleFunction;
|
|
30
|
+
/**
|
|
31
|
+
* Create a custom birth/survival rule from standard notation.
|
|
32
|
+
* @param birth - Array of neighbor counts that cause birth
|
|
33
|
+
* @param survival - Array of neighbor counts that allow survival
|
|
34
|
+
*/
|
|
35
|
+
export declare function createRule(birth: number[], survival: number[]): RuleFunction;
|
|
36
|
+
export declare const patterns: {
|
|
37
|
+
/** Still life: Block */
|
|
38
|
+
readonly block: readonly [readonly [1, 1], readonly [1, 1]];
|
|
39
|
+
/** Still life: Beehive */
|
|
40
|
+
readonly beehive: readonly [readonly [0, 1, 1, 0], readonly [1, 0, 0, 1], readonly [0, 1, 1, 0]];
|
|
41
|
+
/** Oscillator: Blinker (period 2) */
|
|
42
|
+
readonly blinker: readonly [readonly [1, 1, 1]];
|
|
43
|
+
/** Oscillator: Toad (period 2) */
|
|
44
|
+
readonly toad: readonly [readonly [0, 1, 1, 1], readonly [1, 1, 1, 0]];
|
|
45
|
+
/** Oscillator: Beacon (period 2) */
|
|
46
|
+
readonly beacon: readonly [readonly [1, 1, 0, 0], readonly [1, 1, 0, 0], readonly [0, 0, 1, 1], readonly [0, 0, 1, 1]];
|
|
47
|
+
/** Oscillator: Pulsar (period 3) */
|
|
48
|
+
readonly pulsar: readonly [readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0]];
|
|
49
|
+
/** Spaceship: Glider */
|
|
50
|
+
readonly glider: readonly [readonly [0, 1, 0], readonly [0, 0, 1], readonly [1, 1, 1]];
|
|
51
|
+
/** Spaceship: LWSS (Lightweight Spaceship) */
|
|
52
|
+
readonly lwss: readonly [readonly [0, 1, 0, 0, 1], readonly [1, 0, 0, 0, 0], readonly [1, 0, 0, 0, 1], readonly [1, 1, 1, 1, 0]];
|
|
53
|
+
/** Methuselah: R-pentomino */
|
|
54
|
+
readonly rPentomino: readonly [readonly [0, 1, 1], readonly [1, 1, 0], readonly [0, 1, 0]];
|
|
55
|
+
/** Methuselah: Acorn */
|
|
56
|
+
readonly acorn: readonly [readonly [0, 1, 0, 0, 0, 0, 0], readonly [0, 0, 0, 1, 0, 0, 0], readonly [1, 1, 0, 0, 1, 1, 1]];
|
|
57
|
+
/** Gun: Gosper Glider Gun */
|
|
58
|
+
readonly gosperGliderGun: readonly [readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1], readonly [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], readonly [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
|
|
59
|
+
};
|
|
60
|
+
/** Preset rule registry */
|
|
61
|
+
export declare const presets: Record<string, RuleFunction>;
|
|
62
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI5C;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,YAKxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,YAKtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,KAAK,EAAE,YAGnB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,YAKzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,YAKtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,YAAY,CAS5E;AAID,eAAO,MAAM,QAAQ;IACnB,wBAAwB;;IAMxB,0BAA0B;;IAO1B,qCAAqC;;IAGrC,kCAAkC;;IAMlC,oCAAoC;;IAQpC,oCAAoC;;IAiBpC,wBAAwB;;IAOxB,8CAA8C;;IAQ9C,8BAA8B;;IAO9B,wBAAwB;;IAOxB,6BAA6B;;CAYrB,CAAC;AAEX,2BAA2B;AAC3B,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAMhD,CAAC"}
|
package/dist/presets.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// ─── Built-in Presets ───
|
|
2
|
+
/**
|
|
3
|
+
* Conway's Game of Life (B3/S23)
|
|
4
|
+
* - A dead cell with exactly 3 neighbors becomes alive.
|
|
5
|
+
* - A live cell with 2 or 3 neighbors survives.
|
|
6
|
+
* - All other cells die or stay dead.
|
|
7
|
+
*/
|
|
8
|
+
export const gameOfLife = (neighbors, currentState) => {
|
|
9
|
+
if (currentState === 1) {
|
|
10
|
+
return neighbors === 2 || neighbors === 3 ? 1 : 0;
|
|
11
|
+
}
|
|
12
|
+
return neighbors === 3 ? 1 : 0;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* HighLife (B36/S23)
|
|
16
|
+
* Like Game of Life but also births at 6 neighbors. Famous for replicators.
|
|
17
|
+
*/
|
|
18
|
+
export const highLife = (neighbors, currentState) => {
|
|
19
|
+
if (currentState === 1) {
|
|
20
|
+
return neighbors === 2 || neighbors === 3 ? 1 : 0;
|
|
21
|
+
}
|
|
22
|
+
return neighbors === 3 || neighbors === 6 ? 1 : 0;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Seeds (B2/S)
|
|
26
|
+
* Dead cells with exactly 2 neighbors come alive; all live cells die.
|
|
27
|
+
* Creates explosive growth patterns.
|
|
28
|
+
*/
|
|
29
|
+
export const seeds = (neighbors, currentState) => {
|
|
30
|
+
if (currentState === 1)
|
|
31
|
+
return 0;
|
|
32
|
+
return neighbors === 2 ? 1 : 0;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Day & Night (B3678/S34678)
|
|
36
|
+
* Symmetric rule — patterns behave the same inverted.
|
|
37
|
+
*/
|
|
38
|
+
export const dayAndNight = (neighbors, currentState) => {
|
|
39
|
+
if (currentState === 1) {
|
|
40
|
+
return [3, 4, 6, 7, 8].includes(neighbors) ? 1 : 0;
|
|
41
|
+
}
|
|
42
|
+
return [3, 6, 7, 8].includes(neighbors) ? 1 : 0;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Diamoeba (B35678/S5678)
|
|
46
|
+
* Creates large diamond-shaped regions.
|
|
47
|
+
*/
|
|
48
|
+
export const diamoeba = (neighbors, currentState) => {
|
|
49
|
+
if (currentState === 1) {
|
|
50
|
+
return [5, 6, 7, 8].includes(neighbors) ? 1 : 0;
|
|
51
|
+
}
|
|
52
|
+
return [3, 5, 6, 7, 8].includes(neighbors) ? 1 : 0;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Create a custom birth/survival rule from standard notation.
|
|
56
|
+
* @param birth - Array of neighbor counts that cause birth
|
|
57
|
+
* @param survival - Array of neighbor counts that allow survival
|
|
58
|
+
*/
|
|
59
|
+
export function createRule(birth, survival) {
|
|
60
|
+
const birthSet = new Set(birth);
|
|
61
|
+
const survivalSet = new Set(survival);
|
|
62
|
+
return (neighbors, currentState) => {
|
|
63
|
+
if (currentState === 1) {
|
|
64
|
+
return survivalSet.has(neighbors) ? 1 : 0;
|
|
65
|
+
}
|
|
66
|
+
return birthSet.has(neighbors) ? 1 : 0;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// ─── Famous Patterns (for stamping) ───
|
|
70
|
+
export const patterns = {
|
|
71
|
+
/** Still life: Block */
|
|
72
|
+
block: [
|
|
73
|
+
[1, 1],
|
|
74
|
+
[1, 1],
|
|
75
|
+
],
|
|
76
|
+
/** Still life: Beehive */
|
|
77
|
+
beehive: [
|
|
78
|
+
[0, 1, 1, 0],
|
|
79
|
+
[1, 0, 0, 1],
|
|
80
|
+
[0, 1, 1, 0],
|
|
81
|
+
],
|
|
82
|
+
/** Oscillator: Blinker (period 2) */
|
|
83
|
+
blinker: [[1, 1, 1]],
|
|
84
|
+
/** Oscillator: Toad (period 2) */
|
|
85
|
+
toad: [
|
|
86
|
+
[0, 1, 1, 1],
|
|
87
|
+
[1, 1, 1, 0],
|
|
88
|
+
],
|
|
89
|
+
/** Oscillator: Beacon (period 2) */
|
|
90
|
+
beacon: [
|
|
91
|
+
[1, 1, 0, 0],
|
|
92
|
+
[1, 1, 0, 0],
|
|
93
|
+
[0, 0, 1, 1],
|
|
94
|
+
[0, 0, 1, 1],
|
|
95
|
+
],
|
|
96
|
+
/** Oscillator: Pulsar (period 3) */
|
|
97
|
+
pulsar: [
|
|
98
|
+
[0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
|
|
99
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
100
|
+
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
|
|
101
|
+
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
|
|
102
|
+
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
|
|
103
|
+
[0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
|
|
104
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
105
|
+
[0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
|
|
106
|
+
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
|
|
107
|
+
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
|
|
108
|
+
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1],
|
|
109
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
110
|
+
[0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0],
|
|
111
|
+
],
|
|
112
|
+
/** Spaceship: Glider */
|
|
113
|
+
glider: [
|
|
114
|
+
[0, 1, 0],
|
|
115
|
+
[0, 0, 1],
|
|
116
|
+
[1, 1, 1],
|
|
117
|
+
],
|
|
118
|
+
/** Spaceship: LWSS (Lightweight Spaceship) */
|
|
119
|
+
lwss: [
|
|
120
|
+
[0, 1, 0, 0, 1],
|
|
121
|
+
[1, 0, 0, 0, 0],
|
|
122
|
+
[1, 0, 0, 0, 1],
|
|
123
|
+
[1, 1, 1, 1, 0],
|
|
124
|
+
],
|
|
125
|
+
/** Methuselah: R-pentomino */
|
|
126
|
+
rPentomino: [
|
|
127
|
+
[0, 1, 1],
|
|
128
|
+
[1, 1, 0],
|
|
129
|
+
[0, 1, 0],
|
|
130
|
+
],
|
|
131
|
+
/** Methuselah: Acorn */
|
|
132
|
+
acorn: [
|
|
133
|
+
[0, 1, 0, 0, 0, 0, 0],
|
|
134
|
+
[0, 0, 0, 1, 0, 0, 0],
|
|
135
|
+
[1, 1, 0, 0, 1, 1, 1],
|
|
136
|
+
],
|
|
137
|
+
/** Gun: Gosper Glider Gun */
|
|
138
|
+
gosperGliderGun: [
|
|
139
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
140
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
141
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
|
|
142
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
|
|
143
|
+
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
144
|
+
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
145
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
146
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
147
|
+
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
148
|
+
],
|
|
149
|
+
};
|
|
150
|
+
/** Preset rule registry */
|
|
151
|
+
export const presets = {
|
|
152
|
+
gameOfLife,
|
|
153
|
+
highLife,
|
|
154
|
+
seeds,
|
|
155
|
+
dayAndNight,
|
|
156
|
+
diamoeba,
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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C,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;QACzE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC;KAC1E;CACO,CAAC;AAEX,2BAA2B;AAC3B,MAAM,CAAC,MAAM,OAAO,GAAiC;IACnD,UAAU;IACV,QAAQ;IACR,KAAK;IACL,WAAW;IACX,QAAQ;CACT,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Grid } from "./grid";
|
|
2
|
+
import type { StyleFunction } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Canvas 2D Renderer for the cellular automata grid.
|
|
5
|
+
* Handles drawing cells, grid lines, and background.
|
|
6
|
+
* Supports a custom StyleFunction for per-cell coloring.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Renderer {
|
|
9
|
+
private canvas;
|
|
10
|
+
private ctx;
|
|
11
|
+
aliveColor: string;
|
|
12
|
+
deadColor: string;
|
|
13
|
+
backgroundColor: string;
|
|
14
|
+
gridLineColor: string;
|
|
15
|
+
showGridLines: boolean;
|
|
16
|
+
cellSize: number;
|
|
17
|
+
/** Optional style function for per-cell coloring */
|
|
18
|
+
styleFunction: StyleFunction | null;
|
|
19
|
+
private offsetX;
|
|
20
|
+
private offsetY;
|
|
21
|
+
private scale;
|
|
22
|
+
constructor(canvas: HTMLCanvasElement, options?: {
|
|
23
|
+
aliveColor?: string;
|
|
24
|
+
deadColor?: string;
|
|
25
|
+
backgroundColor?: string;
|
|
26
|
+
gridLineColor?: string;
|
|
27
|
+
showGridLines?: boolean;
|
|
28
|
+
cellSize?: number;
|
|
29
|
+
});
|
|
30
|
+
/** Calculate cell size to fit the grid in the canvas (in CSS pixels). */
|
|
31
|
+
private computeCellSize;
|
|
32
|
+
/** Resize the canvas to fill its container, respecting devicePixelRatio. */
|
|
33
|
+
resizeToContainer(): void;
|
|
34
|
+
/** Get the display dimensions (CSS pixels). */
|
|
35
|
+
getDisplaySize(): {
|
|
36
|
+
width: number;
|
|
37
|
+
height: number;
|
|
38
|
+
};
|
|
39
|
+
/** Render the entire grid to canvas. */
|
|
40
|
+
render(grid: Grid): void;
|
|
41
|
+
/** Convert canvas pixel coords to grid cell coords. */
|
|
42
|
+
canvasToGrid(canvasX: number, canvasY: number, grid: Grid): {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
} | null;
|
|
46
|
+
/** Export the current canvas as a data URL. */
|
|
47
|
+
toDataURL(format?: "png" | "jpeg"): string;
|
|
48
|
+
/** Get the underlying canvas element. */
|
|
49
|
+
getCanvas(): HTMLCanvasElement;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAQ,MAAM,SAAS,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,GAAG,CAA2B;IAEtC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAG3C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,KAAK,CAAa;gBAGxB,MAAM,EAAE,iBAAiB,EACzB,OAAO,GAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACd;IAeR,yEAAyE;IACzE,OAAO,CAAC,eAAe;IAQvB,4EAA4E;IAC5E,iBAAiB,IAAI,IAAI;IAazB,+CAA+C;IAC/C,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAQnD,wCAAwC;IACxC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAyExB,uDAAuD;IACvD,YAAY,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,GACT;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiBlC,+CAA+C;IAC/C,SAAS,CAAC,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,MAAM;IAIjD,yCAAyC;IACzC,SAAS,IAAI,iBAAiB;CAG/B"}
|
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas 2D Renderer for the cellular automata grid.
|
|
3
|
+
* Handles drawing cells, grid lines, and background.
|
|
4
|
+
* Supports a custom StyleFunction for per-cell coloring.
|
|
5
|
+
*/
|
|
6
|
+
export class Renderer {
|
|
7
|
+
constructor(canvas, options = {}) {
|
|
8
|
+
/** Optional style function for per-cell coloring */
|
|
9
|
+
this.styleFunction = null;
|
|
10
|
+
// Viewport for zoom/pan (future use)
|
|
11
|
+
this.offsetX = 0;
|
|
12
|
+
this.offsetY = 0;
|
|
13
|
+
this.scale = 1;
|
|
14
|
+
this.canvas = canvas;
|
|
15
|
+
const ctx = canvas.getContext("2d");
|
|
16
|
+
if (!ctx)
|
|
17
|
+
throw new Error("Could not get 2D rendering context");
|
|
18
|
+
this.ctx = ctx;
|
|
19
|
+
this.aliveColor = options.aliveColor ?? "#22d3ee";
|
|
20
|
+
this.deadColor = options.deadColor ?? "#0f172a";
|
|
21
|
+
this.backgroundColor = options.backgroundColor ?? "#020617";
|
|
22
|
+
this.gridLineColor = options.gridLineColor ?? "#1e293b";
|
|
23
|
+
this.showGridLines = options.showGridLines ?? true;
|
|
24
|
+
this.cellSize = options.cellSize ?? 0; // 0 = auto-calculate
|
|
25
|
+
}
|
|
26
|
+
/** Calculate cell size to fit the grid in the canvas (in CSS pixels). */
|
|
27
|
+
computeCellSize(grid) {
|
|
28
|
+
if (this.cellSize > 0)
|
|
29
|
+
return this.cellSize;
|
|
30
|
+
const { width, height } = this.getDisplaySize();
|
|
31
|
+
const maxCellW = Math.floor(width / grid.cols);
|
|
32
|
+
const maxCellH = Math.floor(height / grid.rows);
|
|
33
|
+
return Math.max(1, Math.min(maxCellW, maxCellH));
|
|
34
|
+
}
|
|
35
|
+
/** Resize the canvas to fill its container, respecting devicePixelRatio. */
|
|
36
|
+
resizeToContainer() {
|
|
37
|
+
const parent = this.canvas.parentElement;
|
|
38
|
+
if (!parent)
|
|
39
|
+
return;
|
|
40
|
+
const dpr = window.devicePixelRatio || 1;
|
|
41
|
+
const rect = parent.getBoundingClientRect();
|
|
42
|
+
this.canvas.width = rect.width * dpr;
|
|
43
|
+
this.canvas.height = rect.height * dpr;
|
|
44
|
+
this.canvas.style.width = `${rect.width}px`;
|
|
45
|
+
this.canvas.style.height = `${rect.height}px`;
|
|
46
|
+
this.ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
47
|
+
}
|
|
48
|
+
/** Get the display dimensions (CSS pixels). */
|
|
49
|
+
getDisplaySize() {
|
|
50
|
+
const dpr = window.devicePixelRatio || 1;
|
|
51
|
+
return {
|
|
52
|
+
width: this.canvas.width / dpr,
|
|
53
|
+
height: this.canvas.height / dpr,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/** Render the entire grid to canvas. */
|
|
57
|
+
render(grid) {
|
|
58
|
+
const { width, height } = this.getDisplaySize();
|
|
59
|
+
const ctx = this.ctx;
|
|
60
|
+
// Clear
|
|
61
|
+
ctx.fillStyle = this.backgroundColor;
|
|
62
|
+
ctx.fillRect(0, 0, width, height);
|
|
63
|
+
const cs = this.computeCellSize(grid);
|
|
64
|
+
// Calculate centering offset
|
|
65
|
+
const totalW = grid.cols * cs;
|
|
66
|
+
const totalH = grid.rows * cs;
|
|
67
|
+
const ox = Math.floor((width - totalW) / 2) + this.offsetX;
|
|
68
|
+
const oy = Math.floor((height - totalH) / 2) + this.offsetY;
|
|
69
|
+
if (this.styleFunction) {
|
|
70
|
+
// Per-cell style function rendering
|
|
71
|
+
for (let y = 0; y < grid.rows; y++) {
|
|
72
|
+
for (let x = 0; x < grid.cols; x++) {
|
|
73
|
+
const state = grid.current[y * grid.cols + x];
|
|
74
|
+
const cellCtx = grid.buildContext(x, y);
|
|
75
|
+
const result = this.styleFunction(state, cellCtx);
|
|
76
|
+
let color = null;
|
|
77
|
+
if (result === true) {
|
|
78
|
+
color = this.aliveColor;
|
|
79
|
+
}
|
|
80
|
+
else if (result === false) {
|
|
81
|
+
color = null; // dead — skip (background shows through)
|
|
82
|
+
}
|
|
83
|
+
else if (typeof result === "string") {
|
|
84
|
+
color = result;
|
|
85
|
+
}
|
|
86
|
+
else if (Array.isArray(result)) {
|
|
87
|
+
const [r, g, b, a] = result;
|
|
88
|
+
color = `rgba(${r},${g},${b},${a / 255})`;
|
|
89
|
+
}
|
|
90
|
+
if (color) {
|
|
91
|
+
ctx.fillStyle = color;
|
|
92
|
+
ctx.fillRect(ox + x * cs, oy + y * cs, cs, cs);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Default fast path: single alive color
|
|
99
|
+
ctx.fillStyle = this.aliveColor;
|
|
100
|
+
for (let y = 0; y < grid.rows; y++) {
|
|
101
|
+
for (let x = 0; x < grid.cols; x++) {
|
|
102
|
+
if (grid.current[y * grid.cols + x]) {
|
|
103
|
+
ctx.fillRect(ox + x * cs, oy + y * cs, cs, cs);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Draw grid lines
|
|
109
|
+
if (this.showGridLines && cs > 2) {
|
|
110
|
+
ctx.strokeStyle = this.gridLineColor;
|
|
111
|
+
ctx.lineWidth = 0.5;
|
|
112
|
+
ctx.beginPath();
|
|
113
|
+
for (let x = 0; x <= grid.cols; x++) {
|
|
114
|
+
const px = ox + x * cs;
|
|
115
|
+
ctx.moveTo(px, oy);
|
|
116
|
+
ctx.lineTo(px, oy + totalH);
|
|
117
|
+
}
|
|
118
|
+
for (let y = 0; y <= grid.rows; y++) {
|
|
119
|
+
const py = oy + y * cs;
|
|
120
|
+
ctx.moveTo(ox, py);
|
|
121
|
+
ctx.lineTo(ox + totalW, py);
|
|
122
|
+
}
|
|
123
|
+
ctx.stroke();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Convert canvas pixel coords to grid cell coords. */
|
|
127
|
+
canvasToGrid(canvasX, canvasY, grid) {
|
|
128
|
+
const { width, height } = this.getDisplaySize();
|
|
129
|
+
const cs = this.computeCellSize(grid);
|
|
130
|
+
const totalW = grid.cols * cs;
|
|
131
|
+
const totalH = grid.rows * cs;
|
|
132
|
+
const ox = Math.floor((width - totalW) / 2) + this.offsetX;
|
|
133
|
+
const oy = Math.floor((height - totalH) / 2) + this.offsetY;
|
|
134
|
+
const gx = Math.floor((canvasX - ox) / cs);
|
|
135
|
+
const gy = Math.floor((canvasY - oy) / cs);
|
|
136
|
+
if (gx >= 0 && gx < grid.cols && gy >= 0 && gy < grid.rows) {
|
|
137
|
+
return { x: gx, y: gy };
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
/** Export the current canvas as a data URL. */
|
|
142
|
+
toDataURL(format = "png") {
|
|
143
|
+
return this.canvas.toDataURL(`image/${format}`);
|
|
144
|
+
}
|
|
145
|
+
/** Get the underlying canvas element. */
|
|
146
|
+
getCanvas() {
|
|
147
|
+
return this.canvas;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|