summaryrefslogtreecommitdiff
path: root/chickadee/render/sprite.scm
diff options
context:
space:
mode:
Diffstat (limited to 'chickadee/render/sprite.scm')
-rw-r--r--chickadee/render/sprite.scm83
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)