diff options
author | David Thompson <dthompson2@worcester.edu> | 2019-05-10 08:34:53 -0400 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2019-05-12 11:38:43 -0400 |
commit | 34975b307a85cbb34b040b8a0c6a0f9104b4c331 (patch) | |
tree | 26e27980c64491026eaa1d1d51af9c861d5f7102 /chickadee/render/tiled.scm | |
parent | dd1ccc8afc8ec0411ac636f542fd4bb8d4d242af (diff) |
render: sprite: Rewrite sprite batching API.
This new version performs better and has a better API. It closely
resembles Love2D's sprite batch API.
* chickadee/render/sprite.scm (with-batched-sprites,
sprite-batch-reset!, sprite-batch-begin!,
draw-sprite-batched, *batch?*, %batch): Delete.
(draw-sprite-unbatched): Rename to 'draw-sprite*'.
(<sprite-batch>)[index-buffer, position-buffer, texture-buffer]:
Delete fields.
[vertex-buffer]: New field.
(init-sprite-batch, double-sprite-batch-size!, sprite-batch-add!,
sprite-batch-flush!): Rewrite.
(make-sprite-batch): Add 'capacity' and 'blend-mode' arguments.
(draw-sprite-batch): New procedure.
(draw-nine-patch*): Stop using sprite batches for now.
* chickadee/render/font.scm: (<font>)[sprite-batches]: New field.
(load-tile-font, load-font): Create a sprite batch for each texture
loaded.
(draw-text*): Use sprite batches.
* chickadee/render/tiled.scm: (<tile>)[batch]: New field.
(<tileset>)[batch]: New field.
(load-tile-map): Create a sprite batch for each tileset.
(draw-tile-layer): Use new sprite batch API.
(draw-tile-map*): Remove reference to deleted macro.
Diffstat (limited to 'chickadee/render/tiled.scm')
-rw-r--r-- | chickadee/render/tiled.scm | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/chickadee/render/tiled.scm b/chickadee/render/tiled.scm index 1a4c200..1fbdbe6 100644 --- a/chickadee/render/tiled.scm +++ b/chickadee/render/tiled.scm @@ -118,16 +118,17 @@ (duration animation-frame-duration)) (define-record-type <tile> - (%make-tile id texture animation properties) + (%make-tile id texture batch animation properties) tile? (id tile-id) (texture tile-texture) + (batch tile-batch) (animation tile-animation) (properties tile-properties)) (define-record-type <tileset> (%make-tileset name first-gid size tile-width tile-height - atlas tiles properties) + atlas tiles properties batch) tileset? (name tileset-name) (first-gid tileset-first-gid) @@ -136,7 +137,8 @@ (tile-height tileset-tile-height) (atlas tileset-atlas) (tiles tileset-tiles) - (properties tileset-properties)) + (properties tileset-properties) + (batch tileset-batch)) (define-record-type <map-tile> (%make-map-tile tile rect) @@ -230,26 +232,25 @@ (duration (attr node 'duration string->number))) ;; TODO: lookup actual tile in tileset (%make-animation-frame tile-id duration))) - (define (parse-tile node rows columns atlas) + (define (parse-tile node rows columns atlas batch) (let ((id (attr node 'id string->number)) (animation (map parse-frame ((sxpath '(animation frame)) node))) (properties (map parse-property ((sxpath '(properties property)) node)))) - (%make-tile id (texture-atlas-ref atlas id) - animation properties))) - (define (parse-tiles nodes size columns atlas) + (%make-tile id (texture-atlas-ref atlas id) batch animation properties))) + (define (parse-tiles nodes size columns atlas batch) (let ((table (make-hash-table)) (tiles (make-vector size)) (rows (/ size columns))) (for-each (lambda (node) - (let ((tile (parse-tile node rows columns atlas))) + (let ((tile (parse-tile node rows columns atlas batch))) (hash-set! table (tile-id tile) tile))) nodes) (let loop ((i 0)) (when (< i size) (let ((tile (or (hash-ref table i) - (%make-tile i (texture-atlas-ref atlas i) #f '())))) + (%make-tile i (texture-atlas-ref atlas i) batch #f '())))) (vector-set! tiles i tile)) (loop (+ i 1)))) tiles)) @@ -266,11 +267,12 @@ (texture (parse-image ((sxpath '(image)) node))) (atlas (split-texture texture tile-width tile-height #:margin margin #:spacing spacing)) - (tiles (parse-tiles ((sxpath '(tile)) node) size columns atlas)) + (batch (make-sprite-batch texture)) + (tiles (parse-tiles ((sxpath '(tile)) node) size columns atlas batch)) (properties (map parse-property ((sxpath '(properties property)) node)))) (%make-tileset name first-gid size tile-width tile-height - atlas tiles properties))) + atlas tiles properties batch))) (define (parse-external-tileset node) (let* ((first-gid (attr node 'firstgid string->number)) (source (scope (attr node 'source))) @@ -419,9 +421,11 @@ (let ((tile (vector-ref (tile-layer-tiles layer) (+ (* y width) x)))) (when tile - (draw-sprite* (tile-texture (map-tile-ref tile)) - (map-tile-rect tile) - matrix))) + (let ((tref (map-tile-ref tile))) + (sprite-batch-add* (tile-batch tref) + (map-tile-rect tile) + matrix + #:texture-region (tile-texture tref))))) (x-loop (+ x 1)))) (y-loop (+ y 1)))))) @@ -440,13 +444,18 @@ (y1 (max (inexact->exact (floor (/ ry th))) 0)) (x2 (min (inexact->exact (ceiling (/ (+ rx rw) tw))) w)) (y2 (min (inexact->exact (ceiling (/ (+ ry rh) th))) h))) - (with-batched-sprites - (vector-for-each (lambda (i layer) - (when (and (tile-layer? layer) - (or (not layers) - (memv i layers))) - (draw-tile-layer layer matrix x1 y1 x2 y2))) - (tile-map-layers tile-map))))) + (vector-for-each (lambda (i layer) + (when (and (tile-layer? layer) + (or (not layers) + (memv i layers))) + (for-each (lambda (tileset) + (sprite-batch-clear! (tileset-batch tileset))) + (tile-map-tilesets tile-map)) + (draw-tile-layer layer matrix x1 y1 x2 y2) + (for-each (lambda (tileset) + (draw-sprite-batch (tileset-batch tileset))) + (tile-map-tilesets tile-map)))) + (tile-map-layers tile-map)))) (define %null-vec2 (vec2 0.0 0.0)) (define %default-scale (vec2 1.0 1.0)) |