Add a package for utilities regarding opengl

Currently supported version
gl centric assert and restart macro
This commit is contained in:
Renaud Casenave-Péré 2014-09-29 17:48:34 +09:00
parent b8579526c0
commit 65d2d5d248
3 changed files with 66 additions and 5 deletions

46
src/render/gl-utils.lisp Normal file
View file

@ -0,0 +1,46 @@
#|
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.render.gl-utils
(:nicknames :gl-utils)
(:use :cl)
(:export :*major-version*
:*minor-version*
:initialize
:version-supported-p
:gl-assert
:gl-restart))
(in-package :stoe.render.gl-utils)
(defvar *major-version* nil)
(defvar *minor-version* nil)
(defun initialize (version)
"Initialize the local opengl configuration.
Store values like the drivers version."
(if (/= version 0)
(progn
(setf *major-version* (mod version 100))
(setf *minor-version* (/ version 100)))
(progn
(setf *major-version* (gl:get-integer :major-version))
(setf *minor-version* (gl:get-integer :minor-version)))))
(defun version-supported-p (version)
(and (>= (mod version 100) *major-version*)
(>= (/ version 100) *minor-version*)))
(defmacro gl-assert (form)
`(prog1
,form
(let ((err-sym (%gl:get-error)))
(unless (eq err-sym :zero)
(error "The OpenGL command `~a'~%~2iresulted in an error: ~s~%" ',form err-sym)))))
(defmacro gl-restart (form)
`(restart-case
(gl-assert ,form)
(continue () :report "Continue")))

View file

@ -18,8 +18,17 @@ Create an opengl context attach to a window."
(format t "Initialize Render module~%") (format t "Initialize Render module~%")
(let ((title (get-command-line-option argv "--title" "Stoe")) (let ((title (get-command-line-option argv "--title" "Stoe"))
(width (get-command-line-option-int argv "--width" 800)) (width (get-command-line-option-int argv "--width" 800))
(height (get-command-line-option-int argv "--height" 600))) (height (get-command-line-option-int argv "--height" 600))
(setf *window* (glop:create-window title width height)))) (version (get-command-line-option-int argv "--opengl")))
(if version
(progn
(gl-utils:initialize version)
(setf *window* (glop:create-window title width height
:major gl-utils:*major-version*
:minor gl-utils:*minor-version*)))
(progn
(setf *window* (glop:create-window title width height))
(gl-utils:initialize 0)))))
(defun finalize () (defun finalize ()
"Finalize the render module. "Finalize the render module.
@ -31,7 +40,9 @@ Destroy the opengl context and the related resources."
(defun update (delta-time) (defun update (delta-time)
"Update the render module. "Update the render module.
Render a frame and swap buffers." Render a frame and swap buffers."
(gl:clear-color 0 0 0 0) (declare (ignore delta-time))
(glop:dispatch-events *window* :blocking nil :on-foo nil)
(gl:clear-color 0.0 0 0 0)
(gl:clear-depth 1.0) (gl:clear-depth 1.0)
(gl:clear :color-buffer-bit :depth-buffer-bit) (gl:clear :color-buffer-bit :depth-buffer-bit)
(glop:swap-buffers *window*)) (glop:swap-buffers *window*))
@ -39,3 +50,6 @@ Render a frame and swap buffers."
(add-hook modules:*initialize-hook* #'initialize) (add-hook modules:*initialize-hook* #'initialize)
(add-hook modules:*finalize-hook* #'finalize) (add-hook modules:*finalize-hook* #'finalize)
(add-hook modules:*update-hook* #'update) (add-hook modules:*update-hook* #'update)
(defmethod glop:on-event (window event)
(declare (ignore window event)))

View file

@ -49,8 +49,9 @@
:depends-on ("jobs")) :depends-on ("jobs"))
(:module "render" (:module "render"
:components :components
((:file "render")) ((:file "gl-utils")
:depends-on ("modules")) (:file "render"))
:depends-on ("modules" "utils"))
(:file "stoe" (:file "stoe"
:depends-on ("utils" "modules"))))) :depends-on ("utils" "modules")))))
:description "SaintOEngine - A 3d engine in common-lisp" :description "SaintOEngine - A 3d engine in common-lisp"