summaryrefslogtreecommitdiff
path: root/chickadee/graphics/depth.scm
blob: 6663b06d4df27f9e32b8925f971173afbbf90e41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
;;; Chickadee Game Toolkit
;;; Copyright © 2020, 2021 David Thompson <dthompson2@worcester.edu>
;;;
;;; 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/>.

(define-module (chickadee graphics depth)
  #:use-module (ice-9 match)
  #:use-module (gl)
  #:use-module (chickadee graphics engine)
  #:use-module (chickadee graphics gl)
  #:use-module (srfi srfi-9)
  #:export (make-depth-test
            depth-test?
            depth-test-write?
            depth-test-function
            depth-test-near
            depth-test-far
            basic-depth-test
            g:depth-test
            current-depth-test))

(define-record-type <depth-test>
  (%make-depth-test write? function near far)
  depth-test?
  (write? depth-test-write?)
  (function depth-test-function)
  (near depth-test-near)
  (far depth-test-far))

(define* (make-depth-test #:key (write? #t) (function 'less-than) (near 0.0) (far 1.0))
  (%make-depth-test write? function near far))

(define basic-depth-test (make-depth-test))

(define (bind-depth-test depth-test)
  (if depth-test
      (let ((glfunc (match (depth-test-function depth-test)
                      ('always (depth-function always))
                      ('never (depth-function never))
                      ('equal (depth-function equal))
                      ('not-equal (depth-function notequal))
                      ('less-than (depth-function less))
                      ('less-than-or-equal (depth-function lequal))
                      ('greater-than (depth-function greater))
                      ('greater-than-or-equal (depth-function gequal)))))
        (gl-enable (enable-cap depth-test))
        (gl-depth-func glfunc)
        (gl-depth-mask (depth-test-write? depth-test))
        (gl-depth-range (depth-test-near depth-test) (depth-test-far depth-test)))
      (gl-disable (enable-cap depth-test))))

(define-graphics-state g:depth-test
  current-depth-test
  #:default #f
  #:bind bind-depth-test)