wh-engine/wh-engine/render/shader.lisp

44 lines
1.9 KiB
Common Lisp

;;;; wh-engine/render/shader.lisp
;;;; Lisp class for holding & handling shaders.
;; (in-package wh-engine/render)
(defun replace-cross-referenced-vars (forms vars replace-fun)
(loop for elt on forms
for form = (car elt)
if (symbolp form)
do (let ((var-entry (find form vars :key #'car)))
(when var-entry
(rplaca elt (funcall replace-fun var-entry))))
else if (consp form)
do (collect-cross-referenced-vars (cdr form))))
(defun transpile-shader (name &key
version
((:in vert-inputs))
((:inter inter-vars))
((:out frag-outputs))
((:uniform uniform-vars))
((:vert vert-body))
((:frag frag-body)))
"Translate Lisp shader code to GLSL."
(list (collect-shader-vars vert-body)
(collect-shader-vars frag-body)))
(defmacro define-shader (name (&key
((:in (&rest vert-inputs)) ())
((:inter (&rest inter-vars)) ())
((:out (&rest frag-outputs)) ())
((:uniform (&rest uniform-vars)) ()))
&key
((:vert (&body vert-body)))
((:frag (&body frag-body)))
version)
"Define a GLSL shader with Lisp code."
`(defparameter ,name (transpile-shader ',name
:version ,version
:in ',vert-inputs
:inter ',inter-vars
:out ',frag-outputs
:uniform ',uniform-vars
:vert ',vert-body :frag ',frag-body)))