19fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
29fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCopyright (C) 1996-1997 Id Software, Inc.
39fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
49fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is free software; you can redistribute it and/or
59fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreammodify it under the terms of the GNU General Public License
69fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamas published by the Free Software Foundation; either version 2
79fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamof the License, or (at your option) any later version.
89fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
99fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis program is distributed in the hope that it will be useful,
109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreambut WITHOUT ANY WARRANTY; without even the implied warranty of
119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamSee the GNU General Public License for more details.
149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamYou should have received a copy of the GNU General Public License
169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamalong with this program; if not, write to the Free Software
179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// d_edge.c
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "d_local.h"
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstatic int	miplevel;
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfloat		scale_for_mip;
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			screenwidth;
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			ubasestep, errorterm, erroradjustup, erroradjustdown;
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			vstartscan;
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME: should go away
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void			R_RotateBmodel (void);
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void			R_TransformFrustum (void);
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvec3_t		transformed_modelorg;
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_DrawPoly
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid D_DrawPoly (void)
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// this driver takes spans, not polygons
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_MipLevelForScale
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=============
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint D_MipLevelForScale (float scale)
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		lmiplevel;
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (scale >= d_scalemip[0] )
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lmiplevel = 0;
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (scale >= d_scalemip[1] )
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lmiplevel = 1;
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (scale >= d_scalemip[2] )
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lmiplevel = 2;
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lmiplevel = 3;
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (lmiplevel < d_minmip)
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		lmiplevel = d_minmip;
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return lmiplevel;
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_DrawSolidSurface
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// FIXME: clean this up
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid D_DrawSolidSurface (surf_t *surf, int color)
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	espan_t	*span;
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*pdest;
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		u, u2, pix;
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pix = (color<<24) | (color<<16) | (color<<8) | color;
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (span=surf->spans ; span ; span=span->pnext)
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pdest = (byte *)d_viewbuffer + screenwidth*span->v;
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		u = span->u;
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		u2 = span->u + span->count - 1;
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		((byte *)pdest)[u] = pix;
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (u2 - u < 8)
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u++ ; u <= u2 ; u++)
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				((byte *)pdest)[u] = pix;
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (u++ ; u & 3 ; u++)
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				((byte *)pdest)[u] = pix;
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			u2 -= 4;
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for ( ; u <= u2 ; u+=4)
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				*(int *)((byte *)pdest + u) = pix;
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			u2 += 4;
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for ( ; u <= u2 ; u++)
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				((byte *)pdest)[u] = pix;
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_CalcGradients
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid D_CalcGradients (msurface_t *pface)
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mplane_t	*pplane;
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		mipscale;
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		p_temp1;
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		p_saxis, p_taxis;
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float		t;
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	pplane = pface->plane;
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	mipscale = 1.0 / (float)(1 << miplevel);
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	TransformVector (pface->texinfo->vecs[0], p_saxis);
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	TransformVector (pface->texinfo->vecs[1], p_taxis);
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t = xscaleinv * mipscale;
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_sdivzstepu = p_saxis[0] * t;
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_tdivzstepu = p_taxis[0] * t;
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t = yscaleinv * mipscale;
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_sdivzstepv = -p_saxis[1] * t;
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_tdivzstepv = -p_taxis[1] * t;
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_sdivzorigin = p_saxis[2] * mipscale - xcenter * d_sdivzstepu -
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ycenter * d_sdivzstepv;
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	d_tdivzorigin = p_taxis[2] * mipscale - xcenter * d_tdivzstepu -
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			ycenter * d_tdivzstepv;
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorScale (transformed_modelorg, mipscale, p_temp1);
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	t = 0x10000*mipscale;
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sadjust = ((fixed16_t)(DotProduct (p_temp1, p_saxis) * 0x10000 + 0.5)) -
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((pface->texturemins[0] << 16) >> miplevel)
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			+ pface->texinfo->vecs[0][3]*t;
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	tadjust = ((fixed16_t)(DotProduct (p_temp1, p_taxis) * 0x10000 + 0.5)) -
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			((pface->texturemins[1] << 16) >> miplevel)
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			+ pface->texinfo->vecs[1][3]*t;
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// -1 (-epsilon) so we never wander off the edge of the texture
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bbextents = ((pface->extents[0] << 16) >> miplevel) - 1;
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bbextentt = ((pface->extents[1] << 16) >> miplevel) - 1;
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamD_DrawSurfaces
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==============
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid D_DrawSurfaces (void)
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	surf_t			*s;
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	msurface_t		*pface;
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	surfcache_t		*pcurrentcache;
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t			world_transformed_modelorg;
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t			local_modelorg;
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	currententity = &r_worldentity;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	TransformVector (modelorg, transformed_modelorg);
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (transformed_modelorg, world_transformed_modelorg);
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// TODO: could preset a lot of this at mode set time
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (r_drawflat.value)
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (s = &surfaces[1] ; s<surface_p ; s++)
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!s->spans)
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				continue;
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			d_zistepu = s->d_zistepu;
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			d_zistepv = s->d_zistepv;
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			d_ziorigin = s->d_ziorigin;
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef __alpha__
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			D_DrawSolidSurface (s, (int)((long)s->data & 0xFF));
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			D_DrawSolidSurface (s, (int)s->data & 0xFF);
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			D_DrawZSpans (s->spans);
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (s = &surfaces[1] ; s<surface_p ; s++)
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (!s->spans)
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				continue;
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			r_drawnpolycount++;
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			d_zistepu = s->d_zistepu;
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			d_zistepv = s->d_zistepv;
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			d_ziorigin = s->d_ziorigin;
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (s->flags & SURF_DRAWSKY)
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (!r_skymade)
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					R_MakeSky ();
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_DrawSkyScans8 (s->spans);
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_DrawZSpans (s->spans);
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (s->flags & SURF_DRAWBACKGROUND)
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// set up a gradient for the background surface that places it
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// effectively at infinity distance from the viewpoint
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				d_zistepu = 0;
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				d_zistepv = 0;
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				d_ziorigin = -0.9;
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_DrawSolidSurface (s, (int)r_clearcolor.value & 0xFF);
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_DrawZSpans (s->spans);
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else if (s->flags & SURF_DRAWTURB)
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pface = s->data;
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				miplevel = 0;
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cacheblock = (pixel_t *)
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						((byte *)pface->texinfo->texture +
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						pface->texinfo->texture->offsets[0]);
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cachewidth = 64;
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (s->insubmodel)
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// FIXME: we don't want to do all this for every polygon!
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// TODO: store once at start of frame
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					currententity = s->entity;	//FIXME: make this passed in to
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream												// R_RotateBmodel ()
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorSubtract (r_origin, currententity->origin,
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream							local_modelorg);
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					TransformVector (local_modelorg, transformed_modelorg);
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					R_RotateBmodel ();	// FIXME: don't mess with the frustum,
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream										// make entity passed in
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_CalcGradients (pface);
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Turbulent8 (s->spans);
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_DrawZSpans (s->spans);
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (s->insubmodel)
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				//
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// restore the old drawing state
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// FIXME: we don't want to do this every time!
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// TODO: speed up
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				//
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					currententity = &r_worldentity;
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (world_transformed_modelorg,
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								transformed_modelorg);
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_vpn, vpn);
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_vup, vup);
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_vright, vright);
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_modelorg, modelorg);
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					R_TransformFrustum ();
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (s->insubmodel)
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// FIXME: we don't want to do all this for every polygon!
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// TODO: store once at start of frame
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					currententity = s->entity;	//FIXME: make this passed in to
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream												// R_RotateBmodel ()
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorSubtract (r_origin, currententity->origin, local_modelorg);
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					TransformVector (local_modelorg, transformed_modelorg);
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					R_RotateBmodel ();	// FIXME: don't mess with the frustum,
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream										// make entity passed in
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pface = s->data;
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				miplevel = D_MipLevelForScale (s->nearzi * scale_for_mip
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				* pface->texinfo->mipadjust);
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// FIXME: make this passed in to D_CacheSurface
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				pcurrentcache = D_CacheSurface (pface, miplevel);
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cacheblock = (pixel_t *)pcurrentcache->data;
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cachewidth = pcurrentcache->width;
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_CalcGradients (pface);
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				(*d_drawspans) (s->spans);
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				D_DrawZSpans (s->spans);
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (s->insubmodel)
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				//
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// restore the old drawing state
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// FIXME: we don't want to do this every time!
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				// TODO: speed up
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				//
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (world_transformed_modelorg,
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream								transformed_modelorg);
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_vpn, vpn);
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_vup, vup);
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_vright, vright);
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VectorCopy (base_modelorg, modelorg);
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					R_TransformFrustum ();
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					currententity = &r_worldentity;
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
337