1147 lines · 25.3 KB · C
RawDownload
// 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.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t