tr2/render/swr: fix skybox not clearing previous frame

Resolves #2343.
This commit is contained in:
Marcin Kurczewski 2025-01-21 00:12:22 +01:00
parent e14e1f352f
commit 0ca2809abf
2 changed files with 160 additions and 213 deletions

View file

@ -32,6 +32,7 @@
- fixed wireframe mode discarding transparent pixels (#2315, regression from 0.7) - fixed wireframe mode discarding transparent pixels (#2315, regression from 0.7)
- fixed sprite pickups not being paused in the pause/inventory screen (#2319, regression from 0.6) - fixed sprite pickups not being paused in the pause/inventory screen (#2319, regression from 0.6)
- fixed Skidoo snow wake effects at slow speeds (#2324, regression from 0.6) - fixed Skidoo snow wake effects at slow speeds (#2324, regression from 0.6)
- fixed software renderer skybox occlusion issues (#2343, regression from 0.7)
## [0.8](https://github.com/LostArtefacts/TRX/compare/tr2-0.8...tr2-0.8) - 2025-01-01 ## [0.8](https://github.com/LostArtefacts/TRX/compare/tr2-0.8...tr2-0.8) - 2025-01-01
- completed decompilation efforts  TR2X.dll is gone, Tomb2.exe no longer needed (#1694) - completed decompilation efforts  TR2X.dll is gone, Tomb2.exe no longer needed (#1694)

View file

@ -108,35 +108,31 @@ static int32_t m_XGenY1 = 0;
static int32_t m_XGenY2 = 0; static int32_t m_XGenY2 = 0;
static void M_FlatA( static void M_FlatA(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, uint8_t color_idx); GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
int32_t y2, uint8_t color_idx);
static void M_TransA( static void M_TransA(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, uint8_t depth); GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
int32_t y2, uint8_t depth);
static void M_GourA( static void M_GourA(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, uint8_t color_idx); GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
int32_t y2, uint8_t color_idx);
static void M_GTMapA( static void M_GTMapA(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
const uint8_t *tex_page); int32_t y2, const uint8_t *tex_page);
static void M_WGTMapA( static void M_WGTMapA(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
const uint8_t *tex_page); int32_t y2, const uint8_t *tex_page);
static void M_GTMapPersp32FP( static void M_GTMapPersp32FP(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
const uint8_t *tex_page); int32_t y2, const uint8_t *tex_page);
static void M_WGTMapPersp32FP( static void M_WGTMapPersp32FP(
GFX_2D_SURFACE *target_surface, int32_t y1, int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface, int32_t y1,
const uint8_t *tex_page); int32_t y2, const uint8_t *tex_page);
static bool M_XGenX(const int16_t *obj_ptr); static bool M_XGenX(const int16_t *obj_ptr);
static bool M_XGenXG(const int16_t *obj_ptr); static bool M_XGenXG(const int16_t *obj_ptr);
static bool M_XGenXGUV(const int16_t *obj_ptr); static bool M_XGenXGUV(const int16_t *obj_ptr);
static void M_OccludeX(GFX_2D_SURFACE *alpha_surface, int32_t y1, int32_t y2);
static void M_OccludeXG(GFX_2D_SURFACE *alpha_surface, int32_t y1, int32_t y2);
static void M_OccludeXGUV(
GFX_2D_SURFACE *alpha_surface, int32_t y1, int32_t y2);
static void M_OccludeXGUVP(
GFX_2D_SURFACE *alpha_surface, int32_t y1, int32_t y2);
static void M_DrawPolyFlat( static void M_DrawPolyFlat(
const int16_t *obj_ptr, GFX_2D_SURFACE *target_surface, const int16_t *obj_ptr, GFX_2D_SURFACE *target_surface,
GFX_2D_SURFACE *alpha_surface); GFX_2D_SURFACE *alpha_surface);
@ -206,44 +202,50 @@ static void (*m_PolyDrawRoutines[])(
}; };
static void M_FlatA( static void M_FlatA(
GFX_2D_SURFACE *const target_surface, int32_t y1, int32_t y2, GFX_2D_SURFACE *const alpha_surface, GFX_2D_SURFACE *const target_surface,
const uint8_t color_idx) int32_t y1, int32_t y2, const uint8_t color_idx)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0) { if (y_size <= 0) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_X *xbuf = (const XBUF_X *)m_XBuffer + y1; const XBUF_X *xbuf = (const XBUF_X *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
while (y_size > 0) { while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE; const int32_t x = xbuf->x1 / PHD_ONE;
const int32_t x_size = (xbuf->x2 / PHD_ONE) - x; const int32_t x_size = (xbuf->x2 / PHD_ONE) - x;
if (x_size > 0) { if (x_size > 0) {
memset( memset(
draw_ptr + x, MAKE_PAL_IDX(color_idx), target_ptr + x, MAKE_PAL_IDX(color_idx),
x_size * sizeof(PIX_FMT)); x_size * sizeof(PIX_FMT));
memset(alpha_ptr + x, 255, x_size * sizeof(ALPHA_FMT));
} }
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
alpha_ptr += alpha_stride;
} }
} }
static void M_TransA( static void M_TransA(
GFX_2D_SURFACE *const target_surface, const int32_t y1, const int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *const target_surface,
const uint8_t depth) const int32_t y1, const int32_t y2, const uint8_t depth)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0 || depth >= LIGHT_MAP_SIZE) { if (y_size <= 0 || depth >= LIGHT_MAP_SIZE) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_X *xbuf = (const XBUF_X *)m_XBuffer + y1; const XBUF_X *xbuf = (const XBUF_X *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
const DEPTHQ_ENTRY *qt = g_DepthQTable + depth; const DEPTHQ_ENTRY *qt = g_DepthQTable + depth;
while (y_size > 0) { while (y_size > 0) {
@ -253,32 +255,37 @@ static void M_TransA(
goto loop_end; goto loop_end;
} }
PIX_FMT *line_ptr = draw_ptr + x; PIX_FMT *target_line_ptr = target_ptr + x;
ALPHA_FMT *alpha_line_ptr = alpha_ptr + x;
while (x_size > 0) { while (x_size > 0) {
*line_ptr = MAKE_PAL_IDX(qt->index[*line_ptr]); *target_line_ptr = MAKE_PAL_IDX(qt->index[*target_line_ptr]);
line_ptr++; target_line_ptr++;
*alpha_line_ptr++ = 255;
x_size--; x_size--;
} }
loop_end: loop_end:
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
alpha_ptr += alpha_stride;
} }
} }
static void M_GourA( static void M_GourA(
GFX_2D_SURFACE *const target_surface, const int32_t y1, const int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *const target_surface,
const uint8_t color_idx) const int32_t y1, const int32_t y2, const uint8_t color_idx)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0) { if (y_size <= 0) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_XG *xbuf = (const XBUF_XG *)m_XBuffer + y1; const XBUF_XG *xbuf = (const XBUF_XG *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
const GOURAUD_ENTRY *gt = g_GouraudTable + color_idx; const GOURAUD_ENTRY *gt = g_GouraudTable + color_idx;
while (y_size > 0) { while (y_size > 0) {
@ -291,10 +298,11 @@ static void M_GourA(
int32_t g = xbuf->g1; int32_t g = xbuf->g1;
const int32_t g_add = (xbuf->g2 - g) / x_size; const int32_t g_add = (xbuf->g2 - g) / x_size;
PIX_FMT *line_ptr = draw_ptr + x; PIX_FMT *target_line_ptr = target_ptr + x;
ALPHA_FMT *alpha_line_ptr = alpha_ptr + x;
while (x_size > 0) { while (x_size > 0) {
*line_ptr = MAKE_PAL_IDX(gt->index[MAKE_Q_ID(g)]); *target_line_ptr++ = MAKE_PAL_IDX(gt->index[MAKE_Q_ID(g)]);
line_ptr++; *alpha_line_ptr++ = 255;
g += g_add; g += g_add;
x_size--; x_size--;
} }
@ -302,22 +310,25 @@ static void M_GourA(
loop_end: loop_end:
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
alpha_ptr += alpha_stride;
} }
} }
static void M_GTMapA( static void M_GTMapA(
GFX_2D_SURFACE *const target_surface, const int32_t y1, const int32_t y2, GFX_2D_SURFACE *const alpha_surface, GFX_2D_SURFACE *const target_surface,
const uint8_t *const tex_page) const int32_t y1, const int32_t y2, const uint8_t *const tex_page)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0) { if (y_size <= 0) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_XGUV *xbuf = (const XBUF_XGUV *)m_XBuffer + y1; const XBUF_XGUV *xbuf = (const XBUF_XGUV *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
while (y_size > 0) { while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE; const int32_t x = xbuf->x1 / PHD_ONE;
@ -333,12 +344,13 @@ static void M_GTMapA(
const int32_t u_add = (xbuf->u2 - u) / x_size; const int32_t u_add = (xbuf->u2 - u) / x_size;
const int32_t v_add = (xbuf->v2 - v) / x_size; const int32_t v_add = (xbuf->v2 - v) / x_size;
PIX_FMT *line_ptr = draw_ptr + x; PIX_FMT *target_line_ptr = target_ptr + x;
ALPHA_FMT *alpha_line_ptr = alpha_ptr + x;
while (x_size > 0) { while (x_size > 0) {
uint8_t color_idx = tex_page[MAKE_TEX_ID(v, u)]; uint8_t color_idx = tex_page[MAKE_TEX_ID(v, u)];
*line_ptr = *target_line_ptr++ =
MAKE_PAL_IDX(g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]); MAKE_PAL_IDX(g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]);
line_ptr++; *alpha_line_ptr++ = 255;
g += g_add; g += g_add;
u += u_add; u += u_add;
v += v_add; v += v_add;
@ -348,22 +360,25 @@ static void M_GTMapA(
loop_end: loop_end:
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
alpha_ptr += alpha_stride;
} }
} }
static void M_WGTMapA( static void M_WGTMapA(
GFX_2D_SURFACE *target_surface, const int32_t y1, const int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *target_surface,
const uint8_t *tex_page) const int32_t y1, const int32_t y2, const uint8_t *tex_page)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0) { if (y_size <= 0) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_XGUV *xbuf = (const XBUF_XGUV *)m_XBuffer + y1; const XBUF_XGUV *xbuf = (const XBUF_XGUV *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
while (y_size > 0) { while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE; const int32_t x = xbuf->x1 / PHD_ONE;
@ -379,14 +394,17 @@ static void M_WGTMapA(
const int32_t u_add = (xbuf->u2 - u) / x_size; const int32_t u_add = (xbuf->u2 - u) / x_size;
const int32_t v_add = (xbuf->v2 - v) / x_size; const int32_t v_add = (xbuf->v2 - v) / x_size;
PIX_FMT *line_ptr = draw_ptr + x; PIX_FMT *target_line_ptr = target_ptr + x;
ALPHA_FMT *alpha_line_ptr = alpha_ptr + x;
while (x_size > 0) { while (x_size > 0) {
const uint8_t color_idx = tex_page[MAKE_TEX_ID(v, u)]; const uint8_t color_idx = tex_page[MAKE_TEX_ID(v, u)];
if (color_idx != 0) { if (color_idx != 0) {
*line_ptr = *target_line_ptr =
MAKE_PAL_IDX(g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]); MAKE_PAL_IDX(g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]);
*alpha_line_ptr = 255;
} }
line_ptr++; target_line_ptr++;
alpha_line_ptr++;
g += g_add; g += g_add;
u += u_add; u += u_add;
v += v_add; v += v_add;
@ -396,22 +414,25 @@ static void M_WGTMapA(
loop_end: loop_end:
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
alpha_ptr += alpha_stride;
} }
} }
static void M_GTMapPersp32FP( static void M_GTMapPersp32FP(
GFX_2D_SURFACE *const target_surface, const int32_t y1, const int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *const target_surface,
const uint8_t *const tex_page) const int32_t y1, const int32_t y2, const uint8_t *const tex_page)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0) { if (y_size <= 0) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_XGUVP *xbuf = (const XBUF_XGUVP *)m_XBuffer + y1; const XBUF_XGUVP *xbuf = (const XBUF_XGUVP *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
while (y_size > 0) { while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE; const int32_t x = xbuf->x1 / PHD_ONE;
@ -430,7 +451,8 @@ static void M_GTMapPersp32FP(
int32_t u0 = PHD_HALF * u / rhw; int32_t u0 = PHD_HALF * u / rhw;
int32_t v0 = PHD_HALF * v / rhw; int32_t v0 = PHD_HALF * v / rhw;
PIX_FMT *line_ptr = draw_ptr + x; PIX_FMT *target_line_ptr = target_ptr + x;
ALPHA_FMT *alpha_line_ptr = alpha_ptr + x;
int32_t batch_size = 32; int32_t batch_size = 32;
if (x_size >= batch_size) { if (x_size >= batch_size) {
@ -458,8 +480,10 @@ static void M_GTMapPersp32FP(
const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)]; const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)];
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr++ = MAKE_PAL_IDX(color); *target_line_ptr++ = MAKE_PAL_IDX(color);
*line_ptr++ = MAKE_PAL_IDX(color); *target_line_ptr++ = MAKE_PAL_IDX(color);
*alpha_line_ptr++ = 255;
*alpha_line_ptr++ = 255;
g += g_add * 2; g += g_add * 2;
u0 += u0_add * 2; u0 += u0_add * 2;
v0 += v0_add * 2; v0 += v0_add * 2;
@ -470,7 +494,8 @@ static void M_GTMapPersp32FP(
const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)]; const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)];
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr++ = MAKE_PAL_IDX(color); *target_line_ptr++ = MAKE_PAL_IDX(color);
*alpha_line_ptr++ = 255;
g += g_add; g += g_add;
u0 += u0_add; u0 += u0_add;
v0 += v0_add; v0 += v0_add;
@ -498,8 +523,10 @@ static void M_GTMapPersp32FP(
const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)]; const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)];
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr++ = MAKE_PAL_IDX(color); *target_line_ptr++ = MAKE_PAL_IDX(color);
*line_ptr++ = MAKE_PAL_IDX(color); *target_line_ptr++ = MAKE_PAL_IDX(color);
*alpha_line_ptr++ = 255;
*alpha_line_ptr++ = 255;
g += g_add * 2; g += g_add * 2;
u0 += u0_add * 2; u0 += u0_add * 2;
v0 += v0_add * 2; v0 += v0_add * 2;
@ -510,7 +537,8 @@ static void M_GTMapPersp32FP(
const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)]; const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)];
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr++ = MAKE_PAL_IDX(color); *target_line_ptr++ = MAKE_PAL_IDX(color);
*alpha_line_ptr++ = 255;
g += g_add; g += g_add;
u0 += u0_add; u0 += u0_add;
v0 += v0_add; v0 += v0_add;
@ -521,28 +549,32 @@ static void M_GTMapPersp32FP(
if (x_size == 1) { if (x_size == 1) {
const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)]; const uint8_t color_idx = tex_page[MAKE_TEX_ID(v0, u0)];
const uint8_t color = g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; const uint8_t color = g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr = MAKE_PAL_IDX(color); *target_line_ptr = MAKE_PAL_IDX(color);
*alpha_line_ptr = 255;
} }
loop_end: loop_end:
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
alpha_ptr += alpha_stride;
} }
} }
static void M_WGTMapPersp32FP( static void M_WGTMapPersp32FP(
GFX_2D_SURFACE *const target_surface, const int32_t y1, const int32_t y2, GFX_2D_SURFACE *alpha_surface, GFX_2D_SURFACE *const target_surface,
const uint8_t *const tex_page) const int32_t y1, const int32_t y2, const uint8_t *const tex_page)
{ {
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
if (y_size <= 0) { if (y_size <= 0) {
return; return;
} }
const int32_t stride = target_surface->desc.pitch;
const XBUF_XGUVP *xbuf = (const XBUF_XGUVP *)m_XBuffer + y1; const XBUF_XGUVP *xbuf = (const XBUF_XGUVP *)m_XBuffer + y1;
PIX_FMT *draw_ptr = target_surface->buffer + y1 * stride; const int32_t target_stride = target_surface->desc.pitch;
const int32_t alpha_stride = alpha_surface->desc.pitch;
PIX_FMT *target_ptr = target_surface->buffer + y1 * target_stride;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * alpha_stride;
while (y_size > 0) { while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE; const int32_t x = xbuf->x1 / PHD_ONE;
@ -561,7 +593,8 @@ static void M_WGTMapPersp32FP(
int32_t u0 = PHD_HALF * u / rhw; int32_t u0 = PHD_HALF * u / rhw;
int32_t v0 = PHD_HALF * v / rhw; int32_t v0 = PHD_HALF * v / rhw;
PIX_FMT *line_ptr = draw_ptr + x; PIX_FMT *target_line_ptr = target_ptr + x;
ALPHA_FMT *alpha_line_ptr = alpha_ptr + x;
int32_t batch_size = 32; int32_t batch_size = 32;
if (x_size >= batch_size) { if (x_size >= batch_size) {
@ -590,10 +623,13 @@ static void M_WGTMapPersp32FP(
if (color_idx != 0) { if (color_idx != 0) {
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
line_ptr[0] = MAKE_PAL_IDX(color); target_line_ptr[0] = MAKE_PAL_IDX(color);
line_ptr[1] = MAKE_PAL_IDX(color); target_line_ptr[1] = MAKE_PAL_IDX(color);
alpha_line_ptr[0] = 255;
alpha_line_ptr[1] = 255;
} }
line_ptr += 2; target_line_ptr += 2;
alpha_line_ptr += 2;
g += g_add * 2; g += g_add * 2;
u0 += u0_add * 2; u0 += u0_add * 2;
v0 += v0_add * 2; v0 += v0_add * 2;
@ -605,9 +641,11 @@ static void M_WGTMapPersp32FP(
if (color_idx != 0) { if (color_idx != 0) {
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr = MAKE_PAL_IDX(color); *target_line_ptr = MAKE_PAL_IDX(color);
*alpha_line_ptr = 255;
} }
line_ptr++; target_line_ptr++;
alpha_line_ptr++;
g += g_add; g += g_add;
u0 += u0_add; u0 += u0_add;
v0 += v0_add; v0 += v0_add;
@ -636,10 +674,13 @@ static void M_WGTMapPersp32FP(
if (color_idx != 0) { if (color_idx != 0) {
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
line_ptr[0] = MAKE_PAL_IDX(color); target_line_ptr[0] = MAKE_PAL_IDX(color);
line_ptr[1] = MAKE_PAL_IDX(color); target_line_ptr[1] = MAKE_PAL_IDX(color);
alpha_line_ptr[0] = 255;
alpha_line_ptr[1] = 255;
} }
line_ptr += 2; target_line_ptr += 2;
alpha_line_ptr += 2;
g += g_add * 2; g += g_add * 2;
u0 += u0_add * 2; u0 += u0_add * 2;
v0 += v0_add * 2; v0 += v0_add * 2;
@ -651,9 +692,11 @@ static void M_WGTMapPersp32FP(
if (color_idx != 0) { if (color_idx != 0) {
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr = MAKE_PAL_IDX(color); *target_line_ptr = MAKE_PAL_IDX(color);
*alpha_line_ptr = 255;
} }
line_ptr++; target_line_ptr++;
alpha_line_ptr++;
g += g_add; g += g_add;
u0 += u0_add; u0 += u0_add;
v0 += v0_add; v0 += v0_add;
@ -666,110 +709,16 @@ static void M_WGTMapPersp32FP(
if (color_idx != 0) { if (color_idx != 0) {
const uint8_t color = const uint8_t color =
g_DepthQTable[MAKE_Q_ID(g)].index[color_idx]; g_DepthQTable[MAKE_Q_ID(g)].index[color_idx];
*line_ptr = MAKE_PAL_IDX(color); *target_line_ptr = MAKE_PAL_IDX(color);
*alpha_line_ptr = 255;
} }
} }
loop_end: loop_end:
y_size--; y_size--;
xbuf++; xbuf++;
draw_ptr += stride; target_ptr += target_stride;
} alpha_ptr += alpha_stride;
}
static void M_OccludeX(
GFX_2D_SURFACE *const alpha_surface, const int32_t y1, const int32_t y2)
{
int32_t y_size = y2 - y1;
if (y_size <= 0) {
return;
}
const int32_t stride = alpha_surface->desc.pitch;
const XBUF_X *xbuf = (const XBUF_X *)m_XBuffer + y1;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * stride;
while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE;
const int32_t x_size = (xbuf->x2 / PHD_ONE) - x;
if (x_size > 0) {
memset(alpha_ptr + x, 255, x_size * sizeof(ALPHA_FMT));
}
y_size--;
xbuf++;
alpha_ptr += stride;
}
}
static void M_OccludeXG(
GFX_2D_SURFACE *const alpha_surface, const int32_t y1, const int32_t y2)
{
int32_t y_size = y2 - y1;
if (y_size <= 0) {
return;
}
const int32_t stride = alpha_surface->desc.pitch;
const XBUF_XG *xbuf = (const XBUF_XG *)m_XBuffer + y1;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * stride;
while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE;
const int32_t x_size = (xbuf->x2 / PHD_ONE) - x;
if (x_size > 0) {
memset(alpha_ptr + x, 255, x_size * sizeof(ALPHA_FMT));
}
y_size--;
xbuf++;
alpha_ptr += stride;
}
}
static void M_OccludeXGUV(
GFX_2D_SURFACE *const alpha_surface, const int32_t y1, const int32_t y2)
{
int32_t y_size = y2 - y1;
if (y_size <= 0) {
return;
}
const int32_t stride = alpha_surface->desc.pitch;
const XBUF_XGUV *xbuf = (const XBUF_XGUV *)m_XBuffer + y1;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * stride;
while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE;
const int32_t x_size = (xbuf->x2 / PHD_ONE) - x;
if (x_size > 0) {
memset(alpha_ptr + x, 255, x_size * sizeof(ALPHA_FMT));
}
y_size--;
xbuf++;
alpha_ptr += stride;
}
}
static void M_OccludeXGUVP(
GFX_2D_SURFACE *const alpha_surface, const int32_t y1, const int32_t y2)
{
int32_t y_size = y2 - y1;
if (y_size <= 0) {
return;
}
const int32_t stride = alpha_surface->desc.pitch;
const XBUF_XGUVP *xbuf = (const XBUF_XGUVP *)m_XBuffer + y1;
ALPHA_FMT *alpha_ptr = alpha_surface->buffer + y1 * stride;
while (y_size > 0) {
const int32_t x = xbuf->x1 / PHD_ONE;
const int32_t x_size = (xbuf->x2 / PHD_ONE) - x;
if (x_size > 0) {
memset(alpha_ptr + x, 255, x_size * sizeof(ALPHA_FMT));
}
y_size--;
xbuf++;
alpha_ptr += stride;
} }
} }
@ -1102,8 +1051,7 @@ static void M_DrawPolyFlat(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenX(obj_ptr + 1)) { if (M_XGenX(obj_ptr + 1)) {
M_OccludeX(alpha_surface, m_XGenY1, m_XGenY2); M_FlatA(alpha_surface, target_surface, m_XGenY1, m_XGenY2, *obj_ptr);
M_FlatA(target_surface, m_XGenY1, m_XGenY2, *obj_ptr);
} }
} }
@ -1112,8 +1060,7 @@ static void M_DrawPolyTrans(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenX(obj_ptr + 1)) { if (M_XGenX(obj_ptr + 1)) {
M_OccludeX(alpha_surface, m_XGenY1, m_XGenY2); M_TransA(alpha_surface, target_surface, m_XGenY1, m_XGenY2, *obj_ptr);
M_TransA(target_surface, m_XGenY1, m_XGenY2, *obj_ptr);
} }
} }
@ -1122,8 +1069,7 @@ static void M_DrawPolyGouraud(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenXG(obj_ptr + 1)) { if (M_XGenXG(obj_ptr + 1)) {
M_OccludeXG(alpha_surface, m_XGenY1, m_XGenY2); M_GourA(alpha_surface, target_surface, m_XGenY1, m_XGenY2, *obj_ptr);
M_GourA(target_surface, m_XGenY1, m_XGenY2, *obj_ptr);
} }
} }
@ -1132,9 +1078,9 @@ static void M_DrawPolyGTMap(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenXGUV(obj_ptr + 1)) { if (M_XGenXGUV(obj_ptr + 1)) {
M_OccludeXGUV(alpha_surface, m_XGenY1, m_XGenY2);
M_GTMapA( M_GTMapA(
target_surface, m_XGenY1, m_XGenY2, g_TexturePageBuffer8[*obj_ptr]); alpha_surface, target_surface, m_XGenY1, m_XGenY2,
g_TexturePageBuffer8[*obj_ptr]);
} }
} }
@ -1143,9 +1089,9 @@ static void M_DrawPolyWGTMap(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenXGUV(obj_ptr + 1)) { if (M_XGenXGUV(obj_ptr + 1)) {
M_OccludeXGUV(alpha_surface, m_XGenY1, m_XGenY2);
M_WGTMapA( M_WGTMapA(
target_surface, m_XGenY1, m_XGenY2, g_TexturePageBuffer8[*obj_ptr]); alpha_surface, target_surface, m_XGenY1, m_XGenY2,
g_TexturePageBuffer8[*obj_ptr]);
} }
} }
@ -1154,9 +1100,9 @@ static void M_DrawPolyGTMapPersp(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenXGUVPerspFP(obj_ptr + 1)) { if (M_XGenXGUVPerspFP(obj_ptr + 1)) {
M_OccludeXGUVP(alpha_surface, m_XGenY1, m_XGenY2);
M_GTMapPersp32FP( M_GTMapPersp32FP(
target_surface, m_XGenY1, m_XGenY2, g_TexturePageBuffer8[*obj_ptr]); alpha_surface, target_surface, m_XGenY1, m_XGenY2,
g_TexturePageBuffer8[*obj_ptr]);
} }
} }
@ -1165,9 +1111,9 @@ static void M_DrawPolyWGTMapPersp(
GFX_2D_SURFACE *const alpha_surface) GFX_2D_SURFACE *const alpha_surface)
{ {
if (M_XGenXGUVPerspFP(obj_ptr + 1)) { if (M_XGenXGUVPerspFP(obj_ptr + 1)) {
M_OccludeXGUVP(alpha_surface, m_XGenY1, m_XGenY2);
M_WGTMapPersp32FP( M_WGTMapPersp32FP(
target_surface, m_XGenY1, m_XGenY2, g_TexturePageBuffer8[*obj_ptr]); alpha_surface, target_surface, m_XGenY1, m_XGenY2,
g_TexturePageBuffer8[*obj_ptr]);
} }
} }
@ -1180,7 +1126,7 @@ static void M_DrawPolyLine(
int32_t x2 = *obj_ptr++; int32_t x2 = *obj_ptr++;
int32_t y2 = *obj_ptr++; int32_t y2 = *obj_ptr++;
uint8_t lcolor = (uint8_t)*obj_ptr; uint8_t lcolor = (uint8_t)*obj_ptr;
const int32_t stride = target_surface->desc.pitch; const int32_t target_stride = target_surface->desc.pitch;
if (x2 < x1) { if (x2 < x1) {
int32_t tmp; int32_t tmp;
@ -1224,11 +1170,11 @@ static void M_DrawPolyLine(
int32_t x_size = x2 - x1; int32_t x_size = x2 - x1;
int32_t y_size = y2 - y1; int32_t y_size = y2 - y1;
PIX_FMT *draw_ptr = &target_surface->buffer[x1 + stride * y1]; PIX_FMT *target_ptr = &target_surface->buffer[x1 + target_stride * y1];
ALPHA_FMT *alpha_ptr = &alpha_surface->buffer[x1 + stride * y1]; ALPHA_FMT *alpha_ptr = &alpha_surface->buffer[x1 + target_stride * y1];
if (!x_size && !y_size) { if (!x_size && !y_size) {
*draw_ptr = lcolor; *target_ptr = lcolor;
//*alpha_ptr = 255; //*alpha_ptr = 255;
return; return;
} }
@ -1243,10 +1189,10 @@ static void M_DrawPolyLine(
int32_t y_add; int32_t y_add;
if (y_size < 0) { if (y_size < 0) {
y_add = -stride; y_add = -target_stride;
y_size = -y_size; y_size = -y_size;
} else { } else {
y_add = stride; y_add = target_stride;
} }
int32_t col_add; int32_t col_add;
@ -1269,12 +1215,12 @@ static void M_DrawPolyLine(
int32_t part = PHD_ONE * rows / cols; int32_t part = PHD_ONE * rows / cols;
for (int32_t i = 0; i < cols; i++) { for (int32_t i = 0; i < cols; i++) {
part_sum += part; part_sum += part;
*draw_ptr = lcolor; *target_ptr = lcolor;
draw_ptr += col_add; target_ptr += col_add;
//*alpha_ptr = 255; //*alpha_ptr = 255;
// alpha_ptr += col_add; // alpha_ptr += col_add;
if (part_sum >= PHD_ONE) { if (part_sum >= PHD_ONE) {
draw_ptr += row_add; target_ptr += row_add;
// alpha_ptr += row_add; // alpha_ptr += row_add;
part_sum -= PHD_ONE; part_sum -= PHD_ONE;
} }
@ -1316,15 +1262,15 @@ static void M_DrawScaledSpriteC(
CLAMPG(x1, g_PhdWinMaxX + 1); CLAMPG(x1, g_PhdWinMaxX + 1);
CLAMPG(y1, g_PhdWinMaxY + 1); CLAMPG(y1, g_PhdWinMaxY + 1);
const int32_t stride = target_surface->desc.pitch; const int32_t target_stride = target_surface->desc.pitch;
const int32_t width = x1 - x0; const int32_t width = x1 - x0;
const int32_t height = y1 - y0; const int32_t height = y1 - y0;
const uint8_t *const src_base = const uint8_t *const src_base =
&g_TexturePageBuffer8[sprite->tex_page][sprite->offset]; &g_TexturePageBuffer8[sprite->tex_page][sprite->offset];
PIX_FMT *draw_ptr = &target_surface->buffer[y0 * stride + x0]; PIX_FMT *target_ptr = &target_surface->buffer[y0 * target_stride + x0];
ALPHA_FMT *alpha_ptr = &alpha_surface->buffer[y0 * stride + x0]; ALPHA_FMT *alpha_ptr = &alpha_surface->buffer[y0 * target_stride + x0];
const int32_t dst_add = stride - width; const int32_t dst_add = target_stride - width;
const bool is_depth_q = depth != &g_DepthQTable[16]; const bool is_depth_q = depth != &g_DepthQTable[16];
@ -1334,14 +1280,14 @@ static void M_DrawScaledSpriteC(
for (int32_t j = 0; j < width; j++) { for (int32_t j = 0; j < width; j++) {
const uint8_t pix = src[u >> 16]; const uint8_t pix = src[u >> 16];
if (pix != 0) { if (pix != 0) {
*draw_ptr = is_depth_q ? depth->index[pix] : pix; *target_ptr = is_depth_q ? depth->index[pix] : pix;
*alpha_ptr = 255; *alpha_ptr = 255;
} }
u += u_add; u += u_add;
draw_ptr++; target_ptr++;
alpha_ptr++; alpha_ptr++;
} }
draw_ptr += dst_add; target_ptr += dst_add;
alpha_ptr += dst_add; alpha_ptr += dst_add;
v_base += v_add; v_base += v_add;
} }
@ -1455,7 +1401,7 @@ static void M_BeginScene(RENDERER *const renderer)
memset( memset(
priv->surface_alpha->buffer, 0, priv->surface_alpha->buffer, 0,
priv->surface_alpha->desc.width * priv->surface_alpha->desc.height); priv->surface_alpha->desc.pitch * priv->surface_alpha->desc.height);
} }
static void M_EndScene(RENDERER *const renderer) static void M_EndScene(RENDERER *const renderer)