;; Flames - This is a script for The GIMP to generate a lightning ;; Copyright (C) 2010 William Morrison ;; ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . (define (script-fu-lightning xsize ysize numframes instability frequency detail hue glowstrength background) (let* ((img 0) (cloud1 0) (gradient1 0) (newlayer 0) (newgradient 0) (templayer 0);variables for layers and the image (count 1) (yshift (/ ysize numframes)) (xshift (/ xsize numframes)) (false 0) (true 1) );variables for other stuff (gimp-context-push) ;;save the current context (active gradient, fg and bg colours, etc) (gimp-context-set-default-colors) ;; set fg and bg to black and white (gimp-context-set-gradient "Default") ;;set active gradient to black->white (set! img (car (gimp-image-new xsize ysize 0))) ;; create the new image (gimp-image-undo-freeze img) ;; don't save history during the script ;; initialize and add the base layers (set! cloud1 (car (gimp-layer-new img xsize ysize RGB-IMAGE "cloud" 100 DIFFERENCE-MODE))) (set! gradient1 (car (gimp-layer-new img xsize ysize RGB-IMAGE "Frame" 100 NORMAL-MODE))) (gimp-image-add-layer img gradient1 -1) (gimp-image-add-layer img cloud1 -1) ;;create the cloud that the lightning will be based on (plug-in-solid-noise 1 img cloud1 1 0 (rand 2100000000) detail instability frequency) ;;draw the gradient to define the direction of the lightning (gimp-edit-blend gradient1 FG-BG-RGB-MODE NORMAL-MODE GRADIENT-LINEAR 100 0 REPEAT-NONE false false 1 0 false 0 0 xsize 0) (while (<= count numframes) ;; duplicate the first two base layers and add them (set! newlayer (car (gimp-layer-new-from-drawable cloud1 img))) (set! newgradient (car (gimp-layer-new-from-drawable gradient1 img))) (gimp-image-add-layer img newgradient -1) (gimp-image-add-layer img newlayer -1) ;; offset the clouds (gimp-drawable-offset newlayer true OFFSET-BACKGROUND (* count xshift) 0) ; (* count yshift)) ;; add the third layer (set! templayer (car (gimp-layer-new-from-drawable gradient1 img))) (gimp-image-add-layer img templayer -1) (gimp-invert templayer) (gimp-layer-set-mode templayer HARDLIGHT-MODE) (set! newlayer (car (gimp-image-merge-down img templayer 0))) (gimp-layer-set-mode newlayer DIFFERENCE-MODE) (set! newgradient (car (gimp-image-merge-down img newlayer 0))) ;; add the fourth layer (set! newlayer (car (gimp-layer-new-from-drawable gradient1 img))) (gimp-image-add-layer img newlayer -1) (gimp-layer-set-mode newlayer DIVIDE-MODE) (set! newgradient (car (gimp-image-merge-down img newlayer 0))) ;; add the fifth layer (set! newlayer (car (gimp-layer-new-from-drawable gradient1 img))) (gimp-image-add-layer img newlayer -1) (gimp-layer-set-mode newlayer DODGE-MODE) (set! newgradient (car (gimp-image-merge-down img newlayer 0))) ;; Invert the result (gimp-invert newgradient) ;; controlling for the glow strength around the lightning (gimp-levels newgradient HISTOGRAM-VALUE 0 255 glowstrength 0 255) ;; colourize, and turn background to alpha if requested (gimp-colorize newgradient hue 50 0) (if (= background 1) (plug-in-colortoalpha 1 img newgradient '(0 0 0))) ;; Set the name. GIMP handles the numbering (gimp-drawable-set-name newgradient "Frame") (set! count (+ 1 count)) ) ;;Cleaning up (gimp-image-remove-layer img cloud1) (gimp-image-remove-layer img gradient1) (gimp-image-undo-thaw img) (gimp-context-pop) ; Create and update the display (gimp-display-new img) (gimp-displays-flush) ) ) (script-fu-register "script-fu-lightning" "Lightning Bolt..." "Generates an animated lightning bolt" "Will Morrison" "Will Morrison" "2010" "" SF-ADJUSTMENT "Image X size" '(100 1 2048 1 50 0 1) SF-ADJUSTMENT "Image Y size" '(640 1 2048 1 50 0 1) SF-ADJUSTMENT "Number of frames" '(50 1 400 1 10 0 1) SF-ADJUSTMENT "Instability" '(2 0.1 16 0.1 1 1 0) SF-ADJUSTMENT "Frequency" '(10 0.1 16 0.1 1 1 0) SF-ADJUSTMENT "Detail" '(10 0 15 1 1 0 1) SF-ADJUSTMENT "Hue" '(180 0 360 1 15 0 0) SF-ADJUSTMENT "Glow Strength" '(0.15 0.1 1 0.01 0.1 2 0) SF-TOGGLE "Make background transparent" 0 ) (script-fu-menu-register "script-fu-lightning" "/Filters/Will's Script Pack")