|
@@ -339,6 +339,8 @@ OLIVECDEF void olivec_frame(Olivec_Canvas oc, int x, int y, int w, int h, size_t
|
|
|
OLIVECDEF void olivec_circle(Olivec_Canvas oc, int cx, int cy, int r, uint32_t color);
|
|
|
// TODO: lines with different thiccness
|
|
|
OLIVECDEF void olivec_line(Olivec_Canvas oc, int x1, int y1, int x2, int y2, uint32_t color);
|
|
|
+OLIVECDEF bool olivec_normalize_triangle(size_t width, size_t height, int x1, int y1, int x2, int y2, int x3, int y3, int *lx, int *hx, int *ly, int *hy);
|
|
|
+OLIVECDEF void olivec_barycentric(int x1, int y1, int x2, int y2, int x3, int y3, int xp, int yp, int *u1, int *u2, int *det);
|
|
|
OLIVECDEF void olivec_triangle(Olivec_Canvas oc, int x1, int y1, int x2, int y2, int x3, int y3, uint32_t color);
|
|
|
OLIVECDEF void olivec_triangle3c(Olivec_Canvas oc, int x1, int y1, int x2, int y2, int x3, int y3, uint32_t c1, uint32_t c2, uint32_t c3);
|
|
|
OLIVECDEF void olivec_triangle3z(Olivec_Canvas oc, int x1, int y1, int x2, int y2, int x3, int y3, float z1, float z2, float z3);
|
|
@@ -618,14 +620,12 @@ OLIVECDEF uint32_t mix_colors3(uint32_t c1, uint32_t c2, uint32_t c3, int u1, in
|
|
|
}
|
|
|
|
|
|
// NOTE: we imply u3 = det - u1 - u2
|
|
|
-OLIVECDEF void barycentric(int x1, int y1, int x2, int y2, int x3, int y3,
|
|
|
- int xp, int yp,
|
|
|
- int *u1, int *u2, int *det)
|
|
|
+OLIVECDEF void olivec_barycentric(int x1, int y1, int x2, int y2, int x3, int y3, int xp, int yp, int *u1, int *u2, int *det)
|
|
|
{
|
|
|
*det = ((x1 - x3)*(y2 - y3) - (x2 - x3)*(y1 - y3));
|
|
|
*u1 = ((y2 - y3)*(xp - x3) + (x3 - x2)*(yp - y3));
|
|
|
*u2 = ((y3 - y1)*(xp - x3) + (x1 - x3)*(yp - y3));
|
|
|
- // u3 = det - u1 - u2
|
|
|
+
|
|
|
}
|
|
|
|
|
|
OLIVECDEF bool olivec_normalize_triangle(size_t width, size_t height, int x1, int y1, int x2, int y2, int x3, int y3, int *lx, int *hx, int *ly, int *hy)
|
|
@@ -663,7 +663,7 @@ OLIVECDEF void olivec_triangle3c(Olivec_Canvas oc, int x1, int y1, int x2, int y
|
|
|
for (int y = ly; y <= hy; ++y) {
|
|
|
for (int x = lx; x <= hx; ++x) {
|
|
|
int u1, u2, det;
|
|
|
- barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
+ olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
int u3 = det - u1 - u2;
|
|
|
if (
|
|
|
(OLIVEC_SIGN(int, u1) == OLIVEC_SIGN(int, det) || u1 == 0) &&
|
|
@@ -711,7 +711,7 @@ OLIVECDEF void olivec_triangle3z(Olivec_Canvas oc, int x1, int y1, int x2, int y
|
|
|
for (int x = s1; x <= s2; ++x) {
|
|
|
if (0 <= x && (size_t) x < oc.width) {
|
|
|
int u1, u2, det;
|
|
|
- barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
+ olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
float z = z1*u1/det + z2*u2/det + z3*(det - u1 - u2)/det;
|
|
|
OLIVEC_PIXEL(oc, x, y) = *(uint32_t*)&z;
|
|
|
}
|
|
@@ -732,7 +732,7 @@ OLIVECDEF void olivec_triangle3z(Olivec_Canvas oc, int x1, int y1, int x2, int y
|
|
|
for (int x = s1; x <= s2; ++x) {
|
|
|
if (0 <= x && (size_t) x < oc.width) {
|
|
|
int u1, u2, det;
|
|
|
- barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
+ olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
float z = z1*u1/det + z2*u2/det + z3*(det - u1 - u2)/det;
|
|
|
OLIVEC_PIXEL(oc, x, y) = *(uint32_t*)&z;
|
|
|
}
|
|
@@ -778,7 +778,7 @@ OLIVECDEF void olivec_triangle3uv(Olivec_Canvas oc, int x1, int y1, int x2, int
|
|
|
for (int x = s1; x <= s2; ++x) {
|
|
|
if (0 <= x && (size_t) x < oc.width) {
|
|
|
int u1, u2, det;
|
|
|
- barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
+ olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
int u3 = det - u1 - u2;
|
|
|
float z = z1*u1/det + z2*u2/det + z3*(det - u1 - u2)/det;
|
|
|
Uv uv = olivec_uv(
|
|
@@ -810,7 +810,7 @@ OLIVECDEF void olivec_triangle3uv(Olivec_Canvas oc, int x1, int y1, int x2, int
|
|
|
for (int x = s1; x <= s2; ++x) {
|
|
|
if (0 <= x && (size_t) x < oc.width) {
|
|
|
int u1, u2, det;
|
|
|
- barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
+ olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
int u3 = det - u1 - u2;
|
|
|
float z = z1*u1/det + z2*u2/det + z3*(det - u1 - u2)/det;
|
|
|
Uv uv = olivec_uv(
|
|
@@ -838,7 +838,7 @@ OLIVECDEF void olivec_triangle(Olivec_Canvas oc, int x1, int y1, int x2, int y2,
|
|
|
for (int y = ly; y <= hy; ++y) {
|
|
|
for (int x = lx; x <= hx; ++x) {
|
|
|
int u1, u2, det;
|
|
|
- barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
+ olivec_barycentric(x1, y1, x2, y2, x3, y3, x, y, &u1, &u2, &det);
|
|
|
int u3 = det - u1 - u2;
|
|
|
if (
|
|
|
(OLIVEC_SIGN(int, u1) == OLIVEC_SIGN(int, det) || u1 == 0) &&
|