impl line scissor clipping

This commit is contained in:
Bigfoot71 2025-03-22 15:18:41 +01:00
parent 3441cf6327
commit f0b02b8cad

26
src/external/rlsw.h vendored
View File

@ -1999,17 +1999,15 @@ static inline bool sw_line_clip_coord(float q, float p, float* t0, float* t1)
static inline bool sw_line_clip(sw_vertex_t* v0, sw_vertex_t* v1) static inline bool sw_line_clip(sw_vertex_t* v0, sw_vertex_t* v1)
{ {
// Uses Liang-Barsky algorithm float t0 = 0.0f, t1 = 1.0f;
float t0 = 0;
float t1 = 1;
float dH[4], dC[4]; float dH[4], dC[4];
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
dH[i] = v1->homogeneous[i] - v0->homogeneous[i]; dH[i] = v1->homogeneous[i] - v0->homogeneous[i];
dC[i] = v1->color[i] - v0->color[i]; dC[i] = v1->color[i] - v0->color[i];
} }
// Clipping Liang-Barsky
if (!sw_line_clip_coord(v0->homogeneous[3] - v0->homogeneous[0], -dH[3] + dH[0], &t0, &t1)) return false; if (!sw_line_clip_coord(v0->homogeneous[3] - v0->homogeneous[0], -dH[3] + dH[0], &t0, &t1)) return false;
if (!sw_line_clip_coord(v0->homogeneous[3] + v0->homogeneous[0], -dH[3] - dH[0], &t0, &t1)) return false; if (!sw_line_clip_coord(v0->homogeneous[3] + v0->homogeneous[0], -dH[3] - dH[0], &t0, &t1)) return false;
if (!sw_line_clip_coord(v0->homogeneous[3] - v0->homogeneous[1], -dH[3] + dH[1], &t0, &t1)) return false; if (!sw_line_clip_coord(v0->homogeneous[3] - v0->homogeneous[1], -dH[3] + dH[1], &t0, &t1)) return false;
@ -2017,17 +2015,25 @@ static inline bool sw_line_clip(sw_vertex_t* v0, sw_vertex_t* v1)
if (!sw_line_clip_coord(v0->homogeneous[3] - v0->homogeneous[2], -dH[3] + dH[2], &t0, &t1)) return false; if (!sw_line_clip_coord(v0->homogeneous[3] - v0->homogeneous[2], -dH[3] + dH[2], &t0, &t1)) return false;
if (!sw_line_clip_coord(v0->homogeneous[3] + v0->homogeneous[2], -dH[3] - dH[2], &t0, &t1)) return false; if (!sw_line_clip_coord(v0->homogeneous[3] + v0->homogeneous[2], -dH[3] - dH[2], &t0, &t1)) return false;
if (t1 < 1) { // Clipping Scissor
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST) {
if (!sw_line_clip_coord(v0->homogeneous[0] - RLSW.scHMin[0] * v0->homogeneous[3], RLSW.scHMin[0] * dH[3] - dH[0], &t0, &t1)) return false;
if (!sw_line_clip_coord(RLSW.scHMax[0] * v0->homogeneous[3] - v0->homogeneous[0], dH[0] - RLSW.scHMax[0] * dH[3], &t0, &t1)) return false;
if (!sw_line_clip_coord(v0->homogeneous[1] - RLSW.scHMin[1] * v0->homogeneous[3], RLSW.scHMin[1] * dH[3] - dH[1], &t0, &t1)) return false;
if (!sw_line_clip_coord(RLSW.scHMax[1] * v0->homogeneous[3] - v0->homogeneous[1], dH[1] - RLSW.scHMax[1] * dH[3], &t0, &t1)) return false;
}
// Interpolation of new coordinates
if (t1 < 1.0f) {
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
v1->homogeneous[i] = v0->homogeneous[i] + t1 * dH[i]; v1->homogeneous[i] = v0->homogeneous[i] + t1 * dH[i];
v1->color[i] = v0->color[i] + t1 * dC[i]; v1->color[i] = v0->color[i] + t1 * dC[i];
} }
} }
if (t0 > 0.0f) {
if (t0 > 0) {
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
v0->homogeneous[i] = v0->homogeneous[i] + t0 * dH[i]; v0->homogeneous[i] += t0 * dH[i];
v0->color[i] = v0->color[i] + t0 * dC[i]; v0->color[i] += t0 * dC[i];
} }
} }