int push_gl_srv_buffer(struct gl_buffer *gl_buffer) { struct gl_srv_buffer *self = b6_cast_of(gl_buffer, struct gl_srv_buffer, gl_buffer); float *p, *q; static const unsigned long int min_size = 32768; unsigned long int v_size = b6_array_memsize(&gl_buffer->v); unsigned long int t_size = b6_array_memsize(&gl_buffer->t); unsigned long int size = v_size + t_size; unsigned long int len = b6_array_length(&gl_buffer->t); unsigned long int max = gl_buffer->t.capacity; const float *v = b6_array_get(&gl_buffer->v, 0); const float *t = b6_array_get(&gl_buffer->t, 0); if (size < v_size || size < t_size) { log_e("integer overflow"); return -2; } if (size < min_size) size = min_size; if (size > self->size) { log_i("allocating %u bytes", size); self->size = size; if (self->id) { maybe_unbind_gl_buffer(self->id); destroy_gl_buffer(self->id); } create_gl_buffer(&self->id); maybe_bind_gl_buffer(self->id); alloc_gl_buffer(size); } log_i("pushing %u/%u vertices", len, max); p = map_gl_buffer(); q = p + max * 2; while (len--) { *p++ = *t++; *p++ = *t++; *q++ = *v++; *q++ = *v++; } unmap_gl_buffer(); glTexCoordPointer(2, GL_FLOAT, 0, NULL); glVertexPointer(2, GL_FLOAT, 0, ((float*)NULL) + max * 2); return 0; }
NE_API void destroy_drawing_shape(drawing_shape_id index) { gl_drawing_shape* shape = &shapes[index]; destroy_vertex_array(&shape->vertex_array); destroy_gl_buffer(&shape->vertex_array.index_buffer); destroy_gl_buffer(&shape->vertex_array.vertex_buffer); }
void finalize_gl_srv_buffer(struct gl_srv_buffer *self) { if (self->id) destroy_gl_buffer(self->id); finalize_gl_buffer(&self->gl_buffer); }