I'm working on a class responsible for arm sway in an fps engine, and am having an issue with a stutter that appears to be related to fluctuating framerate. However I have also noticed it when locking the framerate, but to a much lesser almost unnoticeable degree (so maybe NOT related to framerate variance). As far as I can tell I have everything setup the way it should be to account for framerate fluctuations, but apparently I've missed something?? Curious if I've made a glaring oversight that might jump out at someone. I have uploaded a video where you can see exactly what it is I'm talking about.
Any ideas? update() is where the magic happens.
#include "glm/gtx/string_cast.hpp" #include "vel/App.h" #include "vel/helpers/functions.h" #include "ArmSwayController.h" ArmSwayController::ArmSwayController() : input(vel::App::get().getInputState()), swayXYPos(glm::vec2(0.0f, 0.0f)), maxSwayDistance(0.1f), swaySpeed(0.0f), mouseBufferSize(44), firstMouseInput(true), currentMousePosition(glm::vec2(0.0f, 0.0f)), lastMousePosition(glm::vec2(0.0f, 0.0f)), mouseDelta(glm::vec2(0.0f, 0.0f)), {}; glm::vec2 ArmSwayController::getAverageMouse() { glm::vec2 out; for (auto& x : this->mouseXBuffer) { out.x += x; } out.x = out.x / this->mouseXBuffer.size(); for (auto& y : this->mouseYBuffer) { out.y += y; } out.y = out.y / this->mouseYBuffer.size(); return out; } void ArmSwayController::bufferMouse(glm::vec2 in) { if (this->mouseXBuffer.size() == this->mouseBufferSize) this->mouseXBuffer.pop_front(); if (this->mouseYBuffer.size() == this->mouseBufferSize) this->mouseYBuffer.pop_front(); this->mouseXBuffer.push_back(in.x); this->mouseYBuffer.push_back(in.y); } void ArmSwayController::bufferMouseXSpeed(float in) { if (this->mouseXSpeedBuffer.size() == this->mouseBufferSize) this->mouseXSpeedBuffer.pop_front(); this->mouseXSpeedBuffer.push_back(in); } void ArmSwayController::bufferMouseYSpeed(float in) { if (this->mouseYSpeedBuffer.size() == this->mouseBufferSize) this->mouseYSpeedBuffer.pop_front(); this->mouseYSpeedBuffer.push_back(in); } void ArmSwayController::updateMouseDelta() { this->currentMousePosition.x = this->input.mouseXPos; this->currentMousePosition.y = this->input.mouseYPos; if (this->firstMouseInput) { this->lastMousePosition = this->currentMousePosition; this->firstMouseInput = false; } this->mouseDelta.x = this->currentMousePosition.x - this->lastMousePosition.x; this->mouseDelta.y = this->lastMousePosition.y - this->currentMousePosition.y; this->lastMousePosition = this->currentMousePosition; } glm::vec2 ArmSwayController::update(float dt) // called once per tick { this->updateMouseDelta(); this->bufferMouse(this->mouseDelta); this->swaySpeed = 0.00000625f / dt; glm::vec2 vecToAdd = vel::helpers::functions::invertVec2(this->getAverageMouse()); // X this->bufferMouseXSpeed(vecToAdd.x); float pullBackAmountX = this->mouseXSpeedBuffer.size() > 1 ? this->mouseXSpeedBuffer[this->mouseXSpeedBuffer.size() - 2] : this->mouseXSpeedBuffer[0]; pullBackAmountX = pullBackAmountX < 0 ? fabs(pullBackAmountX) : (-1.0f * pullBackAmountX); this->swayXYPos.x += ((vecToAdd.x + pullBackAmountX) * this->swaySpeed); // Y this->bufferMouseYSpeed(vecToAdd.y); float pullBackAmountY = this->mouseYSpeedBuffer.size() > 1 ? this->mouseYSpeedBuffer[this->mouseYSpeedBuffer.size() - 2] : this->mouseYSpeedBuffer[0]; pullBackAmountY = pullBackAmountY < 0 ? fabs(pullBackAmountY) : (-1.0f * pullBackAmountY); this->swayXYPos.y += ((vecToAdd.y + pullBackAmountY) * this->swaySpeed); return this->swayXYPos; }