Add a starting block for a glsl dsl compiler
This commit is contained in:
parent
906d165556
commit
2c0f5f1904
3 changed files with 67 additions and 1 deletions
25
src/render/shader/compiler.lisp
Normal file
25
src/render/shader/compiler.lisp
Normal file
|
|
@ -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)))
|
||||
38
src/render/shader/glsl.lisp
Normal file
38
src/render/shader/glsl.lisp
Normal file
|
|
@ -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)))
|
||||
5
stoe.asd
5
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")
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue