diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 4258ce6f14..aad3e4ce72 100755 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -100,7 +100,9 @@ enum DriveKeys { UP, DOWN, ROT_LEFT, - ROT_RIGHT, + ROT_RIGHT, + ROT_UP, + ROT_DOWN, MAX_DRIVE_KEYS }; diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 3ce54d7032..3343f5c920 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -27,6 +27,7 @@ using namespace std; const glm::vec3 DEFAULT_UP_DIRECTION(0.0f, 1.0f, 0.0f); const float YAW_MAG = 500.0; +const float PITCH_MAG = 100.0f; const float COLLISION_RADIUS_SCALAR = 1.2; // pertains to avatar-to-avatar collisions const float COLLISION_BALL_FORCE = 200.0; // pertains to avatar-to-avatar collisions const float COLLISION_BODY_FORCE = 30.0; // pertains to avatar-to-avatar collisions @@ -42,6 +43,7 @@ MyAvatar::MyAvatar(Node* owningNode) : _mousePressed(false), _bodyPitchDelta(0.0f), _bodyRollDelta(0.0f), + _mousePitchDelta(0.0f), _shouldJump(false), _gravity(0.0f, -1.0f, 0.0f), _distanceToNearestAvatar(std::numeric_limits::max()), @@ -57,7 +59,7 @@ MyAvatar::MyAvatar(Node* owningNode) : _moveTargetStepCounter(0) { for (int i = 0; i < MAX_DRIVE_KEYS; i++) { - _driveKeys[i] = false; + _driveKeys[i] = 0.0f; } _collisionRadius = _height * COLLISION_RADIUS_SCALE; @@ -395,8 +397,8 @@ void MyAvatar::updateFromGyrosAndOrWebcam(float pitchFromTouch, bool turnWithHea } else { if (!_leadingAvatar) { - _head.setMousePitch(pitchFromTouch); - _head.setPitch(pitchFromTouch); + _head.setMousePitch(pitchFromTouch + _mousePitchDelta); + _head.setPitch(pitchFromTouch + _mousePitchDelta); } _head.getVideoFace().clearFrame(); @@ -408,7 +410,7 @@ void MyAvatar::updateFromGyrosAndOrWebcam(float pitchFromTouch, bool turnWithHea _head.setLeanForward(glm::mix(_head.getLeanForward(), 0.0f, RESTORE_RATE)); return; } - _head.setMousePitch(pitchFromTouch); + _head.setMousePitch(pitchFromTouch + _mousePitchDelta); if (webcam->isActive()) { estimatedPosition = webcam->getEstimatedPosition(); @@ -707,14 +709,17 @@ void MyAvatar::updateThrust(float deltaTime, Transmitter * transmitter) { const float THRUST_JUMP = 120.f; // Add Thrusts from keyboard - if (_driveKeys[FWD]) {_thrust += _scale * THRUST_MAG_FWD * _thrustMultiplier * deltaTime * front;} - if (_driveKeys[BACK]) {_thrust -= _scale * THRUST_MAG_BACK * _thrustMultiplier * deltaTime * front;} - if (_driveKeys[RIGHT]) {_thrust += _scale * THRUST_MAG_LATERAL * _thrustMultiplier * deltaTime * right;} - if (_driveKeys[LEFT]) {_thrust -= _scale * THRUST_MAG_LATERAL * _thrustMultiplier * deltaTime * right;} - if (_driveKeys[UP]) {_thrust += _scale * THRUST_MAG_UP * _thrustMultiplier * deltaTime * up;} - if (_driveKeys[DOWN]) {_thrust -= _scale * THRUST_MAG_DOWN * _thrustMultiplier * deltaTime * up;} - if (_driveKeys[ROT_RIGHT]) {_bodyYawDelta -= YAW_MAG * deltaTime;} - if (_driveKeys[ROT_LEFT]) {_bodyYawDelta += YAW_MAG * deltaTime;} + _thrust += _driveKeys[FWD] * _scale * THRUST_MAG_FWD * _thrustMultiplier * deltaTime * front; + _thrust -= _driveKeys[BACK] * _scale * THRUST_MAG_BACK * _thrustMultiplier * deltaTime * front; + _thrust += _driveKeys[RIGHT] * _scale * THRUST_MAG_LATERAL * _thrustMultiplier * deltaTime * right; + _thrust -= _driveKeys[LEFT] * _scale * THRUST_MAG_LATERAL * _thrustMultiplier * deltaTime * right; + _thrust += _driveKeys[UP] * _scale * THRUST_MAG_UP * _thrustMultiplier * deltaTime * up; + _thrust -= _driveKeys[DOWN] * _scale * THRUST_MAG_DOWN * _thrustMultiplier * deltaTime * up; + _bodyYawDelta -= _driveKeys[ROT_RIGHT] * YAW_MAG * deltaTime; + _bodyYawDelta += _driveKeys[ROT_LEFT] * YAW_MAG * deltaTime; + const float MAX_PITCH = 90.0f; + _mousePitchDelta = min(_mousePitchDelta + _driveKeys[ROT_UP] * PITCH_MAG * deltaTime, MAX_PITCH); + _mousePitchDelta = max(_mousePitchDelta - _driveKeys[ROT_DOWN] * PITCH_MAG * deltaTime, -MAX_PITCH); // If thrust keys are being held down, slowly increase thrust to allow reaching great speeds if (_driveKeys[FWD] || _driveKeys[BACK] || _driveKeys[RIGHT] || _driveKeys[LEFT] || _driveKeys[UP] || _driveKeys[DOWN]) { diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 790510536f..9398a0d52d 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -54,7 +54,7 @@ public: void loadData(QSettings* settings); // Set what driving keys are being pressed to control thrust levels - void setDriveKeys(int key, bool val) { _driveKeys[key] = val; }; + void setDriveKeys(int key, float val) { _driveKeys[key] = val; }; bool getDriveKeys(int key) { return _driveKeys[key]; }; void jump() { _shouldJump = true; }; @@ -66,8 +66,9 @@ private: bool _mousePressed; float _bodyPitchDelta; float _bodyRollDelta; + float _mousePitchDelta; bool _shouldJump; - int _driveKeys[MAX_DRIVE_KEYS]; + float _driveKeys[MAX_DRIVE_KEYS]; glm::vec3 _gravity; float _distanceToNearestAvatar; // How close is the nearest avatar? Avatar* _interactingOther; diff --git a/interface/src/devices/SixenseManager.cpp b/interface/src/devices/SixenseManager.cpp index 96481db4c8..fcb795eaed 100644 --- a/interface/src/devices/SixenseManager.cpp +++ b/interface/src/devices/SixenseManager.cpp @@ -30,7 +30,8 @@ void SixenseManager::update() { if (sixenseGetNumActiveControllers() == 0) { return; } - Hand& hand = Application::getInstance()->getAvatar()->getHand(); + MyAvatar* avatar = Application::getInstance()->getAvatar(); + Hand& hand = avatar->getHand(); hand.getPalms().clear(); int maxControllers = sixenseGetMaxControllers(); @@ -41,6 +42,22 @@ void SixenseManager::update() { sixenseControllerData data; sixenseGetNewestData(i, &data); + // drive avatar with joystick and triggers + if (data.controller_index) { + avatar->setDriveKeys(ROT_LEFT, qMax(0.0f, -data.joystick_x)); + avatar->setDriveKeys(ROT_RIGHT, qMax(0.0f, data.joystick_x)); + avatar->setDriveKeys(ROT_UP, qMax(0.0f, data.joystick_y)); + avatar->setDriveKeys(ROT_DOWN, qMax(0.0f, -data.joystick_y)); + avatar->setDriveKeys(UP, data.trigger); + + } else { + avatar->setDriveKeys(FWD, qMax(0.0f, data.joystick_y)); + avatar->setDriveKeys(BACK, qMax(0.0f, -data.joystick_y)); + avatar->setDriveKeys(LEFT, qMax(0.0f, -data.joystick_x)); + avatar->setDriveKeys(RIGHT, qMax(0.0f, data.joystick_x)); + avatar->setDriveKeys(DOWN, data.trigger); + } + // set palm position and normal based on Hydra position/orientation PalmData palm(&hand); palm.setActive(true);