157e Tile Shadow

(meta linear-colour-space: 1)

(rect position: [(/ canvas/width 2) (/ canvas/height 2)]
      width: canvas/width
      height: canvas/height
      colour: {white (gen/col)})

(loop (y from: 1 to: (- num-squares 1))
  (loop (x from: 1 to: (- num-squares 1))
    (define
      position [(map-to-position at: x) (map-to-position at: y)]
      [px py] position
      colour (col/value from: make-colour
                        t: (focal/value from: focalpoint position: position)))
    (draw-tile position: [(+ px 5) (- py 5)]
               colour: (col/set-e2 from: (col/convert from: colour
                                                       format: LAB)
                                  value: 50))
    (draw-tile position: position
               colour: colour)))

(define make-colour
  (col/build-procedural a: {[0.80 0.50 0.40] (gen/scalar)}
                        b: {[0.20 0.40 0.20] (gen/scalar)}
                        c: {[2.00 1.00 1.00] (gen/scalar)}
                        d: {[0.00 0.25 0.25] (gen/scalar)}))

(define
  focalpoint ({focal/build-point (gen/select from: '(focal/build-point focal/build-hline focal/build-vline))}
              position: [{500 (gen/int max: canvas/width)}
                         {500 (gen/int max: canvas/height)}]
              distance: {800 (gen/int min: (/ canvas/width 2) max: canvas/width)})
  num-squares-to-render {7 (gen/int min: 4 max: 10)}
  num-squares (+ 2 num-squares-to-render)
  num-gaps (+ num-squares 1)
  square-size (/ canvas/width num-squares))

(fn (draw-tile position: [0 0]
               colour: red)
  (on-matrix-stack
    (translate vector: position)
    (rotate angle: 45)
    (scale scalar: 1.3)
    (rect position: [0 0]
          width: square-size
          height: square-size
          colour: colour)))

(fn (map-to-position at: 0)
  (+ (* square-size at) (/ square-size 2)))