AtlatestRepositorysigil-studio

sigil-studio / tree / testtest-transforms.sgl

1;;; test-transforms.sgl - Demo of transform stack
2
3(import (sigil core)
4 (sigil app)
5 (sigil graphics)
6 (sigil graphics font))
7
8(define (label text x y)
9 (set-color 0.7 0.7 0.7)
10 (draw-text-centered *font* text x y))
12(define *font* #f)
13(define *angle* 0.0)
14(define *time* 0.0)
16(define (on-init)
17 (set! *font* (load-font "test/Saucer.ttf" 18)))
19(define (on-frame)
20 (begin-frame)
21 (clear-screen 0.05 0.05 0.1)
23 ;; Update time
24 (set! *time* (+ *time* 0.016))
25 (set! *angle* (+ *angle* 0.02))
27 ;; Title
28 (when *font*
29 (set-color 0.0 1.0 1.0)
30 (draw-text-centered *font* "Transform Stack Demo" 400 30))
32 ;; 1. Simple rotation around center
33 (push-transform)
34 (translate 150 150)
35 (rotate *angle*)
36 (set-color 1.0 0.3 0.3)
37 (draw-filled-rect -40 -40 80 80)
38 (set-color 1.0 1.0 1.0)
39 (draw-rect -40 -40 80 80)
40 (pop-transform)
42 (when *font*
43 (label "Rotating" 150 250))
45 ;; 2. Scaling pulse
46 (push-transform)
47 (translate 400 150)
48 (define pulse (+ 0.7 (* 0.3 (sin (* *time* 3)))))
49 (scale pulse pulse)
50 (set-color 0.3 1.0 0.3)
51 (draw-filled-rect -40 -40 80 80)
52 (set-color 1.0 1.0 1.0)
53 (draw-rect -40 -40 80 80)
54 (pop-transform)
56 (when *font*
57 (label "Pulsing" 400 250))
59 ;; 3. Rotation + scale combined
60 (push-transform)
61 (translate 650 150)
62 (rotate (* *angle* -0.5))
63 (scale (+ 0.8 (* 0.2 (cos (* *time* 2))))
64 (+ 0.8 (* 0.2 (sin (* *time* 2)))))
65 (set-color 0.3 0.3 1.0)
66 (draw-filled-rect -40 -40 80 80)
67 (set-color 1.0 1.0 1.0)
68 (draw-rect -40 -40 80 80)
69 (pop-transform)
71 (when *font*
72 (label "Combined" 650 250))
74 ;; 4. Nested transforms - orbiting squares
75 (push-transform)
76 (translate 150 400)
78 ;; Outer rotation
79 (push-transform)
80 (rotate *angle*)
82 ;; Draw center
83 (set-color 1.0 1.0 0.0)
84 (draw-filled-rect -15 -15 30 30)
86 ;; Orbiting square 1
87 (push-transform)
88 (translate 70 0)
89 (rotate (* *angle* -2))
90 (set-color 1.0 0.5 0.0)
91 (draw-filled-rect -12 -12 24 24)
92 (pop-transform)
94 ;; Orbiting square 2
95 (push-transform)
96 (translate -70 0)
97 (rotate (* *angle* -2))
98 (set-color 0.0 1.0 0.5)
99 (draw-filled-rect -12 -12 24 24)
100 (pop-transform)
102 (pop-transform)
103 (pop-transform)
105 (when *font*
106 (label "Orbiting" 150 500))
108 ;; 5. Triangle rotation
109 (push-transform)
110 (translate 400 400)
111 (rotate (* *angle* 0.7))
112 (set-color 1.0 0.0 1.0)
113 (fill-triangle 0 -50 -43 25 43 25)
114 (set-color 1.0 1.0 1.0)
115 (draw-triangle 0 -50 -43 25 43 25)
116 (pop-transform)
118 (when *font*
119 (label "Triangle" 400 500))
121 ;; 6. Line spinner
122 (push-transform)
123 (translate 650 400)
124 (let loop ((i 0))
125 (when (< i 8)
126 (push-transform)
127 (rotate (+ *angle* (* i 0.785))) ; i * pi/4
128 (set-color (/ i 8.0) 1.0 (- 1.0 (/ i 8.0)))
129 (draw-line 0 0 60 0)
130 (pop-transform)
131 (loop (+ i 1))))
132 (pop-transform)
134 (when *font*
135 (label "Spinner" 650 500))
137 (when (key-pressed? 'escape)
138 (request-quit))
140 (end-frame))
142(define (on-cleanup) #t)
144(app-run on-init on-frame on-cleanup "Transform Demo" 800 550)