From 7ea3e69142f3a9f4d843f9afcad593d7c7a972f0 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 29 Jan 2021 21:01:16 -0500 Subject: Make asset access transparent and add reload handler method. --- starling/asset.scm | 31 +++++++++++++++++++++++------ starling/node-2d.scm | 22 ++++++++++----------- starling/node.scm | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 19 deletions(-) diff --git a/starling/asset.scm b/starling/asset.scm index c1a05a1..8ddf945 100644 --- a/starling/asset.scm +++ b/starling/asset.scm @@ -32,7 +32,10 @@ artifact file-name loader - args + loader-args + on-asset-reload + add-subscriber + remove-subscriber watch-assets watching-assets? watch-asset-directory @@ -57,7 +60,8 @@ (file-name #:getter file-name #:init-keyword #:file-name) (loader #:getter loader #:init-keyword #:loader) (loader-args #:getter loader-args #:init-form '() - #:init-keyword #:loader-args)) + #:init-keyword #:loader-args) + (subscribers #:getter subscribers #:init-form (make-weak-key-hash-table))) (define (absolute-file-name file-name) (if (absolute-file-name? file-name) @@ -80,6 +84,23 @@ wt)))) (hash-set! sub-table asset asset))) +(define-method (on-asset-reload obj slot-name) + #t) + +(define-method (add-subscriber (asset ) obj slot-name) + (let ((subs (subscribers asset))) + (hashq-set! subs obj (cons slot-name (hashq-ref subs obj '()))))) + +(define-method (remove-subscriber (asset ) obj slot-name) + (let* ((subs (subscribers asset)) + (slot-names (delq slot-name (hashq-ref subs obj '())))) + (if (null? slot-names) + (hashq-remove! subs obj) + (hashq-set! subs obj slot-names)))) + +(define-method (notify-subscribers (asset )) + (hash-for-each on-asset-reload (subscribers asset))) + (define-method (asset-purge (asset )) (hash-remove! (hash-ref (asset-file-map) (file-name asset)) asset)) @@ -151,7 +172,8 @@ (expire-cached-artifact (cache-key asset))) assets) (hash-for-each (lambda (key asset) - (load! asset)) + (load! asset) + (notify-subscribers asset)) assets)))))))) (define (cache-key asset) @@ -192,9 +214,6 @@ (or (hashq-ref (asset-artifact-map) asset) (load! asset #t))) -;; Make assets that are outside of the cache "just work". -(define-method (asset-ref x) x) - ;; Handy syntax for defining new assets. (define-syntax-rule (define-asset name (loader file-name loader-args ...)) diff --git a/starling/node-2d.scm b/starling/node-2d.scm index d54edf9..576cc3f 100644 --- a/starling/node-2d.scm +++ b/starling/node-2d.scm @@ -434,13 +434,13 @@ (define-generic texture) (define-method (texcoords (sprite )) - (texture-gl-tex-rect (asset-ref (texture sprite)))) + (texture-gl-tex-rect (texture sprite))) (define-method (source-rect (sprite )) - (texture-gl-rect (asset-ref (texture sprite)))) + (texture-gl-rect (texture sprite))) (define-method (render (sprite ) alpha) - (let* ((tex (asset-ref (texture sprite))) + (let* ((tex (texture sprite)) (rect (source-rect sprite)) (batch (batch sprite)) (tint (tint sprite)) @@ -459,7 +459,7 @@ ;;; (define-class () - (texture #:getter texture #:init-keyword #:texture) + (texture #:getter texture #:init-keyword #:texture #:asset? #t) (texcoords #:init-keyword #:texcoords #:init-form #f) (source-rect #:init-keyword #:source-rect #:init-form #f)) @@ -477,11 +477,11 @@ ;;; (define-class () - (atlas #:accessor atlas #:init-keyword #:atlas) + (atlas #:accessor atlas #:init-keyword #:atlas #:asset? #t) (index #:accessor index #:init-keyword #:index)) (define-method (texture (sprite )) - (texture-atlas-ref (asset-ref (atlas sprite)) (index sprite))) + (texture-atlas-ref (atlas sprite) (index sprite))) ;;; @@ -566,7 +566,7 @@ ;;; (define-class