| @@ -164,7 +164,12 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, | |||||
| float u2, float v2, | float u2, float v2, | ||||
| float u3, float v3) | float u3, float v3) | ||||
| { | { | ||||
| float y2y1, y3y1, y3y2; | |||||
| float sl12, sl13, sl23; | |||||
| float usl12, usl13, usl23, vsl12, vsl13, vsl23; | |||||
| float xa, xb, ua, va, ub, vb, u, v; | |||||
| uint32_t savedattr; | uint32_t savedattr; | ||||
| int tw, th, x, y, s; | |||||
| #define SWAP_F(a, b) {float c = a; a = b; b = c; } | #define SWAP_F(a, b) {float c = a; a = b; b = c; } | ||||
| @@ -187,34 +192,16 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, | |||||
| savedattr = caca_get_attr(cv, -1, -1); | savedattr = caca_get_attr(cv, -1, -1); | ||||
| /* Clip texture coordinates */ | /* Clip texture coordinates */ | ||||
| if (u1 < 0.0f) | |||||
| u1 = 0.0f; | |||||
| if (v1 < 0.0f) | |||||
| v1 = 0.0f; | |||||
| if (u2 < 0.0f) | |||||
| u2 = 0.0f; | |||||
| if (v2 < 0.0f) | |||||
| v2 = 0.0f; | |||||
| if (u3 < 0.0f) | |||||
| u3 = 0.0f; | |||||
| if (v3 < 0.0f) | |||||
| v3 = 0.0f; | |||||
| if (u1 > 1.0f) | |||||
| u1 = 1.0f; | |||||
| if (v1 > 1.0f) | |||||
| v1 = 1.0f; | |||||
| if (u2 > 1.0f) | |||||
| u2 = 1.0f; | |||||
| if (v2 > 1.0f) | |||||
| v2 = 1.0f; | |||||
| if (u3 > 1.0f) | |||||
| u3 = 1.0f; | |||||
| if (v3 > 1.0f) | |||||
| v3 = 1.0f; | |||||
| if (u1 < 0.0f) u1 = 0.0f; else if (u1 > 1.0f) u1 = 1.0f; | |||||
| if (u2 < 0.0f) u2 = 0.0f; else if (u2 > 1.0f) u2 = 1.0f; | |||||
| if (u3 < 0.0f) u3 = 0.0f; else if (u3 > 1.0f) u3 = 1.0f; | |||||
| if (v1 < 0.0f) v1 = 0.0f; else if (v1 > 1.0f) v1 = 1.0f; | |||||
| if (v2 < 0.0f) v2 = 0.0f; else if (v2 > 1.0f) v2 = 1.0f; | |||||
| if (v3 < 0.0f) v3 = 0.0f; else if (v3 > 1.0f) v3 = 1.0f; | |||||
| /* Convert relative tex coordinates to absolute */ | /* Convert relative tex coordinates to absolute */ | ||||
| int tw = caca_get_canvas_width(tex); | |||||
| int th = caca_get_canvas_height(tex); | |||||
| tw = caca_get_canvas_width(tex); | |||||
| th = caca_get_canvas_height(tex); | |||||
| u1 *= (float)tw; | u1 *= (float)tw; | ||||
| u2 *= (float)tw; | u2 *= (float)tw; | ||||
| @@ -223,35 +210,35 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, | |||||
| v2 *= (float)th; | v2 *= (float)th; | ||||
| v3 *= (float)th; | v3 *= (float)th; | ||||
| int x, y; | |||||
| float y2y1 = y2 - y1; | |||||
| float y3y1 = y3 - y1; | |||||
| float y3y2 = y3 - y2; | |||||
| y2y1 = (float)(y2 - y1); | |||||
| y3y1 = (float)(y3 - y1); | |||||
| y3y2 = (float)(y3 - y2); | |||||
| /* Compute slopes, making sure we don't divide by zero */ | /* Compute slopes, making sure we don't divide by zero */ | ||||
| /* (in this case, we don't need the value anyway) */ | /* (in this case, we don't need the value anyway) */ | ||||
| /* FIXME : only compute needed slopes */ | /* FIXME : only compute needed slopes */ | ||||
| float sl12 = ((float)x2 - x1) / (y2y1 == 0 ? 1 : y2y1); | |||||
| float sl13 = ((float)x3 - x1) / (y3y1 == 0 ? 1 : y3y1); | |||||
| float sl23 = ((float)x3 - x2) / (y3y2 == 0 ? 1 : y3y2); | |||||
| sl12 = ((float)x2 - x1) / (y2y1 == 0 ? 1 : y2y1); | |||||
| sl13 = ((float)x3 - x1) / (y3y1 == 0 ? 1 : y3y1); | |||||
| sl23 = ((float)x3 - x2) / (y3y2 == 0 ? 1 : y3y2); | |||||
| float usl12 = (u2 - u1) / (y2y1 == 0 ? 1 : y2y1); | |||||
| float usl13 = (u3 - u1) / (y3y1 == 0 ? 1 : y3y1); | |||||
| float usl23 = (u3 - u2) / (y3y2 == 0 ? 1 : y3y2); | |||||
| float vsl12 = (v2 - v1) / (y2y1 == 0 ? 1 : y2y1); | |||||
| float vsl13 = (v3 - v1) / (y3y1 == 0 ? 1 : y3y1); | |||||
| float vsl23 = (v3 - v2) / (y3y2 == 0 ? 1 : y3y2); | |||||
| usl12 = (u2 - u1) / (y2y1 == 0 ? 1 : y2y1); | |||||
| usl13 = (u3 - u1) / (y3y1 == 0 ? 1 : y3y1); | |||||
| usl23 = (u3 - u2) / (y3y2 == 0 ? 1 : y3y2); | |||||
| vsl12 = (v2 - v1) / (y2y1 == 0 ? 1 : y2y1); | |||||
| vsl13 = (v3 - v1) / (y3y1 == 0 ? 1 : y3y1); | |||||
| vsl23 = (v3 - v2) / (y3y2 == 0 ? 1 : y3y2); | |||||
| float xa = (float)x1, xb = (float)x1; | |||||
| float ua = u1, ub = u1; | |||||
| float va = v1, vb = v1; | |||||
| float u, v; | |||||
| xa = (float)x1; | |||||
| xb = (float)x1; | |||||
| ua = u1; ub = u1; | |||||
| va = v1; vb = v1; | |||||
| int s = 0; | |||||
| s = 0; | |||||
| /* Top */ | /* Top */ | ||||
| for (y = y1; y < y2; y++) | for (y = y1; y < y2; y++) | ||||
| { | { | ||||
| float tus, tvs; | |||||
| if (xb < xa) | if (xb < xa) | ||||
| { | { | ||||
| @@ -264,19 +251,20 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, | |||||
| s = 1; | s = 1; | ||||
| } | } | ||||
| float tus = (ub - ua) / (xb - xa); | |||||
| float tvs = (vb - va) / (xb - xa); | |||||
| tus = (ub - ua) / (xb - xa); | |||||
| tvs = (vb - va) / (xb - xa); | |||||
| v = va; | v = va; | ||||
| u = ua; | u = ua; | ||||
| /* scanline */ | /* scanline */ | ||||
| for (x = xa; x < xb; x++) | for (x = xa; x < xb; x++) | ||||
| { | { | ||||
| uint32_t attr, c; | |||||
| u += tus; | u += tus; | ||||
| v += tvs; | v += tvs; | ||||
| /* FIXME: use caca_get_canvas_attrs / caca_get_canvas_chars */ | /* FIXME: use caca_get_canvas_attrs / caca_get_canvas_chars */ | ||||
| uint32_t attr = caca_get_attr(tex, u, v); | |||||
| uint32_t c = caca_get_char(tex, u, v); | |||||
| attr = caca_get_attr(tex, u, v); | |||||
| c = caca_get_char(tex, u, v); | |||||
| caca_set_attr(cv, attr); | caca_set_attr(cv, attr); | ||||
| caca_put_char(cv, x, y, c); | caca_put_char(cv, x, y, c); | ||||
| } | } | ||||
| @@ -316,6 +304,8 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, | |||||
| for (y = y2; y < y3; y++) | for (y = y2; y < y3; y++) | ||||
| { | { | ||||
| float tus, tvs; | |||||
| if (xb <= xa) | if (xb <= xa) | ||||
| { | { | ||||
| SWAP_F(xb, xa); | SWAP_F(xb, xa); | ||||
| @@ -326,19 +316,20 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, | |||||
| SWAP_F(vsl13, vsl23); | SWAP_F(vsl13, vsl23); | ||||
| } | } | ||||
| float tus = (ub - ua) / ((float)xb - xa); | |||||
| float tvs = (vb - va) / ((float)xb - xa); | |||||
| tus = (ub - ua) / ((float)xb - xa); | |||||
| tvs = (vb - va) / ((float)xb - xa); | |||||
| u = ua; | u = ua; | ||||
| v = va; | v = va; | ||||
| /* scanline */ | /* scanline */ | ||||
| for (x = xa; x < xb; x++) | for (x = xa; x < xb; x++) | ||||
| { | { | ||||
| uint32_t attr, c; | |||||
| u += tus; | u += tus; | ||||
| v += tvs; | v += tvs; | ||||
| /* FIXME, can be heavily optimised */ | /* FIXME, can be heavily optimised */ | ||||
| uint32_t attr = caca_get_attr(tex, u, v); | |||||
| uint32_t c = caca_get_char(tex, u, v); | |||||
| attr = caca_get_attr(tex, u, v); | |||||
| c = caca_get_char(tex, u, v); | |||||
| caca_set_attr(cv, attr); | caca_set_attr(cv, attr); | ||||
| caca_put_char(cv, x, y, c); | caca_put_char(cv, x, y, c); | ||||
| } | } | ||||