Blog edition
vers. 1.2.19

the Nailbox

root/programs/gimp/gimp-script_fu.txt

Math
(+ 1 3) = 4
(+ 4 4 (+ 3 1) 4) = 16

Vars
(let*
  (
    (var1 123)
    (var2 321)
  )
  (+ var1 var2)
)
(let* ((var1 123)(var2 321))(+ var1 var2)) = 444
(let* ((x1 123))(set! x1 321)) = 321
(let* ((x1 123))(set! x1 (+ x1 x1))) = 246
(let* ((x1 123))(set! x1 321)(+ x1 x1)) = 642

Loops
(let* ((i 0)) (while (< i 5) (set! i (+ i 1))) i)

Funcs
(define
  (
    functionName
    var1
    var2
    var3
  )
  (+ var1 var2 var3)
)
(define (functionName var1 var2 var3)(+ var1 var2 var3))
(functionName 1 2 3) = 6

Get list of layers
 * image = number in title
 * Image must have two layers; bottom heightmap, top skin
(let*
  (
    (image 5)
    (layers (gimp-image-get-layers 5))
    (width 800)
    (height 600)
    (height2 300)
    (offset 300)
    (heightmap 0)
    (skin 0)
    (heightmap2 0)
    (skin2 0)
    (target 0)
  )
  
  ;Undo for the whole thing
  (gimp-undo-push-group-start image)
  
  ;Get existing layers
  (set! heightmap (aref (cadr layers) 1))
  (set! skin (aref (cadr layers) 0))
  
  ;Copy layers
  (set! heightmap2 (car (gimp-layer-copy heightmap image)))
  (gimp-image-add-layer image heightmap2 -1)
  (set! skin2 (car (gimp-layer-copy skin image)))
  (gimp-image-add-layer image skin2 -1)
  
  ;Resize layers
  (gimp-layer-scale heightmap2 width height2 0)
  (gimp-layer-translate heightmap2 0 height2)
  (gimp-layer-resize-to-image-size heightmap2)
  (gimp-layer-scale skin2 width height2 0)
  (gimp-layer-translate skin2 0 height2)
  (gimp-layer-resize-to-image-size skin2)
  
  ;Create target layer
  (set! target (car (gimp-layer-new image width height 1 "Result" 100 0)))
  (gimp-image-add-layer image target -1)
  
  ;Init selection
  (gimp-selection-all image)
  
  ;Loop through
  (let*
    (
      (trans 0)
      (col 255)
      (pasted 0)
      (color '())
    )
    (while (> col -1)
    
      ;Copy selected and paste to current height
      (gimp-edit-copy skin2)
      (set! pasted (car (gimp-edit-paste target 1)))
      (gimp-floating-sel-to-layer pasted)
      (gimp-layer-translate pasted 0 trans)
      (set! target (car (gimp-image-merge-down image pasted 0)))
    
      ;Remove level from selected
      (set! color (list col col col))
      (gimp-by-color-select heightmap2 color 0 1 0 0 0 0)
      
      ;Next step
      (set! trans (- trans 1))
      (set! col (- col 1))
    )
  )
  
  ;Display finished image
  (gimp-selection-clear image)
  (gimp-edit-copy target)
  (gimp-display-new (car (gimp-edit-paste-as-new)))
  
  ;Clean up
  (gimp-image-remove-layer image heightmap2)
  (gimp-image-remove-layer image skin2)
  (gimp-image-remove-layer image target)
  
  ;Undo for the whole thing
  (gimp-undo-push-group-end image)
)

by Martin Wikström

Updated: 2022-08-03 16:33