-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtilemancer.scm
executable file
·64 lines (61 loc) · 2.58 KB
/
tilemancer.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
(define (tilemancer image drawable option spacing)
(let* (
(image (car (gimp-image-duplicate image)))
(width (car (gimp-image-width image)))
(height (car (gimp-image-height image)))
(layers (gimp-image-get-layers image))
(num-layers (car layers))
(layer-vect (cadr layers)))
(cond ((= option 0) (sheeterize-square image layer-vect (cons width height) spacing))
((= option 1) (sheeterize-group image layer-vect (cons width height) 0 spacing)))
(begin
(gimp-image-resize-to-layers image)
(gimp-image-merge-visible-layers image 1)
(gimp-image-grid-set-spacing image width height)
(gimp-display-new image)
(gimp-displays-flush))))
(define (sheeterize-square image item-vect framesize spacing)
(let ((side (ceiling (sqrt (vector-length item-vect)))))
(do ((i 0 (+ i 1))) ((= i side)) ; for i = 0; i < side; i++
(do ((j 0 (+ j 1))) ((= j side)) ; for j = 0; j < side; j++
(let ((frame (- (vector-length item-vect) 1 (+ j (* i side)))))
(if
(>= frame 0)
(gimp-layer-translate ; Copy input tile layer somewhere to output tileset
(vector-ref item-vect frame)
(* j (+ spacing (car framesize))) ; (framesize.x + spacing) * j
(* i (+ spacing (cdr framesize))) ; (framesize.y + spacing) * i
)
)
)
)
)
)
)
(define (sheeterize-group image item-vect framesize row spacing)
(let* ((width (car (gimp-image-width image)))
(height (car (gimp-image-height image)))
(cols (vector-length item-vect)))
(do ((i 0 (+ i 1))) ((= i cols))
(let* ((current-item (vector-ref item-vect i))
(xpos (* (- cols 1 i) (+ spacing (car framesize)))))
(if
(= 0 (car (gimp-item-is-group current-item)))
; if this particular item is not group, print it on current row
(gimp-layer-translate current-item xpos (* row (+ spacing (cdr framesize))))
; if it is group, recurse and use current item index as row index
(sheeterize-group image (cadr (gimp-item-get-children current-item)) framesize i spacing))))))
(script-fu-register
"tilemancer"
"tilemancer"
"Generate sprite sheets from layers"
"Malte Ehrlen"
"copyright 2020, Malte Ehrlen, [email protected];"
"October 19, 2020"
"*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-OPTION "Shape" '("Square" "One row per layer group")
SF-VALUE "Tile spacing amount (px)" "0"
)
(script-fu-menu-register "tilemancer" "<Image>/Filters/Animation")