#include #include #include "engine3d.h" #include "render3d.h" #include "ZeDemo.h" unsigned char ball_c[256]; unsigned int ball_p[256]; extern unsigned short swp[MAXDATA]; int zdata[MAXDATA]; extern point3d fpts[MAXDATA]; extern point3d norms[MAXDATA]; extern point3d pt_norms[MAXDATA]; extern point2d spts[MAXDATA]; extern point3d spls[MAXDATA]; tcord point_tc[MAXDATA]; unsigned int RenderMode; unsigned int zbuffer[SSIZE]; extern unsigned short shades[64][256]; extern int pdiv[4096]; extern unsigned short env1[]; extern unsigned short env2[]; extern unsigned short env3[]; extern int prticks; static inline void drawpoint(point2d point, unsigned short *vram) { if (point.x>=0 && point.x=0 && point.yx2) { n = x1; x1 = x2; x2 = n; n = y1; y1 = y2; y2 = n; } if (dx!=0) l = ((dy<>16; y00 = y1<>fp)*WIDTH + x; if (vramofs>=0 && vramofsy2) { n = y1; y1 = y2; y2 = n; n = x1; x1 = x2; x2 = n; } if (dy!=0) l = ((dx<>16; x00 = x1<>fp); if (vramofs>=0 && vramofs>16; int dx12 = x2 - x1; int dy12 = y2 - y1; if (dy12!=0) lx12 = ((dx12<>16; int dx02 = x2 - x0; int dy02 = y2 - y0; if (dy02!=0) lx02 = ((dx02<>16; int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp; sx2 = x02>>fp; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>16; lz01 = (dz01*pdiv[dy01+2048])>>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int dz12 = z2 - z1; if (dy12!=0) { lx12 = ((dx12<>16; lz12 = (dz12*pdiv[dy12+2048])>>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int dz02 = z2 - z0; if (dy02!=0) { lx02 = ((dx02<>16; lz02 = (dz02*pdiv[dy02+2048])>>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp; sx2 = x02>>fp; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>16; lc01 = ((dc01<>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int dc12 = c2 - c1; if (dy12!=0) { lx12 = ((dx12<>16; lc12 = ((dc12<>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int dc02 = c2 - c0; if (dy02!=0) { lx02 = ((dx02<>16; lc02 = ((dc02<>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; sc1 = c01; sc2 = c02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = sc1; sc1 = sc2; sc2 = temp; } if (sx2!=sx1) dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp; if (c<0) c = 0; *(vram+vramofs)=shade[c]; } vramofs++; } x01+=lx01; x02+=lx02; c01+=lc01; c02+=lc02; } x01 = x1<>fp; sx2 = x02>>fp; sc1 = c01; sc2 = c02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = sc1; sc1 = sc2; sc2 = temp; } if (sx2!=sx1) dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp; if (c<0) c = 0; *(vram+vramofs)=shade[c]; } vramofs++; } x01+=lx12; x02+=lx02; c01+=lc12; c02+=lc02; } } static inline void DrawGouraudTriangleZB (poly2d poly, unsigned short *vram, unsigned short shade[]) { int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; int c; int c0 = spts[poly.p0].c; int c1 = spts[poly.p1].c; int c2 = spts[poly.p2].c; int z0 = fpts[poly.p0].z; int z1 = fpts[poly.p1].z; int z2 = fpts[poly.p2].z; // ===== Sort ===== int temp; if (y1>16; lc01 = ((dc01<>16; lz01 = (dz01*pdiv[dy01+2048])>>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int dc12 = c2 - c1; int dz12 = z2 - z1; if (dy12!=0) { lx12 = ((dx12<>16; lc12 = ((dc12<>16; lz12 = (dz12*pdiv[dy12+2048])>>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int dc02 = c2 - c0; int dz02 = z2 - z0; if (dy02!=0) { lx02 = ((dx02<>16; lc02 = ((dc02<>16; lz02 = (dz02*pdiv[dy02+2048])>>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; sc1 = c01; sc2 = c02; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = sc1; sc1 = sc2; sc2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) { dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp; if (c<0) c=0; zbuffer[vramofs] = sz1; *(vram+vramofs)=shade[c]; } vramofs++; } x01+=lx01; x02+=lx02; c01+=lc01; c02+=lc02; z01+=lz01; z02+=lz02; } x01 = x1<>fp; sx2 = x02>>fp; sc1 = c01; sc2 = c02; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = sc1; sc1 = sc2; sc2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) { dc = ((sc2 - sc1)*pdiv[(sx2-sx1)+2048])>>16; dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp; if (c<0) c=0; zbuffer[vramofs] = sz1; *(vram+vramofs)=shade[c]; } vramofs++; } x01+=lx12; x02+=lx02; c01+=lc12; c02+=lc02; z01+=lz12; z02+=lz02; } } static inline void DrawTextureTriangle(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) { int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; int c; int u0 = poly.tc0.u; int v0 = poly.tc0.v; int u1 = poly.tc1.u; int v1 = poly.tc1.v; int u2 = poly.tc2.u; int v2 = poly.tc2.v; // ===== Sort ===== int temp; if (y1>16; lu01 = ((du01<>16; lv01 = ((dv01<>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int du12 = u2 - u1; int dv12 = v2 - v1; if (dy12!=0) { lx12 = ((dx12<>16; lu12 = ((du12<>16; lv12 = ((dv12<>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int du02 = u2 - u0; int dv02 = v2 - v0; if (dy02!=0) { lx02 = ((dx02<>16; lu02 = ((du02<>16; lv02 = ((dv02<>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx01; x02+=lx02; u01+=lu01; u02+=lu02; v01+=lv01; v02+=lv02; } x01 = x1<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx12; x02+=lx02; u01+=lu12; u02+=lu02; v01+=lv12; v02+=lv02; } } static inline void DrawTextureTriangleZB(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) { int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; int c; int u0 = poly.tc0.u; int v0 = poly.tc0.v; int u1 = poly.tc1.u; int v1 = poly.tc1.v; int u2 = poly.tc2.u; int v2 = poly.tc2.v; int z0 = fpts[poly.p0].z; int z1 = fpts[poly.p1].z; int z2 = fpts[poly.p2].z; // ===== Sort ===== int temp; if (y1>16; lu01 = ((du01<>16; lv01 = ((dv01<>16; lz01 = (dz01*pdiv[dy01+2048])>>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int du12 = u2 - u1; int dv12 = v2 - v1; int dz12 = z2 - z1; if (dy12!=0) { lx12 = ((dx12<>16; lu12 = ((du12<>16; lv12 = ((dv12<>16; lz12 = (dz12*pdiv[dy12+2048])>>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int du02 = u2 - u0; int dv02 = v2 - v0; int dz02 = z2 - z0; if (dy02!=0) { lx02 = ((dx02<>16; lu02 = ((du02<>16; lv02 = ((dv02<>16; lz02 = (dz02*pdiv[dy02+2048])>>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx01; x02+=lx02; u01+=lu01; u02+=lu02; v01+=lv01; v02+=lv02; z01+=lz01; z02+=lz02; } x01 = x1<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx12; x02+=lx02; u01+=lu12; u02+=lu02; v01+=lv12; v02+=lv02; z01+=lz12; z02+=lz02; } } static inline void DrawEnvmappedTriangle(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) { int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; int c; int u0 = point_tc[poly.p0].u; int v0 = point_tc[poly.p0].v; int u1 = point_tc[poly.p1].u; int v1 = point_tc[poly.p1].v; int u2 = point_tc[poly.p2].u; int v2 = point_tc[poly.p2].v; // ===== Sort ===== int temp; if (y1>16; lu01 = ((du01<>16; lv01 = ((dv01<>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int du12 = u2 - u1; int dv12 = v2 - v1; if (dy12!=0) { lx12 = ((dx12<>16; lu12 = ((du12<>16; lv12 = ((dv12<>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int du02 = u2 - u0; int dv02 = v2 - v0; if (dy02!=0) { lx02 = ((dx02<>16; lu02 = ((du02<>16; lv02 = ((dv02<>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx01; x02+=lx02; u01+=lu01; u02+=lu02; v01+=lv01; v02+=lv02; } x01 = x1<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs=0 && x>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx12; x02+=lx02; u01+=lu12; u02+=lu02; v01+=lv12; v02+=lv02; } } static inline void DrawEnvmappedTriangleZB(poly2d poly, unsigned short *vram, int tshr, unsigned short texture[]) { int x0 =spts[poly.p0].x; int y0 =spts[poly.p0].y; int x1 =spts[poly.p1].x; int y1 =spts[poly.p1].y; int x2 =spts[poly.p2].x; int y2 =spts[poly.p2].y; int c; int u0 = point_tc[poly.p0].u; int v0 = point_tc[poly.p0].v; int u1 = point_tc[poly.p1].u; int v1 = point_tc[poly.p1].v; int u2 = point_tc[poly.p2].u; int v2 = point_tc[poly.p2].v; int z0 = fpts[poly.p0].z; int z1 = fpts[poly.p1].z; int z2 = fpts[poly.p2].z; // ===== Sort ===== int temp; if (y1>16; lu01 = ((du01<>16; lv01 = ((dv01<>16; lz01 = (dz01*pdiv[dy01+2048])>>16; } int dx12 = x2 - x1; int dy12 = y2 - y1; int du12 = u2 - u1; int dv12 = v2 - v1; int dz12 = z2 - z1; if (dy12!=0) { lx12 = ((dx12<>16; lu12 = ((du12<>16; lv12 = ((dv12<>16; lz12 = (dz12*pdiv[dy12+2048])>>16; } int dx02 = x2 - x0; int dy02 = y2 - y0; int du02 = u2 - u0; int dv02 = v2 - v0; int dz02 = z2 - z0; if (dy02!=0) { lx02 = ((dx02<>16; lu02 = ((du02<>16; lv02 = ((dv02<>16; lz02 = (dz02*pdiv[dy02+2048])>>16; } int vramofs; int x, y; int x01 = x0<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx01; x02+=lx02; u01+=lu01; u02+=lu02; v01+=lv01; v02+=lv02; z01+=lz01; z02+=lz02; } x01 = x1<>fp; sx2 = x02>>fp; su1 = u01; su2 = u02; sv1 = v01; sv2 = v02; sz1 = z01; sz2 = z02; if (sx1>sx2) { temp = sx1; sx1 = sx2; sx2 = temp; temp = su1; su1 = su2; su2 = temp; temp = sv1; sv1 = sv2; sv2 = temp; temp = sz1; sz1 = sz2; sz2 = temp; } if (sx2!=sx1) { du = ((su2 - su1)*pdiv[(sx2-sx1)+2048])>>16; dv = ((sv2 - sv1)*pdiv[(sx2-sx1)+2048])>>16; dz = ((sz2 - sz1)*pdiv[(sx2-sx1)+2048])>>16; } yp+=WIDTH; vramofs = yp + sx1; for (x = sx1; x=0 && vramofs>fp)>>tshr) + (((sv1>>fp)>>tshr)<<(8-tshr))]; *(vram+vramofs) = c; } vramofs++; } x01+=lx12; x02+=lx02; u01+=lu12; u02+=lu02; v01+=lv12; v02+=lv02; z01+=lz12; z02+=lz02; } } void zsort(int zsortdata[], object3d *obj) { int i, mz; for (i=0; inpls; i++) { mz = (fpts[obj->poly[i].p0].z + fpts[obj->poly[i].p1].z + fpts[obj->poly[i].p2].z)>>2; zsortdata[i] = -mz; swp[i] = i; } } void Render(object3d *obj, unsigned short *vram) { rotate3d_normals(obj); rotate3d_pt_normals(obj); CalcPolyColor(obj); CalcPointColor(obj); zsort (zdata, obj); quicksort(0, obj->npls - 1, zdata); int i; for (i=0; inpts; i++) { int tu = (pt_norms[i].x>>9) + 127; int tv = (pt_norms[i].y>>9) + 127; point_tc[i].u = abs(tu) & 255; point_tc[i].v = abs(tv) & 255; } int j, m; int vx0, vy0, vx1, vy1, n; for (i=0; inpls; i++) { j = swp[i]; vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; n = vx0 * vy1 - vx1 * vy0; if (n<0) { m = obj->poly[j].m; switch(obj->mtrl[m].rmode) { case WIRE: break; case FLAT: obj->poly[j].c = spls[j].c; DrawFlatTriangle(obj->poly[j], vram, obj->mtrl[m].shade[0]); break; case GOURAUD: DrawGouraudTriangle(obj->poly[j], vram, obj->mtrl[m].shade[0]); break; case TEXTURE: DrawTextureTriangle(obj->poly[j], vram, obj->mtrl[m].txtr[0]->tshr, obj->mtrl[m].txtr[0]->bitmap); break; case ENVMAP: DrawEnvmappedTriangle(obj->poly[j], vram, obj->mtrl[m].txtr[0]->tshr, obj->mtrl[m].txtr[0]->bitmap); break; } } } } void RenderOld(object3d *obj, int shadenum, unsigned short *vram) { int i, j; int vx0, vy0, vx1, vy1, n; int tu, tv, s; int texshr = 2; switch (RenderMode) { case POINTS: for (i=obj->npts-1; i>=0; i--) if (spts[i].x>=0 && spts[i].x=0 && spts[i].ynlns-1; i>=0; i--) drawline(obj->line[i], vram); break; case FLAT: rotate3d_normals(obj); CalcPolyColor(obj); zsort (zdata, obj); quicksort(0, obj->npls - 1, zdata); for (i=0; inpls; i++) { j = swp[i]; vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; n = vx0 * vy1 - vx1 * vy0; if (n<0) { obj->poly[j].c = spls[j].c; DrawFlatTriangle(obj->poly[j], vram, shades[shadenum]); } } break; case (FLAT | ZBUFFER): rotate3d_normals(obj); CalcPolyColor(obj); //ClearZbuffer(); memset(zbuffer, 0xFFFFFF, sizeof(unsigned int) * SSIZE); for (i=obj->npls-1; i>=0; i--) { obj->poly[i].c = spls[i].c; if (norms[i].z>=0) DrawFlatTriangleZB(obj->poly[i], vram, shades[shadenum]); } break; case GOURAUD: rotate3d_pt_normals(obj); CalcPointColor(obj); zsort (zdata, obj); quicksort(0, obj->npls - 1, zdata); for (i=0; inpls; i++) { j = swp[i]; vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; n = vx0 * vy1 - vx1 * vy0; if (n<0) DrawGouraudTriangle(obj->poly[j], vram, shades[shadenum]); } break; case (GOURAUD | ZBUFFER): rotate3d_normals(obj); rotate3d_pt_normals(obj); CalcPointColor(obj); //ClearZbuffer(); memset(zbuffer, 0xFFFFFF, sizeof(unsigned int) * SSIZE); for (i=obj->npls-1; i>=0; i--) { if (norms[i].z>=0) DrawGouraudTriangleZB(obj->poly[i], vram, shades[shadenum]); } break; case (TEXTURE): zsort (zdata, obj); quicksort(0, obj->npls - 1, zdata); for (i=0; inpls; i++) { j = swp[i]; vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; n = vx0 * vy1 - vx1 * vy0; if (n<0) { DrawTextureTriangle(obj->poly[j], vram, texshr, env1); } } break; case (TEXTURE | ZBUFFER): rotate3d_normals(obj); //ClearZbuffer(); memset(zbuffer, 0xFFFFFF, sizeof(unsigned int) * SSIZE); for (i=obj->npls-1; i>=0; i--) { if (norms[i].z>=0) DrawTextureTriangleZB(obj->poly[i], vram, 0, env1); } break; case (ENVMAP): rotate3d_pt_normals(obj); zsort (zdata, obj); quicksort(0, obj->npls - 1, zdata); for (i=0; inpts; i++) { tu = (pt_norms[i].x>>9) + 127; tv = (pt_norms[i].y>>9) + 127; point_tc[i].u = abs(tu) & 255; point_tc[i].v = abs(tv) & 255; } for (i=0; inpls; i++) { j = swp[i]; vx0 = spts[obj->poly[j].p0].x - spts[obj->poly[j].p1].x; vy0 = spts[obj->poly[j].p0].y - spts[obj->poly[j].p1].y; vx1 = spts[obj->poly[j].p2].x - spts[obj->poly[j].p1].x; vy1 = spts[obj->poly[j].p2].y - spts[obj->poly[j].p1].y; n = vx0 * vy1 - vx1 * vy0; // if (n<0) DrawEnvmappedTriangle(obj->poly[j], vram, texshr, env1); } break; case (ENVMAP | ZBUFFER): rotate3d_normals(obj); rotate3d_pt_normals(obj); //ClearZbuffer(); memset(zbuffer, 0xFFFFFF, sizeof(unsigned int) * SSIZE); for (i=obj->npts-1; i>=0; i--) { tu = (pt_norms[i].x>>9) + 127; tv = (pt_norms[i].y>>9) + 127; point_tc[i].u = abs(tu) & 255; point_tc[i].v = abs(tv) & 255; } for (i=obj->npls-1; i>=0; i--) { if (norms[i].z>=0) DrawEnvmappedTriangleZB(obj->poly[i], vram, 2, env1); } break; case VBALLS: for (i=obj->npts-1; i>=0; i--) { swp[i] = i; zdata[i] = -fpts[i].z; } quicksort(0, obj->npts - 1, zdata); for (i=obj->npts-1; i>=0; i--) drawball(spts[swp[i]], vram); break; default: break; } }