From a5d8125aa784c5e690565ec56a8ba415cbc6cabb Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Tue, 11 Aug 2015 17:53:49 -0700 Subject: [PATCH 1/3] Remove obsolete AvatarMixer wire data. (Was duplicated in joint states that are also sent.) --- libraries/avatars/src/AvatarData.cpp | 56 ++----------------- .../networking/src/udt/PacketHeaders.cpp | 2 + libraries/networking/src/udt/PacketHeaders.h | 1 + 3 files changed, 7 insertions(+), 52 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 5b970a95a3..48e613e2da 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -161,16 +161,6 @@ QByteArray AvatarData::toByteArray() { // Body scale destinationBuffer += packFloatRatioToTwoByte(destinationBuffer, _targetScale); - // Head rotation - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalPitch()); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalYaw()); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->getFinalRoll()); - - // Body lean - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanForward); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_leanSideways); - destinationBuffer += packFloatAngleToTwoByte(destinationBuffer, _headData->_torsoTwist); - // Lookat Position memcpy(destinationBuffer, &_headData->_lookAtPosition, sizeof(_headData->_lookAtPosition)); destinationBuffer += sizeof(_headData->_lookAtPosition); @@ -278,25 +268,20 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { quint64 now = usecTimestampNow(); // The absolute minimum size of the update data is as follows: - // 50 bytes of "plain old data" { + // 36 bytes of "plain old data" { // position = 12 bytes // bodyYaw = 2 (compressed float) // bodyPitch = 2 (compressed float) // bodyRoll = 2 (compressed float) // targetScale = 2 (compressed float) - // headPitch = 2 (compressed float) - // headYaw = 2 (compressed float) - // headRoll = 2 (compressed float) - // leanForward = 2 (compressed float) - // leanSideways = 2 (compressed float) - // torsoTwist = 2 (compressed float) // lookAt = 12 // audioLoudness = 4 // } + // + 1 byte for varying data // + 1 byte for pupilSize // + 1 byte for numJoints (0) - // = 51 bytes - int minPossibleSize = 51; + // = 39 bytes + int minPossibleSize = 39; int maxAvailableSize = buffer.size(); if (minPossibleSize > maxAvailableSize) { @@ -354,39 +339,6 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { _targetScale = scale; } // 20 bytes - { // Head rotation - //(NOTE: This needs to become a quaternion to save two bytes) - float headYaw, headPitch, headRoll; - sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*) sourceBuffer, &headPitch); - sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*) sourceBuffer, &headYaw); - sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*) sourceBuffer, &headRoll); - if (glm::isnan(headYaw) || glm::isnan(headPitch) || glm::isnan(headRoll)) { - if (shouldLogError(now)) { - qCDebug(avatars) << "Discard nan AvatarData::headYaw,headPitch,headRoll; displayName = '" << _displayName << "'"; - } - return maxAvailableSize; - } - _headData->setBasePitch(headPitch); - _headData->setBaseYaw(headYaw); - _headData->setBaseRoll(headRoll); - } // 6 bytes - - { // Head lean (relative to pelvis) - float leanForward, leanSideways, torsoTwist; - sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &leanForward); - sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &leanSideways); - sourceBuffer += unpackFloatAngleFromTwoByte((uint16_t*)sourceBuffer, &torsoTwist); - if (glm::isnan(leanForward) || glm::isnan(leanSideways)) { - if (shouldLogError(now)) { - qCDebug(avatars) << "Discard nan AvatarData::leanForward,leanSideways,torsoTwise; displayName = '" << _displayName << "'"; - } - return maxAvailableSize; - } - _headData->_leanForward = leanForward; - _headData->_leanSideways = leanSideways; - _headData->_torsoTwist = torsoTwist; - } // 6 bytes - { // Lookat Position glm::vec3 lookAt; memcpy(&lookAt, sourceBuffer, sizeof(lookAt)); diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 0146abdb7c..db0b5394fa 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -68,6 +68,8 @@ PacketVersion versionForPacketType(PacketType::Value packetType) { case EntityEdit: case EntityData: return VERSION_ENTITIES_POLYLINE; + case AvatarData: + return VERSION_AVATAR_NO_LEAN; default: return 11; } diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 1aeadb1af9..3f408d1329 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -142,5 +142,6 @@ const PacketVersion VERSION_ENTITIES_HAVE_SIMULATION_OWNER_AND_ACTIONS_OVER_WIRE const PacketVersion VERSION_ENTITIES_NEW_PROTOCOL_LAYER = 35; const PacketVersion VERSION_POLYVOX_TEXTURES = 36; const PacketVersion VERSION_ENTITIES_POLYLINE = 37; +const PacketVersion VERSION_AVATAR_NO_LEAN = 38; #endif // hifi_PacketHeaders_h \ No newline at end of file From 0990229c64b9c9418e9e1120c21f7907cae7fcaf Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 11 Aug 2015 18:05:22 -0700 Subject: [PATCH 2/3] cache calculation of aabox and aacubes --- libraries/entities/src/EntityItem.cpp | 100 ++++++++++++++------------ libraries/entities/src/EntityItem.h | 23 ++++-- 2 files changed, 71 insertions(+), 52 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 205d1c339e..0ffcc00ead 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -1185,74 +1185,84 @@ void EntityItem::setDimensions(const glm::vec3& value) { return; } _transform.setScale(value); + requiresRecalcBoxes(); } /// The maximum bounding cube for the entity, independent of it's rotation. /// This accounts for the registration point (upon which rotation occurs around). /// -AACube EntityItem::getMaximumAACube() const { - // * we know that the position is the center of rotation - glm::vec3 centerOfRotation = getPosition(); // also where _registration point is +const AACube& EntityItem::getMaximumAACube() const { + if (_recalcMaxAACube) { + // * we know that the position is the center of rotation + glm::vec3 centerOfRotation = getPosition(); // also where _registration point is - // * we know that the registration point is the center of rotation - // * we can calculate the length of the furthest extent from the registration point - // as the dimensions * max (registrationPoint, (1.0,1.0,1.0) - registrationPoint) - glm::vec3 registrationPoint = (getDimensions() * getRegistrationPoint()); - glm::vec3 registrationRemainder = (getDimensions() * (glm::vec3(1.0f, 1.0f, 1.0f) - getRegistrationPoint())); - glm::vec3 furthestExtentFromRegistration = glm::max(registrationPoint, registrationRemainder); + // * we know that the registration point is the center of rotation + // * we can calculate the length of the furthest extent from the registration point + // as the dimensions * max (registrationPoint, (1.0,1.0,1.0) - registrationPoint) + glm::vec3 registrationPoint = (getDimensions() * getRegistrationPoint()); + glm::vec3 registrationRemainder = (getDimensions() * (glm::vec3(1.0f, 1.0f, 1.0f) - getRegistrationPoint())); + glm::vec3 furthestExtentFromRegistration = glm::max(registrationPoint, registrationRemainder); - // * we know that if you rotate in any direction you would create a sphere - // that has a radius of the length of furthest extent from registration point - float radius = glm::length(furthestExtentFromRegistration); + // * we know that if you rotate in any direction you would create a sphere + // that has a radius of the length of furthest extent from registration point + float radius = glm::length(furthestExtentFromRegistration); - // * we know that the minimum bounding cube of this maximum possible sphere is - // (center - radius) to (center + radius) - glm::vec3 minimumCorner = centerOfRotation - glm::vec3(radius, radius, radius); + // * we know that the minimum bounding cube of this maximum possible sphere is + // (center - radius) to (center + radius) + glm::vec3 minimumCorner = centerOfRotation - glm::vec3(radius, radius, radius); - AACube boundingCube(minimumCorner, radius * 2.0f); - return boundingCube; + _maxAACube = AACube(minimumCorner, radius * 2.0f); + _recalcMaxAACube = false; + } + return _maxAACube; } /// The minimum bounding cube for the entity accounting for it's rotation. /// This accounts for the registration point (upon which rotation occurs around). /// -AACube EntityItem::getMinimumAACube() const { - // _position represents the position of the registration point. - glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; +const AACube& EntityItem::getMinimumAACube() const { + if (_recalcMinAACube) { + // _position represents the position of the registration point. + glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; - glm::vec3 unrotatedMinRelativeToEntity = - (getDimensions() * getRegistrationPoint()); - glm::vec3 unrotatedMaxRelativeToEntity = getDimensions() * registrationRemainder; - Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; - Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(getRotation()); + glm::vec3 unrotatedMinRelativeToEntity = - (getDimensions() * getRegistrationPoint()); + glm::vec3 unrotatedMaxRelativeToEntity = getDimensions() * registrationRemainder; + Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; + Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(getRotation()); - // shift the extents to be relative to the position/registration point - rotatedExtentsRelativeToRegistrationPoint.shiftBy(getPosition()); + // shift the extents to be relative to the position/registration point + rotatedExtentsRelativeToRegistrationPoint.shiftBy(getPosition()); - // the cube that best encompasses extents is... - AABox box(rotatedExtentsRelativeToRegistrationPoint); - glm::vec3 centerOfBox = box.calcCenter(); - float longestSide = box.getLargestDimension(); - float halfLongestSide = longestSide / 2.0f; - glm::vec3 cornerOfCube = centerOfBox - glm::vec3(halfLongestSide, halfLongestSide, halfLongestSide); + // the cube that best encompasses extents is... + AABox box(rotatedExtentsRelativeToRegistrationPoint); + glm::vec3 centerOfBox = box.calcCenter(); + float longestSide = box.getLargestDimension(); + float halfLongestSide = longestSide / 2.0f; + glm::vec3 cornerOfCube = centerOfBox - glm::vec3(halfLongestSide, halfLongestSide, halfLongestSide); - - // old implementation... not correct!!! - return AACube(cornerOfCube, longestSide); + _minAACube = AACube(cornerOfCube, longestSide); + _recalcMinAACube = false; + } + return _minAACube; } -AABox EntityItem::getAABox() const { - // _position represents the position of the registration point. - glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; +const AABox& EntityItem::getAABox() const { + if (_recalcAABox) { + // _position represents the position of the registration point. + glm::vec3 registrationRemainder = glm::vec3(1.0f, 1.0f, 1.0f) - _registrationPoint; - glm::vec3 unrotatedMinRelativeToEntity = - (getDimensions() * _registrationPoint); - glm::vec3 unrotatedMaxRelativeToEntity = getDimensions() * registrationRemainder; - Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; - Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(getRotation()); + glm::vec3 unrotatedMinRelativeToEntity = - (getDimensions() * _registrationPoint); + glm::vec3 unrotatedMaxRelativeToEntity = getDimensions() * registrationRemainder; + Extents unrotatedExtentsRelativeToRegistrationPoint = { unrotatedMinRelativeToEntity, unrotatedMaxRelativeToEntity }; + Extents rotatedExtentsRelativeToRegistrationPoint = unrotatedExtentsRelativeToRegistrationPoint.getRotated(getRotation()); - // shift the extents to be relative to the position/registration point - rotatedExtentsRelativeToRegistrationPoint.shiftBy(getPosition()); + // shift the extents to be relative to the position/registration point + rotatedExtentsRelativeToRegistrationPoint.shiftBy(getPosition()); - return AABox(rotatedExtentsRelativeToRegistrationPoint); + _cachedAABox = AABox(rotatedExtentsRelativeToRegistrationPoint); + _recalcAABox = false; + } + return _cachedAABox; } // NOTE: This should only be used in cases of old bitstreams which only contain radius data diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 57f8883cea..e420d08709 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -214,14 +214,16 @@ public: void setTranformToCenter(const Transform& transform); inline const Transform& getTransform() const { return _transform; } - inline void setTransform(const Transform& transform) { _transform = transform; } + inline void setTransform(const Transform& transform) { _transform = transform; requiresRecalcBoxes(); } /// Position in meters (0.0 - TREE_SCALE) inline const glm::vec3& getPosition() const { return _transform.getTranslation(); } - inline void setPosition(const glm::vec3& value) { _transform.setTranslation(value); } + inline void setPosition(const glm::vec3& value) { _transform.setTranslation(value); requiresRecalcBoxes(); } inline const glm::quat& getRotation() const { return _transform.getRotation(); } - inline void setRotation(const glm::quat& rotation) { _transform.setRotation(rotation); } + inline void setRotation(const glm::quat& rotation) { _transform.setRotation(rotation); requiresRecalcBoxes(); } + + inline void requiresRecalcBoxes() { _recalcAABox = true; _recalcMinAACube = true; _recalcMaxAACube = true; } // Hyperlink related getters and setters QString getHref() const { return _href; } @@ -286,9 +288,9 @@ public: quint64 getExpiry() const; // position, size, and bounds related helpers - AACube getMaximumAACube() const; - AACube getMinimumAACube() const; - AABox getAABox() const; /// axis aligned bounding box in world-frame (meters) + const AACube& getMaximumAACube() const; + const AACube& getMinimumAACube() const; + const AABox& getAABox() const; /// axis aligned bounding box in world-frame (meters) const QString& getScript() const { return _script; } void setScript(const QString& value) { _script = value; } @@ -303,7 +305,7 @@ public: /// registration point as ratio of entity void setRegistrationPoint(const glm::vec3& value) - { _registrationPoint = glm::clamp(value, 0.0f, 1.0f); } + { _registrationPoint = glm::clamp(value, 0.0f, 1.0f); requiresRecalcBoxes(); } const glm::vec3& getAngularVelocity() const { return _angularVelocity; } void setAngularVelocity(const glm::vec3& value) { _angularVelocity = value; } @@ -434,6 +436,13 @@ protected: quint64 _changedOnServer; Transform _transform; + mutable AABox _cachedAABox; + mutable AACube _maxAACube; + mutable AACube _minAACube; + mutable bool _recalcAABox = true; + mutable bool _recalcMinAACube = true; + mutable bool _recalcMaxAACube = true; + float _glowLevel; float _localRenderAlpha; float _density = ENTITY_ITEM_DEFAULT_DENSITY; // kg/m^3 From 0ff283d09e68afad49cdc10088c823e8fe528545 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 12 Aug 2015 12:24:53 -0700 Subject: [PATCH 3/3] Fixing crash in vive controllers --- .../src/input-plugins/ViveControllerManager.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp index dbcaa05143..52b33b9715 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp @@ -65,7 +65,14 @@ ViveControllerManager::ViveControllerManager() : bool ViveControllerManager::isSupported() const { #ifdef Q_OS_WIN - return vr::VR_IsHmdPresent(); + bool success = vr::VR_IsHmdPresent(); + if (success) { + vr::HmdError eError = vr::HmdError_None; + auto hmd = vr::VR_Init(&eError); + success = (hmd != nullptr); + vr::VR_Shutdown(); + } + return success; #else return false; #endif