ADDED sg-hypmotized.scm Index: sg-hypmotized.scm ================================================================== --- /dev/null +++ sg-hypmotized.scm @@ -0,0 +1,100 @@ +; 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 2 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. + +(define (script-fu-sg-hypmotized width radius thickness number-of-frames cycles speed) + (let* ((image (car (gimp-image-new width width RGB))) + (bg-layer (car (gimp-layer-new image width width RGB-IMAGE "bg" 100 NORMAL-MODE))) + (base-layer (car (gimp-layer-new image + (* width 2) + (* width 2) + RGBA-IMAGE + "frame #1" + 100 + NORMAL-MODE))) + (center (/ width 2)) + (path (car (gimp-vectors-new image "concentric"))) + (brush (car (gimp-brush-new "temporary"))) + ) + + (gimp-image-undo-disable image) + (gimp-context-push) + (gimp-context-set-paint-method "gimp-paintbrush") + (gimp-context-set-paint-mode NORMAL-MODE) + (gimp-brush-set-shape brush BRUSH-GENERATED-CIRCLE) + (gimp-brush-set-radius brush (/ thickness 2)) + (gimp-context-set-brush brush) + (gimp-display-new image) + (gimp-drawable-fill bg-layer BACKGROUND-FILL) + (gimp-image-insert-layer image bg-layer 0 0) + (gimp-drawable-fill base-layer TRANSPARENT-FILL) + (gimp-image-insert-layer image base-layer 0 0) + (gimp-layer-set-offsets base-layer (- center) (- center)) + (gimp-image-insert-vectors image path 0 0) + (let loop ((ring-radius (/ radius 2))) + (unless (> ring-radius (* width 1.42)) + (gimp-vectors-bezier-stroke-new-ellipse path + center + center + ring-radius + ring-radius + 0 ) + (loop (+ ring-radius radius)) )) + (gimp-edit-stroke-vectors base-layer path) + (let ((delta-r (* (/ speed number-of-frames) cycles radius)) + (delta-a (/ (* 2 *pi*) (/ cycles number-of-frames))) ) + (let loop ((r 0) + (a 0) + (cnt number-of-frames) ) + (unless (zero? cnt) + (let ((dx (- (* r (cos a)) center)) + (dy (- (* r (sin a)) center)) + (frame-layer (car (gimp-layer-copy base-layer TRUE))) ) + (gimp-image-insert-layer image frame-layer 0 0) + (gimp-layer-set-offsets frame-layer dx dy) + (loop (+ r delta-r) (+ a delta-a) (- cnt 1)) )))) + + (let* ((layers (butlast (vector->list (cadr (gimp-image-get-layers image))))) + (bg-layer (car (gimp-image-merge-down image (car (last layers)) CLIP-TO-IMAGE))) + ) + (let loop ((layers layers)) + (unless (null? (cdr layers)) + (let* ((layer (car layers)) + (position (car (gimp-image-get-item-position image layer))) + (base-layer (car (gimp-layer-new-from-drawable bg-layer image))) + (layer-name (car (gimp-drawable-get-name layer))) ) + (gimp-layer-resize-to-image-size layer) + (gimp-image-insert-layer image base-layer 0 (+ position 1)) + (gimp-drawable-set-name (car (gimp-image-merge-down image layer CLIP-TO-IMAGE)) + layer-name )) + (loop (cdr layers)) )) + (gimp-image-remove-layer image bg-layer) + ) + (gimp-image-undo-enable image) + (gimp-displays-flush) + ) + ) + +(script-fu-register "script-fu-sg-hypmotized" + "Hypmotized" + "Psychodelic animation" + "Saul Goode" + "saulgoode" + "Feb 2013" + "" + SF-ADJUSTMENT "Width" '(400 10 2000 1 10 1 0) + SF-ADJUSTMENT "Spacing" '(10 2 40 1 10 1 0) + SF-ADJUSTMENT "Thickness" '(2 1 40 1 10 1 0) + SF-ADJUSTMENT "Number of Frames" '(30 1 1000 1 10 1 0) + SF-ADJUSTMENT "Cycles" '(3 1 40 1 10 1 0) + SF-ADJUSTMENT "Speed" '(1 1 40 1 10 1 0) + ) +(script-fu-menu-register "script-fu-sg-hypmotized" + "/File/Create" + )