Index: src/ref_gl/gl_local.h =================================================================== --- src/ref_gl/gl_local.h (Revision 9719) +++ src/ref_gl/gl_local.h (Arbeitskopie) @@ -278,6 +278,8 @@ extern cvar_t *r_texture_lod; /* lod_bias */ extern cvar_t *r_displayrefresh; +extern cvar_t *gl_use_arrays; + extern cvar_t *gl_screenshot; extern cvar_t *gl_screenshot_jpeg_quality; Index: src/ref_gl/gl_rmain.c =================================================================== --- src/ref_gl/gl_rmain.c (Revision 9719) +++ src/ref_gl/gl_rmain.c (Arbeitskopie) @@ -84,6 +84,8 @@ cvar_t *r_ext_max_anisotropy; cvar_t *r_texture_lod; /* lod_bias */ +cvar_t *gl_use_arrays; + cvar_t *gl_screenshot; cvar_t *gl_screenshot_jpeg_quality; @@ -967,6 +969,8 @@ r_ext_max_anisotropy = ri.Cvar_Get("r_ext_max_anisotropy", "0", 0, NULL); r_texture_lod = ri.Cvar_Get("r_texture_lod", "0", CVAR_ARCHIVE, NULL); + gl_use_arrays = ri.Cvar_Get("gl_use_arrays", "1", CVAR_ARCHIVE, "Use vertex, color and normal arrays"); + gl_screenshot = ri.Cvar_Get("gl_screenshot", "jpg", CVAR_ARCHIVE, "png, jpg or tga are valid screenshot formats"); gl_screenshot_jpeg_quality = ri.Cvar_Get("gl_screenshot_jpeg_quality", "75", CVAR_ARCHIVE, "jpeg quality in percent for jpeg screenshots"); Index: src/ref_gl/gl_mesh_md2.c =================================================================== --- src/ref_gl/gl_mesh_md2.c (Revision 9719) +++ src/ref_gl/gl_mesh_md2.c (Arbeitskopie) @@ -90,62 +90,101 @@ GL_LerpVerts(paliashdr->num_xyz, v, ov, lerp, move, frontv, backv); - /* setup vertex array */ - qglEnableClientState(GL_VERTEX_ARRAY); - qglVertexPointer(3, GL_FLOAT, 16, s_lerped); /* padded for SIMD */ + if (gl_use_arrays) { + /* setup vertex array */ + qglEnableClientState(GL_VERTEX_ARRAY); + qglVertexPointer(3, GL_FLOAT, 16, s_lerped); /* padded for SIMD */ - /* setup normal array */ - qglEnableClientState(GL_NORMAL_ARRAY); - qglNormalPointer(GL_FLOAT, 0, normalArray); + /* setup normal array */ + qglEnableClientState(GL_NORMAL_ARRAY); + qglNormalPointer(GL_FLOAT, 0, normalArray); - na = normalArray; - if (backlerp == 0.0) - for (i = 0; i < paliashdr->num_xyz; v++, i++) { - /* get current normals */ - newNormal = r_avertexnormals[v->lightnormalindex]; + na = normalArray; + if (backlerp == 0.0) + for (i = 0; i < paliashdr->num_xyz; v++, i++) { + /* get current normals */ + newNormal = r_avertexnormals[v->lightnormalindex]; - *na++ = newNormal[0]; - *na++ = newNormal[1]; - *na++ = newNormal[2]; - } else - for (i = 0; i < paliashdr->num_xyz; v++, ov++, i++) { - /* normalize interpolated normals? */ - /* no: probably too much to compute */ - oldNormal = r_avertexnormals[ov->lightnormalindex]; - newNormal = r_avertexnormals[v->lightnormalindex]; + *na++ = newNormal[0]; + *na++ = newNormal[1]; + *na++ = newNormal[2]; + } else + for (i = 0; i < paliashdr->num_xyz; v++, ov++, i++) { + /* normalize interpolated normals? */ + /* no: probably too much to compute */ + oldNormal = r_avertexnormals[ov->lightnormalindex]; + newNormal = r_avertexnormals[v->lightnormalindex]; - *na++ = backlerp * oldNormal[0] + frontlerp * newNormal[0]; - *na++ = backlerp * oldNormal[1] + frontlerp * newNormal[1]; - *na++ = backlerp * oldNormal[2] + frontlerp * newNormal[2]; - } + *na++ = backlerp * oldNormal[0] + frontlerp * newNormal[0]; + *na++ = backlerp * oldNormal[1] + frontlerp * newNormal[1]; + *na++ = backlerp * oldNormal[2] + frontlerp * newNormal[2]; + } - if (qglLockArraysEXT != 0) - qglLockArraysEXT(0, paliashdr->num_xyz); + if (qglLockArraysEXT != 0) + qglLockArraysEXT(0, paliashdr->num_xyz); - while (1) { - /* get the vertex count and primitive type */ - count = *order++; - if (!count) - break; /* done */ - if (count < 0) { - count = -count; - qglBegin(GL_TRIANGLE_FAN); - } else { - qglBegin(GL_TRIANGLE_STRIP); + while (1) { + /* get the vertex count and primitive type */ + count = *order++; + if (!count) + break; /* done */ + if (count < 0) { + count = -count; + qglBegin(GL_TRIANGLE_FAN); + } else { + qglBegin(GL_TRIANGLE_STRIP); + } + do { + /* texture coordinates come from the draw list */ + qglTexCoord2f(((float *) order)[0], ((float *) order)[1]); + order += 2; + + qglArrayElement(*order++); + } while (--count); + + qglEnd(); } - do { - /* texture coordinates come from the draw list */ - qglTexCoord2f(((float *) order)[0], ((float *) order)[1]); - order += 2; - qglArrayElement(*order++); - } while (--count); + if (qglUnlockArraysEXT != 0) + qglUnlockArraysEXT(); + } else { + int index_xyz; + float light, alpha; + newNormal = r_avertexnormals[v->lightnormalindex]; - qglEnd(); + if (currententity->flags & RF_TRANSLUCENT) + alpha = currententity->alpha; + else + alpha = 1.0; + + while (1){ + /* get the vertex count and primitive type */ + count = *order++; + if (!count) + break; /* done */ + if (count < 0){ + count = -count; + qglBegin(GL_TRIANGLE_FAN); + } else { + qglBegin(GL_TRIANGLE_STRIP); + } + + do { + /* texture coordinates come from the draw list */ + qglTexCoord2f(((float *)order)[0], ((float *)order)[1]); + index_xyz = order[2]; + order += 3; + + /* normals and vertexes come from the frame list */ + light = newNormal[verts[index_xyz].lightnormalindex]; + + qglColor4f(light, light, light, alpha); + qglVertex3fv(s_lerped[index_xyz]); + } while (--count); + + qglEnd(); + } } - - if (qglUnlockArraysEXT != 0) - qglUnlockArraysEXT(); } /**