//************************************************************************* //*** v4101.c DDX 640x480x256 //* //* V2.2 10-05-95.23-08-95.02-12-96 //* //****** #include #include #include #include #include "ivi.h" #include "rendmode.h" #include "piemode.h" #include "bug.h" #include "piepalette.h" #include "piematrix.h" // clockwise check #include "pieclip.h" #include "screen.h" #include "frame.h" #include "frameint.h" char colour = 0; /* A whole load of function prototypes that I've added - Alex */ /* Draw's a dotted line */ void iV_StrobeLine(int x1, int y1, int x2, int y2); /* Textured gouraud sahded triangle plotter */ void _tgtriangle_4101(iVertex *vrt, iTexture *tex); /* Textured gouraud shaded polygon plotter */ void _tgpolygon_4101(int npoints, iVertex *vrt, iTexture *tex); /* Textured gouraud shaed horizontal lines */ static void _tghline_4101(int x1, int x2, int y, fixed btx1, fixed btx2, fixed bty1, fixed bty2, fixed bg1, fixed bg2, int xshift, iBitmap *tex); /* Textured level shaded horizontal lines */ static void _tfhline_4101(int x1, int x2, int y, fixed btx1, fixed btx2, fixed bty1, fixed bty2, int xshift, iBitmap *tex, int shade); /* Textured transparent levels shaded polygons */ void _ttspolygon_4101(int npoints, iVertex *vrt, iTexture *tex, int brightness); /* Textured level shaded polygons */ void _tspolygon_4101(int npoints, iVertex *vrt, iTexture *tex, int lightValue); /* Textured level shaded triangles */ void _tstriangle_4101(iVertex *vrt, iTexture *tex, int brightness); /* Textured transparent level shaded horizontal line */ static void _ttfhline_4101(int x1, int x2, int y, fixed btx1, fixed btx2, fixed bty1, fixed bty2, int xshift, iBitmap *tex, int shade); /* Textured transaprent level shaded triangle */ void _ttstriangle_4101(iVertex *vrt, iTexture *tex, int brightness); //************************************************************************* #ifdef _DEBUG #define ACCURATE #endif //************************************************************************* #define WIDTH_4101 (pie_GetVideoBufferWidth()) #define HEIGHT_4101 (pie_GetVideoBufferHeight()) #define DEPTH_4101 8 #define SIZE_4101 (WIDTH_4101 * HEIGHT_4101) #define BSHIFT 11 //************************************************************************* #define USE_THLINE \ int __x, __dx, __col; \ fixed __du, __dv; \ uint8 *__pp; \ int _x1_, _x2_, _y_; \ fixed _btx1_, _btx2_, _bty1_, _bty2_; \ int _xshift_; \ iBitmap *_tex_; #define USE_THLINE_ANYWIDTH \ int __x, __dx, __col; \ fixed __du, __dv; \ uint8 *__pp; \ int _x1_, _x2_, _y_; \ fixed _btx1_, _btx2_, _bty1_, _bty2_; \ int _xwidth_; \ iBitmap *_tex_; #define USE_HLINE \ int __dx, __i, __m; \ uint8 *__bp; \ uint32 *__dp; \ int _x1_, _x2_, _y_; \ uint32 _col_; #define _THLINE_A \ if (_x1_ > _x2_) { \ iV_SWAP(_x1_,_x2_); \ iV_SWAP(_btx1_,_btx2_); \ iV_SWAP(_bty1_,_bty2_); \ } \ __dx = (_x2_ - _x1_ ) + 1; \ __du = (_btx2_ - _btx1_) / __dx; \ __dv = (_bty2_ - _bty1_) / __dx; \ __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; \ for (__x = __dx; __x>0; __x--, __pp++) { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); \ *__pp = __col; \ _btx1_ += __du; \ _bty1_ += __dv; \ } #define _TTHLINE_ANYWIDTH_A \ if (_x1_ > _x2_) { \ iV_SWAP(_x1_,_x2_); \ iV_SWAP(_btx1_,_btx2_); \ iV_SWAP(_bty1_,_bty2_); \ } \ __dx = (_x2_ - _x1_ ) + 1; \ __du = (_btx2_ - _btx1_) / __dx; \ __dv = (_bty2_ - _bty1_) / __dx; \ __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; \ for (__x = __dx; __x>0; __x--, __pp++) { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT) * _xwidth_)+(_btx1_>>iV_DIVSHIFT)); \ *__pp = __col; \ _btx1_ += __du; \ _bty1_ += __dv; \ } #define _THLINE_C \ if (_x1_ > _x2_) { \ iV_SWAP(_x1_,_x2_); \ iV_SWAP(_btx1_,_btx2_); \ iV_SWAP(_bty1_,_bty2_); \ } \ __dx = _x2_- _x1_; \ __du = (((_btx2_-_btx1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; \ __dv = (((_bty2_-_bty1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; \ __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; \ for (__x = __dx; __x>0; __x--, __pp++) { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); \ *__pp = __col; \ _btx1_ += __du; \ _bty1_ += __dv; \ } #define _TTHLINE_A \ if (_x1_ > _x2_) \ { \ iV_SWAP(_x1_,_x2_); \ iV_SWAP(_btx1_,_btx2_); \ iV_SWAP(_bty1_,_bty2_); \ } \ __dx = (_x2_ - _x1_ ) + 1; \ __du = (((_btx2_-_btx1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; \ __dv = (((_bty2_-_bty1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; \ __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; \ if(pie_GetDitherStatus()) \ { \ if( (_y_ & 0x01) ^ (_x1_ &0x01) ) \ { \ __pp++; \ } \ for (__x = __dx; __x>2; __x-=2, __pp+=2) \ { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); \ if (__col) *__pp = __col; \ _btx1_ += (__du*2); \ _bty1_ += (__dv*2); \ } \ } \ else \ { \ for (__x = __dx; __x>2; __x--, __pp++) \ { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); \ if (__col) *__pp = __col; \ _btx1_ += (__du); \ _bty1_ += (__dv); \ } \ } /* //__du = (_btx2_ - _btx1_) / __dx; //__dv = (_bty2_ - _bty1_) / __dx; #define _TTHLINE_A \ if (_x1_ > _x2_) { \ iV_SWAP(_x1_,_x2_); \ iV_SWAP(_btx1_,_btx2_); \ iV_SWAP(_bty1_,_bty2_); \ } \ __dx = (_x2_ - _x1_ ) + 1; \ __du = (_btx2_ - _btx1_) / __dx; \ __dv = (_bty2_ - _bty1_) / __dx; \ __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; \ for (__x = __dx; __x>0; __x--, __pp++) { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); \ if (__col) *__pp = __col; \ _btx1_ += __du; \ _bty1_ += __dv; \ } */ #define _TTHLINE_C \ if (_x1_ > _x2_) { \ iV_SWAP(_x1_,_x2_); \ iV_SWAP(_btx1_,_btx2_); \ iV_SWAP(_bty1_,_bty2_); \ } \ __dx = _x2_- _x1_; \ __du = (((_btx2_-_btx1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; \ __dv = (((_bty2_-_bty1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; \ __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; \ for (__x = __dx; __x>0; __x--, __pp++) { \ __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); \ if (__col) *__pp = __col; \ _btx1_ += __du; \ _bty1_ += __dv; \ } #define _HLINE \ _col_ |= _col_<<8; \ _col_ |= _col_<<16; \ if (_x2_<_x1_) \ iV_SWAP(_x1_,_x2_); \ __bp = psRendSurface->buffer + _x1_ + psRendSurface->scantable[_y_]; \ __dx = _x2_ - _x1_; \ if (__dx<8) { \ for (__i=__dx; __i>=0; __i--) \ *__bp++ = _col_; \ } else { \ __m = __dx & 3; \ __dx -= __m; \ if (__m<4) { \ for (__i=__m; __i>=0; __i--) \ *__bp++ = (uint8) _col_; \ } \ __dp = (uint32 *) __bp; \ for (__i=(__dx>>2); __i>0; __i--) \ *__dp++ = _col_; \ } /* #ifdef ACCURATE #define _THLINE _THLINE_A #define _TTHLINE _TTHLINE_A #else #define _THLINE _THLINE_C #define _TTHLINE _TTHLINE_C #endif */ #define _THLINE _THLINE_A #define _TTHLINE _TTHLINE_A //************************************************************************* //*** //* //* on exit: TRUE == success, FASLE == failure //* //****** iBool _mode_4101(void) { int width; int i; iV_DEBUG0("v4101[_mode_4101] = setup successful\n"); // set surface attributes rendSurface.buffer = 0; rendSurface.flags = REND_SURFACE_SCREEN; rendSurface.usr = iV_MODE_4101; rendSurface.size = SIZE_4101; rendSurface.width = pie_GetVideoBufferWidth(); rendSurface.height = pie_GetVideoBufferHeight(); rendSurface.xcentre = pie_GetVideoBufferWidth()/2; rendSurface.ycentre = pie_GetVideoBufferHeight()/2; rendSurface.clip.left = 0; rendSurface.clip.top = 0; rendSurface.clip.right = pie_GetVideoBufferWidth(); rendSurface.clip.bottom = pie_GetVideoBufferHeight(); rendSurface.xpshift = 10; rendSurface.ypshift = 10; width = pie_GetVideoBufferWidth(); for (i=0; ibuffer = (unsigned char *) screen->pixels; } //************************************************************************* //*** display off-screen bank //* //****** void _bank_on_4101(void) { SDL_UnlockSurface(screenGetSDL()); } //************************************************************************* //*** clear prim //* //* params colour = screen background colour //* //****** void _clear_4101(uint32 colour) { int i, size, top, bottom; uint32 *p1, *p2; // ensure even pointers and size (match _bank_on_4101) top = psRendSurface->clip.top & 0xfffe; bottom = (psRendSurface->clip.bottom + 1) & 0xfffe; size = psRendSurface->scantable[(bottom-top)]; p1 = (uint32 *) ((uint8 *) psRendSurface->buffer + psRendSurface->scantable[top]); p2 = (uint32 *) ((uint8 *) (((uint8 *) p1) + (size>>1))); colour |= colour<<8; colour |= colour<<16; for (i=size>>3; i>0; i--) *p1++ = *p2++ = colour; } //* prims ***************************************************************** //************************************************************************* //*** fill horizontal line //* //* params x1 = left edge //* x2 = right edge //* y = hline y //* colour = hline colour //****** void _hline_4101(int x1, int x2, int y, uint32 colour) { int d, i, m; uint8 *bp; uint32 *dp; colour |= colour<<8; colour |= colour<<16; if (x2psRendSurface->clip.right || x2clip.left || yclip.top || y>psRendSurface->clip.bottom) return; if (x1clip.left) x1 = psRendSurface->clip.left; if (x2>psRendSurface->clip.right) x2 = psRendSurface->clip.right; */ bp = psRendSurface->buffer + x1 + psRendSurface->scantable[y]; d = x2 - x1; if (d<8) { for (i=d; i>=0; i--) *bp++ = colour; } else { m = d & 3; d -= m; if (m<4) { for (i=m; i>=0; i--) *bp++ = (uint8) colour; } dp = (uint32 *) bp; for (i=(d>>2); i>0; i--) *dp++ = colour; } } //************************************************************************* //*** plot vertical line //* //* params y1 = top y //* y2 = bottom y //* x = vline x //* colour = vline colour //****** void _vline_4101(int y1, int y2, int x, uint32 colour) { int i, d; uint8 *p; if (y2buffer + x + psRendSurface->scantable[y1]; d = y2 - y1; for (i=d; i>=0; i--) { *p = colour; p += WIDTH_4101; } } //************************************************************************* //*** plot pixel //* //* params x = pixel x //* y = pixel y //* colour = pixel colour //****** void _pixel_4101(int x, int y, uint32 colour) { uint8 *p; p = psRendSurface->buffer + x + psRendSurface->scantable[y]; *p = colour; } //************************************************************************* //*** plot filled box //* //* params x1,y1 = box top left-hand corner //* x2,y2 = box bottom right-hand corner //* colour = box fill colour //****** void _boxf_4101(int x1, int y1, int x2, int y2, uint32 colour) { int w, h, i, j, d, b, lineb_w, lined_w; iPointer db; db.bp = (uint8 *) psRendSurface->buffer + x1 + psRendSurface->scantable[y1]; w = x2 - x1+1; h = y2 - y1+1; colour |= colour<<8; colour |= colour<<16; // width < 8, use store-byte mode if (w<8) { lineb_w = WIDTH_4101 - w; for (i=h; i>0; i--) { for (j=w; j>0; j--) *db.bp++ = (uint8) colour; db.bp += lineb_w; } // width >= 8, use store-doubleword mode } else { b = w & 0x3; d = w & 0xfffc; lined_w = (WIDTH_4101 - d)>>2; d >>= 2; for (i=h; i>0; i--) { for (j=d; j>0; j--) *db.dp++ = colour; if (b==3) { *db.bp++ = (uint8) colour; *db.bp++ = (uint8) colour; *db.bp++ = (uint8) colour; } else if (b==2) { *db.bp++ = (uint8) colour; *db.bp++ = (uint8) colour; } else if (b==1) { *db.bp++ = (uint8) colour; } db.dp += lined_w; db.bp -= b; } } } //************************************************************************** //*** plot box //* //* params x1,y1 = box top left-hand corner //* x2,y2 = box bottom right-hand corner //* colour = box colour //****** void _box_4101(int x1, int y1, int x2, int y2, uint32 colour) { _hline_4101(x1,x2,y1,colour); _hline_4101(x1,x2,y2,colour); _vline_4101(y1,y2,x1,colour); _vline_4101(y1,y2,x2,colour); } //************************************************************************* //*** plot line //* //* params x1,y1 = line point 1 //* x2,y2 = line point 2 //* colour = line colour //****** void _line_4101(int x1, int y1, int x2, int y2, uint32 colour) { int dx, dy, dy2, dy2dx2, e, xinc, xinc2, yinc, yinc2, tyinc, t; uint8 *p1, *p2; iBool even_w; p1 = psRendSurface->buffer + x1 + psRendSurface->scantable[y1]; p2 = psRendSurface->buffer + x2 + psRendSurface->scantable[y2]; dx = x2 - x1; if (dx<0) { xinc = -1; dx = -dx; } else xinc = 1; dy = y2 - y1; tyinc = WIDTH_4101; if (dy<0) { dy = -dy; tyinc = -WIDTH_4101; } if (dx>dy) yinc = tyinc; else { yinc = xinc; xinc = tyinc; t = dx; dx = dy; dy = t; } dy2 = dy<<1; dy2dx2 = dy2 - (dx<<1); e = dy2 - dx; xinc2 = -xinc; yinc2 = -yinc; even_w = ((dx & 1) == 0); if (even_w) dx--; dx >>= 1; while (dx-->=0) { *p1 = colour; *p2 = colour; p1 += xinc; p2 += xinc2; if (e>0) { p1 += yinc; p2 += yinc2; e += dy2dx2; } else e += dy2; } if (even_w) *p1 = colour; } void iV_StrobeLine(int x1, int y1, int x2, int y2) { int dx, dy, dy2, dy2dx2, e, xinc, xinc2, yinc, yinc2, tyinc, t; uint8 *p1, *p2; iBool even_w; char storecol; storecol = colour; p1 = psRendSurface->buffer + x1 + psRendSurface->scantable[y1]; p2 = psRendSurface->buffer + x2 + psRendSurface->scantable[y2]; dx = x2 - x1; if (dx<0) { xinc = -1; dx = -dx; } else xinc = 1; dy = y2 - y1; tyinc = WIDTH_4101; if (dy<0) { dy = -dy; tyinc = -WIDTH_4101; } if (dx>dy) yinc = tyinc; else { yinc = xinc; xinc = tyinc; t = dx; dx = dy; dy = t; } dy2 = dy<<1; dy2dx2 = dy2 - (dx<<1); e = dy2 - dx; xinc2 = -xinc; yinc2 = -yinc; even_w = ((dx & 1) == 0); if (even_w) dx--; dx >>= 1; while (dx-->=0) { if(colour) { *p1 = colour; *p2 = colour; } p1 += xinc; p2 += xinc2; if (e>0) { p1 += yinc; p2 += yinc2; e += dy2dx2; } else e += dy2; colour = ~colour; } if (even_w) *p1 = colour; colour = ~storecol; } //************************************************************************* //*** plot anti-aliased line //* //* params x1,y1 = line point 1 //* x2,y2 = line point 2 //* colour = line colour //****** void _aaline_4101(int x1, int y1, int x2, int y2, uint32 colour) { } //************************************************************************* //*** plot circle //* //* params x,y = circle centre //* r = radius //* colour = circle colour //****** void _circle_4101(int x, int y, int r, uint32 colour) { int xwidth, rwidth, xs, e; uint8 *op, *p; op = p = psRendSurface->buffer + x + psRendSurface->scantable[y]; xwidth = x * WIDTH_4101; rwidth = r * WIDTH_4101; e = (3 - r)<<1; xs = 0; while (xs++<=r) { *(p+rwidth+xs) = colour; *(p+r+xwidth) = colour; *(p+r-xwidth) = colour; *(p-rwidth+xs) = colour; *(p-rwidth-xs) = colour; *(p-r-xwidth) = colour; *(p-r+xwidth) = colour; *(p+rwidth-xs) = colour; if (e>0) { r--; e += ((xs-r)<<2); } else e += (xs<<2); } } //************************************************************************* //*** plot filled circle //* //* params x,y = circle centre //* r = radius //* colour = circle colour //****** void _circlef_4101(int x, int y, int r, uint32 colour) { } //************************************************************************* //*** plot texture-mapped triangle //* //* params vert = list triangle vertices (clockwise order) //* tex = texture to apply //* //****** void _ttriangle_4101(iVertex *vrt, iTexture *tex) { int i, miny, li, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btyl, btxr, btyr; iVertex nvrt[3]; USE_THLINE; for (miny = iV_DIVMULTP, i=0, li=0; i<3; i++) { if (vrt[i].y < miny) { miny = vrt[i].y; li = i; } } for (i=0; i<3; i++) { nvrt[i].x = vrt[li].x; nvrt[i].y = vrt[li].y; nvrt[i].u = vrt[li].u; nvrt[i].v = vrt[li].v; if (++li >= 3) li = 0; } dxl = nvrt[2].x - nvrt[0].x; dyl = nvrt[2].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; dtx = nvrt[2].u - nvrt[0].u; dty = nvrt[2].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); if (dyl < dyr) { while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _THLINE; /* _thline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } dxl = nvrt[1].x - nvrt[2].x; dyl = nvrt[1].y - nvrt[2].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[2].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[1].u - nvrt[2].u; dty = nvrt[1].v - nvrt[2].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[2].u << iV_DIVSHIFT); btyl = ((int32)nvrt[2].v << iV_DIVSHIFT); while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _THLINE; /* _thline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } } else { while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _THLINE; /* _thline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } dxr = nvrt[2].x - nvrt[1].x; dyr = nvrt[2].y - nvrt[1].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[1].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[2].u - nvrt[1].u; dty = nvrt[2].v - nvrt[1].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[1].u << iV_DIVSHIFT); btyr = ((int32)nvrt[1].v << iV_DIVSHIFT); while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _THLINE; /* _thline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } } } //************************************************************************* //*** plot texture-mapped triangle (0 is transparent) //* //* params vrt = list triangle vertices (clockwise order) //* tex = texture to apply //* //****** void _tttriangle_4101(iVertex *vrt, iTexture *tex) { int i, miny, li, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; iVertex nvrt[3]; USE_THLINE; for (miny = iV_DIVMULTP, i=0, li=0; i<3; i++) { if (vrt[i].y < miny) { miny = vrt[i].y; li = i; } } for (i=0; i<3; i++) { nvrt[i].x = vrt[li].x; nvrt[i].y = vrt[li].y; nvrt[i].u = vrt[li].u; nvrt[i].v = vrt[li].v; if (++li >= 3) li = 0; } dxl = nvrt[2].x - nvrt[0].x; dyl = nvrt[2].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; dtx = nvrt[2].u - nvrt[0].u; dty = nvrt[2].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); if (dyl < dyr) { while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _TTHLINE; /* _tthline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } dxl = nvrt[1].x - nvrt[2].x; dyl = nvrt[1].y - nvrt[2].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[2].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[1].u - nvrt[2].u; dty = nvrt[1].v - nvrt[2].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[2].u << iV_DIVSHIFT); btyl = ((int32)nvrt[2].v << iV_DIVSHIFT); while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _TTHLINE; /* _tthline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } } else { while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _TTHLINE; /* _tthline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } dxr = nvrt[2].x - nvrt[1].x; dyr = nvrt[2].y - nvrt[1].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[1].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[2].u - nvrt[1].u; dty = nvrt[2].v - nvrt[1].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[1].u << iV_DIVSHIFT); btyr = ((int32)nvrt[1].v << iV_DIVSHIFT); while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _TTHLINE; /* _tthline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } } } //************************************************************************* //*** plot gouraud-shaded triangle //* //* params pts = triangle vertices //* //****** void _gtriangle_4101(iVertex *pts) { } //************************************************************************* //*** plot flat-shaded triangle //* //* params vrt = triangle vertices //* //****** void _ftriangle_4101(iVertex *vrt, uint32 col) { int i, miny, li, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, bxl, bxr; iVertex nvrt[3]; USE_HLINE; for (miny = iV_DIVMULTP, i=0, li=0; i<3; i++) { if (vrt[i].y < miny) { miny = vrt[i].y; li = i; } } for (i=0; i<3; i++) { nvrt[i].x = vrt[li].x; nvrt[i].y = vrt[li].y; if (++li >= 3) li = 0; } dxl = nvrt[2].x - nvrt[0].x; dyl = nvrt[2].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; if (dyl < dyr) { while (dyl-- > 0) { bxl += gradl; bxr += gradr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _col_ = col; _HLINE; /* _hline_4101(bxl >> iV_DIVSHIFT, bxr >> iV_DIVSHIFT, y++, col); */ } dxl = nvrt[1].x - nvrt[2].x; dyl = nvrt[1].y - nvrt[2].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[2].x << iV_DIVSHIFT) + iV_DIVMULTP_2; while (dyl-- > 0) { bxl += gradl; bxr += gradr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _col_ = col; _HLINE; /* _hline_4101(bxl >> iV_DIVSHIFT, bxr >> iV_DIVSHIFT, y++, col); */ } } else { while (dyr-- > 0) { bxl += gradl; bxr += gradr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _col_ = col; _HLINE; /* _hline_4101(bxl >> iV_DIVSHIFT, bxr >> iV_DIVSHIFT, y++, col); */ } dxr = nvrt[2].x - nvrt[1].x; dyr = nvrt[2].y - nvrt[1].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[1].x << iV_DIVSHIFT) + iV_DIVMULTP_2; while (dyr-- > 0) { bxl += gradl; bxr += gradr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _col_ = col; _HLINE; /* _hline_4101(bxl >> iV_DIVSHIFT, bxr >> iV_DIVSHIFT, y++, col); */ } } } void _ttquad_4101(iVertex *vrt, iTexture *tex) { } void _tquad_4101(iVertex *vrt, iTexture *tex) { } void _fquad_4101(iVertex *vrt) { } void _gquad_4101(iVertex *vrt) { } //************************************************************************* //*** plot texture-mapped polygon. //* //* params npoints = number of points in poly //* (max set by iV_POLY_MAX_POINTS in vid.h) //* vrt = list poly vertices (clockwise order) //* tex = texture to apply //* //****** void _tpolygon_4101(int npoints, iVertex *vrt, iTexture *tex) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; USE_THLINE; for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; dtx = nvrt[npoints-1].u - nvrt[0].u; dty = nvrt[npoints-1].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _THLINE; /* if (_x1_ > _x2_) { iV_SWAP(_x1_,_x2_); iV_SWAP(_btx1_,_btx2_); iV_SWAP(_bty1_,_bty2_); } __dx = _x2_- _x1_; __du = (((_btx2_-_btx1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; __dv = (((_bty2_-_bty1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; for (__x = __dx; __x>0; __x--, __pp++) { __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); *__pp = __col; _btx1_ += __du; _bty1_ += __dv; } */ /* _thline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[li-1].u - nvrt[li].u; dty = nvrt[li-1].v - nvrt[li].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[li].u << iV_DIVSHIFT); btyl = ((int32)nvrt[li].v << iV_DIVSHIFT); li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _THLINE; /* if (_x1_ > _x2_) { iV_SWAP(_x1_,_x2_); iV_SWAP(_btx1_,_btx2_); iV_SWAP(_bty1_,_bty2_); } __dx = _x2_- _x1_; __du = (((_btx2_-_btx1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; __dv = (((_bty2_-_bty1_)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[__dx]; __pp = psRendSurface->buffer + psRendSurface->scantable[_y_] + _x1_; for (__x = __dx; __x>0; __x--, __pp++) { __col = *((uint8 *)_tex_ + ((_bty1_ >> iV_DIVSHIFT)<<_xshift_)+(_btx1_>>iV_DIVSHIFT)); *__pp = __col; _btx1_ += __du; _bty1_ += __dv; } */ /* _thline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[ri+1].u - nvrt[ri].u; dty = nvrt[ri+1].v - nvrt[ri].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[ri].u << iV_DIVSHIFT); btyr = ((int32)nvrt[ri].v << iV_DIVSHIFT); ri++; } } } //************************************************************************* //*** plot transparent texture-mapped polygon (colour 0 is transparent) //* //* params npoints = number of points in poly //* (max set by iV_POLY_MAX_POINTS in vid.h) //* vrt = list poly vertices (clockwise order) //* tex = texture to apply //* //****** void _ttpolygon_4101(int npoints, iVertex *vrt, iTexture *tex) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; USE_THLINE; for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; dtx = nvrt[npoints-1].u - nvrt[0].u; dty = nvrt[npoints-1].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _TTHLINE; /* _tthline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[li-1].u - nvrt[li].u; dty = nvrt[li-1].v - nvrt[li].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[li].u << iV_DIVSHIFT); btyl = ((int32)nvrt[li].v << iV_DIVSHIFT); li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xshift_ = tex->xshift; _tex_ = tex->bmp; _TTHLINE; /* _tthline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp); */ } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[ri+1].u - nvrt[ri].u; dty = nvrt[ri+1].v - nvrt[ri].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[ri].u << iV_DIVSHIFT); btyr = ((int32)nvrt[ri].v << iV_DIVSHIFT); ri++; } } } //************************************************************************* //*** plot transparent texture-mapped polygon (colour 0 is transparent) //* (ANY WIDTH TEXTURE PAGE!) //* params npoints = number of points in poly //* (max set by iV_POLY_MAX_POINTS in vid.h) //* vrt = list poly vertices (clockwise order) //* tex = texture to apply //* //****** void _ttwpolygon_4101(int npoints, iVertex *vrt, iTexture *tex) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; USE_THLINE_ANYWIDTH; for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; dtx = nvrt[npoints-1].u - nvrt[0].u; dty = nvrt[npoints-1].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xwidth_ = tex->width; _tex_ = tex->bmp; _TTHLINE_ANYWIDTH_A; } if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[li-1].u - nvrt[li].u; dty = nvrt[li-1].v - nvrt[li].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[li].u << iV_DIVSHIFT); btyl = ((int32)nvrt[li].v << iV_DIVSHIFT); li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _btx1_ = btxl; _btx2_ = btxr; _bty1_ = btyl; _bty2_ = btyr; _xwidth_ = tex->width; _tex_ = tex->bmp; _TTHLINE_ANYWIDTH_A; } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[ri+1].u - nvrt[ri].u; dty = nvrt[ri+1].v - nvrt[ri].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[ri].u << iV_DIVSHIFT); btyr = ((int32)nvrt[ri].v << iV_DIVSHIFT); ri++; } } } //************************************************************************** //*** plot flat-shaded polygon //* //* params npoints = number of polygon vertices //* vrt = polygon vertices //* //****** void _fpolygon_4101(int npoints, iVertex *vrt, uint32 col) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, bxl, bxr; USE_HLINE; for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { bxl += gradl; bxr += gradr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _col_ = col; _HLINE; /* _hline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,col); */ } if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; _x1_ = bxl >> iV_DIVSHIFT; _x2_ = bxr >> iV_DIVSHIFT; _y_ = y++; _col_ = col; _HLINE; /* _hline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,col); */ } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; ri++; } } } //************************************************************************* //*** plot gouraud-shaded polygon //* //* params npoints = number of polygon vertices //* vrt = polygon vertices //****** void _gpolygon_4101(int npoints, iVertex *vrt) { } //************************************************************************* //*** plot triangle (texture-mapped, gouraud-shaded, flat-shaded) //* //* params vrt = triangle vertices //* //****** void _triangle_4101(iVertex *vrt, iTexture *tex, uint32 type) { /* if (colour & iV_POLY_TEXT) { // _ttriangle_4101(vrt); } else if (colour & iV_POLY_FLAT) { _ftriangle_4101(vrt); } else if (colour & iV_POLY_GOUR) { _gtriangle_4101(vrt); } */ } //************************************************************************* //*** plot quad (texture-mapped, gouraud-shaded, flat-shaded) //* //* params vrt = triangle vertices //* //****** void _quad_4101(iVertex *vrt, iTexture *tex, uint32 type) { /* if (colour & iV_POLY_TEXT) { // _ttriangle_4101(vrt); } else if (colour & iV_POLY_FLAT) { _ftriangle_4101(vrt); } else if (colour & iV_POLY_GOUR) { _gtriangle_4101(vrt); } */ } //************************************************************************* //*** plot polygon (texture-mapped, gouraud-shaded, flat-shaded) //* //* params npoints = number of polygon vertices //* vrt = polygon vertices //****** void _polygon_4101(int npoints, iVertex *vrt, iTexture *tex, uint32 type) { /* if (colour & iV_POLY_TEXT) { _fpolygon_4101(npoints,vrt); } else if (colour & iV_POLY_FLAT) { _fpolygon_4101(npoints,vrt); } else if (colour & iV_POLY_GOUR) { _fpolygon_4101(npoints,vrt); } */ } //************************************************************************* //*** get bitmap from screen buffer //* //* params bmp = buffer to store bitmap //* x = screen x position //* y = screen y position //* w = bitmap width //* h = bitmap height //* //****** void _gbitmap_4101(iBitmap *bmp, int x, int y, int w, int h) { int i, j, d, b, lineb_w, lined_w; uint8 *bp; uint32 *dp; iPointer dbmp; bp = (uint8 *) psRendSurface->buffer + x + psRendSurface->scantable[y]; // width < 8, use get-byte mode if (w<8) { lineb_w = WIDTH_4101 - w; for (i=0; i= 8, use get-doubleword mode } else { b = w & 0x3; d = w & 0xfffc; lineb_w = WIDTH_4101 - b; lined_w = (WIDTH_4101 - d)>>2; dp = (uint32 *) bp; dbmp.dp = (uint32 *) bmp; bp += d; d >>= 2; for (i=0; ibuffer + x + psRendSurface->scantable[y]; for (i=0; i0 in bitmap) //* //* params bmp = pointer to bitmap //* x = bitmap screen x position //* y = bitmap screen y position //* w = bitmap width //* h = bitmap height //* ow = bitmap original width (when clipped) else == w //* //****** void _sbitmap_4101(iBitmap *bmp, int x, int y, int w, int h, int ow) { int i, j, lineb_w; uint8 *bp; uint8 a; lineb_w = WIDTH_4101 - w; bp = (uint8 *) psRendSurface->buffer + x + psRendSurface->scantable[y]; for (i=0; ibuffer + x + psRendSurface->scantable[y]; // width < 8, use store-byte mode if (w<8) { lineb_w = WIDTH_4101 - w; for (i=0; i= 8, use store-doubleword mode } else { b = w & 0x3; d = w & 0xfffc; lineb_w = WIDTH_4101 - b; lined_w = (WIDTH_4101 - d)>>2; dp = (uint32 *) bp; dbmp.dp = (uint32 *) bmp; bp += d; d >>= 2; for (i=0; ibuffer + x + psRendSurface->scantable[y]; lineb_w = WIDTH_4101 - w; for (i=0; ibuffer + x + psRendSurface->scantable[y]; lineb_w = WIDTH_4101 - w; for (i=0; ibuffer + x + (w-1) + psRendSurface->scantable[y]; for (j=0; jbuffer + x + psRendSurface->scantable[y+h-1]; for (j=0; j0) //* th = target height (>0) //****** void _bitmapr180_4101(iBitmap *bmp, int x, int y, int w, int h, int ow) { int i, j; uint8 *bp, *p; bp = (uint8 *) psRendSurface->buffer + x + w - 1 + psRendSurface->scantable[y+h-1]; for (j=0; j0) //* th = target height (>0) //****** void _rbitmap_4101(iBitmap *bmp, int x, int y, int w, int h, int tw, int th) { int i, j; fixed xacc, yacc, ix, iy; uint8 *bp, *bbmp, *p; bp = (uint8 *) psRendSurface->buffer + x + psRendSurface->scantable[y]; xacc = (w<>BSHIFT) * w; p = bp; for (j=0, ix=0; j>BSHIFT)); bp += WIDTH_4101; } } //************************************************************************* //*** plot and resize bitmap rotated by 90 DEG clockwise //* //* params bmp = pointer to bitmap //* x = bitmap screen x position //* y = bitmap screen y position //* w = bitmap width //* h = bitmap height //* tw = target width (>0) //* th = target height (>0) //****** void _rbitmapr90_4101(iBitmap *bmp, int x, int y, int w, int h, int tw, int th) { int i, j; fixed xacc, yacc, ix, iy; uint8 *bp, *bbmp, *p; bp = (uint8 *) psRendSurface->buffer + x + (w-1) + psRendSurface->scantable[y]; xacc = (w<>BSHIFT) * w; p = bp; for (j=0, ix=0; j>BSHIFT)); p += WIDTH_4101; } bp--; } } //************************************************************************* //*** plot and resize bitmap rotated by 180 DEG clockwise //* //* params bmp = pointer to bitmap //* x = bitmap screen x position //* y = bitmap screen y position //* w = bitmap width //* h = bitmap height //* tw = target width (>0) //* th = target height (>0) //****** void _rbitmapr180_4101(iBitmap *bmp, int x, int y, int w, int h, int tw, int th) { int i, j; fixed xacc, yacc, ix, iy; uint8 *bp, *bbmp, *p; bp = (uint8 *) psRendSurface->buffer + x + w - 1 + psRendSurface->scantable[y+h-1]; xacc = (w<>BSHIFT) * w; p = bp; for (j=0, ix=0; j>BSHIFT)); bp -= WIDTH_4101; } } //************************************************************************* //*** plot and resize bitmap rotated by 270 DEG clockwise //* //* params bmp = pointer to bitmap //* x = bitmap screen x position //* y = bitmap screen y position //* w = bitmap width //* h = bitmap height //* tw = target width (>0) //* th = target height (>0) //****** void _rbitmapr270_4101(iBitmap *bmp, int x, int y, int w, int h, int tw, int th) { int i, j; fixed xacc, yacc, ix, iy; uint8 *bp, *bbmp, *p; bp = (uint8 *) psRendSurface->buffer + x + psRendSurface->scantable[y+h-1]; xacc = (w<>BSHIFT) * w; p = bp; for (j=0, ix=0; j>BSHIFT)); p -= WIDTH_4101; } bp++; } } //************************************************************************* //*** plot texture-mapped gouraud-shaded triangle //* //* params vert = list triangle vertices (clockwise order) //* tex = texture to apply //* //****** void _tgtriangle_4101(iVertex *vrt, iTexture *tex) { int i, miny, li, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btyl, btxr, btyr, dgl, dgr, bgl, bgr; iVertex nvrt[3]; // return; // if ( !pie_CLOCKWISE( vrt[0].x, vrt[0].y, vrt[1].x, vrt[1].y, vrt[2].x, vrt[2].y ) ) // return; for (miny = iV_DIVMULTP, i=0, li=0; i<3; i++) { if (vrt[i].y < miny) { miny = vrt[i].y; li = i; } } for (i=0; i<3; i++) { nvrt[i].x = vrt[li].x; nvrt[i].y = vrt[li].y; nvrt[i].u = vrt[li].u; nvrt[i].v = vrt[li].v; nvrt[i].g = vrt[li].g; if (++li >= 3) li = 0; } // scanline dxl = nvrt[2].x - nvrt[0].x; dyl = nvrt[2].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; // gouraud dgl = _iVPRIM_DIVTABLE[dyl] * (nvrt[2].g - nvrt[0].g); dgr = _iVPRIM_DIVTABLE[dyr] * (nvrt[1].g - nvrt[0].g); bgl = bgr = nvrt[0].g << iV_DIVSHIFT; // texture dtx = nvrt[2].u - nvrt[0].u; dty = nvrt[2].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); if (dyl < dyr) { while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; bgl += dgl; bgr += dgr; if (bgl == bgr) { _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,bgl>>iV_DIVSHIFT); } else { _tghline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,bgl,bgr,tex->xshift,tex->bmp); } } dxl = nvrt[1].x - nvrt[2].x; dyl = nvrt[1].y - nvrt[2].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[2].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dgl = _iVPRIM_DIVTABLE[dyl] * (nvrt[1].g - nvrt[2].g); bgl = nvrt[2].g << iV_DIVSHIFT; dtx = nvrt[1].u - nvrt[2].u; dty = nvrt[1].v - nvrt[2].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[2].u << iV_DIVSHIFT); btyl = ((int32)nvrt[2].v << iV_DIVSHIFT); while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; bgl += dgl; bgr += dgr; if (bgl == bgr) { _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr,btyl,btyr,tex->xshift,tex->bmp,bgl>>iV_DIVSHIFT); } else { _tghline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,bgl,bgr,tex->xshift,tex->bmp); } } } else { while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; bgl += dgl; bgr += dgr; if (bgl == bgr) { _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,bgl>>iV_DIVSHIFT); } else { _tghline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,bgl,bgr,tex->xshift,tex->bmp); } } dxr = nvrt[2].x - nvrt[1].x; dyr = nvrt[2].y - nvrt[1].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; dgr = _iVPRIM_DIVTABLE[dyr] * (nvrt[2].g - nvrt[1].g); bgr = nvrt[1].g << iV_DIVSHIFT; bxr = ((int32)nvrt[1].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[2].u - nvrt[1].u; dty = nvrt[2].v - nvrt[1].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[1].u << iV_DIVSHIFT); btyr = ((int32)nvrt[1].v << iV_DIVSHIFT); while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; bgl += dgl; bgr += dgr; if (bgl == bgr) { _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,bgl>>iV_DIVSHIFT); } else { _tghline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,bgl,bgr,tex->xshift,tex->bmp); } } } } //************************************************************************* //*** plot texture-mapped gouraud-shaded horizontal line (linear mapping) //* //* params x1 = scanline left screen x //* x2 = scanline right screen x //* btx1, btx2, bty1, bty2 = tex coefficients shifted by iV_DIVSHIFT //* bg1, bg2 = gouraud shading coefficients shifted by iV_DIVSHIFT //* xshift = width of bitmap as a shift //* tex = bitmap //****** static void _tghline_4101(int x1, int x2, int y, fixed btx1, fixed btx2, fixed bty1, fixed bty2, fixed bg1, fixed bg2, int xshift, iBitmap *tex) { int x, dx, col; fixed txs, tys, gs; uint8 *pp; if (x1 > x2) { iV_SWAP(x1,x2); iV_SWAP(btx1,btx2); iV_SWAP(bty1,bty2); iV_SWAP(bg1, bg2); } #ifdef ACCURATE // use this for higher accuracy if required // dx = (x2 - x1)+1 (+1) avoids test for when dx == 0 dx = (x2 - x1)+1; // if no iV_SWAP this fails when dx == -1 ! txs = (((btx2-btx1))) / dx; tys = (bty2-bty1) /dx; gs = (bg2 - bg1) / dx; #else dx = x2-x1; // add 1 (DIVMULTP) instead of .5 (saves adding .5 to big_tx in poly txs = (((btx2-btx1)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; tys = (((bty2-bty1)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; gs = ((bg2 - bg1) >> iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; #endif pp = psRendSurface->buffer + psRendSurface->scantable[y] + x1; //for (x = x1; x < x2; x++, pp++) { for (x = dx; x >0; x--, pp++) { col = *((uint8 *)tex+((bty1 >> iV_DIVSHIFT)<>iV_DIVSHIFT)); /* Be sure and remove this */ if (bg1 < 0) { bg1 = 0; } /* Remove */ // col = iV_PALETTE_SHADE(col,(bg1 >> iV_DIVSHIFT)); col = palShades[col*PALETTE_SHADE_LEVEL+(bg1>>iV_DIVSHIFT)]; *pp = col; btx1 += txs; bty1 += tys; bg1 += gs; } } //************************************************************************* //*** plot texture-mapped flat-shaded horizontal line (linear mapping) //* //* params x1 = scanline left screen x //* x2 = scanline right screen x //* btx1, btx2, bty1, bty2 = tex coefficients shifted by iV_DIVSHIFT //* xshift = width of bitmap as a shift //* tex = bitmap //* shade = colour shade (0..iV_PALETTE_SHADE_LEVEL-1) //****** static void _tfhline_4101(int x1, int x2, int y, fixed btx1, fixed btx2, fixed bty1, fixed bty2, int xshift, iBitmap *tex, int shade) { int x, dx, col; fixed txs, tys; uint8 *pp; if (x1 > x2) { iV_SWAP(x1,x2); iV_SWAP(btx1,btx2); iV_SWAP(bty1,bty2); } #ifdef ACCURATE // use this for higher accuracy if required // dx = (x2 - x1)+1 (+1) avoids test for when dx == 0 dx = (x2 - x1)+1; // if no iV_SWAP this fails when dx == -1 ! txs = (((btx2-btx1))) / dx; tys = (((bty2-bty1))) /dx; #else dx = x2-x1; // add 1 (DIVMULTP) instead of .5 (saves adding .5 to big_tx in poly txs = (((btx2-btx1)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; tys = (((bty2-bty1)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; #endif pp = psRendSurface->buffer + psRendSurface->scantable[y] + x1; //for (x = x1; x < x2; x++, pp++) { for (x = dx; x >0; x--, pp++) { col = *((uint8 *)tex+((bty1 >> iV_DIVSHIFT)<>iV_DIVSHIFT)); // col = iV_PALETTE_SHADE(col,shade); col = palShades[col*PALETTE_SHADE_LEVEL+shade]; // col = transLookup[col][*pp]; *pp = col; btx1 += txs; bty1 += tys; } } //************************************************************************* //*** plot texture-mapped flat-shaded transparent horizontal line (linear mapping) //* Alex //* params x1 = scanline left screen x //* x2 = scanline right screen x //* btx1, btx2, bty1, bty2 = tex coefficients shifted by iV_DIVSHIFT //* xshift = width of bitmap as a shift //* tex = bitmap //* shade = colour shade (0..iV_PALETTE_SHADE_LEVEL-1) //****** static void _ttfhline_4101(int x1, int x2, int y, fixed btx1, fixed btx2, fixed bty1, fixed bty2, int xshift, iBitmap *tex, int shade) { int x, dx, col; fixed txs, tys; uint8 *pp; if (x1 > x2) { iV_SWAP(x1,x2); iV_SWAP(btx1,btx2); iV_SWAP(bty1,bty2); } #ifdef ACCURATE // use this for higher accuracy if required // dx = (x2 - x1)+1 (+1) avoids test for when dx == 0 dx = (x2 - x1)+1; // if no iV_SWAP this fails when dx == -1 ! txs = (((btx2-btx1))) / dx; tys = (((bty2-bty1))) /dx; #else dx = x2-x1; // add 1 (DIVMULTP) instead of .5 (saves adding .5 to big_tx in poly txs = (((btx2-btx1)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; tys = (((bty2-bty1)+iV_DIVMULTP)>>iV_DIVSHIFT) * _iVPRIM_DIVTABLE[dx]; #endif pp = psRendSurface->buffer + psRendSurface->scantable[y] + x1; //for (x = x1; x < x2; x++, pp++) { for (x = dx; x >0; x--, pp++) { col = *((uint8 *)tex+((bty1 >> iV_DIVSHIFT)<>iV_DIVSHIFT)); // col = iV_PALETTE_SHADE(col,shade); col = palShades[col*PALETTE_SHADE_LEVEL+shade]; if(col) { *pp = col; } btx1 += txs; bty1 += tys; } } //************************************************************************* /* Draw a textured gouraud shaded polygon */ /* Adapted from Sam's straight textured polygon draw */ /* Alex's version - with comments and everything!, July, 1997 */ void _tgpolygon_4101(int npoints, iVertex *vrt, iTexture *tex) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; /* G variables are gradient vars - I are illumination vars */ fixed gourGLeft, gourGRight, gourILeft, gourIRight; // return; /* We can assume that there's more than 3 sides as this routine will only be called if the clipper returns sides > 3. Therefore we can reject the drawing of any polygons if the first 3 sided sub-part (a triangle) is anticlockwise. This is vrt[0..3]. There's no worries indexing up to 2 as we know the shape is bigger than a triangle */ // if ( !pie_CLOCKWISE( vrt[0].x, vrt[0].y, vrt[1].x, vrt[1].y, vrt[2].x, vrt[2].y ) ) // { // return; // } for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } /* Set up increments, gradients */ dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; //--------------------------------------------------------------------------- /* Set up the gouraud variables */ gourGLeft = _iVPRIM_DIVTABLE[dyl] * (nvrt[npoints-1].g - nvrt[0].g); gourGRight = _iVPRIM_DIVTABLE[dyr] * (nvrt[1].g - nvrt[0].g); /* Initial illumination values */ gourILeft = gourIRight = nvrt[0].g << iV_DIVSHIFT; //--------------------------------------------------------------------------- dtx = nvrt[npoints-1].u - nvrt[0].u; dty = nvrt[npoints-1].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { /* We're going down the left hand side of the triangle */ bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; //--------------------------------------------------------------------------- gourILeft += gourGLeft; gourIRight += gourGRight; //--------------------------------------------------------------------------- /* Flat shade the scan line segment if light levels at edge are the same */ if (gourILeft == gourIRight) { _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,gourILeft>>iV_DIVSHIFT); } /* Otherwise there's disparate values for illumination - so gouraud shade */ else { _tghline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,gourILeft,gourIRight,tex->xshift,tex->bmp); } } /* Have we finished */ if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[li-1].u - nvrt[li].u; dty = nvrt[li-1].v - nvrt[li].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[li].u << iV_DIVSHIFT); btyl = ((int32)nvrt[li].v << iV_DIVSHIFT); //--------------------------------------------------------------------------- gourGLeft = _iVPRIM_DIVTABLE[dyl] * (nvrt[li-1].g - nvrt[li].g); gourILeft = nvrt[li].g << iV_DIVSHIFT; //--------------------------------------------------------------------------- li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; //--------------------------------------------------------------------------- gourILeft += gourGLeft; gourIRight += gourGRight; //--------------------------------------------------------------------------- /* See above */ if (gourILeft == gourIRight) { _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,gourILeft>>iV_DIVSHIFT); } else { _tghline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,gourILeft,gourIRight,tex->xshift,tex->bmp); } } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[ri+1].u - nvrt[ri].u; dty = nvrt[ri+1].v - nvrt[ri].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[ri].u << iV_DIVSHIFT); btyr = ((int32)nvrt[ri].v << iV_DIVSHIFT); //--------------------------------------------------------------------------- gourGRight = _iVPRIM_DIVTABLE[dyr] * (nvrt[ri+1].g - nvrt[ri].g); gourIRight = nvrt[ri].g << iV_DIVSHIFT; //--------------------------------------------------------------------------- ri++; } } } //************************************************************************* /* Draw a textured level shaded polygon */ /* Adapted from Sam's straight textured polygon draw */ /* Alex's version - with comments and everything!, July, 1997 */ void _tspolygon_4101(int npoints, iVertex *vrt, iTexture *tex, int brightness) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; /* We can assume that there's more than 3 sides as this routine will only be called if the clipper returns sides > 3. Therefore we can reject the drawing of any polygons if the first 3 sided sub-part (a triangle) is anticlockwise. This is vrt[0..3]. There's no worries indexing up to 2 as we know the shape is bigger than a triangle */ for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } /* Set up increments, gradients */ dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; //--------------------------------------------------------------------------- dtx = nvrt[npoints-1].u - nvrt[0].u; dty = nvrt[npoints-1].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { /* We're going down the left hand side of the triangle */ bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } /* Have we finished */ if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[li-1].u - nvrt[li].u; dty = nvrt[li-1].v - nvrt[li].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[li].u << iV_DIVSHIFT); btyl = ((int32)nvrt[li].v << iV_DIVSHIFT); li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[ri+1].u - nvrt[ri].u; dty = nvrt[ri+1].v - nvrt[ri].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[ri].u << iV_DIVSHIFT); btyr = ((int32)nvrt[ri].v << iV_DIVSHIFT); ri++; } } } //************************************************************************* //*** plot texture-mapped level-shaded triangle //* //* params vert = list triangle vertices (clockwise order) //* tex = texture to apply //* //****** void _tstriangle_4101(iVertex *vrt, iTexture *tex, int brightness) { int i, miny, li, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btyl, btxr, btyr; iVertex nvrt[3]; for (miny = iV_DIVMULTP, i=0, li=0; i<3; i++) { if (vrt[i].y < miny) { miny = vrt[i].y; li = i; } } for (i=0; i<3; i++) { nvrt[i].x = vrt[li].x; nvrt[i].y = vrt[li].y; nvrt[i].u = vrt[li].u; nvrt[i].v = vrt[li].v; nvrt[i].g = vrt[li].g; if (++li >= 3) li = 0; } // scanline dxl = nvrt[2].x - nvrt[0].x; dyl = nvrt[2].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; // texture dtx = nvrt[2].u - nvrt[0].u; dty = nvrt[2].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); if (dyl < dyr) { while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } dxl = nvrt[1].x - nvrt[2].x; dyl = nvrt[1].y - nvrt[2].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[2].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[1].u - nvrt[2].u; dty = nvrt[1].v - nvrt[2].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[2].u << iV_DIVSHIFT); btyl = ((int32)nvrt[2].v << iV_DIVSHIFT); while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr,btyl,btyr,tex->xshift,tex->bmp,brightness); } } else { while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } dxr = nvrt[2].x - nvrt[1].x; dyr = nvrt[2].y - nvrt[1].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[1].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[2].u - nvrt[1].u; dty = nvrt[2].v - nvrt[1].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[1].u << iV_DIVSHIFT); btyr = ((int32)nvrt[1].v << iV_DIVSHIFT); while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _tfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } } } //************************************************************************* //*** plot texture-mapped level-shaded transparent triangle (0 is trans) //* //* params vert = list triangle vertices (clockwise order) //* tex = texture to apply //* //****** void _ttstriangle_4101(iVertex *vrt, iTexture *tex, int brightness) { int i, miny, li, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btyl, btxr, btyr; iVertex nvrt[3]; for (miny = iV_DIVMULTP, i=0, li=0; i<3; i++) { if (vrt[i].y < miny) { miny = vrt[i].y; li = i; } } for (i=0; i<3; i++) { nvrt[i].x = vrt[li].x; nvrt[i].y = vrt[li].y; nvrt[i].u = vrt[li].u; nvrt[i].v = vrt[li].v; nvrt[i].g = vrt[li].g; if (++li >= 3) li = 0; } // scanline dxl = nvrt[2].x - nvrt[0].x; dyl = nvrt[2].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; // texture dtx = nvrt[2].u - nvrt[0].u; dty = nvrt[2].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); if (dyl < dyr) { while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _ttfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } dxl = nvrt[1].x - nvrt[2].x; dyl = nvrt[1].y - nvrt[2].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[2].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[1].u - nvrt[2].u; dty = nvrt[1].v - nvrt[2].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[2].u << iV_DIVSHIFT); btyl = ((int32)nvrt[2].v << iV_DIVSHIFT); while (dyl-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _ttfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr,btyl,btyr,tex->xshift,tex->bmp,brightness); } } else { while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _ttfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } dxr = nvrt[2].x - nvrt[1].x; dyr = nvrt[2].y - nvrt[1].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[1].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[2].u - nvrt[1].u; dty = nvrt[2].v - nvrt[1].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[1].u << iV_DIVSHIFT); btyr = ((int32)nvrt[1].v << iV_DIVSHIFT); while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _ttfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } } } //************************************************************************* /* Draw a textured level shaded transaprent polygon 0 is trans! */ void _ttspolygon_4101(int npoints, iVertex *vrt, iTexture *tex, int brightness) { static iVertex nvrt[iV_POLY_MAX_POINTS]; int i, miny, li, ri, dxl, dyl, dxr, dyr, y; fixed gradl, gradr, gradxl, gradxr, gradyl, gradyr; fixed bxl, bxr; int32 dtx, dty; fixed btxl, btxr, btyl, btyr; /* We can assume that there's more than 3 sides as this routine will only be called if the clipper returns sides > 3. Therefore we can reject the drawing of any polygons if the first 3 sided sub-part (a triangle) is anticlockwise. This is vrt[0..3]. There's no worries indexing up to 2 as we know the shape is bigger than a triangle */ for (miny = iV_DIVMULTP, i=0, li=0; i= npoints) li = 0; } /* Set up increments, gradients */ dxl = nvrt[npoints-1].x - nvrt[0].x; dyl = nvrt[npoints-1].y - nvrt[0].y; dxr = nvrt[1].x - nvrt[0].x; dyr = nvrt[1].y - nvrt[0].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxl = bxr = ((int32)nvrt[0].x << iV_DIVSHIFT) + iV_DIVMULTP_2; y = nvrt[0].y; //--------------------------------------------------------------------------- dtx = nvrt[npoints-1].u - nvrt[0].u; dty = nvrt[npoints-1].v - nvrt[0].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; dtx = nvrt[1].u - nvrt[0].u; dty = nvrt[1].v - nvrt[0].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxl = btxr = ((int32)nvrt[0].u << iV_DIVSHIFT); btyl = btyr = ((int32)nvrt[0].v << iV_DIVSHIFT); li = npoints-1; ri = 1; npoints -= 1; for (;;) { if (dyl < dyr) { dyr -= dyl; while (dyl-- > 0) { /* We're going down the left hand side of the triangle */ bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _ttfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } /* Have we finished */ if (--npoints==0) return; dxl = nvrt[li-1].x - nvrt[li].x; dyl = nvrt[li-1].y - nvrt[li].y; gradl = _iVPRIM_DIVTABLE[dyl] * dxl; bxl = ((int32)nvrt[li].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[li-1].u - nvrt[li].u; dty = nvrt[li-1].v - nvrt[li].v; gradxl = _iVPRIM_DIVTABLE[dyl] * dtx; gradyl = _iVPRIM_DIVTABLE[dyl] * dty; btxl = ((int32)nvrt[li].u << iV_DIVSHIFT); btyl = ((int32)nvrt[li].v << iV_DIVSHIFT); li--; } else { dyl-=dyr; while (dyr-- > 0) { bxl += gradl; bxr += gradr; btxl += gradxl; btyl += gradyl; btxr += gradxr; btyr += gradyr; _ttfhline_4101(bxl >> iV_DIVSHIFT,bxr >> iV_DIVSHIFT,y++,btxl,btxr, btyl,btyr,tex->xshift,tex->bmp,brightness); } if (--npoints == 0) return; dxr = nvrt[ri+1].x - nvrt[ri].x; dyr = nvrt[ri+1].y - nvrt[ri].y; gradr = _iVPRIM_DIVTABLE[dyr] * dxr; bxr = ((int32)nvrt[ri].x << iV_DIVSHIFT) + iV_DIVMULTP_2; dtx = nvrt[ri+1].u - nvrt[ri].u; dty = nvrt[ri+1].v - nvrt[ri].v; gradxr = _iVPRIM_DIVTABLE[dyr] * dtx; gradyr = _iVPRIM_DIVTABLE[dyr] * dty; btxr = ((int32)nvrt[ri].u << iV_DIVSHIFT); btyr = ((int32)nvrt[ri].v << iV_DIVSHIFT); ri++; } } }