diff --git a/src/render/shader/compiler.lisp b/src/render/shader/compiler.lisp new file mode 100644 index 0000000..877279e --- /dev/null +++ b/src/render/shader/compiler.lisp @@ -0,0 +1,25 @@ +#| + This file is a part of stoe project. + Copyright (c) 2014 Renaud Casenave-Péré (renaud@casenave-pere.fr) +|# + +(in-package :cl-user) +(defpackage stoe.shader.compiler + (:use :cl :utils) + (:nicknames :compiler) + (:import-from :stoe.shader.glsl + :glsl-compile) + (:export :defshader)) +(in-package :stoe.shader.compiler) + +(defun %defshader (lambda-list body) + (let ((shader (glsl-compile (cons 'newshader (cons lambda-list body))))) + shader)) + +(defmacro defshader (name lambda-list &body body) + "Define a shader defining function. +The newly created shader will be put in a special package: `%stoe.shaders'." + (let ((symbol (intern (symbol-name name) :%stoe.shaders))) + `(progn + (set ',symbol (%defshader ',lambda-list ',body)) + ',symbol))) diff --git a/src/render/shader/glsl.lisp b/src/render/shader/glsl.lisp new file mode 100644 index 0000000..a2b28e5 --- /dev/null +++ b/src/render/shader/glsl.lisp @@ -0,0 +1,38 @@ +#| + This file is a part of stoe project. + Copyright (c) 2014 Renaud Casenave-Péré (renaud@casenave-pere.fr) +|# + +(in-package :cl-user) +(defpackage stoe.shader.glsl + (:use :cl :utils) + (:nicknames :glsl) + (:import-from :stoe.shader.walker + :defhandler + :walk + :walk-list + :walk-1) + (:export :compile)) +(in-package :stoe.shader.glsl) + +(defvar *form-handlers* (make-hash-table) + "Hash table for the form handlers for a glsl dsl.") + +(defvar *current-indent* 0 + "Keep the number of space needed for the next directive.") + +(defhandler newshader (newshader lambda-list &rest body) + (walk-list body)) + +(defun default-handler (first &rest rest) + "Handle a simple function call." + (format nil "~@[~vt~]~(~a~) (~{~a~^, ~});~%" + (when (> *current-indent* 0) + *current-indent*) + (if (symbolp first) + first + (walk-1 first)) (walk-list rest))) + +(defun glsl-compile (form) + (let ((*current-indent* 0)) + (walk form *form-handlers* #'default-handler))) diff --git a/stoe.asd b/stoe.asd index 340880e..4635d26 100644 --- a/stoe.asd +++ b/stoe.asd @@ -59,7 +59,10 @@ ((:file "gl-utils") (:module "shader" :components - ((:file "glsl-compiler") + ((:file "walker") + (:file "glsl") + (:file "compiler") + (:file "glsl-compiler") (:file "shader"))) (:file "mesh") (:file "render")