diff --git a/src/background2d.cpp b/src/background2d.cpp index 2b2eb12c..fefa07ef 100644 --- a/src/background2d.cpp +++ b/src/background2d.cpp @@ -106,7 +106,7 @@ void Background2D::Render(int bgId, int layer) { } const int renderType = ScrWork[SW_BG1FADETYPE + ScrWorkBgStructSize * bgId]; - BackgroundRenderTable[renderType](this, col); + std::invoke(BackgroundRenderTable[renderType], this, col); } void Background2D::RenderCapture(int capId, int layer) { @@ -123,7 +123,7 @@ void Background2D::RenderCapture(int capId, int layer) { const int renderType = ScrWork[SW_CAP1FADETYPE + ScrWorkCaptureStructSize * capId]; - BackgroundRenderTable[renderType](this, col); + std::invoke(BackgroundRenderTable[renderType], this, col); } void Background2D::RenderBgEff(int bgId, int layer) { @@ -151,61 +151,59 @@ void Background2D::RenderBgEff(int bgId, int layer) { 256.0f; const int renderType = ScrWork[SW_BGEFF1_MODE + structSize * bgId]; - BackgroundRenderTable[renderType](this, col); + std::invoke(BackgroundRenderTable[renderType], this, col); } -BackgroundRenderer(RenderRegular) { - Renderer->DrawSprite( - bg->BgSprite, - RectF(bg->DisplayCoords.x, bg->DisplayCoords.y, - bg->BgSprite.ScaledWidth(), bg->BgSprite.ScaledHeight()), - col, 0.0f, false, bg->IsScreencap); +void Background2D::RenderRegular(glm::vec4 col) { + Renderer->DrawSprite(BgSprite, + RectF(DisplayCoords.x, DisplayCoords.y, + BgSprite.ScaledWidth(), BgSprite.ScaledHeight()), + col, 0.0f, false, IsScreencap); for (int i = 0; i < MaxLinkedBgBuffers; i++) { - if (bg->Links[i].Direction != LD_Off && bg->Links[i].LinkedBuffer != NULL) { + if (Links[i].Direction != LD_Off && Links[i].LinkedBuffer != NULL) { Renderer->DrawSprite( - bg->Links[i].LinkedBuffer->BgSprite, - RectF(bg->Links[i].DisplayCoords.x, bg->Links[i].DisplayCoords.y, - bg->Links[i].LinkedBuffer->BgSprite.ScaledWidth(), - bg->Links[i].LinkedBuffer->BgSprite.ScaledHeight()), - col, 0.0f, false, bg->Links[i].LinkedBuffer->IsScreencap); + Links[i].LinkedBuffer->BgSprite, + RectF(Links[i].DisplayCoords.x, Links[i].DisplayCoords.y, + Links[i].LinkedBuffer->BgSprite.ScaledWidth(), + Links[i].LinkedBuffer->BgSprite.ScaledHeight()), + col, 0.0f, false, Links[i].LinkedBuffer->IsScreencap); } } } -BackgroundRenderer(RenderMasked) { +void Background2D::RenderMasked(glm::vec4 col) { Renderer->DrawMaskedSprite( - bg->BgSprite, Masks2D[bg->MaskNumber].MaskSprite, - RectF(bg->DisplayCoords.x, bg->DisplayCoords.y, - bg->BgSprite.ScaledWidth(), bg->BgSprite.ScaledHeight()), - col, bg->FadeCount, bg->FadeRange, bg->IsScreencap); + BgSprite, Masks2D[MaskNumber].MaskSprite, + RectF(DisplayCoords.x, DisplayCoords.y, BgSprite.ScaledWidth(), + BgSprite.ScaledHeight()), + col, FadeCount, FadeRange, IsScreencap); } -BackgroundRenderer(RenderMaskedInverted) { +void Background2D::RenderMaskedInverted(glm::vec4 col) { Renderer->DrawMaskedSprite( - bg->BgSprite, Masks2D[bg->MaskNumber].MaskSprite, - RectF(bg->DisplayCoords.x, bg->DisplayCoords.y, - bg->BgSprite.ScaledWidth(), bg->BgSprite.ScaledHeight()), - col, bg->FadeCount, bg->FadeRange, bg->IsScreencap, true); + BgSprite, Masks2D[MaskNumber].MaskSprite, + RectF(DisplayCoords.x, DisplayCoords.y, BgSprite.ScaledWidth(), + BgSprite.ScaledHeight()), + col, FadeCount, FadeRange, IsScreencap, true); } -BackgroundRenderer(RenderFade) { - col.a *= bg->FadeCount / 256.0f; +void Background2D::RenderFade(glm::vec4 col) { + col.a *= FadeCount / 256.0f; - Renderer->DrawSprite( - bg->BgSprite, - RectF(bg->DisplayCoords.x, bg->DisplayCoords.y, - bg->BgSprite.ScaledWidth(), bg->BgSprite.ScaledHeight()), - col, 0.0f, false, bg->IsScreencap); + Renderer->DrawSprite(BgSprite, + RectF(DisplayCoords.x, DisplayCoords.y, + BgSprite.ScaledWidth(), BgSprite.ScaledHeight()), + col, 0.0f, false, IsScreencap); for (int i = 0; i < MaxLinkedBgBuffers; i++) { - if (bg->Links[i].Direction != LD_Off && bg->Links[i].LinkedBuffer != NULL) { + if (Links[i].Direction != LD_Off && Links[i].LinkedBuffer != NULL) { Renderer->DrawSprite( - bg->Links[i].LinkedBuffer->BgSprite, - RectF(bg->Links[i].DisplayCoords.x, bg->Links[i].DisplayCoords.y, - bg->Links[i].LinkedBuffer->BgSprite.ScaledWidth(), - bg->Links[i].LinkedBuffer->BgSprite.ScaledHeight()), - col, 0.0f, false, bg->Links[i].LinkedBuffer->IsScreencap); + Links[i].LinkedBuffer->BgSprite, + RectF(Links[i].DisplayCoords.x, Links[i].DisplayCoords.y, + Links[i].LinkedBuffer->BgSprite.ScaledWidth(), + Links[i].LinkedBuffer->BgSprite.ScaledHeight()), + col, 0.0f, false, Links[i].LinkedBuffer->IsScreencap); } } } diff --git a/src/background2d.h b/src/background2d.h index 00927003..1a554b92 100644 --- a/src/background2d.h +++ b/src/background2d.h @@ -5,8 +5,6 @@ #include "spritesheet.h" #include "loadable.h" -#define BackgroundRenderer(name) void name(Background2D* bg, glm::vec4 col) - namespace Impacto { enum LinkDirection { @@ -67,9 +65,47 @@ class Background2D : public Loadable { private: Texture BgTexture; SpriteSheet BgSpriteSheet; -}; -typedef void (*BackgroundRenderProc)(Background2D* bg, glm::vec4 col); + using BackgroundRenderProc = void (Background2D::*)(glm::vec4 col); + + void RenderRegular(glm::vec4 col); + void RenderMasked(glm::vec4 col); + void RenderMaskedInverted(glm::vec4 col); + void RenderFade(glm::vec4 col); + + BackgroundRenderProc constexpr static BackgroundRenderTable[30] = { + &Background2D::RenderRegular, // 0 + &Background2D::RenderFade, // 1 + &Background2D::RenderRegular, // 2 + &Background2D::RenderRegular, // 3 + &Background2D::RenderRegular, // 4 + &Background2D::RenderRegular, // 5 + &Background2D::RenderRegular, // 6 + &Background2D::RenderRegular, // 7 + &Background2D::RenderRegular, // 8 + &Background2D::RenderRegular, // 9 + &Background2D::RenderRegular, // 10 + &Background2D::RenderRegular, // 11 + &Background2D::RenderRegular, // 12 + &Background2D::RenderRegular, // 13 + &Background2D::RenderRegular, // 14 + &Background2D::RenderMasked, // 15 + &Background2D::RenderMaskedInverted, // 16 + &Background2D::RenderRegular, // 17 + &Background2D::RenderRegular, // 18 + &Background2D::RenderRegular, // 19 + &Background2D::RenderRegular, // 20 + &Background2D::RenderRegular, // 21 + &Background2D::RenderRegular, // 22 + &Background2D::RenderRegular, // 23 + &Background2D::RenderRegular, // 24 + &Background2D::RenderRegular, // 25 + &Background2D::RenderRegular, // 26 + &Background2D::RenderRegular, // 27 + &Background2D::RenderRegular, // 28 + &Background2D::RenderRegular, // 29 + }; +}; int constexpr MaxBackgrounds2D = 8; int constexpr MaxScreencaptures = 2; @@ -80,42 +116,4 @@ inline Background2D ShaderScreencapture; inline ska::flat_hash_map Backgrounds2D; -BackgroundRenderer(RenderRegular); -BackgroundRenderer(RenderMasked); -BackgroundRenderer(RenderMaskedInverted); -BackgroundRenderer(RenderFade); - -BackgroundRenderProc static BackgroundRenderTable[30] = { - RenderRegular, // 0 - RenderFade, // 1 - RenderRegular, // 2 - RenderRegular, // 3 - RenderRegular, // 4 - RenderRegular, // 5 - RenderRegular, // 6 - RenderRegular, // 7 - RenderRegular, // 8 - RenderRegular, // 9 - RenderRegular, // 10 - RenderRegular, // 11 - RenderRegular, // 12 - RenderRegular, // 13 - RenderRegular, // 14 - RenderMasked, // 15 - RenderMaskedInverted, // 16 - RenderRegular, // 17 - RenderRegular, // 18 - RenderRegular, // 19 - RenderRegular, // 20 - RenderRegular, // 21 - RenderRegular, // 22 - RenderRegular, // 23 - RenderRegular, // 24 - RenderRegular, // 25 - RenderRegular, // 26 - RenderRegular, // 27 - RenderRegular, // 28 - RenderRegular, // 29 -}; - } // namespace Impacto \ No newline at end of file