;;;; png.lisp

(in-package #:wheelwork)

(def:class png (asset texture))

(defmethod ensure-loaded ((png png))
  (with-slots
        (width height id wrap-s wrap-t min-filter mag-filter internal-format image-format)
      png
    (pngload:with-png-in-static-vector (data (asset-path png) :flip-y t)
      (setf width (pngload:width data)
            height (pngload:height data)
            id (gl:gen-texture))
      (gl:bind-texture :texture-2d id)
      (gl:tex-parameter :texture-2d :texture-wrap-s wrap-s)
      (gl:tex-parameter :texture-2d :texture-wrap-t wrap-t)
      (gl:tex-parameter :texture-2d :texture-min-filter min-filter)
      (gl:tex-parameter :texture-2d :texture-mag-filter mag-filter)
      (gl:tex-image-2d :texture-2d
                       0
                       internal-format
                       width
                       height
                       0
                       image-format
                       :unsigned-byte
                       (pngload:data data))
      (gl:bind-texture :texture-2d 0)
      ;; what does this do?
      (when (texture-mipmap png)
        (gl:generate-mipmap :texture-2d)))))