Improvements to Spite

This commit is contained in:
retropikzel 2025-12-26 06:46:43 +02:00
parent 634fead8ce
commit a6911047a4
3 changed files with 63 additions and 23 deletions

View File

@ -6,6 +6,10 @@
(define events (list))
(define current-bitmap-font #f)
(define current-line-size 1)
(define draw-color-r 0)
(define draw-color-g 0)
(define draw-color-b 0)
(define draw-color-a 255)
(define-c-library sdl2*
'("SDL2/SDL.h")
"SDL2-2.0"
@ -41,12 +45,27 @@
(define-c-procedure sdl-create-texture-from-surface sdl2* 'SDL_CreateTextureFromSurface 'pointer '(pointer pointer))
(define-c-procedure sdl-set-window-resizable sdl2* 'SDL_SetWindowResizable 'void '(pointer int))
(define-c-procedure sdl-render-get-scale sdl2* 'SDL_RenderGetScale 'void '(pointer pointer pointer))
(define-c-procedure sdl-render-geometry sdl2* 'SDL_RenderGeometry 'void '(pointer pointer pointer int pointer int))
(define window* #f)
(define renderer* #f)
(define event* (make-c-bytevector 4000))
(define draw-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
(define draw-slice-rect* (make-c-bytevector (* (c-type-size 'int) 4)))
(define fill-triangle-vertex-size 128 #;(+ (* (c-type-size 'int) 6) (* (c-type-size 'float) 2)))
(define fill-triangle-vertex1* (make-c-bytevector fill-triangle-vertex-size 0))
(define fill-triangle-vertex2* (make-c-bytevector fill-triangle-vertex-size 0))
(define fill-triangle-vertex3* (make-c-bytevector fill-triangle-vertex-size 0))
(define fill-triangle-vertexes* (make-c-bytevector (* fill-triangle-vertex-size 3 0)))
(c-bytevector-pointer-set! fill-triangle-vertexes*
(* fill-triangle-vertex-size 0)
fill-triangle-vertex1*)
(c-bytevector-pointer-set! fill-triangle-vertexes*
(* fill-triangle-vertex-size 1)
fill-triangle-vertex2*)
(c-bytevector-pointer-set! fill-triangle-vertexes*
(* fill-triangle-vertex-size 2)
fill-triangle-vertex3*)
(define null* (make-c-null))
(define update-procedure #f)
@ -189,7 +208,27 @@
(sdl-render-copy renderer* (image-pointer image) draw-slice-rect* draw-rect*)))
(define (set-draw-color r g b . a)
(sdl-set-render-draw-color renderer* r g b (if (null? a) 255 (car a))))
(set! draw-color-r r)
(set! draw-color-g g)
(set! draw-color-b b)
(set! draw-color-a (if (null? a) 255 a))
(c-bytevector-sint-set! fill-triangle-vertex1* (* (c-type-size 'int) 2) draw-color-r (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex1* (* (c-type-size 'int) 3) draw-color-g (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex1* (* (c-type-size 'int) 4) draw-color-b (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex1* (* (c-type-size 'int) 5) draw-color-b (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex2* (* (c-type-size 'int) 2) draw-color-r (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex2* (* (c-type-size 'int) 3) draw-color-g (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex2* (* (c-type-size 'int) 4) draw-color-b (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex2* (* (c-type-size 'int) 5) draw-color-b (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex3* (* (c-type-size 'int) 2) draw-color-r (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex3* (* (c-type-size 'int) 3) draw-color-g (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex3* (* (c-type-size 'int) 4) draw-color-b (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex3* (* (c-type-size 'int) 5) draw-color-b (native-endianness) (c-type-size 'int))
(sdl-set-render-draw-color renderer* r g b draw-color-a))
(define (set-line-size size)
(set! current-line-size size)
@ -223,6 +262,24 @@
(c-bytevector-sint-set! draw-rect* (* (c-type-size 'int) 3) height (native-endianness) (c-type-size 'int))
(sdl-render-fill-rect renderer* draw-rect*))
(define (draw-triangle x1 y1 x2 y2 x3 y3)
(draw-line x1 y1 x2 y2)
(draw-line x2 y2 x3 y3)
(draw-line x3 y3 x1 y1))
;; FIXME
#;(define (fill-triangle x1 y1 x2 y2 x3 y3)
(c-bytevector-sint-set! fill-triangle-vertex1* (* (c-type-size 'int) 0) x1 (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex1* (* (c-type-size 'int) 1) y1 (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex2* (* (c-type-size 'int) 0) x2 (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex2* (* (c-type-size 'int) 1) y2 (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex3* (* (c-type-size 'int) 0) x3 (native-endianness) (c-type-size 'int))
(c-bytevector-sint-set! fill-triangle-vertex3* (* (c-type-size 'int) 1) y3 (native-endianness) (c-type-size 'int))
(sdl-render-geometry renderer* (make-c-null) fill-triangle-vertexes* 3 (make-c-null) 0))
(define (spite-option-set! name . value)
(cond
((equal? name 'allow-window-resizing)
@ -365,22 +422,3 @@
(set! offset-x (+ offset-x (bitmap-font-get 'character-draw-width current-bitmap-font))))
(make-bitmap-text text current-bitmap-font)))))
(define (draw-polygon points)
(let* ((first-point #f)
(previous-point #f))
(for-each
(lambda (point)
(when (not first-point)
(set! first-point point)
(set! previous-point first-point))
(draw-line (car previous-point)
(cdr previous-point)
(car point)
(cdr point))
(set! previous-point point))
points)
(when first-point
(draw-line (car previous-point)
(cdr previous-point)
(car first-point)
(cdr first-point)))))

View File

@ -24,8 +24,9 @@
draw-line
draw-rectangle
fill-rectangle
draw-circle
draw-polygon
draw-triangle
;; FIXME
;fill-triangle
push-event
clear-events!

View File

@ -51,7 +51,8 @@
(apply set-draw-color black)
(draw-rectangle player-x player-y 64 64)
(fill-rectangle (+ player-x 32) (+ player-y 32) 16 16)
(draw-polygon '((300 . 332) (332 . 400) (432 . 400)))
(draw-triangle 350 350 380 380 330 380)
(fill-triangle 450 450 480 480 430 480)
))
(spite-start update draw)