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