mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-19 22:48:18 +00:00
Some graphic batching:
Speed up for displaying debugtext and envelopepreview (This reduces the performance hit especially for the 'Show Info' mode in the editor)
This commit is contained in:
parent
e29ced0741
commit
70a648899d
|
@ -137,14 +137,16 @@ void CGraph::Render(IGraphics *pGraphics, IGraphics::CTextureHandle FontTexture,
|
|||
pGraphics->LinesEnd();
|
||||
|
||||
pGraphics->TextureSet(FontTexture);
|
||||
pGraphics->QuadsText(x+2, y+h-16, 16, 1,1,1,1, pDescription);
|
||||
pGraphics->QuadsBegin();
|
||||
pGraphics->QuadsText(x+2, y+h-16, 16, pDescription);
|
||||
|
||||
char aBuf[32];
|
||||
str_format(aBuf, sizeof(aBuf), "%.2f", m_Max);
|
||||
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+2, 16, 1,1,1,1, aBuf);
|
||||
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+2, 16, aBuf);
|
||||
|
||||
str_format(aBuf, sizeof(aBuf), "%.2f", m_Min);
|
||||
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+h-16, 16, 1,1,1,1, aBuf);
|
||||
pGraphics->QuadsText(x+w-8*str_length(aBuf)-8, y+h-16, 16, aBuf);
|
||||
pGraphics->QuadsEnd();
|
||||
}
|
||||
|
||||
|
||||
|
@ -669,6 +671,7 @@ void CClient::DebugRender()
|
|||
//m_pGraphics->BlendNormal();
|
||||
Graphics()->TextureSet(m_DebugFont);
|
||||
Graphics()->MapScreen(0,0,Graphics()->ScreenWidth(),Graphics()->ScreenHeight());
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
if(time_get()-LastSnap > time_freq())
|
||||
{
|
||||
|
@ -690,7 +693,7 @@ void CClient::DebugRender()
|
|||
mem_stats()->total_allocations,
|
||||
Graphics()->MemoryUsage()/1024,
|
||||
(int)(1.0f/FrameTimeAvg + 0.5f));
|
||||
Graphics()->QuadsText(2, 2, 16, 1,1,1,1, aBuffer);
|
||||
Graphics()->QuadsText(2, 2, 16, aBuffer);
|
||||
|
||||
|
||||
{
|
||||
|
@ -706,7 +709,7 @@ void CClient::DebugRender()
|
|||
str_format(aBuffer, sizeof(aBuffer), "send: %3d %5d+%4d=%5d (%3d kbps) avg: %5d\nrecv: %3d %5d+%4d=%5d (%3d kbps) avg: %5d",
|
||||
SendPackets, SendBytes, SendPackets*42, SendTotal, (SendTotal*8)/1024, SendBytes/SendPackets,
|
||||
RecvPackets, RecvBytes, RecvPackets*42, RecvTotal, (RecvTotal*8)/1024, RecvBytes/RecvPackets);
|
||||
Graphics()->QuadsText(2, 14, 16, 1,1,1,1, aBuffer);
|
||||
Graphics()->QuadsText(2, 14, 16, aBuffer);
|
||||
}
|
||||
|
||||
// render rates
|
||||
|
@ -719,7 +722,7 @@ void CClient::DebugRender()
|
|||
{
|
||||
str_format(aBuffer, sizeof(aBuffer), "%4d %20s: %8d %8d %8d", i, GameClient()->GetItemName(i), m_SnapshotDelta.GetDataRate(i)/8, m_SnapshotDelta.GetDataUpdates(i),
|
||||
(m_SnapshotDelta.GetDataRate(i)/m_SnapshotDelta.GetDataUpdates(i))/8);
|
||||
Graphics()->QuadsText(2, 100+y*12, 16, 1,1,1,1, aBuffer);
|
||||
Graphics()->QuadsText(2, 100+y*12, 16, aBuffer);
|
||||
y++;
|
||||
}
|
||||
}
|
||||
|
@ -727,7 +730,8 @@ void CClient::DebugRender()
|
|||
|
||||
str_format(aBuffer, sizeof(aBuffer), "pred: %d ms",
|
||||
(int)((m_PredictedTime.Get(Now)-m_GameTime.Get(Now))*1000/(float)time_freq()));
|
||||
Graphics()->QuadsText(2, 70, 16, 1,1,1,1, aBuffer);
|
||||
Graphics()->QuadsText(2, 70, 16, aBuffer);
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
// render graphs
|
||||
if(g_Config.m_DbgGraphs)
|
||||
|
|
|
@ -630,13 +630,10 @@ void CGraphics_Threaded::QuadsDrawFreeform(const CFreeformItem *pArray, int Num)
|
|||
AddVertices(4*Num);
|
||||
}
|
||||
|
||||
void CGraphics_Threaded::QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText)
|
||||
void CGraphics_Threaded::QuadsText(float x, float y, float Size, const char *pText)
|
||||
{
|
||||
float StartX = x;
|
||||
|
||||
QuadsBegin();
|
||||
SetColor(r,g,b,a);
|
||||
|
||||
while(*pText)
|
||||
{
|
||||
char c = *pText;
|
||||
|
@ -660,8 +657,6 @@ void CGraphics_Threaded::QuadsText(float x, float y, float Size, float r, float
|
|||
x += Size/2;
|
||||
}
|
||||
}
|
||||
|
||||
QuadsEnd();
|
||||
}
|
||||
|
||||
int CGraphics_Threaded::IssueInit()
|
||||
|
|
|
@ -420,7 +420,7 @@ public:
|
|||
virtual void QuadsDraw(CQuadItem *pArray, int Num);
|
||||
virtual void QuadsDrawTL(const CQuadItem *pArray, int Num);
|
||||
virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num);
|
||||
virtual void QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText);
|
||||
virtual void QuadsText(float x, float y, float Size, const char *pText);
|
||||
|
||||
virtual void Minimize();
|
||||
virtual void Maximize();
|
||||
|
|
|
@ -142,7 +142,7 @@ public:
|
|||
: m_X0(x0), m_Y0(y0), m_X1(x1), m_Y1(y1), m_X2(x2), m_Y2(y2), m_X3(x3), m_Y3(y3) {}
|
||||
};
|
||||
virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) = 0;
|
||||
virtual void QuadsText(float x, float y, float Size, float r, float g, float b, float a, const char *pText) = 0;
|
||||
virtual void QuadsText(float x, float y, float Size, const char *pText) = 0;
|
||||
|
||||
struct CColorVertex
|
||||
{
|
||||
|
|
|
@ -1411,96 +1411,131 @@ void CEditor::DoQuadPoint(CQuad *pQuad, int QuadIndex, int V)
|
|||
Graphics()->QuadsDraw(&QuadItem, 1);
|
||||
}
|
||||
|
||||
void CEditor::DoQuadEnvelopes(CQuad *pQuad, int Index, IGraphics::CTextureHandle Texture)
|
||||
void CEditor::DoQuadEnvelopes(CQuad *pQuad, int Num, IGraphics::CTextureHandle Texture)
|
||||
{
|
||||
CEnvelope *pEnvelope = 0x0;
|
||||
if(pQuad->m_PosEnv >= 0 && pQuad->m_PosEnv < m_Map.m_lEnvelopes.size())
|
||||
pEnvelope = m_Map.m_lEnvelopes[pQuad->m_PosEnv];
|
||||
if (!pEnvelope)
|
||||
return;
|
||||
|
||||
//QuadParams
|
||||
CPoint *pPoints = pQuad->m_aPoints;
|
||||
CEnvelope **apEnvelope = new CEnvelope*[Num]();
|
||||
for(int i = 0; i < Num; i++)
|
||||
{
|
||||
if((m_ShowEnvelopePreview == 1 && pQuad[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == 2)
|
||||
if(pQuad[i].m_PosEnv >= 0 && pQuad[i].m_PosEnv < m_Map.m_lEnvelopes.size())
|
||||
apEnvelope[i] = m_Map.m_lEnvelopes[pQuad[i].m_PosEnv];
|
||||
}
|
||||
|
||||
//Draw Lines
|
||||
Graphics()->TextureClear();
|
||||
Graphics()->LinesBegin();
|
||||
Graphics()->SetColor(80.0f/255, 150.0f/255, 230.f/255, 0.5f);
|
||||
for(int i = 0; i < pEnvelope->m_lPoints.size()-1; i++)
|
||||
Graphics()->SetColor(80.0f/255, 150.0f/255, 230.f/255, 0.5f);
|
||||
for(int j = 0; j < Num; j++)
|
||||
{
|
||||
if(!apEnvelope[j])
|
||||
continue;
|
||||
|
||||
//QuadParams
|
||||
CPoint *pPoints = pQuad[j].m_aPoints;
|
||||
for(int i = 0; i < apEnvelope[j]->m_lPoints.size()-1; i++)
|
||||
{
|
||||
float OffsetX = fx2f(pEnvelope->m_lPoints[i].m_aValues[0]);
|
||||
float OffsetY = fx2f(pEnvelope->m_lPoints[i].m_aValues[1]);
|
||||
float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]);
|
||||
float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]);
|
||||
vec2 Pos0 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
|
||||
|
||||
OffsetX = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[0]);
|
||||
OffsetY = fx2f(pEnvelope->m_lPoints[i+1].m_aValues[1]);
|
||||
OffsetX = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[0]);
|
||||
OffsetY = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[1]);
|
||||
vec2 Pos1 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
|
||||
|
||||
IGraphics::CLineItem Line = IGraphics::CLineItem(Pos0.x, Pos0.y, Pos1.x, Pos1.y);
|
||||
Graphics()->LinesDraw(&Line, 1);
|
||||
}
|
||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
}
|
||||
Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
Graphics()->LinesEnd();
|
||||
|
||||
//Draw Quads
|
||||
for(int i = 0; i < pEnvelope->m_lPoints.size(); i++)
|
||||
Graphics()->TextureSet(Texture);
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
for(int j = 0; j < Num; j++)
|
||||
{
|
||||
Graphics()->TextureSet(Texture);
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
//Calc Env Position
|
||||
float OffsetX = fx2f(pEnvelope->m_lPoints[i].m_aValues[0]);
|
||||
float OffsetY = fx2f(pEnvelope->m_lPoints[i].m_aValues[1]);
|
||||
float Rot = fx2f(pEnvelope->m_lPoints[i].m_aValues[2])/360.0f*pi*2;
|
||||
if(!apEnvelope[j])
|
||||
continue;
|
||||
|
||||
//Set Colours
|
||||
float Alpha = (m_SelectedQuadEnvelope == pQuad->m_PosEnv && m_SelectedEnvelopePoint == i) ? 0.65f : 0.35f;
|
||||
IGraphics::CColorVertex aArray[4] = {
|
||||
IGraphics::CColorVertex(0, pQuad->m_aColors[0].r, pQuad->m_aColors[0].g, pQuad->m_aColors[0].b, Alpha),
|
||||
IGraphics::CColorVertex(1, pQuad->m_aColors[1].r, pQuad->m_aColors[1].g, pQuad->m_aColors[1].b, Alpha),
|
||||
IGraphics::CColorVertex(2, pQuad->m_aColors[2].r, pQuad->m_aColors[2].g, pQuad->m_aColors[2].b, Alpha),
|
||||
IGraphics::CColorVertex(3, pQuad->m_aColors[3].r, pQuad->m_aColors[3].g, pQuad->m_aColors[3].b, Alpha)};
|
||||
Graphics()->SetColorVertex(aArray, 4);
|
||||
//QuadParams
|
||||
CPoint *pPoints = pQuad[j].m_aPoints;
|
||||
|
||||
//Rotation
|
||||
if(Rot != 0)
|
||||
for(int i = 0; i < apEnvelope[j]->m_lPoints.size(); i++)
|
||||
{
|
||||
static CPoint aRotated[4];
|
||||
aRotated[0] = pQuad->m_aPoints[0];
|
||||
aRotated[1] = pQuad->m_aPoints[1];
|
||||
aRotated[2] = pQuad->m_aPoints[2];
|
||||
aRotated[3] = pQuad->m_aPoints[3];
|
||||
pPoints = aRotated;
|
||||
//Calc Env Position
|
||||
float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]);
|
||||
float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]);
|
||||
float Rot = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[2])/360.0f*pi*2;
|
||||
|
||||
Rotate(&pQuad->m_aPoints[4], &aRotated[0], Rot);
|
||||
Rotate(&pQuad->m_aPoints[4], &aRotated[1], Rot);
|
||||
Rotate(&pQuad->m_aPoints[4], &aRotated[2], Rot);
|
||||
Rotate(&pQuad->m_aPoints[4], &aRotated[3], Rot);
|
||||
//Set Colours
|
||||
float Alpha = (m_SelectedQuadEnvelope == pQuad[j].m_PosEnv && m_SelectedEnvelopePoint == i) ? 0.65f : 0.35f;
|
||||
IGraphics::CColorVertex aArray[4] = {
|
||||
IGraphics::CColorVertex(0, pQuad[j].m_aColors[0].r, pQuad[j].m_aColors[0].g, pQuad[j].m_aColors[0].b, Alpha),
|
||||
IGraphics::CColorVertex(1, pQuad[j].m_aColors[1].r, pQuad[j].m_aColors[1].g, pQuad[j].m_aColors[1].b, Alpha),
|
||||
IGraphics::CColorVertex(2, pQuad[j].m_aColors[2].r, pQuad[j].m_aColors[2].g, pQuad[j].m_aColors[2].b, Alpha),
|
||||
IGraphics::CColorVertex(3, pQuad[j].m_aColors[3].r, pQuad[j].m_aColors[3].g, pQuad[j].m_aColors[3].b, Alpha)};
|
||||
Graphics()->SetColorVertex(aArray, 4);
|
||||
|
||||
//Rotation
|
||||
if(Rot != 0)
|
||||
{
|
||||
static CPoint aRotated[4];
|
||||
aRotated[0] = pQuad[j].m_aPoints[0];
|
||||
aRotated[1] = pQuad[j].m_aPoints[1];
|
||||
aRotated[2] = pQuad[j].m_aPoints[2];
|
||||
aRotated[3] = pQuad[j].m_aPoints[3];
|
||||
pPoints = aRotated;
|
||||
|
||||
Rotate(&pQuad[j].m_aPoints[4], &aRotated[0], Rot);
|
||||
Rotate(&pQuad[j].m_aPoints[4], &aRotated[1], Rot);
|
||||
Rotate(&pQuad[j].m_aPoints[4], &aRotated[2], Rot);
|
||||
Rotate(&pQuad[j].m_aPoints[4], &aRotated[3], Rot);
|
||||
}
|
||||
|
||||
//Set Texture Coords
|
||||
Graphics()->QuadsSetSubsetFree(
|
||||
fx2f(pQuad[j].m_aTexcoords[0].x), fx2f(pQuad[j].m_aTexcoords[0].y),
|
||||
fx2f(pQuad[j].m_aTexcoords[1].x), fx2f(pQuad[j].m_aTexcoords[1].y),
|
||||
fx2f(pQuad[j].m_aTexcoords[2].x), fx2f(pQuad[j].m_aTexcoords[2].y),
|
||||
fx2f(pQuad[j].m_aTexcoords[3].x), fx2f(pQuad[j].m_aTexcoords[3].y)
|
||||
);
|
||||
|
||||
//Set Quad Coords & Draw
|
||||
IGraphics::CFreeformItem Freeform(
|
||||
fx2f(pPoints[0].x)+OffsetX, fx2f(pPoints[0].y)+OffsetY,
|
||||
fx2f(pPoints[1].x)+OffsetX, fx2f(pPoints[1].y)+OffsetY,
|
||||
fx2f(pPoints[2].x)+OffsetX, fx2f(pPoints[2].y)+OffsetY,
|
||||
fx2f(pPoints[3].x)+OffsetX, fx2f(pPoints[3].y)+OffsetY);
|
||||
Graphics()->QuadsDrawFreeform(&Freeform, 1);
|
||||
}
|
||||
|
||||
//Set Texture Coords
|
||||
Graphics()->QuadsSetSubsetFree(
|
||||
fx2f(pQuad->m_aTexcoords[0].x), fx2f(pQuad->m_aTexcoords[0].y),
|
||||
fx2f(pQuad->m_aTexcoords[1].x), fx2f(pQuad->m_aTexcoords[1].y),
|
||||
fx2f(pQuad->m_aTexcoords[2].x), fx2f(pQuad->m_aTexcoords[2].y),
|
||||
fx2f(pQuad->m_aTexcoords[3].x), fx2f(pQuad->m_aTexcoords[3].y)
|
||||
);
|
||||
|
||||
//Set Quad Coords & Draw
|
||||
IGraphics::CFreeformItem Freeform(
|
||||
fx2f(pPoints[0].x)+OffsetX, fx2f(pPoints[0].y)+OffsetY,
|
||||
fx2f(pPoints[1].x)+OffsetX, fx2f(pPoints[1].y)+OffsetY,
|
||||
fx2f(pPoints[2].x)+OffsetX, fx2f(pPoints[2].y)+OffsetY,
|
||||
fx2f(pPoints[3].x)+OffsetX, fx2f(pPoints[3].y)+OffsetY);
|
||||
Graphics()->QuadsDrawFreeform(&Freeform, 1);
|
||||
|
||||
Graphics()->QuadsEnd();
|
||||
|
||||
Graphics()->TextureClear();
|
||||
Graphics()->QuadsBegin();
|
||||
DoQuadEnvPoint(pQuad, Index, i);
|
||||
Graphics()->QuadsEnd();
|
||||
}
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->TextureClear();
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
// Draw QuadPoints
|
||||
for(int j = 0; j < Num; j++)
|
||||
{
|
||||
if(!apEnvelope[j])
|
||||
continue;
|
||||
|
||||
//QuadParams
|
||||
CPoint *pPoints = pQuad[j].m_aPoints;
|
||||
for(int i = 0; i < apEnvelope[j]->m_lPoints.size()-1; i++)
|
||||
{
|
||||
float OffsetX = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[0]);
|
||||
float OffsetY = fx2f(apEnvelope[j]->m_lPoints[i].m_aValues[1]);
|
||||
vec2 Pos0 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
|
||||
|
||||
OffsetX = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[0]);
|
||||
OffsetY = fx2f(apEnvelope[j]->m_lPoints[i+1].m_aValues[1]);
|
||||
vec2 Pos1 = vec2(fx2f(pPoints[4].x)+OffsetX, fx2f(pPoints[4].y)+OffsetY);
|
||||
|
||||
DoQuadEnvPoint(&pQuad[j], j, i);
|
||||
}
|
||||
}
|
||||
Graphics()->QuadsEnd();
|
||||
}
|
||||
|
||||
void CEditor::DoQuadEnvPoint(CQuad *pQuad, int QIndex, int PIndex)
|
||||
|
@ -2096,12 +2131,12 @@ void CEditor::DoMapEditor(CUIRect View, CUIRect ToolBar)
|
|||
if(pLayer->m_Image >= 0 && pLayer->m_Image < m_Map.m_lImages.size())
|
||||
Texture = m_Map.m_lImages[pLayer->m_Image]->m_Texture;
|
||||
|
||||
for(int i = 0; i < pLayer->m_lQuads.size(); i++)
|
||||
/*for(int i = 0; i < pLayer->m_lQuads.size(); i++)
|
||||
{
|
||||
if((m_ShowEnvelopePreview == 1 && pLayer->m_lQuads[i].m_PosEnv == m_SelectedEnvelope) || m_ShowEnvelopePreview == 2)
|
||||
DoQuadEnvelopes(&pLayer->m_lQuads[i], i, Texture);
|
||||
}
|
||||
|
||||
}*/
|
||||
DoQuadEnvelopes(&pLayer->m_lQuads[0], pLayer->m_lQuads.size(), Texture);
|
||||
m_ShowEnvelopePreview = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -755,7 +755,7 @@ public:
|
|||
|
||||
vec4 ButtonColorMul(const void *pID);
|
||||
|
||||
void DoQuadEnvelopes(CQuad *pQuad, int Index, IGraphics::CTextureHandle Texture = IGraphics::CTextureHandle());
|
||||
void DoQuadEnvelopes(CQuad *pQuad, int Num, IGraphics::CTextureHandle Texture = IGraphics::CTextureHandle());
|
||||
void DoQuadEnvPoint(CQuad *pQuad, int QIndex, int pIndex);
|
||||
void DoQuadPoint(CQuad *pQuad, int QuadIndex, int v);
|
||||
|
||||
|
|
|
@ -337,6 +337,7 @@ void CLayerTiles::ShowInfo()
|
|||
float ScreenX0, ScreenY0, ScreenX1, ScreenY1;
|
||||
Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1);
|
||||
Graphics()->TextureSet(m_pEditor->Client()->GetDebugFont());
|
||||
Graphics()->QuadsBegin();
|
||||
|
||||
int StartY = max(0, (int)(ScreenY0/32.0f)-1);
|
||||
int StartX = max(0, (int)(ScreenX0/32.0f)-1);
|
||||
|
@ -351,17 +352,18 @@ void CLayerTiles::ShowInfo()
|
|||
{
|
||||
char aBuf[64];
|
||||
str_format(aBuf, sizeof(aBuf), "%i", m_pTiles[c].m_Index);
|
||||
m_pEditor->Graphics()->QuadsText(x*32, y*32, 16.0f, 1,1,1,1, aBuf);
|
||||
m_pEditor->Graphics()->QuadsText(x*32, y*32, 16.0f, aBuf);
|
||||
|
||||
char aFlags[4] = { m_pTiles[c].m_Flags&TILEFLAG_VFLIP ? 'V' : ' ',
|
||||
m_pTiles[c].m_Flags&TILEFLAG_HFLIP ? 'H' : ' ',
|
||||
m_pTiles[c].m_Flags&TILEFLAG_ROTATE? 'R' : ' ',
|
||||
0};
|
||||
m_pEditor->Graphics()->QuadsText(x*32, y*32+16, 16.0f, 1,1,1,1, aFlags);
|
||||
m_pEditor->Graphics()->QuadsText(x*32, y*32+16, 16.0f, aFlags);
|
||||
}
|
||||
x += m_pTiles[c].m_Skip;
|
||||
}
|
||||
|
||||
Graphics()->QuadsEnd();
|
||||
Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue