diff options
Diffstat (limited to 'chickadee/render.scm')
-rw-r--r-- | chickadee/render.scm | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/chickadee/render.scm b/chickadee/render.scm index cf8a672..9edab51 100644 --- a/chickadee/render.scm +++ b/chickadee/render.scm @@ -50,8 +50,8 @@ (define *current-framebuffer* null-framebuffer) (define *current-blend-mode* 'replace) (define *current-depth-test* #f) -(define *current-texture* null-texture) (define *current-projection* (make-identity-matrix4)) +(define *current-textures* (make-vector 32 null-texture)) (define (current-viewport) *current-viewport*) @@ -65,8 +65,8 @@ (define (current-depth-test) *current-depth-test*) -(define (current-texture) - *current-texture*) +(define (current-texture i) + (vector-ref *current-textures* i)) (define (current-projection) *current-projection*) @@ -95,8 +95,12 @@ (define-syntax-rule (with-depth-test depth-test body ...) (with (*current-depth-test* depth-test) body ...)) -(define-syntax-rule (with-texture texture body ...) - (with (*current-texture* texture) body ...)) +(define-syntax-rule (with-texture n texture body ...) + (let ((prev (vector-ref *current-textures* n))) + (dynamic-wind + (lambda () (vector-set! *current-textures* n texture)) + (lambda () body ...) + (lambda () (vector-set! *current-textures* n prev))))) (define-syntax-rule (with-shader shader body ...) (with (*current-shader* shader) @@ -155,10 +159,17 @@ (gpu-state-set! *viewport-state* (current-viewport)) (gpu-state-set! *blend-mode-state* (current-blend-mode)) (gpu-state-set! *depth-test-state* (current-depth-test)) - (gpu-state-set! *texture-state* (current-texture)) (gpu-state-set! *shader-state* shader) (gpu-state-set! *vertex-array-state* vertex-array) + (let loop ((i 0)) + (when (< i 32) + (texture-set! i (current-texture i)) + (loop (1+ i)))) (uniform-apply shader uniforms) + (hash-for-each (lambda (name uniform) + (when (eq? 'sampler-2d (uniform-type uniform)) + (set-uniform-value! uniform (uniform-value uniform)))) + (shader-uniforms shader)) (render-vertices count))) (define-syntax-rule (gpu-apply shader vertex-array uniforms ...) |