From a40e12b7ffb6d5b8b14a6b8ab8981eb5218d77eb Mon Sep 17 00:00:00 2001 From: William Robinson Date: Wed, 24 Oct 2007 19:03:39 +0100 Subject: [PATCH] Revisited all examples and updated. Added synchronized shader examples. --- examples/gears.lisp | 499 +++++++++++++++------------------- examples/keytest.lisp | 33 +-- examples/listmodes.lisp | 28 +- examples/mipmaps.lisp | 129 ++++----- examples/shader-arb.lisp | 16 +- examples/shader.lisp | 14 +- examples/synchronized-shader-arb.lisp | 28 ++ examples/synchronized-shader.frag | 10 + examples/synchronized-shader.lisp | 24 ++ examples/synchronized-shader.vert | 6 + examples/triangle.lisp | 111 ++++---- examples/vbo.lisp | 18 +- 12 files changed, 451 insertions(+), 465 deletions(-) rewrite examples/gears.lisp (84%) rewrite examples/listmodes.lisp (88%) rewrite examples/mipmaps.lisp (68%) create mode 100644 examples/synchronized-shader-arb.lisp create mode 100644 examples/synchronized-shader.frag create mode 100644 examples/synchronized-shader.lisp create mode 100644 examples/synchronized-shader.vert rewrite examples/triangle.lisp (62%) diff --git a/examples/gears.lisp b/examples/gears.lisp dissimilarity index 84% index 4924dfc..3ffc5a5 100644 --- a/examples/gears.lisp +++ b/examples/gears.lisp @@ -1,279 +1,220 @@ -(require '#:asdf) -(asdf:oos 'asdf:load-op '#:cl-glfw) - -(declaim (optimize (debug 3) (compilation-speed 0) (safety 3))) - -(defparameter *running* t) -(defparameter *t0* 0.0d0) -(defparameter *t* 0) -(defparameter *dt* 0) -(defparameter *frames* 0) -(defparameter *autoexit* 0) -(defparameter *view_rotx* 20.0) -(defparameter *view_roty* 30.0) -(defparameter *view_rotz* 0.0) -(defparameter *gear1* nil) -(defparameter *gear2* nil) -(defparameter *gear3* nil) -(defparameter *angle* 0.0) - -(defconstant +pi+ (coerce pi 'single-float)) - -(declaim (inline sfcos sfsin)) -(defun sfcos (a) - (declare (real a)) - (coerce (cos a) 'single-float)) - -(defun sfsin (a) - (declare (real a)) - (coerce (sin a) 'single-float)) - -(defun gear (inner_radius outer_radius width teeth tooth_depth) - (let ((r0 inner_radius) - (r1 (- outer_radius (/ tooth_depth 2.0))) - (r2 (+ outer_radius (/ tooth_depth 2.0))) - (angle 0.0) - (da (/ (/ (* 2.0 pi) teeth) 4.0))) - (gl:shade-model gl:+flat+) - (gl:normal-3f 0.0 0.0 1.0) - - ;; draw front face - (gl:begin gl:+quad-strip+) - (dotimes (i (1+ teeth)) - (setf angle (/ (* i 2.0 pi) teeth)) - (gl:vertex-3f (* r0 (sfcos angle)) (* r0 (sfsin angle)) (* width 0.5)) - (gl:vertex-3f (* r1 (sfcos angle)) (* r1 (sfsin angle)) (* width 0.5)) - (when (< i teeth) - (gl:vertex-3f (* r0 (sfcos angle)) (* r0 (sfsin angle)) (* width 0.5)) - (gl:vertex-3f (* r1 (sfcos (+ angle (* 3 da)))) (* r1 (sfsin (+ angle (* 3 da)))) (* width 0.5)))) - (gl:end) - - ;; draw front sides of teeth - (gl:begin gl:+quads+) - (dotimes (i teeth) - (setf angle (/ (* i 2.0 pi) teeth)) - (gl:vertex-3f (* r1 (sfcos angle)) (* r1 (sfsin angle)) (* width 0.5)) - (gl:vertex-3f (* r2 (sfcos (+ angle da))) (* r2 (sfsin (+ angle da))) (* width 0.5)) - (gl:vertex-3f (* r2 (sfcos (+ angle (* 2 da)))) (* r2 (sfsin (+ angle (* 2 da)))) (* width 0.5)) - (gl:vertex-3f (* r1 (sfcos (+ angle (* 3 da)))) (* r1 (sfsin (+ angle (* 3 da)))) (* width 0.5))) - (gl:end) - - (gl:normal-3f 0.0 0.0 -1.0) - - ;; draw back face - (gl:begin gl:+quad-strip+) - (dotimes (i (1+ teeth)) - (setf angle (/ (* i 2.0 pi) teeth)) - (gl:vertex-3f (* r1 (sfcos angle)) (* r1 (sfsin angle)) (* (- width) 0.5)) - (gl:vertex-3f (* r0 (sfcos angle)) (* r0 (sfsin angle)) (* (- width) 0.5)) - (when (< i teeth) - (gl:vertex-3f (* r1 (sfcos (+ angle (* 3 da)))) (* r1 (sfsin (+ angle (* 3 da)))) (* (- width) 0.5)) - (gl:vertex-3f (* r0 (sfcos angle)) (* r0 (sfsin angle)) (* (- width) 0.5)))) - (gl:end) - - ;; draw back sides of teeth - (gl:begin gl:+quads+) - (dotimes (i teeth) - (setf angle (/ (* i 2.0 pi) teeth)) - (gl:vertex-3f (* r1 (sfcos (+ angle (* 3 da)))) (* r1 (sfsin (+ angle (* 3 da)))) (* (- width) 0.5)) - (gl:vertex-3f (* r2 (sfcos (+ angle (* 2 da)))) (* r2 (sfsin (+ angle (* 2 da)))) (* (- width) 0.5)) - (gl:vertex-3f (* r2 (sfcos (+ angle da))) (* r2 (sfsin (+ angle da))) (* (- width) 0.5)) - (gl:vertex-3f (* r1 (sfcos angle)) (* r1 (sfsin angle)) (* (- width) 0.5))) - (gl:end) - - ;; draw outward faces of teeth - (gl:begin gl:+quad-strip+) - (dotimes (i teeth) - (setf angle (/ (* i 2.0 pi) teeth)) - (gl:vertex-3f (* r1 (sfcos angle)) (* r1 (sfsin angle)) (* width 0.5)) - (gl:vertex-3f (* r1 (sfcos angle)) (* r1 (sfsin angle)) (* (- width) 0.5)) - (let* ((u (- (* r2 (sfcos (+ angle da))) (* r1 (sfcos angle)))) - (v (- (* r2 (sfsin (+ angle da))) (* r1 (sfsin angle)))) - (len (sqrt (+ (* u u) (* v v))))) - - (setf u (/ u len)) - (setf v (/ v len)) - (gl:normal-3f v (- u) 0.0) - (gl:vertex-3f (* r2 (sfcos (+ angle da))) (* r2 (sfsin (+ angle da))) (* width 0.5)) - (gl:vertex-3f (* r2 (sfcos (+ angle da))) (* r2 (sfsin (+ angle da))) (* (- width) 0.5)) - (gl:normal-3f (sfcos angle) (sfsin angle) 0.0) - (gl:vertex-3f (* r2 (sfcos (+ angle (* 2 da)))) (* r2 (sfsin (+ angle (* 2 da)))) (* width 0.5)) - (gl:vertex-3f (* r2 (sfcos (+ angle (* 2 da)))) (* r2 (sfsin (+ angle (* 2 da)))) (* (- width) 0.5)) - (setf u (- (* r1 (sfcos (+ angle (* 3 da)))) (* r2 (sfcos (+ angle (* 2 da)))))) - (setf v (- (* r1 (sfsin (+ angle (* 3 da)))) (* r2 (sfsin (+ angle (* 2 da)))))) - (gl:normal-3f v (- u) 0.0) - (gl:vertex-3f (* r1 (sfcos (+ angle (* 3 da)))) (* r1 (sfsin (+ angle (* 3 da)))) (* width 0.5)) - (gl:vertex-3f (* r1 (sfcos (+ angle (* 3 da)))) (* r1 (sfsin (+ angle (* 3 da)))) (* (- width) 0.5)) - (gl:normal-3f (sfcos angle) (sfsin angle) 0.0))) - - (gl:vertex-3f (* r1 (sfcos 0)) (* r1 (sfsin 0)) (* width 0.5)) - (gl:vertex-3f (* r1 (sfcos 0)) (* r1 (sfsin 0)) (* (- width) 0.5)) - (gl:end) - - (gl:shade-model gl:+smooth+) - - ;; draw inside radius cylinder */ - (gl:begin gl:+quad-strip+) - (dotimes (i (1+ teeth)) - (setf angle (/ (* i 2.0 pi) teeth)) - (gl:normal-3f (- (sfcos angle)) (- (sfsin angle)) 0.0) - (gl:vertex-3f (* r0 (sfcos angle)) (* r0 (sfsin angle)) (* (- width) 0.5)) - (gl:vertex-3f (* r0 (sfcos angle)) (* r0 (sfsin angle)) (* width 0.5))) - (gl:end))) - - -(defun draw () - (gl:clear (logior gl:+color-buffer-bit+ gl:+depth-buffer-bit+)) - (gl:push-matrix) - (gl:rotate-f *view_rotx* 1.0 0.0 0.0) - (gl:rotate-f *view_roty* 0.0 1.0 0.0) - (gl:rotate-f *view_rotz* 0.0 0.0 1.0) - - (gl:push-matrix) - (gl:translate-f -3.0 -2.0 0.0) - (gl:rotate-f *angle* 0.0 0.0 1.0) - (gl:call-list *gear1*) - (gl:pop-matrix) - - (gl:push-matrix) - (gl:translate-f 3.1 -2.0 0.0) - (gl:rotate-f (- (* -2.0 *angle*) 9.0) 0.0 0.0 1.0) - (gl:call-list *gear2*) - (gl:pop-matrix) - - (gl:push-matrix) - (gl:translate-f -3.1 4.2 0.0) - (gl:rotate-f (- (* -2.0 *angle*) 25.0) 0.0 0.0 1.0) - (gl:call-list *gear3*) - (gl:pop-matrix) - - (gl:pop-matrix) - - (incf *frames*) - - (let ((t_new (glfw:get-time))) - (setf *dt* (- t_new *t*)) - (setf *t* t_new) - (when (>= (- *t* *t0*) 5.0) - (let* ((seconds (- *t* *t0*)) - (fps (/ *frames* seconds))) - (format t "~d frames in ~3$ seconds = ~3$ FPS~%" *frames* seconds fps) - (setf *t0* *t*) - (setf *frames* 0) - (when (and (>= *t* (* 0.999 *autoexit*)) (not (eql *autoexit* 0))) - (setf *running* nil)))))) - - -(defun animate() - (setf *angle* (coerce (+ *angle* (* 100.0 *dt*)) 'single-float))) - -(defmacro with-gl-float-array ((varname &rest contents) &body forms) - `(let ((,varname (cffi:foreign-alloc 'gl:float :initial-contents (list ,@contents)))) - (unwind-protect (progn ,@forms) - (cffi:foreign-free ,varname)))) - -(defmacro with-gl-float-arrays ((&rest name-contents) &body forms) - `(with-gl-float-array ,(first name-contents) - ,@(if (rest name-contents) - `((with-gl-float-arrays ,(rest name-contents) ,@forms)) - forms))) - - -(defun init-gl () - (gl:enable gl:+cull-face+) - (gl:enable gl:+lighting+) - (gl:enable gl:+light0+) - (gl:enable gl:+depth-test+) - - (with-gl-float-arrays ((pos 5.0 5.0 10.0 0.0) - (red 0.8 0.1 0.0 1.0) - (green 0.0 0.8 0.2 1.0) - (blue 0.2 0.2 1.0 1.0)) - (gl:light-fv gl:+light0+ gl:+position+ pos) - - ;; make the gears - (setf *gear1* (gl:gen-lists 1)) - (gl:new-list *gear1* gl:+compile+) ; glNewList(gear1, GL_COMPILE); - (gl:material-fv gl:+front+ gl:+ambient-and-diffuse+ red) ; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); - (gear 1.0 4.0 1.0 20 0.7) ; gear(1.0, 4.0, 1.0, 20, 0.7); - (gl:end-list) ; glEndList(); - - (setf *gear2* (gl:gen-lists 1)) ; gear2 = glGenLists(1); - (gl:new-list *gear2* gl:+compile+) ; glNewList(gear2, GL_COMPILE); - (gl:material-fv gl:+front+ gl:+ambient-and-diffuse+ green) ; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); - (gear 0.5 2.0 2.0 10 0.7) ; gear(0.5, 2.0, 2.0, 10, 0.7); - (gl:end-list) ; glEndList(); - - (setf *gear3* (gl:gen-lists 1)) ; gear3 = glGenLists(1); - (gl:new-list *gear3* gl:+compile+) ; glNewList(gear3, GL_COMPILE); - (gl:material-fv gl:+front+ gl:+ambient-and-diffuse+ blue) ; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); - (gear 1.3 2.0 0.5 10 0.7) ; gear(1.3, 2.0, 0.5, 10, 0.7); - (gl:end-list) ; glEndList(); - ) - - (gl:enable gl:+normalize+) ; glEnable(GL_NORMALIZE); - - ;; did we get -info or -exit? - (dolist (arg (or #+sbcl sb-ext:*posix-argv* - #+lispworks system:*line-arguments-list* - #+cmu extensions:*command-line-words* - nil)) - (cond ((string= arg "-info") - (format t "GL_RENDERER = ~s~%GL_VERSION = ~s~%GL_VENDOR = ~s~%GL_EXTENSIONS = ~s~%" - (gl:get-string gl:+renderer+) - (gl:get-string gl:+version+) - (gl:get-string gl:+vendor+) - (gl:get-string gl:+extensions+))) - ((string= arg "-exit") - (setf *autoexit* 30) - (format t "Auto Exit after ~d seconds.~%" *autoexit*))))) - -(cffi:defcallback key-callback :void ((key :int) (action :int)) - (when (eql action glfw:+press+) - (cond ((eql key (char-code #\Z)) - (if (eql (glfw:get-key glfw:+key-lshift+) glfw:+press+) - (decf *view_rotz* 5.0) - (incf *view_rotz* 5.0))) - ((eql key glfw:+key-esc+) (setf *running* nil)) - ((eql key glfw:+key-up+) (incf *view_rotx* 5.0)) - ((eql key glfw:+key-down+) (decf *view_rotx* 5.0)) - ((eql key glfw:+key-left+) (incf *view_roty* 5.0)) - ((eql key glfw:+key-right+) (decf *view_roty* 5.0))))) - -(cffi:defcallback window-size-callback :void ((width :int) (height :int)) - (let* ((h (/ height width)) - (znear 5.0d0) - (zfar 30.0d0) - (xmax (* znear 0.5d0))) - - (gl:viewport 0 0 width height) - (gl:matrix-mode gl:+projection+) - (gl:load-identity) - (gl:frustum (- xmax) xmax (* (- xmax) h) (* xmax h) znear zfar) - (gl:matrix-mode gl:+modelview+) - (gl:load-identity) - (gl:translate-f 0.0 0.0 -20.0))) - -(glfw:init) -(when (eql (glfw:open-window 300 300 0 0 0 0 16 0 glfw:+window+) 0) - (glfw:terminate) - (error "Could not initialize a window.")) -(glfw:set-window-title "Gears") -(glfw:enable glfw:+key-repeat+) -(glfw:swap-interval 0) - -;; launch OpenGL with our settings -(init-gl) - -(glfw:set-window-size-callback (cffi:callback window-size-callback)) -(glfw:set-key-callback (cffi:callback key-callback)) - -;; program loop -(do () - ((eql *running* nil)) - (draw) - (animate) - (glfw:swap-buffers) - (setf *running* (and *running* (> (glfw:get-window-param glfw:+opened+) 0)))) - -(glfw:terminate) +(require '#:asdf) +(asdf:oos 'asdf:load-op '#:cl-glfw) + +(defparameter *autoexit* 0) +(defparameter *view-rotx* 20) +(defparameter *view-roty* 30) +(defparameter *view-rotz* 0) +(defparameter *gear1* nil) +(defparameter *gear2* nil) +(defparameter *gear3* nil) + +(defun gear (inner-radius outer-radius width teeth tooth-depth) + (let ((r0 inner-radius) + (r1 (- outer-radius (/ tooth-depth 2))) + (r2 (+ outer-radius (/ tooth-depth 2))) + (angle 0) + (da (/ (/ (* 2 pi) teeth) 4))) + (gl:shade-model gl:+flat+) + (gl:normal-3f 0 0 1) + + ;; draw front face + (gl:with-begin gl:+quad-strip+ + (dotimes (i (1+ teeth)) + (setf angle (/ (* i 2 pi) teeth)) + (gl:vertex-3f (* r0 (cos angle)) (* r0 (sin angle)) (* width 0.5)) + (gl:vertex-3f (* r1 (cos angle)) (* r1 (sin angle)) (* width 0.5)) + (when (< i teeth) + (gl:vertex-3f (* r0 (cos angle)) (* r0 (sin angle)) (* width 0.5)) + (gl:vertex-3f (* r1 (cos (+ angle (* 3 da)))) + (* r1 (sin (+ angle (* 3 da)))) + (* width 0.5))))) + + ;; draw front sides of teeth + (gl:with-begin gl:+quads+ + (dotimes (i teeth) + (setf angle (/ (* i 2 pi) teeth)) + (gl:vertex-3f (* r1 (cos angle)) (* r1 (sin angle)) (* width 0.5)) + (gl:vertex-3f (* r2 (cos (+ angle da))) (* r2 (sin (+ angle da))) (* width 0.5)) + (gl:vertex-3f (* r2 (cos (+ angle (* 2 da)))) (* r2 (sin (+ angle (* 2 da)))) (* width 0.5)) + (gl:vertex-3f (* r1 (cos (+ angle (* 3 da)))) (* r1 (sin (+ angle (* 3 da)))) (* width 0.5)))) + + (gl:normal-3f 0 0 -1) + + ;; draw back face + (gl:with-begin gl:+quad-strip+ + (dotimes (i (1+ teeth)) + (setf angle (/ (* i 2 pi) teeth)) + (gl:vertex-3f (* r1 (cos angle)) (* r1 (sin angle)) (* (- width) 0.5)) + (gl:vertex-3f (* r0 (cos angle)) (* r0 (sin angle)) (* (- width) 0.5)) + (when (< i teeth) + (gl:vertex-3f (* r1 (cos (+ angle (* 3 da)))) (* r1 (sin (+ angle (* 3 da)))) (* (- width) 0.5)) + (gl:vertex-3f (* r0 (cos angle)) (* r0 (sin angle)) (* (- width) 0.5))))) + + ;; draw back sides of teeth + (gl:with-begin gl:+quads+ + (dotimes (i teeth) + (setf angle (/ (* i 2 pi) teeth)) + (gl:vertex-3f (* r1 (cos (+ angle (* 3 da)))) (* r1 (sin (+ angle (* 3 da)))) (* (- width) 0.5)) + (gl:vertex-3f (* r2 (cos (+ angle (* 2 da)))) (* r2 (sin (+ angle (* 2 da)))) (* (- width) 0.5)) + (gl:vertex-3f (* r2 (cos (+ angle da))) (* r2 (sin (+ angle da))) (* (- width) 0.5)) + (gl:vertex-3f (* r1 (cos angle)) (* r1 (sin angle)) (* (- width) 0.5)))) + + ;; draw outward faces of teeth + (gl:with-begin gl:+quad-strip+ + (dotimes (i teeth) + (setf angle (/ (* i 2 pi) teeth)) + (gl:vertex-3f (* r1 (cos angle)) (* r1 (sin angle)) (* width 0.5)) + (gl:vertex-3f (* r1 (cos angle)) (* r1 (sin angle)) (* (- width) 0.5)) + (let* ((u (- (* r2 (cos (+ angle da))) (* r1 (cos angle)))) + (v (- (* r2 (sin (+ angle da))) (* r1 (sin angle)))) + (len (sqrt (+ (* u u) (* v v))))) + + (setf u (/ u len)) + (setf v (/ v len)) + (gl:normal-3f v (- u) 0) + (gl:vertex-3f (* r2 (cos (+ angle da))) (* r2 (sin (+ angle da))) (* width 0.5)) + (gl:vertex-3f (* r2 (cos (+ angle da))) (* r2 (sin (+ angle da))) (* (- width) 0.5)) + (gl:normal-3f (cos angle) (sin angle) 0) + (gl:vertex-3f (* r2 (cos (+ angle (* 2 da)))) (* r2 (sin (+ angle (* 2 da)))) (* width 0.5)) + (gl:vertex-3f (* r2 (cos (+ angle (* 2 da)))) (* r2 (sin (+ angle (* 2 da)))) (* (- width) 0.5)) + (setf u (- (* r1 (cos (+ angle (* 3 da)))) (* r2 (cos (+ angle (* 2 da)))))) + (setf v (- (* r1 (sin (+ angle (* 3 da)))) (* r2 (sin (+ angle (* 2 da)))))) + (gl:normal-3f v (- u) 0) + (gl:vertex-3f (* r1 (cos (+ angle (* 3 da)))) (* r1 (sin (+ angle (* 3 da)))) (* width 0.5)) + (gl:vertex-3f (* r1 (cos (+ angle (* 3 da)))) (* r1 (sin (+ angle (* 3 da)))) (* (- width) 0.5)) + (gl:normal-3f (cos angle) (sin angle) 0))) + + (gl:vertex-3f (* r1 (cos 0)) (* r1 (sin 0)) (* width 0.5)) + (gl:vertex-3f (* r1 (cos 0)) (* r1 (sin 0)) (* (- width) 0.5))) + + (gl:shade-model gl:+smooth+) + + ;; draw inside radius cylinder */ + (gl:with-begin gl:+quad-strip+ + (dotimes (i (1+ teeth)) + (setf angle (/ (* i 2 pi) teeth)) + (gl:normal-3f (- (cos angle)) (- (sin angle)) 0) + (gl:vertex-3f (* r0 (cos angle)) (* r0 (sin angle)) (* (- width) 0.5)) + (gl:vertex-3f (* r0 (cos angle)) (* r0 (sin angle)) (* width 0.5)))))) + +(let ((frames 0) + (angle 0) + (t-last-report 0) + (t0 0) + (t1 0)) + + (defun report-fps () + (incf frames) + (setf t0 t1 + t1 (glfw:get-time)) + (when (>= (- t1 t-last-report) 5) + (let* ((seconds (- t1 t-last-report)) + (fps (/ frames seconds))) + (format t "~d frames in ~3$ seconds = ~3$ FPS~%" frames seconds fps)) + (setf t-last-report t1 + frames 0)) + (when (and (not (zerop *autoexit*)) + (>= t1 (* 0.999 *autoexit*))) + (glfw:close-window))) + + (defun draw () + (gl:clear (logior gl:+color-buffer-bit+ gl:+depth-buffer-bit+)) + (gl:with-push-matrix + (gl:rotate-f *view-rotx* 1 0 0) + (gl:rotate-f *view-roty* 0 1 0) + (gl:rotate-f *view-rotz* 0 0 1) + + (gl:with-push-matrix + (gl:translate-f -3 -2 0) + (gl:rotate-f angle 0 0 1) + (gl:call-list *gear1*)) + + (gl:with-push-matrix + (gl:translate-f 3.1 -2 0) + (gl:rotate-f (- (* -2 angle) 9) 0 0 1) + (gl:call-list *gear2*)) + + (gl:with-push-matrix + (gl:translate-f -3.1 4.2 0) + (gl:rotate-f (- (* -2 angle) 25) 0 0 1) + (gl:call-list *gear3*))) + (report-fps)) + + + (defun animate() + (setf angle (coerce (+ angle (* 100 (- t1 t0))) 'single-float)))) + +(defun init-gl () + (gl:enable gl:+cull-face+) + (gl:enable gl:+lighting+) + (gl:enable gl:+light0+) + (gl:enable gl:+depth-test+) + + (gl:light-fv gl:+light0+ gl:+position+ #(5.0 5.0 10.0 0.0)) + + ;; make the gears + (gl:with-new-list (setf *gear1* (gl:gen-lists 1)) gl:+compile+ + (gl:material-fv gl:+front+ gl:+ambient-and-diffuse+ #(0.8 0.1 0.0 1.0)) + (gear 1 4 1 20 0.7)) + + (gl:with-new-list (setf *gear2* (gl:gen-lists 1)) gl:+compile+ + (gl:material-fv gl:+front+ gl:+ambient-and-diffuse+ #(0.0 0.8 0.2 1.0)) + (gear 0.5 2 2 10 0.7)) + + (gl:with-new-list (setf *gear3* (gl:gen-lists 1)) gl:+compile+ + (gl:material-fv gl:+front+ gl:+ambient-and-diffuse+ #(0.2 0.2 1.0 1.0)) + (gear 1.3 2 0.5 10 0.7)) + + (gl:enable gl:+normalize+) + + ;; did we get -info or -exit? + (dolist (arg (or #+sbcl sb-ext:*posix-argv* + #+lispworks system:*line-arguments-list* + #+cmu extensions:*command-line-words* + nil)) + (cond ((string= arg "-info") + (format t "GL_RENDERER = ~s~%GL_VERSION = ~s~%GL_VENDOR = ~s~%GL_EXTENSIONS = ~s~%" + (gl:get-string gl:+renderer+) + (gl:get-string gl:+version+) + (gl:get-string gl:+vendor+) + (gl:get-string gl:+extensions+))) + ((string= arg "-exit") + (setf *autoexit* 30) + (format t "Auto Exit after ~d seconds.~%" *autoexit*))))) + +(cffi:defcallback key-callback :void ((key :int) (action :int)) + (when (eql action glfw:+press+) + (cond ((eql key (char-code #\Z)) + (if (eql (glfw:get-key glfw:+key-lshift+) glfw:+press+) + (decf *view-rotz* 5) + (incf *view-rotz* 5))) + ((eql key glfw:+key-esc+) (glfw:close-window)) + ((eql key glfw:+key-up+) (incf *view-rotx* 5)) + ((eql key glfw:+key-down+) (decf *view-rotx* 5)) + ((eql key glfw:+key-left+) (incf *view-roty* 5)) + ((eql key glfw:+key-right+) (decf *view-roty* 5))))) + +(cffi:defcallback window-size-callback :void ((width :int) (height :int)) + (let* ((h (/ height width)) + (znear 5) + (zfar 30) + (xmax (* znear 0.5))) + + (gl:viewport 0 0 width height) + (gl:with-setup-projection + (gl:frustum (- xmax) xmax (* (- xmax) h) (* xmax h) znear zfar)) + + (gl:load-identity) + (gl:translate-f 0 0 -20))) + +;; program loop +(glfw:do-window ("Gears" 300 300 0 0 0 0 16 0 glfw:+window+) + ((glfw:enable glfw:+key-repeat+) + (glfw:swap-interval 0) + (init-gl) + (glfw:set-window-size-callback (cffi:callback window-size-callback)) + (glfw:set-key-callback (cffi:callback key-callback))) + (draw) + (animate) + (glfw:swap-buffers)) diff --git a/examples/keytest.lisp b/examples/keytest.lisp index 50ec3a2..fcab3a6 100644 --- a/examples/keytest.lisp +++ b/examples/keytest.lisp @@ -1,7 +1,6 @@ (require '#:asdf) (asdf:oos 'asdf:load-op '#:cl-glfw) -(defparameter *running* t) (defparameter *key-repeat* nil) (defparameter *system-keys* t) @@ -27,7 +26,7 @@ ((eql key glfw:+key-esc+) (format t "ESC => quit program~%") - (setf *running* nil)) + (glfw:close-window)) ((eql key (char-code #\R)) (setf *key-repeat* (not *key-repeat*)) @@ -54,27 +53,13 @@ (fresh-line))) (force-output)) -(defun main () - (unless (glfw:open-window 250 100 0 0 0 0 0 0 glfw:+window+) - (return-from main)) +(glfw:do-window ("Press some keys!" 250 100) + ((glfw:set-key-callback (cffi:callback keyfun))) - (glfw:set-key-callback (cffi:callback keyfun)) - (glfw:set-window-title "Press some keys!") - - (do ((*running* t (and *running* (not (zerop (glfw:get-window-param glfw:+opened+))))) - (t1 (glfw:get-time) (glfw:get-time))) - ((not *running*)) + (destructuring-bind (width height) (glfw:get-window-size) + (gl:viewport 0 0 width height)) - (destructuring-bind (width height) (glfw:get-window-size) - (gl:viewport 0 0 width height)) - - (gl:clear-color (coerce (+ 0.5 (* 0.5 (sin (* 3.0 t1)))) - 'single-float) - 0.0 0.0 0.0) - (gl:clear gl:+color-buffer-bit+) - - (glfw:swap-buffers))) - -(glfw:init) -(main) -(glfw:terminate) + (gl:clear-color (coerce (+ 0.5 (* 0.5 (sin (* 3.0 (glfw:get-time))))) + 'single-float) + 0.0 0.0 0.0) + (gl:clear gl:+color-buffer-bit+)) \ No newline at end of file diff --git a/examples/listmodes.lisp b/examples/listmodes.lisp dissimilarity index 88% index 8bd3bb2..ee758e9 100644 --- a/examples/listmodes.lisp +++ b/examples/listmodes.lisp @@ -1,15 +1,13 @@ -(require '#:asdf) -(asdf:oos 'asdf:load-op '#:cl-glfw) - -(glfw:init) - -(destructuring-bind (width height redbits greenbits bluebits) (glfw:get-desktop-mode) - (format t "Desktop mode: ~d x ~d x ~d~%" width height (+ redbits greenbits bluebits))) - -(format t "Available modes:~%") -(loop for i from 0 - for mode in (glfw:get-video-modes 400) - do (destructuring-bind (width height redbits greenbits bluebits) mode - (format t "~3d: ~d x ~d x ~d~%" i width height (+ redbits greenbits bluebits)))) - -(glfw:terminate) +(require '#:asdf) +(asdf:oos 'asdf:load-op '#:cl-glfw) + +(glfw:with-init + (destructuring-bind (width height redbits greenbits bluebits) (glfw:get-desktop-mode) + (format t "Desktop mode: ~d x ~d x ~d~%" width height (+ redbits greenbits bluebits))) + + (format t "Available modes:~%") + (loop for i from 0 + for mode in (glfw:get-video-modes 400) + do (destructuring-bind (width height redbits greenbits bluebits) mode + (format t "~3d: ~d x ~d x ~d~%" i width height (+ redbits greenbits bluebits))))) + diff --git a/examples/mipmaps.lisp b/examples/mipmaps.lisp dissimilarity index 68% index ab91704..5edf4a3 100644 --- a/examples/mipmaps.lisp +++ b/examples/mipmaps.lisp @@ -1,69 +1,60 @@ -(require '#:asdf) -(asdf:oos 'asdf:load-op '#:cl-glfw) - - -(defun main () - (unless (glfw:open-window 640 480 0 0 0 0 0 0 glfw:+window+) - (return-from main)) - - (glfw:enable glfw:+sticky-keys+) - (glfw:swap-interval 0) - - (unless (glfw:load-texture-2d (namestring (merge-pathnames "mipmaps.tga" (or *load-pathname* #P"examples/"))) - glfw:+build-mipmaps-bit+) - (return-from main)) - - (gl:tex-parameter-i gl:+texture-2d+ gl:+texture-min-filter+ gl:+linear-mipmap-linear+) - (gl:tex-parameter-i gl:+texture-2d+ gl:+texture-mag-filter+ gl:+linear+) - - (gl:enable gl:+texture-2d+) - - (do ((running t (and (zerop (glfw:get-key glfw:+key-esc+)) - (not (zerop (glfw:get-window-param glfw:+opened+))))) - (frames 0) - (t0 (glfw:get-time)) - (t1 (glfw:get-time) (glfw:get-time))) - ((not running)) - - (when (or (> (- t1 t0) 1.0) - (= frames 0)) - (glfw:set-window-title (format nil "Spinning Triangle (~,1f FPS)" (/ frames (- t1 t0)))) - (setf frames 0) - (setf t0 t1)) - - (incf frames) - - (gl:clear-color 0.0 0.0 0.0 0.0) - (gl:clear gl:+color-buffer-bit+) - - (destructuring-bind (width height) (glfw:get-window-size) - (setf height (max height 1)) - (gl:viewport 0 0 width height) - - (gl:matrix-mode gl:+projection+) - (gl:load-identity) - (glu:perspective 65.0d0 (coerce (/ width height) 'double-float) 1.0d0 50.0d0) - (gl:matrix-mode gl:+modelview+) - (gl:load-identity) - (glu:look-at 0.0d0 3.0d0 -20.0d0 - 0.0d0 -4.0d0 -11.0d0 - 0.0d0 1.0d0 0.0d0)) - - (destructuring-bind (x y) (glfw:get-mouse-pos) - (declare (ignore y)) - (gl:rotate-f (coerce (+ (* x 0.05) - (* t1 5.0)) - 'single-float) - 0.0 1.0 0.0)) - - (gl:begin gl:+quads+) - (gl:tex-coord-2f -20.0 20.0) (gl:vertex-3f -50.0 0.0 -50.0) - (gl:tex-coord-2f 20.0 20.0) (gl:vertex-3f 50.0 0.0 -50.0) - (gl:tex-coord-2f 20.0 -20.0) (gl:vertex-3f 50.0 0.0 50.0) - (gl:tex-coord-2f -20.0 -20.0) (gl:vertex-3f -50.0 0.0 50.0) - (gl:end) - (glfw:swap-buffers))) - -(glfw:init) -(main) -(glfw:terminate) +(require '#:asdf) +(asdf:oos 'asdf:load-op '#:cl-glfw) + +(let ((frames 0) + t0 + t1) + (glfw:do-window ("Spinning Triangle" 640 480) + ((glfw:enable glfw:+sticky-keys+) + (glfw:swap-interval 0) + + (unless (glfw:load-texture-2d (namestring (merge-pathnames "mipmaps.tga" (or *load-pathname* #P"examples/"))) + glfw:+build-mipmaps-bit+) + (error "Unable to load texture!")) + + (gl:tex-parameter-i gl:+texture-2d+ gl:+texture-min-filter+ gl:+linear-mipmap-linear+) + (gl:tex-parameter-i gl:+texture-2d+ gl:+texture-mag-filter+ gl:+linear+) + + (gl:enable gl:+texture-2d+) + (setf t1 (glfw:get-time) + t0 t1)) + + (unless (zerop (glfw:get-key glfw:+key-esc+)) + (return-from glfw:do-window)) + + (setf t1 (glfw:get-time)) + + (when (or (> (- t1 t0) 1.0) + (zerop frames)) + (glfw:set-window-title (format nil "Spinning Triangle (~,1f FPS)" (/ frames (- t1 t0)))) + (setf frames 0) + (setf t0 t1)) + + (incf frames) + + (gl:clear-color 0.0 0.0 0.0 0.0) + (gl:clear gl:+color-buffer-bit+) + + (destructuring-bind (width height) (glfw:get-window-size) + (setf height (max height 1)) + (gl:viewport 0 0 width height) + + (gl:with-setup-projection + (glu:perspective 65.0d0 (coerce (/ width height) 'double-float) 1.0d0 50.0d0)) + (gl:load-identity) + (glu:look-at 0.0d0 3.0d0 -20.0d0 + 0.0d0 -4.0d0 -11.0d0 + 0.0d0 1.0d0 0.0d0)) + + + (destructuring-bind (x y) (glfw:get-mouse-pos) + (declare (ignore y)) + (gl:rotate-f (+ (* x 0.05) + (* t1 5.0)) + 0 1 0)) + + (gl:with-begin gl:+quads+ + (gl:tex-coord-2f -20.0 20.0) (gl:vertex-3f -50.0 0.0 -50.0) + (gl:tex-coord-2f 20.0 20.0) (gl:vertex-3f 50.0 0.0 -50.0) + (gl:tex-coord-2f 20.0 -20.0) (gl:vertex-3f 50.0 0.0 50.0) + (gl:tex-coord-2f -20.0 -20.0) (gl:vertex-3f -50.0 0.0 50.0)))) diff --git a/examples/shader-arb.lisp b/examples/shader-arb.lisp index ae49777..d48c7fc 100644 --- a/examples/shader-arb.lisp +++ b/examples/shader-arb.lisp @@ -6,7 +6,7 @@ (glfw:do-window ("An ARB Extension Shader Example") ((gl:with-setup-projection - (glu:perspective 45.0d0 (/ 4.0d0 3.0d0) 0.1d0 50.0d0)) + (glu:perspective 45 4/3 0.1 50)) (when (and (gl-ext:load-extension "ARB_shader_objects") (gl-ext:load-extension "ARB_vertex_shader") (gl-ext:load-extension "ARB_fragment_shader")) @@ -36,11 +36,11 @@ void main() (setf *uniform-time* (gl:get-uniform-location-arb *shader-program* "time"))) (gl:clear gl:+color-buffer-bit+) (gl:load-identity) - (gl:translate-f 0.0 0.0 -5.0) - (gl:rotate-d (* 10.0d0 (glfw:get-time)) 1d0 1d0 0d0) - (gl:rotate-d (* 90.0d0 (glfw:get-time)) 0d0 0d0 1d0) - (gl:uniform-1f-arb *uniform-time* (coerce (glfw:get-time) 'single-float)) + (gl:translate-f 0 0 -5) + (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0) + (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1) + (gl:uniform-1f-arb *uniform-time* (glfw:get-time)) (gl:with-begin gl:+triangles+ - (gl:color-3f 1.0 0.0 0.0) (gl:vertex-3f 1.0 0.0 0.0) - (gl:color-3f 0.0 1.0 0.0) (gl:vertex-3f -1.0 1.0 0.0) - (gl:color-3f 0.0 0.0 1.0) (gl:vertex-3f -1.0 -1.0 0.0))) \ No newline at end of file + (gl:color-3f 1 0 0) (gl:vertex-3f 1 0 0) + (gl:color-3f 0 1 0) (gl:vertex-3f -1 1 0) + (gl:color-3f 0 0 1) (gl:vertex-3f -1 -1 0))) \ No newline at end of file diff --git a/examples/shader.lisp b/examples/shader.lisp index 464e855..5ad5693 100644 --- a/examples/shader.lisp +++ b/examples/shader.lisp @@ -6,7 +6,7 @@ (glfw:do-window ("An OpenGL 2.0 Shader Example") ((gl:with-setup-projection - (glu:perspective 45.0d0 (/ 4.0d0 3.0d0) 0.1d0 50.0d0)) + (glu:perspective 45 4/3 0.1 50)) (setf *shader-program* (gl:make-program (gl:make-shader gl:+vertex-shader+ " @@ -33,11 +33,11 @@ void main() (setf *uniform-time* (gl:get-uniform-location *shader-program* "time"))) (gl:clear gl:+color-buffer-bit+) (gl:load-identity) - (gl:translate-f 0.0 0.0 -5.0) - (gl:rotate-d (* 10.0d0 (glfw:get-time)) 1d0 1d0 0d0) - (gl:rotate-d (* 90.0d0 (glfw:get-time)) 0d0 0d0 1d0) + (gl:translate-f 0 0 -5) + (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0) + (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1) (gl:uniform-1f *uniform-time* (coerce (glfw:get-time) 'single-float)) (gl:with-begin gl:+triangles+ - (gl:color-3f 1.0 0.0 0.0) (gl:vertex-3f 1.0 0.0 0.0) - (gl:color-3f 0.0 1.0 0.0) (gl:vertex-3f -1.0 1.0 0.0) - (gl:color-3f 0.0 0.0 1.0) (gl:vertex-3f -1.0 -1.0 0.0))) \ No newline at end of file + (gl:color-3f 1 0 0) (gl:vertex-3f 1 0 0) + (gl:color-3f 0 1 0) (gl:vertex-3f -1 1 0) + (gl:color-3f 0 0 1) (gl:vertex-3f -1 -1 0))) \ No newline at end of file diff --git a/examples/synchronized-shader-arb.lisp b/examples/synchronized-shader-arb.lisp new file mode 100644 index 0000000..b7b978d --- /dev/null +++ b/examples/synchronized-shader-arb.lisp @@ -0,0 +1,28 @@ +(require '#:asdf) +(asdf:oos 'asdf:load-op '#:cl-glfw-opengl-version_1_1) + +(declaim (optimize (debug 3))) + +;; This example uses the gl:synchronizing-program-arb mechanism to reload+recompile+relink shader files on-file-change + +(glfw:do-window ("An ARB Synchronized Shader Example") + ((gl:with-setup-projection + (glu:perspective 45 4/3 0.1 50)) + (unless (and (gl-ext:load-extension "ARB_shader_objects") + (gl-ext:load-extension "ARB_vertex_shader") + (gl-ext:load-extension "ARB_fragment_shader")) + (error "I need ARB_vertex_shader and ARB_fragment_shader for this example. Sorry :("))) + (gl:clear gl:+color-buffer-bit+) + (gl:load-identity) + (gl:translate-f 0 0 -5) + (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0) + (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1) + (let ((program (gl:synchronizing-program-arb 'synchronized-shader + (list gl:+vertex-shader-arb+ (merge-pathnames "synchronized-shader.vert" *load-truename*)) + (list gl:+fragment-shader-arb+ (merge-pathnames "synchronized-shader.frag" *load-truename*))))) + (gl:with-use-program-arb program + (gl:uniform-1f-arb (gl:get-uniform-location-arb program "time") (glfw:get-time)) + (gl:with-begin gl:+triangles+ + (gl:color-3f 1 0 0) (gl:vertex-3f 1 0 0) + (gl:color-3f 0 1 0) (gl:vertex-3f -1 1 0) + (gl:color-3f 0 0 1) (gl:vertex-3f -1 -1 0))))) \ No newline at end of file diff --git a/examples/synchronized-shader.frag b/examples/synchronized-shader.frag new file mode 100644 index 0000000..887de13 --- /dev/null +++ b/examples/synchronized-shader.frag @@ -0,0 +1,10 @@ +uniform float time; +varying vec3 colour; +const float pi2=2.0*3.14159265; +void main() +{ + gl_FragColor = vec4(pow(sin(colour.r*pi2*4.0+mod(time*8.0,pi2)),2.0), + pow(sin(colour.g*pi2*4.0+mod(time*8.0,pi2)),2.0), + pow(sin(colour.b*pi2*4.0+mod(time*8.0,pi2)),2.0), + 1.0); +} diff --git a/examples/synchronized-shader.lisp b/examples/synchronized-shader.lisp new file mode 100644 index 0000000..7a66c65 --- /dev/null +++ b/examples/synchronized-shader.lisp @@ -0,0 +1,24 @@ +(require '#:asdf) +(asdf:oos 'asdf:load-op '#:cl-glfw-opengl-version_2_0) + +(declaim (optimize (debug 3))) + +;; This example uses the gl:synchronizing-program mechanism to reload+recompile+relink shader files on-file-change + +(glfw:do-window ("An OpenGL 2.0 Synchronized Shader Example") + ((gl:with-setup-projection + (glu:perspective 45 4/3 0.1 50))) + (gl:clear gl:+color-buffer-bit+) + (gl:load-identity) + (gl:translate-f 0 0 -5) + (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0) + (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1) + (let ((program (gl:synchronizing-program 'synchronized-shader + (list gl:+vertex-shader+ (merge-pathnames "synchronized-shader.vert" *load-truename*)) + (list gl:+fragment-shader+ (merge-pathnames "synchronized-shader.frag" *load-truename*))))) + (gl:with-use-program program + (gl:uniform-1f (gl:get-uniform-location program "time") (glfw:get-time)) + (gl:with-begin gl:+triangles+ + (gl:color-3f 1 0 0) (gl:vertex-3f 1 0 0) + (gl:color-3f 0 1 0) (gl:vertex-3f -1 1 0) + (gl:color-3f 0 0 1) (gl:vertex-3f -1 -1 0))))) \ No newline at end of file diff --git a/examples/synchronized-shader.vert b/examples/synchronized-shader.vert new file mode 100644 index 0000000..81a5e4d --- /dev/null +++ b/examples/synchronized-shader.vert @@ -0,0 +1,6 @@ +varying vec3 colour; +void main() +{ + colour = gl_Color.rgb; + gl_Position = ftransform(); +} diff --git a/examples/triangle.lisp b/examples/triangle.lisp dissimilarity index 62% index 9fdddb9..18b09cc 100644 --- a/examples/triangle.lisp +++ b/examples/triangle.lisp @@ -1,57 +1,54 @@ -(require '#:asdf) -(asdf:oos 'asdf:load-op '#:cl-glfw) - -(glfw:init) - -(when (glfw:open-window 640 480 0 0 0 0 0 0 glfw:+window+) - (glfw:enable glfw:+sticky-keys+) - (glfw:swap-interval 0) - - (do ((running t (and (zerop (glfw:get-key glfw:+key-esc+)) - (not (zerop (glfw:get-window-param glfw:+opened+))))) - (frames 0) - (t0 (glfw:get-time)) - (t1 (glfw:get-time) (glfw:get-time))) - ((not running)) - (when (or (> (- t1 t0) 1.0) - (= frames 0)) - (glfw:set-window-title (format nil "Spinning Triangle (~,1f FPS)" (/ frames (- t1 t0)))) - (setf frames 0) - (setf t0 t1)) - (incf frames) - - - (destructuring-bind (width height) (glfw:get-window-size) - (setf height (max height 1)) - (gl:viewport 0 0 width height) - - (gl:clear-color 0.0 0.0 0.0 0.0) - (gl:clear gl:+color-buffer-bit+) - - (gl:matrix-mode gl:+projection+) - (gl:load-identity) - (glu:perspective 65.0d0 (coerce (/ width height) 'double-float) 1.0d0 100.0d0) - (gl:matrix-mode gl:+modelview+) - (gl:load-identity) - (glu:look-at 0.0d0 1.0d0 0.0d0 - 0.0d0 20.0d0 0.0d0 - 0.0d0 0.0d0 1.0d0) - - (gl:translate-f 0.0 14.0 0.0) - - - (destructuring-bind (x y) (glfw:get-mouse-pos) - (declare (ignore y)) - (gl:rotate-f (coerce (+ (* x 0.3) - (* t1 100.0)) - 'single-float) - 0.0 0.0 1.0)) - - (gl:begin gl:+triangles+) - (gl:color-3f 1.0 0.0 0.0) (gl:vertex-3f -5.0 0.0 -4.0) - (gl:color-3f 0.0 1.0 0.0) (gl:vertex-3f 5.0 0.0 -4.0) - (gl:color-3f 0.0 0.0 1.0) (gl:vertex-3f 0.0 0.0 6.0) - (gl:end) - (glfw:swap-buffers)))) - -(glfw:terminate) +(require '#:asdf) +(asdf:oos 'asdf:load-op '#:cl-glfw) + + +(let ((frames 0) + t0 t1) + (glfw:do-window ("Spinning Triangle" 640 480) + ((glfw:enable glfw:+sticky-keys+) + (glfw:swap-interval 0) + (setf t0 (glfw:get-time) + t1 (glfw:get-time))) + + (when (eql (glfw:get-key glfw:+key-esc+) glfw:+press+) + (return-from glfw:do-window)) + + (setf t1 (glfw:get-time)) + + (when (or (> (- t1 t0) 1) + (= frames 0)) + (glfw:set-window-title (format nil "Spinning Triangle (~,1f FPS)" (/ frames (- t1 t0)))) + (setf frames 0 + t0 t1)) + + (incf frames) + + (destructuring-bind (width height) (glfw:get-window-size) + (setf height (max height 1)) + (gl:viewport 0 0 width height) + + (gl:clear-color 0 0 0 0) + (gl:clear gl:+color-buffer-bit+) + + (gl:matrix-mode gl:+projection+) + (gl:load-identity) + (glu:perspective 65 (/ width height) 1 100) + (gl:matrix-mode gl:+modelview+) + (gl:load-identity) + (glu:look-at 0 1 0 + 0 20 0 + 0 0 1) + + (gl:translate-f 0 14 0) + + + (destructuring-bind (x y) (glfw:get-mouse-pos) + (declare (ignore y)) + (gl:rotate-f (+ (* x 0.3) + (* t1 100)) + 0 0 1)) + + (gl:with-begin gl:+triangles+ + (gl:color-3f 1 0 0) (gl:vertex-3f -5 0 -4) + (gl:color-3f 0 1 0) (gl:vertex-3f 5 0 -4) + (gl:color-3f 0 0 1) (gl:vertex-3f 0 0 6))))) diff --git a/examples/vbo.lisp b/examples/vbo.lisp index 8c393f2..e75ce73 100644 --- a/examples/vbo.lisp +++ b/examples/vbo.lisp @@ -75,7 +75,7 @@ (defparameter *triangle-indices-length* (length *triangle-indices*)) (defparameter *vertices-array-length* (length *vertices-array*)) -(defparameter *t0* 0.0d0) +(defparameter *t0* 0.0) (defparameter *frames* 0) (cffi:defcallback key-press :void ((key :int) (action :int)) @@ -95,11 +95,17 @@ (glfw:do-window ("A VBO Example" 0 0 0 0 0 0 16) ((gl:enable gl:+depth-test+) (gl:depth-func gl:+less+) + (gl:enable gl:+light0+) + (gl:enable gl:+lighting+) + + (gl:light-fv gl:+light0+ gl:+position+ #(1.0 1.0 1.0 0.0)) + (gl:color-material gl:+front+ gl:+ambient-and-diffuse+) + (gl:enable gl:+color-material+) (glfw:set-key-callback (cffi:callback key-press)) (gl:with-setup-projection - (glu:perspective 45.0d0 (/ 4.0d0 3.0d0) 0.125d0 8.0d0)) + (glu:perspective 45 4/3 0.125 8)) (when (setf *use-vbo* (and t (gl-ext:load-extension "ARB_vertex_buffer_object"))) (let ((buffers (make-array 4))) @@ -138,15 +144,15 @@ (setf *t0* (glfw:get-time))) (let ((t1 (glfw:get-time))) - (when (> (- t1 *t0*) 1.0) + (when (> (- t1 *t0*) 1) (glfw:set-window-title (format nil "~4f FPS, VBO: ~a~%" (/ *frames* (- t1 *t0*)) (if *use-vbo* "on" "off"))) (setf *t0* t1 *frames* 0))) (gl:clear (logior gl:+color-buffer-bit+ gl:+depth-buffer-bit+)) (gl:load-identity) - (gl:translate-f 0.0 0.0 -5.0) - (gl:rotate-d (* 10.0d0 (glfw:get-time)) 1d0 1d0 0d0) - (gl:rotate-d (* 90.0d0 (glfw:get-time)) 0d0 0d0 1d0) + (gl:translate-f 0 0 -5) + (gl:rotate-d (* 10 (glfw:get-time)) 1 1 0) + (gl:rotate-d (* 90 (glfw:get-time)) 0 0 1) (gl:with-push-client-attrib (gl:+client-vertex-array-bit+) (gl:enable-client-state gl:+color-array+) (gl:enable-client-state gl:+vertex-array+) -- 2.11.4.GIT