textures part 4 : other sources of textures
Not many pictures this time, just a few other examples of texture loaders: (well 1 example for now, more to come...)
vecto
We can draw graphics using the vecto library, and load the results as a texture fairly easily:
(defmacro with-vecto-canvas-as-texture ((width height) &body body)
(let ((texture (gensym "TEXTURE-")))
`(vecto:with-canvas (:width ,width :height ,height)
;; run some vecto code
,@body
;; and load the result into a texture
(let ((,texture (car (gl:gen-textures 1))))
(gl:bind-texture :texture-2d ,texture)
(gl:tex-parameter :texture-2d :texture-min-filter :linear)
(gl:tex-parameter :texture-2d :generate-mipmap t)
(gl:tex-parameter :texture-2d :texture-min-filter :linear-mipmap-linear)
(gl:tex-image-2d :texture-2d 0 :rgba ,width ,height
0 :rgba :unsigned-byte
(vecto::image-data vecto::*graphics-state*))
,texture))))
;; example use
(setf *foreground-texture*
(with-vecto-canvas-as-texture (256 256)
;; one of the examples from vecto docs:
(let ((size 100)
(angle 0)
(step (* 2 (/ (* pi 2) 5))))
(vecto:translate size size)
(vecto:move-to 0 size)
(dotimes (i 5)
(setf angle (+ angle step))
(vecto:line-to (* (sin angle) size)
(* (cos angle) size)))
(vecto:even-odd-clip-path)
(vecto:end-path-no-op)
(flet ((circle (distance)
(vecto:set-rgba-fill distance 0 0
(- 1.0 distance))
(vecto:centered-circle-path 0 0 (* size distance))
(vecto:fill-path)))
(loop for i downfrom 1.0 by 0.05
repeat 20 do
(circle i))))))