From 2676ca1284b153a6e898d7f2c8926fa8e64c26b7 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Mon, 19 Dec 2016 21:13:29 +0100 Subject: [PATCH 1/8] Rename wall drawer args and functions to closer match the general naming convention --- src/r_draw.cpp | 131 ++++++----------------- src/r_draw.h | 54 ++++------ src/r_draw_pal.cpp | 258 ++++++++++++++++++++++----------------------- src/r_draw_pal.h | 26 ++--- src/r_plane.cpp | 12 +-- src/r_walldraw.cpp | 61 ++++------- 6 files changed, 217 insertions(+), 325 deletions(-) diff --git a/src/r_draw.cpp b/src/r_draw.cpp index 25297f6c8..8206c2391 100644 --- a/src/r_draw.cpp +++ b/src/r_draw.cpp @@ -96,17 +96,15 @@ namespace swrenderer uint8_t *dc_destorg; int dc_destheight; int dc_count; - uint32_t vplce[4]; - uint32_t vince[4]; - uint8_t *palookupoffse[4]; - fixed_t palookuplight[4]; - const uint8_t *bufplce[4]; - const uint8_t *bufplce2[4]; - uint32_t buftexturefracx[4]; - uint32_t bufheight[4]; - int vlinebits; - int mvlinebits; - int tmvlinebits; + uint32_t dc_wall_texturefrac[4]; + uint32_t dc_wall_iscale[4]; + uint8_t *dc_wall_colormap[4]; + fixed_t dc_wall_light[4]; + const uint8_t *dc_wall_source[4]; + const uint8_t *dc_wall_source2[4]; + uint32_t dc_wall_texturefracx[4]; + uint32_t dc_wall_sourceheight[4]; + int dc_wall_fracbits; int ds_y; int ds_x1; int ds_x2; @@ -497,50 +495,35 @@ namespace swrenderer return tex->GetColumn(col, nullptr); } - bool R_GetTransMaskDrawers(fixed_t(**tmvline1)(), void(**tmvline4)()) + bool R_GetTransMaskDrawers(void(**drawCol1)(), void(**drawCol4)()) { if (colfunc == R_DrawAddColumn) { - *tmvline1 = tmvline1_add; - *tmvline4 = tmvline4_add; + *drawCol1 = R_DrawWallAddCol1; + *drawCol4 = R_DrawWallAddCol4; return true; } if (colfunc == R_DrawAddClampColumn) { - *tmvline1 = tmvline1_addclamp; - *tmvline4 = tmvline4_addclamp; + *drawCol1 = R_DrawWallAddClampCol1; + *drawCol4 = R_DrawWallAddClampCol4; return true; } if (colfunc == R_DrawSubClampColumn) { - *tmvline1 = tmvline1_subclamp; - *tmvline4 = tmvline4_subclamp; + *drawCol1 = R_DrawWallSubClampCol1; + *drawCol4 = R_DrawWallSubClampCol4; return true; } if (colfunc == R_DrawRevSubClampColumn) { - *tmvline1 = tmvline1_revsubclamp; - *tmvline4 = tmvline4_revsubclamp; + *drawCol1 = R_DrawWallRevSubClampCol1; + *drawCol4 = R_DrawWallRevSubClampCol4; return true; } return false; } - void setupvline(int fracbits) - { - drawerargs::vlinebits = fracbits; - } - - void setupmvline(int fracbits) - { - drawerargs::mvlinebits = fracbits; - } - - void setuptmvline(int fracbits) - { - drawerargs::tmvlinebits = fracbits; - } - void R_SetColorMapLight(lighttable_t *base_colormap, float light, int shade) { using namespace drawerargs; @@ -973,118 +956,64 @@ namespace swrenderer rt_revsubclamp4cols(sx, yl, yh); } - uint32_t vlinec1() + void R_DrawWallCol1() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - return dc_texturefrac + dc_count * dc_iscale; } - void vlinec4() + void R_DrawWallCol4() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - for (int i = 0; i < 4; i++) - vplce[i] += vince[i] * dc_count; } - uint32_t mvlinec1() + void R_DrawWallMaskedCol1() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - return dc_texturefrac + dc_count * dc_iscale; } - void mvlinec4() + void R_DrawWallMaskedCol4() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - for (int i = 0; i < 4; i++) - vplce[i] += vince[i] * dc_count; } - fixed_t tmvline1_add() + void R_DrawWallAddCol1() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - return dc_texturefrac + dc_count * dc_iscale; } - void tmvline4_add() + void R_DrawWallAddCol4() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - for (int i = 0; i < 4; i++) - vplce[i] += vince[i] * dc_count; } - fixed_t tmvline1_addclamp() + void R_DrawWallAddClampCol1() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - return dc_texturefrac + dc_count * dc_iscale; } - void tmvline4_addclamp() + void R_DrawWallAddClampCol4() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - for (int i = 0; i < 4; i++) - vplce[i] += vince[i] * dc_count; } - fixed_t tmvline1_subclamp() + void R_DrawWallSubClampCol1() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - return dc_texturefrac + dc_count * dc_iscale; } - void tmvline4_subclamp() + void R_DrawWallSubClampCol4() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - for (int i = 0; i < 4; i++) - vplce[i] += vince[i] * dc_count; } - fixed_t tmvline1_revsubclamp() + void R_DrawWallRevSubClampCol1() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - return dc_texturefrac + dc_count * dc_iscale; } - void tmvline4_revsubclamp() + void R_DrawWallRevSubClampCol4() { - using namespace drawerargs; - DrawerCommandQueue::QueueCommand(); - - for (int i = 0; i < 4; i++) - vplce[i] += vince[i] * dc_count; } void R_DrawSingleSkyCol1(uint32_t solid_top, uint32_t solid_bottom) diff --git a/src/r_draw.h b/src/r_draw.h index ab430d2af..c245034d7 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -41,17 +41,15 @@ namespace swrenderer extern int dc_destheight; extern int dc_count; - extern uint32_t vplce[4]; - extern uint32_t vince[4]; - extern uint8_t *palookupoffse[4]; - extern fixed_t palookuplight[4]; - extern const uint8_t *bufplce[4]; - extern const uint8_t *bufplce2[4]; - extern uint32_t buftexturefracx[4]; - extern uint32_t bufheight[4]; - extern int vlinebits; - extern int mvlinebits; - extern int tmvlinebits; + extern uint32_t dc_wall_texturefrac[4]; + extern uint32_t dc_wall_iscale[4]; + extern uint8_t *dc_wall_colormap[4]; + extern fixed_t dc_wall_light[4]; + extern const uint8_t *dc_wall_source[4]; + extern const uint8_t *dc_wall_source2[4]; + extern uint32_t dc_wall_texturefracx[4]; + extern uint32_t dc_wall_sourceheight[4]; + extern int dc_wall_fracbits; extern int ds_y; extern int ds_x1; @@ -100,7 +98,7 @@ namespace swrenderer ESPSResult R_SetPatchStyle(FRenderStyle style, fixed_t alpha, int translation, uint32_t color); ESPSResult R_SetPatchStyle(FRenderStyle style, float alpha, int translation, uint32_t color); void R_FinishSetPatchStyle(); // Call this after finished drawing the current thing, in case its style was STYLE_Shade - bool R_GetTransMaskDrawers(fixed_t(**tmvline1)(), void(**tmvline4)()); + bool R_GetTransMaskDrawers(void(**drawCol1)(), void(**drawCol4)()); const uint8_t *R_GetColumn(FTexture *tex, int col); @@ -162,29 +160,21 @@ namespace swrenderer void R_SetupDrawSlab(uint8_t *colormap); void R_DrawSlab(int dx, fixed_t v, int dy, fixed_t vi, const uint8_t *vptr, uint8_t *p); void R_DrawFogBoundary(int x1, int x2, short *uclip, short *dclip); - uint32_t vlinec1(); - void vlinec4(); - uint32_t mvlinec1(); - void mvlinec4(); - fixed_t tmvline1_add(); - void tmvline4_add(); - fixed_t tmvline1_addclamp(); - void tmvline4_addclamp(); - fixed_t tmvline1_subclamp(); - void tmvline4_subclamp(); - fixed_t tmvline1_revsubclamp(); - void tmvline4_revsubclamp(); void R_FillColumnHoriz(); void R_FillSpan(); - inline uint32_t dovline1() { return vlinec1(); } - inline void dovline4() { vlinec4(); } - inline uint32_t domvline1() { return mvlinec1(); } - inline void domvline4() { mvlinec4(); } - - void setupvline(int fracbits); - void setupmvline(int fracbits); - void setuptmvline(int fracbits); + void R_DrawWallCol1(); + void R_DrawWallCol4(); + void R_DrawWallMaskedCol1(); + void R_DrawWallMaskedCol4(); + void R_DrawWallAddCol1(); + void R_DrawWallAddCol4(); + void R_DrawWallAddClampCol1(); + void R_DrawWallAddClampCol4(); + void R_DrawWallSubClampCol1(); + void R_DrawWallSubClampCol4(); + void R_DrawWallRevSubClampCol1(); + void R_DrawWallRevSubClampCol4(); void R_DrawSingleSkyCol1(uint32_t solid_top, uint32_t solid_bottom); void R_DrawSingleSkyCol4(uint32_t solid_top, uint32_t solid_bottom); diff --git a/src/r_draw_pal.cpp b/src/r_draw_pal.cpp index cfb55a670..2cdeba314 100644 --- a/src/r_draw_pal.cpp +++ b/src/r_draw_pal.cpp @@ -95,9 +95,7 @@ namespace swrenderer _count = dc_count; _source = dc_source; _dest = dc_dest; - _vlinebits = vlinebits; - _mvlinebits = mvlinebits; - _tmvlinebits = tmvlinebits; + _fracbits = dc_wall_fracbits; _pitch = dc_pitch; _srcblend = dc_srcblend; _destblend = dc_destblend; @@ -110,15 +108,13 @@ namespace swrenderer _dest = dc_dest; _count = dc_count; _pitch = dc_pitch; - _vlinebits = vlinebits; - _mvlinebits = mvlinebits; - _tmvlinebits = tmvlinebits; + _fracbits = dc_wall_fracbits; for (int col = 0; col < 4; col++) { - _palookupoffse[col] = palookupoffse[col]; - _bufplce[col] = bufplce[col]; - _vince[col] = vince[col]; - _vplce[col] = vplce[col]; + _colormap[col] = dc_wall_colormap[col]; + _source[col] = dc_wall_source[col]; + _iscale[col] = dc_wall_iscale[col]; + _texturefrac[col] = dc_wall_texturefrac[col]; } _srcblend = dc_srcblend; _destblend = dc_destblend; @@ -132,7 +128,7 @@ namespace swrenderer int count = _count; const uint8_t *source = _source; uint8_t *dest = _dest; - int bits = _vlinebits; + int bits = _fracbits; int pitch = _pitch; count = thread->count_for_thread(_dest_y, count); @@ -156,24 +152,24 @@ namespace swrenderer { uint8_t *dest = _dest; int count = _count; - int bits = _vlinebits; + int bits = _fracbits; uint32_t place; - auto pal0 = _palookupoffse[0]; - auto pal1 = _palookupoffse[1]; - auto pal2 = _palookupoffse[2]; - auto pal3 = _palookupoffse[3]; - auto buf0 = _bufplce[0]; - auto buf1 = _bufplce[1]; - auto buf2 = _bufplce[2]; - auto buf3 = _bufplce[3]; - auto vince0 = _vince[0]; - auto vince1 = _vince[1]; - auto vince2 = _vince[2]; - auto vince3 = _vince[3]; - auto vplce0 = _vplce[0]; - auto vplce1 = _vplce[1]; - auto vplce2 = _vplce[2]; - auto vplce3 = _vplce[3]; + auto pal0 = _colormap[0]; + auto pal1 = _colormap[1]; + auto pal2 = _colormap[2]; + auto pal3 = _colormap[3]; + auto buf0 = _source[0]; + auto buf1 = _source[1]; + auto buf2 = _source[2]; + auto buf3 = _source[3]; + auto dc_wall_iscale0 = _iscale[0]; + auto dc_wall_iscale1 = _iscale[1]; + auto dc_wall_iscale2 = _iscale[2]; + auto dc_wall_iscale3 = _iscale[3]; + auto dc_wall_texturefrac0 = _texturefrac[0]; + auto dc_wall_texturefrac1 = _texturefrac[1]; + auto dc_wall_texturefrac2 = _texturefrac[2]; + auto dc_wall_texturefrac3 = _texturefrac[3]; auto pitch = _pitch; count = thread->count_for_thread(_dest_y, count); @@ -182,22 +178,22 @@ namespace swrenderer int skipped = thread->skipped_by_thread(_dest_y); dest = thread->dest_for_thread(_dest_y, pitch, dest); - vplce0 += vince0 * skipped; - vplce1 += vince1 * skipped; - vplce2 += vince2 * skipped; - vplce3 += vince3 * skipped; - vince0 *= thread->num_cores; - vince1 *= thread->num_cores; - vince2 *= thread->num_cores; - vince3 *= thread->num_cores; + dc_wall_texturefrac0 += dc_wall_iscale0 * skipped; + dc_wall_texturefrac1 += dc_wall_iscale1 * skipped; + dc_wall_texturefrac2 += dc_wall_iscale2 * skipped; + dc_wall_texturefrac3 += dc_wall_iscale3 * skipped; + dc_wall_iscale0 *= thread->num_cores; + dc_wall_iscale1 *= thread->num_cores; + dc_wall_iscale2 *= thread->num_cores; + dc_wall_iscale3 *= thread->num_cores; pitch *= thread->num_cores; do { - dest[0] = pal0[buf0[(place = vplce0) >> bits]]; vplce0 = place + vince0; - dest[1] = pal1[buf1[(place = vplce1) >> bits]]; vplce1 = place + vince1; - dest[2] = pal2[buf2[(place = vplce2) >> bits]]; vplce2 = place + vince2; - dest[3] = pal3[buf3[(place = vplce3) >> bits]]; vplce3 = place + vince3; + dest[0] = pal0[buf0[(place = dc_wall_texturefrac0) >> bits]]; dc_wall_texturefrac0 = place + dc_wall_iscale0; + dest[1] = pal1[buf1[(place = dc_wall_texturefrac1) >> bits]]; dc_wall_texturefrac1 = place + dc_wall_iscale1; + dest[2] = pal2[buf2[(place = dc_wall_texturefrac2) >> bits]]; dc_wall_texturefrac2 = place + dc_wall_iscale2; + dest[3] = pal3[buf3[(place = dc_wall_texturefrac3) >> bits]]; dc_wall_texturefrac3 = place + dc_wall_iscale3; dest += pitch; } while (--count); } @@ -210,7 +206,7 @@ namespace swrenderer int count = _count; const uint8_t *source = _source; uint8_t *dest = _dest; - int bits = _mvlinebits; + int bits = _fracbits; int pitch = _pitch; count = thread->count_for_thread(_dest_y, count); @@ -238,24 +234,24 @@ namespace swrenderer { uint8_t *dest = _dest; int count = _count; - int bits = _mvlinebits; + int bits = _fracbits; uint32_t place; - auto pal0 = _palookupoffse[0]; - auto pal1 = _palookupoffse[1]; - auto pal2 = _palookupoffse[2]; - auto pal3 = _palookupoffse[3]; - auto buf0 = _bufplce[0]; - auto buf1 = _bufplce[1]; - auto buf2 = _bufplce[2]; - auto buf3 = _bufplce[3]; - auto vince0 = _vince[0]; - auto vince1 = _vince[1]; - auto vince2 = _vince[2]; - auto vince3 = _vince[3]; - auto vplce0 = _vplce[0]; - auto vplce1 = _vplce[1]; - auto vplce2 = _vplce[2]; - auto vplce3 = _vplce[3]; + auto pal0 = _colormap[0]; + auto pal1 = _colormap[1]; + auto pal2 = _colormap[2]; + auto pal3 = _colormap[3]; + auto buf0 = _source[0]; + auto buf1 = _source[1]; + auto buf2 = _source[2]; + auto buf3 = _source[3]; + auto dc_wall_iscale0 = _iscale[0]; + auto dc_wall_iscale1 = _iscale[1]; + auto dc_wall_iscale2 = _iscale[2]; + auto dc_wall_iscale3 = _iscale[3]; + auto dc_wall_texturefrac0 = _texturefrac[0]; + auto dc_wall_texturefrac1 = _texturefrac[1]; + auto dc_wall_texturefrac2 = _texturefrac[2]; + auto dc_wall_texturefrac3 = _texturefrac[3]; auto pitch = _pitch; count = thread->count_for_thread(_dest_y, count); @@ -264,24 +260,24 @@ namespace swrenderer int skipped = thread->skipped_by_thread(_dest_y); dest = thread->dest_for_thread(_dest_y, pitch, dest); - vplce0 += vince0 * skipped; - vplce1 += vince1 * skipped; - vplce2 += vince2 * skipped; - vplce3 += vince3 * skipped; - vince0 *= thread->num_cores; - vince1 *= thread->num_cores; - vince2 *= thread->num_cores; - vince3 *= thread->num_cores; + dc_wall_texturefrac0 += dc_wall_iscale0 * skipped; + dc_wall_texturefrac1 += dc_wall_iscale1 * skipped; + dc_wall_texturefrac2 += dc_wall_iscale2 * skipped; + dc_wall_texturefrac3 += dc_wall_iscale3 * skipped; + dc_wall_iscale0 *= thread->num_cores; + dc_wall_iscale1 *= thread->num_cores; + dc_wall_iscale2 *= thread->num_cores; + dc_wall_iscale3 *= thread->num_cores; pitch *= thread->num_cores; do { uint8_t pix; - pix = buf0[(place = vplce0) >> bits]; if (pix) dest[0] = pal0[pix]; vplce0 = place + vince0; - pix = buf1[(place = vplce1) >> bits]; if (pix) dest[1] = pal1[pix]; vplce1 = place + vince1; - pix = buf2[(place = vplce2) >> bits]; if (pix) dest[2] = pal2[pix]; vplce2 = place + vince2; - pix = buf3[(place = vplce3) >> bits]; if (pix) dest[3] = pal3[pix]; vplce3 = place + vince3; + pix = buf0[(place = dc_wall_texturefrac0) >> bits]; if (pix) dest[0] = pal0[pix]; dc_wall_texturefrac0 = place + dc_wall_iscale0; + pix = buf1[(place = dc_wall_texturefrac1) >> bits]; if (pix) dest[1] = pal1[pix]; dc_wall_texturefrac1 = place + dc_wall_iscale1; + pix = buf2[(place = dc_wall_texturefrac2) >> bits]; if (pix) dest[2] = pal2[pix]; dc_wall_texturefrac2 = place + dc_wall_iscale2; + pix = buf3[(place = dc_wall_texturefrac3) >> bits]; if (pix) dest[3] = pal3[pix]; dc_wall_texturefrac3 = place + dc_wall_iscale3; dest += pitch; } while (--count); } @@ -294,7 +290,7 @@ namespace swrenderer int count = _count; const uint8_t *source = _source; uint8_t *dest = _dest; - int bits = _tmvlinebits; + int bits = _fracbits; int pitch = _pitch; uint32_t *fg2rgb = _srcblend; @@ -328,13 +324,13 @@ namespace swrenderer { uint8_t *dest = _dest; int count = _count; - int bits = _tmvlinebits; + int bits = _fracbits; uint32_t *fg2rgb = _srcblend; uint32_t *bg2rgb = _destblend; - uint32_t vplce[4] = { _vplce[0], _vplce[1], _vplce[2], _vplce[3] }; - uint32_t vince[4] = { _vince[0], _vince[1], _vince[2], _vince[3] }; + uint32_t dc_wall_texturefrac[4] = { _texturefrac[0], _texturefrac[1], _texturefrac[2], _texturefrac[3] }; + uint32_t dc_wall_iscale[4] = { _iscale[0], _iscale[1], _iscale[2], _iscale[3] }; count = thread->count_for_thread(_dest_y, count); if (count <= 0) @@ -345,8 +341,8 @@ namespace swrenderer dest = thread->dest_for_thread(_dest_y, pitch, dest); for (int i = 0; i < 4; i++) { - vplce[i] += vince[i] * skipped; - vince[i] *= thread->num_cores; + dc_wall_texturefrac[i] += dc_wall_iscale[i] * skipped; + dc_wall_iscale[i] *= thread->num_cores; } pitch *= thread->num_cores; @@ -354,15 +350,15 @@ namespace swrenderer { for (int i = 0; i < 4; ++i) { - uint8_t pix = _bufplce[i][vplce[i] >> bits]; + uint8_t pix = _source[i][dc_wall_texturefrac[i] >> bits]; if (pix != 0) { - uint32_t fg = fg2rgb[_palookupoffse[i][pix]]; + uint32_t fg = fg2rgb[_colormap[i][pix]]; uint32_t bg = bg2rgb[dest[i]]; fg = (fg + bg) | 0x1f07c1f; dest[i] = RGB32k.All[fg & (fg >> 15)]; } - vplce[i] += vince[i]; + dc_wall_texturefrac[i] += dc_wall_iscale[i]; } dest += pitch; } while (--count); @@ -376,7 +372,7 @@ namespace swrenderer int count = _count; const uint8_t *source = _source; uint8_t *dest = _dest; - int bits = _tmvlinebits; + int bits = _fracbits; int pitch = _pitch; uint32_t *fg2rgb = _srcblend; @@ -415,13 +411,13 @@ namespace swrenderer { uint8_t *dest = _dest; int count = _count; - int bits = _tmvlinebits; + int bits = _fracbits; uint32_t *fg2rgb = _srcblend; uint32_t *bg2rgb = _destblend; - uint32_t vplce[4] = { _vplce[0], _vplce[1], _vplce[2], _vplce[3] }; - uint32_t vince[4] = { _vince[0], _vince[1], _vince[2], _vince[3] }; + uint32_t dc_wall_texturefrac[4] = { _texturefrac[0], _texturefrac[1], _texturefrac[2], _texturefrac[3] }; + uint32_t dc_wall_iscale[4] = { _iscale[0], _iscale[1], _iscale[2], _iscale[3] }; count = thread->count_for_thread(_dest_y, count); if (count <= 0) @@ -432,8 +428,8 @@ namespace swrenderer dest = thread->dest_for_thread(_dest_y, pitch, dest); for (int i = 0; i < 4; i++) { - vplce[i] += vince[i] * skipped; - vince[i] *= thread->num_cores; + dc_wall_texturefrac[i] += dc_wall_iscale[i] * skipped; + dc_wall_iscale[i] *= thread->num_cores; } pitch *= thread->num_cores; @@ -441,10 +437,10 @@ namespace swrenderer { for (int i = 0; i < 4; ++i) { - uint8_t pix = _bufplce[i][vplce[i] >> bits]; + uint8_t pix = _source[i][dc_wall_texturefrac[i] >> bits]; if (pix != 0) { - uint32_t a = fg2rgb[_palookupoffse[i][pix]] + bg2rgb[dest[i]]; + uint32_t a = fg2rgb[_colormap[i][pix]] + bg2rgb[dest[i]]; uint32_t b = a; a |= 0x01f07c1f; @@ -454,7 +450,7 @@ namespace swrenderer a |= b; dest[i] = RGB32k.All[a & (a >> 15)]; } - vplce[i] += vince[i]; + dc_wall_texturefrac[i] += dc_wall_iscale[i]; } dest += pitch; } while (--count); @@ -468,7 +464,7 @@ namespace swrenderer int count = _count; const uint8_t *source = _source; uint8_t *dest = _dest; - int bits = _tmvlinebits; + int bits = _fracbits; int pitch = _pitch; uint32_t *fg2rgb = _srcblend; @@ -506,13 +502,13 @@ namespace swrenderer { uint8_t *dest = _dest; int count = _count; - int bits = _tmvlinebits; + int bits = _fracbits; uint32_t *fg2rgb = _srcblend; uint32_t *bg2rgb = _destblend; - uint32_t vplce[4] = { _vplce[0], _vplce[1], _vplce[2], _vplce[3] }; - uint32_t vince[4] = { _vince[0], _vince[1], _vince[2], _vince[3] }; + uint32_t dc_wall_texturefrac[4] = { _texturefrac[0], _texturefrac[1], _texturefrac[2], _texturefrac[3] }; + uint32_t dc_wall_iscale[4] = { _iscale[0], _iscale[1], _iscale[2], _iscale[3] }; count = thread->count_for_thread(_dest_y, count); if (count <= 0) @@ -523,8 +519,8 @@ namespace swrenderer dest = thread->dest_for_thread(_dest_y, pitch, dest); for (int i = 0; i < 4; i++) { - vplce[i] += vince[i] * skipped; - vince[i] *= thread->num_cores; + dc_wall_texturefrac[i] += dc_wall_iscale[i] * skipped; + dc_wall_iscale[i] *= thread->num_cores; } pitch *= thread->num_cores; @@ -532,10 +528,10 @@ namespace swrenderer { for (int i = 0; i < 4; ++i) { - uint8_t pix = _bufplce[i][vplce[i] >> bits]; + uint8_t pix = _source[i][dc_wall_texturefrac[i] >> bits]; if (pix != 0) { - uint32_t a = (fg2rgb[_palookupoffse[i][pix]] | 0x40100400) - bg2rgb[dest[i]]; + uint32_t a = (fg2rgb[_colormap[i][pix]] | 0x40100400) - bg2rgb[dest[i]]; uint32_t b = a; b &= 0x40100400; @@ -544,7 +540,7 @@ namespace swrenderer a |= 0x01f07c1f; dest[i] = RGB32k.All[a & (a >> 15)]; } - vplce[i] += vince[i]; + dc_wall_texturefrac[i] += dc_wall_iscale[i]; } dest += pitch; } while (--count); @@ -558,7 +554,7 @@ namespace swrenderer int count = _count; const uint8_t *source = _source; uint8_t *dest = _dest; - int bits = _tmvlinebits; + int bits = _fracbits; int pitch = _pitch; uint32_t *fg2rgb = _srcblend; @@ -596,13 +592,13 @@ namespace swrenderer { uint8_t *dest = _dest; int count = _count; - int bits = _tmvlinebits; + int bits = _fracbits; uint32_t *fg2rgb = _srcblend; uint32_t *bg2rgb = _destblend; - uint32_t vplce[4] = { _vplce[0], _vplce[1], _vplce[2], _vplce[3] }; - uint32_t vince[4] = { _vince[0], _vince[1], _vince[2], _vince[3] }; + uint32_t dc_wall_texturefrac[4] = { _texturefrac[0], _texturefrac[1], _texturefrac[2], _texturefrac[3] }; + uint32_t dc_wall_iscale[4] = { _iscale[0], _iscale[1], _iscale[2], _iscale[3] }; count = thread->count_for_thread(_dest_y, count); if (count <= 0) @@ -613,8 +609,8 @@ namespace swrenderer dest = thread->dest_for_thread(_dest_y, pitch, dest); for (int i = 0; i < 4; i++) { - vplce[i] += vince[i] * skipped; - vince[i] *= thread->num_cores; + dc_wall_texturefrac[i] += dc_wall_iscale[i] * skipped; + dc_wall_iscale[i] *= thread->num_cores; } pitch *= thread->num_cores; @@ -622,10 +618,10 @@ namespace swrenderer { for (int i = 0; i < 4; ++i) { - uint8_t pix = _bufplce[i][vplce[i] >> bits]; + uint8_t pix = _source[i][dc_wall_texturefrac[i] >> bits]; if (pix != 0) { - uint32_t a = (bg2rgb[dest[i]] | 0x40100400) - fg2rgb[_palookupoffse[i][pix]]; + uint32_t a = (bg2rgb[dest[i]] | 0x40100400) - fg2rgb[_colormap[i][pix]]; uint32_t b = a; b &= 0x40100400; @@ -634,7 +630,7 @@ namespace swrenderer a |= 0x01f07c1f; dest[i] = RGB32k.All[a & (a >> 15)]; } - vplce[i] += vince[i]; + dc_wall_texturefrac[i] += dc_wall_iscale[i]; } dest += _pitch; } while (--count); @@ -651,11 +647,11 @@ namespace swrenderer _pitch = dc_pitch; for (int col = 0; col < 4; col++) { - _bufplce[col] = bufplce[col]; - _bufplce2[col] = bufplce2[col]; - _bufheight[col] = bufheight[col]; - _vince[col] = vince[col]; - _vplce[col] = vplce[col]; + _source[col] = dc_wall_source[col]; + _source2[col] = dc_wall_source2[col]; + _sourceheight[col] = dc_wall_sourceheight[col]; + _iscale[col] = dc_wall_iscale[col]; + _texturefrac[col] = dc_wall_texturefrac[col]; } } @@ -664,11 +660,11 @@ namespace swrenderer uint8_t *dest = _dest; int count = _count; int pitch = _pitch; - const uint8_t *source0 = _bufplce[0]; - int textureheight0 = _bufheight[0]; + const uint8_t *source0 = _source[0]; + int textureheight0 = _sourceheight[0]; - int32_t frac = _vplce[0]; - int32_t fracstep = _vince[0]; + int32_t frac = _texturefrac[0]; + int32_t fracstep = _iscale[0]; int start_fade = 2; // How fast it should fade out @@ -729,11 +725,11 @@ namespace swrenderer uint8_t *dest = _dest; int count = _count; int pitch = _pitch; - const uint8_t *source0[4] = { _bufplce[0], _bufplce[1], _bufplce[2], _bufplce[3] }; - int textureheight0 = _bufheight[0]; + const uint8_t *source0[4] = { _source[0], _source[1], _source[2], _source[3] }; + int textureheight0 = _sourceheight[0]; const uint32_t *palette = (const uint32_t *)GPalette.BaseColors; - int32_t frac[4] = { (int32_t)_vplce[0], (int32_t)_vplce[1], (int32_t)_vplce[2], (int32_t)_vplce[3] }; - int32_t fracstep[4] = { (int32_t)_vince[0], (int32_t)_vince[1], (int32_t)_vince[2], (int32_t)_vince[3] }; + int32_t frac[4] = { (int32_t)_texturefrac[0], (int32_t)_texturefrac[1], (int32_t)_texturefrac[2], (int32_t)_texturefrac[3] }; + int32_t fracstep[4] = { (int32_t)_iscale[0], (int32_t)_iscale[1], (int32_t)_iscale[2], (int32_t)_iscale[3] }; uint8_t output[4]; int start_fade = 2; // How fast it should fade out @@ -870,13 +866,13 @@ namespace swrenderer uint8_t *dest = _dest; int count = _count; int pitch = _pitch; - const uint8_t *source0 = _bufplce[0]; - const uint8_t *source1 = _bufplce2[0]; - int textureheight0 = _bufheight[0]; - uint32_t maxtextureheight1 = _bufheight[1] - 1; + const uint8_t *source0 = _source[0]; + const uint8_t *source1 = _source2[0]; + int textureheight0 = _sourceheight[0]; + uint32_t maxtextureheight1 = _sourceheight[1] - 1; - int32_t frac = _vplce[0]; - int32_t fracstep = _vince[0]; + int32_t frac = _texturefrac[0]; + int32_t fracstep = _iscale[0]; int start_fade = 2; // How fast it should fade out @@ -942,13 +938,13 @@ namespace swrenderer uint8_t *dest = _dest; int count = _count; int pitch = _pitch; - const uint8_t *source0[4] = { _bufplce[0], _bufplce[1], _bufplce[2], _bufplce[3] }; - const uint8_t *source1[4] = { _bufplce2[0], _bufplce2[1], _bufplce2[2], _bufplce2[3] }; - int textureheight0 = _bufheight[0]; - uint32_t maxtextureheight1 = _bufheight[1] - 1; + const uint8_t *source0[4] = { _source[0], _source[1], _source[2], _source[3] }; + const uint8_t *source1[4] = { _source2[0], _source2[1], _source2[2], _source2[3] }; + int textureheight0 = _sourceheight[0]; + uint32_t maxtextureheight1 = _sourceheight[1] - 1; const uint32_t *palette = (const uint32_t *)GPalette.BaseColors; - int32_t frac[4] = { (int32_t)_vplce[0], (int32_t)_vplce[1], (int32_t)_vplce[2], (int32_t)_vplce[3] }; - int32_t fracstep[4] = { (int32_t)_vince[0], (int32_t)_vince[1], (int32_t)_vince[2], (int32_t)_vince[3] }; + int32_t frac[4] = { (int32_t)_texturefrac[0], (int32_t)_texturefrac[1], (int32_t)_texturefrac[2], (int32_t)_texturefrac[3] }; + int32_t fracstep[4] = { (int32_t)_iscale[0], (int32_t)_iscale[1], (int32_t)_iscale[2], (int32_t)_iscale[3] }; uint8_t output[4]; int start_fade = 2; // How fast it should fade out diff --git a/src/r_draw_pal.h b/src/r_draw_pal.h index f2b1f0571..ab3c98327 100644 --- a/src/r_draw_pal.h +++ b/src/r_draw_pal.h @@ -20,9 +20,7 @@ namespace swrenderer int _count; const uint8_t *_source; uint8_t *_dest; - int _vlinebits; - int _mvlinebits; - int _tmvlinebits; + int _fracbits; int _pitch; uint32_t *_srcblend; uint32_t *_destblend; @@ -38,13 +36,11 @@ namespace swrenderer uint8_t *_dest; int _count; int _pitch; - int _vlinebits; - int _mvlinebits; - int _tmvlinebits; - uint8_t *_palookupoffse[4]; - const uint8_t *_bufplce[4]; - uint32_t _vince[4]; - uint32_t _vplce[4]; + int _fracbits; + uint8_t *_colormap[4]; + const uint8_t *_source[4]; + uint32_t _iscale[4]; + uint32_t _texturefrac[4]; uint32_t *_srcblend; uint32_t *_destblend; }; @@ -75,11 +71,11 @@ namespace swrenderer uint8_t *_dest; int _count; int _pitch; - const uint8_t *_bufplce[4]; - const uint8_t *_bufplce2[4]; - int _bufheight[4]; - uint32_t _vince[4]; - uint32_t _vplce[4]; + const uint8_t *_source[4]; + const uint8_t *_source2[4]; + int _sourceheight[4]; + uint32_t _iscale[4]; + uint32_t _texturefrac[4]; }; class DrawSingleSky1PalCommand : public PalSkyCommand { public: using PalSkyCommand::PalSkyCommand; void Execute(DrawerThread *thread) override; }; diff --git a/src/r_plane.cpp b/src/r_plane.cpp index cd378aec1..64433b6d4 100644 --- a/src/r_plane.cpp +++ b/src/r_plane.cpp @@ -705,15 +705,15 @@ static void R_DrawSkyColumnStripe(int start_x, int y1, int y2, int columns, doub angle1 = (DWORD)((UMulScale16(ang, frontcyl) + frontpos) >> FRACBITS); angle2 = (DWORD)((UMulScale16(ang, backcyl) + backpos) >> FRACBITS); - bufplce[i] = (const BYTE *)frontskytex->GetColumn(angle1, nullptr); - bufplce2[i] = backskytex ? (const BYTE *)backskytex->GetColumn(angle2, nullptr) : nullptr; + dc_wall_source[i] = (const BYTE *)frontskytex->GetColumn(angle1, nullptr); + dc_wall_source2[i] = backskytex ? (const BYTE *)backskytex->GetColumn(angle2, nullptr) : nullptr; - vince[i] = uv_step; - vplce[i] = uv_pos; + dc_wall_iscale[i] = uv_step; + dc_wall_texturefrac[i] = uv_pos; } - bufheight[0] = height; - bufheight[1] = backskytex ? backskytex->GetHeight() : height; + dc_wall_sourceheight[0] = height; + dc_wall_sourceheight[1] = backskytex ? backskytex->GetHeight() : height; dc_dest = (ylookup[y1] + start_x) + dc_destorg; dc_count = y2 - y1; diff --git a/src/r_walldraw.cpp b/src/r_walldraw.cpp index ee2e1a29d..c13786bba 100644 --- a/src/r_walldraw.cpp +++ b/src/r_walldraw.cpp @@ -96,7 +96,7 @@ WallSampler::WallSampler(int y1, float swal, double yrepeat, fixed_t xoffset, FT } // Draw a column with support for non-power-of-two ranges -static void Draw1Column(int x, int y1, int y2, WallSampler &sampler, DWORD(*draw1column)()) +static void Draw1Column(int x, int y1, int y2, WallSampler &sampler, void(*draw1column)()) { if (sampler.uv_max == 0 || sampler.uv_step == 0) // power of two { @@ -151,9 +151,9 @@ static void Draw4Columns(int x, int y1, int y2, WallSampler *sampler, void(*draw int count = y2 - y1; for (int i = 0; i < 4; i++) { - bufplce[i] = sampler[i].source; - vplce[i] = sampler[i].uv_pos; - vince[i] = sampler[i].uv_step; + dc_wall_source[i] = sampler[i].source; + dc_wall_texturefrac[i] = sampler[i].uv_pos; + dc_wall_iscale[i] = sampler[i].uv_step; uint64_t step64 = sampler[i].uv_step; uint64_t pos64 = sampler[i].uv_pos; @@ -168,7 +168,7 @@ static void Draw4Columns(int x, int y1, int y2, WallSampler *sampler, void(*draw dc_dest = (ylookup[y1] + x) + dc_destorg; for (int i = 0; i < 4; i++) { - bufplce[i] = sampler[i].source; + dc_wall_source[i] = sampler[i].source; } uint32_t left = y2 - y1; @@ -188,8 +188,8 @@ static void Draw4Columns(int x, int y1, int y2, WallSampler *sampler, void(*draw // Draw until that column wraps for (int i = 0; i < 4; i++) { - vplce[i] = sampler[i].uv_pos; - vince[i] = sampler[i].uv_step; + dc_wall_texturefrac[i] = sampler[i].uv_pos; + dc_wall_iscale[i] = sampler[i].uv_step; } dc_count = count; draw4columns(); @@ -207,13 +207,11 @@ static void Draw4Columns(int x, int y1, int y2, WallSampler *sampler, void(*draw } } -typedef DWORD(*Draw1ColumnFuncPtr)(); -typedef void(*Draw4ColumnsFuncPtr)(); +typedef void(*DrawColumnFuncPtr)(); static void ProcessWallWorker( int x1, int x2, short *uwal, short *dwal, float *swal, fixed_t *lwal, double yrepeat, - const BYTE *(*getcol)(FTexture *tex, int x), - void(setupProcessNormalWall(int bits, Draw1ColumnFuncPtr &draw1, Draw4ColumnsFuncPtr &draw2))) + const BYTE *(*getcol)(FTexture *tex, int x), DrawColumnFuncPtr draw1column, DrawColumnFuncPtr draw4columns) { if (rw_pic->UseType == FTexture::TEX_Null) return; @@ -228,17 +226,15 @@ static void ProcessWallWorker( dc_texturemid = 0; } - DWORD(*draw1column)(); - void(*draw4columns)(); - setupProcessNormalWall(fracbits, draw1column, draw4columns); + dc_wall_fracbits = fracbits; bool fixed = (fixedcolormap != NULL || fixedlightlev >= 0); if (fixed) { - palookupoffse[0] = dc_colormap; - palookupoffse[1] = dc_colormap; - palookupoffse[2] = dc_colormap; - palookupoffse[3] = dc_colormap; + dc_wall_colormap[0] = dc_colormap; + dc_wall_colormap[1] = dc_colormap; + dc_wall_colormap[2] = dc_colormap; + dc_wall_colormap[3] = dc_colormap; } if (fixedcolormap) @@ -331,7 +327,7 @@ static void ProcessWallWorker( { for (int i = 0; i < 4; i++) { - palookupoffse[i] = basecolormap->Maps + (GETPALOOKUP(lights[i], wallshade) << COLORMAPSHIFT); + dc_wall_colormap[i] = basecolormap->Maps + (GETPALOOKUP(lights[i], wallshade) << COLORMAPSHIFT); } } Draw4Columns(x, middle_y1, middle_y2, sampler, draw4columns); @@ -367,12 +363,7 @@ static void ProcessWallWorker( static void ProcessNormalWall(int x1, int x2, short *uwal, short *dwal, float *swal, fixed_t *lwal, double yrepeat, const BYTE *(*getcol)(FTexture *tex, int x) = R_GetColumn) { - ProcessWallWorker(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol, [](int bits, Draw1ColumnFuncPtr &line1, Draw4ColumnsFuncPtr &line4) - { - setupvline(bits); - line1 = dovline1; - line4 = dovline4; - }); + ProcessWallWorker(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol, R_DrawWallCol1, R_DrawWallCol4); } static void ProcessMaskedWall(int x1, int x2, short *uwal, short *dwal, float *swal, fixed_t *lwal, double yrepeat, const BYTE *(*getcol)(FTexture *tex, int x) = R_GetColumn) @@ -383,32 +374,22 @@ static void ProcessMaskedWall(int x1, int x2, short *uwal, short *dwal, float *s } else { - ProcessWallWorker(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol, [](int bits, Draw1ColumnFuncPtr &line1, Draw4ColumnsFuncPtr &line4) - { - setupmvline(bits); - line1 = domvline1; - line4 = domvline4; - }); + ProcessWallWorker(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol, R_DrawWallMaskedCol1, R_DrawWallMaskedCol4); } } static void ProcessTranslucentWall(int x1, int x2, short *uwal, short *dwal, float *swal, fixed_t *lwal, double yrepeat, const BYTE *(*getcol)(FTexture *tex, int x) = R_GetColumn) { - static fixed_t(*tmvline1)(); - static void(*tmvline4)(); - if (!R_GetTransMaskDrawers(&tmvline1, &tmvline4)) + void (*drawcol1)(); + void (*drawcol4)(); + if (!R_GetTransMaskDrawers(&drawcol1, &drawcol4)) { // The current translucency is unsupported, so draw with regular ProcessMaskedWall instead. ProcessMaskedWall(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol); } else { - ProcessWallWorker(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol, [](int bits, Draw1ColumnFuncPtr &line1, Draw4ColumnsFuncPtr &line4) - { - setuptmvline(bits); - line1 = reinterpret_cast(tmvline1); - line4 = tmvline4; - }); + ProcessWallWorker(x1, x2, uwal, dwal, swal, lwal, yrepeat, getcol, drawcol1, drawcol4); } } From a0595f17e8c33301a6b12f2217d3ab643e13c18b Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 20 Dec 2016 13:13:50 +0200 Subject: [PATCH 2/8] Serializer now writes floating point zero if special value is encountered See https://forum.zdoom.org/viewtopic.php?t=54592 --- src/rapidjson/writer.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rapidjson/writer.h b/src/rapidjson/writer.h index a288f07ff..200abadae 100644 --- a/src/rapidjson/writer.h +++ b/src/rapidjson/writer.h @@ -527,7 +527,9 @@ inline bool Writer::WriteDouble(double d) { if (!(kWriteDefaultFlags & kWriteNanAndInfFlag)) { // At least ensure that the output does not get broken. - PutReserve(*os_, 1); + PutReserve(*os_, 3); + PutUnsafe(*os_, '0'); + PutUnsafe(*os_, '.'); PutUnsafe(*os_, '0'); return false; } From 9f6d8d2ba709af32e0a183774ae46e12edc8d37d Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 20 Dec 2016 13:14:02 +0200 Subject: [PATCH 3/8] Set goal values in decal stretcher to zeros even if they are not used See https://forum.zdoom.org/viewtopic.php?t=54592 --- src/decallib.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/decallib.cpp b/src/decallib.cpp index 5d24e44d5..7bfdfc3e7 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -1232,6 +1232,7 @@ DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor, side_t *wall) c } else { + thinker->GoalX = 0; thinker->bStretchX = false; } if (GoalY >= 0) @@ -1241,6 +1242,7 @@ DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor, side_t *wall) c } else { + thinker->GoalY = 0; thinker->bStretchY = false; } thinker->bStarted = false; From 1d77f1f72eb015a4ec314535e3236e864cf086c4 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Tue, 20 Dec 2016 15:19:06 +0200 Subject: [PATCH 4/8] Enabled building of GME static library by default See https://forum.zdoom.org/viewtopic.php?t=54651 --- game-music-emu/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game-music-emu/CMakeLists.txt b/game-music-emu/CMakeLists.txt index c6472b690..0af4f24d8 100644 --- a/game-music-emu/CMakeLists.txt +++ b/game-music-emu/CMakeLists.txt @@ -80,7 +80,7 @@ set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ZD_FASTMATH_FLAG}" ) #endif() # [ZDoom] Set always to OFF. -set(BUILD_SHARED_LIBS 0 BOOL "Build shared library (set to OFF for static library)") +set(BUILD_SHARED_LIBS OFF) # Check for GCC "visibility" support. if (CMAKE_COMPILER_IS_GNUCXX) From b15e620ea85ec545850fce384e9109b8287af525 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 20 Dec 2016 18:26:33 +0100 Subject: [PATCH 5/8] - fixed: Phased light setup did not check if a sector had been already visited and could cause infinite recursion. --- src/p_lights.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 910c52a64..a05199b91 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -31,6 +31,7 @@ #include "p_lnspec.h" #include "doomstat.h" +#include "p_maputl.h" // State. #include "r_state.h" @@ -914,7 +915,7 @@ void DPhased::Tick () int DPhased::PhaseHelper (sector_t *sector, int index, int light, sector_t *prev) { - if (!sector) + if (!sector || sector->validcount == validcount) { return index; } @@ -922,6 +923,7 @@ int DPhased::PhaseHelper (sector_t *sector, int index, int light, sector_t *prev { DPhased *l; int baselevel = sector->lightlevel ? sector->lightlevel : light; + sector->validcount = validcount; if (index == 0) { @@ -958,6 +960,7 @@ DPhased::DPhased (sector_t *sector, int baselevel) DPhased::DPhased (sector_t *sector) : DLighting (sector) { + validcount++; PhaseHelper (sector, 0, 0, NULL); } From 7dd51d6d1c2f1f425b529ed3742c342d032a4255 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Thu, 22 Dec 2016 11:00:20 +0200 Subject: [PATCH 6/8] Fixed infinite execution of error CCMD https://forum.zdoom.org/viewtopic.php?t=54659 --- src/c_console.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/c_console.cpp b/src/c_console.cpp index 691c4a3ca..0a324eb8f 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -1523,8 +1523,6 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) buffer.Text.StripLeftRight(); Printf(127, TEXTCOLOR_WHITE "]%s\n", buffer.Text.GetChars()); - AddCommandString(buffer.Text.LockBuffer()); - buffer.Text.UnlockBuffer(); if (buffer.Text.Len() == 0) { @@ -1568,7 +1566,21 @@ static bool C_HandleKey (event_t *ev, FCommandBuffer &buffer) } } HistPos = NULL; - buffer.SetString(""); + { + // Work with a copy of command to avoid side effects caused by + // exception raised during execution, like with 'error' CCMD. + // It's problematic to maintain FString's lock symmetry. + static TArray command; + const size_t length = buffer.Text.Len(); + + command.Resize(length + 1); + memcpy(&command[0], buffer.Text.GetChars(), length); + command[length] = '\0'; + + buffer.SetString(""); + + AddCommandString(&command[0]); + } TabbedLast = false; TabbedList = false; break; From 2327359d74c7a5af518f64287903c0c62bdf2039 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 23 Dec 2016 10:09:10 +0200 Subject: [PATCH 7/8] Fixed sector floor offset compatibility parameter after floatification See https://forum.zdoom.org/viewtopic.php?t=54690 --- src/compatibility.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/compatibility.cpp b/src/compatibility.cpp index 60f9d8ad6..742f43eee 100644 --- a/src/compatibility.cpp +++ b/src/compatibility.cpp @@ -533,8 +533,9 @@ void SetCompatibilityParams() if (CompatParams[i+1] < numsectors) { sector_t *sec = §ors[CompatParams[i+1]]; - sec->floorplane.ChangeHeight(CompatParams[i+2]); - sec->ChangePlaneTexZ(sector_t::floor, CompatParams[i+2] / 65536.); + const double delta = CompatParams[i + 2] / 65536.0; + sec->floorplane.ChangeHeight(delta); + sec->ChangePlaneTexZ(sector_t::floor, delta); } i += 3; break; From 4fcf9933f0f6bdcd110510afab3a0d4173c474f8 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 23 Dec 2016 16:33:05 +0100 Subject: [PATCH 8/8] - copy target to a local variable in A_VileAttack so that it remains accessible if A_Explode destroys the actor. --- wadsrc/static/zscript/doom/archvile.txt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/wadsrc/static/zscript/doom/archvile.txt b/wadsrc/static/zscript/doom/archvile.txt index 9faa80495..a19e5c705 100644 --- a/wadsrc/static/zscript/doom/archvile.txt +++ b/wadsrc/static/zscript/doom/archvile.txt @@ -125,25 +125,26 @@ extend class Actor void A_VileAttack(sound snd = "vile/stop", int initialdmg = 20, int blastdmg = 70, int blastradius = 70, double thrust = 1.0, name damagetype = "Fire", int flags = 0) { - if (target) + Actor targ = target; + if (targ) { A_FaceTarget(); - if (!CheckSight(target, 0)) return; + if (!CheckSight(targ, 0)) return; A_PlaySound(snd, CHAN_WEAPON); - int newdam = target.DamageMobj (self, self, initialdmg, (flags & VAF_DMGTYPEAPPLYTODIRECT)? damagetype : 'none'); + int newdam = targ.DamageMobj (self, self, initialdmg, (flags & VAF_DMGTYPEAPPLYTODIRECT)? damagetype : 'none'); - TraceBleed (newdam > 0 ? newdam : initialdmg, target); + TraceBleed (newdam > 0 ? newdam : initialdmg, targ); Actor fire = tracer; if (fire) { // move the fire between the vile and the player - fire.SetOrigin(target.Vec3Angle(-24., angle, 0), true); + fire.SetOrigin(targ.Vec3Angle(-24., angle, 0), true); fire.A_Explode(blastdmg, blastradius, XF_NOSPLASH, false, 0, 0, 0, "BulletPuff", damagetype); } - if (!target.bDontThrust) + if (!targ.bDontThrust) { - target.Vel.z = thrust * 1000 / max(1, target.Mass); + targ.Vel.z = thrust * 1000 / max(1, targ.Mass); } } }