summaryrefslogtreecommitdiff
path: root/chickadee/graphics/depth.scm
blob: 2c1e901d04ceb6eab9d320a539cc7529ad6928c4 (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
;;; Chickadee Game Toolkit
;;; Copyright © 2020, 2021 David Thompson <dthompson2@worcester.edu>
;;;
;;; Licensed under the Apache License, Version 2.0 (the "License");
;;; you may not use this file except in compliance with the License.
;;; You may obtain a copy of the License at
;;;
;;;    http://www.apache.org/licenses/LICENSE-2.0
;;;
;;; Unless required by applicable law or agreed to in writing, software
;;; distributed under the License is distributed on an "AS IS" BASIS,
;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;;; See the License for the specific language governing permissions and
;;; limitations under the License.

(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)