diff --git a/examples/animatedModelExample.js b/examples/animatedModelExample.js index 5199eb419f..70e40140eb 100644 --- a/examples/animatedModelExample.js +++ b/examples/animatedModelExample.js @@ -21,9 +21,9 @@ var roll = 0.0; var rotation = Quat.fromPitchYawRollDegrees(pitch, yaw, roll) var originalProperties = { - position: { x: 10, - y: 0, - z: 0 }, + position: { x: MyAvatar.position.x, + y: MyAvatar.position.y, + z: MyAvatar.position.z }, radius : 1, @@ -56,11 +56,11 @@ function moveModel(deltaTime) { if (count % adjustFPSEveryWhile == 0) { if (animationFPS == 30) { - animationFPS = 10; - } else if (animationFPS == 10) { - animationFPS = 60; - } else if (animationFPS == 60) { animationFPS = 30; + } else if (animationFPS == 10) { + animationFPS = 10; + } else if (animationFPS == 60) { + animationFPS = 60; } print("animationFPS=" + animationFPS); isPlaying = true; diff --git a/examples/bot.js b/examples/bot.js index f7a0429c53..e42d234abf 100644 --- a/examples/bot.js +++ b/examples/bot.js @@ -25,7 +25,7 @@ function printVector(string, vector) { } var CHANCE_OF_MOVING = 0.005; -var CHANCE_OF_SOUND = 0.000; +var CHANCE_OF_SOUND = 0.005; var CHANCE_OF_HEAD_TURNING = 0.05; var CHANCE_OF_BIG_MOVE = 0.1; var CHANCE_OF_WAVING = 0.009; @@ -41,11 +41,11 @@ var isWaving = false; var waveFrequency = 0.0; var waveAmplitude = 0.0; -var X_MIN = 20.0; -var X_MAX = 25.0; -var Z_MIN = 20.0; -var Z_MAX = 25.0; -var Y_PELVIS = 2.5; +var X_MIN = 5.0; +var X_MAX = 15.0; +var Z_MIN = 5.0; +var Z_MAX = 15.0; +var Y_PELVIS = 1.0; var SPINE_JOINT_NUMBER = 13; var SHOULDER_JOINT_NUMBER = 17; var ELBOW_JOINT_NUMBER = 18; diff --git a/examples/gun.js b/examples/gun.js index e404ae1d4d..a5c0ee83e0 100644 --- a/examples/gun.js +++ b/examples/gun.js @@ -39,7 +39,7 @@ var impactSound = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-pub var targetHitSound = new Sound("http://highfidelity-public.s3-us-west-1.amazonaws.com/sounds/Space%20Invaders/hit.raw"); var targetLaunchSound = new Sound("http://highfidelity-public.s3-us-west-1.amazonaws.com/sounds/Space%20Invaders/shoot.raw"); -var gunModel = "http://highfidelity-public.s3-us-west-1.amazonaws.com/models/attachments/Raygun2.fst"; +var gunModel = "http://public.highfidelity.io/models/attachments/HaloGun.fst"; var audioOptions = new AudioInjectionOptions(); audioOptions.volume = 0.9; @@ -199,7 +199,7 @@ function playLoadSound() { Audio.playSound(loadSound, audioOptions); } -MyAvatar.attach(gunModel, "RightHand", {x: -0.02, y: -.14, z: 0.07}, Quat.fromPitchYawRollDegrees(-70, -151, 72), 0.20); +//MyAvatar.attach(gunModel, "RightHand", {x: -0.02, y: -.14, z: 0.07}, Quat.fromPitchYawRollDegrees(-70, -151, 72), 0.20); MyAvatar.attach(gunModel, "LeftHand", {x: -0.02, y: -.14, z: 0.07}, Quat.fromPitchYawRollDegrees(-70, -151, 72), 0.20); // Give a bit of time to load before playing sound @@ -320,7 +320,6 @@ function scriptEnding() { Overlays.deleteOverlay(reticle); Overlays.deleteOverlay(text); MyAvatar.detachOne(gunModel); - MyAvatar.detachOne(gunModel); } Particles.particleCollisionWithVoxel.connect(particleCollisionWithVoxel); diff --git a/examples/hydraMove.js b/examples/hydraMove.js index ad0eeddfca..ff71316886 100644 --- a/examples/hydraMove.js +++ b/examples/hydraMove.js @@ -50,6 +50,13 @@ var LEFT_BUTTON_4 = 4; var RIGHT_PALM = 2; var RIGHT_BUTTON_4 = 10; + +function printVector(text, v, decimals) { + print(text + " " + v.x.toFixed(decimals) + ", " + v.y.toFixed(decimals) + ", " + v.z.toFixed(decimals)); +} + +var debug = false; + // Used by handleGrabBehavior() for managing the grab position changes function getAndResetGrabDelta() { var HAND_GRAB_SCALE_DISTANCE = 2.0; @@ -60,24 +67,12 @@ function getAndResetGrabDelta() { return result; } -// Used by handleGrabBehavior() for managing the grab velocity feature -function getAndResetGrabDeltaVelocity() { - var HAND_GRAB_SCALE_VELOCITY = 50.0; - var delta = Vec3.multiply(grabDeltaVelocity, (MyAvatar.scale * HAND_GRAB_SCALE_VELOCITY)); - grabDeltaVelocity = { x: 0, y: 0, z: 0}; - var avatarRotation = MyAvatar.orientation; - var result = Quat.multiply(avatarRotation, Vec3.multiply(delta, -1)); - return result; -} - -// Used by handleGrabBehavior() for managing the grab rotation feature -function getAndResetGrabRotation() { +function getGrabRotation() { var quatDiff = Quat.multiply(grabCurrentRotation, Quat.inverse(grabStartRotation)); - grabStartRotation = grabCurrentRotation; return quatDiff; } -// handles all the grab related behavior: position (crawl), velocity (flick), and rotate (twist) +// When move button is pressed, process results function handleGrabBehavior(deltaTime) { // check for and handle grab behaviors grabbingWithRightHand = Controller.isButtonPressed(RIGHT_BUTTON_4); @@ -88,9 +83,11 @@ function handleGrabBehavior(deltaTime) { if (grabbingWithRightHand && !wasGrabbingWithRightHand) { // Just starting grab, capture starting rotation grabStartRotation = Controller.getSpatialControlRawRotation(RIGHT_PALM); + grabStartPosition = Controller.getSpatialControlPosition(RIGHT_PALM); + if (debug) printVector("start position", grabStartPosition, 3); } if (grabbingWithRightHand) { - grabDelta = Vec3.sum(grabDelta, Vec3.multiply(Controller.getSpatialControlVelocity(RIGHT_PALM), deltaTime)); + grabDelta = Vec3.subtract(Controller.getSpatialControlPosition(RIGHT_PALM), grabStartPosition); grabCurrentRotation = Controller.getSpatialControlRawRotation(RIGHT_PALM); } if (!grabbingWithRightHand && wasGrabbingWithRightHand) { @@ -102,10 +99,12 @@ function handleGrabBehavior(deltaTime) { if (grabbingWithLeftHand && !wasGrabbingWithLeftHand) { // Just starting grab, capture starting rotation grabStartRotation = Controller.getSpatialControlRawRotation(LEFT_PALM); + grabStartPosition = Controller.getSpatialControlPosition(LEFT_PALM); + if (debug) printVector("start position", grabStartPosition, 3); } if (grabbingWithLeftHand) { - grabDelta = Vec3.sum(grabDelta, Vec3.multiply(Controller.getSpatialControlVelocity(LEFT_PALM), deltaTime)); + grabDelta = Vec3.subtract(Controller.getSpatialControlPosition(LEFT_PALM), grabStartPosition); grabCurrentRotation = Controller.getSpatialControlRawRotation(LEFT_PALM); } if (!grabbingWithLeftHand && wasGrabbingWithLeftHand) { @@ -119,44 +118,57 @@ function handleGrabBehavior(deltaTime) { if (grabbing) { - // move position - var moveFromGrab = getAndResetGrabDelta(); - if (Vec3.length(moveFromGrab) > EPSILON) { - MyAvatar.position = Vec3.sum(MyAvatar.position, moveFromGrab); - velocity = { x: 0, y: 0, z: 0}; - } - - // add some rotation... - var deltaRotation = getAndResetGrabRotation(); - var GRAB_CONTROLLER_TURN_SCALING = 0.5; - var euler = Vec3.multiply(Quat.safeEulerAngles(deltaRotation), GRAB_CONTROLLER_TURN_SCALING); + var headOrientation = MyAvatar.headOrientation; + var front = Quat.getFront(headOrientation); + var right = Quat.getRight(headOrientation); + var up = Quat.getUp(headOrientation); - // Adjust body yaw by yaw from controller - var orientation = Quat.multiply(Quat.angleAxis(-euler.y, {x:0, y: 1, z:0}), MyAvatar.orientation); + grabDelta = Vec3.multiplyQbyV(MyAvatar.orientation, Vec3.multiply(grabDelta, -1)); + + if (debug) { + printVector("grabDelta: ", grabDelta, 3); + } + + var THRUST_GRAB_SCALING = 0.0; + + var thrustFront = Vec3.multiply(front, MyAvatar.scale * grabDelta.z * THRUST_GRAB_SCALING * deltaTime); + MyAvatar.addThrust(thrustFront); + var thrustRight = Vec3.multiply(right, MyAvatar.scale * grabDelta.x * THRUST_GRAB_SCALING * deltaTime); + MyAvatar.addThrust(thrustRight); + var thrustUp = Vec3.multiply(up, MyAvatar.scale * grabDelta.y * THRUST_GRAB_SCALING * deltaTime); + MyAvatar.addThrust(thrustUp); + + + // add some rotation... + var deltaRotation = getGrabRotation(); + var PITCH_SCALING = 2.0; + var PITCH_DEAD_ZONE = 2.0; + var YAW_SCALING = 2.0; + var ROLL_SCALING = 2.0; + + var euler = Quat.safeEulerAngles(deltaRotation); + + // Adjust body yaw by roll from controller + var orientation = Quat.multiply(Quat.angleAxis(((euler.y * YAW_SCALING) + + (euler.z * ROLL_SCALING)) * deltaTime, {x:0, y: 1, z:0}), MyAvatar.orientation); MyAvatar.orientation = orientation; // Adjust head pitch from controller - MyAvatar.headPitch = MyAvatar.headPitch - euler.x; + var pitch = 0.0; + if (Math.abs(euler.x) > PITCH_DEAD_ZONE) { + pitch = (euler.x < 0.0) ? (euler.x + PITCH_DEAD_ZONE) : (euler.x - PITCH_DEAD_ZONE); + } + MyAvatar.headPitch = MyAvatar.headPitch + (pitch * PITCH_SCALING * deltaTime); + + // TODO: Add some camera roll proportional to the rate of turn (so it feels like an airplane or roller coaster) + } - // add some velocity... - if (stoppedGrabbing) { - velocity = Vec3.sum(velocity, getAndResetGrabDeltaVelocity()); - } - - // handle residual velocity - if(Vec3.length(velocity) > EPSILON) { - MyAvatar.position = Vec3.sum(MyAvatar.position, Vec3.multiply(velocity, deltaTime)); - // damp velocity - velocity = Vec3.multiply(velocity, damping); - } - - wasGrabbingWithRightHand = grabbingWithRightHand; wasGrabbingWithLeftHand = grabbingWithLeftHand; } -// Main update function that handles flying and grabbing behaviort +// Update for joysticks and move button function flyWithHydra(deltaTime) { var thrustJoystickPosition = Controller.getJoystickPosition(THRUST_CONTROLLER); diff --git a/interface/CMakeLists.txt b/interface/CMakeLists.txt index 96c212add6..3cbeff7801 100644 --- a/interface/CMakeLists.txt +++ b/interface/CMakeLists.txt @@ -136,6 +136,7 @@ find_package(Faceplus) find_package(Faceshift) find_package(LibOVR) find_package(PrioVR) +find_package(SDL) find_package(Sixense) find_package(Visage) find_package(ZLIB) @@ -193,6 +194,13 @@ if (PRIOVR_FOUND AND NOT DISABLE_PRIOVR) target_link_libraries(${TARGET_NAME} "${PRIOVR_LIBRARIES}") endif (PRIOVR_FOUND AND NOT DISABLE_PRIOVR) +# and with SDL for joysticks +if (SDL_FOUND AND NOT DISABLE_SDL) + add_definitions(-DHAVE_SDL) + include_directories(SYSTEM "${SDL_INCLUDE_DIR}") + target_link_libraries(${TARGET_NAME} "${SDL_LIBRARY}") +endif (SDL_FOUND AND NOT DISABLE_SDL) + # and with qxmpp for chat if (QXMPP_FOUND AND NOT DISABLE_QXMPP) add_definitions(-DHAVE_QXMPP -DQXMPP_STATIC) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 91e95bb4e3..fc23a50f7b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1990,7 +1990,8 @@ void Application::update(float deltaTime) { _myAvatar->updateLookAtTargetAvatar(); updateMyAvatarLookAtPosition(); _sixenseManager.update(deltaTime); - _prioVR.update(); + _joystickManager.update(); + _prioVR.update(deltaTime); updateMyAvatar(deltaTime); // Sample hardware, update view frustum if needed, and send avatar data to mixer/nodes updateThreads(deltaTime); // If running non-threaded, then give the threads some time to process... _avatarManager.updateOtherAvatars(deltaTime); //loop through all the other avatars and simulate them... diff --git a/interface/src/Application.h b/interface/src/Application.h index 33ec9ca856..b9b73ac86a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -58,6 +58,7 @@ #include "avatar/MyAvatar.h" #include "devices/Faceplus.h" #include "devices/Faceshift.h" +#include "devices/JoystickManager.h" #include "devices/PrioVR.h" #include "devices/SixenseManager.h" #include "devices/Visage.h" @@ -196,6 +197,7 @@ public: FaceTracker* getActiveFaceTracker(); SixenseManager* getSixenseManager() { return &_sixenseManager; } PrioVR* getPrioVR() { return &_prioVR; } + JoystickManager* getJoystickManager() { return &_joystickManager; } BandwidthMeter* getBandwidthMeter() { return &_bandwidthMeter; } QUndoStack* getUndoStack() { return &_undoStack; } @@ -449,6 +451,7 @@ private: SixenseManager _sixenseManager; PrioVR _prioVR; + JoystickManager _joystickManager; Camera _myCamera; // My view onto the world Camera _viewFrustumOffsetCamera; // The camera we use to sometimes show the view frustum from an offset mode diff --git a/interface/src/devices/JoystickManager.cpp b/interface/src/devices/JoystickManager.cpp new file mode 100644 index 0000000000..005505441c --- /dev/null +++ b/interface/src/devices/JoystickManager.cpp @@ -0,0 +1,64 @@ +// +// JoystickManager.cpp +// interface/src/devices +// +// Created by Andrzej Kapolka on 5/15/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include + +#include + +#include + +#include "JoystickManager.h" + +using namespace std; + +JoystickManager::JoystickManager() { +#ifdef HAVE_SDL + SDL_Init(SDL_INIT_JOYSTICK); + int joystickCount = SDL_NumJoysticks(); + for (int i = 0; i < joystickCount; i++) { + SDL_Joystick* joystick = SDL_JoystickOpen(i); + if (joystick) { + JoystickState state = { SDL_JoystickName(i), QVector(SDL_JoystickNumAxes(joystick)), + QVector(SDL_JoystickNumButtons(joystick)) }; + _joystickStates.append(state); + _joysticks.append(joystick); + } + } +#endif +} + +JoystickManager::~JoystickManager() { +#ifdef HAVE_SDL + foreach (SDL_Joystick* joystick, _joysticks) { + SDL_JoystickClose(joystick); + } + SDL_Quit(); +#endif +} + +void JoystickManager::update() { +#ifdef HAVE_SDL + SDL_JoystickUpdate(); + + for (int i = 0; i < _joystickStates.size(); i++) { + SDL_Joystick* joystick = _joysticks.at(i); + JoystickState& state = _joystickStates[i]; + for (int j = 0; j < state.axes.size(); j++) { + float value = glm::round(SDL_JoystickGetAxis(joystick, j) + 0.5f) / numeric_limits::max(); + const float DEAD_ZONE = 0.1f; + state.axes[j] = glm::abs(value) < DEAD_ZONE ? 0.0f : value; + } + for (int j = 0; j < state.buttons.size(); j++) { + state.buttons[j] = SDL_JoystickGetButton(joystick, j); + } + } +#endif +} diff --git a/interface/src/devices/JoystickManager.h b/interface/src/devices/JoystickManager.h new file mode 100644 index 0000000000..53a255e129 --- /dev/null +++ b/interface/src/devices/JoystickManager.h @@ -0,0 +1,53 @@ +// +// JoystickManager.h +// interface/src/devices +// +// Created by Andrzej Kapolka on 5/15/14. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_JoystickManager_h +#define hifi_JoystickManager_h + +#include +#include + +#ifdef HAVE_SDL +#include +#undef main +#endif + +class JoystickState; + +/// Handles joystick input through SDL. +class JoystickManager : public QObject { + Q_OBJECT + +public: + + JoystickManager(); + virtual ~JoystickManager(); + + const QVector& getJoystickStates() const { return _joystickStates; } + + void update(); + +private: + QVector _joystickStates; + +#ifdef HAVE_SDL + QVector _joysticks; +#endif +}; + +class JoystickState { +public: + QString name; + QVector axes; + QVector buttons; +}; + +#endif // hifi_JoystickManager_h diff --git a/interface/src/devices/PrioVR.cpp b/interface/src/devices/PrioVR.cpp index 28564f6f2e..deba4f82a5 100644 --- a/interface/src/devices/PrioVR.cpp +++ b/interface/src/devices/PrioVR.cpp @@ -9,6 +9,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include #include #include @@ -17,6 +18,7 @@ #include "PrioVR.h" #include "ui/TextRenderer.h" +#ifdef HAVE_PRIOVR const unsigned int SERIAL_LIST[] = { 0x00000001, 0x00000000, 0x00000008, 0x00000009, 0x0000000A, 0x0000000C, 0x0000000D, 0x0000000E, 0x00000004, 0x00000005, 0x00000010, 0x00000011 }; const unsigned char AXIS_LIST[] = { 9, 43, 37, 37, 37, 13, 13, 13, 52, 52, 28, 28 }; @@ -25,7 +27,6 @@ const int LIST_LENGTH = sizeof(SERIAL_LIST) / sizeof(SERIAL_LIST[0]); const char* JOINT_NAMES[] = { "Neck", "Spine", "LeftArm", "LeftForeArm", "LeftHand", "RightArm", "RightForeArm", "RightHand", "LeftUpLeg", "LeftLeg", "RightUpLeg", "RightLeg" }; -#ifdef HAVE_PRIOVR static int indexOfHumanIKJoint(const char* jointName) { for (int i = 0;; i++) { QByteArray humanIKJoint = HUMANIK_JOINTS[i]; @@ -37,6 +38,87 @@ static int indexOfHumanIKJoint(const char* jointName) { } } } + +static void setPalm(float deltaTime, int index) { + MyAvatar* avatar = Application::getInstance()->getAvatar(); + Hand* hand = avatar->getHand(); + PalmData* palm; + bool foundHand = false; + for (size_t j = 0; j < hand->getNumPalms(); j++) { + if (hand->getPalms()[j].getSixenseID() == index) { + palm = &(hand->getPalms()[j]); + foundHand = true; + } + } + if (!foundHand) { + PalmData newPalm(hand); + hand->getPalms().push_back(newPalm); + palm = &(hand->getPalms()[hand->getNumPalms() - 1]); + palm->setSixenseID(index); + } + + palm->setActive(true); + + // Read controller buttons and joystick into the hand + if (!Application::getInstance()->getJoystickManager()->getJoystickStates().isEmpty()) { + const JoystickState& state = Application::getInstance()->getJoystickManager()->getJoystickStates().at(0); + if (state.axes.size() >= 4 && state.buttons.size() >= 4) { + if (index == SIXENSE_CONTROLLER_ID_LEFT_HAND) { + palm->setControllerButtons(state.buttons.at(1) ? BUTTON_FWD : 0); + palm->setTrigger(state.buttons.at(0) ? 1.0f : 0.0f); + palm->setJoystick(state.axes.at(0), -state.axes.at(1)); + + } else { + palm->setControllerButtons(state.buttons.at(3) ? BUTTON_FWD : 0); + palm->setTrigger(state.buttons.at(2) ? 1.0f : 0.0f); + palm->setJoystick(state.axes.at(2), -state.axes.at(3)); + } + } + } + + glm::vec3 position; + glm::quat rotation; + + Model* skeletonModel = &Application::getInstance()->getAvatar()->getSkeletonModel(); + int jointIndex; + glm::quat inverseRotation = glm::inverse(Application::getInstance()->getAvatar()->getOrientation()); + if (index == SIXENSE_CONTROLLER_ID_LEFT_HAND) { + jointIndex = skeletonModel->getLeftHandJointIndex(); + skeletonModel->getJointRotation(jointIndex, rotation, true); + rotation = inverseRotation * rotation * glm::quat(glm::vec3(0.0f, PI_OVER_TWO, 0.0f)); + + } else { + jointIndex = skeletonModel->getRightHandJointIndex(); + skeletonModel->getJointRotation(jointIndex, rotation, true); + rotation = inverseRotation * rotation * glm::quat(glm::vec3(0.0f, -PI_OVER_TWO, 0.0f)); + } + skeletonModel->getJointPosition(jointIndex, position); + position = inverseRotation * (position - skeletonModel->getTranslation()); + + palm->setRawRotation(rotation); + + // Compute current velocity from position change + glm::vec3 rawVelocity; + if (deltaTime > 0.f) { + rawVelocity = (position - palm->getRawPosition()) / deltaTime; + } else { + rawVelocity = glm::vec3(0.0f); + } + palm->setRawVelocity(rawVelocity); + palm->setRawPosition(position); + + // Store the one fingertip in the palm structure so we can track velocity + const float FINGER_LENGTH = 0.3f; // meters + const glm::vec3 FINGER_VECTOR(0.0f, 0.0f, FINGER_LENGTH); + const glm::vec3 newTipPosition = position + rotation * FINGER_VECTOR; + glm::vec3 oldTipPosition = palm->getTipRawPosition(); + if (deltaTime > 0.f) { + palm->setTipVelocity((newTipPosition - oldTipPosition) / deltaTime); + } else { + palm->setTipVelocity(glm::vec3(0.f)); + } + palm->setTipPosition(newTipPosition); +} #endif PrioVR::PrioVR() { @@ -78,7 +160,7 @@ glm::quat PrioVR::getTorsoRotation() const { return _jointRotations.size() > TORSO_ROTATION_INDEX ? _jointRotations.at(TORSO_ROTATION_INDEX) : glm::quat(); } -void PrioVR::update() { +void PrioVR::update(float deltaTime) { #ifdef HAVE_PRIOVR if (!_skeletalDevice) { return; @@ -96,6 +178,10 @@ void PrioVR::update() { _lastJointRotations[i] = _jointRotations.at(i); _jointRotations[i] = safeMix(lastRotation, _jointRotations.at(i), 0.5f); } + + // convert the joysticks into palm data + setPalm(deltaTime, SIXENSE_CONTROLLER_ID_LEFT_HAND); + setPalm(deltaTime, SIXENSE_CONTROLLER_ID_RIGHT_HAND); #endif } diff --git a/interface/src/devices/PrioVR.h b/interface/src/devices/PrioVR.h index 8f01574356..bb563bf807 100644 --- a/interface/src/devices/PrioVR.h +++ b/interface/src/devices/PrioVR.h @@ -43,7 +43,7 @@ public: const QVector& getHumanIKJointIndices() const { return _humanIKJointIndices; } const QVector& getJointRotations() const { return _jointRotations; } - void update(); + void update(float deltaTime); void reset(); private slots: diff --git a/interface/src/scripting/ControllerScriptingInterface.cpp b/interface/src/scripting/ControllerScriptingInterface.cpp index 58a08066d6..34c1cc2f1c 100644 --- a/interface/src/scripting/ControllerScriptingInterface.cpp +++ b/interface/src/scripting/ControllerScriptingInterface.cpp @@ -74,7 +74,7 @@ bool ControllerScriptingInterface::isPrimaryButtonPressed() const { return true; } } - + return false; } diff --git a/libraries/fbx/src/FBXReader.cpp b/libraries/fbx/src/FBXReader.cpp index 264f58f0d4..44ef3f3aab 100644 --- a/libraries/fbx/src/FBXReader.cpp +++ b/libraries/fbx/src/FBXReader.cpp @@ -585,6 +585,7 @@ const char* HUMANIK_JOINTS[] = { "LeftArm", "LeftForeArm", "LeftHand", + "Neck", "Spine", "Hips", "RightUpLeg",