[cl-opengl-devel] Opengl Array Question...

Brad Beer bradwbeer at gmail.com
Mon Mar 9 04:15:28 UTC 2009


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)))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cl-opengl-devel/attachments/20090309/66a1730a/attachment.html>


More information about the cl-opengl-devel mailing list