diff options
Diffstat (limited to 'src/refresh/gl/mesh.c')
-rw-r--r-- | src/refresh/gl/mesh.c | 119 |
1 files changed, 48 insertions, 71 deletions
diff --git a/src/refresh/gl/mesh.c b/src/refresh/gl/mesh.c index e1650c3..e469339 100644 --- a/src/refresh/gl/mesh.c +++ b/src/refresh/gl/mesh.c @@ -127,10 +127,10 @@ static void tess_static_shade(const maliasmesh_t *mesh) dst_vert[0] = src_vert->pos[0] * newscale[0] + translate[0]; dst_vert[1] = src_vert->pos[1] * newscale[1] + translate[1]; dst_vert[2] = src_vert->pos[2] * newscale[2] + translate[2]; - dst_vert[3] = shadelight[0] * d; - dst_vert[4] = shadelight[1] * d; - dst_vert[5] = shadelight[2] * d; - dst_vert[6] = shadelight[3]; + dst_vert[4] = shadelight[0] * d; + dst_vert[5] = shadelight[1] * d; + dst_vert[6] = shadelight[2] * d; + dst_vert[7] = shadelight[3]; dst_vert += VERTEX_SIZE; src_vert++; @@ -220,10 +220,10 @@ static void tess_lerped_shade(const maliasmesh_t *mesh) dst_vert[2] = src_oldvert->pos[2] * oldscale[2] + src_newvert->pos[2] * newscale[2] + translate[2]; - dst_vert[3] = shadelight[0] * d; - dst_vert[4] = shadelight[1] * d; - dst_vert[5] = shadelight[2] * d; - dst_vert[6] = shadelight[3]; + dst_vert[4] = shadelight[0] * d; + dst_vert[5] = shadelight[1] * d; + dst_vert[6] = shadelight[2] * d; + dst_vert[7] = shadelight[3]; dst_vert += VERTEX_SIZE; src_oldvert++; @@ -424,29 +424,19 @@ static void draw_celshading(maliasmesh_t *mesh) if (celscale < 0.01f || celscale > 1) return; - GL_Bits(GLS_BLEND_BLEND); - qglDisable(GL_TEXTURE_2D); + GL_BindTexture(0, TEXNUM_BLACK); + GL_StateBits(GLS_BLEND_BLEND); + GL_ArrayBits(GLA_VERTEX); + qglLineWidth(gl_celshading->value * celscale); qglPolygonMode(GL_FRONT_AND_BACK, GL_LINE); qglCullFace(GL_FRONT); - - qglDisableClientState(GL_TEXTURE_COORD_ARRAY); - if (shadelight) - qglDisableClientState(GL_COLOR_ARRAY); - qglColor4f(0, 0, 0, color[3] * celscale); - qglDrawElements(GL_TRIANGLES, mesh->numindices, GL_UNSIGNED_INT, + qglDrawElements(GL_TRIANGLES, mesh->numindices, QGL_INDEX_ENUM, mesh->indices); - qglColor4fv(color); - - if (shadelight) - qglEnableClientState(GL_COLOR_ARRAY); - qglEnableClientState(GL_TEXTURE_COORD_ARRAY); - qglCullFace(GL_BACK); qglPolygonMode(GL_FRONT_AND_BACK, GL_FILL); qglLineWidth(1); - qglEnable(GL_TEXTURE_2D); } static void setup_shadow(void) @@ -530,7 +520,7 @@ static void draw_shadow(maliasmesh_t *mesh) return; // load shadow projection matrix - qglLoadMatrixf(shadowmatrix); + GL_LoadMatrix(shadowmatrix); // eliminate z-fighting by utilizing stencil buffer, if available if (gl_config.stencilbits) { @@ -539,26 +529,17 @@ static void draw_shadow(maliasmesh_t *mesh) qglStencilOp(GL_KEEP, GL_KEEP, GL_INCR); } - GL_Bits(GLS_BLEND_BLEND); - GL_TexEnv(GL_MODULATE); - GL_BindTexture(TEXNUM_WHITE); - - qglDisableClientState(GL_TEXTURE_COORD_ARRAY); - if (shadelight) - qglDisableClientState(GL_COLOR_ARRAY); + GL_StateBits(GLS_BLEND_BLEND); + GL_BindTexture(0, TEXNUM_WHITE); + GL_ArrayBits(GLA_VERTEX); qglEnable(GL_POLYGON_OFFSET_FILL); qglPolygonOffset(-1.0f, -2.0f); qglColor4f(0, 0, 0, color[3] * 0.5f); - qglDrawElements(GL_TRIANGLES, mesh->numindices, GL_UNSIGNED_INT, + qglDrawElements(GL_TRIANGLES, mesh->numindices, QGL_INDEX_ENUM, mesh->indices); - qglColor4fv(color); qglDisable(GL_POLYGON_OFFSET_FILL); - if (shadelight) - qglEnableClientState(GL_COLOR_ARRAY); - qglEnableClientState(GL_TEXTURE_COORD_ARRAY); - // once we have drawn something to stencil buffer, continue to clear it for // the lifetime of OpenGL context. leaving stencil buffer "dirty" and // clearing just depth is slower (verified for Nvidia and ATI drivers). @@ -566,9 +547,6 @@ static void draw_shadow(maliasmesh_t *mesh) qglDisable(GL_STENCIL_TEST); gl_static.stencil_buffer_bit |= GL_STENCIL_BUFFER_BIT; } - - // fall back to entity matrix - qglLoadMatrixf(glr.entmatrix); } static int texnum_for_mesh(maliasmesh_t *mesh) @@ -597,30 +575,46 @@ static int texnum_for_mesh(maliasmesh_t *mesh) static void draw_alias_mesh(maliasmesh_t *mesh) { + glStateBits_t state = GLS_DEFAULT; + + // fall back to entity matrix + GL_LoadMatrix(glr.entmatrix); + + if (shadelight) + state |= GLS_SHADE_SMOOTH; + if (glr.ent->flags & RF_TRANSLUCENT) - GL_Bits(GLS_BLEND_BLEND | GLS_DEPTHMASK_FALSE); - else - GL_Bits(GLS_DEFAULT); + state |= GLS_BLEND_BLEND | GLS_DEPTHMASK_FALSE; + + GL_StateBits(state); - GL_TexEnv(GL_MODULATE); - GL_BindTexture(texnum_for_mesh(mesh)); + GL_BindTexture(0, texnum_for_mesh(mesh)); (*tessfunc)(mesh); c.trisDrawn += mesh->numverts; - qglTexCoordPointer(2, GL_FLOAT, 0, mesh->tcoords); + if (shadelight) { + GL_ArrayBits(GLA_VERTEX | GLA_TC | GLA_COLOR); + GL_VertexPointer(3, VERTEX_SIZE, tess.vertices); + GL_ColorFloatPointer(4, VERTEX_SIZE, tess.vertices + 4); + } else { + GL_ArrayBits(GLA_VERTEX | GLA_TC); + GL_VertexPointer(3, 4, tess.vertices); + qglColor4fv(color); + } - if (qglLockArraysEXT) - qglLockArraysEXT(0, mesh->numverts); + GL_TexCoordPointer(2, 0, (GLfloat *)mesh->tcoords); - qglDrawElements(GL_TRIANGLES, mesh->numindices, GL_UNSIGNED_INT, + GL_LockArrays(mesh->numverts); + + qglDrawElements(GL_TRIANGLES, mesh->numindices, QGL_INDEX_ENUM, mesh->indices); draw_celshading(mesh); if (gl_showtris->integer) { GL_EnableOutlines(); - qglDrawElements(GL_TRIANGLES, mesh->numindices, GL_UNSIGNED_INT, + qglDrawElements(GL_TRIANGLES, mesh->numindices, QGL_INDEX_ENUM, mesh->indices); GL_DisableOutlines(); } @@ -628,15 +622,14 @@ static void draw_alias_mesh(maliasmesh_t *mesh) // FIXME: unlock arrays before changing matrix? draw_shadow(mesh); - if (qglUnlockArraysEXT) - qglUnlockArraysEXT(); + GL_UnlockArrays(); } void GL_DrawAliasModel(model_t *model) { entity_t *ent = glr.ent; glCullResult_t cull; - maliasmesh_t *mesh, *last; + int i; newframenum = ent->frame; if (newframenum < 0 || newframenum >= model->numframes) { @@ -692,7 +685,6 @@ void GL_DrawAliasModel(model_t *model) tess_static_plain : tess_lerped_plain; } - qglPushMatrix(); GL_RotateForEntity(origin); if ((ent->flags & (RF_WEAPONMODEL | RF_LEFTHAND)) == @@ -706,22 +698,9 @@ void GL_DrawAliasModel(model_t *model) if (ent->flags & RF_DEPTHHACK) qglDepthRange(0, 0.25f); - if (shadelight) { - qglVertexPointer(3, GL_FLOAT, 4 * VERTEX_SIZE, tess.vertices); - qglColorPointer(4, GL_FLOAT, 4 * VERTEX_SIZE, tess.vertices + 3); - qglEnableClientState(GL_COLOR_ARRAY); - } else { - qglVertexPointer(3, GL_FLOAT, 4 * 4, tess.vertices); - qglColor4fv(color); - } - // draw all the meshes - last = model->meshes + model->nummeshes; - for (mesh = model->meshes; mesh != last; mesh++) - draw_alias_mesh(mesh); - - if (shadelight) - qglDisableClientState(GL_COLOR_ARRAY); + for (i = 0; i < model->nummeshes; i++) + draw_alias_mesh(&model->meshes[i]); if (ent->flags & RF_DEPTHHACK) qglDepthRange(0, 1); @@ -733,7 +712,5 @@ void GL_DrawAliasModel(model_t *model) qglMatrixMode(GL_MODELVIEW); qglFrontFace(GL_CW); } - - qglPopMatrix(); } |