Skip to content

Commit

Permalink
Minor change to shader pass protocol
Browse files Browse the repository at this point in the history
  • Loading branch information
Shinmera committed Jan 30, 2019
1 parent 7a4e1da commit 4f20800
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 11 deletions.
3 changes: 3 additions & 0 deletions shader-entity.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,9 @@
(defmethod remove-class-shader (type (class symbol))
(remove-class-shader type (find-class class)))

(defmethod effective-shader (type thing)
(getf (effective-shaders thing) type))

(defmethod effective-shader-class ((name symbol))
(effective-shader-class (find-class name)))

Expand Down
19 changes: 10 additions & 9 deletions shader-pass.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@

(defgeneric register-object-for-pass (pass object))
(defgeneric shader-program-for-pass (pass object))
(defgeneric make-pass-shader-program (pass class))
(defgeneric coerce-pass-shader (pass class type spec))
(defgeneric make-pass-shader-program (pass object))
(defgeneric coerce-pass-shader (pass object type))

(defmethod make-pass-shader-program (pass (class symbol))
(make-pass-shader-program pass (find-class class)))
Expand All @@ -87,11 +87,10 @@
(defmethod make-pass-shader-program ((pass shader-pass) (class shader-entity-class))
(let ((shaders ())
(buffers ()))
;; FIXME: What if the pass defines types that the class does not?
(loop for (type spec) on (effective-shaders class) by #'cddr
for inputs = (coerce-pass-shader pass class type spec)
(loop for type in *shader-type-list*
for inputs = (coerce-pass-shader pass class type)
for shader = (make-instance 'shader :source inputs :type type)
do (push shader shaders))
do (when inputs (push shader shaders)))
(loop for asset-spec in (effective-buffers class)
do (push (apply #'asset asset-spec) buffers))
(loop for asset-spec in (effective-buffers pass)
Expand Down Expand Up @@ -180,9 +179,11 @@
(defmethod shader-program-for-pass ((pass per-object-pass) (subject shader-entity))
(gethash (effective-shader-class subject) (assets pass)))

(defmethod coerce-pass-shader ((pass per-object-pass) class type spec)
(glsl-toolkit:merge-shader-sources
(list spec (getf (effective-shaders pass) type))))
(defmethod coerce-pass-shader ((pass per-object-pass) class type)
(let ((sources (remove NIL (list (effective-shader type class)
(effective-shader type pass)))))
(when sources
(glsl-toolkit:merge-shader-sources sources))))

(defmethod register-object-for-pass ((pass per-object-pass) o))

Expand Down
4 changes: 2 additions & 2 deletions shadow-map.lisp
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@
"#version 330 core
void main(){}")

(defmethod coerce-pass-shader ((pass shadow-map-pass) class (type (eql :fragment-shader)) spec)
(getf (effective-shaders pass) type))
(defmethod coerce-pass-shader ((pass shadow-map-pass) class (type (eql :fragment-shader)))
(effective-shader type pass))

(defmethod paint-with ((pass shadow-map-pass) target)
(with-pushed-matrix ((projection-matrix (shadow-projection-matrix pass))
Expand Down

0 comments on commit 4f20800

Please sign in to comment.