ref_soft: studiomodel texturing, finally fix TRIANGLE_STRIP

This commit is contained in:
mittorn 2019-03-26 16:39:16 +07:00
parent 224bf07930
commit dbabb861f2
5 changed files with 58 additions and 24 deletions

View File

@ -1329,7 +1329,7 @@ void R_RenderFace (msurface_t *fa, int clipflags);
void R_ConcatTransforms (float in1[3][4], float in2[3][4], float out[3][4]);
void R_RenderTriangle( finalvert_t *pfv );
void R_RenderTriangle( finalvert_t *fv1 , finalvert_t *fv2, finalvert_t *fv3 );
void R_SetupFinalVert( finalvert_t *fv, float x, float y, float z, int light, int s, int t );
//

View File

@ -1170,7 +1170,7 @@ void R_PolysetFillSpans8 (spanpackage_t *pspanpackage)
{
int lsfrac, ltfrac;
pixel_t *lpdest;
byte *lptex;
pixel_t *lptex;
int llight;
int lzi;
short *lpz;
@ -1191,7 +1191,7 @@ void R_PolysetFillSpans8 (spanpackage_t *pspanpackage)
/*if(r_newrefdef.rdflags & RDF_IRGOGGLES && RI.currententity->flags & RF_IR_VISIBLE)
*lpdest = ((byte *)vid.colormap)[irtable[*lptex]];
else*/
*lpdest = color; //((byte *)vid.colormap)[*lptex + (llight & 0xFF00)];
*lpdest = *lptex; //((byte *)vid.colormap)[*lptex + (llight & 0xFF00)];
//PGM
*lpz = lzi >> 16;
}
@ -1253,7 +1253,7 @@ void R_RasterizeAliasPolySmooth (void)
ystart = plefttop[1];
d_aspancount = plefttop[0] - prighttop[0];
d_ptex = (byte *)r_affinetridesc.pskin + (plefttop[2] >> 16) +
d_ptex = (pixel_t*)r_affinetridesc.pskin + (plefttop[2] >> 16) +
(plefttop[3] >> 16) * r_affinetridesc.skinwidth;
//#if id386ALIAS
#if id386
@ -1398,7 +1398,7 @@ void R_RasterizeAliasPolySmooth (void)
ystart = plefttop[1];
d_aspancount = plefttop[0] - prighttop[0];
d_ptex = (byte *)r_affinetridesc.pskin + (plefttop[2] >> 16) +
d_ptex = (pixel_t*)r_affinetridesc.pskin + (plefttop[2] >> 16) +
(plefttop[3] >> 16) * r_affinetridesc.skinwidth;
d_sfrac = 0;
d_tfrac = 0;

View File

@ -1813,6 +1813,7 @@ R_StudioSetupSkin
static void R_StudioSetupSkin( studiohdr_t *ptexturehdr, int index )
{
mstudiotexture_t *ptexture = NULL;
image_t *image;
if( FBitSet( g_nForceFaceFlags, STUDIO_NF_CHROME ))
return;
@ -1827,6 +1828,10 @@ static void R_StudioSetupSkin( studiohdr_t *ptexturehdr, int index )
if( r_lightmap->value && !r_fullbright->value )
GL_Bind( XASH_TEXTURE0, tr.whiteTexture );
else GL_Bind( XASH_TEXTURE0, ptexture[index].index );
image = R_GetTexture(ptexture[index].index);
r_affinetridesc.pskin = image->pixels[0];
r_affinetridesc.skinwidth = image->width;
r_affinetridesc.skinheight = image->height;
}
/*

View File

@ -205,23 +205,23 @@ void R_SetupFinalVert( finalvert_t *fv, float x, float y, float z, int light, in
fv->t = t << 16;
}
void R_RenderTriangle( finalvert_t *pfv )
void R_RenderTriangle( finalvert_t *fv1, finalvert_t *fv2, finalvert_t *fv3 )
{
if ( pfv[0].flags & pfv[1].flags & pfv[2].flags )
if ( fv1->flags & fv2->flags & fv3->flags )
return ; // completely clipped
if ( ! (pfv[0].flags | pfv[1].flags | pfv[2].flags) )
if ( ! (fv1->flags | fv2->flags | fv3->flags) )
{ // totally unclipped
aliastriangleparms.a = &pfv[0];
aliastriangleparms.b = &pfv[1];
aliastriangleparms.c = &pfv[2];
aliastriangleparms.a = fv1;
aliastriangleparms.b = fv2;
aliastriangleparms.c = fv3;
R_DrawTriangle();
}
else
{ // partially clipped
R_AliasClipTriangle (&pfv[0], &pfv[1], &pfv[2]);
R_AliasClipTriangle (fv1, fv2, fv3);
}
}

View File

@ -24,8 +24,9 @@ static struct
} ds;
finalvert_t triv[3];
int vertcount;
int vertcount, n;
int mode;
short s,t;
/*
===============================================================
@ -115,7 +116,7 @@ void TriBegin( int mode1 )
pglBegin( mode );
#endif
mode = mode1;
vertcount = 0;
vertcount = n = vertcount = 0;
}
/*
@ -128,7 +129,6 @@ draw triangle sequence
void TriEnd( void )
{
//if( vertcount == 3 )
R_RenderTriangle( triv );
//pglEnd( );
}
@ -209,6 +209,8 @@ TriTexCoord2f
void TriTexCoord2f( float u, float v )
{
//pglTexCoord2f( u, v );
s = r_affinetridesc.skinwidth * u;
t = r_affinetridesc.skinheight * v;
}
/*
@ -233,26 +235,53 @@ void TriVertex3f( float x, float y, float z )
{
if( mode == TRI_TRIANGLE_FAN )
{
R_SetupFinalVert( &triv[vertcount], x, y, z, 0,0,0);
R_SetupFinalVert( &triv[vertcount], x, y, z, 0,s,t);
vertcount++;
if( vertcount >= 3 )
{
R_RenderTriangle( triv );
R_RenderTriangle( &triv[0], &triv[1], &triv[2] );
triv[1] = triv[2];
vertcount = 2;
}
}
if( mode == TRI_TRIANGLE_STRIP )
{
if( vertcount > 2 )
{
R_SetupFinalVert( &triv[(vertcount + 1) & 1 + 1], x, y, z, 0,0,0);
R_RenderTriangle( triv );
}
else
R_SetupFinalVert( &triv[vertcount], x, y, z, 0,0,0);
R_SetupFinalVert( &triv[n], x, y, z, 0,s,t);
n++;
vertcount++;
if( n == 3 )
n = 0;
if (vertcount >= 3)
{
if( vertcount & 1 )
R_RenderTriangle( &triv[0], &triv[1], &triv[2] );
else
R_RenderTriangle( &triv[2], &triv[1], &triv[0] );
}
}
#if 0
if( mode == TRI_TRIANGLE_STRIP )
{
R_SetupFinalVert( &triv[vertcount], x, y, z, 0,s,t);
vertcount++;
if( vertcount == 3 )
{
R_RenderTriangle( triv );
finalvert_t fv = triv[0];
triv[0] = triv[2];
triv[2] = fv;
R_RenderTriangle( triv );
fv = triv[0];
triv[0] = triv[2];
triv[2] = fv;
triv[0] = triv[1];
triv[1] = triv[2];
vertcount = 2;
}
}
#endif
}
/*