Skip to content

Commit 6fb7496

Browse files
committed
fix: batch overlay render meshes
just did it for trace before, now it works for everything. this relies on the mesh being passed by-reference. if it's not, then it will spam new meshes for each vertex after the batch count.... but it won't crash!
1 parent 67db4b1 commit 6fb7496

File tree

5 files changed

+30
-43
lines changed

5 files changed

+30
-43
lines changed

src/Features/Demo/GhostRenderer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ void GhostRenderer::UpdateAnimatedVerts() {
137137
}
138138

139139

140-
void GhostRenderer::Draw(MeshId mesh) {
140+
void GhostRenderer::Draw(MeshId &mesh) {
141141
if (ghost == nullptr) return;
142142

143143
//update verts before drawing

src/Features/Demo/GhostRenderer.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class GhostRenderer {
2121
public:
2222
GhostRenderer();
2323
void SetGhost(GhostEntity *ghost);
24-
void Draw(MeshId mesh);
24+
void Draw(MeshId &mesh);
2525
void StartGesture(int id);
2626
float GetHeight();
2727
};

src/Features/OverlayRender.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,22 +143,28 @@ MeshId OverlayRender::createMesh(RenderCallback solid, RenderCallback wireframe)
143143
return id;
144144
}
145145

146-
void OverlayRender::addTriangle(MeshId mesh, Vector a, Vector b, Vector c, bool cull_back) {
146+
void OverlayRender::addTriangle(MeshId &mesh, Vector a, Vector b, Vector c, bool cull_back) {
147+
if (g_meshes[mesh].num_points_in_pos >= 8192) {
148+
mesh = OverlayRender::createMesh(g_meshes[mesh].solid, g_meshes[mesh].wireframe);
149+
}
147150
auto &vs = g_meshes[mesh].tri_verts;
148151
vs.insert(vs.end(), { a, b, c });
149152
if (!cull_back) vs.insert(vs.end(), { a, c, b });
150153
g_meshes[mesh].pos += (a + b + c) / 3.0;
151154
g_meshes[mesh].num_points_in_pos += 1;
152155
}
153156

154-
void OverlayRender::addLine(MeshId mesh, Vector a, Vector b) {
157+
void OverlayRender::addLine(MeshId &mesh, Vector a, Vector b) {
158+
if (g_meshes[mesh].num_points_in_pos >= 8192) {
159+
mesh = OverlayRender::createMesh(g_meshes[mesh].solid, g_meshes[mesh].wireframe);
160+
}
155161
auto &vs = g_meshes[mesh].line_verts;
156162
vs.insert(vs.end(), { a, b });
157163
g_meshes[mesh].pos += (a + b) / 2.0;
158164
g_meshes[mesh].num_points_in_pos += 1;
159165
}
160166

161-
void OverlayRender::addQuad(MeshId mesh, Vector a, Vector b, Vector c, Vector d, bool cull_back) {
167+
void OverlayRender::addQuad(MeshId &mesh, Vector a, Vector b, Vector c, Vector d, bool cull_back) {
162168
OverlayRender::addTriangle(mesh, a, b, c, cull_back);
163169
OverlayRender::addTriangle(mesh, a, c, d, cull_back);
164170
}

src/Features/OverlayRender.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ namespace OverlayRender {
3737
MeshId createMesh(RenderCallback solid, RenderCallback wireframe);
3838

3939
// Primitives that can be drawn during a mesh
40-
void addTriangle(MeshId mesh, Vector a, Vector b, Vector c, bool cull_back = false);
41-
void addLine(MeshId mesh, Vector a, Vector b);
42-
void addQuad(MeshId mesh, Vector a, Vector b, Vector c, Vector d, bool cull_back = false);
40+
void addTriangle(MeshId &mesh, Vector a, Vector b, Vector c, bool cull_back = false);
41+
void addLine(MeshId &mesh, Vector a, Vector b);
42+
void addQuad(MeshId &mesh, Vector a, Vector b, Vector c, Vector d, bool cull_back = false);
4343

4444
enum class TextAlign {
4545
BOTTOM, // the bottom center of the text block

src/Features/PlayerTrace.cpp

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,6 @@ Vector g_playerTraceTeleportLocation;
5656
int g_playerTraceTeleportSlot;
5757
bool g_playerTraceNeedsTeleport = false;
5858

59-
enum MeshType {
60-
GROUNDED = 0,
61-
UNDER300,
62-
AIRLOCKED,
63-
MAX_TURN,
64-
OVER300
65-
};
66-
static const Color mesh_colors[5] = {
67-
{ 255, 0, 0 }, // red: grounded
68-
{ 255, 255, 255 }, // white: speed < 300
69-
{ 150, 75, 0 }, // brown: speedlocked
70-
{ 255, 220, 0 }, // yellow: can't turn further
71-
{ 0, 255, 0 } // green: speed > 300
72-
};
73-
7459
static int tickInternalToUser(int tick, const Trace &trace) {
7560
if (tick == -1) return -1;
7661
switch (sar_trace_draw_time.GetInt()) {
@@ -282,14 +267,11 @@ void PlayerTrace::DrawInWorld() const {
282267
Vector closest_pos;
283268
float closest_vel;
284269

285-
int mesh_size[5] = {0, 0, 0, 0, 0};
286-
MeshId meshes[5] = {
287-
OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant(mesh_colors[MeshType::GROUNDED ], draw_through_walls)),
288-
OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant(mesh_colors[MeshType::UNDER300 ], draw_through_walls)),
289-
OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant(mesh_colors[MeshType::AIRLOCKED], draw_through_walls)),
290-
OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant(mesh_colors[MeshType::MAX_TURN ], draw_through_walls)),
291-
OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant(mesh_colors[MeshType::OVER300 ], draw_through_walls))
292-
};
270+
MeshId mesh_airlocked = OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant({ 150, 75, 0 }, draw_through_walls));
271+
MeshId mesh_max_turn = OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant({ 255, 220, 0 }, draw_through_walls));
272+
MeshId mesh_under300 = OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant({ 255, 255, 255 }, draw_through_walls));
273+
MeshId mesh_over300 = OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant({ 0, 255, 0 }, draw_through_walls));
274+
MeshId mesh_grounded = OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant({ 255, 0, 0 }, draw_through_walls));
293275

294276
Vector pos = trace.positions[slot][0];
295277
float speed = trace.velocities[slot][0].Length2D();
@@ -348,21 +330,20 @@ void PlayerTrace::DrawInWorld() const {
348330
// Don't draw a line when going through a portal or 0 length line
349331
float pos_delta = (pos - new_pos).Length();
350332
if (pos_delta < 127 && pos_delta > 0.001) {
333+
// Colors:
334+
// red: grounded
335+
// brown: speedlocked
336+
// yellow: can't turn further
337+
// green: speed>300
351338
Vector vel = trace.velocities[slot][i];
352-
MeshType meshType = groundframes > 1 ? GROUNDED :
353-
speed < 300 ? UNDER300 :
354-
fabsf(vel.x) >= 150 && fabsf(vel.y) >= 150 ? AIRLOCKED :
355-
fabsf(vel.x) >= 60 && fabsf(vel.y) >= 60 ? MAX_TURN :
356-
OVER300;
357-
MeshId mesh = meshes[meshType];
339+
MeshId &mesh =
340+
groundframes > 1 ? mesh_grounded :
341+
speed < 300 ? mesh_under300 :
342+
fabsf(vel.x) >= 150 && fabsf(vel.y) >= 150 ? mesh_airlocked :
343+
fabsf(vel.x) >= 60 && fabsf(vel.y) >= 60 ? mesh_max_turn :
344+
mesh_over300;
358345

359346
OverlayRender::addLine(mesh, pos, new_pos);
360-
361-
mesh_size[meshType]++;
362-
if (mesh_size[meshType] >= 8192) { // batches of 8192 to avoid crash by overflowing the vertex buffer
363-
meshes[meshType] = OverlayRender::createMesh(RenderCallback::none, RenderCallback::constant(mesh_colors[meshType], draw_through_walls));
364-
mesh_size[meshType] = 0;
365-
}
366347
}
367348
if (pos_delta > 0.001) pos = new_pos;
368349
}

0 commit comments

Comments
 (0)