Content of Vertex.txt
Content of Fragment.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | (ql:quickload :cffi)
(ql:quickload :cl-opengl)
(ql:quickload :glop)
(ql:quickload :cl-jpeg)
(ql:quickload :3d-math)
(ql:quickload :pngload)
(ql:quickload :static-vectors)
(use-package :org.shirakumo.fraf.math)
(defun loadfile (filepath&name &optional (return-as 'vector))
(let (lengthy charseq)
(setf filepath&name (checkpath filepath&name))
(with-open-file (filestream filepath&name :if-does-not-exist nil)
(setf lengthy (file-length filestream))
(when (null lengthy)
(format t "Cannot determine length of file! :O :'(~%")
(return-from loadfile))
(setf charseq (make-array lengthy))
(read-sequence charseq filestream)
(if (equalp return-as 'vector)
(return-from loadfile charseq)
(return-from loadfile (coerce charseq return-as))))))
(defun degrees->radians (degrees)
(* degrees (/ pi 180.0)))
(defun fill-cffi-array (listy cffi-array type)
(let ((count 0))
(dolist (each-item listy)
(setf (cffi:mem-aref cffi-array type count) each-item)
(incf count))))
(defun build-shader (shader source)
(gl:shader-source shader source)
(gl:compile-shader shader)
(unless (gl:get-shader shader :compile-status)
(format t "~%Error! Shader compilation failed! :O :'(~%~a" (gl:get-shader-info-log shader))))
(defun link-shaders (shader-program vertex-shader fragment-shader)
(gl:attach-shader shader-program vertex-shader)
(gl:attach-shader shader-program fragment-shader)
(gl:link-program shader-program)
(unless (gl:get-program shader-program :link-status)
(format t "~%Error! Shader program linking failed! :O :'(~%~a" (gl:get-program-info-log shader-program)))
(gl:delete-shader vertex-shader);Don't need deez anymore
(gl:delete-shader fragment-shader))
(defun set-buffers(vao vbo ebo vertices indices vertices-length indices-length)
(gl:bind-vertex-array vao)
(gl:bind-buffer :array-buffer vbo)
(%gl:buffer-data :array-buffer (* vertices-length (cffi:foreign-type-size :float)) vertices :static-draw)
(gl:bind-buffer :element-array-buffer ebo)
(%gl:buffer-data :element-array-buffer (* indices-length (cffi:foreign-type-size :int)) indices :static-draw)
;Position Attribute
(gl:vertex-attrib-pointer 0 3 :float nil (* 5 (cffi:foreign-type-size :float)) 0)
(gl:enable-vertex-attrib-array 0)
;Colour Attibute
;(gl:vertex-attrib-pointer 1 3 :float nil (* 8 (cffi:foreign-type-size :float))(* 3 (cffi:foreign-type-size :float)))
;(gl:enable-vertex-attrib-array 1)
;Texture Coord Attribute
(gl:vertex-attrib-pointer 1 2 :float nil (* 5 (cffi:foreign-type-size :float))(* 3 (cffi:foreign-type-size :float)))
(gl:enable-vertex-attrib-array 1))
(defun set-texture (texture width height data format)
(gl:bind-texture :texture-2d texture);All texture 2d operations have effect on this texture object
(gl:tex-parameter :texture-2d :texture-wrap-s :repeat);Set texture wrapping parameters
(gl:tex-parameter :texture-2d :texture-wrap-t :repeat)
(gl:tex-parameter :texture-2d :texture-min-filter :linear);set texture filtering parameters
(gl:tex-parameter :texture-2d :texture-mag-filter :linear)
(gl:tex-image-2d :texture-2d 0 :rgb width height 0 format :unsigned-byte data)
(gl:generate-mipmap :texture-2d))
;(imago-img (imago:read-image "f:/Sync/Desktop/LISP/Textures/container.jpg"))
;(data (%stb.image::load "f:/Sync/Desktop/LISP/Textures/container.jpg" width height numchannels 0))
;(pixels2d (imago:image-pixels imago-img))
;(imgdimz (imago::array-dimensions pixels2d))
;(rows (car imgdimz))
;(columns (cadr imgdimz))
#|
;positions |colours | Texture Coords
(vertex-list (list 0.5 0.5 0.0 1.0 0.0 0.0 1.0 1.0 ;Top Right
0.5 -0.5 0.0 0.0 1.0 0.0 1.0 0.0 ;Bottom Right
-0.5 -0.5 0.0 0.0 0.0 1.0 0.0 0.0 ;Bottom Left
-0.5 0.5 0.0 1.0 0.0 1.0 0.0 1.0));Top Left
|#
(defun app (&key (fullscreen t)(title "Title")(screenwidth 1920)(screenheight 1080))
(let* (vao vbo ebo box-data box-width box-height face-texture box-texture vertex-shader fragment-shader
shader-program model modeloc view projection viewloc
;positions ;Texture Coords
(vertex-list (list 0.5 0.5 0.0 1.0 1.0 ;top right
0.5 -0.5 0.0 1.0 0.0 ;bottom right
-0.5 -0.5 0.0 0.0 0.0 ;bottom left
-0.5 0.5 0.0 0.0 1.0));top left
(index-list (list 0 1 3 ;First Triangle
1 2 3));Second Triangle
(vertices (cffi:foreign-alloc :float :count (length vertex-list)))
(indices (cffi:foreign-alloc :uint :count (length index-list)))
(vertex-source (loadfile "f:/Sync/Desktop/LISP/Coords/Vertex.txt" 'string))
(fragment-source (loadfile "f:/Sync/Desktop/LISP/Coords/Fragment.txt" 'string))
(face-png (pngload:load-file "f:/Sync/Desktop/LISP/Coords/awesomeface.png" :flatten t :flip-y t :static-vector t))
;(begin-time (get-universal-time))
(window (glop:create-window title screenwidth screenheight :major 3 :minor 3 :fullscreen fullscreen)))
(labels
((init()
(multiple-value-bind (data width height)(cl-jpeg:decode-image "f:/Sync/Desktop/LISP/Coords/container.jpg")
(setf box-data data
box-width width
box-height height))
(gl:viewport 0 0 screenwidth screenheight)
(gl:clear-color 0.5 1 0 1)
(setf vbo (gl:gen-buffer)
ebo (gl:gen-buffer)
vao (gl:gen-vertex-array)
face-texture (gl:gen-texture)
box-texture (gl:gen-texture)
vertex-shader (gl:create-shader :vertex-shader)
fragment-shader (gl:create-shader :fragment-shader)
shader-program (gl:create-program))
(fill-cffi-array vertex-list vertices :float)
(fill-cffi-array index-list indices :uint));init
(cleanup()
(gl:delete-vertex-arrays (list vao))
(gl:delete-buffers (list vbo ebo))
(gl:delete-program shader-program)
(glop:destroy-window window)
(static-vectors:free-static-vector (pngload:data face-png))
(cffi:foreign-free vertices)
(cffi:foreign-free indices)))
(init)
(build-shader vertex-shader vertex-source)
(build-shader fragment-shader fragment-source)
(link-shaders shader-program vertex-shader fragment-shader)
(set-buffers vao vbo ebo vertices indices (length vertex-list)(length index-list))
(set-texture box-texture box-width box-height box-data :bgr);texture width height data format
(set-texture face-texture (pngload:width face-png)(pngload:height face-png)(pngload:data face-png) :rgba)
(gl:use-program shader-program)
(gl:uniformi (gl:get-uniform-location shader-program "texture0") 0)
(gl:uniformi (gl:get-uniform-location shader-program "texture1") 1)
;Main Loop
(loop for muh-event = (glop:next-event window :blocking nil) with running = t while running if muh-event do
(typecase muh-event
(glop:key-press-event
(when (eq (glop:keysym muh-event) :escape)
(glop:push-close-event window)))
(glop:close-event (setf running nil))
(t (format t "Event: ~a~%" muh-event))
#|(t (unless (equalp glop:mouse-motion-event (class-of muh-event))
(format t "Event: ~a~%" muh-event)))|#
)
else do (gl:clear :color-buffer)
(gl:active-texture :texture0)
(gl:bind-texture :texture-2d box-texture)
(gl:active-texture :texture1)
(gl:bind-texture :texture-2d face-texture)
(gl:use-program shader-program)
(setf model (meye 4))
(setf view (meye 4))
(setf projection (meye 4))
;nmrotate x v angle
(setf model (nmrotate model (vec3 1.0 0.0 0.0)(degrees->radians -55.0)))
;nmtranslate x v
(setf view (nmtranslate view (vec3 0.0 0.0 -3.0)))
;mperspective fovy aspect near far
(setf projection (mperspective (degrees->radians 45.0)(coerce (/ screenwidth screenheight) 'float) 0.1 100.0))
;(setf projection (nmperspective projection (degrees->radians 45.0)(coerce (/ screenwidth screenheight) 'float) 0.1 100.0))
;(setf model (nmtranslate model (vec3 0.5 -0.5 0.0)))
;(setf model (nmrotate model (vec3 0.0 0.0 1.0)(degrees->radians (- (get-universal-time) begin-time))))
(setf modeloc (gl:get-uniform-location shader-program "model"))
(setf viewloc (gl:get-uniform-location shader-program "view"))
(gl:uniform-matrix-4fv modeloc (marr model) nil)
(gl:uniform-matrix-4fv viewloc (marr view) nil)
(gl:uniform-matrix-4fv (gl:get-uniform-location shader-program "projection")(marr projection) nil)
(gl:bind-vertex-array vao)
(%gl:draw-elements :triangles 6 :unsigned-int 0)
;(gl:bind-vertex-array 0)
(glop:swap-buffers window))
(cleanup))))
|