diff options
Diffstat (limited to 'chickadee/graphics/color.scm')
-rw-r--r-- | chickadee/graphics/color.scm | 147 |
1 files changed, 127 insertions, 20 deletions
diff --git a/chickadee/graphics/color.scm b/chickadee/graphics/color.scm index ed89082..e30f7b0 100644 --- a/chickadee/graphics/color.scm +++ b/chickadee/graphics/color.scm @@ -1,5 +1,5 @@ ;;; Chickadee Game Toolkit -;;; Copyright © 2016, 2018, 2021 David Thompson <dthompson2@worcester.edu> +;;; Copyright © 2016, 2018, 2021, 2023 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. @@ -21,8 +21,6 @@ (define-module (chickadee graphics color) #:use-module (chickadee data bytestruct) - #:use-module (chickadee graphics engine) - #:use-module (chickadee graphics gl) #:use-module (chickadee math) #:use-module (ice-9 format) #:use-module (ice-9 match) @@ -120,15 +118,51 @@ db32-rain-forest db32-stinger - default-color-mask - null-color-mask - g:color-mask - current-color-mask + %default-clear-color + + <blend-component> + make-blend-component + blend-component? + blend-component-op + blend-component-src-factor + blend-component-dst-factor + + <blend-mode> + make-blend-mode + blend-mode? + blend-mode-color + blend-mode-alpha + + blend:alpha + blend:multiply + blend:subtract + blend:add + blend:lighten + blend:darken + blend:screen + blend:replace + + <color-mask> + make-color-mask color-mask? color-mask-red? color-mask-green? color-mask-blue? - color-mask-alpha?)) + color-mask-alpha? + + <color-target> + make-color-target + color-target? + color-target-format + color-target-blend-mode + color-target-mask + + <color-operation> + make-color-operation + color-operation? + color-operation-clear-color + color-operation-load-op + color-operation-store-op)) (define-byterecord-type <color> (%make-color r g b a) @@ -358,11 +392,74 @@ a color object." (define db32-rain-forest (make-color8 143 151 74)) (define db32-stinger (make-color8 138 111 48)) +(define %default-clear-color (make-color 0.0 0.0 0.0 0.0)) + ;;; -;;; Color Masks +;;; Color target ;;; +(define-record-type <blend-component> + (%make-blend-component op src-factor dst-factor) + blend-component? + (op blend-component-op) + (src-factor blend-component-src-factor) + (dst-factor blend-component-dst-factor)) + +(define* (make-blend-component #:key (op 'add) (src-factor 'one) + (dst-factor 'zero)) + (%make-blend-component op src-factor dst-factor)) + +(define-record-type <blend-mode> + (%make-blend-mode color alpha) + blend-mode? + (color blend-state-color) + (alpha blend-state-alpha)) + +(define* (make-blend-mode color #:optional (alpha color)) + (%make-blend-mode color alpha)) + +(define blend:alpha + (make-blend-mode + (make-blend-component #:op 'add + #:src-factor 'src-alpha + #:dst-factor 'one-minus-src-alpha))) +(define blend:multiply + (make-blend-mode + (make-blend-component #:op 'add + #:src-factor 'dst + #:dst-factor 'zero))) +(define blend:subtract + (make-blend-mode + (make-blend-component #:op 'reverse-subtract + #:src-factor 'one + #:dst-factor 'zero))) +(define blend:add + (make-blend-mode + (make-blend-component #:op 'add + #:src-factor 'one + #:dst-factor 'one))) +(define blend:lighten + (make-blend-mode + (make-blend-component #:op 'max + #:src-factor 'one + #:dst-factor 'zero))) +(define blend:darken + (make-blend-mode + (make-blend-component #:op 'min + #:src-factor 'one + #:dst-factor 'zero))) +(define blend:screen + (make-blend-mode + (make-blend-component #:op 'add + #:src-factor 'one + #:dst-factor 'one-minus-src))) +(define blend:replace + (make-blend-mode + (make-blend-component #:op 'add + #:src-factor 'one + #:dst-factor 'zero))) + (define-record-type <color-mask> (make-color-mask red? green? blue? alpha?) color-mask? @@ -371,16 +468,26 @@ a color object." (blue? color-mask-blue?) (alpha? color-mask-alpha?)) -(define default-color-mask (make-color-mask #t #t #t #t)) -(define null-color-mask (make-color-mask #f #f #f #f)) +(define-record-type <color-target> + (%make-color-target format blend-mode mask) + color-target? + (format color-target-format) + (blend-mode color-target-blend-mode) + (mask color-target-mask)) + +(define* (make-color-target #:key (format 'rgba8) blend-mode + (mask (make-color-mask #t #t #t #t))) + (%make-color-target format blend-mode mask)) -(define (bind-color-mask mask) - (gl-color-mask (color-mask-red? mask) - (color-mask-green? mask) - (color-mask-blue? mask) - (color-mask-alpha? mask))) +(define-record-type <color-operation> + (%make-color-operation clear-color load-op store-op) + color-operation? + (clear-color color-operation-clear-color) + (load-op color-operation-load-op) + (store-op color-operation-store-op)) -(define-graphics-state g:color-mask - current-color-mask - #:default default-color-mask - #:bind bind-color-mask) +(define* (make-color-operation #:key + (clear-color %default-clear-color) + (load-op 'clear) + (store-op 'store)) + (%make-color-operation clear-color load-op store-op)) |