diff options
Diffstat (limited to 'chickadee/render/sprite.scm')
-rw-r--r-- | chickadee/render/sprite.scm | 83 |
1 files changed, 48 insertions, 35 deletions
diff --git a/chickadee/render/sprite.scm b/chickadee/render/sprite.scm index 1ea4dda..1291687 100644 --- a/chickadee/render/sprite.scm +++ b/chickadee/render/sprite.scm @@ -26,7 +26,7 @@ #:use-module (chickadee render) #:use-module (chickadee render shader) #:use-module (chickadee render texture) - #:use-module (chickadee render vertex-buffer) + #:use-module (chickadee render buffer) #:export (draw-sprite with-batched-sprites draw-nine-patch)) @@ -59,26 +59,37 @@ void main (void) { "))) (define draw-sprite-unbatched - (let* ((vertex-buffer - (delay (make-streaming-vertex-buffer 'vec2 4))) + (let* ((position-buffer + (delay + (make-streaming-typed-buffer 'vec2 'float 4 + #:name "unbatched-sprite-vertices"))) (texcoord-buffer - (delay (make-streaming-vertex-buffer 'vec2 4))) + (delay + (make-streaming-typed-buffer 'vec2 'float 4 + #:name "unbatched-sprite-texcoords"))) (index-buffer - (delay (make-vertex-buffer 'index 'static (u32vector 0 3 2 0 2 1)))) + (delay + (make-typed-buffer #:name "unbatched-sprite-indices" + #:type 'scalar + #:component-type 'unsigned-int + #:buffer (make-buffer (u32vector 0 3 2 0 2 1) + #:target 'index)))) (vertex-array - (delay (make-vertex-array (force index-buffer) - (force vertex-buffer) - (force texcoord-buffer)))) + (delay + (make-vertex-array #:indices (force index-buffer) + #:attributes + `((0 . ,(force position-buffer)) + (1 . ,(force texcoord-buffer)))))) (tmp-matrix (make-null-matrix4)) (mvp (make-null-matrix4)) (position (vec2 0 0))) (lambda (texture region scale rotation blend-mode shader texture-region) - (with-mapped-vertex-buffer (force vertex-buffer) + (with-mapped-typed-buffer (force position-buffer) (let* ((x1 0) (y1 0) (x2 (rect-width region)) (y2 (rect-height region)) - (bv (vertex-buffer-data (force vertex-buffer)))) + (bv (typed-buffer-data (force position-buffer)))) (f32vector-set! bv 0 x1) (f32vector-set! bv 1 y1) (f32vector-set! bv 2 x2) @@ -87,12 +98,12 @@ void main (void) { (f32vector-set! bv 5 y2) (f32vector-set! bv 6 x1) (f32vector-set! bv 7 y2))) - (with-mapped-vertex-buffer (force texcoord-buffer) + (with-mapped-typed-buffer (force texcoord-buffer) (let ((s1 (rect-left texture-region)) (t1 (rect-bottom texture-region)) (s2 (rect-right texture-region)) (t2 (rect-top texture-region)) - (bv (vertex-buffer-data (force texcoord-buffer)))) + (bv (typed-buffer-data (force texcoord-buffer)))) (f32vector-set! bv 0 s1) (f32vector-set! bv 1 t1) (f32vector-set! bv 2 s2) @@ -137,10 +148,16 @@ void main (void) { (vertex-array sprite-batch-vertex-array set-sprite-batch-vertex-array!)) (define (init-sprite-batch batch capacity) - (let* ((index (make-streaming-vertex-buffer 'index (* capacity 6))) - (pos (make-streaming-vertex-buffer 'vec2 (* capacity 4))) - (tex (make-streaming-vertex-buffer 'vec2 (* capacity 4))) - (va (make-vertex-array index pos tex))) + (let* ((index (make-streaming-typed-buffer 'scalar + 'unsigned-int + (* capacity 6) + #:target 'index)) + (pos (make-streaming-typed-buffer 'vec2 'float (* capacity 4) + #:name "batched-sprite-vertices")) + (tex (make-streaming-typed-buffer 'vec2 'float (* capacity 4) + #:name "batched-sprite-vertices")) + (va (make-vertex-array #:indices index + #:attributes `((0 . ,pos) (1 . ,tex))))) (set-sprite-batch-capacity! batch capacity) (set-sprite-batch-index-buffer! batch index) (set-sprite-batch-position-buffer! batch pos) @@ -160,18 +177,18 @@ void main (void) { (let ((old-index (sprite-batch-index-buffer batch)) (old-verts (sprite-batch-position-buffer batch)) (old-tex (sprite-batch-texture-buffer batch))) - (unmap-vertex-buffer! old-index) - (unmap-vertex-buffer! old-verts) - (unmap-vertex-buffer! old-tex) + (unmap-typed-buffer! old-index) + (unmap-typed-buffer! old-verts) + (unmap-typed-buffer! old-tex) (init-sprite-batch batch (* (sprite-batch-capacity batch) 2)) (sprite-batch-begin! batch) (let ((new-index (sprite-batch-index-buffer batch)) (new-verts (sprite-batch-position-buffer batch)) (new-tex (sprite-batch-texture-buffer batch))) (define (copy from to) - (bytevector-copy! (vertex-buffer-data from) 0 - (vertex-buffer-data to) 0 - (bytevector-length (vertex-buffer-data from)))) + (bytevector-copy! (typed-buffer-data from) 0 + (typed-buffer-data to) 0 + (bytevector-length (typed-buffer-data from)))) (copy old-index new-index) (copy old-verts new-verts) (copy old-tex new-tex)))) @@ -184,18 +201,18 @@ void main (void) { (set-sprite-batch-size! batch 0)) (define (sprite-batch-begin! batch) - (map-vertex-buffer! (sprite-batch-index-buffer batch)) - (map-vertex-buffer! (sprite-batch-position-buffer batch)) - (map-vertex-buffer! (sprite-batch-texture-buffer batch))) + (map-typed-buffer! (sprite-batch-index-buffer batch)) + (map-typed-buffer! (sprite-batch-position-buffer batch)) + (map-typed-buffer! (sprite-batch-texture-buffer batch))) (define (sprite-batch-flush! batch) "Render the contents of BATCH and clear the cache." (unless (zero? (sprite-batch-size batch)) (with-blend-mode (sprite-batch-blend-mode batch) (with-texture 0 (sprite-batch-texture batch) - (unmap-vertex-buffer! (sprite-batch-index-buffer batch)) - (unmap-vertex-buffer! (sprite-batch-position-buffer batch)) - (unmap-vertex-buffer! (sprite-batch-texture-buffer batch)) + (unmap-typed-buffer! (sprite-batch-index-buffer batch)) + (unmap-typed-buffer! (sprite-batch-position-buffer batch)) + (unmap-typed-buffer! (sprite-batch-texture-buffer batch)) (gpu-apply* (sprite-batch-shader batch) (sprite-batch-vertex-array batch) (* (sprite-batch-size batch) 6) @@ -228,13 +245,9 @@ void main (void) { (set-sprite-batch-blend-mode! batch blend-mode) (set-sprite-batch-shader! batch shader)) (let ((size (sprite-batch-size batch))) - (let* (;;(index-offset (* size 6)) - ;;(index-vertex-offset (* size 4)) - ;;(vertex-offset (* size 8)) ;; 4 vertices, 2 floats per vertex - ;;(texture-offset (* size 8)) - (indices (vertex-buffer-data (sprite-batch-index-buffer batch))) - (vertices (vertex-buffer-data (sprite-batch-position-buffer batch))) - (texcoords (vertex-buffer-data (sprite-batch-texture-buffer batch))) + (let* ((indices (typed-buffer-data (sprite-batch-index-buffer batch))) + (vertices (typed-buffer-data (sprite-batch-position-buffer batch))) + (texcoords (typed-buffer-data (sprite-batch-texture-buffer batch))) (rx (rect-x region)) (ry (rect-y region)) (local-x1 0.0) |