summaryrefslogtreecommitdiff
path: root/rings.c
diff options
context:
space:
mode:
Diffstat (limited to 'rings.c')
-rw-r--r--rings.c48
1 files changed, 19 insertions, 29 deletions
diff --git a/rings.c b/rings.c
index 83b9120..7e1935a 100644
--- a/rings.c
+++ b/rings.c
@@ -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;