class vertex { int x,y,u,v; } vertex a,b,c,d,h,t; void setup() { size(320,240); a = new vertex(); b = new vertex(); c = new vertex(); d = new vertex(); h = new vertex(); t = new vertex(); } // a is topmost // b is left // c is right void tophalf_texturemapper(vertex a, vertex b, vertex 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); 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 cui = (ru-lu) / (r - l); int cvi = (rv-lv) / (r - l); for (int j=l; j <= r; j++) { int cc = (cu/256)|(cv/256); pixels[j + i * 320] = color(cc,0,cc); cu += cui; cv += cvi; } } lx += lxi; rx += rxi; lu += lui; ru += rui; lv += lvi; rv += rvi; } } // a is topmost // b is right // c is left void bottomhalf_texturemapper(vertex a, vertex b, vertex 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); 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 ll = l < r ? l : r; int lr = l > r ? l : r; int cui = (ru-lu) / (lr - ll); int cvi = (rv-lv) / (lr - ll); for (int j=ll; j <= lr; j++) { int cc = (cu/256)|(cv/256); pixels[j + i * 320] = color(cc,0,cc); cu += cui; cv += cvi; } } lx += lxi; rx += rxi; lu += lui; ru += rui; lv += lvi; rv += rvi; } } void texturemapper(vertex a, vertex b, vertex 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.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; 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; } } int phases = 32; float baseradius = 80; float pi2 = PI * 2; void draw() { background(0); loadPixels(); c.x = 160; c.y = 120; c.u = 127; c.v = 127; float m = millis(); float rot = m/1000.0f; for (int i=0; i