void glopDrawElements(GLContext *c, GLParam *param) { int i; int idx; int states = c->client_states; int mode = param[1].i; int count = param[2].i; int type = param[3].i; unsigned int *indices_u32 = (unsigned int*)param[4].p; unsigned short *indices_u16 = (unsigned short*)indices_u32; GLParam p[2]; p[1].i = mode; glopBegin(c, p); for (int ii=0; ii<count; ii++) { idx = (type == GL_UNSIGNED_INT) ? indices_u32[ii] : indices_u16[ii]; if (states & COLOR_ARRAY) { GLParam p[5]; int size = c->color_array_size; i = idx * (size + c->color_array_stride); p[1].f = c->color_array[i]; p[2].f = c->color_array[i+1]; p[3].f = c->color_array[i+2]; p[4].f = size > 3 ? c->color_array[i+3] : 1.0f; glopColor(c, p); } if (states & NORMAL_ARRAY) { i = idx * (3 + c->normal_array_stride); c->current_normal.X = c->normal_array[i]; c->current_normal.Y = c->normal_array[i+1]; c->current_normal.Z = c->normal_array[i+2]; c->current_normal.W = 0.0f; } if (states & TEXCOORD_ARRAY) { int size = c->texcoord_array_size; i = idx * (size + c->texcoord_array_stride); c->current_tex_coord.X = c->texcoord_array[i]; c->current_tex_coord.Y = c->texcoord_array[i+1]; c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f; c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f; } if (states & VERTEX_ARRAY) { GLParam p[5]; int size = c->vertex_array_size; i = idx * (size + c->vertex_array_stride); p[1].f = c->vertex_array[i]; p[2].f = c->vertex_array[i+1]; p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f; p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f; glopVertex(c, p); } } glopEnd(c, p); }
void glopDrawArrays(GLContext *c, GLParam *param) { int i; int idx; int states = c->client_states; int mode = param[1].i; int first = param[2].i; int count = param[3].i; GLParam p[2]; p[1].i = mode; glopBegin(c, p); for (int vi=0; vi<count; vi++) { idx = first + vi; if (states & COLOR_ARRAY) { GLParam p[5]; int size = c->color_array_size; i = idx * (size + c->color_array_stride); p[1].f = c->color_array[i]; p[2].f = c->color_array[i+1]; p[3].f = c->color_array[i+2]; p[4].f = size > 3 ? c->color_array[i+3] : 1.0f; glopColor(c, p); } if (states & NORMAL_ARRAY) { i = idx * (3 + c->normal_array_stride); c->current_normal.X = c->normal_array[i]; c->current_normal.Y = c->normal_array[i+1]; c->current_normal.Z = c->normal_array[i+2]; c->current_normal.W = 0.0f; } if (states & TEXCOORD_ARRAY) { int size = c->texcoord_array_size; i = idx * (size + c->texcoord_array_stride); c->current_tex_coord.X = c->texcoord_array[i]; c->current_tex_coord.Y = c->texcoord_array[i+1]; c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f; c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f; } if (states & VERTEX_ARRAY) { GLParam p[5]; int size = c->vertex_array_size; i = idx * (size + c->vertex_array_stride); p[1].f = c->vertex_array[i]; p[2].f = c->vertex_array[i+1]; p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f; p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f; glopVertex(c, p); } } glopEnd(c, p); }
void glopArrayElement(GLContext *c, GLParam *param) { int i; int states = c->client_states; int idx = param[1].i; if (states & COLOR_ARRAY) { GLParam p[5]; int size = c->color_array_size; i = idx * (size + c->color_array_stride); p[1].f = c->color_array[i]; p[2].f = c->color_array[i+1]; p[3].f = c->color_array[i+2]; p[4].f = size > 3 ? c->color_array[i+3] : 1.0f; glopColor(c, p); } if (states & NORMAL_ARRAY) { i = idx * (3 + c->normal_array_stride); c->current_normal.X = c->normal_array[i]; c->current_normal.Y = c->normal_array[i+1]; c->current_normal.Z = c->normal_array[i+2]; c->current_normal.Z = 0.0f; } if (states & TEXCOORD_ARRAY) { int size = c->texcoord_array_size; i = idx * (size + c->texcoord_array_stride); c->current_tex_coord.X = c->texcoord_array[i]; c->current_tex_coord.Y = c->texcoord_array[i+1]; c->current_tex_coord.Z = size > 2 ? c->texcoord_array[i+2] : 0.0f; c->current_tex_coord.W = size > 3 ? c->texcoord_array[i+3] : 1.0f; } if (states & VERTEX_ARRAY) { GLParam p[5]; int size = c->vertex_array_size; i = idx * (size + c->vertex_array_stride); p[1].f = c->vertex_array[i]; p[2].f = c->vertex_array[i+1]; p[3].f = size > 2 ? c->vertex_array[i+2] : 0.0f; p[4].f = size > 3 ? c->vertex_array[i+3] : 1.0f; glopVertex(c, p); } }