diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 044f58f3fd..c77cfec918 100755 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -183,6 +183,8 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _touchAvgX(0.0f), _touchAvgY(0.0f), _isTouchPressed(false), + _yawFromTouch(0.0f), + _pitchFromTouch(0.0f), _mousePressed(false), _mouseVoxelScale(1.0f / 1024.0f), _justEditedVoxel(false), @@ -969,6 +971,9 @@ void Application::idle() { gettimeofday(&check, NULL); // Only run simulation code if more than IDLE_SIMULATE_MSECS have passed since last time we ran + sendPostedEvents(NULL, QEvent::TouchBegin); + sendPostedEvents(NULL, QEvent::TouchUpdate); + sendPostedEvents(NULL, QEvent::TouchEnd); double timeSinceLastUpdate = diffclock(&_lastTimeUpdated, &check); if (timeSinceLastUpdate > IDLE_SIMULATE_MSECS) { @@ -978,9 +983,6 @@ void Application::idle() { // This is necessary because id the idle() call takes longer than the // interval between idle() calls, the event loop never gets to run, // and touch events get delayed. - sendPostedEvents(NULL, QEvent::TouchBegin); - sendPostedEvents(NULL, QEvent::TouchUpdate); - sendPostedEvents(NULL, QEvent::TouchEnd); const float BIGGEST_DELTA_TIME_SECS = 0.25f; update(glm::clamp((float)timeSinceLastUpdate / 1000.f, 0.f, BIGGEST_DELTA_TIME_SECS)); @@ -1902,12 +1904,9 @@ void Application::update(float deltaTime) { if (_isTouchPressed) { float TOUCH_YAW_SCALE = -50.0f; float TOUCH_PITCH_SCALE = -50.0f; - _myAvatar.getHead().addYaw((_touchAvgX - _lastTouchAvgX) - * TOUCH_YAW_SCALE - * deltaTime); - _myAvatar.getHead().addPitch((_touchAvgY - _lastTouchAvgY) - * TOUCH_PITCH_SCALE - * deltaTime); + _yawFromTouch += ((_touchAvgX - _lastTouchAvgX) * TOUCH_YAW_SCALE * deltaTime); + _pitchFromTouch += ((_touchAvgY - _lastTouchAvgY) * TOUCH_PITCH_SCALE * deltaTime); + _lastTouchAvgX = _touchAvgX; _lastTouchAvgY = _touchAvgY; } @@ -2015,7 +2014,9 @@ void Application::updateAvatar(float deltaTime) { _myAvatar.updateFromGyrosAndOrWebcam(_gyroLook->isChecked(), glm::vec3(_headCameraPitchYawScale, _headCameraPitchYawScale, - _headCameraPitchYawScale)); + _headCameraPitchYawScale), + _yawFromTouch, + _pitchFromTouch); if (_serialHeadSensor.isActive()) { diff --git a/interface/src/Application.h b/interface/src/Application.h index cea4d7d46d..acb2263cbf 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -332,6 +332,8 @@ private: float _touchDragStartedAvgX; float _touchDragStartedAvgY; bool _isTouchPressed; // true if multitouch has been pressed (clear when finished) + float _yawFromTouch; + float _pitchFromTouch; VoxelDetail _mouseVoxelDragging; glm::vec3 _voxelThrust; diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 7953194ad8..d032262ed8 100755 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -287,7 +287,10 @@ void Avatar::reset() { } // Update avatar head rotation with sensor data -void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyAngle) { +void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, + const glm::vec3& amplifyAngle, + float yawFromTouch, + float pitchFromTouch) { SerialInterface* gyros = Application::getInstance()->getSerialHeadSensor(); Webcam* webcam = Application::getInstance()->getWebcam(); glm::vec3 estimatedPosition, estimatedRotation; @@ -298,6 +301,8 @@ void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyA estimatedRotation = webcam->getEstimatedRotation(); } else { + _head.setPitch(pitchFromTouch); + _head.setYaw(yawFromTouch); return; } if (webcam->isActive()) { @@ -318,8 +323,8 @@ void Avatar::updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyA } } } - _head.setPitch(estimatedRotation.x * amplifyAngle.x); - _head.setYaw(estimatedRotation.y * amplifyAngle.y); + _head.setPitch(estimatedRotation.x * amplifyAngle.x + pitchFromTouch); + _head.setYaw(estimatedRotation.y * amplifyAngle.y + yawFromTouch); _head.setRoll(estimatedRotation.z * amplifyAngle.z); _head.setCameraFollowsHead(gyroLook); diff --git a/interface/src/Avatar.h b/interface/src/Avatar.h index 5e46eebb19..777b4dca59 100755 --- a/interface/src/Avatar.h +++ b/interface/src/Avatar.h @@ -87,7 +87,10 @@ public: void reset(); void simulate(float deltaTime, Transmitter* transmitter); void updateThrust(float deltaTime, Transmitter * transmitter); - void updateFromGyrosAndOrWebcam(bool gyroLook, const glm::vec3& amplifyAngles); + void updateFromGyrosAndOrWebcam(bool gyroLook, + const glm::vec3& amplifyAngle, + float yawFromTouch, + float pitchFromTouch); void addBodyYaw(float y) {_bodyYaw += y;}; void render(bool lookingInMirror, bool renderAvatarBalls);