{
 "genart": "1.2",
 "id": "quarry-face",
 "title": "Quarry Face",
 "created": "2026-09-10T00:00:00Z",
 "modified": "2026-09-10T18:56:31.012Z",
 "renderer": {
  "type": "canvas2d",
  "version": "1.x"
 },
 "canvas": {
  "width": 1400,
  "height": 1000
 },
 "parameters": [],
 "colors": [],
 "dataChannels": [
  {
   "name": "pass1",
   "type": "vector",
   "cols": 400,
   "rows": 300
  },
  {
   "name": "pass2",
   "type": "vector",
   "cols": 400,
   "rows": 300
  },
  {
   "name": "pass3",
   "type": "vector",
   "cols": 400,
   "rows": 300
  },
  {
   "name": "pass4",
   "type": "vector",
   "cols": 400,
   "rows": 300
  },
  {
   "name": "spoil",
   "type": "vector",
   "cols": 400,
   "rows": 300
  }
 ],
 "state": {
  "seed": 1607,
  "params": {},
  "colorPalette": [
   "#2b1a12",
   "#5c3320",
   "#8a5a3c",
   "#c9a982",
   "#ece3d4"
  ]
 },
 "algorithm": "// Quarry Face — field generation only. This code makes NO marks.\n// It publishes a tone map and a surface-direction map on the ADR 062 data\n// bridge; every line in the picture is drawn by a plugin layer that reads them.\n//\n// Two rules govern the plate, and nothing else is allowed to vary:\n//   the direction of a hatch = the orientation of the surface it describes\n//   the density of a hatch   = how far that surface is turned from the light\n//\n// The view is down into the pit. A benched far wall stands under bare sky, a\n// pale floor opens toward the viewer, and one near wall cuts across the lower\n// right as a single dark mass. That mass is the only black in the picture and\n// everything else is graded away from it.\nfunction sketch(ctx, state) {\n  var W = state.canvas.width, H = state.canvas.height;\n  var seed = state.seed || 0;\n\n  ctx.fillStyle = state.colorPalette[4];\n  ctx.fillRect(0, 0, W, H);\n\n  // The field grid scales with the canvas so a cell stays the same size in\n  // pixels. Holding it fixed softens every mask edge as the plate grows,\n  // and the stepped crest rounds off into hills.\n  var COLS = Math.round(200 * W / 700), ROWS = Math.round(150 * H / 500);\n\n  function rngFrom(a) {\n    return function () {\n      a |= 0; a = a + 0x6D2B79F5 | 0;\n      var t = Math.imul(a ^ a >>> 15, 1 | a);\n      t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;\n      return ((t ^ t >>> 14) >>> 0) / 4294967296;\n    };\n  }\n  var rand = rngFrom(seed * 2654435761 + 12345);\n  var wob = [];\n  for (var i = 0; i < 30; i++) wob.push(rand() * Math.PI * 2);\n  function wig(u, amp, f, p) { return amp * Math.sin(u * f + wob[p]) + amp * 0.5 * Math.sin(u * f * 2.7 + wob[p + 7]); }\n\n  var rimV     = 0.17 + rand() * 0.05;   // the skyline of the far wall\n  var baseV    = 0.53 + rand() * 0.05;   // where the far wall meets the floor\n  var nearTop  = 0.44 + rand() * 0.06;   // where the near mass enters at the right\n  var nearFoot = 0.10 + rand() * 0.22;   // how far left it reaches at the bottom\n  var BENCHES  = 3;\n\n  // Vertical joints split the far wall, so its benches step rather than run.\n  var joints = [];\n  for (var j = 0; j < 5; j++) {\n    joints.push({ u: 0.04 + rand() * 0.92, step: (rand() - 0.5) * 0.026, w: 900 + rand() * 1100 });\n  }\n  function jointStep(u) {\n    var s = 0;\n    for (var j = 0; j < joints.length; j++) s += joints[j].step * (0.5 + 0.5 * Math.tanh((u - joints[j].u) * 60));\n    return s;\n  }\n  function jointInk(u) {\n    var s = 0;\n    for (var j = 0; j < joints.length; j++) { var d = u - joints[j].u; s += 0.26 * Math.exp(-d * d * joints[j].w); }\n    return s;\n  }\n\n  function rimAt(u)  { return rimV + wig(u, 0.030, 4.3, 0) + wig(u, 0.012, 15.1, 1) + jointStep(u) * 0.8; }\n  function baseAt(u) { return baseV + wig(u, 0.012, 5.7, 2); }\n  // The near wall: one edge, running from the right rim down to the left foot.\n  var nearJoints = [];\n  for (var q = 0; q < 6; q++) {\n    nearJoints.push({ u: 0.10 + rand() * 0.85, step: (rand() - 0.5) * 0.085, w: 1400 + rand() * 1600 });\n  }\n  function nearStep(u) {\n    var s = 0;\n    for (var q = 0; q < nearJoints.length; q++) s += nearJoints[q].step * (0.5 + 0.5 * Math.tanh((u - nearJoints[q].u) * 260));\n    return s;\n  }\n  function nearAt(u) {\n    var t = 1 - u;\n    return nearTop + (1.06 - nearTop) * Math.pow(t / Math.max(0.001, 1 - nearFoot), 1.35)\n         + wig(u, 0.014, 6.9, 3) + wig(u, 0.007, 21.7, 5) + nearStep(u);\n  }\n  function nearInk(u) {\n    var s = 0;\n    for (var q = 0; q < nearJoints.length; q++) { var d = u - nearJoints[q].u; s += 0.22 * Math.exp(-d * d * nearJoints[q].w); }\n    return s;\n  }\n\n  // Bench edges on the far wall, between rim and base.\n  function benchAt(b, u) {\n    var t = b / BENCHES;\n    var r = rimAt(u), g = baseAt(u);\n    return r + (g - r) * (t * t * 0.40 + t * 0.60) + wig(u, 0.007 * (1 - t), 9.1, 4 + b);\n  }\n\n  var tone = new Float32Array(COLS * ROWS);\n  var dir  = new Float32Array(COLS * ROWS);\n  var floorTone = new Float32Array(COLS * ROWS);\n  var floorDir  = new Float32Array(COLS * ROWS);\n\n  for (var r2 = 0; r2 < ROWS; r2++) {\n    for (var c = 0; c < COLS; c++) {\n      var u = c / (COLS - 1), v = r2 / (ROWS - 1);\n      var idx = r2 * COLS + c;\n      var T = 0, A = Math.PI / 2;\n\n      var nv = nearAt(u);\n      if (v >= nv) {\n        // The near mass. Turned wholly from the light, and the only black.\n        // Its hatch stays vertical: quarried stone splits on the plumb.\n        var d = (v - nv) / Math.max(0.05, 1.02 - nv);\n        A = Math.PI / 2 - 0.07 + 0.10 * Math.sin(u * 9.0 + wob[13]);\n        // Dark, but never flat: the mass carries its own joints, and one\n        // bench ledge catches enough light to prove it is stone.\n        T = 0.72 + 0.20 * d + nearInk(u) * 0.5;\n        var ledge = Math.exp(-Math.pow((d - 0.30), 2) * 260);\n        T -= 0.30 * ledge;\n      } else if (v < rimAt(u)) {\n        T = 0;                                   // sky: bare paper, untouched\n      } else if (v > baseAt(u)) {\n        // The floor. The lightest worked surface, and it must stay light.\n        // Its marks run with the floor, converging toward the far wall.\n        // The floor is a single flat plane, so its mask is flat too. Grading it\n        // here would only move the mask's edge and punch a hole in the middle;\n        // the recession is carried by the layer's own depth scaling instead.\n        floorDir[idx] = 0.06 + 0.34 * (u - 0.5) * (1 - (v - baseAt(u)) * 1.4);\n        floorTone[idx] = 1;\n        T = 0;\n      } else {\n        var band = BENCHES - 1;\n        for (var k = 0; k < BENCHES; k++) { if (v < benchAt(k + 1, u)) { band = k; break; } }\n        var eTop = benchAt(band, u), eBot = benchAt(band + 1, u);\n        var td = 0.008 + 0.016 * (band / BENCHES);\n\n        if (v < eTop + td) {\n          A = 0.10 + 0.16 * (u - 0.5);           // a bench top, read nearly level\n          T = 0.13 + 0.09 * ((v - eTop) / Math.max(0.003, td));\n        } else {\n          var f = (v - eTop - td) / Math.max(0.02, eBot - eTop - td);\n          A = Math.PI / 2 + 0.05 * Math.sin(u * 6.0 + wob[11]);\n          // Light falls from the upper right, so the wall darkens to the left.\n          T = 0.30 + 0.24 * (1 - u);\n          T += 0.20 * Math.exp(-f * f * 55);     // the overhang's cast shadow\n          T += jointInk(u) * (0.55 + 0.45 * f);\n          T *= 0.70 + 0.30 * (band / (BENCHES - 1));   // aerial recession\n        }\n      }\n      tone[idx] = T < 0 ? 0 : T > 1 ? 1 : T;\n      dir[idx]  = A;\n    }\n  }\n\n  // --- Publish one field per plate pass ---------------------------------\n  // An engraver builds value by returning to the plate, not by pressing\n  // harder. Each pass covers only what is at least as dark as its threshold,\n  // and sits a little off the last, so tone accumulates by crossing.\n  var THRESHOLDS = [0.10, 0.32, 0.56, 0.78];\n  var SKEW = [0.03, -0.06, 0.11, -0.38];\n  var g = (typeof globalThis !== 'undefined') ? globalThis : window;\n  g.__genart_data = g.__genart_data || {};\n  g.__genart_data.cols = COLS;\n  g.__genart_data.rows = ROWS;\n\n  for (var p = 0; p < THRESHOLDS.length; p++) {\n    var f32 = new Float32Array(COLS * ROWS * 3);\n    for (var n = 0; n < COLS * ROWS; n++) {\n      var a = dir[n] + SKEW[p];\n      f32[n * 3] = Math.cos(a);\n      f32[n * 3 + 1] = Math.sin(a);\n      f32[n * 3 + 2] = tone[n] >= THRESHOLDS[p] ? 1 : 0;\n    }\n    g.__genart_data['pass' + (p + 1)] = f32;\n  }\n\n  var fl = new Float32Array(COLS * ROWS * 3);\n  for (var m = 0; m < COLS * ROWS; m++) {\n    fl[m * 3] = Math.cos(floorDir[m]);\n    fl[m * 3 + 1] = Math.sin(floorDir[m]);\n    fl[m * 3 + 2] = floorTone[m];\n  }\n  g.__genart_data.spoil = fl;\n}\n",
 "layers": [
  {
   "id": "sheet",
   "type": "textures:paper",
   "name": "Sheet",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 0,
    "y": 0,
    "width": 1400,
    "height": 1000,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "preset": "rough",
    "roughness": -1,
    "color": "#ece3d4",
    "seed": 1607
   }
  },
  {
   "id": "pass-1",
   "type": "painting:flow-lines",
   "name": "Plate Pass 1 — Surface",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 105,
    "y": 75,
    "width": 1190,
    "height": 810,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "field": "algorithm:pass1",
    "fieldCols": 400,
    "fieldRows": 300,
    "minMagnitude": 0.5,
    "seed": 1620,
    "lineCount": 44000,
    "seedDistribution": "grid-jittered",
    "lineLength": 34,
    "stepSize": 4,
    "lineWeight": 1.24,
    "lineWeightVariation": 0.1,
    "taper": "none",
    "color": "#2b1a12",
    "colorVariation": 0.04,
    "opacity": 0.42,
    "paintMode": "multiply",
    "depthScale": true,
    "horizonY": 0.18,
    "depthWeightRange": "[0.72, 1.55]",
    "depthOpacityRange": "[0.85, 1.0]",
    "maskCenterY": -1,
    "maskSpread": 0.25
   }
  },
  {
   "id": "pass-2",
   "type": "painting:flow-lines",
   "name": "Plate Pass 2 — Half Tone",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 105,
    "y": 75,
    "width": 1190,
    "height": 810,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "field": "algorithm:pass2",
    "fieldCols": 400,
    "fieldRows": 300,
    "minMagnitude": 0.5,
    "seed": 1633,
    "lineCount": 44000,
    "seedDistribution": "grid-jittered",
    "lineLength": 30,
    "stepSize": 4,
    "lineWeight": 1.24,
    "lineWeightVariation": 0.1,
    "taper": "none",
    "color": "#2b1a12",
    "colorVariation": 0.04,
    "opacity": 0.42,
    "paintMode": "multiply",
    "depthScale": true,
    "horizonY": 0.18,
    "depthWeightRange": "[0.72, 1.55]",
    "depthOpacityRange": "[0.85, 1.0]",
    "maskCenterY": -1,
    "maskSpread": 0.25
   }
  },
  {
   "id": "pass-3",
   "type": "painting:flow-lines",
   "name": "Plate Pass 3 — Shadow",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 105,
    "y": 75,
    "width": 1190,
    "height": 810,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "field": "algorithm:pass3",
    "fieldCols": 400,
    "fieldRows": 300,
    "minMagnitude": 0.5,
    "seed": 1646,
    "lineCount": 40000,
    "seedDistribution": "grid-jittered",
    "lineLength": 26,
    "stepSize": 4,
    "lineWeight": 1.32,
    "lineWeightVariation": 0.1,
    "taper": "none",
    "color": "#2b1a12",
    "colorVariation": 0.04,
    "opacity": 0.46,
    "paintMode": "multiply",
    "depthScale": true,
    "horizonY": 0.18,
    "depthWeightRange": "[0.72, 1.55]",
    "depthOpacityRange": "[0.85, 1.0]",
    "maskCenterY": -1,
    "maskSpread": 0.25
   }
  },
  {
   "id": "pass-4",
   "type": "painting:flow-lines",
   "name": "Plate Pass 4 — Cross, Deepest Only",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 105,
    "y": 75,
    "width": 1190,
    "height": 810,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "field": "algorithm:pass4",
    "fieldCols": 400,
    "fieldRows": 300,
    "minMagnitude": 0.5,
    "seed": 1659,
    "lineCount": 36000,
    "seedDistribution": "grid-jittered",
    "lineLength": 22,
    "stepSize": 4,
    "lineWeight": 1.4,
    "lineWeightVariation": 0.1,
    "taper": "none",
    "color": "#2b1a12",
    "colorVariation": 0.04,
    "opacity": 0.5,
    "paintMode": "multiply",
    "depthScale": true,
    "horizonY": 0.18,
    "depthWeightRange": "[0.72, 1.55]",
    "depthOpacityRange": "[0.85, 1.0]",
    "maskCenterY": -1,
    "maskSpread": 0.25
   }
  },
  {
   "id": "floor",
   "type": "painting:flow-lines",
   "name": "Quarry Floor — Level Marks",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 105,
    "y": 75,
    "width": 1190,
    "height": 810,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "field": "algorithm:spoil",
    "fieldCols": 400,
    "fieldRows": 300,
    "minMagnitude": 0.5,
    "seed": 1678,
    "lineCount": 28000,
    "seedDistribution": "grid-jittered",
    "lineLength": 10,
    "stepSize": 4,
    "lineWeight": 1.4,
    "lineWeightVariation": 0.25,
    "taper": "none",
    "color": "#2b1a12",
    "colorVariation": 0.06,
    "opacity": 0.42,
    "paintMode": "multiply",
    "depthScale": true,
    "horizonY": 0.5,
    "depthWeightRange": "[0.55, 1.40]",
    "depthOpacityRange": "[0.55, 1.00]",
    "maskCenterY": -1,
    "maskSpread": 0.25
   }
  },
  {
   "id": "plate-mark",
   "type": "shapes:rect",
   "name": "Plate Mark",
   "visible": true,
   "locked": false,
   "opacity": 0.55,
   "blendMode": "normal",
   "transform": {
    "x": 105,
    "y": 75,
    "width": 1190,
    "height": 810,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "fillColor": "#ffffff",
    "fillEnabled": false,
    "strokeColor": "#8a5a3c",
    "strokeWidth": 2,
    "strokeEnabled": true,
    "cornerRadius": 0
   }
  },
  {
   "id": "tone",
   "type": "filter:grain",
   "name": "Plate Tone",
   "visible": true,
   "locked": false,
   "opacity": 1,
   "blendMode": "normal",
   "transform": {
    "x": 0,
    "y": 0,
    "width": 1400,
    "height": 1000,
    "rotation": 0,
    "scaleX": 1,
    "scaleY": 1,
    "anchorX": 0,
    "anchorY": 0
   },
   "properties": {
    "intensity": 0.1,
    "size": 2,
    "seed": 1607,
    "monochrome": true
   }
  }
 ]
}