@@ -8,6 +8,7 @@ local BASE_TIME_INTERVAL = 17
88
99local animating = false
1010local previous_time = 0
11+ local lag = 0
1112local target_position = { 0 , 0 }
1213local current_corners = { { 0 , 0 }, { 0 , 0 }, { 0 , 0 }, { 0 , 0 } }
1314local target_corners = { { 0 , 0 }, { 0 , 0 }, { 0 , 0 }, { 0 , 0 } }
@@ -103,10 +104,10 @@ local function get_effective_time_interval()
103104 local time_interval
104105
105106 if previous_time == 0 then
106- previous_time = vim .uv .now ()
107+ previous_time = vim .uv .hrtime () / 1000000
107108 time_interval = BASE_TIME_INTERVAL
108109 else
109- local current_time = vim .uv .now ()
110+ local current_time = vim .uv .hrtime () / 1000000
110111 time_interval = current_time - previous_time
111112 previous_time = current_time
112113 end
@@ -368,11 +369,10 @@ local function redraw_cmd_mode(force)
368369end
369370
370371local function animate ()
371- local start_time = vim .uv .now ()
372372 if not animating then return end
373373
374- local must_redraw_cmd_mode = check_smear_outside_cmd_row ()
375374 local time_interval = get_effective_time_interval ()
375+ local must_redraw_cmd_mode = check_smear_outside_cmd_row ()
376376 local index_head , index_tail = update (time_interval )
377377 update_particles (time_interval )
378378
@@ -392,8 +392,6 @@ local function animate()
392392 end
393393 local thickness = right_bound - left_bound
394394
395- draw .clear ()
396-
397395 if
398396 (
399397 (max_distance <= config .distance_stop_animating and max_velocity <= config .distance_stop_animating )
@@ -404,11 +402,13 @@ local function animate()
404402 )
405403 ) and # particles == 0
406404 then
405+ draw .clear ()
407406 set_corners (current_corners , target_position [1 ], target_position [2 ])
408407 reset_velocity ()
409408 redraw_cmd_mode (must_redraw_cmd_mode )
410409 unhide_real_cursor ()
411410 stop_animation ()
411+ lag = 0
412412 return
413413 end
414414
@@ -455,12 +455,32 @@ local function animate()
455455 gradient_length_squared > 1 and gradient_direction [2 ] / gradient_length_squared or 0 ,
456456 }
457457
458- draw .draw_particles (particles , target_position )
459- draw .draw_quad (drawn_corners , target_position , cursor_is_vertical_bar (), gradient_origin , gradient_direction_scaled )
460- redraw_cmd_mode (must_redraw_cmd_mode )
458+ if lag == 0 then
459+ draw .clear ()
460+ draw .draw_particles (particles , target_position )
461+ draw .draw_quad (
462+ drawn_corners ,
463+ target_position ,
464+ cursor_is_vertical_bar (),
465+ gradient_origin ,
466+ gradient_direction_scaled
467+ )
468+ redraw_cmd_mode (must_redraw_cmd_mode )
469+ end
470+
471+ lag = math.max (0 , lag + time_interval - config .time_interval )
472+ local call_duration = vim .uv .hrtime () / 1000000 - previous_time
473+ local delay_next_call = config .time_interval - call_duration
474+
475+ if lag <= delay_next_call then
476+ delay_next_call = delay_next_call - lag
477+ lag = 0
478+ else
479+ lag = lag - delay_next_call
480+ delay_next_call = 0
481+ end
461482
462- local end_time = vim .uv .now ()
463- vim .defer_fn (animate , math.max (0 , config .time_interval - (end_time - start_time )))
483+ vim .defer_fn (animate , delay_next_call )
464484end
465485
466486local function start_anination ()
0 commit comments