diff --git a/src/d_main.cpp b/src/d_main.cpp index 2ba45fe1d..80a37b21e 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -900,7 +900,6 @@ void D_Display () NetUpdate (); // send out any new accumulation // normal update // draw ZScript UI stuff - //E_RenderOverlay(); C_DrawConsole (hw2d); // draw console M_Drawer (); // menu is drawn even on top of everything FStat::PrintStat (); diff --git a/src/events.cpp b/src/events.cpp index 5a40a3983..970b68da5 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -448,6 +448,12 @@ void E_Console(int player, FString name, int arg1, int arg2, int arg3, bool manu handler->ConsoleProcess(player, name, arg1, arg2, arg3, manual); } +void E_RenderOverlay(EHudState state) +{ + for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + handler->RenderOverlay(state); +} + bool E_CheckUiProcessors() { for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) @@ -468,7 +474,6 @@ bool E_CheckRequireMouse() // normal event loopers (non-special, argument-less) DEFINE_EVENT_LOOPER(RenderFrame) -DEFINE_EVENT_LOOPER(RenderOverlay) DEFINE_EVENT_LOOPER(WorldLightning) DEFINE_EVENT_LOOPER(WorldTick) DEFINE_EVENT_LOOPER(UiTick) @@ -798,7 +803,7 @@ void DStaticEventHandler::RenderFrame() } } -void DStaticEventHandler::RenderOverlay() +void DStaticEventHandler::RenderOverlay(EHudState state) { IFVIRTUAL(DStaticEventHandler, RenderOverlay) { @@ -806,6 +811,7 @@ void DStaticEventHandler::RenderOverlay() if (func == DStaticEventHandler_RenderOverlay_VMPtr) return; FRenderEvent e = E_SetupRenderEvent(); + e.HudState = int(state); VMValue params[2] = { (DStaticEventHandler*)this, &e }; GlobalVMStack.Call(func, params, 2, nullptr, 0, nullptr); } diff --git a/src/events.h b/src/events.h index a2f014a32..5ef7f85aa 100755 --- a/src/events.h +++ b/src/events.h @@ -5,6 +5,7 @@ #include "serializer.h" #include "d_event.h" #include "d_gui.h" +#include "sbar.h" class DStaticEventHandler; @@ -48,7 +49,7 @@ void E_UiTick(); // called on each render frame once. void E_RenderFrame(); // called after everything's been rendered, but before console/menus -void E_RenderOverlay(); +void E_RenderOverlay(EHudState state); // this executes when a player enters the level (once). PlayerEnter+inhub = RETURN void E_PlayerEntered(int num, bool fromhub); // this executes when a player respawns. includes resurrect cheat. @@ -141,7 +142,7 @@ public: // void RenderFrame(); - void RenderOverlay(); + void RenderOverlay(EHudState state); // void PlayerEntered(int num, bool fromhub); @@ -175,6 +176,7 @@ struct FRenderEvent DAngle ViewRoll; double FracTic = 0; // 0..1 value that describes where we are inside the current gametic, render-wise. AActor* Camera = nullptr; + int HudState; }; struct FWorldEvent diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index adec61bf5..1cb3fe32c 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -61,6 +61,7 @@ #include "p_acs.h" #include "r_data/r_translate.h" #include "sbarinfo.h" +#include "events.h" #include "../version.h" @@ -975,7 +976,14 @@ void DBaseStatusBar::Draw (EHudState state) } if (idmypos) - { // Draw current coordinates + { + // Draw current coordinates + IFVIRTUAL(DBaseStatusBar, DrawMyPos) + { + VMValue params[] = { (DObject*)this }; + GlobalVMStack.Call(func, params, countof(params), nullptr, 0); + } + V_SetBorderNeedRefresh(); } if (viewactive) @@ -1150,6 +1158,8 @@ void DBaseStatusBar::DrawTopStuff (EHudState state) DrawMessages (HUDMSGLayer_OverMap, (state == HUD_StatusBar) ? GetTopOfStatusbar() : SCREENHEIGHT); } DrawMessages (HUDMSGLayer_OverHUD, (state == HUD_StatusBar) ? GetTopOfStatusbar() : SCREENHEIGHT); + E_RenderOverlay(state); + DrawConsistancy (); DrawWaiting (); if (ShowLog && MustDrawLog(state)) DrawLog (); diff --git a/wadsrc/static/zscript/events.txt b/wadsrc/static/zscript/events.txt index 0c0947f45..f3a281e0c 100755 --- a/wadsrc/static/zscript/events.txt +++ b/wadsrc/static/zscript/events.txt @@ -305,7 +305,7 @@ class StaticEventHandler : Object native play version("2.4") // //virtual native ui void RenderFrame(RenderEvent e); - //virtual native ui void RenderOverlay(RenderEvent e); + virtual native ui void RenderOverlay(RenderEvent e); // virtual native void PlayerEntered(PlayerEvent e); diff --git a/wadsrc/static/zscript/statusbar/statusbar.txt b/wadsrc/static/zscript/statusbar/statusbar.txt index 8a7476f8f..238e177bb 100644 --- a/wadsrc/static/zscript/statusbar/statusbar.txt +++ b/wadsrc/static/zscript/statusbar/statusbar.txt @@ -682,59 +682,30 @@ class BaseStatusBar native ui virtual void DrawMyPos() { - /* - int height = SmallFont->GetHeight(); - char labels[3] = { 'X', 'Y', 'Z' }; + int height = SmallFont.GetHeight(); int i; int vwidth; int vheight; int xpos; int y; + let scalevec = GetHUDScale(); + int scale = int(scalevec.X); - if (active_con_scaletext() == 1) - { - vwidth = SCREENWIDTH; - vheight = SCREENHEIGHT; - xpos = vwidth - 80; - y = SBarTop - height; - } - else if (active_con_scaletext() > 1) - { - vwidth = SCREENWIDTH / active_con_scaletext(); - vheight = SCREENHEIGHT / active_con_scaletext(); - xpos = vwidth - SmallFont->StringWidth("X: -00000")-6; - y = SBarTop/4 - height; - } - else - { - vwidth = SCREENWIDTH/2; - vheight = SCREENHEIGHT/2; - xpos = vwidth - SmallFont->StringWidth("X: -00000")-6; - y = SBarTop/2 - height; - } + vwidth = screen.GetWidth() / scale; + vheight = screen.GetHeight() / scale; + xpos = vwidth - SmallFont.StringWidth("X: -00000")-6; + y = GetTopOfStatusBar() / (3*scale) - height; - if (gameinfo.gametype == GAME_Strife) + Vector3 pos = CPlayer.mo.Pos; + + for (i = 0; i < 3; y += height, ++i) { - if (active_con_scaletext() == 1) - y -= height * 4; - else if (active_con_scaletext() > 3) - y -= height; - else - y -= height * 2; + double v = i == 0? pos.X : i == 1? pos.Y : pos.Z; + String line = String.Format("%c: %d", int("X") + i, v); + screen.DrawText (SmallFont, Font.CR_GREEN, xpos, y, line, DTA_KeepRatio, true, + DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight); } - - DVector3 pos = CPlayer->mo->Pos(); - for (i = 2; i >= 0; y -= height, --i) - { - mysnprintf (line, countof(line), "%c: %d", labels[i], int(pos[i])); - screen->DrawText (SmallFont, CR_GREEN, xpos, y, line, - DTA_KeepRatio, true, - DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, - TAG_DONE); - V_SetBorderNeedRefresh(); - } - */ } //============================================================================