fix line shaking issue
This commit is contained in:
parent
4928008e6d
commit
5791f537c4
53
src/external/rlsw.h
vendored
53
src/external/rlsw.h
vendored
|
|
@ -1116,7 +1116,14 @@ static inline void sw_matrix_mul(sw_matrix_t dst, const sw_matrix_t left, const
|
||||||
for (int i = 0; i < 16; i++) dst[i] = result[i];
|
for (int i = 0; i < 16; i++) dst[i] = result[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int sw_clampi(int v, int min, int max)
|
static inline int sw_clamp_int(int v, int min, int max)
|
||||||
|
{
|
||||||
|
if (v < min) return min;
|
||||||
|
if (v > max) return max;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int sw_clamp(float v, float min, float max)
|
||||||
{
|
{
|
||||||
if (v < min) return min;
|
if (v < min) return min;
|
||||||
if (v > max) return max;
|
if (v > max) return max;
|
||||||
|
|
@ -2655,10 +2662,10 @@ static inline void sw_framebuffer_fill_color(sw_texture_t *colorBuffer, const fl
|
||||||
|
|
||||||
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST)
|
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST)
|
||||||
{
|
{
|
||||||
int xMin = sw_clampi(RLSW.scMin[0], 0, colorBuffer->width - 1);
|
int xMin = sw_clamp_int(RLSW.scMin[0], 0, colorBuffer->width - 1);
|
||||||
int xMax = sw_clampi(RLSW.scMax[0], 0, colorBuffer->width - 1);
|
int xMax = sw_clamp_int(RLSW.scMax[0], 0, colorBuffer->width - 1);
|
||||||
int yMin = sw_clampi(RLSW.scMin[1], 0, colorBuffer->height - 1);
|
int yMin = sw_clamp_int(RLSW.scMin[1], 0, colorBuffer->height - 1);
|
||||||
int yMax = sw_clampi(RLSW.scMax[1], 0, colorBuffer->height - 1);
|
int yMax = sw_clamp_int(RLSW.scMax[1], 0, colorBuffer->height - 1);
|
||||||
|
|
||||||
int w = xMax - xMin;
|
int w = xMax - xMin;
|
||||||
for (int y = yMin; y <= yMax; y++)
|
for (int y = yMin; y <= yMax; y++)
|
||||||
|
|
@ -2692,10 +2699,10 @@ static inline void sw_framebuffer_fill_depth(sw_texture_t *depthBuffer, float de
|
||||||
|
|
||||||
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST)
|
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST)
|
||||||
{
|
{
|
||||||
int xMin = sw_clampi(RLSW.scMin[0], 0, depthBuffer->width - 1);
|
int xMin = sw_clamp_int(RLSW.scMin[0], 0, depthBuffer->width - 1);
|
||||||
int xMax = sw_clampi(RLSW.scMax[0], 0, depthBuffer->width - 1);
|
int xMax = sw_clamp_int(RLSW.scMax[0], 0, depthBuffer->width - 1);
|
||||||
int yMin = sw_clampi(RLSW.scMin[1], 0, depthBuffer->height - 1);
|
int yMin = sw_clamp_int(RLSW.scMin[1], 0, depthBuffer->height - 1);
|
||||||
int yMax = sw_clampi(RLSW.scMax[1], 0, depthBuffer->height - 1);
|
int yMax = sw_clamp_int(RLSW.scMax[1], 0, depthBuffer->height - 1);
|
||||||
|
|
||||||
int w = xMax - xMin;
|
int w = xMax - xMin;
|
||||||
for (int y = yMin; y <= yMax; y++)
|
for (int y = yMin; y <= yMax; y++)
|
||||||
|
|
@ -3740,6 +3747,13 @@ static bool sw_line_clip_and_project(sw_vertex_t *v0, sw_vertex_t *v1)
|
||||||
sw_project_ndc_to_screen(v0->screen, v0->homogeneous);
|
sw_project_ndc_to_screen(v0->screen, v0->homogeneous);
|
||||||
sw_project_ndc_to_screen(v1->screen, v1->homogeneous);
|
sw_project_ndc_to_screen(v1->screen, v1->homogeneous);
|
||||||
|
|
||||||
|
// NDC +1.0 projects to exactly (width + 0.5f), which truncates out of bounds
|
||||||
|
// The clamp is at most 0.5px on a boundary endpoint, it's visually imperceptible
|
||||||
|
v0->screen[0] = sw_clamp(v0->screen[0], 0.0f, (float)(RLSW.colorBuffer->width - 1) + 0.5f);
|
||||||
|
v0->screen[1] = sw_clamp(v0->screen[1], 0.0f, (float)(RLSW.colorBuffer->height - 1) + 0.5f);
|
||||||
|
v1->screen[0] = sw_clamp(v1->screen[0], 0.0f, (float)(RLSW.colorBuffer->width - 1) + 0.5f);
|
||||||
|
v1->screen[1] = sw_clamp(v1->screen[1], 0.0f, (float)(RLSW.colorBuffer->height - 1) + 0.5f);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3784,10 +3798,10 @@ static bool sw_point_clip_and_project(sw_vertex_t *v)
|
||||||
|
|
||||||
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST)
|
if (RLSW.stateFlags & SW_STATE_SCISSOR_TEST)
|
||||||
{
|
{
|
||||||
min[0] = sw_clampi(RLSW.scMin[0], 0, RLSW.colorBuffer->width);
|
min[0] = sw_clamp_int(RLSW.scMin[0], 0, RLSW.colorBuffer->width);
|
||||||
min[1] = sw_clampi(RLSW.scMin[1], 0, RLSW.colorBuffer->height);
|
min[1] = sw_clamp_int(RLSW.scMin[1], 0, RLSW.colorBuffer->height);
|
||||||
max[0] = sw_clampi(RLSW.scMax[0], 0, RLSW.colorBuffer->width);
|
max[0] = sw_clamp_int(RLSW.scMax[0], 0, RLSW.colorBuffer->width);
|
||||||
max[1] = sw_clampi(RLSW.scMax[1], 0, RLSW.colorBuffer->height);
|
max[1] = sw_clamp_int(RLSW.scMax[1], 0, RLSW.colorBuffer->height);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool insideX = (v->screen[0] - RLSW.pointRadius < max[0]) && (v->screen[0] + RLSW.pointRadius > min[0]);
|
bool insideX = (v->screen[0] - RLSW.pointRadius < max[0]) && (v->screen[0] + RLSW.pointRadius > min[0]);
|
||||||
|
|
@ -4011,8 +4025,8 @@ void swReadPixels(int x, int y, int w, int h, SWformat format, SWtype type, void
|
||||||
if (w > RLSW.colorBuffer->width) w = RLSW.colorBuffer->width;
|
if (w > RLSW.colorBuffer->width) w = RLSW.colorBuffer->width;
|
||||||
if (h > RLSW.colorBuffer->height) h = RLSW.colorBuffer->height;
|
if (h > RLSW.colorBuffer->height) h = RLSW.colorBuffer->height;
|
||||||
|
|
||||||
x = sw_clampi(x, 0, w);
|
x = sw_clamp_int(x, 0, w);
|
||||||
y = sw_clampi(y, 0, h);
|
y = sw_clamp_int(y, 0, h);
|
||||||
|
|
||||||
if ((x >= w) || (y >= h)) return;
|
if ((x >= w) || (y >= h)) return;
|
||||||
|
|
||||||
|
|
@ -4040,8 +4054,8 @@ void swBlitPixels(int xDst, int yDst, int wDst, int hDst, int xSrc, int ySrc, in
|
||||||
if (wSrc > RLSW.colorBuffer->width) wSrc = RLSW.colorBuffer->width;
|
if (wSrc > RLSW.colorBuffer->width) wSrc = RLSW.colorBuffer->width;
|
||||||
if (hSrc > RLSW.colorBuffer->height) hSrc = RLSW.colorBuffer->height;
|
if (hSrc > RLSW.colorBuffer->height) hSrc = RLSW.colorBuffer->height;
|
||||||
|
|
||||||
xSrc = sw_clampi(xSrc, 0, wSrc);
|
xSrc = sw_clamp_int(xSrc, 0, wSrc);
|
||||||
ySrc = sw_clampi(ySrc, 0, hSrc);
|
ySrc = sw_clamp_int(ySrc, 0, hSrc);
|
||||||
|
|
||||||
// Check if the sizes are identical after clamping the source to avoid unexpected issues
|
// Check if the sizes are identical after clamping the source to avoid unexpected issues
|
||||||
// TODO: REVIEW: This repeats the operations if true, so a copy function can be made without these checks
|
// TODO: REVIEW: This repeats the operations if true, so a copy function can be made without these checks
|
||||||
|
|
@ -5782,9 +5796,8 @@ static void SW_RASTER_LINE(const sw_vertex_t *v0, const sw_vertex_t *v1)
|
||||||
|
|
||||||
for (int i = 0; i < numPixels; i++)
|
for (int i = 0; i < numPixels; i++)
|
||||||
{
|
{
|
||||||
// TODO: REVIEW: May require reviewing projection details
|
int px = x;
|
||||||
int px = (int)(x - 0.5f);
|
int py = y;
|
||||||
int py = (int)(y - 0.5f);
|
|
||||||
|
|
||||||
int baseOffset = py*fbWidth + px;
|
int baseOffset = py*fbWidth + px;
|
||||||
uint8_t *cPtr = cPixels + baseOffset*SW_FRAMEBUFFER_COLOR_SIZE;
|
uint8_t *cPtr = cPixels + baseOffset*SW_FRAMEBUFFER_COLOR_SIZE;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user