From a797db74dad1551db39c10a2d2b3c8100dd7e73b Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 4 Jun 2017 16:21:10 +0300 Subject: [PATCH 1/7] Silenced scripting warning from main .pk3 Script warning, "gzdoom.pk3:zscript/menu/playercontrols.txt" line 526: Truncation of floating point value --- wadsrc/static/zscript/menu/playercontrols.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/menu/playercontrols.txt b/wadsrc/static/zscript/menu/playercontrols.txt index b5bd7c79e..4200627d9 100644 --- a/wadsrc/static/zscript/menu/playercontrols.txt +++ b/wadsrc/static/zscript/menu/playercontrols.txt @@ -523,8 +523,8 @@ class ListMenuItemSlider : ListMenuItemSelectable double x = SmallFont.StringWidth ("Green") + 8 + mXpos; double x2 = SmallFont.StringWidth (text) + 8 + mXpos; - mDrawX = MAX(x2, x); + mDrawX = int(MAX(x2, x)); DrawSlider (mDrawX, mYpos); } -} \ No newline at end of file +} From 564e24be280d5f108dff0ec402b6a6ad6e2c3207 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 4 Jun 2017 11:59:26 -0400 Subject: [PATCH 2/7] - Added truecolor support to truecolor stencil drawers --- src/swrenderer/drawers/r_draw_sprite32.h | 3 ++- src/swrenderer/drawers/r_draw_sprite32_sse2.h | 3 ++- src/swrenderer/r_swcanvas.cpp | 4 +++- src/swrenderer/viewport/r_spritedrawer.cpp | 2 ++ src/swrenderer/viewport/r_spritedrawer.h | 4 +++- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/swrenderer/drawers/r_draw_sprite32.h b/src/swrenderer/drawers/r_draw_sprite32.h index 59b04b647..1441de5a3 100644 --- a/src/swrenderer/drawers/r_draw_sprite32.h +++ b/src/swrenderer/drawers/r_draw_sprite32.h @@ -194,7 +194,8 @@ namespace swrenderer uint32_t srcalpha = args.SrcAlpha() >> (FRACBITS - 8); uint32_t destalpha = args.DestAlpha() >> (FRACBITS - 8); uint32_t srccolor = args.SrcColorBgra(); - uint32_t color = LightBgra::shade_pal_index_simple(args.SolidColor(), light); + uint32_t color = LightBgra::shade_bgra_simple(args.SolidColorBgra() && 0xffffff, + LightBgra::calc_light_multiplier(light)); for (int index = 0; index < count; index++) { diff --git a/src/swrenderer/drawers/r_draw_sprite32_sse2.h b/src/swrenderer/drawers/r_draw_sprite32_sse2.h index d8afc3ae9..1511cc76f 100644 --- a/src/swrenderer/drawers/r_draw_sprite32_sse2.h +++ b/src/swrenderer/drawers/r_draw_sprite32_sse2.h @@ -185,7 +185,8 @@ namespace swrenderer uint32_t srcalpha = args.SrcAlpha() >> (FRACBITS - 8); uint32_t destalpha = args.DestAlpha() >> (FRACBITS - 8); uint32_t srccolor = args.SrcColorBgra(); - uint32_t color = LightBgra::shade_pal_index_simple(args.SolidColor(), light); + uint32_t color = LightBgra::shade_bgra_simple(args.SolidColorBgra(), + LightBgra::calc_light_multiplier(light)); int ssecount = count / 2; for (int index = 0; index < ssecount; index++) diff --git a/src/swrenderer/r_swcanvas.cpp b/src/swrenderer/r_swcanvas.cpp index 3016ae8bb..1c29fca45 100644 --- a/src/swrenderer/r_swcanvas.cpp +++ b/src/swrenderer/r_swcanvas.cpp @@ -105,7 +105,9 @@ void SWCanvas::DrawTexture(DCanvas *canvas, FTexture *img, DrawParms &parms) drawerargs.SetTranslationMap(translation); drawerargs.SetLight(basecolormap, 0.0f, shade); - uint32_t myfillcolor = (RGB256k.All[((parms.fillcolor & 0xfc0000) >> 6) | ((parms.fillcolor & 0xfc00) >> 4) | ((parms.fillcolor & 0xfc) >> 2)]) << 24; + uint32_t myfillcolor = (RGB256k.All[((parms.fillcolor & 0xfc0000) >> 6) | + ((parms.fillcolor & 0xfc00) >> 4) | ((parms.fillcolor & 0xfc) >> 2)]) << 24 | + (parms.fillcolor & 0xffffff); bool visible = drawerargs.SetStyle(viewport, parms.style, parms.Alpha, -1, myfillcolor, basecolormap); double x0 = parms.x - parms.left * parms.destwidth / parms.texwidth; diff --git a/src/swrenderer/viewport/r_spritedrawer.cpp b/src/swrenderer/viewport/r_spritedrawer.cpp index 006af41b1..841c17867 100644 --- a/src/swrenderer/viewport/r_spritedrawer.cpp +++ b/src/swrenderer/viewport/r_spritedrawer.cpp @@ -440,6 +440,7 @@ namespace swrenderer drawer_needs_pal_input = true; CameraLight *cameraLight = CameraLight::Instance(); dc_color = cameraLight->FixedColormap() ? cameraLight->FixedColormap()->Maps[APART(color)] : basecolormap->Maps[APART(color)]; + dc_color_bgra = color; basecolormap = &ShadeFakeColormap[16 - alpha]; if (cameraLight->FixedLightLevel() >= 0 && !cameraLight->FixedColormap()) { @@ -465,6 +466,7 @@ namespace swrenderer uint32_t b = BPART(color); // dc_color is used by the rt_* routines. It is indexed into dc_srcblend. dc_color = RGB256k.RGB[r >> 2][g >> 2][b >> 2]; + dc_color_bgra = color; if (style.Flags & STYLEF_InvertSource) { r = 255 - r; diff --git a/src/swrenderer/viewport/r_spritedrawer.h b/src/swrenderer/viewport/r_spritedrawer.h index 34e80cf60..a2610a4a1 100644 --- a/src/swrenderer/viewport/r_spritedrawer.h +++ b/src/swrenderer/viewport/r_spritedrawer.h @@ -19,7 +19,7 @@ namespace swrenderer bool SetStyle(RenderViewport *viewport, FRenderStyle style, float alpha, int translation, uint32_t color, FDynamicColormap *&basecolormap, fixed_t shadedlightshade = 0); void SetDest(RenderViewport *viewport, int x, int y); void SetCount(int count) { dc_count = count; } - void SetSolidColor(int color) { dc_color = color; } + void SetSolidColor(int color) { dc_color = color; dc_color_bgra = GPalette.BaseColors[color]; } void SetDynamicLight(uint32_t color) { dynlightcolor = color; } void DrawMaskedColumn(RenderThread *thread, int x, fixed_t iscale, FTexture *texture, fixed_t column, double spryscale, double sprtopscreen, bool sprflipvert, const short *mfloorclip, const short *mceilingclip, bool unmasked = false); @@ -39,6 +39,7 @@ namespace swrenderer fixed_t TextureVStep() const { return dc_iscale; } int SolidColor() const { return dc_color; } + uint32_t SolidColorBgra() const { return dc_color_bgra; } uint32_t SrcColorIndex() const { return dc_srccolor; } uint32_t SrcColorBgra() const { return dc_srccolor_bgra; } @@ -84,6 +85,7 @@ namespace swrenderer int dc_yh = 0; int dc_color = 0; + uint32_t dc_color_bgra = 0; uint32_t dc_srccolor = 0; uint32_t dc_srccolor_bgra = 0; From 211783c110f38e5bf463f50713a0cb1fea697317 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 4 Jun 2017 18:03:04 +0200 Subject: [PATCH 3/7] - added the UDMF sector scroll fields from Eternity. These are currently untested and need review, especially regarding the scroll factor that gets applied to the numbers. --- src/namedef.h | 11 +++++++- src/p_udmf.cpp | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/src/namedef.h b/src/namedef.h index c2c23f497..cc3e65088 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -595,7 +595,12 @@ xx(portal_floor_nopass) xx(portal_floor_norender) xx(portal_floor_overlaytype) xx(portal_floor_useglobaltex) - +xx(scroll_ceil_x) +xx(scroll_ceil_y) +xx(scroll_ceil_type) +xx(scroll_floor_x) +xx(scroll_floor_y) +xx(scroll_floor_type) xx(offsetx_top) xx(offsety_top) @@ -918,3 +923,7 @@ xx(DynArray) xx(Struct) xx(ReflectType) xx(MessageBoxMenu) + +xx(Both) +xx(Physical) +xx(Visual) diff --git a/src/p_udmf.cpp b/src/p_udmf.cpp index 3b8c06132..24257dbcd 100644 --- a/src/p_udmf.cpp +++ b/src/p_udmf.cpp @@ -48,6 +48,7 @@ #include "w_wad.h" #include "p_tags.h" #include "p_terrain.h" +#include "p_spec.h" #include "g_levellocals.h" #include "info.h" #include "vm.h" @@ -443,6 +444,14 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GetUDMFString) // //=========================================================================== +struct UDMFScroll +{ + bool ceiling; + int index; + double x, y; + FName type; +}; + class UDMFParser : public UDMFParserBase { bool isTranslated; @@ -454,6 +463,7 @@ class UDMFParser : public UDMFParserBase TArray ParsedSideTextures; TArray ParsedSectors; TArray ParsedVertices; + TArray UDMFScrollers; FDynamicColormap *fogMap, *normMap; FMissingTextureTracker &missingTex; @@ -1348,6 +1358,16 @@ public: double fp[4] = { 0 }, cp[4] = { 0 }; FString tagstring; + // Brand new UDMF scroller properties + double scroll_ceil_x = 0; + double scroll_ceil_y = 0; + FName scroll_ceil_type; + + double scroll_floor_x = 0; + double scroll_floor_y = 0; + FName scroll_floor_type; + + memset(sec, 0, sizeof(*sec)); sec->lightlevel = 160; sec->SetXScale(sector_t::floor, 1.); // [RH] floor and ceiling scaling @@ -1726,6 +1746,30 @@ public: else if (!stricmp(CheckString(key), "additive")) sec->planes[sector_t::floor].Flags |= PLANEF_ADDITIVE; break; + case NAME_scroll_ceil_x: + scroll_ceil_x = CheckFloat(key); + break; + + case NAME_scroll_ceil_y: + scroll_ceil_y = CheckFloat(key); + break; + + case NAME_scroll_ceil_type: + scroll_ceil_type = CheckString(key); + break; + + case NAME_scroll_floor_x: + scroll_floor_x = CheckFloat(key); + break; + + case NAME_scroll_floor_y: + scroll_floor_y = CheckFloat(key); + break; + + case NAME_scroll_floor_type: + scroll_floor_type = CheckString(key); + break; + // These two are used by Eternity for something I do not understand. //case NAME_portal_ceil_useglobaltex: //case NAME_portal_floor_useglobaltex: @@ -1759,6 +1803,17 @@ public: sec->leakydamage = 0; sec->Flags &= ~SECF_DAMAGEFLAGS; } + + // Cannot be initialized yet because they need the final sector array. + if (scroll_ceil_type != NAME_None) + { + UDMFScrollers.Push({ true, index, scroll_ceil_x, scroll_ceil_y, scroll_ceil_type }); + } + if (scroll_floor_type != NAME_None) + { + UDMFScrollers.Push({ false, index, scroll_floor_x, scroll_floor_y, scroll_floor_type }); + } + // Reset the planes to their defaults if not all of the plane equation's parameters were found. if (fplaneflags != 15) @@ -2110,6 +2165,20 @@ public: { level.sectors[i].e = &level.sectors[0].e[i]; } + // Now create the scrollers. + for (auto &scroll : UDMFScrollers) + { + const double scrollfactor = 1 / 3.2; // I hope this is correct, it's just a guess taken from Eternity's code. + if (scroll.type == NAME_Both || scroll.type == NAME_Visual) + { + P_CreateScroller(scroll.ceiling ? EScroll::sc_ceiling : EScroll::sc_floor, scroll.x * scrollfactor, scroll.y * scrollfactor, -1, scroll.index, 0); + } + if (scroll.type == NAME_Both || scroll.type == NAME_Physical) + { + // sc_carry_ceiling doesn't do anything yet. + P_CreateScroller(scroll.ceiling ? EScroll::sc_carry_ceiling : EScroll::sc_carry, scroll.x * scrollfactor, scroll.y * scrollfactor, -1, scroll.index, 0); + } + } // Create the real linedefs and decompress the sidedefs ProcessLineDefs(); From 62374cf3bc745c404e2e32d4c05882fe4ceb5899 Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 4 Jun 2017 12:25:01 -0400 Subject: [PATCH 4/7] - fixed: add light diminishing support to rgb666 palette stencil drawers --- src/swrenderer/drawers/r_draw_pal.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/swrenderer/drawers/r_draw_pal.cpp b/src/swrenderer/drawers/r_draw_pal.cpp index 574fa2a8c..cb7c16d24 100644 --- a/src/swrenderer/drawers/r_draw_pal.cpp +++ b/src/swrenderer/drawers/r_draw_pal.cpp @@ -1396,7 +1396,7 @@ namespace swrenderer int color = args.SolidColor(); do { - uint32_t val = source[frac >> FRACBITS]; + uint32_t val = colormap[source[frac >> FRACBITS]] << 2; int r = (palette[*dest].r * (255-val) + palette[color].r * val) >> 10; int g = (palette[*dest].g * (255-val) + palette[color].g * val) >> 10; @@ -1439,7 +1439,7 @@ namespace swrenderer int color = args.SolidColor(); do { - uint32_t val = source[frac >> FRACBITS]; + uint32_t val = colormap[source[frac >> FRACBITS]] << 2; int r = (palette[*dest].r * (255) + palette[color].r * val) >> 10; int g = (palette[*dest].g * (255) + palette[color].g * val) >> 10; From 5185ebbc28f9124ad872e1b42aedd8c63799ef5b Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 4 Jun 2017 12:46:39 -0400 Subject: [PATCH 5/7] - fixed: Add light diminishing to true-color stencil drawers - fixed: Non-SSE AddClampShadedBgra (stencil) drawer did not handle overflows --- src/swrenderer/drawers/r_draw_sprite32.h | 10 +++++----- src/swrenderer/drawers/r_draw_sprite32_sse2.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/swrenderer/drawers/r_draw_sprite32.h b/src/swrenderer/drawers/r_draw_sprite32.h index 1441de5a3..63f642692 100644 --- a/src/swrenderer/drawers/r_draw_sprite32.h +++ b/src/swrenderer/drawers/r_draw_sprite32.h @@ -194,7 +194,7 @@ namespace swrenderer uint32_t srcalpha = args.SrcAlpha() >> (FRACBITS - 8); uint32_t destalpha = args.DestAlpha() >> (FRACBITS - 8); uint32_t srccolor = args.SrcColorBgra(); - uint32_t color = LightBgra::shade_bgra_simple(args.SolidColorBgra() && 0xffffff, + uint32_t color = LightBgra::shade_bgra_simple(args.SolidColorBgra(), LightBgra::calc_light_multiplier(light)); for (int index = 0; index < count; index++) @@ -291,7 +291,7 @@ namespace swrenderer { using namespace DrawSprite32TModes; - if (BlendT::Mode == (int)SpriteBlendModes::Copy || BlendT::Mode == (int)SpriteBlendModes::Shaded) + if (BlendT::Mode == (int)SpriteBlendModes::Copy) return fgcolor; if (ShadeModeT::Mode == (int)ShadeMode::Simple) @@ -341,9 +341,9 @@ namespace swrenderer { uint32_t alpha = ifgshade; BgraColor outcolor; - outcolor.r = ((fgcolor.r * alpha) >> 8) + bgcolor.r; - outcolor.g = ((fgcolor.g * alpha) >> 8) + bgcolor.g; - outcolor.b = ((fgcolor.b * alpha) >> 8) + bgcolor.b; + outcolor.r = MIN(((fgcolor.r * alpha) >> 8) + bgcolor.r, 255); + outcolor.g = MIN(((fgcolor.g * alpha) >> 8) + bgcolor.g, 255); + outcolor.b = MIN(((fgcolor.b * alpha) >> 8) + bgcolor.b, 255); outcolor.a = 255; return outcolor; } diff --git a/src/swrenderer/drawers/r_draw_sprite32_sse2.h b/src/swrenderer/drawers/r_draw_sprite32_sse2.h index 1511cc76f..1b5e682b1 100644 --- a/src/swrenderer/drawers/r_draw_sprite32_sse2.h +++ b/src/swrenderer/drawers/r_draw_sprite32_sse2.h @@ -326,7 +326,7 @@ namespace swrenderer { using namespace DrawSprite32TModes; - if (BlendT::Mode == (int)SpriteBlendModes::Copy || BlendT::Mode == (int)SpriteBlendModes::Shaded) + if (BlendT::Mode == (int)SpriteBlendModes::Copy) return fgcolor; if (ShadeModeT::Mode == (int)ShadeMode::Simple) From 91680a1e8d4b235c542918a753cef8d3a8f96e27 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 4 Jun 2017 18:55:32 +0200 Subject: [PATCH 6/7] - fixed incorrect number of returns in SetRandomSeed. --- src/scripting/backend/codegen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 0613b91bd..f1d30d7c4 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -5975,7 +5975,7 @@ ExpEmit FxRandomSeed::Emit(VMFunctionBuilder *build) build->Emit(OP_PARAM, 0, REGT_POINTER | REGT_KONST, build->GetConstantAddress(rng)); EmitParameter(build, seed, ScriptPosition); - build->Emit(opcode, build->GetConstantAddress(callfunc), 2, 1); + build->Emit(opcode, build->GetConstantAddress(callfunc), 2, 0); ExpEmit call; if (EmitTail) call.Final = true; From 757957bfac1577971ce32ba9d20cdea52c07990e Mon Sep 17 00:00:00 2001 From: Rachael Alexanderson Date: Sun, 4 Jun 2017 14:42:03 -0400 Subject: [PATCH 7/7] - prevent SetShaded action function from messing up the RGB-to-PAL conversion with a possible overflow - add RGB-to-PAL support for UDMF fillcolor property --- src/p_mobj.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index fc0abc373..e36ff1588 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3877,7 +3877,7 @@ bool AActor::IsOkayToAttack (AActor *link) void AActor::SetShade (uint32_t rgb) { PalEntry *entry = (PalEntry *)&rgb; - fillcolor = rgb | (ColorMatcher.Pick (entry->r, entry->g, entry->b) << 24); + fillcolor = (rgb & 0xffffff) | (ColorMatcher.Pick (entry->r, entry->g, entry->b) << 24); } void AActor::SetShade (int r, int g, int b) @@ -6062,7 +6062,8 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) if (mthing->score) mobj->Score = mthing->score; if (mthing->fillcolor) - mobj->fillcolor = mthing->fillcolor; + mobj->fillcolor = (mthing->fillcolor & 0xffffff) | (ColorMatcher.Pick((mthing->fillcolor & 0xff0000) >> 16, + (mthing->fillcolor & 0xff00) >> 8, (mthing->fillcolor & 0xff)) << 24); mobj->CallBeginPlay (); if (!(mobj->ObjectFlags & OF_EuthanizeMe))