@@ -56,6 +56,21 @@ Vector g_playerTraceTeleportLocation;
5656int g_playerTraceTeleportSlot;
5757bool 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+
5974static 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