Add a starting block for a glsl dsl compiler

This commit is contained in:
Renaud Casenave-Péré 2015-03-22 22:40:18 +01:00
parent 906d165556
commit 2c0f5f1904
3 changed files with 67 additions and 1 deletions

View 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)))

View 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)))

View file

@ -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")