genart.dev
Download GenArt
Quarry Face

Quarry Face

Engraved · 2026 · 1400×1000 · Canvas 2D

The view is down into a working pit. A benched wall stands under bare sky, a pale floor opens toward the viewer, and one near wall cuts across the lower right as a single dark mass. That mass is the only black in the plate, and every other value is graded away from it. Two rules govern every mark, and nothing else in the plate is allowed to vary. The direction of a hatch is the orientation of the surface it describes: the sheer faces run vertical because quarried stone splits on the plumb, the bench tops run level because they are bedding planes, and the floor runs with the floor. The density of a hatch is how far that surface is turned from the light, which falls from the upper right, so the wall darkens to the left and the near mass, turned away entirely, is darkest. Nothing varies decoratively.

Technique

value is built the way an engraver builds it, by returning to the plate rather than by pressing harder. Four `plugin-painting` flow-line passes cover progressively smaller areas as the tone threshold rises, each set a little off the angle of the last, so shadow deepens by crossing. A fifth pass draws the floor, depth-scaled so its marks thicken toward the viewer. The ground is `plugin-textures` rough paper, the impression is a `plugin-shapes` rule, and `plugin-filters` grain carries the plate tone. The sketch itself draws nothing: it computes a tone map and a surface-direction map from the seed and publishes them on the ADR 062 data bridge, and every line in the picture is made by a layer reading those channels. Changing the seed re-cuts the wall.

Seeds

The same system at three seeds. The composition itself re-cuts: the geometry is derived from the seed, so masses, edges and placement all move, while the palette and the drawing language stay put.

  1. Quarry Face, seed 16071607
  2. Quarry Face, seed 214214
  3. Quarry Face, seed 88238823

Layer stack

In paint order. Every mark in the image comes from these; there is no handwritten drawing code.

  1. textures:paperSheet
  2. painting:flow-linesPlate Pass 1 — Surface
  3. painting:flow-linesPlate Pass 2 — Half Tone
  4. painting:flow-linesPlate Pass 3 — Shadow
  5. painting:flow-linesPlate Pass 4 — Cross, Deepest Only
  6. painting:flow-linesQuarry Floor — Level Marks
  7. shapes:rectPlate Mark
  8. filter:grainPlate Tone

Source

The complete composition. Open it in GenArt to re-render, re-seed, or take it apart.

quarry-face.genart
{
  "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
      }
    }
  ]
}