;;; Resources Manager
-(defstruct resource plist free-function time)
+(defstruct resource plist constructor destructor time)
(defun make-resource-texture (&key filename min-filter mag-filter)
`(:type texture :filename ,filename :min-filter ,min-filter :mag-filter ,mag-filter))
(let ((resources-table (make-hash-table :test 'equal)))
- (defun set-resource (key plist free-function &key static)
+ (defun set-resource (key plist constructor destructor &key static)
(setf (gethash key resources-table)
(make-resource :plist plist
+ :constructor constructor
+ :destructor destructor
:free-function free-function
- :time (if static -1 (SDL_GetTicks)))))
+ :time (if static t (SDL_GetTicks)))))
(defun get-resource (key)
(let ((resource (gethash key resources-table)))
(setf (gethash key resources-table) resource)))
(resource-plist resource)))))
+ (defun free-resource (key)
+ (funcall (resource-destructor (gethash key resources-table)))
+ (setf (resource-time (gethash key resources-table)) nil))
+
(defun free-all-resources ()
- (maphash (lambda (key res) (funcall (resource-free-function res) (resource-address res)))
- resources-table)
- (clrhash resources-table)))
+ (maphash (lambda (key res) (free-resource key)) resources-table)))
;;; Connection with the GUI