@pixagram/renderart 0.4.5 → 1.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 +1 -1
- package/README.md +171 -67
- package/dist/crt-gpu.d.ts +30 -0
- package/dist/crt-gpu.d.ts.map +1 -0
- package/dist/crt-gpu.js +282 -0
- package/dist/crt-gpu.js.map +1 -0
- package/dist/hex-gpu.d.ts +35 -0
- package/dist/hex-gpu.d.ts.map +1 -0
- package/dist/hex-gpu.js +382 -0
- package/dist/hex-gpu.js.map +1 -0
- package/dist/index.d.ts +21 -300
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -963
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +84 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/wasm-wrapper.d.ts +71 -0
- package/dist/wasm-wrapper.d.ts.map +1 -0
- package/dist/wasm-wrapper.js +76 -0
- package/dist/wasm-wrapper.js.map +1 -0
- package/dist/xbrz-gpu.d.ts +34 -0
- package/dist/xbrz-gpu.d.ts.map +1 -0
- package/dist/xbrz-gpu.js +640 -0
- package/dist/xbrz-gpu.js.map +1 -0
- package/package.json +48 -35
- package/src/crt-gpu.ts +313 -0
- package/src/hex-gpu.ts +426 -0
- package/src/index.ts +52 -0
- package/src/types.ts +90 -0
- package/src/wasm/crt.rs +181 -0
- package/src/wasm/hex.rs +324 -0
- package/src/wasm/lib.rs +285 -0
- package/src/wasm/xbrz.rs +262 -0
- package/src/wasm-wrapper.ts +195 -0
- package/src/xbrz-gpu.ts +671 -0
- package/dist/index.d.mts +0 -305
- package/dist/index.mjs +0 -948
- package/dist/index.mjs.map +0 -1
- package/pkg/LICENSE +0 -21
- package/pkg/README.md +0 -117
- package/pkg/renderart_wasm.d.ts +0 -52
- package/pkg/renderart_wasm.js +0 -5
- package/pkg/renderart_wasm_bg.js +0 -283
- package/pkg/renderart_wasm_bg.wasm +0 -0
- package/pkg/renderart_wasm_bg.wasm.d.ts +0 -24
package/dist/hex-gpu.js
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hexagonal GPU Renderer using WebGL2
|
|
3
|
+
*
|
|
4
|
+
* High-performance hexagonal pixel grid transformation using fragment shaders.
|
|
5
|
+
*/
|
|
6
|
+
// Vertex shader
|
|
7
|
+
const VERTEX_SHADER = `#version 300 es
|
|
8
|
+
layout(location = 0) in vec2 position;
|
|
9
|
+
out vec2 vUv;
|
|
10
|
+
|
|
11
|
+
void main() {
|
|
12
|
+
vUv = position * 0.5 + 0.5;
|
|
13
|
+
gl_Position = vec4(position, 0.0, 1.0);
|
|
14
|
+
}`;
|
|
15
|
+
// Fragment shader for hexagonal rendering
|
|
16
|
+
const FRAGMENT_SHADER = `#version 300 es
|
|
17
|
+
precision highp float;
|
|
18
|
+
|
|
19
|
+
uniform sampler2D uTex;
|
|
20
|
+
uniform vec2 uOutputRes;
|
|
21
|
+
uniform vec2 uInputRes;
|
|
22
|
+
uniform float uScale;
|
|
23
|
+
uniform int uOrientation; // 0 = flat-top, 1 = pointy-top
|
|
24
|
+
uniform int uDrawBorders;
|
|
25
|
+
uniform vec4 uBorderColor;
|
|
26
|
+
uniform float uBorderThickness;
|
|
27
|
+
uniform vec4 uBackgroundColor;
|
|
28
|
+
|
|
29
|
+
in vec2 vUv;
|
|
30
|
+
out vec4 outColor;
|
|
31
|
+
|
|
32
|
+
const float SQRT3 = 1.732050808;
|
|
33
|
+
const float INV_SQRT3 = 0.577350269;
|
|
34
|
+
|
|
35
|
+
// Convert output pixel to hex coordinate (flat-top)
|
|
36
|
+
vec2 pixelToHexFlat(vec2 pos, float scale) {
|
|
37
|
+
float hSpacing = scale * 1.5;
|
|
38
|
+
float vSpacing = scale * SQRT3;
|
|
39
|
+
|
|
40
|
+
float col = pos.x / hSpacing;
|
|
41
|
+
int colInt = int(floor(col));
|
|
42
|
+
|
|
43
|
+
// Check if odd column (offset)
|
|
44
|
+
bool isOffset = (colInt & 1) == 1;
|
|
45
|
+
float yOffset = isOffset ? vSpacing * 0.5 : 0.0;
|
|
46
|
+
|
|
47
|
+
float row = (pos.y - yOffset) / vSpacing;
|
|
48
|
+
int rowInt = int(floor(row));
|
|
49
|
+
|
|
50
|
+
// Refine with corner detection
|
|
51
|
+
float cellX = pos.x - float(colInt) * hSpacing;
|
|
52
|
+
float cellY = pos.y - float(rowInt) * vSpacing - yOffset;
|
|
53
|
+
|
|
54
|
+
float quarterW = scale * 0.5;
|
|
55
|
+
float halfH = vSpacing * 0.5;
|
|
56
|
+
|
|
57
|
+
if (cellX < quarterW) {
|
|
58
|
+
float distFromCenter = abs(cellY - halfH);
|
|
59
|
+
float edgeX = distFromCenter * INV_SQRT3;
|
|
60
|
+
|
|
61
|
+
if (cellX < quarterW - edgeX) {
|
|
62
|
+
if (cellY < halfH) {
|
|
63
|
+
rowInt -= 1;
|
|
64
|
+
}
|
|
65
|
+
colInt -= 1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return vec2(float(colInt), float(rowInt));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Convert output pixel to hex coordinate (pointy-top)
|
|
73
|
+
vec2 pixelToHexPointy(vec2 pos, float scale) {
|
|
74
|
+
float hSpacing = scale * SQRT3;
|
|
75
|
+
float vSpacing = scale * 1.5;
|
|
76
|
+
|
|
77
|
+
float row = pos.y / vSpacing;
|
|
78
|
+
int rowInt = int(floor(row));
|
|
79
|
+
|
|
80
|
+
// Check if odd row (offset)
|
|
81
|
+
bool isOffset = (rowInt & 1) == 1;
|
|
82
|
+
float xOffset = isOffset ? hSpacing * 0.5 : 0.0;
|
|
83
|
+
|
|
84
|
+
float col = (pos.x - xOffset) / hSpacing;
|
|
85
|
+
int colInt = int(floor(col));
|
|
86
|
+
|
|
87
|
+
// Refine with corner detection
|
|
88
|
+
float cellX = pos.x - float(colInt) * hSpacing - xOffset;
|
|
89
|
+
float cellY = pos.y - float(rowInt) * vSpacing;
|
|
90
|
+
|
|
91
|
+
float halfW = hSpacing * 0.5;
|
|
92
|
+
float quarterH = scale * 0.5;
|
|
93
|
+
|
|
94
|
+
if (cellY < quarterH) {
|
|
95
|
+
float distFromCenter = abs(cellX - halfW);
|
|
96
|
+
float edgeY = distFromCenter * SQRT3;
|
|
97
|
+
|
|
98
|
+
if (cellY < edgeY) {
|
|
99
|
+
if (cellX < halfW && isOffset) {
|
|
100
|
+
colInt -= 1;
|
|
101
|
+
}
|
|
102
|
+
rowInt -= 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return vec2(float(colInt), float(rowInt));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Check if pixel is on hex border
|
|
110
|
+
bool isBorderPixel(vec2 pos, float scale, int orientation, float thickness) {
|
|
111
|
+
for (float dy = -thickness; dy <= thickness; dy += 1.0) {
|
|
112
|
+
for (float dx = -thickness; dx <= thickness; dx += 1.0) {
|
|
113
|
+
if (dx == 0.0 && dy == 0.0) continue;
|
|
114
|
+
|
|
115
|
+
vec2 h1 = orientation == 0
|
|
116
|
+
? pixelToHexFlat(pos, scale)
|
|
117
|
+
: pixelToHexPointy(pos, scale);
|
|
118
|
+
vec2 h2 = orientation == 0
|
|
119
|
+
? pixelToHexFlat(pos + vec2(dx, dy), scale)
|
|
120
|
+
: pixelToHexPointy(pos + vec2(dx, dy), scale);
|
|
121
|
+
|
|
122
|
+
if (h1 != h2) return true;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
void main() {
|
|
129
|
+
vec2 pixelPos = vUv * uOutputRes;
|
|
130
|
+
|
|
131
|
+
// Get hex coordinate
|
|
132
|
+
vec2 hexCoord = uOrientation == 0
|
|
133
|
+
? pixelToHexFlat(pixelPos, uScale)
|
|
134
|
+
: pixelToHexPointy(pixelPos, uScale);
|
|
135
|
+
|
|
136
|
+
// Check bounds
|
|
137
|
+
if (hexCoord.x < 0.0 || hexCoord.y < 0.0 ||
|
|
138
|
+
hexCoord.x >= uInputRes.x || hexCoord.y >= uInputRes.y) {
|
|
139
|
+
outColor = uBackgroundColor;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Check for border
|
|
144
|
+
if (uDrawBorders == 1 && uBorderThickness > 0.0) {
|
|
145
|
+
if (isBorderPixel(pixelPos, uScale, uOrientation, uBorderThickness)) {
|
|
146
|
+
outColor = uBorderColor;
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Sample source pixel (add 0.5 for pixel center)
|
|
152
|
+
vec2 texCoord = (hexCoord + 0.5) / uInputRes;
|
|
153
|
+
outColor = texture(uTex, texCoord);
|
|
154
|
+
}`;
|
|
155
|
+
/** Parse color from CSS string or number */
|
|
156
|
+
function parseColor(color, defaultColor) {
|
|
157
|
+
if (color === undefined)
|
|
158
|
+
return defaultColor;
|
|
159
|
+
if (typeof color === 'number') {
|
|
160
|
+
return [
|
|
161
|
+
((color >> 24) & 0xFF) / 255,
|
|
162
|
+
((color >> 16) & 0xFF) / 255,
|
|
163
|
+
((color >> 8) & 0xFF) / 255,
|
|
164
|
+
(color & 0xFF) / 255,
|
|
165
|
+
];
|
|
166
|
+
}
|
|
167
|
+
// Parse CSS color
|
|
168
|
+
if (color === 'transparent')
|
|
169
|
+
return [0, 0, 0, 0];
|
|
170
|
+
// Parse hex color
|
|
171
|
+
if (color.startsWith('#')) {
|
|
172
|
+
const hex = color.slice(1);
|
|
173
|
+
if (hex.length === 6) {
|
|
174
|
+
return [
|
|
175
|
+
parseInt(hex.slice(0, 2), 16) / 255,
|
|
176
|
+
parseInt(hex.slice(2, 4), 16) / 255,
|
|
177
|
+
parseInt(hex.slice(4, 6), 16) / 255,
|
|
178
|
+
1,
|
|
179
|
+
];
|
|
180
|
+
}
|
|
181
|
+
if (hex.length === 8) {
|
|
182
|
+
return [
|
|
183
|
+
parseInt(hex.slice(0, 2), 16) / 255,
|
|
184
|
+
parseInt(hex.slice(2, 4), 16) / 255,
|
|
185
|
+
parseInt(hex.slice(4, 6), 16) / 255,
|
|
186
|
+
parseInt(hex.slice(6, 8), 16) / 255,
|
|
187
|
+
];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return defaultColor;
|
|
191
|
+
}
|
|
192
|
+
/** Calculate output dimensions for hex rendering */
|
|
193
|
+
export function hexGetDimensions(srcWidth, srcHeight, scale, orientation = 'flat-top') {
|
|
194
|
+
const SQRT3 = 1.732050808;
|
|
195
|
+
if (orientation === 'flat-top') {
|
|
196
|
+
const hSpacing = scale * 1.5;
|
|
197
|
+
const vSpacing = scale * SQRT3;
|
|
198
|
+
const cellWidth = scale * 2;
|
|
199
|
+
const cellHeight = scale * SQRT3;
|
|
200
|
+
return {
|
|
201
|
+
width: Math.ceil(srcWidth * hSpacing + cellWidth),
|
|
202
|
+
height: Math.ceil(srcHeight * vSpacing + cellHeight),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const hSpacing = scale * SQRT3;
|
|
207
|
+
const vSpacing = scale * 1.5;
|
|
208
|
+
const cellWidth = scale * SQRT3;
|
|
209
|
+
const cellHeight = scale * 2;
|
|
210
|
+
return {
|
|
211
|
+
width: Math.ceil(srcWidth * hSpacing + cellWidth),
|
|
212
|
+
height: Math.ceil(srcHeight * vSpacing + cellHeight),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** HEX GPU Renderer */
|
|
217
|
+
export class HexGpuRenderer {
|
|
218
|
+
gl = null;
|
|
219
|
+
canvas = null;
|
|
220
|
+
program = null;
|
|
221
|
+
texture = null;
|
|
222
|
+
uniforms = {};
|
|
223
|
+
initialized = false;
|
|
224
|
+
currentCanvasSize = { width: 0, height: 0 };
|
|
225
|
+
currentTexSize = { width: 0, height: 0 };
|
|
226
|
+
/** Create a new HEX GPU renderer */
|
|
227
|
+
static create() {
|
|
228
|
+
const renderer = new HexGpuRenderer();
|
|
229
|
+
renderer.init();
|
|
230
|
+
return renderer;
|
|
231
|
+
}
|
|
232
|
+
init() {
|
|
233
|
+
if (typeof OffscreenCanvas === 'undefined') {
|
|
234
|
+
throw new Error('OffscreenCanvas not supported');
|
|
235
|
+
}
|
|
236
|
+
this.canvas = new OffscreenCanvas(1, 1);
|
|
237
|
+
this.gl = this.canvas.getContext('webgl2', {
|
|
238
|
+
alpha: true,
|
|
239
|
+
premultipliedAlpha: false,
|
|
240
|
+
desynchronized: true,
|
|
241
|
+
powerPreference: 'high-performance',
|
|
242
|
+
antialias: false,
|
|
243
|
+
});
|
|
244
|
+
if (!this.gl) {
|
|
245
|
+
throw new Error('WebGL2 not supported');
|
|
246
|
+
}
|
|
247
|
+
const gl = this.gl;
|
|
248
|
+
// Create shaders
|
|
249
|
+
const vs = this.createShader(gl.VERTEX_SHADER, VERTEX_SHADER);
|
|
250
|
+
const fs = this.createShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
|
|
251
|
+
// Create program
|
|
252
|
+
this.program = gl.createProgram();
|
|
253
|
+
gl.attachShader(this.program, vs);
|
|
254
|
+
gl.attachShader(this.program, fs);
|
|
255
|
+
gl.linkProgram(this.program);
|
|
256
|
+
if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) {
|
|
257
|
+
throw new Error('Shader program link failed: ' + gl.getProgramInfoLog(this.program));
|
|
258
|
+
}
|
|
259
|
+
gl.useProgram(this.program);
|
|
260
|
+
// Get uniform locations
|
|
261
|
+
this.uniforms = {
|
|
262
|
+
uTex: gl.getUniformLocation(this.program, 'uTex'),
|
|
263
|
+
uOutputRes: gl.getUniformLocation(this.program, 'uOutputRes'),
|
|
264
|
+
uInputRes: gl.getUniformLocation(this.program, 'uInputRes'),
|
|
265
|
+
uScale: gl.getUniformLocation(this.program, 'uScale'),
|
|
266
|
+
uOrientation: gl.getUniformLocation(this.program, 'uOrientation'),
|
|
267
|
+
uDrawBorders: gl.getUniformLocation(this.program, 'uDrawBorders'),
|
|
268
|
+
uBorderColor: gl.getUniformLocation(this.program, 'uBorderColor'),
|
|
269
|
+
uBorderThickness: gl.getUniformLocation(this.program, 'uBorderThickness'),
|
|
270
|
+
uBackgroundColor: gl.getUniformLocation(this.program, 'uBackgroundColor'),
|
|
271
|
+
};
|
|
272
|
+
gl.uniform1i(this.uniforms.uTex, 0);
|
|
273
|
+
// Setup geometry
|
|
274
|
+
const buf = gl.createBuffer();
|
|
275
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buf);
|
|
276
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
|
|
277
|
+
gl.enableVertexAttribArray(0);
|
|
278
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
|
|
279
|
+
// Create texture
|
|
280
|
+
this.texture = gl.createTexture();
|
|
281
|
+
gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
|
282
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
|
|
283
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
|
|
284
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
285
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
286
|
+
gl.clearColor(0.0, 0.0, 0.0, 0.0);
|
|
287
|
+
this.initialized = true;
|
|
288
|
+
}
|
|
289
|
+
createShader(type, source) {
|
|
290
|
+
const gl = this.gl;
|
|
291
|
+
const shader = gl.createShader(type);
|
|
292
|
+
gl.shaderSource(shader, source);
|
|
293
|
+
gl.compileShader(shader);
|
|
294
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
295
|
+
const info = gl.getShaderInfoLog(shader);
|
|
296
|
+
gl.deleteShader(shader);
|
|
297
|
+
throw new Error('Shader compile failed: ' + info);
|
|
298
|
+
}
|
|
299
|
+
return shader;
|
|
300
|
+
}
|
|
301
|
+
/** Check if renderer is ready */
|
|
302
|
+
isReady() {
|
|
303
|
+
return this.initialized;
|
|
304
|
+
}
|
|
305
|
+
/** Render hexagonal effect */
|
|
306
|
+
render(input, options = {}) {
|
|
307
|
+
if (!this.initialized || !this.gl || !this.canvas) {
|
|
308
|
+
throw new Error('Renderer not initialized');
|
|
309
|
+
}
|
|
310
|
+
const gl = this.gl;
|
|
311
|
+
const data = input instanceof ImageData ? input.data : input.data;
|
|
312
|
+
const width = input.width;
|
|
313
|
+
const height = input.height;
|
|
314
|
+
const scale = Math.min(32, Math.max(2, options.scale ?? 16));
|
|
315
|
+
const orientation = options.orientation ?? 'flat-top';
|
|
316
|
+
const { width: outWidth, height: outHeight } = hexGetDimensions(width, height, scale, orientation);
|
|
317
|
+
// Resize canvas if needed
|
|
318
|
+
if (this.currentCanvasSize.width !== outWidth || this.currentCanvasSize.height !== outHeight) {
|
|
319
|
+
this.canvas.width = outWidth;
|
|
320
|
+
this.canvas.height = outHeight;
|
|
321
|
+
this.currentCanvasSize = { width: outWidth, height: outHeight };
|
|
322
|
+
gl.viewport(0, 0, outWidth, outHeight);
|
|
323
|
+
}
|
|
324
|
+
// Update uniforms
|
|
325
|
+
gl.uniform2f(this.uniforms.uOutputRes, outWidth, outHeight);
|
|
326
|
+
gl.uniform2f(this.uniforms.uInputRes, width, height);
|
|
327
|
+
gl.uniform1f(this.uniforms.uScale, scale);
|
|
328
|
+
gl.uniform1i(this.uniforms.uOrientation, orientation === 'flat-top' ? 0 : 1);
|
|
329
|
+
gl.uniform1i(this.uniforms.uDrawBorders, options.drawBorders ? 1 : 0);
|
|
330
|
+
gl.uniform1f(this.uniforms.uBorderThickness, options.borderThickness ?? 1);
|
|
331
|
+
const borderColor = parseColor(options.borderColor, [0.16, 0.16, 0.16, 1]);
|
|
332
|
+
gl.uniform4f(this.uniforms.uBorderColor, ...borderColor);
|
|
333
|
+
const bgColor = parseColor(options.backgroundColor, [0, 0, 0, 0]);
|
|
334
|
+
gl.uniform4f(this.uniforms.uBackgroundColor, ...bgColor);
|
|
335
|
+
// Update texture
|
|
336
|
+
gl.bindTexture(gl.TEXTURE_2D, this.texture);
|
|
337
|
+
if (this.currentTexSize.width !== width || this.currentTexSize.height !== height) {
|
|
338
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
|
|
339
|
+
this.currentTexSize = { width, height };
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);
|
|
343
|
+
}
|
|
344
|
+
// Render
|
|
345
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
346
|
+
gl.drawArrays(gl.TRIANGLES, 0, 3);
|
|
347
|
+
// Read pixels
|
|
348
|
+
const pixels = new Uint8ClampedArray(outWidth * outHeight * 4);
|
|
349
|
+
gl.readPixels(0, 0, outWidth, outHeight, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
|
|
350
|
+
return {
|
|
351
|
+
data: pixels,
|
|
352
|
+
width: outWidth,
|
|
353
|
+
height: outHeight,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/** Dispose resources */
|
|
357
|
+
dispose() {
|
|
358
|
+
if (this.gl) {
|
|
359
|
+
if (this.texture)
|
|
360
|
+
this.gl.deleteTexture(this.texture);
|
|
361
|
+
if (this.program)
|
|
362
|
+
this.gl.deleteProgram(this.program);
|
|
363
|
+
this.gl = null;
|
|
364
|
+
}
|
|
365
|
+
this.canvas = null;
|
|
366
|
+
this.initialized = false;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/** HEX presets */
|
|
370
|
+
export const HEX_PRESETS = {
|
|
371
|
+
default: {},
|
|
372
|
+
bordered: {
|
|
373
|
+
drawBorders: true,
|
|
374
|
+
borderColor: '#282828',
|
|
375
|
+
borderThickness: 1,
|
|
376
|
+
},
|
|
377
|
+
pointy: {
|
|
378
|
+
orientation: 'pointy-top',
|
|
379
|
+
drawBorders: false,
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
//# sourceMappingURL=hex-gpu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-gpu.js","sourceRoot":"","sources":["../src/hex-gpu.ts"],"names":[],"mappings":"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"}
|