Use a single index array
There's no point in clearing the index array because it is always the same sequence of indices regardless of the vertices. Instead it is just added to when there are more vertices than ever before.
This commit is contained in:
parent
8caf39eb00
commit
b11b74fcde
@ -1918,9 +1918,41 @@ _cogl_texture_flush_vertices (void)
|
|||||||
|
|
||||||
if (ctx->texture_vertices->len > 0)
|
if (ctx->texture_vertices->len > 0)
|
||||||
{
|
{
|
||||||
|
int needed_indices;
|
||||||
CoglTextureGLVertex *p
|
CoglTextureGLVertex *p
|
||||||
= (CoglTextureGLVertex *) ctx->texture_vertices->data;
|
= (CoglTextureGLVertex *) ctx->texture_vertices->data;
|
||||||
|
|
||||||
|
/* The indices are always the same sequence regardless of the
|
||||||
|
vertices so we only need to change it if there are more
|
||||||
|
vertices than ever before */
|
||||||
|
needed_indices = ctx->texture_vertices->len / 4 * 6;
|
||||||
|
if (needed_indices > ctx->texture_indices->len)
|
||||||
|
{
|
||||||
|
int old_len = ctx->texture_indices->len;
|
||||||
|
int vert_num = old_len / 6 * 4;
|
||||||
|
int i;
|
||||||
|
GLushort *q;
|
||||||
|
|
||||||
|
/* Add two triangles for each quad to the list of
|
||||||
|
indices. That makes six new indices but two of the
|
||||||
|
vertices in the triangles are shared. */
|
||||||
|
g_array_set_size (ctx->texture_indices, needed_indices);
|
||||||
|
q = &g_array_index (ctx->texture_indices, GLushort, old_len);
|
||||||
|
|
||||||
|
for (i = old_len;
|
||||||
|
i < ctx->texture_indices->len;
|
||||||
|
i += 6, vert_num += 4)
|
||||||
|
{
|
||||||
|
*(q++) = vert_num + 0;
|
||||||
|
*(q++) = vert_num + 1;
|
||||||
|
*(q++) = vert_num + 3;
|
||||||
|
|
||||||
|
*(q++) = vert_num + 1;
|
||||||
|
*(q++) = vert_num + 2;
|
||||||
|
*(q++) = vert_num + 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GE( glVertexPointer (2, GL_FLOAT,
|
GE( glVertexPointer (2, GL_FLOAT,
|
||||||
sizeof (CoglTextureGLVertex), p->v ) );
|
sizeof (CoglTextureGLVertex), p->v ) );
|
||||||
GE( glTexCoordPointer (2, GL_FLOAT,
|
GE( glTexCoordPointer (2, GL_FLOAT,
|
||||||
@ -1929,12 +1961,11 @@ _cogl_texture_flush_vertices (void)
|
|||||||
GE( glBindTexture (ctx->texture_target, ctx->texture_current) );
|
GE( glBindTexture (ctx->texture_target, ctx->texture_current) );
|
||||||
GE( ctx->pf_glDrawRangeElements (GL_TRIANGLES,
|
GE( ctx->pf_glDrawRangeElements (GL_TRIANGLES,
|
||||||
0, ctx->texture_vertices->len - 1,
|
0, ctx->texture_vertices->len - 1,
|
||||||
ctx->texture_indices->len,
|
needed_indices,
|
||||||
GL_UNSIGNED_SHORT,
|
GL_UNSIGNED_SHORT,
|
||||||
ctx->texture_indices->data) );
|
ctx->texture_indices->data) );
|
||||||
|
|
||||||
g_array_set_size (ctx->texture_vertices, 0);
|
g_array_set_size (ctx->texture_vertices, 0);
|
||||||
g_array_set_size (ctx->texture_indices, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1946,7 +1977,6 @@ _cogl_texture_add_quad_vertices (GLfloat x1, GLfloat y1,
|
|||||||
{
|
{
|
||||||
CoglTextureGLVertex *p;
|
CoglTextureGLVertex *p;
|
||||||
GLushort first_vert;
|
GLushort first_vert;
|
||||||
GLushort *q;
|
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
|
|
||||||
@ -1968,21 +1998,6 @@ _cogl_texture_add_quad_vertices (GLfloat x1, GLfloat y1,
|
|||||||
p->v[0] = x2; p->v[1] = y1;
|
p->v[0] = x2; p->v[1] = y1;
|
||||||
p->t[0] = tx2; p->t[1] = ty1;
|
p->t[0] = tx2; p->t[1] = ty1;
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
/* Add two triangles to the list of indices. That makes six new
|
|
||||||
indices but two of the vertices in the triangles are shared. */
|
|
||||||
g_array_set_size (ctx->texture_indices,
|
|
||||||
ctx->texture_indices->len + 6);
|
|
||||||
q = &g_array_index (ctx->texture_indices, GLushort,
|
|
||||||
ctx->texture_indices->len - 6);
|
|
||||||
|
|
||||||
*(q++) = first_vert + 0;
|
|
||||||
*(q++) = first_vert + 1;
|
|
||||||
*(q++) = first_vert + 3;
|
|
||||||
|
|
||||||
*(q++) = first_vert + 1;
|
|
||||||
*(q++) = first_vert + 2;
|
|
||||||
*(q++) = first_vert + 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2054,9 +2054,41 @@ _cogl_texture_flush_vertices (void)
|
|||||||
|
|
||||||
if (ctx->texture_vertices->len > 0)
|
if (ctx->texture_vertices->len > 0)
|
||||||
{
|
{
|
||||||
|
int needed_indices;
|
||||||
CoglTextureGLVertex *p
|
CoglTextureGLVertex *p
|
||||||
= (CoglTextureGLVertex *) ctx->texture_vertices->data;
|
= (CoglTextureGLVertex *) ctx->texture_vertices->data;
|
||||||
|
|
||||||
|
/* The indices are always the same sequence regardless of the
|
||||||
|
vertices so we only need to change it if there are more
|
||||||
|
vertices than ever before */
|
||||||
|
needed_indices = ctx->texture_vertices->len / 4 * 6;
|
||||||
|
if (needed_indices > ctx->texture_indices->len)
|
||||||
|
{
|
||||||
|
int old_len = ctx->texture_indices->len;
|
||||||
|
int vert_num = old_len / 6 * 4;
|
||||||
|
int i;
|
||||||
|
GLushort *q;
|
||||||
|
|
||||||
|
/* Add two triangles for each quad to the list of
|
||||||
|
indices. That makes six new indices but two of the
|
||||||
|
vertices in the triangles are shared. */
|
||||||
|
g_array_set_size (ctx->texture_indices, needed_indices);
|
||||||
|
q = &g_array_index (ctx->texture_indices, GLushort, old_len);
|
||||||
|
|
||||||
|
for (i = old_len;
|
||||||
|
i < ctx->texture_indices->len;
|
||||||
|
i += 6, vert_num += 4)
|
||||||
|
{
|
||||||
|
*(q++) = vert_num + 0;
|
||||||
|
*(q++) = vert_num + 1;
|
||||||
|
*(q++) = vert_num + 3;
|
||||||
|
|
||||||
|
*(q++) = vert_num + 1;
|
||||||
|
*(q++) = vert_num + 2;
|
||||||
|
*(q++) = vert_num + 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GE( glVertexPointer (2, GL_FLOAT,
|
GE( glVertexPointer (2, GL_FLOAT,
|
||||||
sizeof (CoglTextureGLVertex), p->v ) );
|
sizeof (CoglTextureGLVertex), p->v ) );
|
||||||
GE( glTexCoordPointer (2, GL_FLOAT,
|
GE( glTexCoordPointer (2, GL_FLOAT,
|
||||||
@ -2064,12 +2096,11 @@ _cogl_texture_flush_vertices (void)
|
|||||||
|
|
||||||
GE( glBindTexture (ctx->texture_target, ctx->texture_current) );
|
GE( glBindTexture (ctx->texture_target, ctx->texture_current) );
|
||||||
GE( glDrawElements (GL_TRIANGLES,
|
GE( glDrawElements (GL_TRIANGLES,
|
||||||
ctx->texture_indices->len,
|
needed_indices,
|
||||||
GL_UNSIGNED_SHORT,
|
GL_UNSIGNED_SHORT,
|
||||||
ctx->texture_indices->data) );
|
ctx->texture_indices->data) );
|
||||||
|
|
||||||
g_array_set_size (ctx->texture_vertices, 0);
|
g_array_set_size (ctx->texture_vertices, 0);
|
||||||
g_array_set_size (ctx->texture_indices, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2081,7 +2112,6 @@ _cogl_texture_add_quad_vertices (GLfloat x1, GLfloat y1,
|
|||||||
{
|
{
|
||||||
CoglTextureGLVertex *p;
|
CoglTextureGLVertex *p;
|
||||||
GLushort first_vert;
|
GLushort first_vert;
|
||||||
GLushort *q;
|
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||||||
|
|
||||||
@ -2103,21 +2133,6 @@ _cogl_texture_add_quad_vertices (GLfloat x1, GLfloat y1,
|
|||||||
p->v[0] = x2; p->v[1] = y1;
|
p->v[0] = x2; p->v[1] = y1;
|
||||||
p->t[0] = tx2; p->t[1] = ty1;
|
p->t[0] = tx2; p->t[1] = ty1;
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
/* Add two triangles to the list of indices. That makes six new
|
|
||||||
indices but two of the vertices in the triangles are shared. */
|
|
||||||
g_array_set_size (ctx->texture_indices,
|
|
||||||
ctx->texture_indices->len + 6);
|
|
||||||
q = &g_array_index (ctx->texture_indices, GLushort,
|
|
||||||
ctx->texture_indices->len - 6);
|
|
||||||
|
|
||||||
*(q++) = first_vert + 0;
|
|
||||||
*(q++) = first_vert + 1;
|
|
||||||
*(q++) = first_vert + 3;
|
|
||||||
|
|
||||||
*(q++) = first_vert + 1;
|
|
||||||
*(q++) = first_vert + 2;
|
|
||||||
*(q++) = first_vert + 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user