From 0ebe6f2f4dd42968915512263a7b7f09b2973ff8 Mon Sep 17 00:00:00 2001 From: yamamama Date: Thu, 5 Mar 2026 14:29:07 -0500 Subject: [PATCH] Affine brightmaps --- src/r_draw.h | 5 +++++ src/r_draw_column.cpp | 19 ++++++++++++++----- src/r_things.cpp | 17 +++++++++++++---- src/screen.c | 8 ++++---- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/r_draw.h b/src/r_draw.h index 2533ff7df..b5b10a75c 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -210,6 +210,11 @@ void R_DrawTranslatedAffineColumn(drawcolumndata_t* dc); void R_DrawTranslucentAffineColumn(drawcolumndata_t* dc); void R_DrawTranslatedTranslucentAffineColumn(drawcolumndata_t* dc); +void R_DrawAffineColumn_Brightmap(drawcolumndata_t* dc); +void R_DrawTranslatedAffineColumn_Brightmap(drawcolumndata_t* dc); +void R_DrawTranslucentAffineColumn_Brightmap(drawcolumndata_t* dc); +void R_DrawTranslatedTranslucentAffineColumn_Brightmap(drawcolumndata_t* dc); + void R_DrawColumn_Brightmap(drawcolumndata_t* dc); void R_DrawTranslucentColumn_Brightmap(drawcolumndata_t* dc); void R_DrawTranslatedColumn_Brightmap(drawcolumndata_t* dc); diff --git a/src/r_draw_column.cpp b/src/r_draw_column.cpp index 3975436af..65ba577bf 100644 --- a/src/r_draw_column.cpp +++ b/src/r_draw_column.cpp @@ -135,11 +135,19 @@ FUNCINLINE static ATTRINLINE constexpr UINT16 R_DrawColumnAffinePixel(drawcolumn if constexpr (Type & DrawColumnType::DC_BRIGHTMAP) { - if (dc->brightmap[bit] == BRIGHTPIXEL) + // For affine drawers, dc->brightmap points to a *flat*, and not a *column*. + // Keep that in mind before you do something that causes a bunch of segfaults! + + if (dc->brightmap) { - // Pixel is part of the brightmap - col = dc->fullbright[col]; - was_brightmapped = true; + const UINT16 bmpixel = reinterpret_cast(dc->brightmap)[bit]; + + if ((bmpixel & 0xff) == BRIGHTPIXEL) + { + // Pixel is part of the brightmap + col = dc->fullbright[col]; + was_brightmapped = true; + } } } @@ -703,7 +711,8 @@ static void R_DrawAffineColumnTemplate(drawcolumndata_t *dc) // Replace with DEFINE_AFFINE_COLUMN_COMBO down the line #define DEFINE_AFFINE_COLUMN_SETUP(name, flags) \ - DEFINE_AFFINE_COLUMN_FUNC(name, flags|DC_DIRECT) + DEFINE_AFFINE_COLUMN_FUNC(name, flags|DC_DIRECT) \ + DEFINE_AFFINE_COLUMN_FUNC(name ## _Brightmap, flags|DC_DIRECT|DC_BRIGHTMAP) DEFINE_AFFINE_COLUMN_SETUP(R_DrawAffineColumn, DC_BASIC); DEFINE_AFFINE_COLUMN_SETUP(R_DrawTranslatedAffineColumn, DC_COLORMAP); diff --git a/src/r_things.cpp b/src/r_things.cpp index f9d93da36..ab59b994f 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1041,27 +1041,28 @@ static void R_DrawVisSprite(vissprite_t *vis) if (vis->cut & SC_AFFINE) { // Specialized affine drawing functions, primarily for player sprites. + boolean affinebrightmap = (bmpatch != NULL); if (dc.translation) // translate green skin to another color { if (vis->transmap) { - R_SetColumnFunc(COLDRAWFUNC_AFFINETRANSTRANS, false); + R_SetColumnFunc(COLDRAWFUNC_AFFINETRANSTRANS, affinebrightmap); dc.transmap = vis->transmap; } else { - R_SetColumnFunc(COLDRAWFUNC_AFFINETRANS, false); + R_SetColumnFunc(COLDRAWFUNC_AFFINETRANS, affinebrightmap); } } else if (vis->transmap) { - R_SetColumnFunc(COLDRAWFUNC_AFFINEFUZZY, false); + R_SetColumnFunc(COLDRAWFUNC_AFFINEFUZZY, affinebrightmap); dc.transmap = vis->transmap; } else { - R_SetColumnFunc(COLDRAWFUNC_AFFINE, false); + R_SetColumnFunc(COLDRAWFUNC_AFFINE, affinebrightmap); } } // Hack: Use a special column function for drop shadows that bypasses @@ -1172,6 +1173,14 @@ static void R_DrawVisSprite(vissprite_t *vis) dc.source = static_cast(patch->flats[0]); dc.sourcelength = patch->width; + if (bmpatch) + { + Patch_GenerateFlat(bmpatch, static_cast(0)); + + // The column is a flat because fuck you + dc.brightmap = static_cast(bmpatch->flats[0]); + } + dc.affine.a = vis->affine.transform.a; dc.affine.b = vis->affine.transform.b; dc.affine.c = vis->affine.transform.c; diff --git a/src/screen.c b/src/screen.c index 158b4313e..bead6e2f8 100644 --- a/src/screen.c +++ b/src/screen.c @@ -153,10 +153,10 @@ void SCR_SetDrawFuncs(enum columncontext_e _columncontext) // Affine brightmap functions; needed but I don't care at the moment - colfuncs_bm[COLDRAWFUNC_AFFINE] = NULL; - colfuncs_bm[COLDRAWFUNC_AFFINETRANS] = NULL; - colfuncs_bm[COLDRAWFUNC_AFFINEFUZZY] = NULL; - colfuncs_bm[COLDRAWFUNC_AFFINETRANSTRANS] = NULL; + colfuncs_bm[COLDRAWFUNC_AFFINE] = R_DrawAffineColumn_Brightmap; + colfuncs_bm[COLDRAWFUNC_AFFINETRANS] = R_DrawTranslatedAffineColumn_Brightmap; + colfuncs_bm[COLDRAWFUNC_AFFINEFUZZY] = R_DrawTranslucentAffineColumn_Brightmap; + colfuncs_bm[COLDRAWFUNC_AFFINETRANSTRANS] = R_DrawTranslatedTranslucentAffineColumn_Brightmap; spanfuncs[BASEDRAWFUNC] = R_DrawSpan; spanfuncs[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan;