// d_polyset.c: routines for drawing sets of polygons sharing the same// texture (used for Alias models) #include <u.h>#include <libc.h>#include <stdio.h>#include "dat.h"#include "fns.h" int rand1k[] = {#include "rand1k.h"}; #define MASK_1K 0x3FF int rand1k_index = 0; // TODO: put in span spilling to shrink list size// !!! if this is changed, it must be changed in d_polysa.s too !!!#define DPS_MAXSPANS MAXHEIGHT+1 // 1 extra for spanpackage that marks end // !!! if this is changed, it must be changed in asm_draw.h too !!!typedef struct { void *pdest; short *pz; int count; byte *ptex; int sfrac, tfrac, light, zi;} spanpackage_t; typedef struct { int isflattop; int numleftedges; int *pleftedgevert0; int *pleftedgevert1; int *pleftedgevert2; int numrightedges; int *prightedgevert0; int *prightedgevert1; int *prightedgevert2;} edgetable; aliastriangleparms_t aliastriangleparms; int r_p0[6], r_p1[6], r_p2[6]; byte *d_pcolormap; int d_aflatcolor;int d_xdenom; edgetable *pedgetable; 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},}; // FIXME: some of these can become staticsint a_sstepxfrac, a_tstepxfrac, r_lstepx, a_ststepxwhole;int r_sstepx, r_tstepx, r_lstepy, r_sstepy, r_tstepy;int r_zistepx, r_zistepy;int d_aspancount, d_countextrastep; spanpackage_t *a_spans;spanpackage_t *d_pedgespanpackage;static int ystart;byte *d_pdest, *d_ptex;short *d_pz;int d_sfrac, d_tfrac, d_light, d_zi;int d_ptexextrastep, d_sfracextrastep;int d_tfracextrastep, d_lightextrastep, d_pdestextrastep;int d_lightbasestep, d_pdestbasestep, d_ptexbasestep;int d_sfracbasestep, d_tfracbasestep;int d_ziextrastep, d_zibasestep;int d_pzextrastep, d_pzbasestep; typedef struct { int quotient; int remainder;} adivtab_t; static adivtab_t adivtab[32*32] = {#include "adivtab.h"}; byte *skintable[MAX_LBM_HEIGHT];int skinwidth;byte *skinstart; void (*d_pdrawspans)(spanpackage_t *pspanpackage); void R_PolysetDrawSpans8_33 (spanpackage_t *pspanpackage);void R_PolysetDrawSpans8_66 (spanpackage_t *pspanpackage);void R_PolysetDrawSpans8_Opaque (spanpackage_t *pspanpackage); void R_PolysetDrawThreshSpans8 (spanpackage_t *pspanpackage);void R_PolysetCalcGradients (int skinwidth);void R_DrawNonSubdiv (void);void R_PolysetSetEdgeTable (void);void R_RasterizeAliasPolySmooth (void);void R_PolysetScanLeftEdge(int height);void R_PolysetScanLeftEdge_C(int height); // ======================// PGM// 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79byte iractive = 0;byte irtable[256] = { 79, 78, 77, 76, 75, 74, 73, 72, // black/white 71, 70, 69, 68, 67, 66, 65, 64, 64, 65, 66, 67, 68, 69, 70, 71, // dark taupe 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // slate grey 72, 73, 74, 75, 76, 77, 78, 79, 208, 208, 208, 208, 208, 208, 208, 208, // unused?' 64, 66, 68, 70, 72, 74, 76, 78, // dark yellow 64, 65, 66, 67, 68, 69, 70, 71, // dark red 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // grey/tan 72, 73, 74, 75, 76, 77, 78, 79, 64, 66, 68, 70, 72, 74, 76, 78, // chocolate 68, 67, 66, 65, 64, 65, 66, 67, // mauve / teal 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 77, 78, 78, 79, 79, 64, 65, 66, 67, 68, 69, 70, 71, // more mauve 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // olive 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // maroon 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // sky blue 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // olive again 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // nuclear green 64, 65, 66, 67, 68, 69, 70, 71, // bright yellow 64, 65, 66, 67, 68, 69, 70, 71, // fire colors 72, 73, 74, 75, 76, 77, 78, 79, 208, 208, 64, 64, 70, 71, 72, 64, // mishmash1 66, 68, 70, 64, 65, 66, 67, 68}; // mishmash2// PGM// ====================== /*================R_PolysetUpdateTables================*/void R_PolysetUpdateTables (void){ int i; byte *s; if (r_affinetridesc.skinwidth != skinwidth || r_affinetridesc.pskin != skinstart) { skinwidth = r_affinetridesc.skinwidth; skinstart = r_affinetridesc.pskin; s = skinstart; for (i=0 ; i<MAX_LBM_HEIGHT ; i++, s+=skinwidth) skintable[i] = s; }} /*================R_DrawTriangle================*/void R_DrawTriangle( void ){ spanpackage_t spans[DPS_MAXSPANS]; int dv1_ab, dv0_ac; int dv0_ab, dv1_ac; /* d_xdenom = ( aliastriangleparms.a->v[1] - aliastriangleparms.b->v[1] ) * ( aliastriangleparms.a->v[0] - aliastriangleparms.c->v[0] ) - ( aliastriangleparms.a->v[0] - aliastriangleparms.b->v[0] ) * ( aliastriangleparms.a->v[1] - aliastriangleparms.c->v[1] ); */ dv0_ab = aliastriangleparms.a->u - aliastriangleparms.b->u; dv1_ab = aliastriangleparms.a->v - aliastriangleparms.b->v; if ( !( dv0_ab | dv1_ab ) ) return; dv0_ac = aliastriangleparms.a->u - aliastriangleparms.c->u; dv1_ac = aliastriangleparms.a->v - aliastriangleparms.c->v; if ( !( dv0_ac | dv1_ac ) ) return; d_xdenom = ( dv0_ac * dv1_ab ) - ( dv0_ab * dv1_ac ); if ( d_xdenom < 0 ) { a_spans = spans; r_p0[0] = aliastriangleparms.a->u; // u r_p0[1] = aliastriangleparms.a->v; // v r_p0[2] = aliastriangleparms.a->s; // s r_p0[3] = aliastriangleparms.a->t; // t r_p0[4] = aliastriangleparms.a->l; // light r_p0[5] = aliastriangleparms.a->zi; // iz r_p1[0] = aliastriangleparms.b->u; r_p1[1] = aliastriangleparms.b->v; r_p1[2] = aliastriangleparms.b->s; r_p1[3] = aliastriangleparms.b->t; r_p1[4] = aliastriangleparms.b->l; r_p1[5] = aliastriangleparms.b->zi; r_p2[0] = aliastriangleparms.c->u; r_p2[1] = aliastriangleparms.c->v; r_p2[2] = aliastriangleparms.c->s; r_p2[3] = aliastriangleparms.c->t; r_p2[4] = aliastriangleparms.c->l; r_p2[5] = aliastriangleparms.c->zi; R_PolysetSetEdgeTable (); R_RasterizeAliasPolySmooth (); }} /*===================R_PolysetScanLeftEdge_C====================*/void R_PolysetScanLeftEdge_C(int height){ do { d_pedgespanpackage->pdest = d_pdest; d_pedgespanpackage->pz = d_pz; d_pedgespanpackage->count = d_aspancount; d_pedgespanpackage->ptex = d_ptex; d_pedgespanpackage->sfrac = d_sfrac; d_pedgespanpackage->tfrac = d_tfrac; // FIXME: need to clamp l, s, t, at both ends? d_pedgespanpackage->light = d_light; d_pedgespanpackage->zi = d_zi; d_pedgespanpackage++; errorterm += erroradjustup; if (errorterm >= 0) { d_pdest += d_pdestextrastep; d_pz += d_pzextrastep; d_aspancount += d_countextrastep; d_ptex += d_ptexextrastep; d_sfrac += d_sfracextrastep; d_ptex += d_sfrac >> 16; d_sfrac &= 0xFFFF; d_tfrac += d_tfracextrastep; if (d_tfrac & 0x10000) { d_ptex += r_affinetridesc.skinwidth; d_tfrac &= 0xFFFF; } d_light += d_lightextrastep; d_zi += d_ziextrastep; errorterm -= erroradjustdown; } else { d_pdest += d_pdestbasestep; d_pz += d_pzbasestep; d_aspancount += ubasestep; d_ptex += d_ptexbasestep; d_sfrac += d_sfracbasestep; d_ptex += d_sfrac >> 16; d_sfrac &= 0xFFFF; d_tfrac += d_tfracbasestep; if (d_tfrac & 0x10000) { d_ptex += r_affinetridesc.skinwidth; d_tfrac &= 0xFFFF; } d_light += d_lightbasestep; d_zi += d_zibasestep; } } while (--height);} /*===================FloorDivMod Returns mathematically correct (floor-based) quotient and remainder fornumer and denom, both of which should contain no fractional part. Thequotient must fit in 32 bits.FIXME: GET RID OF THIS! (FloorDivMod)====================*/void FloorDivMod (float numer, float denom, int *quotient, int *rem){ int q, r; float x; if (numer >= 0.0) { x = floor(numer / denom); q = (int)x; r = (int)floor(numer - (x * denom)); } else { // // perform operations with positive values, and fix mod to make floor-based // x = floor(-numer / denom); q = -(int)x; r = (int)floor(-numer - (x * denom)); if (r != 0) { q--; r = (int)denom - r; } } *quotient = q; *rem = r;} /*===================R_PolysetSetUpForLineScan====================*/void R_PolysetSetUpForLineScan(fixed8_t startvertu, fixed8_t startvertv, fixed8_t endvertu, fixed8_t endvertv){ float dm, dn; int tm, tn; adivtab_t *ptemp; // TODO: implement x86 version errorterm = -1; tm = endvertu - startvertu; tn = endvertv - startvertv; if (((tm <= 16) && (tm >= -15)) && ((tn <= 16) && (tn >= -15))) { ptemp = &adivtab[((tm+15) << 5) + (tn+15)]; ubasestep = ptemp->quotient; erroradjustup = ptemp->remainder; erroradjustdown = tn; } else { dm = tm; dn = tn; FloorDivMod (dm, dn, &ubasestep, &erroradjustup); erroradjustdown = dn; }} /*================R_PolysetCalcGradients================*/void 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]; xstepdenominv = 1.0 / (float)d_xdenom; ystepdenominv = -xstepdenominv; // 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]; 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]; 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]; 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]; r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); a_sstepxfrac = r_sstepx & 0xFFFF; a_tstepxfrac = r_tstepx & 0xFFFF; a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16);} /*================R_PolysetDrawThreshSpans8 Random fizzle fade rasterizer================*/void R_PolysetDrawThreshSpans8 (spanpackage_t *pspanpackage){ int lcount; byte *lpdest; byte *lptex; int lsfrac, ltfrac; int llight; int lzi; short *lpz; do { lcount = d_aspancount - pspanpackage->count; errorterm += erroradjustup; if (errorterm >= 0) { d_aspancount += d_countextrastep; errorterm -= erroradjustdown; } else { d_aspancount += ubasestep; } if (lcount) { lpdest = pspanpackage->pdest; lptex = pspanpackage->ptex; lpz = pspanpackage->pz; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; llight = pspanpackage->light; lzi = pspanpackage->zi; do { if ((lzi >> 16) >= *lpz) { rand1k_index = (rand1k_index + 1) & MASK_1K; if (rand1k[rand1k_index] <= r_affinetridesc.vis_thresh) { *lpdest = ((byte *)vid.colormap)[*lptex + (llight & 0xFF00)];Lines 1–500 of 1147. Load more
// d_polyset.c: routines for drawing sets of polygons sharing the same // texture (used for Alias models) #include <u.h> #include <libc.h> #include <stdio.h> #include "dat.h" #include "fns.h" int rand1k[] = { #include "rand1k.h" }; #define MASK_1K 0x3FF int rand1k_index = 0; // TODO: put in span spilling to shrink list size // !!! if this is changed, it must be changed in d_polysa.s too !!! #define DPS_MAXSPANS MAXHEIGHT+1 // 1 extra for spanpackage that marks end // !!! if this is changed, it must be changed in asm_draw.h too !!! typedef struct { void *pdest; short *pz; int count; byte *ptex; int sfrac, tfrac, light, zi; } spanpackage_t; typedef struct { int isflattop; int numleftedges; int *pleftedgevert0; int *pleftedgevert1; int *pleftedgevert2; int numrightedges; int *prightedgevert0; int *prightedgevert1; int *prightedgevert2; } edgetable; aliastriangleparms_t aliastriangleparms; int r_p0[6], r_p1[6], r_p2[6]; byte *d_pcolormap; int d_aflatcolor; int d_xdenom; edgetable *pedgetable; 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}, }; // FIXME: some of these can become statics int a_sstepxfrac, a_tstepxfrac, r_lstepx, a_ststepxwhole; int r_sstepx, r_tstepx, r_lstepy, r_sstepy, r_tstepy; int r_zistepx, r_zistepy; int d_aspancount, d_countextrastep; spanpackage_t *a_spans; spanpackage_t *d_pedgespanpackage; static int ystart; byte *d_pdest, *d_ptex; short *d_pz; int d_sfrac, d_tfrac, d_light, d_zi; int d_ptexextrastep, d_sfracextrastep; int d_tfracextrastep, d_lightextrastep, d_pdestextrastep; int d_lightbasestep, d_pdestbasestep, d_ptexbasestep; int d_sfracbasestep, d_tfracbasestep; int d_ziextrastep, d_zibasestep; int d_pzextrastep, d_pzbasestep; typedef struct { int quotient; int remainder; } adivtab_t; static adivtab_t adivtab[32*32] = { #include "adivtab.h" }; byte *skintable[MAX_LBM_HEIGHT]; int skinwidth; byte *skinstart; void (*d_pdrawspans)(spanpackage_t *pspanpackage); void R_PolysetDrawSpans8_33 (spanpackage_t *pspanpackage); void R_PolysetDrawSpans8_66 (spanpackage_t *pspanpackage); void R_PolysetDrawSpans8_Opaque (spanpackage_t *pspanpackage); void R_PolysetDrawThreshSpans8 (spanpackage_t *pspanpackage); void R_PolysetCalcGradients (int skinwidth); void R_DrawNonSubdiv (void); void R_PolysetSetEdgeTable (void); void R_RasterizeAliasPolySmooth (void); void R_PolysetScanLeftEdge(int height); void R_PolysetScanLeftEdge_C(int height); // ====================== // PGM // 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 byte iractive = 0; byte irtable[256] = { 79, 78, 77, 76, 75, 74, 73, 72, // black/white 71, 70, 69, 68, 67, 66, 65, 64, 64, 65, 66, 67, 68, 69, 70, 71, // dark taupe 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // slate grey 72, 73, 74, 75, 76, 77, 78, 79, 208, 208, 208, 208, 208, 208, 208, 208, // unused?' 64, 66, 68, 70, 72, 74, 76, 78, // dark yellow 64, 65, 66, 67, 68, 69, 70, 71, // dark red 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // grey/tan 72, 73, 74, 75, 76, 77, 78, 79, 64, 66, 68, 70, 72, 74, 76, 78, // chocolate 68, 67, 66, 65, 64, 65, 66, 67, // mauve / teal 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 77, 78, 78, 79, 79, 64, 65, 66, 67, 68, 69, 70, 71, // more mauve 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // olive 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // maroon 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // sky blue 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // olive again 72, 73, 74, 75, 76, 77, 78, 79, 64, 65, 66, 67, 68, 69, 70, 71, // nuclear green 64, 65, 66, 67, 68, 69, 70, 71, // bright yellow 64, 65, 66, 67, 68, 69, 70, 71, // fire colors 72, 73, 74, 75, 76, 77, 78, 79, 208, 208, 64, 64, 70, 71, 72, 64, // mishmash1 66, 68, 70, 64, 65, 66, 67, 68}; // mishmash2 // PGM // ====================== /* ================ R_PolysetUpdateTables ================ */ void R_PolysetUpdateTables (void) { int i; byte *s; if (r_affinetridesc.skinwidth != skinwidth || r_affinetridesc.pskin != skinstart) { skinwidth = r_affinetridesc.skinwidth; skinstart = r_affinetridesc.pskin; s = skinstart; for (i=0 ; i<MAX_LBM_HEIGHT ; i++, s+=skinwidth) skintable[i] = s; } } /* ================ R_DrawTriangle ================ */ void R_DrawTriangle( void ) { spanpackage_t spans[DPS_MAXSPANS]; int dv1_ab, dv0_ac; int dv0_ab, dv1_ac; /* d_xdenom = ( aliastriangleparms.a->v[1] - aliastriangleparms.b->v[1] ) * ( aliastriangleparms.a->v[0] - aliastriangleparms.c->v[0] ) - ( aliastriangleparms.a->v[0] - aliastriangleparms.b->v[0] ) * ( aliastriangleparms.a->v[1] - aliastriangleparms.c->v[1] ); */ dv0_ab = aliastriangleparms.a->u - aliastriangleparms.b->u; dv1_ab = aliastriangleparms.a->v - aliastriangleparms.b->v; if ( !( dv0_ab | dv1_ab ) ) return; dv0_ac = aliastriangleparms.a->u - aliastriangleparms.c->u; dv1_ac = aliastriangleparms.a->v - aliastriangleparms.c->v; if ( !( dv0_ac | dv1_ac ) ) return; d_xdenom = ( dv0_ac * dv1_ab ) - ( dv0_ab * dv1_ac ); if ( d_xdenom < 0 ) { a_spans = spans; r_p0[0] = aliastriangleparms.a->u; // u r_p0[1] = aliastriangleparms.a->v; // v r_p0[2] = aliastriangleparms.a->s; // s r_p0[3] = aliastriangleparms.a->t; // t r_p0[4] = aliastriangleparms.a->l; // light r_p0[5] = aliastriangleparms.a->zi; // iz r_p1[0] = aliastriangleparms.b->u; r_p1[1] = aliastriangleparms.b->v; r_p1[2] = aliastriangleparms.b->s; r_p1[3] = aliastriangleparms.b->t; r_p1[4] = aliastriangleparms.b->l; r_p1[5] = aliastriangleparms.b->zi; r_p2[0] = aliastriangleparms.c->u; r_p2[1] = aliastriangleparms.c->v; r_p2[2] = aliastriangleparms.c->s; r_p2[3] = aliastriangleparms.c->t; r_p2[4] = aliastriangleparms.c->l; r_p2[5] = aliastriangleparms.c->zi; R_PolysetSetEdgeTable (); R_RasterizeAliasPolySmooth (); } } /* =================== R_PolysetScanLeftEdge_C ==================== */ void R_PolysetScanLeftEdge_C(int height) { do { d_pedgespanpackage->pdest = d_pdest; d_pedgespanpackage->pz = d_pz; d_pedgespanpackage->count = d_aspancount; d_pedgespanpackage->ptex = d_ptex; d_pedgespanpackage->sfrac = d_sfrac; d_pedgespanpackage->tfrac = d_tfrac; // FIXME: need to clamp l, s, t, at both ends? d_pedgespanpackage->light = d_light; d_pedgespanpackage->zi = d_zi; d_pedgespanpackage++; errorterm += erroradjustup; if (errorterm >= 0) { d_pdest += d_pdestextrastep; d_pz += d_pzextrastep; d_aspancount += d_countextrastep; d_ptex += d_ptexextrastep; d_sfrac += d_sfracextrastep; d_ptex += d_sfrac >> 16; d_sfrac &= 0xFFFF; d_tfrac += d_tfracextrastep; if (d_tfrac & 0x10000) { d_ptex += r_affinetridesc.skinwidth; d_tfrac &= 0xFFFF; } d_light += d_lightextrastep; d_zi += d_ziextrastep; errorterm -= erroradjustdown; } else { d_pdest += d_pdestbasestep; d_pz += d_pzbasestep; d_aspancount += ubasestep; d_ptex += d_ptexbasestep; d_sfrac += d_sfracbasestep; d_ptex += d_sfrac >> 16; d_sfrac &= 0xFFFF; d_tfrac += d_tfracbasestep; if (d_tfrac & 0x10000) { d_ptex += r_affinetridesc.skinwidth; d_tfrac &= 0xFFFF; } d_light += d_lightbasestep; d_zi += d_zibasestep; } } while (--height); } /* =================== FloorDivMod Returns mathematically correct (floor-based) quotient and remainder for numer and denom, both of which should contain no fractional part. The quotient must fit in 32 bits. FIXME: GET RID OF THIS! (FloorDivMod) ==================== */ void FloorDivMod (float numer, float denom, int *quotient, int *rem) { int q, r; float x; if (numer >= 0.0) { x = floor(numer / denom); q = (int)x; r = (int)floor(numer - (x * denom)); } else { // // perform operations with positive values, and fix mod to make floor-based // x = floor(-numer / denom); q = -(int)x; r = (int)floor(-numer - (x * denom)); if (r != 0) { q--; r = (int)denom - r; } } *quotient = q; *rem = r; } /* =================== R_PolysetSetUpForLineScan ==================== */ void R_PolysetSetUpForLineScan(fixed8_t startvertu, fixed8_t startvertv, fixed8_t endvertu, fixed8_t endvertv) { float dm, dn; int tm, tn; adivtab_t *ptemp; // TODO: implement x86 version errorterm = -1; tm = endvertu - startvertu; tn = endvertv - startvertv; if (((tm <= 16) && (tm >= -15)) && ((tn <= 16) && (tn >= -15))) { ptemp = &adivtab[((tm+15) << 5) + (tn+15)]; ubasestep = ptemp->quotient; erroradjustup = ptemp->remainder; erroradjustdown = tn; } else { dm = tm; dn = tn; FloorDivMod (dm, dn, &ubasestep, &erroradjustup); erroradjustdown = dn; } } /* ================ R_PolysetCalcGradients ================ */ void 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]; xstepdenominv = 1.0 / (float)d_xdenom; ystepdenominv = -xstepdenominv; // 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]; 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]; 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]; 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]; r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); a_sstepxfrac = r_sstepx & 0xFFFF; a_tstepxfrac = r_tstepx & 0xFFFF; a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16); } /* ================ R_PolysetDrawThreshSpans8 Random fizzle fade rasterizer ================ */ void R_PolysetDrawThreshSpans8 (spanpackage_t *pspanpackage) { int lcount; byte *lpdest; byte *lptex; int lsfrac, ltfrac; int llight; int lzi; short *lpz; do { lcount = d_aspancount - pspanpackage->count; errorterm += erroradjustup; if (errorterm >= 0) { d_aspancount += d_countextrastep; errorterm -= erroradjustdown; } else { d_aspancount += ubasestep; } if (lcount) { lpdest = pspanpackage->pdest; lptex = pspanpackage->ptex; lpz = pspanpackage->pz; lsfrac = pspanpackage->sfrac; ltfrac = pspanpackage->tfrac; llight = pspanpackage->light; lzi = pspanpackage->zi; do { if ((lzi >> 16) >= *lpz) { rand1k_index = (rand1k_index + 1) & MASK_1K; if (rand1k[rand1k_index] <= r_affinetridesc.vis_thresh) { *lpdest = ((byte *)vid.colormap)[*lptex + (llight & 0xFF00)];