예제 #1
0
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;
}
예제 #2
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);
}
예제 #3
0
void finalize_gl_srv_buffer(struct gl_srv_buffer *self)
{
	if (self->id)
		destroy_gl_buffer(self->id);
	finalize_gl_buffer(&self->gl_buffer);
}