|
|
@@ -164,7 +164,12 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, |
|
|
|
float u2, float v2, |
|
|
|
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; |
|
|
|
int tw, th, x, y, s; |
|
|
|
|
|
|
|
#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); |
|
|
|
|
|
|
|
/* 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 */ |
|
|
|
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; |
|
|
|
u2 *= (float)tw; |
|
|
@@ -223,35 +210,35 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, |
|
|
|
v2 *= (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 */ |
|
|
|
/* (in this case, we don't need the value anyway) */ |
|
|
|
/* 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 */ |
|
|
|
for (y = y1; y < y2; y++) |
|
|
|
{ |
|
|
|
float tus, tvs; |
|
|
|
|
|
|
|
if (xb < xa) |
|
|
|
{ |
|
|
@@ -264,19 +251,20 @@ static int caca_fill_triangle_textured_l(caca_canvas_t * cv, |
|
|
|
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; |
|
|
|
u = ua; |
|
|
|
|
|
|
|
/* scanline */ |
|
|
|
for (x = xa; x < xb; x++) |
|
|
|
{ |
|
|
|
uint32_t attr, c; |
|
|
|
u += tus; |
|
|
|
v += tvs; |
|
|
|
/* 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_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++) |
|
|
|
{ |
|
|
|
float tus, tvs; |
|
|
|
|
|
|
|
if (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); |
|
|
|
} |
|
|
|
|
|
|
|
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; |
|
|
|
v = va; |
|
|
|
|
|
|
|
/* scanline */ |
|
|
|
for (x = xa; x < xb; x++) |
|
|
|
{ |
|
|
|
uint32_t attr, c; |
|
|
|
u += tus; |
|
|
|
v += tvs; |
|
|
|
/* 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_put_char(cv, x, y, c); |
|
|
|
} |
|
|
|