@genart-dev/plugin-distribution 0.1.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 +121 -0
- package/dist/index.cjs +903 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +872 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/preview-layer.ts","../src/voronoi-layer.ts","../src/density-layer.ts","../src/distribution-tools.ts","../src/index.ts"],"sourcesContent":["import type {\n LayerTypeDefinition,\n LayerPropertySchema,\n LayerProperties,\n LayerBounds,\n RenderResources,\n} from \"@genart-dev/core\";\n\nconst PREVIEW_PROPERTIES: LayerPropertySchema[] = [\n { key: \"algorithm\", label: \"Algorithm\", type: \"string\", default: \"poisson-disk\", group: \"distribution\" },\n { key: \"params\", label: \"Parameters (JSON)\", type: \"string\", default: \"{}\", group: \"distribution\" },\n { key: \"dotSize\", label: \"Dot Size\", type: \"number\", default: 3, min: 0.5, max: 20, step: 0.5, group: \"style\" },\n { key: \"dotColor\", label: \"Dot Color\", type: \"color\", default: \"#0088ff\", group: \"style\" },\n { key: \"opacity\", label: \"Opacity\", type: \"number\", default: 0.6, min: 0, max: 1, step: 0.01, group: \"style\" },\n { key: \"_points\", label: \"Points (JSON)\", type: \"string\", default: \"[]\", group: \"data\" },\n];\n\nexport const previewLayerType: LayerTypeDefinition = {\n typeId: \"distribution:preview\",\n displayName: \"Distribution Preview\",\n icon: \"scatter_plot\",\n category: \"guide\",\n properties: PREVIEW_PROPERTIES,\n propertyEditorId: \"distribution:preview-editor\",\n\n createDefault(): LayerProperties {\n return {\n algorithm: \"poisson-disk\",\n params: \"{}\",\n dotSize: 3,\n dotColor: \"#0088ff\",\n opacity: 0.6,\n _points: \"[]\",\n };\n },\n\n render(\n properties: LayerProperties,\n ctx: CanvasRenderingContext2D,\n bounds: LayerBounds,\n _resources: RenderResources,\n ): void {\n const points = JSON.parse(String(properties._points || \"[]\")) as Array<{ x: number; y: number }>;\n if (points.length === 0) return;\n\n const dotSize = Number(properties.dotSize ?? 3);\n const dotColor = String(properties.dotColor ?? \"#0088ff\");\n const opacity = Number(properties.opacity ?? 0.6);\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.fillStyle = dotColor;\n\n const scaleX = bounds.width;\n const scaleY = bounds.height;\n\n for (const pt of points) {\n const x = bounds.x + pt.x * scaleX;\n const y = bounds.y + pt.y * scaleY;\n ctx.beginPath();\n ctx.arc(x, y, dotSize, 0, Math.PI * 2);\n ctx.fill();\n }\n\n ctx.restore();\n },\n\n validate(): null { return null; },\n};\n","import type {\n LayerTypeDefinition,\n LayerPropertySchema,\n LayerProperties,\n LayerBounds,\n RenderResources,\n} from \"@genart-dev/core\";\n\nconst VORONOI_PROPERTIES: LayerPropertySchema[] = [\n { key: \"strokeColor\", label: \"Edge Color\", type: \"color\", default: \"#333333\", group: \"style\" },\n { key: \"strokeWidth\", label: \"Edge Width\", type: \"number\", default: 1, min: 0.5, max: 5, step: 0.5, group: \"style\" },\n { key: \"fillColor\", label: \"Fill Color\", type: \"color\", default: \"transparent\", group: \"style\" },\n { key: \"opacity\", label: \"Opacity\", type: \"number\", default: 0.7, min: 0, max: 1, step: 0.01, group: \"style\" },\n { key: \"_cells\", label: \"Cells (JSON)\", type: \"string\", default: \"[]\", group: \"data\" },\n];\n\ntype VoronoiVertex = { x: number; y: number };\ntype VoronoiCell = { vertices: VoronoiVertex[] };\n\nexport const voronoiLayerType: LayerTypeDefinition = {\n typeId: \"distribution:voronoi\",\n displayName: \"Voronoi Overlay\",\n icon: \"hexagon\",\n category: \"guide\",\n properties: VORONOI_PROPERTIES,\n propertyEditorId: \"distribution:voronoi-editor\",\n\n createDefault(): LayerProperties {\n return {\n strokeColor: \"#333333\",\n strokeWidth: 1,\n fillColor: \"transparent\",\n opacity: 0.7,\n _cells: \"[]\",\n };\n },\n\n render(\n properties: LayerProperties,\n ctx: CanvasRenderingContext2D,\n bounds: LayerBounds,\n _resources: RenderResources,\n ): void {\n const cells = JSON.parse(String(properties._cells || \"[]\")) as VoronoiCell[];\n if (cells.length === 0) return;\n\n const strokeColor = String(properties.strokeColor ?? \"#333333\");\n const strokeWidth = Number(properties.strokeWidth ?? 1);\n const fillColor = String(properties.fillColor ?? \"transparent\");\n const opacity = Number(properties.opacity ?? 0.7);\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = strokeWidth;\n\n for (const cell of cells) {\n const verts = cell.vertices;\n if (verts.length < 3) continue;\n ctx.beginPath();\n ctx.moveTo(bounds.x + verts[0]!.x, bounds.y + verts[0]!.y);\n for (let i = 1; i < verts.length; i++) {\n ctx.lineTo(bounds.x + verts[i]!.x, bounds.y + verts[i]!.y);\n }\n ctx.closePath();\n if (fillColor !== \"transparent\") {\n ctx.fillStyle = fillColor;\n ctx.fill();\n }\n ctx.stroke();\n }\n\n ctx.restore();\n },\n\n validate(): null { return null; },\n};\n","import type {\n LayerTypeDefinition,\n LayerPropertySchema,\n LayerProperties,\n LayerBounds,\n RenderResources,\n} from \"@genart-dev/core\";\n\nconst DENSITY_PROPERTIES: LayerPropertySchema[] = [\n { key: \"radius\", label: \"Kernel Radius\", type: \"number\", default: 30, min: 5, max: 100, step: 5, group: \"density\" },\n { key: \"colormap\", label: \"Color Map\", type: \"string\", default: \"viridis\", group: \"style\" },\n { key: \"opacity\", label: \"Opacity\", type: \"number\", default: 0.65, min: 0, max: 1, step: 0.01, group: \"style\" },\n { key: \"_points\", label: \"Points (JSON)\", type: \"string\", default: \"[]\", group: \"data\" },\n];\n\n// Simple 5-stop colormaps: [t in 0..1] → [r,g,b] each 0..255\nconst COLORMAPS: Record<string, Array<[number, number, number]>> = {\n viridis: [[68,1,84],[59,82,139],[33,144,141],[93,201,99],[253,231,37]],\n plasma: [[13,8,135],[156,23,158],[237,121,83],[240,249,33],[252,230,25]],\n inferno: [[0,0,4],[120,28,109],[238,125,51],[252,225,31],[252,255,164]],\n hot: [[0,0,0],[160,0,0],[255,80,0],[255,200,0],[255,255,255]],\n cool: [[0,255,255],[64,191,255],[128,128,255],[191,64,255],[255,0,255]],\n};\n\nfunction colormapLookup(name: string, t: number): [number, number, number] {\n const stops = (COLORMAPS[name] ?? COLORMAPS[\"viridis\"]) as Array<[number, number, number]>;\n const scaled = t * (stops.length - 1);\n const lo = Math.floor(scaled), hi = Math.min(lo + 1, stops.length - 1);\n const f = scaled - lo;\n const slo = stops[lo] as [number, number, number];\n const shi = stops[hi] as [number, number, number];\n return [\n Math.round(slo[0] + f * (shi[0] - slo[0])),\n Math.round(slo[1] + f * (shi[1] - slo[1])),\n Math.round(slo[2] + f * (shi[2] - slo[2])),\n ];\n}\n\nexport const densityLayerType: LayerTypeDefinition = {\n typeId: \"distribution:density\",\n displayName: \"Density Map\",\n icon: \"gradient\",\n category: \"guide\",\n properties: DENSITY_PROPERTIES,\n propertyEditorId: \"distribution:density-editor\",\n\n createDefault(): LayerProperties {\n return { radius: 30, colormap: \"viridis\", opacity: 0.65, _points: \"[]\" };\n },\n\n render(\n properties: LayerProperties,\n ctx: CanvasRenderingContext2D,\n bounds: LayerBounds,\n _resources: RenderResources,\n ): void {\n const points = JSON.parse(String(properties._points || \"[]\")) as Array<{ x: number; y: number }>;\n if (points.length === 0) return;\n\n const radius = Number(properties.radius ?? 30);\n const colormap = String(properties.colormap ?? \"viridis\");\n const opacity = Number(properties.opacity ?? 0.65);\n\n const w = Math.floor(bounds.width);\n const h = Math.floor(bounds.height);\n if (w <= 0 || h <= 0) return;\n\n // Kernel Density Estimation on a downsampled grid\n const scale = 0.25; // 1/4 resolution for performance\n const gw = Math.max(1, Math.floor(w * scale));\n const gh = Math.max(1, Math.floor(h * scale));\n const density = new Float32Array(gw * gh);\n const gr = radius * scale;\n const gr2 = gr * gr;\n\n for (const pt of points) {\n const px = pt.x * gw;\n const py = pt.y * gh;\n const minX = Math.max(0, Math.floor(px - gr));\n const maxX = Math.min(gw - 1, Math.ceil(px + gr));\n const minY = Math.max(0, Math.floor(py - gr));\n const maxY = Math.min(gh - 1, Math.ceil(py + gr));\n for (let gy = minY; gy <= maxY; gy++) {\n for (let gx = minX; gx <= maxX; gx++) {\n const dx = gx - px, dy = gy - py;\n const d2 = dx * dx + dy * dy;\n if (d2 < gr2) {\n const idx2 = gy * gw + gx;\n density[idx2] = (density[idx2] ?? 0) + (1 - d2 / gr2);\n }\n }\n }\n }\n\n let maxD = 0;\n for (let i = 0; i < density.length; i++) if ((density[i] ?? 0) > maxD) maxD = density[i] ?? 0;\n if (maxD === 0) return;\n\n // Render via ImageData at low res, then scale up\n const imgData = ctx.createImageData(gw, gh);\n for (let i = 0; i < gw * gh; i++) {\n const t = (density[i] ?? 0) / maxD;\n const [r, g, b] = colormapLookup(colormap, t);\n imgData.data[i * 4] = r;\n imgData.data[i * 4 + 1] = g;\n imgData.data[i * 4 + 2] = b;\n imgData.data[i * 4 + 3] = t > 0 ? Math.round(t * 200) : 0;\n }\n\n // Draw to offscreen, scale up\n const offscreen = new OffscreenCanvas(gw, gh);\n const octx = offscreen.getContext(\"2d\")!;\n octx.putImageData(imgData, 0, 0);\n\n ctx.save();\n ctx.globalAlpha = opacity;\n ctx.imageSmoothingEnabled = true;\n ctx.drawImage(offscreen, bounds.x, bounds.y, bounds.width, bounds.height);\n ctx.restore();\n },\n\n validate(): null { return null; },\n};\n","import type {\n McpToolDefinition,\n McpToolContext,\n McpToolResult,\n JsonSchema,\n} from \"@genart-dev/core\";\n\nfunction textResult(text: string): McpToolResult {\n return { content: [{ type: \"text\", text }] };\n}\n\nfunction errorResult(text: string): McpToolResult {\n return { content: [{ type: \"text\", text }], isError: true };\n}\n\n/** Seeded PRNG (mulberry32) */\nfunction makePrng(seed: number) {\n let s = (seed | 0) >>> 0;\n return function rng() {\n s += 0x6d2b79f5;\n let t = s;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n\nfunction poissonDisk(\n rng: () => number,\n width: number,\n height: number,\n minDist: number,\n maxAttempts = 30,\n): Array<{ x: number; y: number }> {\n const cellSize = minDist / Math.SQRT2;\n const cols = Math.ceil(width / cellSize);\n const rows = Math.ceil(height / cellSize);\n const grid = new Array<number>(cols * rows).fill(-1);\n const pts: Array<[number, number]> = [];\n const active: number[] = [];\n\n function addPt(x: number, y: number) {\n const i = pts.length;\n pts.push([x, y]);\n active.push(i);\n grid[Math.floor(y / cellSize) * cols + Math.floor(x / cellSize)] = i;\n }\n addPt(rng() * width, rng() * height);\n\n while (active.length > 0) {\n const ri = Math.floor(rng() * active.length);\n const pi = active[ri]!;\n const p = pts[pi]!;\n let found = false;\n for (let a = 0; a < maxAttempts; a++) {\n const angle = rng() * Math.PI * 2;\n const dist = minDist + rng() * minDist;\n const nx = p[0] + Math.cos(angle) * dist;\n const ny = p[1] + Math.sin(angle) * dist;\n if (nx < 0 || nx >= width || ny < 0 || ny >= height) continue;\n const gx = Math.floor(nx / cellSize);\n const gy = Math.floor(ny / cellSize);\n let ok = true;\n for (let dx = -2; dx <= 2 && ok; dx++) {\n for (let dy = -2; dy <= 2 && ok; dy++) {\n const ngx = gx + dx, ngy = gy + dy;\n if (ngx < 0 || ngx >= cols || ngy < 0 || ngy >= rows) continue;\n const ni = grid[ngy * cols + ngx];\n if (ni === undefined || ni === -1) continue;\n const q = pts[ni]!;\n const ddx = q[0] - nx, ddy = q[1] - ny;\n if (ddx * ddx + ddy * ddy < minDist * minDist) ok = false;\n }\n }\n if (ok) { addPt(nx, ny); found = true; break; }\n }\n if (!found) active.splice(ri, 1);\n }\n return pts.map(([x, y]) => ({ x, y }));\n}\n\nexport const distributePointsTool: McpToolDefinition = {\n name: \"distribute_points\",\n description:\n \"Generate a spatial distribution of points using a named algorithm (poisson-disk, phyllotaxis, hex-grid, jittered-grid, and more). Returns the point array and count.\",\n inputSchema: {\n type: \"object\",\n properties: {\n algorithm: {\n type: \"string\",\n enum: [\n \"poisson-disk\", \"phyllotaxis\", \"hex-grid\", \"tri-grid\", \"jittered-grid\",\n \"r2-sequence\", \"halton\", \"best-candidate\",\n \"latin-hypercube\", \"lloyd-relax\",\n ],\n description: \"Distribution algorithm\",\n },\n width: { type: \"number\", description: \"Canvas width in pixels\" },\n height: { type: \"number\", description: \"Canvas height in pixels\" },\n params: {\n type: \"object\",\n description: \"Algorithm-specific parameters (minDist, count, size, jitter, etc.)\",\n additionalProperties: true,\n },\n seed: { type: \"number\", description: \"PRNG seed for reproducibility\" },\n },\n required: [\"algorithm\", \"width\", \"height\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, _context: McpToolContext): Promise<McpToolResult> {\n const algorithm = String(input.algorithm);\n const width = Number(input.width);\n const height = Number(input.height);\n const params = (input.params as Record<string, number>) ?? {};\n const rng = makePrng(Number(input.seed ?? 0));\n\n let points: Array<{ x: number; y: number; size?: number; index?: number }> = [];\n\n switch (algorithm) {\n case \"poisson-disk\": {\n const minDist = params.minDist ?? 20;\n const raw = poissonDisk(rng, width, height, minDist, params.maxAttempts ?? 30);\n points = raw.map((p, i) => ({ ...p, size: 1, index: i }));\n break;\n }\n\n case \"phyllotaxis\": {\n const n = params.count ?? 200;\n const PHI = Math.PI * (3 - Math.sqrt(5));\n const scale = params.scale ?? Math.min(width, height) / 2;\n for (let i = 0; i < n; i++) {\n const r = Math.sqrt(i / n) * scale;\n const theta = i * PHI;\n points.push({ x: width / 2 + r * Math.cos(theta), y: height / 2 + r * Math.sin(theta), size: 1, index: i });\n }\n break;\n }\n\n case \"hex-grid\": {\n const size = params.size ?? 20;\n const colW = size * 1.5, rowH = size * Math.sqrt(3);\n let idx = 0;\n for (let col = 0; col <= Math.ceil(width / colW); col++) {\n for (let row = 0; row <= Math.ceil(height / rowH); row++) {\n const x = col * colW;\n const y = row * rowH + (col % 2 === 1 ? rowH / 2 : 0);\n if (x <= width && y <= height) points.push({ x, y, size, index: idx++ });\n }\n }\n break;\n }\n\n case \"tri-grid\": {\n const size = params.size ?? 20;\n const rowH = size * Math.sqrt(3) / 2;\n let idx = 0;\n for (let row = 0; row * rowH <= height; row++) {\n const offset = (row % 2 === 1) ? size / 2 : 0;\n for (let col = 0; col * size + offset <= width; col++) {\n points.push({ x: col * size + offset, y: row * rowH, size, index: idx++ });\n }\n }\n break;\n }\n\n case \"jittered-grid\": {\n const size = params.size ?? 30;\n const jitter = params.jitter ?? 0.5;\n let idx = 0;\n for (let row = 0; row * size < height; row++) {\n for (let col = 0; col * size < width; col++) {\n points.push({\n x: (col + 0.5 + (rng() - 0.5) * jitter) * size,\n y: (row + 0.5 + (rng() - 0.5) * jitter) * size,\n size: 1, index: idx++,\n });\n }\n }\n break;\n }\n\n case \"r2-sequence\": {\n const n = params.count ?? 100;\n const g = 1.32471795724474602596;\n const a1 = 1 / g, a2 = 1 / (g * g);\n for (let i = 0; i < n; i++) {\n points.push({ x: ((0.5 + a1 * i) % 1) * width, y: ((0.5 + a2 * i) % 1) * height, size: 1, index: i });\n }\n break;\n }\n\n case \"halton\": {\n const n = params.count ?? 100;\n function haltonBase(i: number, base: number) {\n let f = 1, r = 0;\n while (i > 0) { f /= base; r += f * (i % base); i = Math.floor(i / base); }\n return r;\n }\n for (let i = 0; i < n; i++) {\n points.push({ x: haltonBase(i + 1, 2) * width, y: haltonBase(i + 1, 3) * height, size: 1, index: i });\n }\n break;\n }\n\n case \"best-candidate\": {\n const n = params.count ?? 100;\n const k = params.candidates ?? 10;\n for (let i = 0; i < n; i++) {\n let bestX = 0, bestY = 0, bestDist = -1;\n for (let c = 0; c < k; c++) {\n const cx = rng() * width, cy = rng() * height;\n let minD = Infinity;\n for (const pt of points) {\n const dx = cx - pt.x, dy = cy - (pt.y ?? 0);\n const d = dx * dx + dy * dy;\n if (d < minD) minD = d;\n }\n if (points.length === 0) minD = Infinity;\n if (minD > bestDist) { bestDist = minD; bestX = cx; bestY = cy; }\n }\n points.push({ x: bestX, y: bestY, size: 1, index: i });\n }\n break;\n }\n\n case \"latin-hypercube\": {\n const n = params.count ?? 100;\n const xs = Array.from({ length: n }, (_, i) => i);\n const ys = Array.from({ length: n }, (_, i) => i);\n for (let i = n - 1; i > 0; i--) {\n const j = Math.floor(rng() * (i + 1));\n [xs[i], xs[j]] = [xs[j]!, xs[i]!];\n const k2 = Math.floor(rng() * (i + 1));\n [ys[i], ys[k2]] = [ys[k2]!, ys[i]!];\n }\n const cellW = width / n, cellH = height / n;\n for (let i = 0; i < n; i++) {\n points.push({ x: (xs[i]! + rng()) * cellW, y: (ys[i]! + rng()) * cellH, size: 1, index: i });\n }\n break;\n }\n\n default: {\n const n = params.count ?? 100;\n for (let i = 0; i < n; i++) {\n points.push({ x: rng() * width, y: rng() * height, size: 1, index: i });\n }\n }\n }\n\n return textResult(JSON.stringify({\n points,\n count: points.length,\n bounds: { x: 0, y: 0, width, height },\n }));\n },\n};\n\nexport const packCirclesTool: McpToolDefinition = {\n name: \"pack_circles\",\n description:\n \"Pack non-overlapping circles within a region using trial-and-reject sampling. Returns (x, y, radius) tuples and coverage percentage.\",\n inputSchema: {\n type: \"object\",\n properties: {\n width: { type: \"number\" },\n height: { type: \"number\" },\n minRadius: { type: \"number\", default: 5 },\n maxRadius: { type: \"number\", default: 50 },\n count: { type: \"number\", default: 100 },\n padding: { type: \"number\", default: 2 },\n seed: { type: \"number\", default: 0 },\n },\n required: [\"width\", \"height\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, _context: McpToolContext): Promise<McpToolResult> {\n const width = Number(input.width);\n const height = Number(input.height);\n const minRadius = Number(input.minRadius ?? 5);\n const maxRadius = Number(input.maxRadius ?? 50);\n const count = Number(input.count ?? 100);\n const padding = Number(input.padding ?? 2);\n const rng = makePrng(Number(input.seed ?? 0));\n\n const circles: Array<{ x: number; y: number; radius: number; index: number }> = [];\n const maxAttempts = 500;\n\n for (let c = 0; c < count; c++) {\n for (let a = 0; a < maxAttempts; a++) {\n const r = minRadius + rng() * (maxRadius - minRadius);\n const x = r + padding + rng() * (width - 2 * r - 2 * padding);\n const y = r + padding + rng() * (height - 2 * r - 2 * padding);\n if (x < 0 || y < 0) continue;\n let ok = true;\n for (const ci of circles) {\n const dx = x - ci.x, dy = y - ci.y;\n if (dx * dx + dy * dy < (r + ci.radius + padding) ** 2) { ok = false; break; }\n }\n if (ok) { circles.push({ x, y, radius: r, index: circles.length }); break; }\n }\n }\n\n const area = circles.reduce((acc, c) => acc + Math.PI * c.radius * c.radius, 0);\n return textResult(JSON.stringify({\n circles,\n count: circles.length,\n coverage: area / (width * height),\n }));\n },\n};\n\nexport const packRectsTool: McpToolDefinition = {\n name: \"pack_rects\",\n description:\n \"Pack rectangles into a bin using the guillotine algorithm. Returns placements with x, y, width, height, and rotated flag.\",\n inputSchema: {\n type: \"object\",\n properties: {\n rects: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: { w: { type: \"number\" }, h: { type: \"number\" }, id: { type: \"string\" } },\n required: [\"w\", \"h\"],\n },\n },\n width: { type: \"number\" },\n height: { type: \"number\" },\n padding: { type: \"number\", default: 2 },\n allowRotation: { type: \"boolean\", default: false },\n },\n required: [\"rects\", \"width\", \"height\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, _context: McpToolContext): Promise<McpToolResult> {\n const rects = input.rects as Array<{ w: number; h: number; id?: string }>;\n const width = Number(input.width);\n const height = Number(input.height);\n const padding = Number(input.padding ?? 2);\n const allowRotation = Boolean(input.allowRotation ?? false);\n\n const sorted = rects.slice().sort((a, b) => b.h * b.w - a.h * a.w);\n const free: Array<{ x: number; y: number; w: number; h: number }> = [{ x: 0, y: 0, w: width, h: height }];\n const placements: Array<{ x: number; y: number; w: number; h: number; id?: string; rotated: boolean } | null> = [];\n\n for (const rect of sorted) {\n const rw = rect.w + padding, rh = rect.h + padding;\n let bestScore = Infinity, bestFi = -1, bestRot = false;\n for (let fi = 0; fi < free.length; fi++) {\n const f = free[fi]!;\n if (f.w >= rw && f.h >= rh) {\n const score = Math.min(f.w - rw, f.h - rh);\n if (score < bestScore) { bestScore = score; bestFi = fi; bestRot = false; }\n }\n if (allowRotation && f.w >= rh && f.h >= rw) {\n const score = Math.min(f.w - rh, f.h - rw);\n if (score < bestScore) { bestScore = score; bestFi = fi; bestRot = true; }\n }\n }\n if (bestFi >= 0) {\n const f = free[bestFi]!;\n const pw = bestRot ? rh : rw, ph = bestRot ? rw : rh;\n placements.push({ x: f.x, y: f.y, w: rect.w, h: rect.h, id: rect.id, rotated: bestRot });\n free.splice(bestFi, 1);\n if (f.w - pw > 0 && ph > 0) free.push({ x: f.x + pw, y: f.y, w: f.w - pw, h: ph });\n if (f.w > 0 && f.h - ph > 0) free.push({ x: f.x, y: f.y + ph, w: f.w, h: f.h - ph });\n } else {\n placements.push(null);\n }\n }\n\n const result = new Array<typeof placements[0]>(rects.length).fill(null);\n for (let i = 0; i < sorted.length; i++) {\n result[rects.indexOf(sorted[i]!)] = placements[i]!;\n }\n\n const packed = result.filter(Boolean).length;\n const utilization = result.filter(Boolean).reduce((acc, p) => {\n const pl = p as { w: number; h: number };\n return acc + pl.w * pl.h;\n }, 0) / (width * height);\n\n return textResult(JSON.stringify({ placements: result, packed, total: rects.length, utilization }));\n },\n};\n\nexport const previewDistributionTool: McpToolDefinition = {\n name: \"preview_distribution\",\n description:\n \"Generate a distribution and add a distribution:preview guide layer to visualize it non-destructively.\",\n inputSchema: {\n type: \"object\",\n properties: {\n algorithm: { type: \"string\" },\n width: { type: \"number\" },\n height: { type: \"number\" },\n params: { type: \"object\", additionalProperties: true },\n dotSize: { type: \"number\", default: 3 },\n dotColor: { type: \"string\", default: \"#0088ff\" },\n layerName: { type: \"string\" },\n seed: { type: \"number\", default: 0 },\n },\n required: [\"algorithm\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, context: McpToolContext): Promise<McpToolResult> {\n const algorithm = String(input.algorithm);\n const canvasW = Number(input.width ?? context.canvasWidth);\n const canvasH = Number(input.height ?? context.canvasHeight);\n\n // Forward to distribute_points logic by reusing the handler\n const ptResult = await distributePointsTool.handler(\n { ...input, algorithm, width: canvasW, height: canvasH },\n context,\n );\n const ptText = ptResult.content[0];\n if (!ptText || ptText.type !== \"text\" || ptResult.isError) {\n return errorResult(`Failed to generate distribution for algorithm \"${algorithm}\".`);\n }\n\n const data = JSON.parse(ptText.text) as { points: unknown[]; count: number };\n const layerId = `dist-preview-${Date.now().toString(36)}`;\n\n context.layers.add({\n id: layerId,\n type: \"distribution:preview\",\n name: (input.layerName as string) ?? `${algorithm} preview`,\n visible: true,\n locked: false,\n opacity: 1,\n blendMode: \"normal\",\n transform: { x: 0, y: 0, width: canvasW, height: canvasH, rotation: 0, scaleX: 1, scaleY: 1, anchorX: 0.5, anchorY: 0.5 },\n properties: {\n algorithm,\n params: JSON.stringify(input.params ?? {}),\n dotSize: Number(input.dotSize ?? 3),\n dotColor: String(input.dotColor ?? \"#0088ff\"),\n opacity: 0.6,\n _points: JSON.stringify(data.points),\n },\n });\n context.emitChange(\"layer-added\");\n\n return textResult(`Added distribution preview layer '${layerId}' with ${data.count} points (algorithm: ${algorithm}).`);\n },\n};\n\nexport const clearDistributionPreviewTool: McpToolDefinition = {\n name: \"clear_distribution_preview\",\n description: \"Remove distribution:preview or distribution:voronoi guide layers from the document.\",\n inputSchema: {\n type: \"object\",\n properties: {\n layerId: { type: \"string\", description: \"Specific layer ID to remove; omit to remove all distribution guide layers\" },\n },\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, context: McpToolContext): Promise<McpToolResult> {\n const layerId = input.layerId as string | undefined;\n const allLayers = context.layers.getAll();\n const toRemove = layerId\n ? allLayers.filter((l) => l.id === layerId)\n : allLayers.filter((l) => l.type.startsWith(\"distribution:\"));\n\n if (toRemove.length === 0) {\n return textResult(\"No distribution guide layers found to remove.\");\n }\n\n for (const l of toRemove) {\n context.layers.remove(l.id);\n }\n context.emitChange(\"layer-removed\");\n return textResult(`Removed ${toRemove.length} distribution guide layer(s).`);\n },\n};\n\nexport const growPatternTool: McpToolDefinition = {\n name: \"grow_pattern\",\n description:\n \"Run a growth algorithm (DLA, differential-growth, substrate) and return the resulting point set and/or paths.\",\n inputSchema: {\n type: \"object\",\n properties: {\n algorithm: {\n type: \"string\",\n enum: [\"dla\", \"differential-growth\", \"substrate\"],\n },\n width: { type: \"number\" },\n height: { type: \"number\" },\n iterations: { type: \"number\", default: 100 },\n seeds: {\n type: \"array\",\n items: { type: \"object\", properties: { x: { type: \"number\" }, y: { type: \"number\" } } },\n },\n params: { type: \"object\", additionalProperties: true },\n seed: { type: \"number\", default: 0 },\n },\n required: [\"algorithm\", \"width\", \"height\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, _context: McpToolContext): Promise<McpToolResult> {\n const algorithm = String(input.algorithm);\n const width = Number(input.width);\n const height = Number(input.height);\n const iterations = Number(input.iterations ?? 100);\n const rng = makePrng(Number(input.seed ?? 0));\n\n if (algorithm === \"dla\") {\n const attached: Array<{ x: number; y: number }> = [{ x: width / 2, y: height / 2 }];\n const grid = new Uint8Array(width * height);\n grid[Math.floor(height / 2) * width + Math.floor(width / 2)] = 1;\n\n for (let w = 0; w < iterations * 10; w++) {\n let wx = Math.floor(rng() * width);\n let wy = Math.floor(rng() * height);\n for (let step = 0; step < 500; step++) {\n wx += Math.round(rng() * 2 - 1);\n wy += Math.round(rng() * 2 - 1);\n if (wx < 0 || wx >= width || wy < 0 || wy >= height) break;\n let hasN = false;\n for (let dx = -1; dx <= 1 && !hasN; dx++) {\n for (let dy = -1; dy <= 1 && !hasN; dy++) {\n const nx = wx + dx, ny = wy + dy;\n if (nx >= 0 && nx < width && ny >= 0 && ny < height && grid[ny * width + nx]) hasN = true;\n }\n }\n if (hasN) { grid[wy * width + wx] = 1; attached.push({ x: wx, y: wy }); break; }\n }\n }\n return textResult(JSON.stringify({ points: attached.map((p, i) => ({ ...p, index: i })), count: attached.length }));\n }\n\n return textResult(JSON.stringify({\n message: `Growth algorithm \"${algorithm}\" with ${iterations} iterations. Use the ${algorithm} component in sketch code for full control.`,\n algorithm,\n dimensions: { width, height },\n iterations,\n }));\n },\n};\n\nexport const tileRegionTool: McpToolDefinition = {\n name: \"tile_region\",\n description:\n \"Tile a region using Wave Function Collapse. Returns a 2D grid of tile IDs.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tileSet: {\n type: \"object\",\n description: \"Tile set: {tiles: [{id, weight?}], adjacency: {[id]: {up, down, left, right}: string[]}}\",\n },\n width: { type: \"number\", description: \"Grid width in tiles\" },\n height: { type: \"number\", description: \"Grid height in tiles\" },\n seed: { type: \"number\", default: 0 },\n },\n required: [\"tileSet\", \"width\", \"height\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, _context: McpToolContext): Promise<McpToolResult> {\n const tileSet = input.tileSet as {\n tiles: Array<{ id: string; weight?: number }>;\n adjacency: Record<string, Record<string, string[]>>;\n };\n const width = Number(input.width);\n const height = Number(input.height);\n const rng = makePrng(Number(input.seed ?? 0));\n\n const tiles = tileSet.tiles;\n const adj = tileSet.adjacency;\n const tileIds = tiles.map((t) => t.id);\n const weights: Record<string, number> = {};\n tiles.forEach((t) => { weights[t.id] = t.weight ?? 1; });\n\n // WFC: wave[r][c] = possible tile IDs\n const wave: string[][] = [];\n for (let r = 0; r < height; r++) {\n wave.push([]);\n for (let c = 0; c < width; c++) {\n const wRow = wave[r]!;\n wRow.push(tileIds[Math.floor(rng() * tileIds.length)] ?? tileIds[0] ?? \"\");\n }\n }\n\n // Single-pass constraint propagation\n for (let r = 0; r < height; r++) {\n for (let c = 0; c < width; c++) {\n const tid = wave[r]![c]!;\n const nbrs = [[-1, 0, \"down\"], [1, 0, \"up\"], [0, -1, \"right\"], [0, 1, \"left\"]] as const;\n for (const [dr, dc, opp] of nbrs) {\n const nr = r + dr, nc = c + dc;\n if (nr < 0 || nr >= height || nc < 0 || nc >= width) continue;\n const allowed = adj[tid]?.[opp] ?? tileIds;\n if (!allowed.includes(wave[nr]![nc]!)) {\n wave[nr]![nc] = allowed[Math.floor(rng() * allowed.length)] ?? wave[nr]![nc]!;\n }\n }\n }\n }\n\n return textResult(JSON.stringify({\n grid: wave,\n width,\n height,\n tiles: wave.flat().map((id, i) => ({ id, col: i % width, row: Math.floor(i / width) })),\n }));\n },\n};\n\nexport const distributeAlongPathTool: McpToolDefinition = {\n name: \"distribute_along_path\",\n description:\n \"Distribute points along a polyline using arc-length parameterization.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"array\",\n items: { type: \"object\", properties: { x: { type: \"number\" }, y: { type: \"number\" } } },\n description: \"Polyline points [{x, y}]\",\n },\n count: { type: \"number\", default: 20 },\n spacing: { type: \"number\", description: \"Fixed spacing in pixels (overrides count)\" },\n offset: { type: \"number\", default: 0, description: \"Start offset [0..1]\" },\n closed: { type: \"boolean\", default: false },\n },\n required: [\"path\"],\n } satisfies JsonSchema,\n\n async handler(input: Record<string, unknown>, _context: McpToolContext): Promise<McpToolResult> {\n const path = input.path as Array<{ x: number; y: number }>;\n const count = Number(input.count ?? 20);\n const spacing = input.spacing != null ? Number(input.spacing) : null;\n const offset = Number(input.offset ?? 0);\n const closed = Boolean(input.closed ?? false);\n\n if (path.length < 2) return textResult(JSON.stringify({ points: [], count: 0 }));\n\n const lens: number[] = [0];\n const pts = closed ? [...path, path[0]!] : path;\n for (let i = 1; i < pts.length; i++) {\n const dx = pts[i]!.x - pts[i - 1]!.x;\n const dy = pts[i]!.y - pts[i - 1]!.y;\n lens.push(lens[i - 1]! + Math.sqrt(dx * dx + dy * dy));\n }\n const totalLen = lens[lens.length - 1] ?? 0;\n if (totalLen === 0) return textResult(JSON.stringify({ points: [], count: 0 }));\n\n const n = spacing != null ? Math.floor((totalLen - offset * totalLen) / spacing) : count;\n const step = spacing ?? (totalLen / (closed ? n : Math.max(1, n - 1)));\n const result: Array<{ x: number; y: number; t: number; angle: number; index: number }> = [];\n\n for (let i = 0; i < n; i++) {\n const targetLen = offset * totalLen + i * step;\n if (targetLen > totalLen) break;\n\n let lo = 0, hi = lens.length - 2;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if ((lens[mid + 1] ?? 0) < targetLen) lo = mid + 1;\n else hi = mid;\n }\n const segLen = (lens[lo + 1]!) - (lens[lo]!);\n const t = segLen > 0 ? (targetLen - lens[lo]!) / segLen : 0;\n const p0 = pts[lo]!, p1 = pts[lo + 1]!;\n result.push({\n x: p0.x + t * (p1.x - p0.x),\n y: p0.y + t * (p1.y - p0.y),\n t: targetLen / totalLen,\n angle: Math.atan2(p1.y - p0.y, p1.x - p0.x),\n index: i,\n });\n }\n\n return textResult(JSON.stringify({ points: result, count: result.length, pathLength: totalLen }));\n },\n};\n\nexport const distributionMcpTools: McpToolDefinition[] = [\n distributePointsTool,\n packCirclesTool,\n packRectsTool,\n previewDistributionTool,\n clearDistributionPreviewTool,\n growPatternTool,\n tileRegionTool,\n distributeAlongPathTool,\n];\n","import type { DesignPlugin, PluginContext } from \"@genart-dev/core\";\nimport { previewLayerType } from \"./preview-layer.js\";\nimport { voronoiLayerType } from \"./voronoi-layer.js\";\nimport { densityLayerType } from \"./density-layer.js\";\nimport { distributionMcpTools } from \"./distribution-tools.js\";\n\nconst distributionPlugin: DesignPlugin = {\n id: \"distribution\",\n name: \"Distribution & Packing\",\n version: \"0.1.0\",\n tier: \"free\",\n description:\n \"Spatial distribution algorithms (Poisson disk, phyllotaxis, hex grid, DLA, WFC, and more) plus circle/rect packing. Includes guide layers for non-destructive distribution previews.\",\n layerTypes: [previewLayerType, voronoiLayerType, densityLayerType],\n tools: [],\n exportHandlers: [],\n mcpTools: distributionMcpTools,\n async initialize(_context: PluginContext): Promise<void> {},\n dispose(): void {},\n};\n\nexport default distributionPlugin;\nexport { distributionPlugin };\nexport { previewLayerType, voronoiLayerType, densityLayerType };\nexport { distributionMcpTools };\n"],"mappings":"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","names":["haltonBase"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@genart-dev/plugin-distribution",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Distribution and packing plugin for genart.dev",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": {
|
|
26
|
+
"name": "genart.dev",
|
|
27
|
+
"email": "support@genart.dev",
|
|
28
|
+
"url": "https://genart.dev"
|
|
29
|
+
},
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "git+https://github.com/genart-dev/plugin-distribution.git"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://genart.dev",
|
|
35
|
+
"keywords": [
|
|
36
|
+
"genart",
|
|
37
|
+
"generative-art",
|
|
38
|
+
"design-plugin",
|
|
39
|
+
"distribution",
|
|
40
|
+
"packing",
|
|
41
|
+
"poisson-disk",
|
|
42
|
+
"phyllotaxis"
|
|
43
|
+
],
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsup",
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:watch": "vitest",
|
|
51
|
+
"clean": "rm -rf dist",
|
|
52
|
+
"prepublishOnly": "npm run build"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@genart-dev/core": "^0.3.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"canvas": "^3.2.1",
|
|
59
|
+
"tsup": "^8.3.6",
|
|
60
|
+
"typescript": "^5.7.3",
|
|
61
|
+
"vitest": "^3.0.5"
|
|
62
|
+
}
|
|
63
|
+
}
|