Content of Vertex.txt

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);
    TexCoord = vec2(aTexCoord.x, aTexCoord.y); 
}

Content of Fragment.txt

#version 330 core
out vec4 FragColor;

in vec2 TexCoord;

uniform sampler2D texture0;
uniform sampler2D texture1;

void main()
{
    FragColor = mix(texture(texture0, TexCoord), texture(texture1, TexCoord), 0.2);
}
(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)))) 
Edit Report
Pub: 30 Jul 2024 10:24 UTC
Edit: 05 Aug 2024 04:52 UTC
Views: 250