ref: 4fe828ca722d298bcb90d8874df9c0aae6fa68cc
parent: 0f07da746048c1452a42d3a964157448967c357f
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Nov 21 13:04:59 EST 2023
clean up a bunch
--- a/common.h
+++ b/common.h
@@ -32,7 +32,7 @@
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
-#define clamp(x,a,b) (min(max((x),(a)),(b)))
+#define clamp(x,a,b) ((x)>(b)?(b):((x)<(a)?(a):(x)))
#define Q_MAXCHAR ((char)0x7f)
#define Q_MAXSHORT ((short)0x7fff)
--- a/d_edge.c
+++ b/d_edge.c
@@ -2,92 +2,65 @@
static int miplevel;
-float scale_for_mip;
-int ubasestep, errorterm, erroradjustup, erroradjustdown;
+float scale_for_mip;
// FIXME: should go away
-extern void R_RotateBmodel (void);
-extern void R_TransformFrustum (void);
+extern void R_RotateBmodel (void);
+extern void R_TransformFrustum (void);
-/*
-=============
-D_MipLevelForScale
-=============
-*/
-static int D_MipLevelForScale (float scale)
+static int
+D_MipLevelForScale(float scale)
{
- int lmiplevel;
+ int lmiplevel;
- if (scale >= d_scalemip[0] )
+ if(scale >= d_scalemip[0])
lmiplevel = 0;
- else if (scale >= d_scalemip[1] )
+ else if(scale >= d_scalemip[1])
lmiplevel = 1;
- else if (scale >= d_scalemip[2] )
+ else if(scale >= d_scalemip[2])
lmiplevel = 2;
else
lmiplevel = 3;
- if (lmiplevel < d_minmip)
- lmiplevel = d_minmip;
-
- return lmiplevel;
+ return max(d_minmip, lmiplevel);
}
-
-/*
-==============
-D_DrawSolidSurface
-==============
-*/
-
// FIXME: clean this up
-
-static void D_DrawSolidSurface (surf_t *surf, int color)
+static void
+D_DrawSolidSurface(surf_t *surf, int color)
{
- espan_t *span;
- byte *pdest;
- int u, u2, pix;
+ espan_t *span;
+ byte *pdest;
+ int u, u2, pix;
pix = (color<<24) | (color<<16) | (color<<8) | color;
- for (span=surf->spans ; span ; span=span->pnext)
- {
+ for(span = surf->spans; span; span=span->pnext){
pdest = (byte *)d_viewbuffer + screenwidth*span->v;
u = span->u;
u2 = span->u + span->count - 1;
- ((byte *)pdest)[u] = pix;
+ pdest[u] = pix;
- if (u2 - u < 8)
- {
- for (u++ ; u <= u2 ; u++)
- ((byte *)pdest)[u] = pix;
+ if (u2 - u < 8){
+ for(u++; u <= u2; u++)
+ pdest[u] = pix;
+ }else{
+ for(u++ ; u & 3; u++)
+ pdest[u] = pix;
+ for(u2 -= 4; u <= u2; u += 4)
+ *(int *)(pdest + u) = pix;
+ for(u2 += 4; u <= u2; u++)
+ pdest[u] = pix;
}
- else
- {
- for (u++ ; u & 3 ; u++)
- ((byte *)pdest)[u] = pix;
-
- u2 -= 4;
- for ( ; u <= u2 ; u+=4)
- *(int *)((byte *)pdest + u) = pix;
- u2 += 4;
- for ( ; u <= u2 ; u++)
- ((byte *)pdest)[u] = pix;
- }
}
}
-/*
-==============
-D_CalcGradients
-==============
-*/
-static void D_CalcGradients (msurface_t *pface, vec3_t transformed_modelorg)
+static void
+D_CalcGradients(msurface_t *pface, vec3_t transformed_modelorg)
{
- float mipscale;
- vec3_t p_temp1;
- vec3_t p_saxis, p_taxis;
- float t;
+ float mipscale;
+ vec3_t p_temp1, p_saxis, p_taxis;
+ float t;
mipscale = 1.0 / (float)(1 << miplevel);
@@ -122,28 +95,21 @@
bbextentt = ((pface->extents[1] << 16) >> miplevel) - 1;
}
-/*
-==============
-D_DrawSurfaces
-==============
-*/
-void D_DrawSurfaces (void)
+void
+D_DrawSurfaces (void)
{
- surf_t *s;
- msurface_t *pface;
- surfcache_t *pcurrentcache;
- vec3_t world_transformed_modelorg;
- vec3_t local_modelorg;
- vec3_t transformed_modelorg;
- byte alpha;
+ surf_t *s;
+ msurface_t *pface;
+ surfcache_t *pcurrentcache;
+ vec3_t world_transformed_modelorg, local_modelorg, transformed_modelorg;
+ byte alpha;
currententity = &cl_entities[0];
- TransformVector (modelorg, transformed_modelorg);
- VectorCopy (transformed_modelorg, world_transformed_modelorg);
+ TransformVector(modelorg, transformed_modelorg);
+ VectorCopy(transformed_modelorg, world_transformed_modelorg);
// TODO: could preset a lot of this at mode set time
- for (s = &surfaces[1] ; s<surface_p ; s++)
- {
+ for(s = &surfaces[1]; s < surface_p; s++){
if (!s->spans)
continue;
@@ -157,19 +123,14 @@
if(alpha < 1)
alpha = 255;
- r_drawnpolycount++;
-
d_zistepu = s->d_zistepu;
d_zistepv = s->d_zistepv;
d_ziorigin = s->d_ziorigin;
- if (s->flags & SURF_DRAWSKY)
- {
- D_DrawSkyScans8 (s->spans);
- D_DrawZSpans (s->spans);
- }
- else if (s->flags & SURF_DRAWBACKGROUND)
- {
+ if(s->flags & SURF_DRAWSKY){
+ D_DrawSkyScans8(s->spans);
+ D_DrawZSpans(s->spans);
+ }else if(s->flags & SURF_DRAWBACKGROUND){
// set up a gradient for the background surface that places it
// effectively at infinity distance from the viewpoint
d_zistepu = 0;
@@ -176,29 +137,23 @@
d_zistepv = 0;
d_ziorigin = -0.9;
- D_DrawSolidSurface (s, (int)r_clearcolor.value & 0xFF);
- D_DrawZSpans (s->spans);
- }
- else if (s->flags & SURF_DRAWTURB)
- {
+ D_DrawSolidSurface(s, (int)r_clearcolor.value & 0xFF);
+ D_DrawZSpans(s->spans);
+ }else if(s->flags & SURF_DRAWTURB){
pface = s->data;
miplevel = 0;
- cacheblock = (pixel_t *)
- ((byte *)pface->texinfo->texture +
- pface->texinfo->texture->offsets[0]);
+ cacheblock = (pixel_t *)((byte *)pface->texinfo->texture + pface->texinfo->texture->offsets[0]);
cachewidth = 64;
- if (s->insubmodel)
- {
+ if(s->insubmodel){
// FIXME: we don't want to do all this for every polygon!
// TODO: store once at start of frame
currententity = s->entity; //FIXME: make this passed in to
- // R_RotateBmodel ()
- VectorSubtract (r_origin, currententity->origin,
- local_modelorg);
- TransformVector (local_modelorg, transformed_modelorg);
+ // R_RotateBmodel()
+ VectorSubtract(r_origin, currententity->origin, local_modelorg);
+ TransformVector(local_modelorg, transformed_modelorg);
- R_RotateBmodel (); // FIXME: don't mess with the frustum,
+ R_RotateBmodel(); // FIXME: don't mess with the frustum,
// make entity passed in
}
@@ -206,33 +161,29 @@
Turbulent8 (s->spans, alpha);
D_DrawZSpans (s->spans);
- if (s->insubmodel)
- {
+ if(s->insubmodel){
// restore the old drawing state
// FIXME: we don't want to do this every time!
// TODO: speed up
currententity = &cl_entities[0];
- VectorCopy (world_transformed_modelorg,
- transformed_modelorg);
- VectorCopy (base_vpn, vpn);
- VectorCopy (base_vup, vup);
- VectorCopy (base_vright, vright);
- VectorCopy (base_modelorg, modelorg);
- R_TransformFrustum ();
+ VectorCopy(world_transformed_modelorg, transformed_modelorg);
+ VectorCopy(base_vpn, vpn);
+ VectorCopy(base_vup, vup);
+ VectorCopy(base_vright, vright);
+ VectorCopy(base_modelorg, modelorg);
+ R_TransformFrustum();
}
}
else
{
- if (s->insubmodel)
- {
+ if(s->insubmodel){
// FIXME: we don't want to do all this for every polygon!
// TODO: store once at start of frame
currententity = s->entity; //FIXME: make this passed in to
- // R_RotateBmodel ()
- VectorSubtract (r_origin, currententity->origin, local_modelorg);
- TransformVector (local_modelorg, transformed_modelorg);
-
- R_RotateBmodel (); // FIXME: don't mess with the frustum,
+ // R_RotateBmodel()
+ VectorSubtract(r_origin, currententity->origin, local_modelorg);
+ TransformVector(local_modelorg, transformed_modelorg);
+ R_RotateBmodel(); // FIXME: don't mess with the frustum,
// make entity passed in
}
@@ -240,26 +191,21 @@
if(s->flags & SURF_FENCE)
miplevel = 0;
else
- miplevel = D_MipLevelForScale (s->nearzi * scale_for_mip
- * pface->texinfo->mipadjust);
+ miplevel = D_MipLevelForScale(s->nearzi * scale_for_mip * pface->texinfo->mipadjust);
// FIXME: make this passed in to D_CacheSurface
- pcurrentcache = D_CacheSurface (pface, miplevel);
+ pcurrentcache = D_CacheSurface(pface, miplevel);
cacheblock = (pixel_t *)pcurrentcache->data;
cachewidth = pcurrentcache->width;
- D_CalcGradients (pface, transformed_modelorg);
+ D_CalcGradients(pface, transformed_modelorg);
- if(s->flags & SURF_FENCE)
- D_DrawSpans16_Fence(s->spans, alpha);
- else{
- (*d_drawspans) (s->spans, alpha);
- D_DrawZSpans (s->spans);
- }
+ D_DrawSpans16(s->spans, s->flags & SURF_FENCE, alpha);
+ if((r_drawflags & DRAW_BLEND) == 0)
+ D_DrawZSpans(s->spans);
- if (s->insubmodel)
- {
+ if(s->insubmodel){
//
// restore the old drawing state
// FIXME: we don't want to do this every time!
@@ -266,13 +212,12 @@
// TODO: speed up
//
currententity = &cl_entities[0];
- VectorCopy (world_transformed_modelorg,
- transformed_modelorg);
- VectorCopy (base_vpn, vpn);
- VectorCopy (base_vup, vup);
- VectorCopy (base_vright, vright);
- VectorCopy (base_modelorg, modelorg);
- R_TransformFrustum ();
+ VectorCopy(world_transformed_modelorg, transformed_modelorg);
+ VectorCopy(base_vpn, vpn);
+ VectorCopy(base_vup, vup);
+ VectorCopy(base_vright, vright);
+ VectorCopy(base_modelorg, modelorg);
+ R_TransformFrustum();
}
}
}
--- a/d_iface.h
+++ b/d_iface.h
@@ -74,7 +74,6 @@
float nearzi;
} spritedesc_t;
-extern int d_spanpixcount;
extern int r_framecount; // sequence # of current frame since Quake
// started
extern bool r_recursiveaffinetriangles; // true if a driver wants to use
--- a/d_init.c
+++ b/d_init.c
@@ -1,64 +1,43 @@
#include "quakedef.h"
-#define NUM_MIPS 4
+static cvar_t d_mipcap = {"d_mipcap", "0"};
+static cvar_t d_mipscale = {"d_mipscale", "1"};
-static cvar_t d_mipcap = {"d_mipcap", "0"};
-static cvar_t d_mipscale = {"d_mipscale", "1"};
+surfcache_t *d_initial_rover;
+bool d_roverwrapped;
+int d_minmip;
+float d_scalemip[MIPLEVELS-1];
-surfcache_t *d_initial_rover;
-bool d_roverwrapped;
-int d_minmip;
-float d_scalemip[NUM_MIPS-1];
+static float basemip[MIPLEVELS-1] = {1.0, 0.5*0.8, 0.25*0.8};
-static float basemip[NUM_MIPS-1] = {1.0, 0.5*0.8, 0.25*0.8};
-
-void (*d_drawspans) (espan_t *pspan, byte alpha);
-
-
-/*
-===============
-D_Init
-===============
-*/
-void D_Init (void)
+void
+D_Init(void)
{
- Cvar_RegisterVariable (&d_mipcap);
- Cvar_RegisterVariable (&d_mipscale);
+ Cvar_RegisterVariable(&d_mipcap);
+ Cvar_RegisterVariable(&d_mipscale);
r_recursiveaffinetriangles = true;
r_aliasuvscale = 1.0;
}
-/*
-===============
-D_SetupFrame
-===============
-*/
-void D_SetupFrame (void)
+void
+D_SetupFrame(void)
{
- int i;
+ int i;
- if (r_dowarp)
+ if(r_dowarp){
d_viewbuffer = r_warpbuffer;
- else
- d_viewbuffer = (void *)(byte *)vid.buffer;
-
- if (r_dowarp)
screenwidth = WARP_WIDTH;
- else
+ }else{
+ d_viewbuffer = (void *)vid.buffer;
screenwidth = vid.rowbytes;
+ }
d_roverwrapped = false;
d_initial_rover = sc_rover;
- d_minmip = d_mipcap.value;
- if (d_minmip > 3)
- d_minmip = 3;
- else if (d_minmip < 0)
- d_minmip = 0;
+ d_minmip = clamp(d_mipcap.value, 0, MIPLEVELS-1);
- for (i=0 ; i<(NUM_MIPS-1) ; i++)
+ for(i = 0; i < MIPLEVELS-1; i++)
d_scalemip[i] = basemip[i] * d_mipscale.value;
-
- d_drawspans = D_DrawSpans16;
}
--- a/d_local.h
+++ b/d_local.h
@@ -50,14 +50,11 @@
extern fixed16_t sadjust, tadjust;
extern fixed16_t bbextents, bbextentt;
-void D_DrawSpans8 (espan_t *pspans);
-void D_DrawSpans16 (espan_t *pspans, byte alpha);
+void D_DrawSpans16 (espan_t *pspans, int forceblend, byte alpha);
void D_DrawZSpans (espan_t *pspans);
void Turbulent8 (espan_t *pspan, byte alpha);
-void D_DrawSpans16_Fence (espan_t *pspan, byte alpha);
void D_DrawSkyScans8 (espan_t *pspan);
-void D_DrawSkyScans16 (espan_t *pspan);
void R_ShowSubDiv (void);
surfcache_t *D_CacheSurface (msurface_t *surface, int miplevel);
@@ -78,8 +75,6 @@
extern int d_minmip;
extern float d_scalemip[3];
-
-extern void (*d_drawspans) (espan_t *pspan, byte alpha);
enum {
// perhaps a bit too much, but looks ok
--- a/d_polyse.c
+++ b/d_polyse.c
@@ -63,6 +63,7 @@
static int d_sfracbasestep, d_tfracbasestep;
static int d_ziextrastep, d_zibasestep;
static int d_pzextrastep, d_pzbasestep;
+static int ubasestep, errorterm, erroradjustup, erroradjustdown;
typedef struct {
int quotient;
--- a/d_scan.c
+++ b/d_scan.c
@@ -32,28 +32,20 @@
wratio = w / (float)scr_vrect.width;
hratio = h / (float)scr_vrect.height;
- for (v=0 ; v<scr_vrect.height+AMP2*2 ; v++)
- {
- rowptr[v] = d_viewbuffer + (r_refdef.vrect.y * screenwidth) +
- (screenwidth * (int)((float)v * hratio * h / (h + AMP2 * 2)));
- }
+ for(v = 0; v < scr_vrect.height+AMP2*2; v++)
+ rowptr[v] = d_viewbuffer + (r_refdef.vrect.y * screenwidth) + (screenwidth * (int)((float)v * hratio * h / (h + AMP2 * 2)));
- for (u=0 ; u<scr_vrect.width+AMP2*2 ; u++)
- {
- column[u] = r_refdef.vrect.x +
- (int)((float)u * wratio * w / (w + AMP2 * 2));
- }
+ for(u = 0; u < scr_vrect.width+AMP2*2; u++)
+ column[u] = r_refdef.vrect.x + (int)((float)u * wratio * w / (w + AMP2 * 2));
turb = intsintable + ((int)(cl.time*SPEED)&(CYCLE-1));
dest = vid.buffer + scr_vrect.y * vid.rowbytes + scr_vrect.x;
- for (v=0 ; v<scr_vrect.height ; v++, dest += vid.rowbytes)
- {
+ for(v = 0; v < scr_vrect.height; v++, dest += vid.rowbytes){
col = &column[turb[v]];
row = &rowptr[v];
- for (u=0 ; u<scr_vrect.width ; u+=4)
- {
+ for(u = 0; u < scr_vrect.width; u += 4){
dest[u+0] = row[turb[u+0]][col[u+0]];
dest[u+1] = row[turb[u+1]][col[u+1]];
dest[u+2] = row[turb[u+2]][col[u+2]];
@@ -69,33 +61,28 @@
*/
void D_DrawTurbulent8Span (int izi, byte alpha)
{
- int sturb, tturb;
+ int sturb, tturb;
- do
- {
+ do{
sturb = ((r_turb_s + r_turb_turb[(r_turb_t>>16)&(CYCLE-1)])>>16)&63;
tturb = ((r_turb_t + r_turb_turb[(r_turb_s>>16)&(CYCLE-1)])>>16)&63;
- if (*r_turb_z <= (izi >> 16) || (r_drawflags & DRAW_BLEND) == 0)
+ if(*r_turb_z <= (izi >> 16) || (r_drawflags & DRAW_BLEND) == 0)
*r_turb_pdest = blendalpha(*(r_turb_pbase + (tturb<<6) + sturb), *r_turb_pdest, alpha);
r_turb_s += r_turb_sstep;
r_turb_t += r_turb_tstep;
r_turb_pdest++;
r_turb_z++;
- } while (--r_turb_spancount > 0);
+ }while(--r_turb_spancount > 0);
}
-/*
-=============
-Turbulent8
-=============
-*/
-void Turbulent8 (espan_t *pspan, byte alpha)
+void
+Turbulent8(espan_t *pspan, byte alpha)
{
- int count;
- fixed16_t snext, tnext;
- float sdivz, tdivz, zi, z, du, dv, spancountminus1;
- float sdivz16stepu, tdivz16stepu, zi16stepu;
+ int count;
+ fixed16_t snext, tnext;
+ double sdivz, tdivz, zi, z, du, dv, spancountminus1;
+ double sdivz16stepu, tdivz16stepu, zi16stepu;
r_turb_turb = sintable + ((int)(cl.time*SPEED)&(CYCLE-1));
@@ -102,23 +89,21 @@
r_turb_sstep = 0; // keep compiler happy
r_turb_tstep = 0; // ditto
- r_turb_pbase = (unsigned char *)cacheblock;
+ r_turb_pbase = (byte*)cacheblock;
sdivz16stepu = d_sdivzstepu * 16;
tdivz16stepu = d_tdivzstepu * 16;
zi16stepu = d_zistepu * 16;
- do
- {
- r_turb_pdest = (unsigned char *)((byte *)d_viewbuffer +
- (screenwidth * pspan->v) + pspan->u);
- r_turb_z = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
+ do{
+ r_turb_pdest = (byte *)d_viewbuffer + screenwidth*pspan->v + pspan->u;
+ r_turb_z = d_pzbuffer + d_zwidth*pspan->v + pspan->u;
count = pspan->count;
// calculate the initial s/z, t/z, 1/z, s, and t and clamp
- du = (float)pspan->u;
- dv = (float)pspan->v;
+ du = pspan->u;
+ dv = pspan->v;
sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
@@ -126,29 +111,17 @@
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
r_turb_s = (int)(sdivz * z) + sadjust;
- if (r_turb_s > bbextents)
- r_turb_s = bbextents;
- else if (r_turb_s < 0)
- r_turb_s = 0;
+ r_turb_s = clamp(r_turb_s, 0, bbextents);
r_turb_t = (int)(tdivz * z) + tadjust;
- if (r_turb_t > bbextentt)
- r_turb_t = bbextentt;
- else if (r_turb_t < 0)
- r_turb_t = 0;
+ r_turb_t = clamp(r_turb_t, 0, bbextentt);
- do
- {
+ do{
// calculate s and t at the far end of the span
- if (count >= 16)
- r_turb_spancount = 16;
- else
- r_turb_spancount = count;
-
+ r_turb_spancount = min(count, 16);
count -= r_turb_spancount;
- if (count)
- {
+ if(count){
// calculate s/z, t/z, zi->fixed s and t at far end of span,
// calculate s and t steps across span by shifting
sdivz += sdivz16stepu;
@@ -157,24 +130,15 @@
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
snext = (int)(sdivz * z) + sadjust;
- if (snext > bbextents)
- snext = bbextents;
- else if (snext < 16)
- snext = 16; // prevent round-off error on <0 steps from
- // from causing overstepping & running off the
- // edge of the texture
+ // prevent round-off error on <0 steps from causing overstepping & running off the edge of the texture
+ snext = clamp(snext, 16, bbextents);
tnext = (int)(tdivz * z) + tadjust;
- if (tnext > bbextentt)
- tnext = bbextentt;
- else if (tnext < 16)
- tnext = 16; // guard against round-off error on <0 steps
+ tnext = clamp(tnext, 16, bbextentt); // guard against round-off error on <0 steps
r_turb_sstep = (snext - r_turb_s) >> 4;
r_turb_tstep = (tnext - r_turb_t) >> 4;
- }
- else
- {
+ }else{
// calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
// can't step off polygon), clamp, calculate s and t steps across
// span by division, biasing steps low so we don't run off the
@@ -185,21 +149,13 @@
zi += d_zistepu * spancountminus1;
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
snext = (int)(sdivz * z) + sadjust;
- if (snext > bbextents)
- snext = bbextents;
- else if (snext < 16)
- snext = 16; // prevent round-off error on <0 steps from
- // from causing overstepping & running off the
- // edge of the texture
+ // prevent round-off error on <0 steps from causing overstepping & running off the edge of the texture
+ snext = clamp(snext, 16, bbextents);
tnext = (int)(tdivz * z) + tadjust;
- if (tnext > bbextentt)
- tnext = bbextentt;
- else if (tnext < 16)
- tnext = 16; // guard against round-off error on <0 steps
+ tnext = clamp(tnext, 16, bbextentt); // guard against round-off error on <0 steps
- if (r_turb_spancount > 1)
- {
+ if(r_turb_spancount > 1){
r_turb_sstep = (snext - r_turb_s) / (r_turb_spancount - 1);
r_turb_tstep = (tnext - r_turb_t) / (r_turb_spancount - 1);
}
@@ -208,209 +164,45 @@
r_turb_s = r_turb_s & ((CYCLE<<16)-1);
r_turb_t = r_turb_t & ((CYCLE<<16)-1);
- D_DrawTurbulent8Span ((int)(zi * 0x8000 * 0x10000), alpha);
+ D_DrawTurbulent8Span((int)(zi * 0x8000 * 0x10000), alpha);
r_turb_s = snext;
r_turb_t = tnext;
- } while (count > 0);
+ }while(count > 0);
- } while ((pspan = pspan->pnext) != nil);
+ }while((pspan = pspan->pnext) != nil);
}
-#define WRITEFENCE(i) do{ \
- fencepix = *(pbase + (s >> 16) + (t >> 16) * cachewidth); \
- if (fencepix != 255 && pz[i] <= (izi >> 16)){ \
- pdest[i] = blendalpha(fencepix, pdest[i], alpha); \
- if(alpha == 255) \
- pz[i] = (izi >> 16); \
- } \
- izi += izistep; \
- s += sstep; \
- t += tstep; \
-}while(0)
-
-void D_DrawSpans16_Fence (espan_t *pspan, byte alpha)
+void
+D_DrawSpans16(espan_t *pspan, int forceblend, byte alpha) //qbism- up it from 8 to 16
{
- byte fencepix;
- byte *pbase = (byte *)cacheblock, *pdest;
- int count, spancount, izi, izistep;
- fixed16_t s, t, snext, tnext, sstep, tstep;
- float sdivz, tdivz, zi, z, du, dv, spancountminus1;
- float sdivzstepu, tdivzstepu, zistepu;
- uzint *pz;
+ int count, spancount, izistep;
+ byte *pbase, *pdest;
+ uzint *pz;
+ fixed16_t s, t, snext, tnext, sstep, tstep;
+ double sdivz, tdivz, zi, z, du, dv, spancountminus1;
+ double sdivzstepu, tdivzstepu, zistepu;
- sdivzstepu = d_sdivzstepu * 16;
- tdivzstepu = d_tdivzstepu * 16;
- zistepu = d_zistepu * 16;
-
- // we count on FP exceptions being turned off to avoid range problems
- izistep = (int)(d_zistepu * 0x8000 * 0x10000);
- sstep = tstep = 0;
-
- do
- {
- pdest = (byte *)((byte *)d_viewbuffer + (screenwidth * pspan->v) + pspan->u);
- pz = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
-
- count = pspan->count >> 4;
- spancount = pspan->count % 16;
-
- // calculate the initial s/z, t/z, 1/z, s, and t and clamp
- du = (float)pspan->u;
- dv = (float)pspan->v;
-
- sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
- tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
- zi = d_ziorigin + dv*d_zistepv + du*d_zistepu;
- z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
- // we count on FP exceptions being turned off to avoid range problems
- izi = (int)(zi * 0x8000 * 0x10000);
-
- s = (int)(sdivz * z) + sadjust;
- if (s > bbextents)
- s = bbextents;
- else if (s < 0)
- s = 0;
-
- t = (int)(tdivz * z) + tadjust;
- if (t > bbextentt)
- t = bbextentt;
- else if (t < 0)
- t = 0;
-
- while (count--){
- // calculate s/z, t/z, zi->fixed s and t at far end of span,
- // calculate s and t steps across span by shifting
- sdivz += sdivzstepu;
- tdivz += tdivzstepu;
- zi += zistepu;
- z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
-
- snext = (int) (sdivz * z) + sadjust;
- if (snext > bbextents)
- snext = bbextents;
- else if (snext <= 16)
- snext = 16; // prevent round-off error on <0 steps causing overstepping & running off the edge of the texture
-
- tnext = (int) (tdivz * z) + tadjust;
- if (tnext > bbextentt)
- tnext = bbextentt;
- else if (tnext < 16)
- tnext = 16; // guard against round-off error on <0 steps
-
- sstep = (snext - s) >> 4;
- tstep = (tnext - t) >> 4;
-
- pdest += 16;
- pz += 16;
- WRITEFENCE(-16);
- WRITEFENCE(-15);
- WRITEFENCE(-14);
- WRITEFENCE(-13);
- WRITEFENCE(-12);
- WRITEFENCE(-11);
- WRITEFENCE(-10);
- WRITEFENCE(-9);
- WRITEFENCE(-8);
- WRITEFENCE(-7);
- WRITEFENCE(-6);
- WRITEFENCE(-5);
- WRITEFENCE(-4);
- WRITEFENCE(-3);
- WRITEFENCE(-2);
- WRITEFENCE(-1);
- USED(s); USED(t);
-
- s = snext;
- t = tnext;
- }
- if (spancount > 0)
- {
- // calculate s/z, t/z, zi->fixed s and t at last pixel in span (so can't step off polygon),
- // clamp, calculate s and t steps across span by division, biasing steps low so we don't run off the texture
- spancountminus1 = (float)(spancount - 1);
- sdivz += d_sdivzstepu * spancountminus1;
- tdivz += d_tdivzstepu * spancountminus1;
- zi += d_zistepu * spancountminus1;
- z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
- snext = (int)(sdivz * z) + sadjust;
- if (snext > bbextents)
- snext = bbextents;
- else if (snext < 16)
- snext = 16; // prevent round-off error on <0 steps from causing overstepping & running off the edge of the texture
-
- tnext = (int)(tdivz * z) + tadjust;
- if (tnext > bbextentt)
- tnext = bbextentt;
- else if (tnext < 16)
- tnext = 16; // guard against round-off error on <0 steps
-
- if (spancount > 1){
- sstep = (snext - s) / (spancount - 1);
- tstep = (tnext - t) / (spancount - 1);
- }
-
- pdest += spancount;
- pz += spancount;
- switch (spancount){
- case 16: WRITEFENCE(-16);
- case 15: WRITEFENCE(-15);
- case 14: WRITEFENCE(-14);
- case 13: WRITEFENCE(-13);
- case 12: WRITEFENCE(-12);
- case 11: WRITEFENCE(-11);
- case 10: WRITEFENCE(-10);
- case 9: WRITEFENCE(-9);
- case 8: WRITEFENCE(-8);
- case 7: WRITEFENCE(-7);
- case 6: WRITEFENCE(-6);
- case 5: WRITEFENCE(-5);
- case 4: WRITEFENCE(-4);
- case 3: WRITEFENCE(-3);
- case 2: WRITEFENCE(-2);
- case 1: WRITEFENCE(-1);
- USED(izi); USED(s); USED(t);
- }
- }
- }
- while ((pspan = pspan->pnext) != nil);
-}
-
-/*
-=============
-D_DrawSpans16
-=============
-*/
-void D_DrawSpans16 (espan_t *pspan, byte alpha) //qbism- up it from 8 to 16
-{
- int count, spancount;
- unsigned char *pbase, *pdest;
- uzint *pz;
- fixed16_t s, t, snext, tnext, sstep, tstep;
- float sdivz, tdivz, zi, z, du, dv, spancountminus1;
- float sdivzstepu, tdivzstepu, zistepu;
-
sstep = 0; // keep compiler happy
tstep = 0; // ditto
- pbase = (unsigned char *)cacheblock;
+ pbase = (byte*)cacheblock;
sdivzstepu = d_sdivzstepu * 16;
tdivzstepu = d_tdivzstepu * 16;
zistepu = d_zistepu * 16;
+ izistep = (int)(d_zistepu * 0x8000 * 0x10000);
- do
- {
- pdest = (unsigned char *)((byte *)d_viewbuffer +
- (screenwidth * pspan->v) + pspan->u);
- pz = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
+ do{
+ pdest = (byte *)d_viewbuffer + screenwidth*pspan->v + pspan->u;
+ pz = d_pzbuffer + d_zwidth*pspan->v + pspan->u;
count = pspan->count;
// calculate the initial s/z, t/z, 1/z, s, and t and clamp
- du = (float)pspan->u;
- dv = (float)pspan->v;
+ du = pspan->u;
+ dv = pspan->v;
sdivz = d_sdivzorigin + dv*d_sdivzstepv + du*d_sdivzstepu;
tdivz = d_tdivzorigin + dv*d_tdivzstepv + du*d_tdivzstepu;
@@ -418,29 +210,17 @@
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
s = (int)(sdivz * z) + sadjust;
- if (s > bbextents)
- s = bbextents;
- else if (s < 0)
- s = 0;
+ s = clamp(s, 0, bbextents);
t = (int)(tdivz * z) + tadjust;
- if (t > bbextentt)
- t = bbextentt;
- else if (t < 0)
- t = 0;
+ t = clamp(t, 0, bbextentt);
- do
- {
+ do{
// calculate s and t at the far end of the span
- if (count >= 16)
- spancount = 16;
- else
- spancount = count;
-
+ spancount = min(count, 16);
count -= spancount;
- if (count)
- {
+ if(count){
// calculate s/z, t/z, zi->fixed s and t at far end of span,
// calculate s and t steps across span by shifting
sdivz += sdivzstepu;
@@ -449,24 +229,18 @@
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
snext = (int)(sdivz * z) + sadjust;
- if (snext > bbextents)
- snext = bbextents;
- else if (snext <= 16)
- snext = 16; // prevent round-off error on <0 steps from
- // from causing overstepping & running off the
- // edge of the texture
+ // prevent round-off error on <0 steps from
+ // from causing overstepping & running off the
+ // edge of the texture
+ snext = clamp(snext, 16, bbextents);
tnext = (int)(tdivz * z) + tadjust;
- if (tnext > bbextentt)
- tnext = bbextentt;
- else if (tnext < 16)
- tnext = 16; // guard against round-off error on <0 steps
+ // guard against round-off error on <0 steps
+ tnext = clamp(tnext, 16, bbextentt);
sstep = (snext - s) >> 4;
tstep = (tnext - t) >> 4;
- }
- else
- {
+ }else{
// calculate s/z, t/z, zi->fixed s and t at last pixel in span (so
// can't step off polygon), clamp, calculate s and t steps across
// span by division, biasing steps low so we don't run off the
@@ -477,21 +251,16 @@
zi += d_zistepu * spancountminus1;
z = (float)0x10000 / zi; // prescale to 16.16 fixed-point
snext = (int)(sdivz * z) + sadjust;
- if (snext > bbextents)
- snext = bbextents;
- else if (snext < 16)
- snext = 16; // prevent round-off error on <0 steps from
- // from causing overstepping & running off the
- // edge of the texture
+ // prevent round-off error on <0 steps from
+ // from causing overstepping & running off the
+ // edge of the texture
+ snext = clamp(snext, 16, bbextents);
tnext = (int)(tdivz * z) + tadjust;
- if (tnext > bbextentt)
- tnext = bbextentt;
- else if (tnext < 16)
- tnext = 16; // guard against round-off error on <0 steps
+ // guard against round-off error on <0 steps
+ tnext = clamp(tnext, 16, bbextentt);
- if (spancount > 1)
- {
+ if(spancount > 1){
sstep = (snext - s) / (spancount - 1);
tstep = (tnext - t) / (spancount - 1);
}
@@ -498,36 +267,32 @@
}
if(spancount > 0){
- void dospan(uchar *, uchar *, int, int, int, int, int, int);
- void dospan_alpha(uchar *, uchar *, int, int, int, int, int, int, byte, uzint *, int);
- if(r_drawflags & DRAW_BLEND)
- dospan_alpha(pdest, pbase, s, t, sstep, tstep, spancount, cachewidth, alpha, pz, (int)(zi * 0x8000 * 0x10000));
+ void dospan(byte *, byte *, int, int, int, int, int, int);
+ void dospan_alpha(byte *, byte *, int, int, int, int, int, int, byte, uzint *, int,int);
+ if((r_drawflags & DRAW_BLEND) != 0 || forceblend)
+ dospan_alpha(pdest, pbase, s, t, sstep, tstep, spancount, cachewidth, alpha, pz, (int)(zi * 0x8000 * 0x10000), izistep);
else
dospan(pdest, pbase, s, t, sstep, tstep, spancount, cachewidth);
+ pdest += spancount;
+ pz += spancount;
}
- pdest += spancount;
- pz += spancount;
s = snext;
t = tnext;
- } while (count > 0);
+ }while(count > 0);
- } while ((pspan = pspan->pnext) != nil);
+ }while((pspan = pspan->pnext) != nil);
}
-/*
-=============
-D_DrawZSpans
-=============
-*/
-void D_DrawZSpans (espan_t *pspan)
+void
+D_DrawZSpans(espan_t *pspan)
{
- int count, doublecount, izistep;
- int izi;
- uzint *pdest;
- unsigned ltemp;
- double zi;
- float du, dv;
+ int count, doublecount, izistep;
+ int izi;
+ uzint *pdest;
+ unsigned ltemp;
+ double zi;
+ float du, dv;
if((r_drawflags & DRAW_BLEND) != 0)
return;
@@ -536,10 +301,8 @@
// we count on FP exceptions being turned off to avoid range problems
izistep = (int)(d_zistepu * 0x8000 * 0x10000);
- do
- {
+ do{
pdest = d_pzbuffer + (d_zwidth * pspan->v) + pspan->u;
-
count = pspan->count;
// calculate the initial 1/z
@@ -550,17 +313,14 @@
// we count on FP exceptions being turned off to avoid range problems
izi = (int)(zi * 0x8000 * 0x10000);
- if ((uintptr)pdest & 0x02)
- {
+ if((uintptr)pdest & 0x02){
*pdest++ = (short)(izi >> 16);
izi += izistep;
count--;
}
- if ((doublecount = count >> 1) > 0)
- {
- do
- {
+ if((doublecount = count >> 1) > 0){
+ do{
ltemp = izi >> 16;
izi += izistep;
ltemp |= izi & 0xFFFF0000;
@@ -567,11 +327,11 @@
izi += izistep;
*(int *)pdest = ltemp;
pdest += 2;
- } while (--doublecount > 0);
+ }while (--doublecount > 0);
}
- if (count & 1)
+ if(count & 1)
*pdest = (short)(izi >> 16);
- } while ((pspan = pspan->pnext) != nil);
+ }while((pspan = pspan->pnext) != nil);
}
--- a/r_draw.c
+++ b/r_draw.c
@@ -493,8 +493,6 @@
if (!r_emitted)
return 1;
- r_polycount++;
-
surface_p->data = (void *)fa;
surface_p->nearzi = r_nearzi;
surface_p->flags = fa->flags;
@@ -608,8 +606,6 @@
// if no edges made it out, return without posting the surface
if (!r_emitted)
return;
-
- r_polycount++;
surface_p->data = (void *)psurf;
surface_p->nearzi = r_nearzi;
--- a/r_local.h
+++ b/r_local.h
@@ -143,7 +143,6 @@
extern int c_faceclip;
extern int r_polycount;
-extern int r_wholepolycount;
extern model_t *cl_worldmodel;
@@ -152,9 +151,6 @@
// !!! if this is changed, it must be changed in asm_draw.h too !!!
#define NEAR_CLIP 0.01
-extern int ubasestep, errorterm, erroradjustup, erroradjustdown;
-extern int vstartscan;
-
extern fixed16_t sadjust, tadjust;
extern fixed16_t bbextents, bbextentt;
@@ -161,8 +157,6 @@
#define MAXBVERTINDEXES 1000 // new clipped vertices when clipping bmodels
// to the world BSP
extern mvertex_t *r_ptverts, *r_ptvertsmax;
-
-extern int reinit_surfcache;
extern int r_currentkey;
extern int r_currentbkey;
--- a/r_main.c
+++ b/r_main.c
@@ -1,7 +1,5 @@
#include "quakedef.h"
-//define PASSAGES
-
void *colormap;
static vec3_t viewlightvec;
static alight_t r_viewlighting = {128, 192, viewlightvec};
@@ -57,17 +55,10 @@
//
int r_framecount = 1; // so frame counts initialized to 0 don't match
int r_visframecount;
-int d_spanpixcount;
-int r_polycount;
-int r_drawnpolycount;
-int r_wholepolycount;
int *pfrustum_indexes[4];
int r_frustum_indexes[4*6];
-int reinit_surfcache = 1; // if 1, surface cache is currently empty and
- // must be reinitialized for current cache size
-
mleaf_t *r_viewleaf, *r_oldviewleaf;
texture_t *r_notexture_mip;
@@ -215,9 +206,6 @@
r_maxsurfsseen = 0;
r_dowarpold = false;
r_viewchanged = false;
-#ifdef PASSAGES
-CreatePassages ();
-#endif
}
@@ -710,13 +698,7 @@
r_warpbuffer = warpbuffer;
R_SetupFrame ();
-
-#ifdef PASSAGES
- SetVisibilityByPassages ();
-#endif
-#ifndef PASSAGES
R_MarkLeaves (); // done here so we know if we're in water
-#endif
if (!cl_entities[0].model || !cl.worldmodel)
fatal ("R_RenderView: NULL worldmodel");
--- a/r_misc.c
+++ b/r_misc.c
@@ -232,10 +232,6 @@
// clear frame counts
c_faceclip = 0;
- d_spanpixcount = 0;
- r_polycount = 0;
- r_drawnpolycount = 0;
- r_wholepolycount = 0;
D_SetupFrame ();
}
--- a/r_shared.h
+++ b/r_shared.h
@@ -99,8 +99,6 @@
extern void SetUpForLineScan(fixed8_t startvertu, fixed8_t startvertv,
fixed8_t endvertu, fixed8_t endvertv);
-extern int ubasestep, errorterm, erroradjustup, erroradjustdown;
-
// flags in finalvert_t.flags
#define ALIAS_LEFT_CLIP 0x0001
#define ALIAS_TOP_CLIP 0x0002
--- a/render.h
+++ b/render.h
@@ -88,9 +88,7 @@
//
// refresh
//
-extern int reinit_surfcache;
-
extern refdef_t r_refdef;
extern vec3_t r_origin, vpn, vright, vup;
@@ -127,7 +125,6 @@
//
// surface cache related
//
-extern int reinit_surfcache; // if 1, surface cache is currently empty and
extern bool r_cache_thrash; // set if thrashing the surface cache
int D_SurfaceCacheForRes (int width, int height);
@@ -135,4 +132,3 @@
void D_DeleteSurfaceCache (void);
void D_InitCaches (void *buffer, int size);
void R_SetVrect (vrect_t *pvrect, vrect_t *pvrectin, int lineadj);
-
--- a/span.c
+++ b/span.c
@@ -1,19 +1,11 @@
#include "quakedef.h"
-#define P \
- do{ \
- *pdest++ = pbase[(s >> 16) + (t >> 16) * cachewidth]; \
- s += sstep; \
- t += tstep; \
- }while(0);
-
void
-dospan(uchar *pdest, uchar *pbase, int s, int t, int sstep, int tstep, int spancount, int cachewidth)
+dospan(byte *pdest, byte *pbase, int s, int t, int sstep, int tstep, int spancount, int cachewidth)
{
- switch(spancount)
- {
- case 16: P; case 15: P; case 14: P; case 13: P; case 12: P; case 11: P; case 10: P; case 9: P;
- case 8: P; case 7: P; case 6: P; case 5: P; case 4: P; case 3: P; case 2: P; case 1: P;
- }
- USED(pdest); USED(s); USED(t);
+ do{
+ *pdest++ = pbase[(s >> 16) + (t >> 16) * cachewidth];
+ s += sstep;
+ t += tstep;
+ }while(--spancount);
}
--- a/span_alpha.c
+++ b/span_alpha.c
@@ -1,22 +1,33 @@
#include "quakedef.h"
-#define P \
- do{ \
- if(*z <= (izi >> 16)) \
- *pdest = blendalpha(pbase[(s >> 16) + (t >> 16) * cachewidth], *pdest, alpha); \
- pdest++; \
- z++; \
- s += sstep; \
- t += tstep; \
- }while(0)
-
void
-dospan_alpha(uchar *pdest, uchar *pbase, int s, int t, int sstep, int tstep, int spancount, int cachewidth, u8int alpha, uzint *z, int izi)
+dospan_alpha(byte *pdest, byte *pbase, int s, int t, int sstep, int tstep, int spancount, int cachewidth, u8int alpha, uzint *pz, int izi, int izistep)
{
- switch(spancount)
- {
- case 16: P; case 15: P; case 14: P; case 13: P; case 12: P; case 11: P; case 10: P; case 9: P;
- case 8: P; case 7: P; case 6: P; case 5: P; case 4: P; case 3: P; case 2: P; case 1: P;
+ uchar pix;
+
+ if(alpha != 255){
+ do{
+ pix = pbase[(s >> 16) + (t >> 16) * cachewidth];
+ if(pix != 255 && *pz <= (izi >> 16))
+ *pdest = blendalpha(pix, *pdest, alpha);
+ pdest++;
+ pz++;
+ izi += izistep;
+ s += sstep;
+ t += tstep;
+ }while(--spancount);
+ }else{
+ do{
+ pix = pbase[(s >> 16) + (t >> 16) * cachewidth];
+ if(pix != 255 && *pz <= (izi >> 16)){
+ *pdest = pix;
+ *pz = izi >> 16;
+ }
+ pdest++;
+ pz++;
+ izi += izistep;
+ s += sstep;
+ t += tstep;
+ }while(--spancount);
}
- USED(pdest); USED(s); USED(t); USED(z);
}