From 7c31fd9de28e4f3122a9158a167d64617f67e43c Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Wed, 2 Feb 2022 22:16:17 +0200 Subject: [PATCH 01/23] soft: sync model light calculation --- src/client/refresh/soft/header/model.h | 2 ++ src/client/refresh/soft/sw_light.c | 28 +++++++++++++++++--------- src/client/refresh/soft/sw_model.c | 12 +++++++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/client/refresh/soft/header/model.h b/src/client/refresh/soft/header/model.h index a812386d..7135c97f 100644 --- a/src/client/refresh/soft/header/model.h +++ b/src/client/refresh/soft/header/model.h @@ -96,6 +96,7 @@ typedef struct msurface_s // lighting info byte styles[MAXLIGHTMAPS]; byte *samples; // [numstyles*surfsize] + byte *colorsamples; // [numstyles*surfsize*3] struct msurface_s *nextalphasurface; } msurface_t; @@ -208,6 +209,7 @@ typedef struct model_s dvis_t *vis; byte *lightdata; + byte *colordata; // for alias models and sprites image_t *skins[MAX_MD2SKINS]; diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index 05e7f5ee..39bcff41 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -123,9 +123,7 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) int i; mtexinfo_t *tex; byte *lightmap; - float *scales; int maps; - float samp; int r; if (node->contents != -1) @@ -183,18 +181,30 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) ds >>= 4; dt >>= 4; - lightmap = surf->samples; + lightmap = surf->colorsamples; VectorCopy (vec3_origin, pointcolor); - lightmap += dt * ((surf->extents[0]>>4)+1) + ds; + + lightmap += 3 * (dt * ((surf->extents[0] >> 4) + 1) + ds); for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ; maps++) { - samp = *lightmap * r_modulate->value * (1.0/255); // adjust for gl scale - scales = r_newrefdef.lightstyles[surf->styles[maps]].rgb; - VectorMA (pointcolor, samp, scales, pointcolor); - lightmap += ((surf->extents[0]>>4)+1) * - ((surf->extents[1]>>4)+1); + const float *rgb; + int j; + + rgb = r_newrefdef.lightstyles[surf->styles[maps]].rgb; + + /* Apply light level to models */ + for (j = 0; j < 3; j++) + { + float scale; + + scale = rgb[j] * r_modulate->value; + pointcolor[j] += lightmap[j] * scale * (1.0 / 255); + } + + lightmap += 3 * ((surf->extents[0] >> 4) + 1) * + ((surf->extents[1] >> 4) + 1); } return 1; diff --git a/src/client/refresh/soft/sw_model.c b/src/client/refresh/soft/sw_model.c index c5fc8be9..aac6bcc6 100644 --- a/src/client/refresh/soft/sw_model.c +++ b/src/client/refresh/soft/sw_model.c @@ -268,6 +268,7 @@ Mod_LoadLighting (model_t *loadmodel, byte *mod_base, lump_t *l) size = l->filelen/3; loadmodel->lightdata = Hunk_Alloc(size); + loadmodel->colordata = Hunk_Alloc(size * 3); in = mod_base + l->fileofs; for (i=0 ; ilightdata[i] = in[1]; else loadmodel->lightdata[i] = in[2]; + loadmodel->colordata[i*3 + 0] = loadmodel->lightdata[i]; + loadmodel->colordata[i*3 + 1] = loadmodel->lightdata[i]; + loadmodel->colordata[i*3 + 2] = loadmodel->lightdata[i]; } } @@ -665,9 +669,15 @@ Mod_LoadFaces (model_t *loadmodel, byte *mod_base, lump_t *l) out->styles[i] = in->styles[i]; i = LittleLong(in->lightofs); if (i == -1) + { out->samples = NULL; + out->colorsamples = NULL; + } else + { out->samples = loadmodel->lightdata + i/3; + out->colorsamples = loadmodel->colordata + i; + } // set the drawing flags flag @@ -1015,6 +1025,8 @@ Mod_LoadBrushModel(model_t *mod, void *buffer, int modfilelen) int size = header->lumps[LUMP_LIGHTING].filelen/3; size = (size + 31) & ~31; hunkSize += size; + /* save color data */ + hunkSize += size * 3; } hunkSize += calcLumpHunkSize(&header->lumps[LUMP_PLANES], sizeof(dplane_t), sizeof(cplane_t), 6); From 512e128c5a2cb3fcbece810125c16b782837d640 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 5 Feb 2022 13:42:38 +0200 Subject: [PATCH 02/23] soft: save full rgb light in model --- src/client/refresh/soft/header/model.h | 4 +--- src/client/refresh/soft/sw_light.c | 28 +++++++++++++++++++------ src/client/refresh/soft/sw_model.c | 29 ++++++-------------------- 3 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/client/refresh/soft/header/model.h b/src/client/refresh/soft/header/model.h index 7135c97f..ec2faea7 100644 --- a/src/client/refresh/soft/header/model.h +++ b/src/client/refresh/soft/header/model.h @@ -95,8 +95,7 @@ typedef struct msurface_s // lighting info byte styles[MAXLIGHTMAPS]; - byte *samples; // [numstyles*surfsize] - byte *colorsamples; // [numstyles*surfsize*3] + byte *samples; // [numstyles*surfsize*3] struct msurface_s *nextalphasurface; } msurface_t; @@ -209,7 +208,6 @@ typedef struct model_s dvis_t *vis; byte *lightdata; - byte *colordata; // for alias models and sprites image_t *skins[MAX_MD2SKINS]; diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index 39bcff41..07b37d55 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -122,7 +122,6 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) int s, t, ds, dt; int i; mtexinfo_t *tex; - byte *lightmap; int maps; int r; @@ -158,6 +157,8 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) surf = r_worldmodel->surfaces + node->firstsurface; for (i=0 ; inumsurfaces ; i++, surf++) { + byte *lightmap; + if (surf->flags&(SURF_DRAWTURB|SURF_DRAWSKY)) continue; // no lightmaps @@ -181,7 +182,7 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) ds >>= 4; dt >>= 4; - lightmap = surf->colorsamples; + lightmap = surf->samples; VectorCopy (vec3_origin, pointcolor); lightmap += 3 * (dt * ((surf->extents[0] >> 4) + 1) + ds); @@ -398,6 +399,7 @@ R_BuildLightMap (drawsurf_t* drawsurf) smax = (surf->extents[0]>>4)+1; tmax = (surf->extents[1]>>4)+1; size = smax*tmax; + if (blocklight_max <= blocklights + size) { r_outoflights = true; @@ -406,7 +408,6 @@ R_BuildLightMap (drawsurf_t* drawsurf) if (r_fullbright->value || !r_worldmodel->lightdata) { - memset(blocklights, 0, size * sizeof(light_t)); return; } @@ -423,11 +424,26 @@ R_BuildLightMap (drawsurf_t* drawsurf) maps++) { unsigned scale; + light_t *curr_light, *max_light; + + curr_light = blocklights; + max_light = blocklights + size; scale = drawsurf->lightadj[maps]; // 8.8 fraction - for (i=0 ; ifilelen) { @@ -266,22 +265,9 @@ Mod_LoadLighting (model_t *loadmodel, byte *mod_base, lump_t *l) return; } - size = l->filelen/3; + size = l->filelen; loadmodel->lightdata = Hunk_Alloc(size); - loadmodel->colordata = Hunk_Alloc(size * 3); - in = mod_base + l->fileofs; - for (i=0 ; i in[1] && in[0] > in[2]) - loadmodel->lightdata[i] = in[0]; - else if (in[1] > in[0] && in[1] > in[2]) - loadmodel->lightdata[i] = in[1]; - else - loadmodel->lightdata[i] = in[2]; - loadmodel->colordata[i*3 + 0] = loadmodel->lightdata[i]; - loadmodel->colordata[i*3 + 1] = loadmodel->lightdata[i]; - loadmodel->colordata[i*3 + 2] = loadmodel->lightdata[i]; - } + memcpy(loadmodel->lightdata, mod_base + l->fileofs, size); } @@ -671,12 +657,10 @@ Mod_LoadFaces (model_t *loadmodel, byte *mod_base, lump_t *l) if (i == -1) { out->samples = NULL; - out->colorsamples = NULL; } else { - out->samples = loadmodel->lightdata + i/3; - out->colorsamples = loadmodel->colordata + i; + out->samples = loadmodel->lightdata + i; } // set the drawing flags flag @@ -1022,11 +1006,10 @@ Mod_LoadBrushModel(model_t *mod, void *buffer, int modfilelen) // lighting is a special case, because we keep only 1 byte out of 3 // (=> no colored lighting in soft renderer by default) { - int size = header->lumps[LUMP_LIGHTING].filelen/3; + int size = header->lumps[LUMP_LIGHTING].filelen; size = (size + 31) & ~31; - hunkSize += size; /* save color data */ - hunkSize += size * 3; + hunkSize += size; } hunkSize += calcLumpHunkSize(&header->lumps[LUMP_PLANES], sizeof(dplane_t), sizeof(cplane_t), 6); From f8cac738dc2dc363f904240c2888f8c195556821 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 5 Feb 2022 14:17:30 +0200 Subject: [PATCH 03/23] soft: sw_light: make variables local --- src/client/refresh/soft/sw_light.c | 54 +++++++++++++++++++----------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index 07b37d55..269173de 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -285,15 +285,8 @@ R_AddDynamicLights (drawsurf_t* drawsurf) { msurface_t *surf; int lnum; - int sd, td; - float dist, rad, minlight; - vec3_t impact, local; - int s, t; - int i; int smax, tmax; mtexinfo_t *tex; - dlight_t *dl; - int negativeLight; surf = drawsurf->surf; smax = (surf->extents[0]>>4)+1; @@ -308,7 +301,14 @@ R_AddDynamicLights (drawsurf_t* drawsurf) for (lnum=0 ; lnumdlightbits & (1<value || !r_worldmodel->lightdata) { return; } - // clear to no light - memset(blocklights, 0, size * sizeof(light_t)); - // add all the lightmaps lightmap = surf->samples; if (lightmap) @@ -452,18 +456,28 @@ R_BuildLightMap (drawsurf_t* drawsurf) R_AddDynamicLights (drawsurf); // bound, invert, and shift - for (i=0 ; i> (8 - VID_CBITS); + curr_light = blocklights; + max_light = blocklights + size; - if (t < (1 << 6)) - t = (1 << 6); + do + { + int t; - blocklights[i] = t; + t = (int)*curr_light; + + if (t < 0) + t = 0; + t = (255*256 - t) >> (8 - VID_CBITS); + + if (t < (1 << 6)) + t = (1 << 6); + + *curr_light = t; + curr_light++; + } + while(curr_light < max_light); } } From 65f8c171c5040c45f04b11c381d1923a372908f5 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Mon, 21 Feb 2022 21:57:35 +0200 Subject: [PATCH 04/23] soft: use named struct vert_t instead array --- src/client/refresh/soft/header/local.h | 5 + src/client/refresh/soft/sw_polyset.c | 172 ++++++++++++------------- 2 files changed, 91 insertions(+), 86 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 012571bf..78180517 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -208,6 +208,11 @@ typedef struct finalvert_s { float xyz[3]; // eye space } finalvert_t; +typedef struct compactvert_s { + int u, v, s, t; + int l; + zvalue_t zi; +} compactvert_t; typedef struct { diff --git a/src/client/refresh/soft/sw_polyset.c b/src/client/refresh/soft/sw_polyset.c index 66c07f51..78f28357 100644 --- a/src/client/refresh/soft/sw_polyset.c +++ b/src/client/refresh/soft/sw_polyset.c @@ -26,36 +26,36 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. typedef struct { int isflattop; int numleftedges; - int *pleftedgevert0; - int *pleftedgevert1; - int *pleftedgevert2; + compactvert_t *pleftedgevert0; + compactvert_t *pleftedgevert1; + compactvert_t *pleftedgevert2; int numrightedges; - int *prightedgevert0; - int *prightedgevert1; - int *prightedgevert2; + compactvert_t *prightedgevert0; + compactvert_t *prightedgevert1; + compactvert_t *prightedgevert2; } edgetable; static int ubasestep, errorterm, erroradjustup, erroradjustdown; -static int r_p0[6], r_p1[6], r_p2[6]; +static compactvert_t r_p0, r_p1, r_p2; static int d_xdenom; static edgetable *pedgetable; static edgetable edgetables[12] = { - {0, 1, r_p0, r_p2, NULL, 2, r_p0, r_p1, r_p2}, - {0, 2, r_p1, r_p0, r_p2, 1, r_p1, r_p2, NULL}, - {1, 1, r_p0, r_p2, NULL, 1, r_p1, r_p2, NULL}, - {0, 1, r_p1, r_p0, NULL, 2, r_p1, r_p2, r_p0}, - {0, 2, r_p0, r_p2, r_p1, 1, r_p0, r_p1, NULL}, - {0, 1, r_p2, r_p1, NULL, 1, r_p2, r_p0, NULL}, - {0, 1, r_p2, r_p1, NULL, 2, r_p2, r_p0, r_p1}, - {0, 2, r_p2, r_p1, r_p0, 1, r_p2, r_p0, NULL}, - {0, 1, r_p1, r_p0, NULL, 1, r_p1, r_p2, NULL}, - {1, 1, r_p2, r_p1, NULL, 1, r_p0, r_p1, NULL}, - {1, 1, r_p1, r_p0, NULL, 1, r_p2, r_p0, NULL}, - {0, 1, r_p0, r_p2, NULL, 1, r_p0, r_p1, NULL}, + {0, 1, &r_p0, &r_p2, NULL, 2, &r_p0, &r_p1, &r_p2}, + {0, 2, &r_p1, &r_p0, &r_p2, 1, &r_p1, &r_p2, NULL}, + {1, 1, &r_p0, &r_p2, NULL, 1, &r_p1, &r_p2, NULL}, + {0, 1, &r_p1, &r_p0, NULL, 2, &r_p1, &r_p2, &r_p0}, + {0, 2, &r_p0, &r_p2, &r_p1, 1, &r_p0, &r_p1, NULL}, + {0, 1, &r_p2, &r_p1, NULL, 1, &r_p2, &r_p0, NULL}, + {0, 1, &r_p2, &r_p1, NULL, 2, &r_p2, &r_p0, &r_p1}, + {0, 2, &r_p2, &r_p1, &r_p0, 1, &r_p2, &r_p0, NULL}, + {0, 1, &r_p1, &r_p0, NULL, 1, &r_p1, &r_p2, NULL}, + {1, 1, &r_p2, &r_p1, NULL, 1, &r_p0, &r_p1, NULL}, + {1, 1, &r_p1, &r_p0, NULL, 1, &r_p2, &r_p0, NULL}, + {0, 1, &r_p0, &r_p2, NULL, 1, &r_p0, &r_p1, NULL}, }; // FIXME: some of these can become statics @@ -185,26 +185,26 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv if ( d_xdenom < 0 ) { - r_p0[0] = a->u; // u - r_p0[1] = a->v; // v - r_p0[2] = a->s; // s - r_p0[3] = a->t; // t - r_p0[4] = a->l; // light - r_p0[5] = a->zi; // iz + r_p0.u = a->u; // u + r_p0.v = a->v; // v + r_p0.s = a->s; // s + r_p0.t = a->t; // t + r_p0.l = a->l; // light + r_p0.zi = a->zi; // iz - r_p1[0] = b->u; - r_p1[1] = b->v; - r_p1[2] = b->s; - r_p1[3] = b->t; - r_p1[4] = b->l; - r_p1[5] = b->zi; + r_p1.u = b->u; + r_p1.v = b->v; + r_p1.s = b->s; + r_p1.t = b->t; + r_p1.l = b->l; + r_p1.zi = b->zi; - r_p2[0] = c->u; - r_p2[1] = c->v; - r_p2[2] = c->s; - r_p2[3] = c->t; - r_p2[4] = c->l; - r_p2[5] = c->zi; + r_p2.u = c->u; + r_p2.v = c->v; + r_p2.s = c->s; + r_p2.t = c->t; + r_p2.l = c->l; + r_p2.zi = c->zi; R_PolysetSetEdgeTable (); R_RasterizeAliasPolySmooth(currententity); @@ -372,10 +372,10 @@ R_PolysetCalcGradients (int skinwidth) float xstepdenominv, ystepdenominv, t0, t1; float p01_minus_p21, p11_minus_p21, p00_minus_p20, p10_minus_p20; - p00_minus_p20 = r_p0[0] - r_p2[0]; - p01_minus_p21 = r_p0[1] - r_p2[1]; - p10_minus_p20 = r_p1[0] - r_p2[0]; - p11_minus_p21 = r_p1[1] - r_p2[1]; + p00_minus_p20 = r_p0.u - r_p2.u; + p01_minus_p21 = r_p0.v - r_p2.v; + p10_minus_p20 = r_p1.u - r_p2.u; + p11_minus_p21 = r_p1.v - r_p2.v; xstepdenominv = 1.0 / (float)d_xdenom; @@ -384,29 +384,29 @@ R_PolysetCalcGradients (int skinwidth) // ceil () for light so positive steps are exaggerated, negative steps // diminished, pushing us away from underflow toward overflow. Underflow is // very visible, overflow is very unlikely, because of ambient lighting - t0 = r_p0[4] - r_p2[4]; - t1 = r_p1[4] - r_p2[4]; + t0 = r_p0.l - r_p2.l; + t1 = r_p1.l - r_p2.l; r_lstepx = (int) ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); r_lstepy = (int) ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); - t0 = r_p0[2] - r_p2[2]; - t1 = r_p1[2] - r_p2[2]; + t0 = r_p0.s - r_p2.s; + t1 = r_p1.s - r_p2.s; r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); r_sstepy = (int)((t1 * p00_minus_p20 - t0* p10_minus_p20) * ystepdenominv); - t0 = r_p0[3] - r_p2[3]; - t1 = r_p1[3] - r_p2[3]; + t0 = r_p0.t - r_p2.t; + t1 = r_p1.t - r_p2.t; r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); - t0 = r_p0[5] - r_p2[5]; - t1 = r_p1[5] - r_p2[5]; + t0 = r_p0.zi - r_p2.zi; + t1 = r_p1.zi - r_p2.zi; r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * @@ -769,7 +769,7 @@ static void R_RasterizeAliasPolySmooth(const entity_t *currententity) { int initialleftheight, initialrightheight; - int *plefttop, *prighttop, *pleftbottom, *prightbottom; + compactvert_t *plefttop, *prighttop, *pleftbottom, *prightbottom; int working_lstepx, originalcount; int u, v; pixel_t *d_ptex; @@ -780,8 +780,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) pleftbottom = pedgetable->pleftedgevert1; prightbottom = pedgetable->prightedgevert1; - initialleftheight = pleftbottom[1] - plefttop[1]; - initialrightheight = prightbottom[1] - prighttop[1]; + initialleftheight = pleftbottom->v - plefttop->v; + initialrightheight = prightbottom->v - prighttop->v; // // set the s, t, and light gradients, which are consistent across the triangle @@ -797,18 +797,18 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) // d_pedgespanpackage = triangle_spans; - u = plefttop[0]; - v = plefttop[1]; - d_aspancount = plefttop[0] - prighttop[0]; + u = plefttop->u; + v = plefttop->v; + d_aspancount = plefttop->u - prighttop->u; - d_ptex = r_affinetridesc.pskin + (plefttop[2] >> SHIFT16XYZ) + - (plefttop[3] >> SHIFT16XYZ) * r_affinetridesc.skinwidth; + d_ptex = r_affinetridesc.pskin + (plefttop->s >> SHIFT16XYZ) + + (plefttop->t >> SHIFT16XYZ) * r_affinetridesc.skinwidth; { - d_sfrac = plefttop[2] & 0xFFFF; - d_tfrac = plefttop[3] & 0xFFFF; + d_sfrac = plefttop->s & 0xFFFF; + d_tfrac = plefttop->t & 0xFFFF; } - d_light = plefttop[4]; - d_zi = plefttop[5]; + d_light = plefttop->l; + d_zi = plefttop->zi; if (initialleftheight == 1) { @@ -817,8 +817,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) } else { - R_PolysetSetUpForLineScan(plefttop[0], plefttop[1], - pleftbottom[0], pleftbottom[1]); + R_PolysetSetUpForLineScan(plefttop->u, plefttop->v, + pleftbottom->u, pleftbottom->v); // TODO: can reuse partial expressions here @@ -863,18 +863,18 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) plefttop = pleftbottom; pleftbottom = pedgetable->pleftedgevert2; - height = pleftbottom[1] - plefttop[1]; + height = pleftbottom->v - plefttop->v; // TODO: make this a function; modularize this function in general - u = plefttop[0]; - v = plefttop[1]; - d_aspancount = plefttop[0] - prighttop[0]; - d_ptex = r_affinetridesc.pskin + (plefttop[2] >> SHIFT16XYZ) + - (plefttop[3] >> SHIFT16XYZ) * r_affinetridesc.skinwidth; + u = plefttop->u; + v = plefttop->v; + d_aspancount = plefttop->u - prighttop->u; + d_ptex = r_affinetridesc.pskin + (plefttop->s >> SHIFT16XYZ) + + (plefttop->t >> SHIFT16XYZ) * r_affinetridesc.skinwidth; d_sfrac = 0; d_tfrac = 0; - d_light = plefttop[4]; - d_zi = plefttop[5]; + d_light = plefttop->l; + d_zi = plefttop->zi; if (height == 1) { @@ -883,8 +883,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) } else { - R_PolysetSetUpForLineScan(plefttop[0], plefttop[1], - pleftbottom[0], pleftbottom[1]); + R_PolysetSetUpForLineScan(plefttop->u, plefttop->v, + pleftbottom->u, pleftbottom->v); if (ubasestep < 0) working_lstepx = r_lstepx - 1; @@ -917,8 +917,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) // scan out the top (and possibly only) part of the right edge, updating the // count field - R_PolysetSetUpForLineScan(prighttop[0], prighttop[1], - prightbottom[0], prightbottom[1]); + R_PolysetSetUpForLineScan(prighttop->u, prighttop->v, + prightbottom->u, prightbottom->v); d_aspancount = 0; if ((triangle_spans + initialrightheight) >= triangles_max) { @@ -939,15 +939,15 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) pstart = triangle_spans + initialrightheight; pstart->count = originalcount; - d_aspancount = prightbottom[0] - prighttop[0]; + d_aspancount = prightbottom->u - prighttop->u; prighttop = prightbottom; prightbottom = pedgetable->prightedgevert2; - height = prightbottom[1] - prighttop[1]; + height = prightbottom->v - prighttop->v; - R_PolysetSetUpForLineScan(prighttop[0], prighttop[1], - prightbottom[0], prightbottom[1]); + R_PolysetSetUpForLineScan(prighttop->u, prighttop->v, + prightbottom->u, prightbottom->v); if ((triangle_spans + initialrightheight + height) >= triangles_max) { @@ -978,11 +978,11 @@ R_PolysetSetEdgeTable (void) // determine which edges are right & left, and the order in which // to rasterize them // - if (r_p0[1] >= r_p1[1]) + if (r_p0.v >= r_p1.v) { - if (r_p0[1] == r_p1[1]) + if (r_p0.v == r_p1.v) { - if (r_p0[1] < r_p2[1]) + if (r_p0.v < r_p2.v) pedgetable = &edgetables[2]; else pedgetable = &edgetables[5]; @@ -995,7 +995,7 @@ R_PolysetSetEdgeTable (void) } } - if (r_p0[1] == r_p2[1]) + if (r_p0.v == r_p2.v) { if (edgetableindex) pedgetable = &edgetables[8]; @@ -1004,7 +1004,7 @@ R_PolysetSetEdgeTable (void) return; } - else if (r_p1[1] == r_p2[1]) + else if (r_p1.v == r_p2.v) { if (edgetableindex) pedgetable = &edgetables[10]; @@ -1014,10 +1014,10 @@ R_PolysetSetEdgeTable (void) return; } - if (r_p0[1] > r_p2[1]) + if (r_p0.v > r_p2.v) edgetableindex += 2; - if (r_p1[1] > r_p2[1]) + if (r_p1.v > r_p2.v) edgetableindex += 4; pedgetable = &edgetables[edgetableindex]; From 12b27e631d519fd7d66a49f458cff1413986e11d Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 13:08:15 +0200 Subject: [PATCH 05/23] fix C --pedantic warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * extra semicolon in struct or union specified * ISO C does not allow extra ‘;’ outside of a function --- src/common/header/shared.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/header/shared.h b/src/common/header/shared.h index 23e4af26..8d3b12b1 100644 --- a/src/common/header/shared.h +++ b/src/common/header/shared.h @@ -65,7 +65,7 @@ typedef unsigned char byte; // must be used as prefix (YQ2_ATTR_NORETURN void bla();)! #define YQ2_ATTR_NORETURN __attribute__ ((noreturn)) #elif defined(_MSC_VER) - // Note: We prefer VS2019 16.8 or newer in C11 mode (/std:c11), + // Note: We prefer VS2019 16.8 or newer in C11 mode (/std:c11), // then the __STDC_VERSION__ >= 201112L case above is used #define YQ2_ALIGNAS_SIZE(SIZE) __declspec(align(SIZE)) @@ -148,7 +148,7 @@ typedef unsigned char byte; #ifdef _MSC_VER #define PRINTF_ATTR(FMT, VARGS) #else // at least GCC/mingw and clang support this - #define PRINTF_ATTR(FMT, VARGS) __attribute__((format(printf, FMT , VARGS ))); + #define PRINTF_ATTR(FMT, VARGS) __attribute__((format(printf, FMT , VARGS ))) #endif /* per-level limits */ From 36542e737cdd4e3de6d422bf253068ca043dd3a2 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 15:14:31 +0200 Subject: [PATCH 06/23] soft: make pointcolor local --- src/client/refresh/soft/sw_light.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index 269173de..cca41908 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -107,12 +107,8 @@ LIGHT SAMPLING ============================================================================= */ - -static vec3_t pointcolor; -static vec3_t lightspot; - static int -RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) +RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end, vec3_t pointcolor) { float front, back, frac; qboolean side; @@ -137,7 +133,7 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) side = front < 0; if ( (back < 0) == side) - return RecursiveLightPoint (node->children[side], start, end); + return RecursiveLightPoint (node->children[side], start, end, pointcolor); frac = front / (front-back); mid[0] = start[0] + (end[0] - start[0])*frac; @@ -147,13 +143,11 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) mid[plane->type] = plane->dist; // go down front side - r = RecursiveLightPoint (node->children[side], start, mid); + r = RecursiveLightPoint (node->children[side], start, mid, pointcolor); if (r >= 0) return r; // hit something // check for impact on this node - VectorCopy (mid, lightspot); - surf = r_worldmodel->surfaces + node->firstsurface; for (i=0 ; inumsurfaces ; i++, surf++) { @@ -212,7 +206,7 @@ RecursiveLightPoint (mnode_t *node, vec3_t start, vec3_t end) } // go down back side - return RecursiveLightPoint (node->children[!side], mid, end); + return RecursiveLightPoint (node->children[!side], mid, end, pointcolor); } /* @@ -228,6 +222,7 @@ R_LightPoint (const entity_t *currententity, vec3_t p, vec3_t color) int lnum; dlight_t *dl; vec3_t dist; + vec3_t pointcolor; if (!r_worldmodel->lightdata) { @@ -239,7 +234,7 @@ R_LightPoint (const entity_t *currententity, vec3_t p, vec3_t color) end[1] = p[1]; end[2] = p[2] - 2048; - r = RecursiveLightPoint (r_worldmodel->nodes, p, end); + r = RecursiveLightPoint (r_worldmodel->nodes, p, end, pointcolor); if (r == -1) { From 15553b99715833f2d86bdfd86d15dc35faf488c9 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 15:56:27 +0200 Subject: [PATCH 07/23] soft: use plightvec directly --- src/client/refresh/soft/header/local.h | 6 ------ src/client/refresh/soft/sw_alias.c | 25 +++++++++---------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 78180517..bb3155e0 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -233,12 +233,6 @@ typedef struct int surfheight; // in mipmapped texels } drawsurf_t; -typedef struct { - int ambientlight; - int shadelight; - float *plightvec; -} alight_t; - // clipped bmodel edges typedef struct bedge_s { diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index 346bdfec..e76a44eb 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -534,7 +534,6 @@ R_AliasSetupLighting static void R_AliasSetupLighting(entity_t *currententity) { - alight_t lighting; float lightvec[3] = {-1, 0, 0}; vec3_t light; int i, j; @@ -580,37 +579,31 @@ R_AliasSetupLighting(entity_t *currententity) j = (light[0] + light[1] + light[2]) * 0.3333 * 255; - lighting.ambientlight = j; - lighting.shadelight = j; - - lighting.plightvec = lightvec; + r_ambientlight = j; + r_shadelight = j; // 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; + if (r_ambientlight > 128) + r_ambientlight = 128; + if (r_ambientlight + r_shadelight > 192) + r_shadelight = 192 - r_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; - 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_plightvec[0] = DotProduct( lightvec, s_alias_forward ); + r_plightvec[1] = -DotProduct( lightvec, s_alias_right ); + r_plightvec[2] = DotProduct( lightvec, s_alias_up ); } From a6839bc584023c6f0973015dd394944a90e32ac2 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 16:28:13 +0200 Subject: [PATCH 08/23] soft: add fullcolor light apply --- src/client/refresh/soft/header/local.h | 2 ++ src/client/refresh/soft/sw_image.c | 29 +++++++++++++++++++++++++- src/client/refresh/soft/sw_main.c | 16 +++++++------- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index bb3155e0..77ef097e 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -582,12 +582,14 @@ void RE_Draw_FadeScreen (void); void LoadPCX (char *filename, byte **pic, byte **palette, int *width, int *height); +extern byte d_8to24table[256 * 4]; void R_InitImages(void); void R_ShutdownImages(void); image_t *R_FindImage(char *name, imagetype_t type); byte *Get_BestImageSize(const image_t *image, int *req_width, int *req_height); void R_FreeUnusedImages(void); qboolean R_ImageHasFreeSpace(void); +pixel_t R_ApplyLight(pixel_t pix, const int light[3]); 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 ); diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index 8e80f38c..40595819 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -323,7 +323,34 @@ R_LoadWal (char *name, imagetype_t type) return image; } -static unsigned char *d_16to8table = NULL; // 16 to 8 bit conversion table +static byte *d_16to8table = NULL; // 16 to 8 bit conversion table + +pixel_t +R_ApplyLight(pixel_t pix, const int light[3]) +{ + pixel_t i_r, i_g, i_b; + byte b_r, b_g, b_b; + int i_c; + + /* get index of color component of each component */ + i_r = vid_colormap[(light[0] & 0xFF00) + pix]; + i_g = vid_colormap[(light[1] & 0xFF00) + pix]; + i_b = vid_colormap[(light[2] & 0xFF00) + pix]; + + /* get color component for each component */ + b_r = d_8to24table[i_r * 4 + 0]; + b_g = d_8to24table[i_g * 4 + 1]; + b_b = d_8to24table[i_b * 4 + 2]; + + /* convert back to indexed color */ + b_r = ( b_r >> 3 ) & 31; + b_g = ( b_g >> 2 ) & 63; + b_b = ( b_b >> 3 ) & 31; + + i_c = b_r | ( b_g << 5 ) | ( b_b << 11 ); + + return d_16to8table[i_c & 0xFFFF]; +} static void R_Convert32To8bit(const unsigned char* pic_in, pixel_t* pic_out, size_t size) diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index cba0ffbb..9dbaa1f5 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -51,7 +51,7 @@ static qboolean palette_changed; refimport_t ri; -static unsigned d_8to24table[256]; +byte d_8to24table[256 * 4]; char skyname[MAX_QPATH]; vec3_t skyaxis; @@ -1230,7 +1230,7 @@ R_CalcPalette (void) if (modified) { // set back to default modified = false; - R_GammaCorrectAndSetPalette( ( const unsigned char * ) d_8to24table ); + R_GammaCorrectAndSetPalette( d_8to24table ); return; } return; @@ -1246,7 +1246,7 @@ R_CalcPalette (void) one_minus_alpha = (1.0 - alpha); - in = (byte *)d_8to24table; + in = d_8to24table; out = palette[0]; for (i=0 ; i<256 ; i++, in+=4, out+=4) { @@ -1439,7 +1439,7 @@ R_InitGraphics( int width, int height ) R_InitCaches(); - R_GammaCorrectAndSetPalette((const unsigned char *)d_8to24table); + R_GammaCorrectAndSetPalette(d_8to24table); } static rserr_t SWimp_SetMode(int *pwidth, int *pheight, int mode, int fullscreen); @@ -1466,7 +1466,7 @@ RE_BeginFrame( float camera_separation ) if ( vid_gamma->modified || sw_overbrightbits->modified ) { Draw_BuildGammaTable(); - R_GammaCorrectAndSetPalette((const unsigned char * )d_8to24table); + R_GammaCorrectAndSetPalette(d_8to24table); // we need redraw everything VID_WholeDamageBuffer(); // and backbuffer should be zeroed @@ -1602,7 +1602,7 @@ RE_SetPalette(const unsigned char *palette) } else { - R_GammaCorrectAndSetPalette((const unsigned char *)d_8to24table); + R_GammaCorrectAndSetPalette(d_8to24table); } } @@ -1759,7 +1759,7 @@ Draw_GetPalette (void) ri.Sys_Error (ERR_FATAL, "Couldn't load pics/colormap.pcx"); vid_alphamap = vid_colormap + 64*256; - out = (byte *)d_8to24table; + out = d_8to24table; for (i=0 ; i<256 ; i++, out+=4) { int r, g, b; @@ -2409,7 +2409,7 @@ SWimp_CreateRender(int width, int height) memset(sw_state.currentpalette, 0, sizeof(sw_state.currentpalette)); - R_GammaCorrectAndSetPalette( ( const unsigned char * ) d_8to24table ); + R_GammaCorrectAndSetPalette( d_8to24table ); } // this is only here so the functions in q_shared.c and q_shwin.c can link From 6c80d9b987c0405dee69d46304947121bc61a1ec Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 16:46:51 +0200 Subject: [PATCH 09/23] soft: add full color light --- src/client/refresh/soft/header/local.h | 9 +- src/client/refresh/soft/sw_aclip.c | 63 ++++++++++-- src/client/refresh/soft/sw_alias.c | 76 +++++++++------ src/client/refresh/soft/sw_image.c | 2 +- src/client/refresh/soft/sw_light.c | 89 +++++++++++------ src/client/refresh/soft/sw_main.c | 2 + src/client/refresh/soft/sw_polyset.c | 127 ++++++++++++++++--------- src/client/refresh/soft/sw_surf.c | 52 ++++++---- 8 files changed, 285 insertions(+), 135 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 77ef097e..dd695d7e 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -202,15 +202,15 @@ typedef struct */ typedef struct finalvert_s { int u, v, s, t; - int l; + int l[3]; // full color light zvalue_t zi; int flags; - float xyz[3]; // eye space + float xyz[3]; // eye space } finalvert_t; typedef struct compactvert_s { int u, v, s, t; - int l; + int l[3]; // full color light zvalue_t zi; } compactvert_t; @@ -431,6 +431,7 @@ extern cvar_t *r_lefthand; extern cvar_t *r_gunfov; extern cvar_t *r_farsee; extern cvar_t *r_lightmap; +extern cvar_t *r_colorlight; extern cvar_t *r_drawworld; extern cvar_t *r_lerpmodels; extern cvar_t *r_lightlevel; @@ -501,7 +502,7 @@ extern edge_t **removeedges; typedef struct { int u, v, count; pixel_t *ptex; - int sfrac, tfrac, light; + int sfrac, tfrac, light[3]; zvalue_t zi; } spanpackage_t; extern spanpackage_t *triangle_spans, *triangles_max; diff --git a/src/client/refresh/soft/sw_aclip.c b/src/client/refresh/soft/sw_aclip.c index e252871d..3e9663c8 100644 --- a/src/client/refresh/soft/sw_aclip.c +++ b/src/client/refresh/soft/sw_aclip.c @@ -34,6 +34,7 @@ static void R_Alias_clip_z (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t *out) { float scale; + int i; scale = (ALIAS_Z_CLIP_PLANE - pfv0->xyz[2]) / (pfv1->xyz[2] - pfv0->xyz[2]); @@ -44,7 +45,9 @@ R_Alias_clip_z (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t *o out->s = pfv0->s + (pfv1->s - pfv0->s) * scale; out->t = pfv0->t + (pfv1->t - pfv0->t) * scale; - out->l = pfv0->l + (pfv1->l - pfv0->l) * scale; + + for(i=0; i<3; i++) + out->l[i] = pfv0->l[i] + (pfv1->l[i] - pfv0->l[i]) * scale; R_AliasProjectAndClipTestFinalVert (out); } @@ -56,24 +59,34 @@ R_Alias_clip_left (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t if (pfv0->v >= pfv1->v ) { + int i; + scale = (float)(r_refdef.aliasvrect.x - pfv0->u) / (pfv1->u - pfv0->u); out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; - out->l = pfv0->l + ( pfv1->l - pfv0->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; } else { + int i; + scale = (float)(r_refdef.aliasvrect.x - pfv1->u) / (pfv0->u - pfv1->u); out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; - out->l = pfv1->l + ( pfv0->l - pfv1->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; } } @@ -85,24 +98,34 @@ R_Alias_clip_right (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_ if ( pfv0->v >= pfv1->v ) { + int i; + scale = (float)(r_refdef.aliasvrectright - pfv0->u ) / (pfv1->u - pfv0->u ); out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; - out->l = pfv0->l + ( pfv1->l - pfv0->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv0->l[i] + ( pfv1->l[i] - pfv0->l[i] ) * scale + 0.5; + out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; } else { + int i; + scale = (float)(r_refdef.aliasvrectright - pfv1->u ) / (pfv0->u - pfv1->u ); out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; - out->l = pfv1->l + ( pfv0->l - pfv1->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; } } @@ -114,24 +137,34 @@ R_Alias_clip_top (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t if (pfv0->v >= pfv1->v) { + int i; + scale = (float)(r_refdef.aliasvrect.y - pfv0->v) / (pfv1->v - pfv0->v); out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; - out->l = pfv0->l + ( pfv1->l - pfv0->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv0->l[i] + ( pfv1->l[i] - pfv0->l[i] ) * scale + 0.5; + out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; } else { + int i; + scale = (float)(r_refdef.aliasvrect.y - pfv1->v) / (pfv0->v - pfv1->v); out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; - out->l = pfv1->l + ( pfv0->l - pfv1->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; } } @@ -144,6 +177,8 @@ R_Alias_clip_bottom (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert if (pfv0->v >= pfv1->v) { + int i; + scale = (float)(r_refdef.aliasvrectbottom - pfv0->v) / (pfv1->v - pfv0->v); @@ -151,11 +186,16 @@ R_Alias_clip_bottom (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; - out->l = pfv0->l + ( pfv1->l - pfv0->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv0->l[i] + ( pfv1->l[i] - pfv0->l[i] ) * scale + 0.5; + out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; } else { + int i; + scale = (float)(r_refdef.aliasvrectbottom - pfv1->v) / (pfv0->v - pfv1->v); @@ -163,7 +203,10 @@ R_Alias_clip_bottom (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; - out->l = pfv1->l + ( pfv0->l - pfv1->l ) * scale + 0.5; + + for(i=0; i<3; i++) + out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; } } @@ -225,7 +268,7 @@ R_AliasClipTriangle(const entity_t *currententity, const finalvert_t *index0, co { int i, k, pingpong; unsigned clipflags; - finalvert_t fv[2][8]; + finalvert_t fv[2][8]; // copy vertexes and fix seam texture coordinates fv[0][0] = *index0; diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index e76a44eb..831c82d8 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -35,9 +35,9 @@ affinetridesc_t r_affinetridesc; static vec3_t r_plightvec; static vec3_t r_lerp_frontv, r_lerp_backv, r_lerp_move; -static int r_ambientlight; +static int r_ambientlight[3]; int r_aliasblendcolor; -static float r_shadelight; +static float r_shadelight[3]; static daliasframe_t *r_thisframe, *r_lastframe; @@ -399,7 +399,7 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve for ( i = 0; i < numpoints; i++, fv++, oldv++, newv++ ) { - int temp; + int j; float lightcos; const float *plightnormal; vec3_t lerped_vert; @@ -426,20 +426,26 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve // lighting lightcos = DotProduct (plightnormal, r_plightvec); - temp = r_ambientlight; - if (lightcos < 0) + for(j=0; j<3; j++) { - temp += (int)(r_shadelight * lightcos); + int temp; - // 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; + temp = r_ambientlight[j]; + + if (lightcos < 0) + { + temp += (int)(r_shadelight[j] * 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[j] = temp; } - fv->l = temp; - if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE ) { fv->flags |= ALIAS_Z_CLIP; @@ -536,7 +542,7 @@ R_AliasSetupLighting(entity_t *currententity) { float lightvec[3] = {-1, 0, 0}; vec3_t light; - int i, j; + int i; // all components of light should be identical in software if ( currententity->flags & RF_FULLBRIGHT ) @@ -577,28 +583,40 @@ R_AliasSetupLighting(entity_t *currententity) } } - j = (light[0] + light[1] + light[2]) * 0.3333 * 255; + if(r_colorlight->value == 0) + { + float temp = (light[0] + light[1] + light[2]) / 3; - r_ambientlight = j; - r_shadelight = j; + light[0] = light[1] = light[2] = temp; + } - // clamp lighting so it doesn't overbright as much - if (r_ambientlight > 128) - r_ambientlight = 128; - if (r_ambientlight + r_shadelight > 192) - r_shadelight = 192 - r_ambientlight; + for(i=0; i<3; i++) + { + int j; - // guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't have - // to clamp off the bottom - if (r_ambientlight < LIGHT_MIN) - r_ambientlight = LIGHT_MIN; + j = light[i] * 255; - r_ambientlight = (255 - r_ambientlight) << VID_CBITS; + r_ambientlight[i] = j; + r_shadelight[i] = j; - if (r_shadelight < 0) - r_shadelight = 0; + // clamp lighting so it doesn't overbright as much + if (r_ambientlight[i] > 128) + r_ambientlight[i] = 128; + if (r_ambientlight[i] + r_shadelight[i] > 192) + r_shadelight[i] = 192 - r_ambientlight[i]; - r_shadelight *= VID_GRADES; + // guarantee that no vertex will ever be lit below LIGHT_MIN, so we don't have + // to clamp off the bottom + if (r_ambientlight[i] < LIGHT_MIN) + r_ambientlight[i] = LIGHT_MIN; + + r_ambientlight[i] = (255 - r_ambientlight[i]) << VID_CBITS; + + if (r_shadelight[i] < 0) + r_shadelight[i] = 0; + + r_shadelight[i] *= VID_GRADES; + } // rotate the lighting vector into the model's frame of reference r_plightvec[0] = DotProduct( lightvec, s_alias_forward ); diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index 40595819..4ba409a6 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -704,7 +704,7 @@ R_FindImage(char *name, imagetype_t type) } /* just return white image if show lighmap only */ - if (type == it_wall && r_lightmap->value) + if ((type == it_wall || type == it_skin) && r_lightmap->value) { return r_whitetexture_mip; } diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index cca41908..c0d877d2 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -49,7 +49,7 @@ R_MarkLights (dlight_t *light, int bit, mnode_t *node, int r_dlightframecount) dist = DotProduct (light->origin, splitplane->normal) - splitplane->dist; i = light->intensity; - if( i< 0) + if (i < 0) i = -i; if (dist > i) // (dist > light->intensity) @@ -57,6 +57,7 @@ R_MarkLights (dlight_t *light, int bit, mnode_t *node, int r_dlightframecount) R_MarkLights (light, bit, node->children[0], r_dlightframecount); return; } + if (dist < -i) // (dist < -light->intensity) { R_MarkLights (light, bit, node->children[1], r_dlightframecount); @@ -288,15 +289,15 @@ R_AddDynamicLights (drawsurf_t* drawsurf) tmax = (surf->extents[1]>>4)+1; tex = surf->texinfo; - if (blocklight_max <= blocklights + smax*tmax) + if (blocklight_max <= blocklights + smax*tmax*3) { r_outoflights = true; return; } - for (lnum=0 ; lnumintensity; + if(r_colorlight->value == 0) + { + for(i=0; i<3; i++) + color[i] = 256; + } + else + { + for(i=0; i<3; i++) + color[i] = 256 * dl->color[i]; + } + //===== negativeLight = 0; if(rad < 0) @@ -358,21 +370,25 @@ R_AddDynamicLights (drawsurf_t* drawsurf) else dist = td + (sd>>1); - //==== - if(!negativeLight) + for (i=0; i<3; i++) { - if (dist < minlight) - *plightdest += (rad - dist)*256; + //==== + if(!negativeLight) + { + if (dist < minlight) + *plightdest += (rad - dist) * color[i]; + + } + else + { + if (dist < minlight) + *plightdest -= (rad - dist) * color[i]; + if(*plightdest < minlight) + *plightdest = minlight; + } + //==== + plightdest ++; } - else - { - if (dist < minlight) - *plightdest -= (rad - dist)*256; - if(*plightdest < minlight) - *plightdest = minlight; - } - //==== - plightdest ++; } } } @@ -397,7 +413,7 @@ R_BuildLightMap (drawsurf_t* drawsurf) smax = (surf->extents[0]>>4)+1; tmax = (surf->extents[1]>>4)+1; - size = smax*tmax; + size = smax*tmax*3; if (blocklight_max <= blocklights + size) { @@ -430,19 +446,36 @@ R_BuildLightMap (drawsurf_t* drawsurf) scale = drawsurf->lightadj[maps]; // 8.8 fraction - do + if(r_colorlight->value == 0) { - byte light = sqrt(( - lightmap[0] * lightmap[0] + - lightmap[1] * lightmap[1] + - lightmap[2] * lightmap[2] - ) / 3); - *curr_light += light * scale; - curr_light++; + do + { + byte light = sqrt(( + lightmap[0] * lightmap[0] + + lightmap[1] * lightmap[1] + + lightmap[2] * lightmap[2] + ) / 3); + *curr_light += light * scale; + curr_light++; + *curr_light += light * scale; + curr_light++; + *curr_light += light * scale; + curr_light++; - lightmap += 3; /* skip to next lightmap */ + lightmap += 3; /* skip to next lightmap */ + } + while(curr_light < max_light); + } + else + { + do + { + *curr_light += *lightmap * scale; + curr_light++; + lightmap ++; /* skip to next lightmap */ + } + while(curr_light < max_light); } - while(curr_light < max_light); } } diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index 9dbaa1f5..31ab9d84 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -135,6 +135,7 @@ cvar_t *r_lefthand; cvar_t *r_gunfov; cvar_t *r_farsee; cvar_t *r_lightmap; +cvar_t *r_colorlight; static cvar_t *sw_aliasstats; cvar_t *sw_clearcolor; cvar_t *sw_drawflat; @@ -396,6 +397,7 @@ R_RegisterVariables (void) r_gunfov = ri.Cvar_Get( "r_gunfov", "80", CVAR_ARCHIVE ); r_farsee = ri.Cvar_Get("r_farsee", "0", CVAR_LATCH | CVAR_ARCHIVE); r_lightmap = ri.Cvar_Get("r_lightmap", "0", 0); + r_colorlight = ri.Cvar_Get("r_colorlight", "0", CVAR_ARCHIVE); r_speeds = ri.Cvar_Get ("r_speeds", "0", 0); r_fullbright = ri.Cvar_Get ("r_fullbright", "0", 0); r_drawentities = ri.Cvar_Get ("r_drawentities", "1", 0); diff --git a/src/client/refresh/soft/sw_polyset.c b/src/client/refresh/soft/sw_polyset.c index 78f28357..c6a1a89b 100644 --- a/src/client/refresh/soft/sw_polyset.c +++ b/src/client/refresh/soft/sw_polyset.c @@ -59,8 +59,8 @@ static edgetable edgetables[12] = { }; // FIXME: some of these can become statics -static int a_sstepxfrac, a_tstepxfrac, r_lstepx, a_ststepxwhole; -static int r_sstepx, r_tstepx, r_lstepy, r_sstepy, r_tstepy; +static int a_sstepxfrac, a_tstepxfrac, r_lstepx[3], a_ststepxwhole; +static int r_sstepx, r_tstepx, r_lstepy[3], r_sstepy, r_tstepy; static zvalue_t r_zistepx, r_zistepy; static int d_aspancount; @@ -68,11 +68,11 @@ static spanpackage_t *d_pedgespanpackage; spanpackage_t *triangle_spans, *triangles_max; -static int d_sfrac, d_tfrac, d_light; +static int d_sfrac, d_tfrac, d_light[3]; static zvalue_t d_zi; static int d_ptexextrastep, d_sfracextrastep; -static int d_tfracextrastep, d_lightextrastep; -static int d_lightbasestep, d_ptexbasestep; +static int d_tfracextrastep, d_lightextrastep[3]; +static int d_lightbasestep[3], d_ptexbasestep; static int d_sfracbasestep, d_tfracbasestep; static zvalue_t d_ziextrastep, d_zibasestep; @@ -189,21 +189,21 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv r_p0.v = a->v; // v r_p0.s = a->s; // s r_p0.t = a->t; // t - r_p0.l = a->l; // light + memcpy(r_p0.l, a->l, sizeof(int) * 3); // light r_p0.zi = a->zi; // iz r_p1.u = b->u; r_p1.v = b->v; r_p1.s = b->s; r_p1.t = b->t; - r_p1.l = b->l; + memcpy(r_p1.l, b->l, sizeof(int) * 3); // light r_p1.zi = b->zi; r_p2.u = c->u; r_p2.v = c->v; r_p2.s = c->s; r_p2.t = c->t; - r_p2.l = c->l; + memcpy(r_p2.l, c->l, sizeof(int) * 3); // light; r_p2.zi = c->zi; R_PolysetSetEdgeTable (); @@ -213,7 +213,7 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv static void R_PushEdgesSpan(int u, int v, int count, - pixel_t* d_ptex, int d_sfrac, int d_tfrac, int d_light, zvalue_t d_zi) + pixel_t* d_ptex, int d_sfrac, int d_tfrac, int d_light[3], zvalue_t d_zi) { if (d_pedgespanpackage >= triangles_max) { @@ -231,7 +231,7 @@ R_PushEdgesSpan(int u, int v, int count, d_pedgespanpackage->tfrac = d_tfrac; // FIXME: need to clamp l, s, t, at both ends? - d_pedgespanpackage->light = d_light; + memcpy(d_pedgespanpackage->light, d_light, sizeof(int) * 3); d_pedgespanpackage->zi = d_zi; d_pedgespanpackage++; @@ -257,6 +257,8 @@ R_PolysetScanLeftEdge_C(int height, pixel_t *d_ptex, int u, int v) errorterm += erroradjustup; if (errorterm >= 0) { + int i; + // addtional step for compensate error u ++; d_aspancount ++; @@ -272,12 +274,17 @@ R_PolysetScanLeftEdge_C(int height, pixel_t *d_ptex, int u, int v) d_ptex += r_affinetridesc.skinwidth; d_tfrac &= 0xFFFF; } - d_light += d_lightextrastep; + + for(i=0; i<3; i++) + d_light[i] += d_lightextrastep[i]; + d_zi += d_ziextrastep; errorterm -= erroradjustdown; } else { + int i; + d_ptex += d_ptexbasestep; d_sfrac += d_sfracbasestep; d_ptex += d_sfrac >> SHIFT16XYZ; @@ -288,7 +295,10 @@ R_PolysetScanLeftEdge_C(int height, pixel_t *d_ptex, int u, int v) d_ptex += r_affinetridesc.skinwidth; d_tfrac &= 0xFFFF; } - d_light += d_lightbasestep; + + for(i=0; i<3; i++) + d_light[i] += d_lightbasestep[i]; + d_zi += d_zibasestep; } } while (--height); @@ -371,6 +381,7 @@ R_PolysetCalcGradients (int skinwidth) { float xstepdenominv, ystepdenominv, t0, t1; float p01_minus_p21, p11_minus_p21, p00_minus_p20, p10_minus_p20; + int i; p00_minus_p20 = r_p0.u - r_p2.u; p01_minus_p21 = r_p0.v - r_p2.v; @@ -384,12 +395,15 @@ R_PolysetCalcGradients (int skinwidth) // ceil () for light so positive steps are exaggerated, negative steps // diminished, pushing us away from underflow toward overflow. Underflow is // very visible, overflow is very unlikely, because of ambient lighting - t0 = r_p0.l - r_p2.l; - t1 = r_p1.l - r_p2.l; - r_lstepx = (int) - ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); - r_lstepy = (int) - ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); + for (i=0; i<3; i++) + { + t0 = r_p0.l[i] - r_p2.l[i]; + t1 = r_p1.l[i] - r_p2.l[i]; + r_lstepx[i] = (int) + ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); + r_lstepy[i] = (int) + ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); + } t0 = r_p0.s - r_p2.s; t1 = r_p1.s - r_p2.s; @@ -432,7 +446,7 @@ R_PolysetDrawSpans8_33(const entity_t *currententity, spanpackage_t *pspanpackag pixel_t *lpdest; pixel_t *lptex; int lsfrac, ltfrac; - int llight; + int llight[3]; zvalue_t lzi; zvalue_t *lpz; @@ -461,21 +475,24 @@ R_PolysetDrawSpans8_33(const entity_t *currententity, spanpackage_t *pspanpackag lptex = pspanpackage->ptex; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; - llight = pspanpackage->light; + memcpy(llight, pspanpackage->light, sizeof(int) * 3); lzi = pspanpackage->zi; do { + int i; + if ((lzi >> SHIFT16XYZ) >= *lpz) { - int temp = vid_colormap[*lptex + ( llight & 0xFF00 )]; + int temp = R_ApplyLight(*lptex, llight); *lpdest = vid_alphamap[temp + *lpdest*256]; } lpdest++; lzi += r_zistepx; lpz++; - llight += r_lstepx; + for(i=0; i<3; i++) + llight[i] += r_lstepx[i]; lptex += a_ststepxwhole; lsfrac += a_sstepxfrac; lptex += lsfrac >> SHIFT16XYZ; @@ -546,7 +563,7 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag pixel_t *lpdest; pixel_t *lptex; int lsfrac, ltfrac; - int llight; + int llight[3]; zvalue_t lzi; zvalue_t *lpz; @@ -576,14 +593,16 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag lptex = pspanpackage->ptex; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; - llight = pspanpackage->light; + memcpy(llight, pspanpackage->light, sizeof(int) * 3); lzi = pspanpackage->zi; do { + int i; + if ((lzi >> SHIFT16XYZ) >= *lpz) { - int temp = vid_colormap[*lptex + ( llight & 0xFF00 )]; + int temp = R_ApplyLight(*lptex, llight); *lpdest = vid_alphamap[temp*256 + *lpdest]; *lpz = lzi >> SHIFT16XYZ; @@ -592,7 +611,8 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag lpdest++; lzi += r_zistepx; lpz++; - llight += r_lstepx; + for(i=0; i<3; i++) + llight[i] += r_lstepx[i]; lptex += a_ststepxwhole; lsfrac += a_sstepxfrac; lptex += lsfrac >> SHIFT16XYZ; @@ -700,7 +720,7 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp int lsfrac, ltfrac; pixel_t *lpdest; pixel_t *lptex; - int llight; + int llight[3]; zvalue_t lzi; zvalue_t *lpz; int pos_shift = (pspanpackage->v * vid_buffer_width) + pspanpackage->u; @@ -712,28 +732,28 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp lptex = pspanpackage->ptex; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; - llight = pspanpackage->light; + memcpy(llight, pspanpackage->light, sizeof(int) * 3); lzi = pspanpackage->zi; do { + int i; + if ((lzi >> SHIFT16XYZ) >= *lpz) { - int color_value; - if(r_newrefdef.rdflags & RDF_IRGOGGLES && currententity->flags & RF_IR_VISIBLE) - color_value = irtable[*lptex]; + *lpdest = vid_colormap[irtable[*lptex]]; else - color_value = *lptex + (llight & 0xFF00); + *lpdest = R_ApplyLight(*lptex, llight); - *lpdest = vid_colormap[color_value]; *lpz = lzi >> SHIFT16XYZ; zdamaged = true; } lpdest++; lzi += r_zistepx; lpz++; - llight += r_lstepx; + for(i=0; i<3; i++) + llight[i] += r_lstepx[i]; lptex += a_ststepxwhole; lsfrac += a_sstepxfrac; lptex += lsfrac >> SHIFT16XYZ; @@ -770,7 +790,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) { int initialleftheight, initialrightheight; compactvert_t *plefttop, *prighttop, *pleftbottom, *prightbottom; - int working_lstepx, originalcount; + int working_lstepx[3], originalcount; int u, v; pixel_t *d_ptex; @@ -807,7 +827,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) d_sfrac = plefttop->s & 0xFFFF; d_tfrac = plefttop->t & 0xFFFF; } - d_light = plefttop->l; + memcpy(d_light, plefttop->l, sizeof(int) * 3); d_zi = plefttop->zi; if (initialleftheight == 1) @@ -817,6 +837,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) } else { + int i; + R_PolysetSetUpForLineScan(plefttop->u, plefttop->v, pleftbottom->u, pleftbottom->v); @@ -826,9 +848,12 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) // underflow (sort of turning the floor () we did in the gradient calcs into // ceil (), but plus a little bit) if (ubasestep < 0) - working_lstepx = r_lstepx - 1; + { + for(i=0; i<3; i++) + working_lstepx[i] = r_lstepx[i] - 1; + } else - working_lstepx = r_lstepx; + memcpy(working_lstepx, r_lstepx, sizeof(int) * 3); d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> SHIFT16XYZ) + ((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) * @@ -837,7 +862,9 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) d_sfracbasestep = (r_sstepy + r_sstepx * ubasestep) & 0xFFFF; d_tfracbasestep = (r_tstepy + r_tstepx * ubasestep) & 0xFFFF; - d_lightbasestep = r_lstepy + working_lstepx * ubasestep; + for(i=0; i<3; i++) + d_lightbasestep[i] = r_lstepy[i] + working_lstepx[i] * ubasestep; + d_zibasestep = r_zistepy + r_zistepx * ubasestep; d_ptexextrastep = ((r_sstepy + r_sstepx * (ubasestep + 1)) >> SHIFT16XYZ) + @@ -847,7 +874,9 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) d_sfracextrastep = (r_sstepy + r_sstepx*(ubasestep + 1)) & 0xFFFF; d_tfracextrastep = (r_tstepy + r_tstepx*(ubasestep + 1)) & 0xFFFF; - d_lightextrastep = d_lightbasestep + working_lstepx; + for(i=0; i<3; i++) + d_lightextrastep[i] = d_lightbasestep[i] + working_lstepx[i]; + d_ziextrastep = d_zibasestep + r_zistepx; R_PolysetScanLeftEdge_C(initialleftheight, d_ptex, u, v); @@ -873,7 +902,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) (plefttop->t >> SHIFT16XYZ) * r_affinetridesc.skinwidth; d_sfrac = 0; d_tfrac = 0; - d_light = plefttop->l; + memcpy(d_light, plefttop->l, sizeof(int) * 3); d_zi = plefttop->zi; if (height == 1) @@ -883,13 +912,18 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) } else { + int i; + R_PolysetSetUpForLineScan(plefttop->u, plefttop->v, pleftbottom->u, pleftbottom->v); if (ubasestep < 0) - working_lstepx = r_lstepx - 1; + { + for(i=0; i<3; i++) + working_lstepx[i] = r_lstepx[i] - 1; + } else - working_lstepx = r_lstepx; + memcpy(working_lstepx, r_lstepx, sizeof(int) * 3); d_ptexbasestep = ((r_sstepy + r_sstepx * ubasestep) >> SHIFT16XYZ) + ((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) * @@ -898,7 +932,9 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) d_sfracbasestep = (r_sstepy + r_sstepx * ubasestep) & 0xFFFF; d_tfracbasestep = (r_tstepy + r_tstepx * ubasestep) & 0xFFFF; - d_lightbasestep = r_lstepy + working_lstepx * ubasestep; + for(i=0; i<3; i++) + d_lightbasestep[i] = r_lstepy[i] + working_lstepx[i] * ubasestep; + d_zibasestep = r_zistepy + r_zistepx * ubasestep; d_ptexextrastep = ((r_sstepy + r_sstepx * (ubasestep + 1)) >> SHIFT16XYZ) + @@ -908,7 +944,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) d_sfracextrastep = (r_sstepy+r_sstepx*(ubasestep + 1)) & 0xFFFF; d_tfracextrastep = (r_tstepy+r_tstepx*(ubasestep + 1)) & 0xFFFF; - d_lightextrastep = d_lightbasestep + working_lstepx; + for(i=0; i<3; i++) + d_lightextrastep[i] = d_lightbasestep[i] + working_lstepx[i]; d_ziextrastep = d_zibasestep + r_zistepx; R_PolysetScanLeftEdge_C(height, d_ptex, u, v); diff --git a/src/client/refresh/soft/sw_surf.c b/src/client/refresh/soft/sw_surf.c index 16085e4b..b62fff21 100644 --- a/src/client/refresh/soft/sw_surf.c +++ b/src/client/refresh/soft/sw_surf.c @@ -64,7 +64,6 @@ R_TextureAnimation (const entity_t *currententity, mtexinfo_t *tex) return tex->image; } - /* ================ R_DrawSurfaceBlock8_anymip @@ -73,7 +72,7 @@ R_DrawSurfaceBlock8_anymip static void R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) { - int v, i, b, lightstep, lighttemp, light, size; + int v, i, b, size; unsigned char pix, *psource, *prowdest; size = 1 << level; @@ -82,34 +81,51 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) for (v=0 ; v> level; - lightrightstep = (r_lightptr[1] - lightright) >> level; + memcpy(lightleft, r_lightptr, sizeof(int) * 3); + memcpy(lightright, r_lightptr + 3, sizeof(int) * 3); + r_lightptr += r_lightwidth * 3; + for(i=0; i<3; i++) + { + lightleftstep[i] = (r_lightptr[i] - lightleft[i]) >> level; + lightrightstep[i] = (r_lightptr[i + 3] - lightright[i]) >> level; + } for (i=0 ; i> level; + int lightstep[3], light[3]; + int j; - light = lightright; + for(j=0; j<3; j++) + { + int lighttemp; + + lighttemp = lightleft[j] - lightright[j]; + lightstep[j] = lighttemp >> level; + } + + memcpy(light, lightright, sizeof(int) * 3); for (b=(size-1); b>=0; b--) { pix = psource[b]; - prowdest[b] = ((unsigned char *)vid_colormap) - [(light & 0xFF00) + pix]; - light += lightstep; + prowdest[b] = R_ApplyLight(pix, light); + + for(j=0; j<3; j++) + light[j] += lightstep[j]; } psource += sourcetstep; - lightright += lightrightstep; - lightleft += lightleftstep; + + for(j=0; j<3; j++) + { + lightright[j] += lightrightstep[j]; + lightleft[j] += lightleftstep[j]; + } + prowdest += surfrowbytes; } @@ -176,7 +192,7 @@ R_DrawSurface (drawsurf_t *drawsurf) for (u=0 ; u= blocklight_max) { From 480f2780451f7b08654b4210998fc266f0aa9919 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 19:20:35 +0200 Subject: [PATCH 10/23] soft: directly copy r_ambientlight --- src/client/refresh/soft/sw_alias.c | 23 +++++++++++++---------- src/client/refresh/soft/sw_image.c | 10 +++++++--- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index 831c82d8..6721480b 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -399,7 +399,6 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve for ( i = 0; i < numpoints; i++, fv++, oldv++, newv++ ) { - int j; float lightcos; const float *plightnormal; vec3_t lerped_vert; @@ -427,24 +426,28 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve // lighting lightcos = DotProduct (plightnormal, r_plightvec); - for(j=0; j<3; j++) + if (lightcos < 0) { - int temp; + int j; - temp = r_ambientlight[j]; - - if (lightcos < 0) + for(j=0; j<3; j++) { - temp += (int)(r_shadelight[j] * lightcos); + int temp; + + temp = r_ambientlight[j]; + + temp += (r_shadelight[j] * 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[j] = temp; + fv->l[j] = temp; + } } + else + memcpy(fv->l, r_ambientlight, sizeof(int) * 3); // light; if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE ) { @@ -540,7 +543,7 @@ R_AliasSetupLighting static void R_AliasSetupLighting(entity_t *currententity) { - float lightvec[3] = {-1, 0, 0}; + const float lightvec[3] = {-1, 0, 0}; vec3_t light; int i; diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index 4ba409a6..a72ea339 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -215,11 +215,12 @@ R_LoadPic (char *name, byte *pic, int width, int realwidth, int height, int real size_t data_size, imagetype_t type) { image_t *image; - size_t i, size, full_size; + size_t size, full_size; size = width * height; - if (!pic || data_size <= 0 || width <= 0 || height <= 0 || size <= 0) + /* data_size/size are unsigned */ + if (!pic || data_size == 0 || width <= 0 || height <= 0 || size == 0) return NULL; image = R_FindFreeImage(); @@ -246,6 +247,8 @@ R_LoadPic (char *name, byte *pic, int width, int realwidth, int height, int real image->transparent = false; if (type != it_wall) { + size_t i; + for (i=0 ; iheight); ofs = LittleLong(mt->offsets[0]); - if ((ofs <= 0) || (width <= 0) || (height <= 0) || + /* width/height are unsigned */ + if ((ofs <= 0) || (width == 0) || (height == 0) || ((file_size - ofs) / width < height)) { R_Printf(PRINT_ALL, "%s: can't load %s, small body\n", __func__, name); From 3f33522977ffe82566314be55c2715a093d15530 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 21:36:29 +0200 Subject: [PATCH 11/23] soft: use separate light3_t --- src/client/refresh/soft/header/local.h | 10 ++++---- src/client/refresh/soft/sw_alias.c | 4 ++-- src/client/refresh/soft/sw_image.c | 7 +++++- src/client/refresh/soft/sw_polyset.c | 33 +++++++++++++------------- src/client/refresh/soft/sw_surf.c | 12 +++++----- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index dd695d7e..959405e1 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -77,6 +77,7 @@ typedef unsigned char pixel_t; typedef int shift20_t; typedef int zvalue_t; typedef unsigned int light_t; +typedef int light3_t[3]; // xyz-prescale to 16.16 fixed-point #define SHIFT16XYZ 16 @@ -202,7 +203,7 @@ typedef struct */ typedef struct finalvert_s { int u, v, s, t; - int l[3]; // full color light + light3_t l; // full color light zvalue_t zi; int flags; float xyz[3]; // eye space @@ -210,7 +211,7 @@ typedef struct finalvert_s { typedef struct compactvert_s { int u, v, s, t; - int l[3]; // full color light + light3_t l; // full color light zvalue_t zi; } compactvert_t; @@ -502,7 +503,8 @@ extern edge_t **removeedges; typedef struct { int u, v, count; pixel_t *ptex; - int sfrac, tfrac, light[3]; + int sfrac, tfrac; + light3_t light; zvalue_t zi; } spanpackage_t; 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); void R_FreeUnusedImages(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_IMFlatShadedQuad( const vec3_t a, const vec3_t b, const vec3_t c, const vec3_t d, int color, float alpha ); diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index 6721480b..8f5f63e4 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -35,7 +35,7 @@ affinetridesc_t r_affinetridesc; static vec3_t r_plightvec; 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; static float r_shadelight[3]; @@ -447,7 +447,7 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve } } 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 ) { diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index a72ea339..ab9fc36a 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -329,8 +329,13 @@ R_LoadWal (char *name, imagetype_t type) static byte *d_16to8table = NULL; // 16 to 8 bit conversion table +/* + * Apply color light to texture pixel + * + * TODO: -22% fps lost + */ 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; byte b_r, b_g, b_b; diff --git a/src/client/refresh/soft/sw_polyset.c b/src/client/refresh/soft/sw_polyset.c index c6a1a89b..c1e33a70 100644 --- a/src/client/refresh/soft/sw_polyset.c +++ b/src/client/refresh/soft/sw_polyset.c @@ -68,7 +68,8 @@ static spanpackage_t *d_pedgespanpackage; 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 int d_ptexextrastep, d_sfracextrastep; 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.s = a->s; // s 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_p1.u = b->u; r_p1.v = b->v; r_p1.s = b->s; 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_p2.u = c->u; r_p2.v = c->v; r_p2.s = c->s; 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_PolysetSetEdgeTable (); @@ -213,7 +214,7 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv static void 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) { @@ -231,7 +232,7 @@ R_PushEdgesSpan(int u, int v, int count, d_pedgespanpackage->tfrac = d_tfrac; // 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++; @@ -446,7 +447,7 @@ R_PolysetDrawSpans8_33(const entity_t *currententity, spanpackage_t *pspanpackag pixel_t *lpdest; pixel_t *lptex; int lsfrac, ltfrac; - int llight[3]; + light3_t llight; zvalue_t lzi; zvalue_t *lpz; @@ -475,7 +476,7 @@ R_PolysetDrawSpans8_33(const entity_t *currententity, spanpackage_t *pspanpackag lptex = pspanpackage->ptex; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; - memcpy(llight, pspanpackage->light, sizeof(int) * 3); + memcpy(llight, pspanpackage->light, sizeof(light3_t)); lzi = pspanpackage->zi; do @@ -563,7 +564,7 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag pixel_t *lpdest; pixel_t *lptex; int lsfrac, ltfrac; - int llight[3]; + light3_t llight; zvalue_t lzi; zvalue_t *lpz; @@ -593,7 +594,7 @@ R_PolysetDrawSpans8_66(const entity_t *currententity, spanpackage_t *pspanpackag lptex = pspanpackage->ptex; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; - memcpy(llight, pspanpackage->light, sizeof(int) * 3); + memcpy(llight, pspanpackage->light, sizeof(light3_t)); lzi = pspanpackage->zi; do @@ -720,7 +721,7 @@ R_PolysetDrawSpans8_Opaque (const entity_t *currententity, spanpackage_t *pspanp int lsfrac, ltfrac; pixel_t *lpdest; pixel_t *lptex; - int llight[3]; + light3_t llight; zvalue_t lzi; zvalue_t *lpz; 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; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; - memcpy(llight, pspanpackage->light, sizeof(int) * 3); + memcpy(llight, pspanpackage->light, sizeof(light3_t)); lzi = pspanpackage->zi; do @@ -827,7 +828,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) d_sfrac = plefttop->s & 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; if (initialleftheight == 1) @@ -853,7 +854,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) working_lstepx[i] = r_lstepx[i] - 1; } 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) + ((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) * @@ -902,7 +903,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) (plefttop->t >> SHIFT16XYZ) * r_affinetridesc.skinwidth; d_sfrac = 0; d_tfrac = 0; - memcpy(d_light, plefttop->l, sizeof(int) * 3); + memcpy(d_light, plefttop->l, sizeof(light3_t)); d_zi = plefttop->zi; if (height == 1) @@ -923,7 +924,7 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) working_lstepx[i] = r_lstepx[i] - 1; } 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) + ((r_tstepy + r_tstepx * ubasestep) >> SHIFT16XYZ) * diff --git a/src/client/refresh/soft/sw_surf.c b/src/client/refresh/soft/sw_surf.c index b62fff21..e212c715 100644 --- a/src/client/refresh/soft/sw_surf.c +++ b/src/client/refresh/soft/sw_surf.c @@ -81,12 +81,12 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) for (v=0 ; v> level; } - memcpy(light, lightright, sizeof(int) * 3); + memcpy(light, lightright, sizeof(light3_t)); for (b=(size-1); b>=0; b--) { From 5fcf0a3afc5e741829e31a5f302da9ccdb11d8c3 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 22:11:06 +0200 Subject: [PATCH 12/23] soft: resuse compact vert_t --- src/client/refresh/soft/header/local.h | 14 +-- src/client/refresh/soft/sw_aclip.c | 166 ++++++++++++------------- src/client/refresh/soft/sw_alias.c | 42 +++---- src/client/refresh/soft/sw_polyset.c | 31 ++--- 4 files changed, 117 insertions(+), 136 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 959405e1..2006cc10 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -201,20 +201,18 @@ typedef struct ** if you change this structure be sure to change the #defines ** listed after it! */ -typedef struct finalvert_s { - int u, v, s, t; - light3_t l; // full color light - zvalue_t zi; - int flags; - float xyz[3]; // eye space -} finalvert_t; - typedef struct compactvert_s { int u, v, s, t; light3_t l; // full color light zvalue_t zi; } compactvert_t; +typedef struct finalvert_s { + compactvert_t cv; // reuse compacted type + int flags; + float xyz[3]; // eye space +} finalvert_t; + typedef struct { pixel_t *pskin; diff --git a/src/client/refresh/soft/sw_aclip.c b/src/client/refresh/soft/sw_aclip.c index 3e9663c8..c0578275 100644 --- a/src/client/refresh/soft/sw_aclip.c +++ b/src/client/refresh/soft/sw_aclip.c @@ -43,11 +43,11 @@ R_Alias_clip_z (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t *o out->xyz[1] = pfv0->xyz[1] + (pfv1->xyz[1] - pfv0->xyz[1]) * scale; out->xyz[2] = ALIAS_Z_CLIP_PLANE; - out->s = pfv0->s + (pfv1->s - pfv0->s) * scale; - out->t = pfv0->t + (pfv1->t - pfv0->t) * scale; + out->cv.s = pfv0->cv.s + (pfv1->cv.s - pfv0->cv.s) * scale; + out->cv.t = pfv0->cv.t + (pfv1->cv.t - pfv0->cv.t) * scale; for(i=0; i<3; i++) - out->l[i] = pfv0->l[i] + (pfv1->l[i] - pfv0->l[i]) * scale; + out->cv.l[i] = pfv0->cv.l[i] + (pfv1->cv.l[i] - pfv0->cv.l[i]) * scale; R_AliasProjectAndClipTestFinalVert (out); } @@ -57,37 +57,37 @@ R_Alias_clip_left (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t { float scale; - if (pfv0->v >= pfv1->v ) + if (pfv0->cv.v >= pfv1->cv.v ) { int i; - scale = (float)(r_refdef.aliasvrect.x - pfv0->u) / - (pfv1->u - pfv0->u); - out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; - out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; - out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; - out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; + scale = (float)(r_refdef.aliasvrect.x - pfv0->cv.u) / + (pfv1->cv.u - pfv0->cv.u); + out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; + out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; + out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; + out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; + out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; } else { int i; - scale = (float)(r_refdef.aliasvrect.x - pfv1->u) / - (pfv0->u - pfv1->u); - out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; - out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; - out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; - out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; + scale = (float)(r_refdef.aliasvrect.x - pfv1->cv.u) / + (pfv0->cv.u - pfv1->cv.u); + out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; + out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; + out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; + out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; + out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; } } @@ -96,37 +96,37 @@ R_Alias_clip_right (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_ { float scale; - if ( pfv0->v >= pfv1->v ) + if ( pfv0->cv.v >= pfv1->cv.v ) { int i; - scale = (float)(r_refdef.aliasvrectright - pfv0->u ) / - (pfv1->u - pfv0->u ); - out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; - out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; - out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; - out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; + scale = (float)(r_refdef.aliasvrectright - pfv0->cv.u ) / + (pfv1->cv.u - pfv0->cv.u ); + out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; + out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; + out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; + out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv0->l[i] + ( pfv1->l[i] - pfv0->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv0->cv.l[i] + ( pfv1->cv.l[i] - pfv0->cv.l[i] ) * scale + 0.5; - out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; + out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; } else { int i; - scale = (float)(r_refdef.aliasvrectright - pfv1->u ) / - (pfv0->u - pfv1->u ); - out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; - out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; - out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; - out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; + scale = (float)(r_refdef.aliasvrectright - pfv1->cv.u ) / + (pfv0->cv.u - pfv1->cv.u ); + out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; + out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; + out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; + out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; + out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; } } @@ -135,37 +135,37 @@ R_Alias_clip_top (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t { float scale; - if (pfv0->v >= pfv1->v) + if (pfv0->cv.v >= pfv1->cv.v) { int i; - scale = (float)(r_refdef.aliasvrect.y - pfv0->v) / - (pfv1->v - pfv0->v); - out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; - out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; - out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; - out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; + scale = (float)(r_refdef.aliasvrect.y - pfv0->cv.v) / + (pfv1->cv.v - pfv0->cv.v); + out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; + out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; + out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; + out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv0->l[i] + ( pfv1->l[i] - pfv0->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv0->cv.l[i] + ( pfv1->cv.l[i] - pfv0->cv.l[i] ) * scale + 0.5; - out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; + out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; } else { int i; - scale = (float)(r_refdef.aliasvrect.y - pfv1->v) / - (pfv0->v - pfv1->v); - out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; - out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; - out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; - out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; + scale = (float)(r_refdef.aliasvrect.y - pfv1->cv.v) / + (pfv0->cv.v - pfv1->cv.v); + out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; + out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; + out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; + out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; + out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; } } @@ -175,39 +175,39 @@ R_Alias_clip_bottom (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert { float scale; - if (pfv0->v >= pfv1->v) + if (pfv0->cv.v >= pfv1->cv.v) { int i; - scale = (float)(r_refdef.aliasvrectbottom - pfv0->v) / - (pfv1->v - pfv0->v); + scale = (float)(r_refdef.aliasvrectbottom - pfv0->cv.v) / + (pfv1->cv.v - pfv0->cv.v); - out->u = pfv0->u + ( pfv1->u - pfv0->u ) * scale + 0.5; - out->v = pfv0->v + ( pfv1->v - pfv0->v ) * scale + 0.5; - out->s = pfv0->s + ( pfv1->s - pfv0->s ) * scale + 0.5; - out->t = pfv0->t + ( pfv1->t - pfv0->t ) * scale + 0.5; + out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; + out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; + out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; + out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv0->l[i] + ( pfv1->l[i] - pfv0->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv0->cv.l[i] + ( pfv1->cv.l[i] - pfv0->cv.l[i] ) * scale + 0.5; - out->zi = pfv0->zi + ( pfv1->zi - pfv0->zi) * scale + 0.5; + out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; } else { int i; - scale = (float)(r_refdef.aliasvrectbottom - pfv1->v) / - (pfv0->v - pfv1->v); + scale = (float)(r_refdef.aliasvrectbottom - pfv1->cv.v) / + (pfv0->cv.v - pfv1->cv.v); - out->u = pfv1->u + ( pfv0->u - pfv1->u ) * scale + 0.5; - out->v = pfv1->v + ( pfv0->v - pfv1->v ) * scale + 0.5; - out->s = pfv1->s + ( pfv0->s - pfv1->s ) * scale + 0.5; - out->t = pfv1->t + ( pfv0->t - pfv1->t ) * scale + 0.5; + out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; + out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; + out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; + out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; for(i=0; i<3; i++) - out->l[i] = pfv1->l[i] + ( pfv0->l[i] - pfv1->l[i] ) * scale + 0.5; + out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - out->zi = pfv1->zi + ( pfv0->zi - pfv1->zi) * scale + 0.5; + out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; } } @@ -236,13 +236,13 @@ R_AliasClip (const finalvert_t *in, finalvert_t *out, int flag, int count, { clip (&in[j], &in[i], &out[k]); out[k].flags = 0; - if (out[k].u < r_refdef.aliasvrect.x) + if (out[k].cv.u < r_refdef.aliasvrect.x) out[k].flags |= ALIAS_LEFT_CLIP; - if (out[k].v < r_refdef.aliasvrect.y) + if (out[k].cv.v < r_refdef.aliasvrect.y) out[k].flags |= ALIAS_TOP_CLIP; - if (out[k].u > r_refdef.aliasvrectright) + if (out[k].cv.u > r_refdef.aliasvrectright) out[k].flags |= ALIAS_RIGHT_CLIP; - if (out[k].v > r_refdef.aliasvrectbottom) + if (out[k].cv.v > r_refdef.aliasvrectbottom) out[k].flags |= ALIAS_BOTTOM_CLIP; k++; } @@ -335,15 +335,15 @@ R_AliasClipTriangle(const entity_t *currententity, const finalvert_t *index0, co for (i=0 ; i r_refdef.aliasvrectright) - fv[pingpong][i].u = r_refdef.aliasvrectright; + if (fv[pingpong][i].cv.u < r_refdef.aliasvrect.x) + fv[pingpong][i].cv.u = r_refdef.aliasvrect.x; + else if (fv[pingpong][i].cv.u > r_refdef.aliasvrectright) + fv[pingpong][i].cv.u = r_refdef.aliasvrectright; - if (fv[pingpong][i].v < r_refdef.aliasvrect.y) - fv[pingpong][i].v = r_refdef.aliasvrect.y; - else if (fv[pingpong][i].v > r_refdef.aliasvrectbottom) - fv[pingpong][i].v = r_refdef.aliasvrectbottom; + if (fv[pingpong][i].cv.v < r_refdef.aliasvrect.y) + fv[pingpong][i].cv.v = r_refdef.aliasvrect.y; + else if (fv[pingpong][i].cv.v > r_refdef.aliasvrectbottom) + fv[pingpong][i].cv.v = r_refdef.aliasvrectbottom; fv[pingpong][i].flags = 0; } diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index 8f5f63e4..63009a7f 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -257,14 +257,14 @@ R_AliasPreparePoints (const entity_t *currententity, finalvert_t *verts, const f continue; // completely clipped // insert s/t coordinates - pfv[0]->s = pstverts[ptri->index_st[0]].s << SHIFT16XYZ; - pfv[0]->t = pstverts[ptri->index_st[0]].t << SHIFT16XYZ; + pfv[0]->cv.s = pstverts[ptri->index_st[0]].s << SHIFT16XYZ; + pfv[0]->cv.t = pstverts[ptri->index_st[0]].t << SHIFT16XYZ; - pfv[1]->s = pstverts[ptri->index_st[1]].s << SHIFT16XYZ; - pfv[1]->t = pstverts[ptri->index_st[1]].t << SHIFT16XYZ; + pfv[1]->cv.s = pstverts[ptri->index_st[1]].s << SHIFT16XYZ; + pfv[1]->cv.t = pstverts[ptri->index_st[1]].t << SHIFT16XYZ; - pfv[2]->s = pstverts[ptri->index_st[2]].s << SHIFT16XYZ; - pfv[2]->t = pstverts[ptri->index_st[2]].t << SHIFT16XYZ; + pfv[2]->cv.s = pstverts[ptri->index_st[2]].s << SHIFT16XYZ; + pfv[2]->cv.t = pstverts[ptri->index_st[2]].t << SHIFT16XYZ; if ( ! (pfv[0]->flags | pfv[1]->flags | pfv[2]->flags) ) { @@ -289,14 +289,14 @@ R_AliasPreparePoints (const entity_t *currententity, finalvert_t *verts, const f continue; // completely clipped // insert s/t coordinates - pfv[0]->s = pstverts[ptri->index_st[0]].s << SHIFT16XYZ; - pfv[0]->t = pstverts[ptri->index_st[0]].t << SHIFT16XYZ; + pfv[0]->cv.s = pstverts[ptri->index_st[0]].s << SHIFT16XYZ; + pfv[0]->cv.t = pstverts[ptri->index_st[0]].t << SHIFT16XYZ; - pfv[1]->s = pstverts[ptri->index_st[1]].s << SHIFT16XYZ; - pfv[1]->t = pstverts[ptri->index_st[1]].t << SHIFT16XYZ; + pfv[1]->cv.s = pstverts[ptri->index_st[1]].s << SHIFT16XYZ; + pfv[1]->cv.t = pstverts[ptri->index_st[1]].t << SHIFT16XYZ; - pfv[2]->s = pstverts[ptri->index_st[2]].s << SHIFT16XYZ; - pfv[2]->t = pstverts[ptri->index_st[2]].t << SHIFT16XYZ; + pfv[2]->cv.s = pstverts[ptri->index_st[2]].s << SHIFT16XYZ; + pfv[2]->cv.t = pstverts[ptri->index_st[2]].t << SHIFT16XYZ; if ( ! (pfv[0]->flags | pfv[1]->flags | pfv[2]->flags) ) { @@ -443,11 +443,11 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve if (temp < 0) temp = 0; - fv->l[j] = temp; + fv->cv.l[j] = temp; } } else - memcpy(fv->l, r_ambientlight, sizeof(light3_t)); // light; + memcpy(fv->cv.l, r_ambientlight, sizeof(light3_t)); // light; if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE ) { @@ -478,18 +478,18 @@ R_AliasProjectAndClipTestFinalVert( finalvert_t *fv ) z = fv->xyz[2]; zi = 1.0 / z; - fv->zi = zi * s_ziscale; + fv->cv.zi = zi * s_ziscale; - fv->u = (x * aliasxscale * zi) + aliasxcenter; - fv->v = (y * aliasyscale * zi) + aliasycenter; + fv->cv.u = (x * aliasxscale * zi) + aliasxcenter; + fv->cv.v = (y * aliasyscale * zi) + aliasycenter; - if (fv->u < r_refdef.aliasvrect.x) + if (fv->cv.u < r_refdef.aliasvrect.x) fv->flags |= ALIAS_LEFT_CLIP; - if (fv->v < r_refdef.aliasvrect.y) + if (fv->cv.v < r_refdef.aliasvrect.y) fv->flags |= ALIAS_TOP_CLIP; - if (fv->u > r_refdef.aliasvrectright) + if (fv->cv.u > r_refdef.aliasvrectright) fv->flags |= ALIAS_RIGHT_CLIP; - if (fv->v > r_refdef.aliasvrectbottom) + if (fv->cv.v > r_refdef.aliasvrectbottom) fv->flags |= ALIAS_BOTTOM_CLIP; } diff --git a/src/client/refresh/soft/sw_polyset.c b/src/client/refresh/soft/sw_polyset.c index c1e33a70..365c36e4 100644 --- a/src/client/refresh/soft/sw_polyset.c +++ b/src/client/refresh/soft/sw_polyset.c @@ -170,14 +170,14 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv ( a->v[0] - b->v[0] ) * ( a->v[1] - c->v[1] ); */ - dv0_ab = a->u - b->u; - dv1_ab = a->v - b->v; + dv0_ab = a->cv.u - b->cv.u; + dv1_ab = a->cv.v - b->cv.v; if ( !( dv0_ab | dv1_ab ) ) return; - dv0_ac = a->u - c->u; - dv1_ac = a->v - c->v; + dv0_ac = a->cv.u - c->cv.u; + dv1_ac = a->cv.v - c->cv.v; if ( !( dv0_ac | dv1_ac ) ) return; @@ -186,26 +186,9 @@ R_DrawTriangle(const entity_t *currententity, const finalvert_t *a, const finalv if ( d_xdenom < 0 ) { - r_p0.u = a->u; // u - r_p0.v = a->v; // v - r_p0.s = a->s; // s - r_p0.t = a->t; // t - memcpy(r_p0.l, a->l, sizeof(light3_t)); // light - r_p0.zi = a->zi; // iz - - r_p1.u = b->u; - r_p1.v = b->v; - r_p1.s = b->s; - r_p1.t = b->t; - memcpy(r_p1.l, b->l, sizeof(light3_t)); // light - r_p1.zi = b->zi; - - r_p2.u = c->u; - r_p2.v = c->v; - r_p2.s = c->s; - r_p2.t = c->t; - memcpy(r_p2.l, c->l, sizeof(light3_t)); // light; - r_p2.zi = c->zi; + memcpy(&r_p0, &a->cv, sizeof(compactvert_t)); + memcpy(&r_p1, &b->cv, sizeof(compactvert_t)); + memcpy(&r_p2, &c->cv, sizeof(compactvert_t)); R_PolysetSetEdgeTable (); R_RasterizeAliasPolySmooth(currententity); From 5eed0ca5d9524baeff66c7960dfdd5c35c5fee66 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sat, 19 Mar 2022 22:59:14 +0200 Subject: [PATCH 13/23] soft: reuse R_Alias_clip_scale --- src/client/refresh/soft/sw_aclip.c | 106 +++++++---------------------- 1 file changed, 24 insertions(+), 82 deletions(-) diff --git a/src/client/refresh/soft/sw_aclip.c b/src/client/refresh/soft/sw_aclip.c index c0578275..df6d3a06 100644 --- a/src/client/refresh/soft/sw_aclip.c +++ b/src/client/refresh/soft/sw_aclip.c @@ -52,6 +52,22 @@ R_Alias_clip_z (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t *o R_AliasProjectAndClipTestFinalVert (out); } +static void +R_Alias_clip_scale (const finalvert_t *pfv0, const finalvert_t *pfv1, float scale, finalvert_t *out) +{ + int i; + + out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; + out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; + out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; + out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; + + for(i=0; i<3; i++) + out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; + + out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; +} + static void R_Alias_clip_left (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t *out) { @@ -59,35 +75,17 @@ R_Alias_clip_left (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t if (pfv0->cv.v >= pfv1->cv.v ) { - int i; - scale = (float)(r_refdef.aliasvrect.x - pfv0->cv.u) / (pfv1->cv.u - pfv0->cv.u); - out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; - out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; - out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; - out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; - for(i=0; i<3; i++) - out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv1, pfv0, scale, out); } else { - int i; - scale = (float)(r_refdef.aliasvrect.x - pfv1->cv.u) / (pfv0->cv.u - pfv1->cv.u); - out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; - out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; - out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; - out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; - for(i=0; i<3; i++) - out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv0, pfv1, scale, out); } } @@ -98,35 +96,17 @@ R_Alias_clip_right (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_ if ( pfv0->cv.v >= pfv1->cv.v ) { - int i; - scale = (float)(r_refdef.aliasvrectright - pfv0->cv.u ) / (pfv1->cv.u - pfv0->cv.u ); - out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; - out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; - out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; - out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; - for(i=0; i<3; i++) - out->cv.l[i] = pfv0->cv.l[i] + ( pfv1->cv.l[i] - pfv0->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv1, pfv0, scale, out); } else { - int i; - scale = (float)(r_refdef.aliasvrectright - pfv1->cv.u ) / (pfv0->cv.u - pfv1->cv.u ); - out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; - out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; - out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; - out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; - for(i=0; i<3; i++) - out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv0, pfv1, scale, out); } } @@ -137,35 +117,17 @@ R_Alias_clip_top (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert_t if (pfv0->cv.v >= pfv1->cv.v) { - int i; - scale = (float)(r_refdef.aliasvrect.y - pfv0->cv.v) / (pfv1->cv.v - pfv0->cv.v); - out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; - out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; - out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; - out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; - for(i=0; i<3; i++) - out->cv.l[i] = pfv0->cv.l[i] + ( pfv1->cv.l[i] - pfv0->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv1, pfv0, scale, out); } else { - int i; - scale = (float)(r_refdef.aliasvrect.y - pfv1->cv.v) / (pfv0->cv.v - pfv1->cv.v); - out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; - out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; - out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; - out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; - for(i=0; i<3; i++) - out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv0, pfv1, scale, out); } } @@ -177,37 +139,17 @@ R_Alias_clip_bottom (const finalvert_t *pfv0, const finalvert_t *pfv1, finalvert if (pfv0->cv.v >= pfv1->cv.v) { - int i; - scale = (float)(r_refdef.aliasvrectbottom - pfv0->cv.v) / (pfv1->cv.v - pfv0->cv.v); - out->cv.u = pfv0->cv.u + ( pfv1->cv.u - pfv0->cv.u ) * scale + 0.5; - out->cv.v = pfv0->cv.v + ( pfv1->cv.v - pfv0->cv.v ) * scale + 0.5; - out->cv.s = pfv0->cv.s + ( pfv1->cv.s - pfv0->cv.s ) * scale + 0.5; - out->cv.t = pfv0->cv.t + ( pfv1->cv.t - pfv0->cv.t ) * scale + 0.5; - - for(i=0; i<3; i++) - out->cv.l[i] = pfv0->cv.l[i] + ( pfv1->cv.l[i] - pfv0->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv0->cv.zi + ( pfv1->cv.zi - pfv0->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv1, pfv0, scale, out); } else { - int i; - scale = (float)(r_refdef.aliasvrectbottom - pfv1->cv.v) / (pfv0->cv.v - pfv1->cv.v); - out->cv.u = pfv1->cv.u + ( pfv0->cv.u - pfv1->cv.u ) * scale + 0.5; - out->cv.v = pfv1->cv.v + ( pfv0->cv.v - pfv1->cv.v ) * scale + 0.5; - out->cv.s = pfv1->cv.s + ( pfv0->cv.s - pfv1->cv.s ) * scale + 0.5; - out->cv.t = pfv1->cv.t + ( pfv0->cv.t - pfv1->cv.t ) * scale + 0.5; - - for(i=0; i<3; i++) - out->cv.l[i] = pfv1->cv.l[i] + ( pfv0->cv.l[i] - pfv1->cv.l[i] ) * scale + 0.5; - - out->cv.zi = pfv1->cv.zi + ( pfv0->cv.zi - pfv1->cv.zi) * scale + 0.5; + R_Alias_clip_scale (pfv0, pfv1, scale, out); } } From 6af5dc1d98479dedce29704dcc899e7728823dfe Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sun, 20 Mar 2022 12:26:45 +0200 Subject: [PATCH 14/23] soft: more use of light3_t --- src/client/refresh/soft/sw_alias.c | 6 +++--- src/client/refresh/soft/sw_light.c | 14 ++++++-------- src/client/refresh/soft/sw_polyset.c | 12 +++++++----- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index 63009a7f..b4aa0e59 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -37,7 +37,7 @@ static vec3_t r_lerp_frontv, r_lerp_backv, r_lerp_move; static light3_t r_ambientlight; int r_aliasblendcolor; -static float r_shadelight[3]; +static vec3_t r_shadelight; static daliasframe_t *r_thisframe, *r_lastframe; @@ -447,7 +447,7 @@ R_AliasTransformFinalVerts(const entity_t *currententity, int numpoints, finalve } } else - memcpy(fv->cv.l, r_ambientlight, sizeof(light3_t)); // light; + memcpy(fv->cv.l, r_ambientlight, sizeof(light3_t)); if ( fv->xyz[2] < ALIAS_Z_CLIP_PLANE ) { @@ -543,7 +543,7 @@ R_AliasSetupLighting static void R_AliasSetupLighting(entity_t *currententity) { - const float lightvec[3] = {-1, 0, 0}; + const vec3_t lightvec = {-1, 0, 0}; vec3_t light; int i; diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index c0d877d2..1333f9da 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -450,16 +450,14 @@ R_BuildLightMap (drawsurf_t* drawsurf) { do { - byte light = sqrt(( - lightmap[0] * lightmap[0] + - lightmap[1] * lightmap[1] + - lightmap[2] * lightmap[2] - ) / 3); - *curr_light += light * scale; + light_t light = ( + lightmap[0] + lightmap[1] + lightmap[2] + ) / 3 * scale; + *curr_light += light; curr_light++; - *curr_light += light * scale; + *curr_light += light; curr_light++; - *curr_light += light * scale; + *curr_light += light; curr_light++; lightmap += 3; /* skip to next lightmap */ diff --git a/src/client/refresh/soft/sw_polyset.c b/src/client/refresh/soft/sw_polyset.c index 365c36e4..0f77c7da 100644 --- a/src/client/refresh/soft/sw_polyset.c +++ b/src/client/refresh/soft/sw_polyset.c @@ -59,8 +59,9 @@ static edgetable edgetables[12] = { }; // FIXME: some of these can become statics -static int a_sstepxfrac, a_tstepxfrac, r_lstepx[3], a_ststepxwhole; -static int r_sstepx, r_tstepx, r_lstepy[3], r_sstepy, r_tstepy; +static int a_sstepxfrac, a_tstepxfrac, a_ststepxwhole; +static int r_sstepx, r_tstepx, r_sstepy, r_tstepy; +static light3_t r_lstepx, r_lstepy; static zvalue_t r_zistepx, r_zistepy; static int d_aspancount; @@ -72,8 +73,8 @@ static int d_sfrac, d_tfrac; static light3_t d_light; static zvalue_t d_zi; static int d_ptexextrastep, d_sfracextrastep; -static int d_tfracextrastep, d_lightextrastep[3]; -static int d_lightbasestep[3], d_ptexbasestep; +static int d_tfracextrastep, d_ptexbasestep; +static light3_t d_lightbasestep, d_lightextrastep; static int d_sfracbasestep, d_tfracbasestep; static zvalue_t d_ziextrastep, d_zibasestep; @@ -774,7 +775,8 @@ R_RasterizeAliasPolySmooth(const entity_t *currententity) { int initialleftheight, initialrightheight; compactvert_t *plefttop, *prighttop, *pleftbottom, *prightbottom; - int working_lstepx[3], originalcount; + light3_t working_lstepx; + int originalcount; int u, v; pixel_t *d_ptex; From b5d45d0371452ce0f94c9a1d91a01024a8314ba6 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sun, 20 Mar 2022 14:34:40 +0200 Subject: [PATCH 15/23] soft: use lightmap convert table --- src/client/refresh/soft/header/local.h | 1 + src/client/refresh/soft/sw_image.c | 17 ++++++------- src/client/refresh/soft/sw_main.c | 34 +++++++++++++++++++++++++- 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 2006cc10..8488ca67 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -97,6 +97,7 @@ extern viddef_t vid; extern pixel_t *vid_buffer; // invisible buffer extern pixel_t *vid_colormap; // 256 * VID_GRADES size extern pixel_t *vid_alphamap; // 256 * 256 translucency map +extern byte *vid_lightmap; // 64 light grades for 256 colors extern char shift_size; // shift size in fixed-point typedef struct diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index ab9fc36a..cafd091b 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -337,19 +337,18 @@ static byte *d_16to8table = NULL; // 16 to 8 bit conversion table pixel_t R_ApplyLight(pixel_t pix, const light3_t light) { - pixel_t i_r, i_g, i_b; byte b_r, b_g, b_b; int i_c; - /* get index of color component of each component */ - i_r = vid_colormap[(light[0] & 0xFF00) + pix]; - i_g = vid_colormap[(light[1] & 0xFF00) + pix]; - i_b = vid_colormap[(light[2] & 0xFF00) + pix]; - /* get color component for each component */ - b_r = d_8to24table[i_r * 4 + 0]; - b_g = d_8to24table[i_g * 4 + 1]; - b_b = d_8to24table[i_b * 4 + 2]; + b_r = d_8to24table[pix * 4 + 0]; + b_g = d_8to24table[pix * 4 + 1]; + b_b = d_8to24table[pix * 4 + 2]; + + /* scale by light */ + b_r = vid_lightmap[(light[0] & 0xFF00) + b_r]; + b_g = vid_lightmap[(light[1] & 0xFF00) + b_g]; + b_b = vid_lightmap[(light[2] & 0xFF00) + b_b]; /* convert back to indexed color */ b_r = ( b_r >> 3 ) & 31; diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index 31ab9d84..cb941a87 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -40,6 +40,7 @@ static int swap_current = 0; espan_t *vid_polygon_spans = NULL; pixel_t *vid_colormap = NULL; pixel_t *vid_alphamap = NULL; +byte *vid_lightmap = NULL; static int vid_minu, vid_minv, vid_maxu, vid_maxv; static int vid_zminu, vid_zminv, vid_zmaxu, vid_zmaxv; @@ -512,6 +513,14 @@ RE_Shutdown (void) free (vid_colormap); vid_colormap = NULL; } + + /* free lightmap */ + if (vid_lightmap) + { + free (vid_lightmap); + vid_lightmap = NULL; + } + R_UnRegister (); Mod_FreeAll (); R_ShutdownImages (); @@ -1754,8 +1763,10 @@ Draw_GetPalette (void) { byte *pal, *out; int i; + int white = 0; - // get the palette and colormap + + /* get the palette and colormap */ LoadPCX ("pics/colormap.pcx", &vid_colormap, &pal, NULL, NULL); if (!vid_colormap) ri.Sys_Error (ERR_FATAL, "Couldn't load pics/colormap.pcx"); @@ -1773,9 +1784,30 @@ Draw_GetPalette (void) out[0] = r; out[1] = g; out[2] = b; + + if (r == 255 && g == 255 && b == 255) + white = i; } free (pal); + + R_Printf(PRINT_ALL,"white color in palete: %d\n", white); + + /* generate lightmap */ + vid_lightmap = malloc(64 * 256 * sizeof(byte)); + for (i=0; i < 64; i++) + { + int j, scale; + + scale = ( + d_8to24table[vid_colormap[i * 256 + white] * 4 + 0] + + d_8to24table[vid_colormap[i * 256 + white] * 4 + 1] + + d_8to24table[vid_colormap[i * 256 + white] * 4 + 2] + ) / 3; + + for(j=0; j < 256; j++) + vid_lightmap[i * 256 + j] = (j * scale) / 255; + } } /* From c73eac63b3c3c687f75d0a47971637444356fb90 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sun, 20 Mar 2022 21:21:31 +0200 Subject: [PATCH 16/23] soft: rename r_colorlight -> sw_colorlight --- doc/040_cvarlist.md | 1 + src/client/refresh/soft/sw_main.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/040_cvarlist.md b/doc/040_cvarlist.md index 6d608651..c54fa253 100644 --- a/doc/040_cvarlist.md +++ b/doc/040_cvarlist.md @@ -424,6 +424,7 @@ it's `+set busywait 0` (setting the `busywait` cvar) and `-portable` custom gun field of view is used. Defaults to `8`, which is more or less optimal for the default gun field of view of 80. +* **sw_colorlight**: enable experimental color lighting. ## cvar operations diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index cb941a87..2a4f9bde 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -398,7 +398,7 @@ R_RegisterVariables (void) r_gunfov = ri.Cvar_Get( "r_gunfov", "80", CVAR_ARCHIVE ); r_farsee = ri.Cvar_Get("r_farsee", "0", CVAR_LATCH | CVAR_ARCHIVE); r_lightmap = ri.Cvar_Get("r_lightmap", "0", 0); - r_colorlight = ri.Cvar_Get("r_colorlight", "0", CVAR_ARCHIVE); + r_colorlight = ri.Cvar_Get("sw_colorlight", "0", CVAR_ARCHIVE); r_speeds = ri.Cvar_Get ("r_speeds", "0", 0); r_fullbright = ri.Cvar_Get ("r_fullbright", "0", 0); r_drawentities = ri.Cvar_Get ("r_drawentities", "1", 0); From ff1814922e30323c070b64275fbb6a494d5d2d0c Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Mon, 21 Mar 2022 22:56:09 +0200 Subject: [PATCH 17/23] soft: use vid_lightthreshold for skip apply light --- src/client/refresh/soft/header/local.h | 1 + src/client/refresh/soft/sw_image.c | 4 ++++ src/client/refresh/soft/sw_main.c | 5 +++++ src/client/refresh/soft/sw_surf.c | 3 ++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 8488ca67..16d77e44 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -98,6 +98,7 @@ extern pixel_t *vid_buffer; // invisible buffer extern pixel_t *vid_colormap; // 256 * VID_GRADES size extern pixel_t *vid_alphamap; // 256 * 256 translucency map extern byte *vid_lightmap; // 64 light grades for 256 colors +extern light_t vid_lightthreshold; // full light distance maximum extern char shift_size; // shift size in fixed-point typedef struct diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index cafd091b..02e8a183 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -340,6 +340,10 @@ R_ApplyLight(pixel_t pix, const light3_t light) byte b_r, b_g, b_b; int i_c; + /* full light, code could skip light processing */ + if (((light[0] | light[1] | light[2]) & 0xFF00) <= vid_lightthreshold) + return pix; + /* get color component for each component */ b_r = d_8to24table[pix * 4 + 0]; b_g = d_8to24table[pix * 4 + 1]; diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index 2a4f9bde..6008754e 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -41,6 +41,7 @@ espan_t *vid_polygon_spans = NULL; pixel_t *vid_colormap = NULL; pixel_t *vid_alphamap = NULL; byte *vid_lightmap = NULL; +light_t vid_lightthreshold = 0; static int vid_minu, vid_minv, vid_maxu, vid_maxv; static int vid_zminu, vid_zminv, vid_zmaxu, vid_zmaxv; @@ -1805,6 +1806,10 @@ Draw_GetPalette (void) d_8to24table[vid_colormap[i * 256 + white] * 4 + 2] ) / 3; + /* full light distance maximum */ + if (scale == 255) + vid_lightthreshold = i * 256; + for(j=0; j < 256; j++) vid_lightmap[i * 256 + j] = (j * scale) / 255; } diff --git a/src/client/refresh/soft/sw_surf.c b/src/client/refresh/soft/sw_surf.c index e212c715..a08ba3ca 100644 --- a/src/client/refresh/soft/sw_surf.c +++ b/src/client/refresh/soft/sw_surf.c @@ -73,7 +73,7 @@ static void R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) { int v, i, b, size; - unsigned char pix, *psource, *prowdest; + unsigned char *psource, *prowdest; size = 1 << level; psource = pbasesource; @@ -111,6 +111,7 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) for (b=(size-1); b>=0; b--) { + pixel_t pix; pix = psource[b]; prowdest[b] = R_ApplyLight(pix, light); From c20c47b06fdc9a5acda99067f033bd2e92f70ece Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Mon, 21 Mar 2022 23:19:38 +0200 Subject: [PATCH 18/23] soft: skip light apply on wall's --- src/client/refresh/soft/sw_surf.c | 43 ++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/client/refresh/soft/sw_surf.c b/src/client/refresh/soft/sw_surf.c index a08ba3ca..02098683 100644 --- a/src/client/refresh/soft/sw_surf.c +++ b/src/client/refresh/soft/sw_surf.c @@ -64,6 +64,25 @@ R_TextureAnimation (const entity_t *currententity, mtexinfo_t *tex) return tex->image; } +/* + * Light apply is not required + */ +static qboolean +R_SameLight(size_t size, const light3_t lightstep, const light3_t light) +{ + int i; + + if (((light[0] | light[1] | light[2]) & 0xFF00) > vid_lightthreshold) + return false; + + for (i=0; i<3; i++) + { + if (((size * lightstep[i] + light[i]) & 0xFF00) > vid_lightthreshold) + return false; + } + return true; +} + /* ================ R_DrawSurfaceBlock8_anymip @@ -72,7 +91,7 @@ R_DrawSurfaceBlock8_anymip static void R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) { - int v, i, b, size; + int v, i, size; unsigned char *psource, *prowdest; size = 1 << level; @@ -109,14 +128,24 @@ R_DrawSurfaceBlock8_anymip (int level, int surfrowbytes) memcpy(light, lightright, sizeof(light3_t)); - for (b=(size-1); b>=0; b--) + if (R_SameLight(size, lightstep, light)) { - pixel_t pix; - pix = psource[b]; - prowdest[b] = R_ApplyLight(pix, light); + /* just copy without light apply */ + memcpy(prowdest, psource, size * sizeof(pixel_t)); + } + else + { + int b; - for(j=0; j<3; j++) - light[j] += lightstep[j]; + for (b=(size-1); b>=0; b--) + { + pixel_t pix; + pix = psource[b]; + prowdest[b] = R_ApplyLight(pix, light); + + for(j=0; j<3; j++) + light[j] += lightstep[j]; + } } psource += sourcetstep; From 3b825670ba4ed5b50cf17602eb6ca75683b2fcd3 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 22 Mar 2022 08:37:57 +0200 Subject: [PATCH 19/23] soft: fix lightmap mask --- src/client/refresh/soft/header/local.h | 3 +++ src/client/refresh/soft/sw_image.c | 10 ++++++---- src/client/refresh/soft/sw_surf.c | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/client/refresh/soft/header/local.h b/src/client/refresh/soft/header/local.h index 16d77e44..6faa8c68 100644 --- a/src/client/refresh/soft/header/local.h +++ b/src/client/refresh/soft/header/local.h @@ -93,6 +93,9 @@ typedef enum rserr_unknown } rserr_t; +/* 64 light grades available */ +#define LIGHTMASK 0x3F00 + extern viddef_t vid; extern pixel_t *vid_buffer; // invisible buffer extern pixel_t *vid_colormap; // 256 * VID_GRADES size diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index 02e8a183..0ff4519e 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -332,6 +332,8 @@ static byte *d_16to8table = NULL; // 16 to 8 bit conversion table /* * Apply color light to texture pixel * + * vid_colormap[pix + ( llight & 0xFF00 )]; + * * TODO: -22% fps lost */ pixel_t @@ -341,7 +343,7 @@ R_ApplyLight(pixel_t pix, const light3_t light) int i_c; /* full light, code could skip light processing */ - if (((light[0] | light[1] | light[2]) & 0xFF00) <= vid_lightthreshold) + if (((light[0] | light[1] | light[2]) & LIGHTMASK) <= vid_lightthreshold) return pix; /* get color component for each component */ @@ -350,9 +352,9 @@ R_ApplyLight(pixel_t pix, const light3_t light) b_b = d_8to24table[pix * 4 + 2]; /* scale by light */ - b_r = vid_lightmap[(light[0] & 0xFF00) + b_r]; - b_g = vid_lightmap[(light[1] & 0xFF00) + b_g]; - b_b = vid_lightmap[(light[2] & 0xFF00) + b_b]; + b_r = vid_lightmap[(light[0] & LIGHTMASK) + b_r]; + b_g = vid_lightmap[(light[1] & LIGHTMASK) + b_g]; + b_b = vid_lightmap[(light[2] & LIGHTMASK) + b_b]; /* convert back to indexed color */ b_r = ( b_r >> 3 ) & 31; diff --git a/src/client/refresh/soft/sw_surf.c b/src/client/refresh/soft/sw_surf.c index 02098683..c86340de 100644 --- a/src/client/refresh/soft/sw_surf.c +++ b/src/client/refresh/soft/sw_surf.c @@ -72,12 +72,12 @@ R_SameLight(size_t size, const light3_t lightstep, const light3_t light) { int i; - if (((light[0] | light[1] | light[2]) & 0xFF00) > vid_lightthreshold) + if (((light[0] | light[1] | light[2]) & LIGHTMASK) > vid_lightthreshold) return false; for (i=0; i<3; i++) { - if (((size * lightstep[i] + light[i]) & 0xFF00) > vid_lightthreshold) + if (((size * lightstep[i] + light[i]) & LIGHTMASK) > vid_lightthreshold) return false; } return true; From a0da1717cc529470f42e8d1b8c9d381c9346416b Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 22 Mar 2022 08:53:59 +0200 Subject: [PATCH 20/23] soft: use max light in blocklights (colorlight=0) --- src/client/refresh/soft/sw_light.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/client/refresh/soft/sw_light.c b/src/client/refresh/soft/sw_light.c index 1333f9da..a6c2aa81 100644 --- a/src/client/refresh/soft/sw_light.c +++ b/src/client/refresh/soft/sw_light.c @@ -450,9 +450,16 @@ R_BuildLightMap (drawsurf_t* drawsurf) { do { - light_t light = ( - lightmap[0] + lightmap[1] + lightmap[2] - ) / 3 * scale; + light_t light; + + light = lightmap[0]; + if (light < lightmap[1]) + light = lightmap[1]; + if (light < lightmap[2]) + light = lightmap[2]; + + light *= scale; + *curr_light += light; curr_light++; *curr_light += light; From 020ce271095aed6e9f6b17eed76e9f096bd91bf9 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 22 Mar 2022 21:39:53 +0200 Subject: [PATCH 21/23] soft: speedup colorlight=0 colorlight>0 is regressed little bit. --- src/client/refresh/soft/sw_alias.c | 2 +- src/client/refresh/soft/sw_image.c | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index b4aa0e59..04fe3bca 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -586,7 +586,7 @@ R_AliasSetupLighting(entity_t *currententity) } } - if(r_colorlight->value == 0) + if(r_colorlight->value < 2) { float temp = (light[0] + light[1] + light[2]) / 3; diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index 0ff4519e..4ac01b5b 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -332,8 +332,6 @@ static byte *d_16to8table = NULL; // 16 to 8 bit conversion table /* * Apply color light to texture pixel * - * vid_colormap[pix + ( llight & 0xFF00 )]; - * * TODO: -22% fps lost */ pixel_t @@ -341,9 +339,18 @@ R_ApplyLight(pixel_t pix, const light3_t light) { byte b_r, b_g, b_b; int i_c; + light3_t light_masked; + + light_masked[0] = light[0] & LIGHTMASK; + light_masked[1] = light[1] & LIGHTMASK; + light_masked[2] = light[2] & LIGHTMASK; + + /* same light or colorlight == 0 */ + if (light_masked[0] == light_masked[1] && light_masked[0] == light_masked[2]) + return vid_colormap[pix + light_masked[0]]; /* full light, code could skip light processing */ - if (((light[0] | light[1] | light[2]) & LIGHTMASK) <= vid_lightthreshold) + if ((light_masked[0] | light_masked[1] | light_masked[2]) <= vid_lightthreshold) return pix; /* get color component for each component */ @@ -352,9 +359,9 @@ R_ApplyLight(pixel_t pix, const light3_t light) b_b = d_8to24table[pix * 4 + 2]; /* scale by light */ - b_r = vid_lightmap[(light[0] & LIGHTMASK) + b_r]; - b_g = vid_lightmap[(light[1] & LIGHTMASK) + b_g]; - b_b = vid_lightmap[(light[2] & LIGHTMASK) + b_b]; + b_r = vid_lightmap[light_masked[0] + b_r]; + b_g = vid_lightmap[light_masked[1] + b_g]; + b_b = vid_lightmap[light_masked[2] + b_b]; /* convert back to indexed color */ b_r = ( b_r >> 3 ) & 31; From e650eff100a6648173b09d084b4fc8908bc061f3 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 22 Mar 2022 22:49:13 +0200 Subject: [PATCH 22/23] soft: preshift values in lightmap --- src/client/refresh/soft/sw_image.c | 11 +++++++---- src/client/refresh/soft/sw_main.c | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/client/refresh/soft/sw_image.c b/src/client/refresh/soft/sw_image.c index 4ac01b5b..3c37615d 100644 --- a/src/client/refresh/soft/sw_image.c +++ b/src/client/refresh/soft/sw_image.c @@ -363,10 +363,13 @@ R_ApplyLight(pixel_t pix, const light3_t light) b_g = vid_lightmap[light_masked[1] + b_g]; b_b = vid_lightmap[light_masked[2] + b_b]; - /* convert back to indexed color */ - b_r = ( b_r >> 3 ) & 31; - b_g = ( b_g >> 2 ) & 63; - b_b = ( b_b >> 3 ) & 31; + /* + * convert back to indexed color (value reshifted >> 2) + * look to R_Convert32To8bit + */ + b_r = ( b_r >> 1 ); // & 31; + b_g = ( b_g >> 0 ); // & 63; + b_b = ( b_b >> 1 ); // & 31; i_c = b_r | ( b_g << 5 ) | ( b_b << 11 ); diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index 6008754e..1ce75dd3 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -1811,7 +1811,7 @@ Draw_GetPalette (void) vid_lightthreshold = i * 256; for(j=0; j < 256; j++) - vid_lightmap[i * 256 + j] = (j * scale) / 255; + vid_lightmap[i * 256 + j] = ((j * scale / 255) >> 2) & 63; } } From ccb22843bf6d7cd04577f1917858a4467c41587d Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Tue, 29 Mar 2022 22:29:08 +0300 Subject: [PATCH 23/23] soft: use float for medium light --- src/client/refresh/soft/sw_alias.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/refresh/soft/sw_alias.c b/src/client/refresh/soft/sw_alias.c index 04fe3bca..076fd6b4 100644 --- a/src/client/refresh/soft/sw_alias.c +++ b/src/client/refresh/soft/sw_alias.c @@ -588,7 +588,7 @@ R_AliasSetupLighting(entity_t *currententity) if(r_colorlight->value < 2) { - float temp = (light[0] + light[1] + light[2]) / 3; + float temp = (light[0] + light[1] + light[2]) / 3.0; light[0] = light[1] = light[2] = temp; }