diff options
Diffstat (limited to 'chickadee/graphics.scm')
-rw-r--r-- | chickadee/graphics.scm | 252 |
1 files changed, 0 insertions, 252 deletions
diff --git a/chickadee/graphics.scm b/chickadee/graphics.scm deleted file mode 100644 index 67abacb..0000000 --- a/chickadee/graphics.scm +++ /dev/null @@ -1,252 +0,0 @@ -;;; Chickadee Game Toolkit -;;; Copyright © 2016 David Thompson <davet@gnu.org> -;;; -;;; Chickadee is free software: you can redistribute it and/or modify -;;; it under the terms of the GNU General Public License as published -;;; by the Free Software Foundation, either version 3 of the License, -;;; or (at your option) any later version. -;;; -;;; Chickadee is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -;;; General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with this program. If not, see -;;; <http://www.gnu.org/licenses/>. - -;;; Commentary: -;; -;; High-level rendering API. -;; -;;; Code: - -(define-module (chickadee graphics) - #:use-module (chickadee math matrix) - #:use-module (chickadee graphics blend) - #:use-module (chickadee graphics buffer) - #:use-module (chickadee graphics color) - #:use-module (chickadee graphics framebuffer) - #:use-module (chickadee graphics gpu) - #:use-module (chickadee graphics polygon) - #:use-module (chickadee graphics shader) - #:use-module (chickadee graphics texture) - #:use-module (chickadee graphics viewport) - #:use-module (srfi srfi-9) - #:export (current-viewport - current-framebuffer - current-blend-mode - current-polygon-mode - current-cull-face-mode - current-depth-test - current-stencil-test - current-texture - current-projection - current-multisample - current-color-mask - with-viewport - with-framebuffer - with-blend-mode - with-polygon-mode - with-cull-face-mode - with-depth-test - with-stencil-test - with-texture - with-projection - with-multisample - with-color-mask - clear-screen - gpu-apply - gpu-apply* - gpu-apply/instanced* - gpu-apply/instanced)) - -(define-record-type <render-context> - (make-render-context viewport framebuffer blend-mode polygon-mode - cull-face-mode depth-test stencil-test projection - multisample? color-mask textures) - render-context? - (viewport render-context-viewport set-render-context-viewport!) - (framebuffer render-context-framebuffer set-render-context-framebuffer!) - (blend-mode render-context-blend-mode set-render-context-blend-mode!) - (polygon-mode render-context-polygon-mode set-render-context-polygon-mode!) - (cull-face-mode render-context-cull-face-mode set-render-context-cull-face-mode!) - (depth-test render-context-depth-test set-render-context-depth-test!) - (stencil-test render-context-stencil-test set-render-context-stencil-test!) - (projection render-context-projection set-render-context-projection!) - (multisample? render-context-multisample? set-render-context-multisample!) - (color-mask render-context-color-mask set-render-context-color-mask!) - (textures render-context-textures)) - -(define render-context - (make-render-context null-viewport - null-framebuffer - 'replace - fill-polygon-mode - back-cull-face-mode - #f - #f - (make-identity-matrix4) - #f - default-color-mask - (make-vector 32 null-texture))) - -(define (current-viewport) - (render-context-viewport render-context)) - -(define (current-framebuffer) - (render-context-framebuffer render-context)) - -(define (current-blend-mode) - (render-context-blend-mode render-context)) - -(define (current-polygon-mode) - (render-context-polygon-mode render-context)) - -(define (current-cull-face-mode) - (render-context-cull-face-mode render-context)) - -(define (current-depth-test) - (render-context-depth-test render-context)) - -(define (current-stencil-test) - (render-context-stencil-test render-context)) - -(define (current-texture i) - (vector-ref (render-context-textures render-context) i)) - -(define (current-projection) - (render-context-projection render-context)) - -(define (current-multisample) - (render-context-multisample? render-context)) - -(define (current-color-mask) - (render-context-color-mask render-context)) - -(define-syntax-rule (with (getter setter value) body ...) - (let ((prev (getter render-context))) - (setter render-context value) - body ... - (setter render-context prev))) - -(define-syntax-rule (with-viewport viewport body ...) - (with (render-context-viewport set-render-context-viewport! viewport) - body ...)) - -(define (clear-screen) - (let ((viewport (current-viewport))) - (set-gpu-framebuffer! (current-gpu) (current-framebuffer)) - (set-gpu-viewport! (current-gpu) viewport) - (clear-viewport viewport))) - -(define-syntax-rule (with-framebuffer framebuffer body ...) - (with (render-context-framebuffer set-render-context-framebuffer! framebuffer) - ;; As a convenience, initialize the viewport and projection - ;; matrix as well so that the user doesn't have to explicitly - ;; make a viewport and/or projection matrix unless they - ;; actually want to do fancy viewport manipulations. - (with-viewport (framebuffer-viewport framebuffer) - (with-projection (framebuffer-projection framebuffer) - body ...)))) - -(define-syntax-rule (with-blend-mode blend-mode body ...) - (with (render-context-blend-mode set-render-context-blend-mode! blend-mode) - body ...)) - -(define-syntax-rule (with-polygon-mode polygon-mode body ...) - (with (render-context-polygon-mode set-render-context-polygon-mode! polygon-mode) - body ...)) - -(define-syntax-rule (with-cull-face-mode cull-face-mode body ...) - (with (render-context-cull-face-mode set-render-context-cull-face-mode! cull-face-mode) - body ...)) - -(define-syntax-rule (with-depth-test depth-test body ...) - (with (render-context-depth-test set-render-context-depth-test! depth-test) - body ...)) - -(define-syntax-rule (with-stencil-test stencil-test body ...) - (with (render-context-stencil-test set-render-context-stencil-test! stencil-test) - body ...)) - -(define-syntax-rule (with-texture n texture body ...) - (let* ((textures (render-context-textures render-context)) - (prev (vector-ref textures n))) - (dynamic-wind - (lambda () (vector-set! textures n texture)) - (lambda () body ...) - (lambda () (vector-set! textures n prev))))) - -(define-syntax-rule (with-projection matrix body ...) - (with (render-context-projection set-render-context-projection! matrix) - body ...)) - -(define-syntax-rule (with-multisample multisample? body ...) - (with (render-context-multisample? set-render-context-multisample! multisample?) - body ...)) - -(define-syntax-rule (with-color-mask color-mask body ...) - (with (render-context-color-mask set-render-context-color-mask! color-mask) - body ...)) - -(define (keyword->string kw) - (symbol->string (keyword->symbol kw))) - -(define-syntax uniform-apply - (lambda (x) - (syntax-case x () - ((_ shader ()) (datum->syntax x #t)) - ((_ shader (name value . rest)) - (with-syntax ((sname (datum->syntax x (keyword->symbol - (syntax->datum #'name))))) - #'(begin - (shader-uniform-set! shader 'sname value) - (uniform-apply shader rest))))))) - -(define-syntax-rule (gpu-prepare shader vertex-array uniforms) - (let ((gpu (current-gpu))) - ;; It's important that the framebuffer is set before setting the - ;; viewport because applying a new viewport will clear the current - ;; framebuffer. - (set-gpu-framebuffer! gpu (current-framebuffer)) - (set-gpu-viewport! gpu (current-viewport)) - (set-gpu-blend-mode! gpu (current-blend-mode)) - (set-gpu-polygon-mode! gpu (current-polygon-mode)) - (set-gpu-cull-face-mode! gpu (current-cull-face-mode)) - (set-gpu-depth-test! gpu (current-depth-test)) - (set-gpu-stencil-test! gpu (current-stencil-test)) - (set-gpu-multisample! gpu (current-multisample)) - (set-gpu-color-mask! gpu (current-color-mask)) - (set-gpu-shader! gpu shader) - (let loop ((i 0)) - (when (< i 32) - (set-gpu-texture! gpu i (current-texture i)) - (loop (1+ i)))) - (uniform-apply shader uniforms) - ;; Sampler2D values aren't explicitly passed as uniform values via - ;; gpu-apply, so we have to bind them to the proper texture units - ;; behind the scenes. - (shader-uniform-for-each - (lambda (uniform) - (when (eq? (uniform-type uniform) sampler-2d) - (set-uniform-value! shader uniform (uniform-value uniform)))) - shader))) - -(define-syntax-rule (gpu-apply* shader vertex-array offset count . uniforms) - (begin - (gpu-prepare shader vertex-array uniforms) - (render-vertices vertex-array #:count count #:offset offset))) - -(define-syntax-rule (gpu-apply shader vertex-array uniforms ...) - (gpu-apply* shader vertex-array 0 #f uniforms ...)) - -(define-syntax-rule (gpu-apply/instanced* shader vertex-array offset count instances . - uniforms) - (begin - (gpu-prepare shader vertex-array uniforms) - (render-vertices/instanced vertex-array instances #:count count #:offset offset))) - -(define-syntax-rule (gpu-apply/instanced shader vertex-array instances - uniforms ...) - (gpu-apply/instanced* shader vertex-array 0 #f instances uniforms ...)) |