impl line scissor clipping
This commit is contained in:
parent
3441cf6327
commit
f0b02b8cad
26
src/external/rlsw.h
vendored
26
src/external/rlsw.h
vendored
|
|
@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user