Guest User

Untitled

a guest
May 26th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. (require :cl-opengl)
  2. (require :sdl2)
  3.  
  4. (defvar vertices nil)
  5. (defvar elements nil)
  6.  
  7. (setf vertices (make-array 9 :fill-pointer 0))
  8. (setf elements (make-array 9 :fill-pointer 0))
  9.  
  10. (defvar *vertex-shader* "
  11. #version 330 core
  12. layout (location = 0) in vec3 aPos;
  13.  
  14. void main() {
  15. gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
  16. }
  17. ")
  18.  
  19. (defvar *fragment-shader* "
  20. #version 330 core
  21. out vec4 FragColor;
  22.  
  23. void main() {
  24. FragColor = vec4(0.95f, 0.98f, 0.65f, 1.0f);
  25. }
  26. ")
  27.  
  28. (defun split-str-1 (string &optional (separator " ") (r nil))
  29. (let ((n (position separator string
  30. :from-end t
  31. :test #'(lambda (x y)
  32. (find y x :test #'string=)))))
  33. (if n
  34. (split-str-1 (subseq string 0 n) separator (cons (subseq string (1+ n)) r))
  35. (cons string r))))
  36.  
  37. (defun split-str (string &optional (separator " "))
  38. (split-str-1 string separator))
  39.  
  40. (defun parse-float (number)
  41. (with-input-from-string (in number)
  42. (read in)))
  43.  
  44. (defun load-obj (file-name)
  45. (let ((file (open file-name)))
  46. (with-open-stream (source file)
  47. (loop for line = (read-line source nil nil)
  48. while line do
  49. (let* ((split-line (split-str line " "))
  50. (header (car split-line))
  51. (rest (cdr split-line)))
  52. (cond ((string= header "v") (dolist (vertex rest) (vector-push (parse-float vertex) vertices)))
  53. ((string= header "f") (dolist (face rest) (let ((element (parse-integer (car (split-str face "/")))))
  54. (vector-push (- element 1) elements))))))))))
  55.  
  56. (defun main ()
  57. (load-obj "tortoise.obj")
  58. (sdl2:with-init (:everything)
  59. (sdl2:gl-set-attr :context-profile-mask 0)
  60. (sdl2:gl-set-attr :context-major-version 3)
  61. (sdl2:gl-set-attr :context-minor-version 3)
  62.  
  63. (sdl2:with-window (win :flags `(:shown :opengl))
  64. (sdl2:with-gl-context (gl-context win)
  65. (sdl2:gl-make-current win gl-context)
  66. (gl:viewport 0 0 800 600)
  67. (gl:clear-color 0.957 0.376 0.286 1.0)
  68.  
  69. (let ((glarray (gl:alloc-gl-array :float (length vertices)))
  70. (glarray-2 (gl:alloc-gl-array :unsigned-short (length elements))))
  71. (dotimes (i (length elements))
  72. (setf (gl:glaref glarray-2 i) (aref elements i)))
  73. (dotimes (i (length vertices))
  74. (setf (gl:glaref glarray i) (aref vertices i)))
  75.  
  76. (let ((vbo (gl:gen-buffer))
  77. (vao (gl:gen-vertex-array))
  78. (ebo (gl:gen-buffer)))
  79. (gl:bind-vertex-array vao)
  80. (gl:bind-buffer :array-buffer vbo)
  81. (gl:buffer-data :array-buffer :static-draw glarray)
  82. (gl:free-gl-array glarray)
  83. (gl:bind-buffer :element-array-buffer ebo)
  84. (gl:buffer-data :element-array-buffer :static-draw glarray-2)
  85. (gl:vertex-attrib-pointer 0 4 :float nil 0 0)
  86. (gl:enable-vertex-attrib-array 0)
  87.  
  88. (let ((vertex-shader (gl:create-shader :vertex-shader))
  89. (fragment-shader (gl:create-shader :fragment-shader)))
  90. (gl:shader-source vertex-shader *vertex-shader*)
  91. (gl:shader-source fragment-shader *fragment-shader*)
  92. (gl:compile-shader vertex-shader)
  93. (gl:compile-shader fragment-shader)
  94. (print (gl:get-shader-info-log vertex-shader))
  95. (print (gl:get-shader-info-log fragment-shader))
  96.  
  97. (let ((program (gl:create-program)))
  98. (gl:attach-shader program vertex-shader)
  99. (gl:attach-shader program fragment-shader)
  100. (gl:link-program program)
  101. (gl:delete-shader vertex-shader)
  102. (gl:delete-shader fragment-shader)
  103. (gl:use-program program)))
  104.  
  105. (sdl2:with-event-loop (:method :poll)
  106. (:idle ()
  107. (gl:clear :color-buffer)
  108. (gl:bind-vertex-array vao)
  109. (gl:draw-elements :triangles glarray-2)
  110. (gl:flush)
  111. (sdl2:gl-swap-window win))
  112. (:quit () t))))))))
Add Comment
Please, Sign In to add comment