void hmd_common_draw(GLuint texture, GLuint buffer) { if (buffer) { glBindTexture(GL_TEXTURE_2D, texture); glBindBuffer_(GL_ARRAY_BUFFER, buffer); glVertexPointer (2, GL_FLOAT, sizeof (struct point), (GLvoid *) 0); glTexCoordPointer(2, GL_FLOAT, sizeof (struct point), (GLvoid *) 8); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glBindBuffer_(GL_ARRAY_BUFFER, 0); } }
void hmd_common_init(int w, int h) { /* Create the off-screen frame buffers. */ fbo_create(&L_fbo, 5 * w / 4 / 2, 5 * h / 4); fbo_create(&R_fbo, 5 * w / 4 / 2, 5 * h / 4); /* Create and initialize the distortion shader. */ glsl_create(&distortion, sizeof (hmd_vert) / sizeof (char *), hmd_vert, sizeof (hmd_frag) / sizeof (char *), hmd_frag); /* Initialize VBOs for the on-screen rectangles. */ glGenBuffers_(1, &L_vbo); glBindBuffer_(GL_ARRAY_BUFFER, L_vbo); glBufferData_(GL_ARRAY_BUFFER, sizeof (L_rect), L_rect, GL_STATIC_DRAW); glGenBuffers_(1, &R_vbo); glBindBuffer_(GL_ARRAY_BUFFER, R_vbo); glBufferData_(GL_ARRAY_BUFFER, sizeof (R_rect), R_rect, GL_STATIC_DRAW); glBindBuffer_(GL_ARRAY_BUFFER, 0); }
void genvbo(int type, void *buf, int len, vtxarray **vas, int numva) { GLuint vbo; glGenBuffers_(1, &vbo); GLenum target = type==VBO_VBUF ? GL_ARRAY_BUFFER : GL_ELEMENT_ARRAY_BUFFER; glBindBuffer_(target, vbo); glBufferData_(target, len, buf, GL_STATIC_DRAW); glBindBuffer_(target, 0); vboinfo &vbi = vbos[vbo]; vbi.uses = numva; vbi.data = new uchar[len]; memcpy(vbi.data, buf, len); if(printvbo) conoutf(CON_DEBUG, "vbo %d: type %d, size %d, %d uses", vbo, type, len, numva); loopi(numva) { vtxarray *va = vas[i]; switch(type) { case VBO_VBUF: va->vbuf = vbo; va->vdata = (vertex *)vbi.data; break; case VBO_EBUF: va->ebuf = vbo; va->edata = (ushort *)vbi.data; break; case VBO_SKYBUF: va->skybuf = vbo; va->skydata = (ushort *)vbi.data; break; } } }
GLAPI void APIENTRY glBindBuffer( GLenum target, GLuint buffer) { glBindBuffer_(target, buffer); }