По своей глупости нарвался на ошибку. Есть обработчик ивентов (клавиатура, мышь, джойстик), у мыши кроме состояния кнопок есть еще координаты и смещение относительно последней выборки. Код выглядит приблизительно так:
g_nMouseDX = 0; g_nMouseDY = 0; SDL_Event evt; while(SDL_PollEvent(&evt)) { switch(evt.type) { case SDL_MOUSEMOTION: g_nMouseDX += evt.motion.xrel; g_nMouseDY += evt.motion.yrel; break; } }
Так вот, моя ошибка была тут:
g_nMouseDX += evt.motion.xrel; g_nMouseDY += evt.motion.yrel;
Я просто не учитывал, что при выполнении этого кода на медленном компьютере, ивентов за каждый фрейм может приходить более одного. И по этой причине я терял данные о смещении мыши. Простая замена присвоения “=” на добавление “+=” решило проблему.