From: Dan K. <da...@ch...> - 2003-02-18 19:27:51
|
Well, you'd still need the vertex parameter, but etypecase would let you do away with the format parameter. Unfortunately, you can't check the types of the coordinates at macro-expansion time because they may not be known. If you wanted to incur a runtime penalty, you could do something like: (defun gl-vertex (x &optional (y 0) (z 0) (w 1) &key (vertex nil)) (flet ((float-type (n) (etypecase n (integer 0) (short-float 1) (single-float 2) (double-float 3)))) (let ((type (apply #'max (mapcar #'float-type (list x y z w))))) (apply (nth (+ type (if vertex 4 0)) '(#'glVertex4i #'glVertex4f #'glVertex4s #'glVertex4d #'glVertex4iv #'glVertex4fv #'glVertex4sv #'glVertex4dv)) (mapcar (lambda (n) (case type (0 (floor n)) (1 (float n 1s0)) (2 (float n 1f0)) (3 (float n 1d0)))) (list x y z w)))))) I doubt I've got the mapping of Lisp types to C types exactly right, you'd have to go through and correct that. | Dan Knapp, Knight of the Random Seed | http://brain.mics.net/~dankna/ | ONES WHO DOES NOT HAVE TRIFORCE CAN'T GO IN. |