Make a named block for do-window so you can return-from it.
[cl-glfw.git] / examples / shader.lisp
bloba64756292392b9b2947c1408780beca623d87c69
1 (require '#:asdf)
2 (asdf:oos 'asdf:load-op '#:cl-glfw)
3 (asdf:oos 'asdf:load-op '#:cl-glfw-opengl-version_2_0)
4 (asdf:oos 'asdf:load-op '#:cl-glfw-glu)
6 (defparameter *shader-program* nil)
7 (defparameter *uniform-time* nil)
9 (glfw:do-window (:title "An OpenGL 2.0 Shader Example")
10 ((gl:with-setup-projection
11 (glu:perspective 45 4/3 0.1 50))
12 (setf *shader-program*
13 (gl:make-program
14 (gl:make-shader gl:+vertex-shader+ "
15 varying vec3 colour;
16 void main()
18 colour = gl_Color.rgb;
19 gl_Position = ftransform();
22 (gl:make-shader gl:+fragment-shader+ "
23 uniform float time;
24 varying vec3 colour;
25 const float pi2=2.0*3.14159265;
26 void main()
28 gl_FragColor = vec4(pow(sin(colour.r*pi2*4.0+mod(time*8.0,pi2)),2.0),
29 pow(sin(colour.g*pi2*4.0+mod(time*8.0,pi2)),2.0),
30 pow(sin(colour.b*pi2*4.0+mod(time*8.0,pi2)),2.0),
31 1.0);
33 ")))
34 (gl:use-program *shader-program*)
35 (setf *uniform-time* (gl:get-uniform-location *shader-program* "time")))
36 (gl:clear gl:+color-buffer-bit+)
37 (gl:load-identity)
38 (gl:translate-f 0 0 -5)
39 (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0)
40 (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1)
41 (gl:uniform-1f *uniform-time* (coerce (glfw:get-time) 'single-float))
42 (gl:with-begin gl:+triangles+
43 (gl:color-3f 1 0 0) (gl:vertex-3f 1 0 0)
44 (gl:color-3f 0 1 0) (gl:vertex-3f -1 1 0)
45 (gl:color-3f 0 0 1) (gl:vertex-3f -1 -1 0)))