From 1c480bf75e464316fb0416b817ee17c265ae8ff3 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 2 Jan 2012 15:57:43 +0900 Subject: [PATCH] Merge the alias skin selection code. We really don't need 4 copies of identical code when 1 will do :P --- include/r_local.h | 1 + libs/video/renderer/Makefile.am | 4 +- libs/video/renderer/gl/gl_mod_alias.c | 41 ------------- libs/video/renderer/r_alias.c | 79 ++++++++++++++++++++++++++ libs/video/renderer/sw/sw_ralias.c | 32 +---------- libs/video/renderer/sw32/sw32_ralias.c | 30 +--------- 6 files changed, 86 insertions(+), 101 deletions(-) create mode 100644 libs/video/renderer/r_alias.c diff --git a/include/r_local.h b/include/r_local.h index e3340cfb1..072e52c5f 100644 --- a/include/r_local.h +++ b/include/r_local.h @@ -187,6 +187,7 @@ void R_DrawSolidClippedSubmodelPolygons (model_t *pmodel); void R_AddPolygonEdges (emitpoint_t *pverts, int numverts, int miplevel); surf_t *R_GetSurf (void); void R_AliasDrawModel (alight_t *plighting); +maliasskindesc_t *R_AliasGetSkindesc (int skinnum, aliashdr_t *ahdr); void R_BeginEdgeFrame (void); void R_ScanEdges (void); void D_DrawSurfaces (void); diff --git a/libs/video/renderer/Makefile.am b/libs/video/renderer/Makefile.am index 878c24943..c6d522d8b 100644 --- a/libs/video/renderer/Makefile.am +++ b/libs/video/renderer/Makefile.am @@ -10,8 +10,8 @@ EXTRA_LTLIBRARIES= libQFrenderer_sw.la libQFrenderer_sw32.la \ libQFrenderer_gl.la libQFrenderer_glsl.la common_sources= \ - crosshair.c r_cvar.c r_efrag.c r_ent.c r_graph.c r_light.c r_main.c \ - r_part.c r_progs.c r_screen.c + crosshair.c r_alias.c r_cvar.c r_efrag.c r_ent.c r_graph.c r_light.c \ + r_main.c r_part.c r_progs.c r_screen.c libQFrenderer_gl_la_LDFLAGS= -version-info $(QUAKE_LIBRARY_VERSION_INFO) -rpath $(libdir) libQFrenderer_gl_la_LIBADD= gl/libgl.la diff --git a/libs/video/renderer/gl/gl_mod_alias.c b/libs/video/renderer/gl/gl_mod_alias.c index 5188fcbaa..2c4cf2448 100644 --- a/libs/video/renderer/gl/gl_mod_alias.c +++ b/libs/video/renderer/gl/gl_mod_alias.c @@ -460,47 +460,6 @@ GL_GetAliasFrameVerts (int frame, aliashdr_t *paliashdr, entity_t *e) return vo; } -static maliasskindesc_t * -R_AliasGetSkindesc (int skinnum, aliashdr_t *ahdr) -{ - maliasskindesc_t *pskindesc; - maliasskingroup_t *paliasskingroup; - - if ((skinnum >= ahdr->mdl.numskins) || (skinnum < 0)) { - Sys_MaskPrintf (SYS_DEV, "R_AliasSetupSkin: no such skin # %d\n", - skinnum); - skinnum = 0; - } - - pskindesc = ((maliasskindesc_t *) - ((byte *) ahdr + ahdr->skindesc)) + skinnum; - - if (pskindesc->type == ALIAS_SKIN_GROUP) { - int numskins, i; - float fullskininterval, skintargettime, skintime; - float *pskinintervals; - - paliasskingroup = (maliasskingroup_t *) ((byte *) ahdr + - pskindesc->skin); - pskinintervals = (float *) - ((byte *) ahdr + paliasskingroup->intervals); - numskins = paliasskingroup->numskins; - fullskininterval = pskinintervals[numskins - 1]; - - skintime = r_realtime + currententity->syncbase; - - skintargettime = skintime - - ((int) (skintime / fullskininterval)) * fullskininterval; - for (i = 0; i < (numskins - 1); i++) { - if (pskinintervals[i] > skintargettime) - break; - } - pskindesc = &paliasskingroup->skindescs[i]; - } - - return pskindesc; -} - void R_DrawAliasModel (entity_t *e) { diff --git a/libs/video/renderer/r_alias.c b/libs/video/renderer/r_alias.c new file mode 100644 index 000000000..46f33f38a --- /dev/null +++ b/libs/video/renderer/r_alias.c @@ -0,0 +1,79 @@ +/* + r_alias.c + + Draw Alias Model + + Copyright (C) 1996-1997 Id Software, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to: + + Free Software Foundation, Inc. + 59 Temple Place - Suite 330 + Boston, MA 02111-1307, USA + +*/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "QF/sys.h" + +#include "r_local.h" + +static __attribute__ ((used)) const char rcsid[] = "$Id$"; + +VISIBLE maliasskindesc_t * +R_AliasGetSkindesc (int skinnum, aliashdr_t *ahdr) +{ + maliasskindesc_t *pskindesc; + maliasskingroup_t *paliasskingroup; + + if ((skinnum >= ahdr->mdl.numskins) || (skinnum < 0)) { + Sys_MaskPrintf (SYS_DEV, "R_AliasSetupSkin: no such skin # %d\n", + skinnum); + skinnum = 0; + } + + pskindesc = ((maliasskindesc_t *) + ((byte *) ahdr + ahdr->skindesc)) + skinnum; + + if (pskindesc->type == ALIAS_SKIN_GROUP) { + int numskins, i; + float fullskininterval, skintargettime, skintime; + float *pskinintervals; + + paliasskingroup = (maliasskingroup_t *) ((byte *) ahdr + + pskindesc->skin); + pskinintervals = (float *) + ((byte *) ahdr + paliasskingroup->intervals); + numskins = paliasskingroup->numskins; + fullskininterval = pskinintervals[numskins - 1]; + + skintime = r_realtime + currententity->syncbase; + + // when loading in Mod_LoadAliasSkinGroup, we guaranteed all interval + // values are positive, so we don't have to worry about division by 0 + skintargettime = skintime - + ((int) (skintime / fullskininterval)) * fullskininterval; + + for (i = 0; i < (numskins - 1); i++) { + if (pskinintervals[i] > skintargettime) + break; + } + pskindesc = &paliasskingroup->skindescs[i]; + } + + return pskindesc; +} diff --git a/libs/video/renderer/sw/sw_ralias.c b/libs/video/renderer/sw/sw_ralias.c index 724a1bb79..0da1f3fd3 100644 --- a/libs/video/renderer/sw/sw_ralias.c +++ b/libs/video/renderer/sw/sw_ralias.c @@ -545,10 +545,7 @@ R_AliasPrepareUnclippedPoints (void) static void R_AliasSetupSkin (void) { - int numskins, skinnum, i; - float skintargettime, skintime; - float *pskinintervals, fullskininterval; - maliasskingroup_t *paliasskingroup; + int skinnum; skinnum = currententity->skinnum; if ((skinnum >= pmdl->numskins) || (skinnum < 0)) { @@ -557,33 +554,10 @@ R_AliasSetupSkin (void) skinnum = 0; } - pskindesc = ((maliasskindesc_t *) - ((byte *) paliashdr + paliashdr->skindesc)) + skinnum; + pskindesc = R_AliasGetSkindesc (skinnum, paliashdr); + a_skinwidth = pmdl->skinwidth; - if (pskindesc->type == ALIAS_SKIN_GROUP) { - paliasskingroup = (maliasskingroup_t *) ((byte *) paliashdr + - pskindesc->skin); - pskinintervals = (float *) - ((byte *) paliashdr + paliasskingroup->intervals); - numskins = paliasskingroup->numskins; - fullskininterval = pskinintervals[numskins - 1]; - - skintime = r_realtime + currententity->syncbase; - - // when loading in Mod_LoadAliasSkinGroup, we guaranteed all interval - // values are positive, so we don't have to worry about division by 0 - skintargettime = skintime - - ((int) (skintime / fullskininterval)) * fullskininterval; - - for (i = 0; i < (numskins - 1); i++) { - if (pskinintervals[i] > skintargettime) - break; - } - - pskindesc = &paliasskingroup->skindescs[i]; - } - r_affinetridesc.pskindesc = pskindesc; r_affinetridesc.pskin = (void *) ((byte *) paliashdr + pskindesc->skin); r_affinetridesc.skinwidth = a_skinwidth; diff --git a/libs/video/renderer/sw32/sw32_ralias.c b/libs/video/renderer/sw32/sw32_ralias.c index 1c0dd9805..698b243e2 100644 --- a/libs/video/renderer/sw32/sw32_ralias.c +++ b/libs/video/renderer/sw32/sw32_ralias.c @@ -540,10 +540,6 @@ static void R_AliasSetupSkin (void) { int skinnum; - int i, numskins; - maliasskingroup_t *paliasskingroup; - float *pskinintervals, fullskininterval; - float skintargettime, skintime; skinnum = currententity->skinnum; if ((skinnum >= pmdl->numskins) || (skinnum < 0)) { @@ -552,33 +548,9 @@ R_AliasSetupSkin (void) skinnum = 0; } - pskindesc = ((maliasskindesc_t *) - ((byte *) paliashdr + paliashdr->skindesc)) + skinnum; + pskindesc = R_AliasGetSkindesc (skinnum, paliashdr); a_skinwidth = pmdl->skinwidth; - if (pskindesc->type == ALIAS_SKIN_GROUP) { - paliasskingroup = (maliasskingroup_t *) ((byte *) paliashdr + - pskindesc->skin); - pskinintervals = (float *) - ((byte *) paliashdr + paliasskingroup->intervals); - numskins = paliasskingroup->numskins; - fullskininterval = pskinintervals[numskins - 1]; - - skintime = r_realtime + currententity->syncbase; - - // when loading in Mod_LoadAliasSkinGroup, we guaranteed all interval - // values are positive, so we don't have to worry about division by 0 - skintargettime = skintime - - ((int) (skintime / fullskininterval)) * fullskininterval; - - for (i = 0; i < (numskins - 1); i++) { - if (pskinintervals[i] > skintargettime) - break; - } - - pskindesc = &paliasskingroup->skindescs[i]; - } - r_affinetridesc.pskindesc = pskindesc; r_affinetridesc.pskin = (void *) ((byte *) paliashdr + pskindesc->skin); r_affinetridesc.skinwidth = a_skinwidth;