soft: use separate light3_t

This commit is contained in:
Denis Pauk 2022-03-19 21:36:29 +02:00
parent 480f278045
commit 3f33522977
5 changed files with 37 additions and 29 deletions

View file

@ -77,6 +77,7 @@ typedef unsigned char pixel_t;
typedef int shift20_t; typedef int shift20_t;
typedef int zvalue_t; typedef int zvalue_t;
typedef unsigned int light_t; typedef unsigned int light_t;
typedef int light3_t[3];
// xyz-prescale to 16.16 fixed-point // xyz-prescale to 16.16 fixed-point
#define SHIFT16XYZ 16 #define SHIFT16XYZ 16
@ -202,7 +203,7 @@ typedef struct
*/ */
typedef struct finalvert_s { typedef struct finalvert_s {
int u, v, s, t; int u, v, s, t;
int l[3]; // full color light light3_t l; // full color light
zvalue_t zi; zvalue_t zi;
int flags; int flags;
float xyz[3]; // eye space float xyz[3]; // eye space
@ -210,7 +211,7 @@ typedef struct finalvert_s {
typedef struct compactvert_s { typedef struct compactvert_s {
int u, v, s, t; int u, v, s, t;
int l[3]; // full color light light3_t l; // full color light
zvalue_t zi; zvalue_t zi;
} compactvert_t; } compactvert_t;
@ -502,7 +503,8 @@ extern edge_t **removeedges;
typedef struct { typedef struct {
int u, v, count; int u, v, count;
pixel_t *ptex; pixel_t *ptex;
int sfrac, tfrac, light[3]; int sfrac, tfrac;
light3_t light;
zvalue_t zi; zvalue_t zi;
} spanpackage_t; } spanpackage_t;
extern spanpackage_t *triangle_spans, *triangles_max; extern spanpackage_t *triangle_spans, *triangles_max;
@ -590,7 +592,7 @@ image_t *R_FindImage(char *name, imagetype_t type);
byte *Get_BestImageSize(const image_t *image, int *req_width, int *req_height); byte *Get_BestImageSize(const image_t *image, int *req_width, int *req_height);
void R_FreeUnusedImages(void); void R_FreeUnusedImages(void);
qboolean R_ImageHasFreeSpace(void); qboolean R_ImageHasFreeSpace(void);
pixel_t R_ApplyLight(pixel_t pix, const int light[3]); pixel_t R_ApplyLight(pixel_t pix, const light3_t light);
void R_InitSkyBox(model_t *loadmodel); void R_InitSkyBox(model_t *loadmodel);
void R_IMFlatShadedQuad( const vec3_t a, const vec3_t b, const vec3_t c, const vec3_t d, int color, float alpha ); void R_IMFlatShadedQuad( const vec3_t a, const vec3_t b, const vec3_t c, const vec3_t d, int color, float alpha );

View file

@ -35,7 +35,7 @@ affinetridesc_t r_affinetridesc;
static vec3_t r_plightvec; static vec3_t r_plightvec;
static vec3_t r_lerp_frontv, r_lerp_backv, r_lerp_move; static vec3_t r_lerp_frontv, r_lerp_backv, r_lerp_move;
static int r_ambientlight[3]; static light3_t r_ambientlight;
int r_aliasblendcolor; int r_aliasblendcolor;
static float r_shadelight[3]; static float r_shadelight[3];
@ -447,7 +447,7 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve
} }
} }
else else
memcpy(fv->l, r_ambientlight, sizeof(int) * 3); // light; memcpy(fv->l, r_ambientlight, sizeof(light3_t)); // light;
if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE ) if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE )
{ {

View file

@ -329,8 +329,13 @@ R_LoadWal (char *name, imagetype_t type)
static byte *d_16to8table = NULL; // 16 to 8 bit conversion table static byte *d_16to8table = NULL; // 16 to 8 bit conversion table
/*
* Apply color light to texture pixel
*
* TODO: -22% fps lost
*/
pixel_t pixel_t
R_ApplyLight(pixel_t pix, const int light[3]) R_ApplyLight(pixel_t pix, const light3_t light)
{ {
pixel_t i_r, i_g, i_b; pixel_t i_r, i_g, i_b;
byte b_r, b_g, b_b; byte b_r, b_g, b_b;

View file

@ -68,7 +68,8 @@ static spanpackage_t *d_pedgespanpackage;
spanpackage_t *triangle_spans, *triangles_max; spanpackage_t *triangle_spans, *triangles_max;
static int d_sfrac, d_tfrac, d_light[3]; static int d_sfrac, d_tfrac;
static light3_t d_light;
static zvalue_t d_zi; static zvalue_t d_zi;
static int d_ptexextrastep, d_sfracextrastep; static int d_ptexextrastep, d_sfracextrastep;
static int d_tfracextrastep, d_lightextrastep[3]; static int d_tfracextrastep, d_lightextrastep[3];
@ -189,21 +190,21 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv
r_p0.v = a->v; // v r_p0.v = a->v; // v
r_p0.s = a->s; // s r_p0.s = a->s; // s
r_p0.t = a->t; // t r_p0.t = a->t; // t
memcpy(r_p0.l, a->l, sizeof(int) * 3); // light memcpy(r_p0.l, a->l, sizeof(light3_t)); // light
r_p0.zi = a->zi; // iz r_p0.zi = a->zi; // iz
r_p1.u = b->u; r_p1.u = b->u;
r_p1.v = b->v; r_p1.v = b->v;
r_p1.s = b->s; r_p1.s = b->s;
r_p1.t = b->t; r_p1.t = b->t;
memcpy(r_p1.l, b->l, sizeof(int) * 3); // light memcpy(r_p1.l, b->l, sizeof(light3_t)); // light
r_p1.zi = b->zi; r_p1.zi = b->zi;
r_p2.u = c->u; r_p2.u = c->u;
r_p2.v = c->v; r_p2.v = c->v;
r_p2.s = c->s; r_p2.s = c->s;
r_p2.t = c->t; r_p2.t = c->t;
memcpy(r_p2.l, c->l, sizeof(int) * 3); // light; memcpy(r_p2.l, c->l, sizeof(light3_t)); // light;
r_p2.zi = c->zi; r_p2.zi = c->zi;
R_PolysetSetEdgeTable (); R_PolysetSetEdgeTable ();
@ -213,7 +214,7 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv
static void static void
R_PushEdgesSpan(int u, int v, int count, R_PushEdgesSpan(int u, int v, int count,
pixel_t* d_ptex, int d_sfrac, int d_tfrac, int d_light[3], zvalue_t d_zi) pixel_t* d_ptex, int d_sfrac, int d_tfrac, light3_t d_light, zvalue_t d_zi)
{ {
if (d_pedgespanpackage >= triangles_max) if (d_pedgespanpackage >= triangles_max)
{ {
@ -231,7 +232,7 @@ R_PushEdgesSpan(int u, int v, int count,
d_pedgespanpackage->tfrac = d_tfrac; d_pedgespanpackage->tfrac = d_tfrac;
// FIXME: need to clamp l, s, t, at both ends? // FIXME: need to clamp l, s, t, at both ends?
memcpy(d_pedgespanpackage->light, d_light, sizeof(int) * 3); memcpy(d_pedgespanpackage->light, d_light, sizeof(light3_t));
d_pedgespanpackage->zi = d_zi; d_pedgespanpackage->zi = d_zi;
d_pedgespanpackage++; d_pedgespanpackage++;
@ -446,7 +447,7 @@ R_PolysetDrawSpans8_33(const entity_t *currententity, spanpackage_t *pspanpackag
pixel_t *lpdest; pixel_t *lpdest;
pixel_t *lptex; pixel_t *lptex;
int lsfrac, ltfrac; int lsfrac, ltfrac;
int llight[3]; light3_t llight;
zvalue_t lzi; zvalue_t lzi;
zvalue_t *lpz; zvalue_t *lpz;
@ -475,7 +476,7 @@ R_PolysetDrawSpans8_33(const entity_t *currententity, spanpackage_t *pspanpackag
lptex = pspanpackage->ptex; lptex = pspanpackage->ptex;
lsfrac = pspanpackage->sfrac; lsfrac = pspanpackage->sfrac;
ltfrac = pspanpackage->tfrac; ltfrac = pspanpackage->tfrac;
memcpy(llight, pspanpackage->light, sizeof(int) * 3); memcpy(llight, pspanpackage->light, sizeof(light3_t));
lzi = pspanpackage->zi; lzi = pspanpackage->zi;
do do
@ -563,7 +564,7 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag
pixel_t *lpdest; pixel_t *lpdest;
pixel_t *lptex; pixel_t *lptex;
int lsfrac, ltfrac; int lsfrac, ltfrac;
int llight[3]; light3_t llight;
zvalue_t lzi; zvalue_t lzi;
zvalue_t *lpz; zvalue_t *lpz;
@ -593,7 +594,7 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag
lptex = pspanpackage->ptex; lptex = pspanpackage->ptex;
lsfrac = pspanpackage->sfrac; lsfrac = pspanpackage->sfrac;
ltfrac = pspanpackage->tfrac; ltfrac = pspanpackage->tfrac;
memcpy(llight, pspanpackage->light, sizeof(int) * 3); memcpy(llight, pspanpackage->light, sizeof(light3_t));
lzi = pspanpackage->zi; lzi = pspanpackage->zi;
do do
@ -720,7 +721,7 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp
int lsfrac, ltfrac; int lsfrac, ltfrac;
pixel_t *lpdest; pixel_t *lpdest;
pixel_t *lptex; pixel_t *lptex;
int llight[3]; light3_t llight;
zvalue_t lzi; zvalue_t lzi;
zvalue_t *lpz; zvalue_t *lpz;
int pos_shift = (pspanpackage->v * vid_buffer_width) + pspanpackage->u; int pos_shift = (pspanpackage->v * vid_buffer_width) + pspanpackage->u;
@ -732,7 +733,7 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp
lptex = pspanpackage->ptex; lptex = pspanpackage->ptex;
lsfrac = pspanpackage->sfrac; lsfrac = pspanpackage->sfrac;
ltfrac = pspanpackage->tfrac; ltfrac = pspanpackage->tfrac;
memcpy(llight, pspanpackage->light, sizeof(int) * 3); memcpy(llight, pspanpackage->light, sizeof(light3_t));
lzi = pspanpackage->zi; lzi = pspanpackage->zi;
do do
@ -827,7 +828,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity)
d_sfrac = plefttop->s & 0xFFFF; d_sfrac = plefttop->s & 0xFFFF;
d_tfrac = plefttop->t & 0xFFFF; d_tfrac = plefttop->t & 0xFFFF;
} }
memcpy(d_light, plefttop->l, sizeof(int) * 3); memcpy(d_light, plefttop->l, sizeof(light3_t));
d_zi = plefttop->zi; d_zi = plefttop->zi;
if (initialleftheight == 1) if (initialleftheight == 1)
@ -853,7 +854,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity)
working_lstepx[i] = r_lstepx[i] - 1; working_lstepx[i] = r_lstepx[i] - 1;
} }
else else
memcpy(working_lstepx, r_lstepx, sizeof(int) * 3); memcpy(working_lstepx, r_lstepx, sizeof(light3_t));
d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> SHIFT16XYZ) + d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> SHIFT16XYZ) +
((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) * ((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) *
@ -902,7 +903,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity)
(plefttop->t >> SHIFT16XYZ) * r_affinetridesc.skinwidth; (plefttop->t >> SHIFT16XYZ) * r_affinetridesc.skinwidth;
d_sfrac = 0; d_sfrac = 0;
d_tfrac = 0; d_tfrac = 0;
memcpy(d_light, plefttop->l, sizeof(int) * 3); memcpy(d_light, plefttop->l, sizeof(light3_t));
d_zi = plefttop->zi; d_zi = plefttop->zi;
if (height == 1) if (height == 1)
@ -923,7 +924,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity)
working_lstepx[i] = r_lstepx[i] - 1; working_lstepx[i] = r_lstepx[i] - 1;
} }
else else
memcpy(working_lstepx, r_lstepx, sizeof(int) * 3); memcpy(working_lstepx, r_lstepx, sizeof(light3_t));
d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> SHIFT16XYZ) + d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> SHIFT16XYZ) +
((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) * ((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) *

View file

@ -81,12 +81,12 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes)
for (v=0 ; v<r_numvblocks ; v++) for (v=0 ; v<r_numvblocks ; v++)
{ {
int lightleft[3], lightright[3]; light3_t lightleft, lightright;
int lightleftstep[3], lightrightstep[3]; light3_t lightleftstep, lightrightstep;
// FIXME: use delta rather than both right and left, like ASM? // FIXME: use delta rather than both right and left, like ASM?
memcpy(lightleft, r_lightptr, sizeof(int) * 3); memcpy(lightleft, r_lightptr, sizeof(light3_t));
memcpy(lightright, r_lightptr + 3, sizeof(int) * 3); memcpy(lightright, r_lightptr + 3, sizeof(light3_t));
r_lightptr += r_lightwidth * 3; r_lightptr += r_lightwidth * 3;
for(i=0; i<3; i++) for(i=0; i<3; i++)
{ {
@ -96,7 +96,7 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes)
for (i=0 ; i<size ; i++) for (i=0 ; i<size ; i++)
{ {
int lightstep[3], light[3]; light3_t lightstep, light;
int j; int j;
for(j=0; j<3; j++) for(j=0; j<3; j++)
@ -107,7 +107,7 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes)
lightstep[j] = lighttemp >> level; lightstep[j] = lighttemp >> level;
} }
memcpy(light, lightright, sizeof(int) * 3); memcpy(light, lightright, sizeof(light3_t));
for (b=(size-1); b>=0; b--) for (b=(size-1); b>=0; b--)
{ {