Skip to content

Commit

Permalink
Batch draw calls in Underworld
Browse files Browse the repository at this point in the history
  • Loading branch information
TheIndra55 committed Aug 17, 2024
1 parent 4287fb4 commit 92e690c
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 3 deletions.
2 changes: 1 addition & 1 deletion premake5.lua
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ project "TRAE-menu-hook"
targetname "TRAE-Menu-Hook"

filter "platforms:TR8"
defines { "TR8" }
defines { "TR8", "BATCH_DRAW_CALLS" }
targetname "TR8-Menu-Hook"

-- Tests
Expand Down
5 changes: 5 additions & 0 deletions src/Hook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "game/Game.h"
#include "render/Font.h"
#include "game/GameLoop.h"
#include "render/DrawBatcher.h"

// Modules
#include "modules/MainMenu.h"
Expand Down Expand Up @@ -99,6 +100,10 @@ void Hook::OnFrame()
{
mod->OnFrame();
}

#ifdef BATCH_DRAW_CALLS
DrawBatcher::GetInstance()->Flush();
#endif
}

void Hook::OnLoop()
Expand Down
11 changes: 9 additions & 2 deletions src/render/Draw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ inline void TransformToLineVertex(LINEVERTEX* v, cdc::Vector3* vec)
#endif
}

#ifndef BATCH_DRAW_CALLS
inline void DrawTriangles(DRAWVERTEX* verts, int numtris)
{
DRAW_DrawTriangles(2, 0, verts, numtris);
}
#endif

void DrawTriangle(cdc::Vector3* v0, cdc::Vector3* v1, cdc::Vector3* v2, int color)
{
DRAWVERTEX verts[3];
Expand All @@ -105,7 +112,7 @@ void DrawTriangle(cdc::Vector3* v0, cdc::Vector3* v1, cdc::Vector3* v2, int colo
verts[1].color = color;
verts[2].color = color;

DRAW_DrawTriangles(2, 0, verts, 1);
DrawTriangles(verts, 1);
}

void DrawPlane(cdc::Vector3* v0, cdc::Vector3* v1, int color)
Expand All @@ -129,7 +136,7 @@ void DrawPlane(cdc::Vector3* v0, cdc::Vector3* v1, int color)
verts[4].color = color;
verts[5].color = color;

DRAW_DrawTriangles(2, 0, verts, 2);
DrawTriangles(verts, 2);
}

void DrawLine(cdc::Vector3* v0, cdc::Vector3* v1, int color)
Expand Down
2 changes: 2 additions & 0 deletions src/render/Draw.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ void DRAW_DrawLines(LINEVERTEX* verts, int numlines);
void TransformToDrawVertex(DRAWVERTEX* v, cdc::Vector3* vec);
void TransformToLineVertex(LINEVERTEX* v, cdc::Vector3* vec);

void DrawTriangles(DRAWVERTEX* verts, int numtris);

void DrawTriangle(cdc::Vector3* v0, cdc::Vector3* v1, cdc::Vector3* v2, int color);
void DrawPlane(cdc::Vector3* v0, cdc::Vector3* v1, int color);
void DrawLine(cdc::Vector3* v0, cdc::Vector3* v1, int color);
Expand Down
55 changes: 55 additions & 0 deletions src/render/DrawBatcher.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#include "DrawBatcher.h"

DrawBatcher* DrawBatcher::s_batcher = nullptr;

DrawBatcher::DrawBatcher() : m_vertices()
{
m_vertices.reserve(0x2000);
}

void DrawBatcher::DrawTriangles(DRAWVERTEX* verts, int numtris) noexcept
{
auto numVerts = numtris * 3;

// Prevent allocations
if (m_vertices.size() + numVerts >= m_vertices.capacity())
{
Flush();
}

// Add to batch
for (int i = 0; i < numVerts; i++)
{
m_vertices.push_back(verts[i]);
}
}

void DrawBatcher::Flush() noexcept
{
if (m_vertices.size() > 0)
{
DRAW_DrawTriangles(2, 0, m_vertices.data(), m_vertices.size() / 3);

m_vertices.clear();
}
}

DrawBatcher* DrawBatcher::GetInstance()
{
// Since this is hot code which is called a lot during a frame
// there's a manual singleton here instead of a C++11 standard one
// which uses thread local storage
if (s_batcher == nullptr)
{
s_batcher = new DrawBatcher();
}

return s_batcher;
}

#ifdef BATCH_DRAW_CALLS
void DrawTriangles(DRAWVERTEX* verts, int numtris)
{
DrawBatcher::GetInstance()->DrawTriangles(verts, numtris);
}
#endif
22 changes: 22 additions & 0 deletions src/render/DrawBatcher.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include <vector>

#include "Draw.h"

// Batcher for DRAW_ calls to limit the amount of draw calls sent to the GPU
class DrawBatcher
{
private:
std::vector<DRAWVERTEX> m_vertices;

static DrawBatcher* s_batcher;

public:
DrawBatcher();

void DrawTriangles(DRAWVERTEX* verts, int numtris) noexcept;
void Flush() noexcept;

static DrawBatcher* GetInstance();
};

0 comments on commit 92e690c

Please sign in to comment.