(bind-func xtm_build_mesh_vbo
(lambda (vao:VAO* verts:float* num_verts:i64)
(let ((i:i64 0)
(vert:float* null)
(n1:float* (salloc 3))
(norm:float* (salloc 3))
(vbostride:i64 14) ;; 4d+3d+3d+4d
(vbodata:float* (zalloc (* num_verts vbostride))))
(dotimes (i num_verts)
(set! vert (pref-ptr verts (* i 3)))
(if (= (% i 3) 0)
(if (> i (- num_verts 2))
(begin (pfill! norm 0.0 1.0 0.0) 1)
(begin
(vvcross vert (pref-ptr vert 3) n1)
(vsmul n1 -1.0 3 norm)
1))
1)
(pfill! (pref-ptr vbodata (* i vbostride))
(pref vert 0) ;; x
(pref vert 1) ;; y
(pref vert 2) ;; z
1.0) ;; position data needs w==1
;; auto gen normal
(pfill! (pref-ptr vbodata (+ 4 (* i vbostride)))
(pref norm 0)
(pref norm 1)
(pref norm 2))
;; auto gen texcoords
(if (= (% i 3) 0)
(pfill! (pref-ptr vbodata (+ 7 (* i vbostride))) 0.0 0.0 0.0)
(if (= (% i 3) 1)
(pfill! (pref-ptr vbodata (+ 7 (* i vbostride))) 0.5 1.0 0.0)
(pfill! (pref-ptr vbodata (+ 7 (* i vbostride))) 1.0 0.0 0.0)))
;; default color is white
(pfill! (pref-ptr vbodata (+ 10 (* i vbostride))) 1.0 1.0 1.0 1.0))
;; (pfill! (pref-ptr vbodata (+ 10 (* i vbostride))) 0.2 1.0 0.2 1.0))
(let ((vbo (VBO vbodata (* num_verts vbostride) GL_STATIC_DRAW num_verts vbostride)))
;; (glBindBuffer GL_ARRAY_BUFFER 0)
(set_attribute vao vbo 0 4 (i64toi32 vbostride) 0)
(set_attribute vao vbo 1 3 (i64toi32 vbostride) 4)
(set_attribute vao vbo 2 3 (i64toi32 vbostride) 7)
(set_attribute vao vbo 3 4 (i64toi32 vbostride) 10)
vbo))))