Skip to content

Instantly share code, notes, and snippets.

@inconvergent
Last active December 31, 2021 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inconvergent/9ca554321e4d9dc421244e3467b26f45 to your computer and use it in GitHub Desktop.
Save inconvergent/9ca554321e4d9dc421244e3467b26f45 to your computer and use it in GitHub Desktop.
#!/usr/bin/sbcl --script
;do something similar to
(load "~/quicklisp/setup.lisp")
(ql:quickload :sdl2)
(ql:quickload :cl-opengl)
(defun debug-log (msg &rest args)
"Output and flush MSG to STDOUT with arguments ARGS"
(apply #'format t msg args)
;; Flush to standard out
(finish-output))
(defvar *vs-source*
"#version 330 core
in vec2 c2d;
void main()
{
gl_Position = vec4(c2d.x, c2d.y, 0.0, 1.0);
}")
(defvar *fs-source*
"#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(0.0f, 0.5f, 0.2f, 1.0f);
}")
(defun to-gl-array (seq type &aux (length (length seq))
(arr (gl:alloc-gl-array type length)))
(dotimes (i length)
(setf (gl:glaref arr i) (aref seq i)))
arr)
(defun render (program)
(let* ((buffers (gl:gen-buffers 2))
(vertex-buffer (elt buffers 0))
(arr (to-gl-array #(1.0 1.0 -1.0 -1.0 1.0 -1.0) :float))
(c2d (gl:get-attrib-location program "c2d")))
(gl:clear :color-buffer)
(gl:bind-buffer :array-buffer vertex-buffer)
(gl:buffer-data :array-buffer :static-draw arr)
(gl:vertex-attrib-pointer c2d 2 :float nil 0 (cffi:null-pointer))
(gl:enable-vertex-attrib-array c2d)
(gl:use-program program)
(gl:draw-arrays :triangles 0 3)
(gl:free-gl-array arr)
(gl:disable-vertex-attrib-array c2d)
(gl:flush)))
(defun make-program ()
(let ((vs (gl:create-shader :vertex-shader))
(fs (gl:create-shader :fragment-shader))
(program (gl:create-program)))
(gl:shader-source vs *vs-source*)
(gl:compile-shader vs)
(gl:shader-source fs *fs-source*)
(gl:compile-shader fs)
(debug-log "compile vs: ~D~%" (gl:get-shader-info-log vs))
(debug-log "compile fs: ~D~%" (gl:get-shader-info-log fs))
(gl:attach-shader program vs)
(gl:attach-shader program fs)
(gl:link-program program)
(debug-log "link: ~D~%" (gl:get-program-info-log program))
program))
(defun gl-init ()
(gl:viewport 0 0 800 600)
(gl:load-identity)
(gl:clear-color 1.0 0.5 0.5 1.0))
(defun main ()
"The entry point of our game."
(sdl2:with-init (:everything)
(volume-utils:debug-log "Using SDL library version: ~D.~D.~D~%"
sdl2-ffi:+sdl-major-version+
sdl2-ffi:+sdl-minor-version+
sdl2-ffi:+sdl-patchlevel+)
(sdl2:with-window (win :flags '(:shown :opengl )) ; :resizable
(sdl2:with-gl-context (gl-context win)
(debug-log "Setting up window/gl.~%")
(sdl2:gl-make-current win gl-context)
(gl-init)
(let ((program (make-program)))
(sdl2:with-event-loop (:method :poll)
(:idle ()
(render program)
(sdl2:gl-swap-window win))
(:quit () t)))))))
(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment