Skip to content

Commit 7ecee02

Browse files
committed
fix: batch trace drawing
Fixes #328
1 parent d0eebba commit 7ecee02

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

src/Features/PlayerTrace.cpp

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

59+
const 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+
5974
static int tickInternalToUser(int tick, const Trace &trace) {
6075
if (tick == -1) return -1;
6176
switch (sar_trace_draw_time.GetInt()) {
@@ -267,11 +282,14 @@ void PlayerTrace::DrawInWorld() const {
267282
Vector closest_pos;
268283
float closest_vel;
269284

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));
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+
};
275293

276294
Vector pos = trace.positions[slot][0];
277295
float speed = trace.velocities[slot][0].Length2D();
@@ -330,20 +348,21 @@ void PlayerTrace::DrawInWorld() const {
330348
// Don't draw a line when going through a portal or 0 length line
331349
float pos_delta = (pos - new_pos).Length();
332350
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
338351
Vector vel = trace.velocities[slot][i];
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;
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];
345358

346359
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+
}
347366
}
348367
if (pos_delta > 0.001) pos = new_pos;
349368
}

0 commit comments

Comments
 (0)