diff --git a/examples/editModels.js b/examples/editModels.js index 8259994118..39f67776a9 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -157,9 +157,7 @@ function controller(wichSide) { this.release = function () { if (this.grabbing) { - if (jointList.length <= 0) { - jointList = MyAvatar.getJointNames(); - } + jointList = MyAvatar.getJointNames(); var closestJointIndex = -1; var closestJointDistance = 10; diff --git a/examples/sit.js b/examples/sit.js index 1df877dba6..6ae8a712f1 100644 --- a/examples/sit.js +++ b/examples/sit.js @@ -40,6 +40,8 @@ var passedTime = 0.0; var startPosition = null; var animationLenght = 2.0; +var sitting = false; + // This is the pose we would like to end up var pose = [ {joint:"RightUpLeg", rotation: {x:100.0, y:15.0, z:0.0}}, @@ -101,31 +103,41 @@ var standingUpAnimation = function(deltaTime){ } } +function sitDown() { + sitting = true; + passedTime = 0.0; + startPosition = MyAvatar.position; + storeStartPoseAndTransition(); + try{ + Script.update.disconnect(standingUpAnimation); + } catch(e){ + // no need to handle. if it wasn't connected no harm done + } + Script.update.connect(sittingDownAnimation); + Overlays.editOverlay(sitDownButton, { visible: false }); + Overlays.editOverlay(standUpButton, { visible: true }); +} + +function standUp() { + sitting = false; + passedTime = 0.0; + startPosition = MyAvatar.position; + try{ + Script.update.disconnect(sittingDownAnimation); + } catch (e){} + Script.update.connect(standingUpAnimation); + Overlays.editOverlay(standUpButton, { visible: false }); + Overlays.editOverlay(sitDownButton, { visible: true }); +} + Controller.mousePressEvent.connect(function(event){ var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); if (clickedOverlay == sitDownButton) { - passedTime = 0.0; - startPosition = MyAvatar.position; - storeStartPoseAndTransition(); - try{ - Script.update.disconnect(standingUpAnimation); - } catch(e){ - // no need to handle. if it wasn't connected no harm done - } - Script.update.connect(sittingDownAnimation); - Overlays.editOverlay(sitDownButton, { visible: false }); - Overlays.editOverlay(standUpButton, { visible: true }); + sitDown(); } else if (clickedOverlay == standUpButton) { - passedTime = 0.0; - startPosition = MyAvatar.position; - try{ - Script.update.disconnect(sittingDownAnimation); - } catch (e){} - Script.update.connect(standingUpAnimation); - Overlays.editOverlay(standUpButton, { visible: false }); - Overlays.editOverlay(sitDownButton, { visible: true }); + standUp(); } }) @@ -140,7 +152,19 @@ function update(deltaTime){ } } +function keyPressEvent(event) { + if (event.text === ".") { + if (sitting) { + standUp(); + } else { + sitDown(); + } + } +} + + Script.update.connect(update); +Controller.keyPressEvent.connect(keyPressEvent); Script.scriptEnding.connect(function() { diff --git a/interface/src/avatar/SkeletonModel.cpp b/interface/src/avatar/SkeletonModel.cpp index 3586e525ae..ef5fc3d34b 100644 --- a/interface/src/avatar/SkeletonModel.cpp +++ b/interface/src/avatar/SkeletonModel.cpp @@ -427,7 +427,25 @@ bool SkeletonModel::getEyePositions(glm::vec3& firstEyePosition, glm::vec3& seco return false; } const FBXGeometry& geometry = _geometry->getFBXGeometry(); - return getJointPosition(geometry.leftEyeJointIndex, firstEyePosition) && - getJointPosition(geometry.rightEyeJointIndex, secondEyePosition); + if (getJointPosition(geometry.leftEyeJointIndex, firstEyePosition) && + getJointPosition(geometry.rightEyeJointIndex, secondEyePosition)) { + return true; + } + // no eye joints; try to estimate based on head/neck joints + glm::vec3 neckPosition, headPosition; + if (getJointPosition(geometry.neckJointIndex, neckPosition) && + getJointPosition(geometry.headJointIndex, headPosition)) { + const float EYE_PROPORTION = 0.6f; + glm::vec3 baseEyePosition = glm::mix(neckPosition, headPosition, EYE_PROPORTION); + glm::quat headRotation; + getJointRotation(geometry.headJointIndex, headRotation); + const float EYES_FORWARD = 0.25f; + const float EYE_SEPARATION = 0.1f; + float headHeight = glm::distance(neckPosition, headPosition); + firstEyePosition = baseEyePosition + headRotation * glm::vec3(EYE_SEPARATION, 0.0f, EYES_FORWARD) * headHeight; + secondEyePosition = baseEyePosition + headRotation * glm::vec3(-EYE_SEPARATION, 0.0f, EYES_FORWARD) * headHeight; + return true; + } + return false; } diff --git a/interface/src/ui/OAuthWebViewHandler.cpp b/interface/src/ui/OAuthWebViewHandler.cpp index e93321212c..5415d5d9c3 100644 --- a/interface/src/ui/OAuthWebViewHandler.cpp +++ b/interface/src/ui/OAuthWebViewHandler.cpp @@ -82,7 +82,7 @@ void OAuthWebViewHandler::displayWebviewForAuthorizationURL(const QUrl& authoriz _activeWebView = new QWebView; // keep the window on top and delete it when it closes - _activeWebView->setWindowFlags(Qt::Sheet | Qt::WindowStaysOnTopHint); + _activeWebView->setWindowFlags(Qt::Sheet); _activeWebView->setAttribute(Qt::WA_DeleteOnClose); qDebug() << "Displaying QWebView for OAuth authorization at" << authorizationURL.toString(); diff --git a/libraries/models/src/ModelTreeElement.cpp b/libraries/models/src/ModelTreeElement.cpp index c655a45b57..b87557d073 100644 --- a/libraries/models/src/ModelTreeElement.cpp +++ b/libraries/models/src/ModelTreeElement.cpp @@ -192,7 +192,7 @@ bool ModelTreeElement::findDetailedRayIntersection(const glm::vec3& origin, cons // if it's in our AABOX for our rotated extents, then check to see if it's in our non-AABox if (rotatedExtentsBox.findRayIntersection(origin, direction, localDistance, localFace)) { - + // extents is the model relative, scaled, centered extents of the model glm::mat4 rotation = glm::mat4_cast(model.getModelRotation()); glm::mat4 translation = glm::translate(model.getPosition()); @@ -202,7 +202,7 @@ bool ModelTreeElement::findDetailedRayIntersection(const glm::vec3& origin, cons AABox modelFrameBox(extents.minimum, (extents.maximum - extents.minimum)); glm::vec3 modelFrameOrigin = glm::vec3(worldToModelMatrix * glm::vec4(origin, 1.0f)); - glm::vec3 modelFrameDirection = glm::vec3(worldToModelMatrix * glm::vec4(direction, 1.0f)); + glm::vec3 modelFrameDirection = glm::vec3(worldToModelMatrix * glm::vec4(direction, 0.0f)); // we can use the AABox's ray intersection by mapping our origin and direction into the model frame // and testing intersection there.