summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2018-12-13 17:32:07 -0500
committerDavid Thompson <dthompson2@worcester.edu>2018-12-13 17:32:07 -0500
commitda895821c9aa1f8ec63e2eb7e8d317040d9989d7 (patch)
tree9b4554189483fa42f122268b5dce255c938ad7db
parentf6e11d5e73a0f61a59f50b49817779f9fb520e15 (diff)
render: sprite: Use a single buffer for unbatched sprite mesh.
* chickadee/render/sprite.scm (draw-sprite-unbatched): Combine vertices and texcoords into a single packed buffer.
-rw-r--r--chickadee/render/sprite.scm82
1 files changed, 46 insertions, 36 deletions
diff --git a/chickadee/render/sprite.scm b/chickadee/render/sprite.scm
index 8ccd32b..c9a777f 100644
--- a/chickadee/render/sprite.scm
+++ b/chickadee/render/sprite.scm
@@ -61,59 +61,69 @@ void main (void) {
")))
(define draw-sprite-unbatched
- (let* ((position-buffer
+ (let* ((stride 16) ; 4 f32s, 2 for vertex, 2 for texcoord
+ (buffer (delay
+ (make-buffer #f
+ #:name "unbatched sprite buffer"
+ #:length (* stride 4)
+ #:stride stride
+ #:usage 'stream)))
+ (pos (delay
+ (make-typed-buffer #:name "unbatched sprite vertices"
+ #:buffer (force buffer)
+ #:type 'vec2
+ #:component-type 'float
+ #:length 4)))
+ (tex (delay
+ (make-typed-buffer #:name "unbatched sprite texcoords"
+ #:buffer (force buffer)
+ #:type 'vec2
+ #:component-type 'float
+ #:length 4
+ #:offset 8)))
+ (indices
(delay
- (make-streaming-typed-buffer 'vec2 'float 4
- #:name "unbatched-sprite-vertices")))
- (texcoord-buffer
- (delay
- (make-streaming-typed-buffer 'vec2 'float 4
- #:name "unbatched-sprite-texcoords")))
- (index-buffer
- (delay
- (make-typed-buffer #:name "unbatched-sprite-indices"
+ (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 #:indices (force index-buffer)
+ (make-vertex-array #:indices (force indices)
#:attributes
- `((0 . ,(force position-buffer))
- (1 . ,(force texcoord-buffer))))))
+ `((0 . ,(force pos))
+ (1 . ,(force tex))))))
(mvp (make-null-matrix4)))
(lambda (texture region world-matrix blend-mode shader texture-region)
- (with-mapped-typed-buffer (force position-buffer)
+ (with-mapped-typed-buffer (force pos)
(let* ((x1 (rect-x region))
(y1 (rect-y region))
(x2 (+ x1 (rect-width region)))
(y2 (+ y1 (rect-height region)))
- (bv (typed-buffer-data (force position-buffer))))
+ (s1 (rect-x texture-region))
+ (t1 (rect-y texture-region))
+ (s2 (+ (rect-x texture-region) (rect-width texture-region)))
+ (t2 (+ (rect-y texture-region) (rect-height texture-region)))
+ (bv (typed-buffer-data (force pos))))
+ ;; Texture origin is at the top-left, so we need to flip the Y
+ ;; coordinate relative to the vertices.
(f32vector-set! bv 0 x1)
(f32vector-set! bv 1 y1)
- (f32vector-set! bv 2 x2)
- (f32vector-set! bv 3 y1)
- (f32vector-set! bv 4 x2)
- (f32vector-set! bv 5 y2)
- (f32vector-set! bv 6 x1)
- (f32vector-set! bv 7 y2)))
- (with-mapped-typed-buffer (force texcoord-buffer)
- ;; Texture origin is at the top-left, so we need to flip the Y
- ;; coordinate relative to the vertices.
- (let ((s1 (rect-x texture-region))
- (t1 (rect-y texture-region))
- (s2 (+ (rect-x texture-region) (rect-width texture-region)))
- (t2 (+ (rect-y texture-region) (rect-height texture-region)))
- (bv (typed-buffer-data (force texcoord-buffer))))
- (f32vector-set! bv 0 s1)
- (f32vector-set! bv 1 t2)
- (f32vector-set! bv 2 s2)
+ (f32vector-set! bv 2 s1)
(f32vector-set! bv 3 t2)
- (f32vector-set! bv 4 s2)
- (f32vector-set! bv 5 t1)
- (f32vector-set! bv 6 s1)
- (f32vector-set! bv 7 t1)))
+ (f32vector-set! bv 4 x2)
+ (f32vector-set! bv 5 y1)
+ (f32vector-set! bv 6 s2)
+ (f32vector-set! bv 7 t2)
+ (f32vector-set! bv 8 x2)
+ (f32vector-set! bv 9 y2)
+ (f32vector-set! bv 10 s2)
+ (f32vector-set! bv 11 t1)
+ (f32vector-set! bv 12 x1)
+ (f32vector-set! bv 13 y2)
+ (f32vector-set! bv 14 s1)
+ (f32vector-set! bv 15 t1)))
(with-blend-mode blend-mode
(with-texture 0 texture
(gpu-apply shader (force vertex-array)