From a2c389052756ce978bb2e0e8593ef7d3ef4cc81a Mon Sep 17 00:00:00 2001 From: d1str4ught <> Date: Sat, 23 Aug 2025 00:16:24 +0200 Subject: [PATCH] batched text rendering --- src/EterLib/GrpTextInstance.cpp | 48 +++++++++++++++++---------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/src/EterLib/GrpTextInstance.cpp b/src/EterLib/GrpTextInstance.cpp index 81c1451..420fbbd 100644 --- a/src/EterLib/GrpTextInstance.cpp +++ b/src/EterLib/GrpTextInstance.cpp @@ -3,9 +3,11 @@ #include "StateManager.h" #include "IME.h" #include "TextTag.h" -#include "../EterLocale/StringCodec.h" -#include "../EterBase/Utils.h" -#include "../EterLocale/Arabic.h" +#include "EterLocale/StringCodec.h" +#include "EterBase/Utils.h" +#include "EterLocale/Arabic.h" + +#include extern DWORD GetDefaultCodePage(); @@ -530,7 +532,10 @@ void CGraphicTextInstance::Render(RECT * pClipRect) break; } - //WORD FillRectIndices[6] = { 0, 2, 1, 2, 3, 1 }; + static std::unordered_map> s_vtxBatches; + for (auto& [pTexture, vtxBatch] : s_vtxBatches) { + vtxBatch.clear(); + } STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); @@ -615,7 +620,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect) fFontEy = fFontSy + fFontHeight; pFontTexture->SelectTexture(pCurCharInfo->index); - STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture()); + std::vector& vtxBatch = s_vtxBatches[pFontTexture->GetD3DTexture()]; akVertex[0].u=pCurCharInfo->left; akVertex[0].v=pCurCharInfo->top; @@ -641,9 +646,8 @@ void CGraphicTextInstance::Render(RECT * pClipRect) akVertex[1].x=fFontSx-fFontHalfWeight-feather; akVertex[2].x=fFontEx-fFontHalfWeight+feather; akVertex[3].x=fFontEx-fFontHalfWeight+feather; - - if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) - STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + + vtxBatch.insert(vtxBatch.end(), std::begin(akVertex), std::end(akVertex)); // 오른 @@ -652,8 +656,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect) akVertex[2].x=fFontEx+fFontHalfWeight+feather; akVertex[3].x=fFontEx+fFontHalfWeight+feather; - if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) - STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + vtxBatch.insert(vtxBatch.end(), std::begin(akVertex), std::end(akVertex)); akVertex[0].x=fFontSx-feather; akVertex[1].x=fFontSx-feather; @@ -666,9 +669,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect) akVertex[2].y=fFontSy-fFontHalfWeight-feather; akVertex[3].y=fFontEy-fFontHalfWeight+feather; - // 20041216.myevan.DrawPrimitiveUP - if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) - STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + vtxBatch.insert(vtxBatch.end(), std::begin(akVertex), std::end(akVertex)); // 아래 akVertex[0].y=fFontSy+fFontHalfWeight-feather; @@ -676,9 +677,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect) akVertex[2].y=fFontSy+fFontHalfWeight-feather; akVertex[3].y=fFontEy+fFontHalfWeight+feather; - // 20041216.myevan.DrawPrimitiveUP - if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) - STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); + vtxBatch.insert(vtxBatch.end(), std::begin(akVertex), std::end(akVertex)); fCurX += fFontAdvance; } @@ -727,7 +726,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect) fFontEy = fFontSy + fFontHeight; pFontTexture->SelectTexture(pCurCharInfo->index); - STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture()); + std::vector& vtxBatch = s_vtxBatches[pFontTexture->GetD3DTexture()]; akVertex[0].x=fFontSx; akVertex[0].y=fFontSy; @@ -749,19 +748,22 @@ void CGraphicTextInstance::Render(RECT * pClipRect) akVertex[3].u=pCurCharInfo->right; akVertex[3].v=pCurCharInfo->bottom; - //m_dwColorInfoVector[i]; - //m_dwTextColor; akVertex[0].color = akVertex[1].color = akVertex[2].color = akVertex[3].color = m_dwColorInfoVector[i]; - // 20041216.myevan.DrawPrimitiveUP - if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) - STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); - //STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, akVertex, sizeof(SVertex)); + vtxBatch.insert(vtxBatch.end(), std::begin(akVertex), std::end(akVertex)); fCurX += fFontAdvance; } } + for (const auto& [pTexture, vtxBatch] : s_vtxBatches) { + if (vtxBatch.empty()) + continue; + + STATEMANAGER.SetTexture(0, pTexture); + STATEMANAGER.DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, vtxBatch.size() - 2, vtxBatch.data(), sizeof(SVertex)); + } + if (m_isCursor) { // Draw Cursor