class vector2d { int x,y,z,u,v; } vector2d h,t; // a is topmost // b is left // c is right void tophalf_texturemapper(vector2d a, vector2d b, vector2d c) { if (c.x < b.x) { t = c; c = b; b = t; } int lx = a.x*256; int rx = a.x*256; int lxi = (b.x-a.x) * 256 / (b.y - a.y); int rxi = (c.x-a.x) * 256 / (b.y - a.y); int lu = a.u*256; int ru = a.u*256; int lui = (b.u-a.u) * 256 / (b.y - a.y); int rui = (c.u-a.u) * 256 / (b.y - a.y); int lv = a.v*256; int rv = a.v*256; int lvi = (b.v-a.v) * 256 / (b.y - a.y); int rvi = (c.v-a.v) * 256 / (b.y - a.y); int lz = a.z*256; int rz = a.z*256; int lzi = (b.z-a.z) * 256 / (b.y - a.y); int rzi = (c.z-a.z) * 256 / (b.y - a.y); for (int i=a.y; i < b.y; i++) { int l = lx/256; int r = rx/256; if (r-l != 0) { int cu = lu; int cv = lv; int cz = lz; int cui = (ru-lu) / (r - l); int cvi = (rv-lv) / (r - l); int czi = (rz-lz) / (r - l); for (int j=l; j <= r; j++) { if (cz/256 < zbuffer[j + i * 320]) { zbuffer[j + i * 320] = cz/256; pixels[j + i * 320] = texture.pixels[((cu/256)&(texture.width-1))+((cv/256)&(texture.height-1))*texture.width]; } cu += cui; cv += cvi; cz += czi; } } lx += lxi; rx += rxi; lu += lui; ru += rui; lv += lvi; rv += rvi; lz += lzi; rz += rzi; } } // a is topmost // b is right // c is left void bottomhalf_texturemapper(vector2d a, vector2d b, vector2d c) { if (c.x > b.x) { t = c; c = b; b = t; } int rx = b.x*256; int lx = c.x*256; int rxi = (a.x-b.x) * 256 / (a.y - b.y); int lxi = (a.x-c.x) * 256 / (a.y - b.y); int ru = b.u*256; int lu = c.u*256; int rui = (a.u-b.u) * 256 / (a.y - b.y); int lui = (a.u-c.u) * 256 / (a.y - b.y); int rv = b.v*256; int lv = c.v*256; int rvi = (a.v-b.v) * 256 / (a.y - b.y); int lvi = (a.v-c.v) * 256 / (a.y - b.y); int rz = b.z*256; int lz = c.z*256; int rzi = (a.z-b.z) * 256 / (a.y - b.y); int lzi = (a.z-c.z) * 256 / (a.y - b.y); for (int i=b.y; i < a.y; i++) { int l = lx/256; int r = rx/256; if (r-l != 0) { int cu = lu; int cv = lv; int cz = lz; int cui = (ru-lu) / (r - l); int cvi = (rv-lv) / (r - l); int czi = (rz-lz) / (r - l); for (int j=l; j <= r; j++) { if (cz/256 < zbuffer[j + i * 320]) { zbuffer[j + i * 320] = cz/256; pixels[j + i * 320] = texture.pixels[((cu/256)&(texture.width-1))+((cv/256)&(texture.height-1))*texture.width]; } cu += cui; cv += cvi; cz += czi; } } lx += lxi; rx += rxi; lu += lui; ru += rui; lv += lvi; rv += rvi; lz += lzi; rz += rzi; } } void texturemapper(vector2d a, vector2d b, vector2d c) { if (c.y < a.y) { t = c; c = a; a = t; } if (c.y < b.y) { t = c; c = b; b = t; } if (b.y < a.y) { t = b; b = a; a = t; } if (c.y==a.y) return; if (a.y != b.y && b.y != c.y) { int hr = (b.y-a.y) * 256 / (c.y-a.y); h = new vector2d(); h.x = ((c.x-a.x)*hr)/256 + a.x; h.y = b.y; h.u = ((c.u-a.u)*hr)/256 + a.u; h.v = ((c.v-a.v)*hr)/256 + a.v; h.z = ((c.z-a.z)*hr)/256 + a.z; tophalf_texturemapper(a,b,h); bottomhalf_texturemapper(c,h,b); return; } if (a.y == b.y) { bottomhalf_texturemapper(c,a,b); return; } if (c.y == b.y) { tophalf_texturemapper(a,b,c); return; } }