diff options
Diffstat (limited to 'rings.c')
-rw-r--r-- | rings.c | 48 |
1 files changed, 19 insertions, 29 deletions
@@ -65,30 +65,10 @@ install_transform(int instance) void do_ring_drawelements(void) { - GLvoid *indices[ring.num_verts]; - GLsizei count[ring.num_verts]; - int v; - - for (v = 0; v < ring.num_verts; v++) { - indices[v] = (void *)(uintptr_t)(ring.elements_offset + - ring.elements_vert_stride * v); - count[v] = ring.num_steps * 2 + 2; - } - - if (GLEW_EXT_multi_draw_arrays && !no_multi_draw_arrays) { - glMultiDrawElements(GL_TRIANGLE_STRIP, - count, - GL_UNSIGNED_INT, - (const GLvoid **)indices, - ring.num_verts); - } else { - for (v = 0; v < ring.num_verts; v++) { - glDrawElements(GL_TRIANGLE_STRIP, - ring.num_steps * 2 + 2, - GL_UNSIGNED_INT, - indices[v]); - } - } + glDrawElements(GL_TRIANGLE_STRIP, + ring.num_verts * (ring.num_steps * 2 + 2), + GL_UNSIGNED_INT, + (void *)(uintptr_t)ring.elements_offset); } void @@ -434,17 +414,27 @@ revolve(const float *verts, unsigned int num_verts, } } - /* Calculate the element data (indices). We'll emit num_verts strips - * going around the revolved object. + /* Calculate the element data (indices). We emit strips going + * around the ring (steps), where at the end of each strip we + * dupe the vert so we can keep the strip going back the other + * way without restarting the primitives. */ i = 0; for (v = 0; v < num_verts; v++) { + int v0 = v; int v1 = (v + 1) % num_verts; for (s = 0; s <= steps; s++) { - elements[i++] = num_verts * s + v1; - elements[i++] = num_verts * s + v; + if (!(v & 1)) { + elements[i++] = num_verts * s + v1; + elements[i++] = num_verts * s + v0; + } else { + elements[i++] = num_verts * (s + 1) - 1 - v1; + elements[i++] = num_verts * (s + 1) - 1 - v0; + } } + elements[i] = elements[i - 1]; + i++; } glBindVertexArray(ring.array_obj); @@ -503,7 +493,7 @@ setup_rings(void) ring.tangent_offset = ring.norm_offset + 3 * 4 * sv; ring.texcoord_offset = ring.tangent_offset + 3 * 4 * sv; ring.elements_offset = ring.texcoord_offset + 2 * 4 * sv; - ring.elements_vert_stride = (num_steps + 1) * 2 * 4; + ring.elements_vert_stride = ((num_steps + 1) * 2 + 1) * 4; size = ring.elements_offset + ring.elements_vert_stride * ring.num_verts; |