diff --git a/src/r_draw.h b/src/r_draw.h index b320500c6..2533ff7df 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -76,6 +76,8 @@ enum COLDRAWFUNC_DROPSHADOW, COLDRAWFUNC_AFFINE, COLDRAWFUNC_AFFINETRANS, + COLDRAWFUNC_AFFINEFUZZY, + COLDRAWFUNC_AFFINETRANSTRANS, COLDRAWFUNC_MAX }; @@ -205,6 +207,8 @@ void R_DrawFogColumn(drawcolumndata_t* dc); void R_DrawColumnShadowed(drawcolumndata_t* dc); void R_DrawAffineColumn(drawcolumndata_t* dc); void R_DrawTranslatedAffineColumn(drawcolumndata_t* dc); +void R_DrawTranslucentAffineColumn(drawcolumndata_t* dc); +void R_DrawTranslatedTranslucentAffineColumn(drawcolumndata_t* dc); void R_DrawColumn_Brightmap(drawcolumndata_t* dc); void R_DrawTranslucentColumn_Brightmap(drawcolumndata_t* dc); diff --git a/src/r_draw_column.cpp b/src/r_draw_column.cpp index d940697b3..483dce065 100644 --- a/src/r_draw_column.cpp +++ b/src/r_draw_column.cpp @@ -681,3 +681,5 @@ static void R_DrawAffineColumnTemplate(drawcolumndata_t *dc) DEFINE_AFFINE_COLUMN_SETUP(R_DrawAffineColumn, DC_BASIC); DEFINE_AFFINE_COLUMN_SETUP(R_DrawTranslatedAffineColumn, DC_COLORMAP); +DEFINE_AFFINE_COLUMN_SETUP(R_DrawTranslucentAffineColumn, DC_TRANSMAP); +DEFINE_AFFINE_COLUMN_SETUP(R_DrawTranslatedTranslucentAffineColumn, DC_COLORMAP|DC_TRANSMAP); diff --git a/src/r_things.cpp b/src/r_things.cpp index 7d8b1d4ae..eb5a9c806 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -1043,9 +1043,26 @@ static void R_DrawVisSprite(vissprite_t *vis) // Specialized affine drawing functions, primarily for player sprites. if (dc.translation) // translate green skin to another color - R_SetColumnFunc(COLDRAWFUNC_AFFINETRANS, false); + { + if (vis->transmap) + { + R_SetColumnFunc(COLDRAWFUNC_AFFINETRANSTRANS, false); + dc.transmap = vis->transmap; + } + else + { + R_SetColumnFunc(COLDRAWFUNC_AFFINETRANS, false); + } + } + else if (vis->transmap) + { + R_SetColumnFunc(COLDRAWFUNC_AFFINEFUZZY, false); + dc.transmap = vis->transmap; + } else + { R_SetColumnFunc(COLDRAWFUNC_AFFINE, false); + } } // Hack: Use a special column function for drop shadows that bypasses // invalid memory access crashes caused by R_ProjectDropShadow putting wrong values diff --git a/src/screen.c b/src/screen.c index 73b6c4ac9..158b4313e 100644 --- a/src/screen.c +++ b/src/screen.c @@ -133,10 +133,13 @@ void SCR_SetDrawFuncs(enum columncontext_e _columncontext) colfuncs[COLDRAWFUNC_FOG] = R_DrawFogColumn; colfuncs[COLDRAWFUNC_DROPSHADOW] = R_DrawDropShadowColumn; - // Affine functions + // Affine functions; the ones here are only relevant for sprites. + // We can't rotate texture columns normally, can we? colfuncs[COLDRAWFUNC_AFFINE] = R_DrawAffineColumn; colfuncs[COLDRAWFUNC_AFFINETRANS] = R_DrawTranslatedAffineColumn; + colfuncs[COLDRAWFUNC_AFFINEFUZZY] = R_DrawTranslucentAffineColumn; + colfuncs[COLDRAWFUNC_AFFINETRANSTRANS] = R_DrawTranslatedTranslucentAffineColumn; colfuncs_bm[BASEDRAWFUNC] = R_DrawColumn_Brightmap; colfuncs_bm[COLDRAWFUNC_FUZZY] = R_DrawTranslucentColumn_Brightmap; @@ -152,6 +155,8 @@ void SCR_SetDrawFuncs(enum columncontext_e _columncontext) colfuncs_bm[COLDRAWFUNC_AFFINE] = NULL; colfuncs_bm[COLDRAWFUNC_AFFINETRANS] = NULL; + colfuncs_bm[COLDRAWFUNC_AFFINEFUZZY] = NULL; + colfuncs_bm[COLDRAWFUNC_AFFINETRANSTRANS] = NULL; spanfuncs[BASEDRAWFUNC] = R_DrawSpan; spanfuncs[SPANDRAWFUNC_TRANS] = R_DrawTranslucentSpan;