I've been stuck on this for the last two weeks and I'm feeling frustrated. Hopefully someone here can help. I'm using cl-opengl with sbcl on an Ubuntu box. Everything been working well but I've run into trouble with vertex (and other) arrays. I'm trying to create a vertex, normal, tex-coord, and edge array format. I keep getting an error when I try to bind the vertex array.
Undefined function: CL-OPENGL::TEX-COORD-POINTER
I've looked and there is a tex-coord-pointer defined in cl-opengl!
Anyway, here is my code below (Just the one object, if you want the rest I can send it). Thanks in advance for your time.
(in-package #:qix)
(gl:define-gl-array-format vnte (gl:vertex :type :float :components (x y z)) (gl:normal :type :float :components (nx ny nz)) (gl:tex-coord :type :float :components (tx ty)) (gl:edge-flag :type :float :components (e)))
(defclass 3d-model (display-list) ((vertex-array :accessor vertex-array :initarg vertex-array :initform nil) (size)))
(defclass 3d-square (3d-model) ((top :initarg :top :initform nil :accessor top) (left :initarg :left :initform nil :accessor left) (width :initarg :width :initform nil :accessor width) (height :accessor height :initarg :height :accessor height) (x-size :accessor x-size :initarg :x-size :initform 10) (y-size :accessor y-size :initarg :y-size :initform 10)))
(defmethod initialize-instance :after ((this 3d-square) &rest args) (print "starting init!") (with-accessors ((vertex-array vertex-array) (width width) (height height) (x-size x-size) (y-size y-size) (top top) (left left)) this (setf (slot-value this 'size) (* x-size y-size)) (let ((dx (/ width x-size)) (dy (/ height y-size)) (tdx (/ x-size)) (tdy (/ y-size))) (setf vertex-array (gl:alloc-gl-array 'vnte (slot-value this 'size))) (loop for i from 0 to (- x-size 1) do (loop for j from 0 to (- y-size 1) do (let ((startx (+ left (* i dx))) (starty (- top (* j dy))) (endx (+ left (* i dx) dx)) (endy (- top (* j dy) dy)) (tex-startx (* i tdx)) (tex-starty (* j tdy)) (tex-endx (+ (* i tdx) tdx)) (tex-endy (+ (* j tdy) tdy)) (offset (+ (* i y-size 6 3) (* j 6 3))))
; first triangle (setf (gl:glaref vertex-array offset 'x) (float startx)) (setf (gl:glaref vertex-array offset 'y) (float starty)) (setf (gl:glaref vertex-array offset 'z) (float 0)) (setf (gl:glaref vertex-array (+ offset 1) 'x) (float endx)) (setf (gl:glaref vertex-array (+ offset 1) 'y) (float starty)) (setf (gl:glaref vertex-array (+ offset 1) 'z) (float 0)) (setf (gl:glaref vertex-array (+ offset 2) 'x) (float startx)) (setf (gl:glaref vertex-array (+ offset 2) 'y) (float endy)) (setf (gl:glaref vertex-array (+ offset 2) 'z) (float 0)) ; second triangle (setf (gl:glaref vertex-array (+ offset 3) 'x) (float startx)) (setf (gl:glaref vertex-array (+ offset 3) 'y) (float endy)) (setf (gl:glaref vertex-array (+ offset 3) 'z) (float 0)) (setf (gl:glaref vertex-array (+ offset 4) 'x) (float endx)) (setf (gl:glaref vertex-array (+ offset 4) 'y) (float starty)) (setf (gl:glaref vertex-array (+ offset 4) 'z) (float 0)) (setf (gl:glaref vertex-array (+ offset 5) 'x) (float endx)) (setf (gl:glaref vertex-array (+ offset 5) 'y) (float endy)) (setf (gl:glaref vertex-array (+ offset 5) 'z) (float 0))
; first triangle normals (setf (gl:glaref vertex-array offset 'nx) (float 0)) (setf (gl:glaref vertex-array offset 'ny) (float 0)) (setf (gl:glaref vertex-array offset 'nz) (float 1)) (setf (gl:glaref vertex-array (+ offset 1) 'nx) (float 0)) (setf (gl:glaref vertex-array (+ offset 1) 'ny) (float 0)) (setf (gl:glaref vertex-array (+ offset 1) 'nz) (float 1)) (setf (gl:glaref vertex-array (+ offset 2) 'nx) (float 0)) (setf (gl:glaref vertex-array (+ offset 2) 'ny) (float 0)) (setf (gl:glaref vertex-array (+ offset 2) 'nz) (float 1)) ;second triangle... (setf (gl:glaref vertex-array (+ offset 3) 'nx) (float 0)) (setf (gl:glaref vertex-array (+ offset 3) 'ny) (float 0)) (setf (gl:glaref vertex-array (+ offset 3) 'nz) (float 1)) (setf (gl:glaref vertex-array (+ offset 4) 'nx) (float 0)) (setf (gl:glaref vertex-array (+ offset 4) 'ny) (float 0)) (setf (gl:glaref vertex-array (+ offset 4) 'nz) (float 1)) (setf (gl:glaref vertex-array (+ offset 5) 'nx) (float 0)) (setf (gl:glaref vertex-array (+ offset 5) 'ny) (float 0)) (setf (gl:glaref vertex-array (+ offset 5) 'nz) (float 1))
; first triangle texture (setf (gl:glaref vertex-array offset 'tx) (float tex-startx)) (setf (gl:glaref vertex-array offset 'ty) (float tex-starty)) (setf (gl:glaref vertex-array (+ offset 1) 'tx) (float tex-endx)) (setf (gl:glaref vertex-array (+ offset 1) 'ty) (float tex-starty)) (setf (gl:glaref vertex-array (+ offset 2) 'tx) (float tex-startx)) (setf (gl:glaref vertex-array (+ offset 2) 'ty) (float tex-endy)) ; second triangle texture (setf (gl:glaref vertex-array (+ offset 3) 'tx) (float tex-startx)) (setf (gl:glaref vertex-array (+ offset 3) 'ty) (float tex-endy)) (setf (gl:glaref vertex-array (+ offset 4) 'tx) (float tex-endx)) (setf (gl:glaref vertex-array (+ offset 4) 'ty) (float tex-starty)) (setf (gl:glaref vertex-array (+ offset 5) 'tx) (float tex-endx)) (setf (gl:glaref vertex-array (+ offset 1) 'ty) (float tex-endy)) ; First triangle edges (setf (gl:glaref vertex-array offset 'e) (float (if (zerop i) 1 0))) (setf (gl:glaref vertex-array (+ offset 1) 'e) (float 0)) (setf (gl:glaref vertex-array (+ offset 2) 'e) (float (if (zerop j) 1 0))) ;Seconde Triangle Edges (setf (gl:glaref vertex-array (+ offset 3) 'e) (float 0)) (setf (gl:glaref vertex-array (+ offset 4) 'e) (float (if (eql j (- y-size 1)) 1 0))) (setf (gl:glaref vertex-array (+ offset 5) 'e) (float (if (eql i (- x-size 1)) 1 0)))))))))
(defmethod render ((this 3d-square)) ;;enable the correct arrays (gl:enable-client-state :vertex-array) (gl:enable-client-state :edge-flag-array) (gl:enable-client-state :normal-array) (gl:enable-client-state :texture-coord-array) (print "two") (gl:bind-gl-vertex-array (vertex-array this)) (format t "size = ~a~%" (slot-value this 'size)) (%gl:draw-arrays :triangles 0 (slot-value this 'size)))
2009/3/8 Brad Beer bradwbeer@gmail.com:
I'm using cl-opengl with sbcl on an Ubuntu box. Everything been working
current cl-opengl from main darcs repo (on common-lisp.net) , or some other version?
Undefined function: CL-OPENGL::TEX-COORD-POINTER
I've looked and there is a tex-coord-pointer defined in cl-opengl!
in what file? i looked but didn't see it anywhere obvious
try replacing the tex-coord-pointer with %gl:tex-coord-pointer in emit-gl-array-bind-clause in gl/opengl.lisp might need to do same for edge-flag-pointer and vertex-attrib-pointer as well.
actually, possibly it would be better to replace all three with ,func-name if I'm reading right...
-b-
cl-opengl-devel@common-lisp.net