diff options
author | Andrey Nazarov <skuller@skuller.net> | 2010-09-15 22:41:27 +0400 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2010-09-15 22:41:27 +0400 |
commit | cd8d25aa0b96b48e1a6d0edf9893afe9cbf796c1 (patch) | |
tree | 322d2ed47d1ab4c7afdd5e70f34829f252877872 /source/sw_alias.c | |
parent | de41ad148d857184ead919fa488fd58cec5b1864 (diff) |
Renamed source tree subdirectory into ‘src’, moved ‘asm’ subdirectory there and renamed it into ‘i386’.
Diffstat (limited to 'source/sw_alias.c')
-rw-r--r-- | source/sw_alias.c | 795 |
1 files changed, 0 insertions, 795 deletions
diff --git a/source/sw_alias.c b/source/sw_alias.c deleted file mode 100644 index 33f52b6..0000000 --- a/source/sw_alias.c +++ /dev/null @@ -1,795 +0,0 @@ -/* -Copyright (C) 1997-2001 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 the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -*/ -// r_alias.c: routines for setting up to draw alias models - -/* -** use a real variable to control lerping -*/ -#include "sw_local.h" - -#define LIGHT_MIN 5 // lowest light value we'll allow, to avoid the - // need for inner-loop light clamping - -//PGM -extern byte iractive; -//PGM - -int r_amodels_drawn; - -affinetridesc_t r_affinetridesc; - -vec3_t r_plightvec; -vec3_t r_lerped[1024]; -vec3_t r_lerp_frontv, r_lerp_backv, r_lerp_move; - -int r_ambientlight; -int r_aliasblendcolor; -float r_shadelight; - - -maliasframe_t *r_thisframe, *r_lastframe; - -float aliastransform[3][4]; -float aliasworldtransform[3][4]; -float aliasoldworldtransform[3][4]; - -static float s_ziscale; -static vec3_t s_alias_forward, s_alias_right, s_alias_up; - -#define BBOX_TRIVIAL_ACCEPT 0 -#define BBOX_MUST_CLIP_XY 1 -#define BBOX_MUST_CLIP_Z 2 -#define BBOX_TRIVIAL_REJECT 8 - -/* -================ -R_AliasTransformVector -================ -*/ -void R_AliasTransformVector(vec3_t in, vec3_t out, float xf[3][4] ) -{ - out[0] = DotProduct(in, xf[0]) + xf[0][3]; - out[1] = DotProduct(in, xf[1]) + xf[1][3]; - out[2] = DotProduct(in, xf[2]) + xf[2][3]; -} - - -/* -** R_AliasCheckFrameBBox -** -** Checks a specific alias frame bounding box -*/ -unsigned long R_AliasCheckFrameBBox( maliasframe_t *frame, float worldxf[3][4] ) -{ - unsigned long aggregate_and_clipcode = ~0U, - aggregate_or_clipcode = 0; - int i; - vec3_t mins, maxs; - vec3_t transformed_min, transformed_max; - qboolean zclipped = qfalse, zfullyclipped = qtrue; - - /* - ** get the exact frame bounding box - */ - for (i=0 ; i<3 ; i++) - { - mins[i] = frame->translate[i]; - maxs[i] = mins[i] + frame->scale[i]*255; - } - - /* - ** transform the min and max values into view space - */ - R_AliasTransformVector( mins, transformed_min, aliastransform ); - R_AliasTransformVector( maxs, transformed_max, aliastransform ); - - if ( transformed_min[2] >= ALIAS_Z_CLIP_PLANE ) - zfullyclipped = qfalse; - if ( transformed_max[2] >= ALIAS_Z_CLIP_PLANE ) - zfullyclipped = qfalse; - - if ( zfullyclipped ) - { - return BBOX_TRIVIAL_REJECT; - } - if ( zclipped ) - { - return ( BBOX_MUST_CLIP_XY | BBOX_MUST_CLIP_Z ); - } - - /* - ** build a transformed bounding box from the given min and max - */ - for ( i = 0; i < 8; i++ ) - { - int j; - vec3_t tmp, transformed; - unsigned long clipcode = 0; - - if ( i & 1 ) - tmp[0] = mins[0]; - else - tmp[0] = maxs[0]; - - if ( i & 2 ) - tmp[1] = mins[1]; - else - tmp[1] = maxs[1]; - - if ( i & 4 ) - tmp[2] = mins[2]; - else - tmp[2] = maxs[2]; - - R_AliasTransformVector( tmp, transformed, worldxf ); - - for ( j = 0; j < 4; j++ ) - { - float dp = DotProduct( transformed, view_clipplanes[j].normal ); - - if ( ( dp - view_clipplanes[j].dist ) < 0.0F ) - clipcode |= 1 << j; - } - - aggregate_and_clipcode &= clipcode; - aggregate_or_clipcode |= clipcode; - } - - if ( aggregate_and_clipcode ) - { - return BBOX_TRIVIAL_REJECT; - } - if ( !aggregate_or_clipcode ) - { - return BBOX_TRIVIAL_ACCEPT; - } - - return BBOX_MUST_CLIP_XY; -} - -/* -================ -R_AliasCheckBBox -================ -*/ -qboolean R_AliasCheckBBox (void) -{ - unsigned long ccodes[2] = { 0, 0 }; - - ccodes[0] = R_AliasCheckFrameBBox( r_thisframe, aliasworldtransform ); - - /* - ** non-lerping model - */ - if ( currententity->backlerp == 0 ) - { - if ( ccodes[0] == BBOX_TRIVIAL_ACCEPT ) - return BBOX_TRIVIAL_ACCEPT; - else if ( ccodes[0] & BBOX_TRIVIAL_REJECT ) - return BBOX_TRIVIAL_REJECT; - else - return ( ccodes[0] & ~BBOX_TRIVIAL_REJECT ); - } - - ccodes[1] = R_AliasCheckFrameBBox( r_lastframe, aliasoldworldtransform ); - - if ( ( ccodes[0] | ccodes[1] ) == BBOX_TRIVIAL_ACCEPT ) - return BBOX_TRIVIAL_ACCEPT; - else if ( ( ccodes[0] & ccodes[1] ) & BBOX_TRIVIAL_REJECT ) - return BBOX_TRIVIAL_REJECT; - else - return ( ccodes[0] | ccodes[1] ) & ~BBOX_TRIVIAL_REJECT; -} - - -/* -================ -R_AliasProjectAndClipTestFinalVert -================ -*/ -void R_AliasProjectAndClipTestFinalVert( finalvert_t *fv ) -{ - float zi; - float x, y, z; - - // project points - x = fv->xyz[0]; - y = fv->xyz[1]; - z = fv->xyz[2]; - zi = 1.0 / z; - - fv->zi = zi * s_ziscale; - - fv->u = (x * aliasxscale * zi) + aliasxcenter; - fv->v = (y * aliasyscale * zi) + aliasycenter; - - if (fv->u < r_refdef.aliasvrect.x) - fv->flags |= ALIAS_LEFT_CLIP; - if (fv->v < r_refdef.aliasvrect.y) - fv->flags |= ALIAS_TOP_CLIP; - if (fv->u > r_refdef.aliasvrectright) - fv->flags |= ALIAS_RIGHT_CLIP; - if (fv->v > r_refdef.aliasvrectbottom) - fv->flags |= ALIAS_BOTTOM_CLIP; -} - -/* -================ -R_AliasTransformFinalVerts -================ -*/ -static void R_AliasTransformFinalVerts( int numpoints, finalvert_t *fv, maliasvert_t *oldv, maliasvert_t *newv ) -{ - int i; - - for ( i = 0; i < numpoints; i++, fv++, oldv++, newv++ ) - { - int temp; - float lightcos; - const vec_t *plightnormal; - vec3_t lerped_vert; - - lerped_vert[0] = r_lerp_move[0] + oldv->v[0]*r_lerp_backv[0] + newv->v[0]*r_lerp_frontv[0]; - lerped_vert[1] = r_lerp_move[1] + oldv->v[1]*r_lerp_backv[1] + newv->v[1]*r_lerp_frontv[1]; - lerped_vert[2] = r_lerp_move[2] + oldv->v[2]*r_lerp_backv[2] + newv->v[2]*r_lerp_frontv[2]; - - plightnormal = bytedirs[newv->lightnormalindex]; - - // PMM - added double damage shell - if ( currententity->flags & ( RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE | RF_SHELL_HALF_DAM) ) - { - lerped_vert[0] += plightnormal[0] * POWERSUIT_SCALE; - lerped_vert[1] += plightnormal[1] * POWERSUIT_SCALE; - lerped_vert[2] += plightnormal[2] * POWERSUIT_SCALE; - } - - fv->xyz[0] = DotProduct(lerped_vert, aliastransform[0]) + aliastransform[0][3]; - fv->xyz[1] = DotProduct(lerped_vert, aliastransform[1]) + aliastransform[1][3]; - fv->xyz[2] = DotProduct(lerped_vert, aliastransform[2]) + aliastransform[2][3]; - - fv->flags = 0; - - // lighting - lightcos = DotProduct (plightnormal, r_plightvec); - temp = r_ambientlight; - - if (lightcos < 0) - { - temp += (int)(r_shadelight * lightcos); - - // clamp; because we limited the minimum ambient and shading light, we - // don't have to clamp low light, just bright - if (temp < 0) - temp = 0; - } - - fv->l = temp; - - if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE ) - { - fv->flags |= ALIAS_Z_CLIP; - } - else - { - R_AliasProjectAndClipTestFinalVert( fv ); - } - } -} - - -/* -================ -R_AliasPreparePoints - -General clipped case -================ -*/ -static void R_AliasPreparePoints (void) { - int i; - maliasst_t *pstverts; - maliastri_t *ptri; - finalvert_t *pfv[3]; - finalvert_t finalverts[MAXALIASVERTS + - ((CACHE_SIZE - 1) / sizeof(finalvert_t)) + 3]; - finalvert_t *pfinalverts; - -//PGM - iractive = (r_newrefdef.rdflags & RDF_IRGOGGLES && currententity->flags & RF_IR_VISIBLE); -// iractive = 0; -// if(r_newrefdef.rdflags & RDF_IRGOGGLES && currententity->flags & RF_IR_VISIBLE) -// iractive = 1; -//PGM - - // put work vertexes on stack, cache aligned - pfinalverts = (finalvert_t *) - (((long)&finalverts[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1)); - - R_AliasTransformFinalVerts( currentmodel->numverts, pfinalverts, - r_lastframe->verts, r_thisframe->verts ); - -// clip and draw all triangles -// - pstverts = currentmodel->sts; - ptri = currentmodel->tris; - - if ( ( currententity->flags & (RF_WEAPONMODEL|RF_LEFTHAND) ) == (RF_WEAPONMODEL|RF_LEFTHAND) ) - { - for (i=0 ; i<currentmodel->numtris ; i++, ptri++) - { - pfv[0] = &pfinalverts[ptri->index_xyz[0]]; - pfv[1] = &pfinalverts[ptri->index_xyz[1]]; - pfv[2] = &pfinalverts[ptri->index_xyz[2]]; - - if ( pfv[0]->flags & pfv[1]->flags & pfv[2]->flags ) - continue; // completely clipped - - // insert s/t coordinates - pfv[0]->s = pstverts[ptri->index_st[0]].s << 16; - pfv[0]->t = pstverts[ptri->index_st[0]].t << 16; - - pfv[1]->s = pstverts[ptri->index_st[1]].s << 16; - pfv[1]->t = pstverts[ptri->index_st[1]].t << 16; - - pfv[2]->s = pstverts[ptri->index_st[2]].s << 16; - pfv[2]->t = pstverts[ptri->index_st[2]].t << 16; - - if ( ! (pfv[0]->flags | pfv[1]->flags | pfv[2]->flags) ) - { // totally unclipped - aliastriangleparms.a = pfv[2]; - aliastriangleparms.b = pfv[1]; - aliastriangleparms.c = pfv[0]; - - R_DrawTriangle(); - } - else - { - R_AliasClipTriangle (pfv[2], pfv[1], pfv[0]); - } - } - } - else - { - for (i=0 ; i<currentmodel->numtris ; i++, ptri++) - { - pfv[0] = &pfinalverts[ptri->index_xyz[0]]; - pfv[1] = &pfinalverts[ptri->index_xyz[1]]; - pfv[2] = &pfinalverts[ptri->index_xyz[2]]; - - if ( pfv[0]->flags & pfv[1]->flags & pfv[2]->flags ) - continue; // completely clipped - - // insert s/t coordinates - pfv[0]->s = pstverts[ptri->index_st[0]].s << 16; - pfv[0]->t = pstverts[ptri->index_st[0]].t << 16; - - pfv[1]->s = pstverts[ptri->index_st[1]].s << 16; - pfv[1]->t = pstverts[ptri->index_st[1]].t << 16; - - pfv[2]->s = pstverts[ptri->index_st[2]].s << 16; - pfv[2]->t = pstverts[ptri->index_st[2]].t << 16; - - if ( ! (pfv[0]->flags | pfv[1]->flags | pfv[2]->flags) ) - { // totally unclipped - aliastriangleparms.a = pfv[0]; - aliastriangleparms.b = pfv[1]; - aliastriangleparms.c = pfv[2]; - - R_DrawTriangle(); - } - else - { // partially clipped - R_AliasClipTriangle (pfv[0], pfv[1], pfv[2]); - } - } - } -} - - -/* -================ -R_AliasSetUpTransform -================ -*/ -static void R_AliasSetUpTransform (void) -{ - int i; - static float viewmatrix[3][4]; - vec3_t angles; - -// TODO: should really be stored with the entity instead of being reconstructed -// TODO: should use a look-up table -// TODO: could cache lazily, stored in the entity -// - angles[ROLL] = currententity->angles[ROLL]; - angles[PITCH] = currententity->angles[PITCH]; - angles[YAW] = currententity->angles[YAW]; - AngleVectors( angles, s_alias_forward, s_alias_right, s_alias_up ); - -// TODO: can do this with simple matrix rearrangement - - memset( aliasworldtransform, 0, sizeof( aliasworldtransform ) ); - memset( aliasoldworldtransform, 0, sizeof( aliasworldtransform ) ); - - for (i=0 ; i<3 ; i++) - { - aliasoldworldtransform[i][0] = aliasworldtransform[i][0] = s_alias_forward[i]; - aliasoldworldtransform[i][0] = aliasworldtransform[i][1] = -s_alias_right[i]; - aliasoldworldtransform[i][0] = aliasworldtransform[i][2] = s_alias_up[i]; - } - - aliasworldtransform[0][3] = currententity->origin[0]-r_origin[0]; - aliasworldtransform[1][3] = currententity->origin[1]-r_origin[1]; - aliasworldtransform[2][3] = currententity->origin[2]-r_origin[2]; - - aliasoldworldtransform[0][3] = currententity->oldorigin[0]-r_origin[0]; - aliasoldworldtransform[1][3] = currententity->oldorigin[1]-r_origin[1]; - aliasoldworldtransform[2][3] = currententity->oldorigin[2]-r_origin[2]; - -// FIXME: can do more efficiently than full concatenation -// memcpy( rotationmatrix, t2matrix, sizeof( rotationmatrix ) ); - -// R_ConcatTransforms (t2matrix, tmatrix, rotationmatrix); - -// TODO: should be global, set when vright, etc., set - VectorCopy (vright, viewmatrix[0]); - VectorCopy (vup, viewmatrix[1]); - VectorNegate (viewmatrix[1], viewmatrix[1]); - VectorCopy (vpn, viewmatrix[2]); - - viewmatrix[0][3] = 0; - viewmatrix[1][3] = 0; - viewmatrix[2][3] = 0; - -// memcpy( aliasworldtransform, rotationmatrix, sizeof( aliastransform ) ); - - R_ConcatTransforms (viewmatrix, aliasworldtransform, aliastransform); - - aliasworldtransform[0][3] = currententity->origin[0]; - aliasworldtransform[1][3] = currententity->origin[1]; - aliasworldtransform[2][3] = currententity->origin[2]; - - aliasoldworldtransform[0][3] = currententity->oldorigin[0]; - aliasoldworldtransform[1][3] = currententity->oldorigin[1]; - aliasoldworldtransform[2][3] = currententity->oldorigin[2]; -} - -/* -=============== -R_AliasSetupSkin -=============== -*/ -static qboolean R_AliasSetupSkin (void) -{ - int skinnum; - image_t *pskindesc; - - if (currententity->skin) - pskindesc = IMG_ForHandle( currententity->skin ); - else - { - skinnum = currententity->skinnum; - if ((skinnum >= currentmodel->numskins) || (skinnum < 0)) - { - Com_DPrintf( "R_AliasSetupSkin %s: no such skin # %d\n", - currentmodel->name, skinnum); - skinnum = 0; - } - - pskindesc = currentmodel->skins[skinnum]; - } - - if ( !pskindesc ) - return qfalse; - - r_affinetridesc.pskin = pskindesc->pixels[0]; - r_affinetridesc.skinwidth = pskindesc->width; - r_affinetridesc.skinheight = pskindesc->height; - - R_PolysetUpdateTables (); // FIXME: precalc edge lookups - - return qtrue; -} - - -/* -================ -R_AliasSetupLighting - - FIXME: put lighting into tables -================ -*/ -static void R_AliasSetupLighting (void) -{ - alight_t lighting; - float lightvec[3] = {-1, 0, 0}; - vec3_t light; - int i, j; - - // all components of light should be identical in software - if ( currententity->flags & RF_FULLBRIGHT ) - { - for (i=0 ; i<3 ; i++) - light[i] = 1.0; - } - else - { - R_LightPoint (currententity->origin, light); - } - - - if ( currententity->flags & RF_MINLIGHT ) - { - for (i=0 ; i<3 ; i++) - if (light[i] < 0.1) - light[i] = 0.1; - } - - if ( currententity->flags & RF_GLOW ) - { // bonus items will pulse with time - float scale; - float min; - - scale = 0.1 * sin(r_newrefdef.time*7); - for (i=0 ; i<3 ; i++) - { - min = light[i] * 0.8; - light[i] += scale; - if (light[i] < min) - light[i] = min; - } - } - - j = (light[0] + light[1] + light[2])*0.3333*255; - - lighting.ambientlight = j; - lighting.shadelight = j; - - lighting.plightvec = lightvec; - -// clamp lighting so it doesn't overbright as much - if (lighting.ambientlight > 128) - lighting.ambientlight = 128; - if (lighting.ambientlight + lighting.shadelight > 192) - lighting.shadelight = 192 - lighting.ambientlight; - -// guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't have -// to clamp off the bottom - r_ambientlight = lighting.ambientlight; - - if (r_ambientlight < LIGHT_MIN) - r_ambientlight = LIGHT_MIN; - - r_ambientlight = (255 - r_ambientlight) << VID_CBITS; - - if (r_ambientlight < LIGHT_MIN) - r_ambientlight = LIGHT_MIN; - - r_shadelight = lighting.shadelight; - - if (r_shadelight < 0) - r_shadelight = 0; - - r_shadelight *= VID_GRADES; - -// rotate the lighting vector into the model's frame of reference - r_plightvec[0] = DotProduct( lighting.plightvec, s_alias_forward ); - r_plightvec[1] = -DotProduct( lighting.plightvec, s_alias_right ); - r_plightvec[2] = DotProduct( lighting.plightvec, s_alias_up ); -} - - -/* -================= -R_AliasSetupFrames - -================= -*/ -static void R_AliasSetupFrames( void ) { - int thisframe = currententity->frame; - int lastframe = currententity->oldframe; - - if( thisframe >= currentmodel->numframes || thisframe < 0 ) { - Com_DPrintf( "%s: %s: no such thisframe %d\n", - __func__, currentmodel->name, thisframe); - thisframe = 0; - } - if( lastframe >= currentmodel->numframes || lastframe < 0 ) { - Com_DPrintf( "%s: %s: no such lastframe %d\n", - __func__, currentmodel->name, lastframe); - lastframe = 0; - } - - r_thisframe = ¤tmodel->frames[thisframe]; - r_lastframe = ¤tmodel->frames[lastframe]; -} - -/* -** R_AliasSetUpLerpData -** -** Precomputes lerp coefficients used for the whole frame. -*/ -static void R_AliasSetUpLerpData( float backlerp ) -{ - float frontlerp; - vec3_t translation, vectors[3]; - int i; - - frontlerp = 1.0F - backlerp; - - /* - ** convert entity's angles into discrete vectors for R, U, and F - */ - AngleVectors (currententity->angles, vectors[0], vectors[1], vectors[2]); - - /* - ** translation is the vector from last position to this position - */ - VectorSubtract (currententity->oldorigin, currententity->origin, translation); - - /* - ** move should be the delta back to the previous frame * backlerp - */ - r_lerp_move[0] = DotProduct(translation, vectors[0]); // forward - r_lerp_move[1] = -DotProduct(translation, vectors[1]); // left - r_lerp_move[2] = DotProduct(translation, vectors[2]); // up - - VectorAdd( r_lerp_move, r_lastframe->translate, r_lerp_move ); - - for (i=0 ; i<3 ; i++) - { - r_lerp_move[i] = backlerp*r_lerp_move[i] + frontlerp * r_thisframe->translate[i]; - } - - for (i=0 ; i<3 ; i++) - { - r_lerp_frontv[i] = frontlerp * r_thisframe->scale[i]; - r_lerp_backv[i] = backlerp * r_lastframe->scale[i]; - } -} - -static void R_AliasSetupBlend( void ) { - extern void (*d_pdrawspans)( void * ); - extern void R_PolysetDrawSpans8_Opaque( void * ); - extern void R_PolysetDrawSpans8_33( void * ); - extern void R_PolysetDrawSpans8_66( void * ); - extern void R_PolysetDrawSpansConstant8_33( void * ); - extern void R_PolysetDrawSpansConstant8_66( void * ); - - int color; - - /* - ** select the proper span routine based on translucency - */ - // PMM - added double damage shell - // PMM - reordered to handle blending - color = currententity->flags & ( RF_SHELL_RED | RF_SHELL_GREEN | RF_SHELL_BLUE | RF_SHELL_DOUBLE | RF_SHELL_HALF_DAM); - if ( color ) - { - // PMM - added double - // PMM - reordered, new shells after old shells (so they get overriden) - if ( color == RF_SHELL_RED ) - r_aliasblendcolor = SHELL_RED_COLOR; - else if ( color == RF_SHELL_GREEN ) - r_aliasblendcolor = SHELL_GREEN_COLOR; - else if ( color == RF_SHELL_BLUE ) - r_aliasblendcolor = SHELL_BLUE_COLOR; - else if ( color == (RF_SHELL_RED | RF_SHELL_GREEN) ) - r_aliasblendcolor = SHELL_RG_COLOR; - else if ( color == (RF_SHELL_RED | RF_SHELL_BLUE) ) - r_aliasblendcolor = SHELL_RB_COLOR; - else if ( color == (RF_SHELL_BLUE | RF_SHELL_GREEN) ) - r_aliasblendcolor = SHELL_BG_COLOR; - - // PMM - added this .. it's yellowish - else if ( color == (RF_SHELL_DOUBLE) ) - r_aliasblendcolor = SHELL_DOUBLE_COLOR; - else if ( color == (RF_SHELL_HALF_DAM) ) - r_aliasblendcolor = SHELL_HALF_DAM_COLOR; - // pmm - else - r_aliasblendcolor = SHELL_WHITE_COLOR; - - if ( currententity->alpha > 0.33 ) - d_pdrawspans = R_PolysetDrawSpansConstant8_66; - else - d_pdrawspans = R_PolysetDrawSpansConstant8_33; - - } - else if ( currententity->flags & RF_TRANSLUCENT ) - { - if ( currententity->alpha > 0.66 ) - d_pdrawspans = R_PolysetDrawSpans8_Opaque; - else if ( currententity->alpha > 0.33 ) - d_pdrawspans = R_PolysetDrawSpans8_66; - else - d_pdrawspans = R_PolysetDrawSpans8_33; - } - else - { - d_pdrawspans = R_PolysetDrawSpans8_Opaque; - } -} - -/* -================ -R_AliasDrawModel -================ -*/ -void R_AliasDrawModel (void) -{ - if ( r_lerpmodels->value == 0 ) - currententity->backlerp = 0; - - if ( ( currententity->flags & (RF_WEAPONMODEL|RF_LEFTHAND) ) == (RF_WEAPONMODEL|RF_LEFTHAND) ) - { - aliasxscale = -aliasxscale; - } - - /* - ** we have to set our frame pointers and transformations before - ** doing any real work - */ - R_AliasSetupFrames(); - R_AliasSetUpTransform(); - - // see if the bounding box lets us trivially reject, also sets - // trivial accept status - if ( R_AliasCheckBBox() == BBOX_TRIVIAL_REJECT ) - { - if ( ( currententity->flags & (RF_WEAPONMODEL|RF_LEFTHAND) ) == (RF_WEAPONMODEL|RF_LEFTHAND) ) - { - aliasxscale = -aliasxscale; - } - return; - } - - // set up the skin and verify it exists - if ( !R_AliasSetupSkin () ) - { - Com_DPrintf( "R_AliasDrawModel %s: NULL skin found\n", - currentmodel->name); - return; - } - - r_amodels_drawn++; - R_AliasSetupLighting (); - - R_AliasSetupBlend(); - - /* - ** compute this_frame and old_frame addresses - */ - R_AliasSetUpLerpData( currententity->backlerp ); - - if (currententity->flags & RF_DEPTHHACK) - s_ziscale = (float)0x8000 * (float)0x10000 * 3.0; - else - s_ziscale = (float)0x8000 * (float)0x10000; - - R_AliasPreparePoints (); - - if ( ( currententity->flags & (RF_WEAPONMODEL|RF_LEFTHAND) ) == (RF_WEAPONMODEL|RF_LEFTHAND) ) - { - aliasxscale = -aliasxscale; - } -} - - - |