From df4be641eb6d56746c8158f452732cae4d7cf08e Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Fri, 25 Jan 2019 13:42:18 -0700 Subject: [PATCH] More fixes --- interface/src/avatar/AvatarManager.cpp | 54 +++++++++---------- interface/src/avatar/AvatarManager.h | 8 +-- interface/src/avatar/MyAvatar.cpp | 8 +-- interface/src/avatar/MyAvatar.h | 2 - .../src/avatar/MyCharacterController.cpp | 15 +++--- interface/src/avatar/MyCharacterController.h | 4 +- .../src/avatars-renderer/Avatar.cpp | 2 + libraries/physics/src/MultiSphereShape.cpp | 24 +++------ 8 files changed, 48 insertions(+), 69 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 99ac922bc6..6cb585e814 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -636,17 +636,17 @@ AvatarSharedPointer AvatarManager::getAvatarBySessionID(const QUuid& sessionID) RayToAvatarIntersectionResult AvatarManager::findRayIntersection(const PickRay& ray, const QScriptValue& avatarIdsToInclude, const QScriptValue& avatarIdsToDiscard, - const QStringList& jointIndicesToFilter, + const QStringList& jointNamesToFilter, bool pickAgainstMesh) { QVector avatarsToInclude = qVectorEntityItemIDFromScriptValue(avatarIdsToInclude); QVector avatarsToDiscard = qVectorEntityItemIDFromScriptValue(avatarIdsToDiscard); - return findRayIntersectionVector(ray, avatarsToInclude, avatarsToDiscard, jointIndicesToFilter, pickAgainstMesh); + return findRayIntersectionVector(ray, avatarsToInclude, avatarsToDiscard, jointNamesToFilter, pickAgainstMesh); } RayToAvatarIntersectionResult AvatarManager::findRayIntersectionVector(const PickRay& ray, const QVector& avatarsToInclude, const QVector& avatarsToDiscard, - const QStringList& jointIndicesToFilter, + const QStringList& jointNamesToFilter, bool pickAgainstMesh) { RayToAvatarIntersectionResult result; if (QThread::currentThread() != thread()) { @@ -655,35 +655,37 @@ RayToAvatarIntersectionResult AvatarManager::findRayIntersectionVector(const Pic Q_ARG(const PickRay&, ray), Q_ARG(const QVector&, avatarsToInclude), Q_ARG(const QVector&, avatarsToDiscard), - Q_ARG(const QStringList&, jointIndicesToFilter), + Q_ARG(const QStringList&, jointNamesToFilter), Q_ARG(bool, pickAgainstMesh)); return result; } + PROFILE_RANGE(simulation_physics, __FUNCTION__); float distance = (float)INT_MAX; // with FLT_MAX bullet rayTest does not return results - BoxFace face = BoxFace::UNKNOWN_FACE; - glm::vec3 surfaceNormal; - QVariantMap extraInfo; + std::vector physicsResults = _myAvatar->getCharacterController()->rayTest(glmToBullet(ray.origin), glmToBullet(ray.direction), distance, QVector()); - glm::vec3 transformedRayPoint; - glm::vec3 transformedRayDirection; if (physicsResults.size() > 0) { glm::vec3 rayDirectionInv = { ray.direction.x != 0 ? 1.0f / ray.direction.x : INFINITY, - ray.direction.y != 0.0f ? 1.0f / ray.direction.y : INFINITY, - ray.direction.z != 0.0f ? 1.0f / ray.direction.z : INFINITY }; + ray.direction.y != 0.0f ? 1.0f / ray.direction.y : INFINITY, + ray.direction.z != 0.0f ? 1.0f / ray.direction.z : INFINITY }; MyCharacterController::RayAvatarResult rayAvatarResult; AvatarPointer avatar = nullptr; + + BoxFace face = BoxFace::UNKNOWN_FACE; + glm::vec3 surfaceNormal; + QVariantMap extraInfo; + for (auto &hit : physicsResults) { auto avatarID = hit._intersectWithAvatar; bool avatarIsIncluded = avatarsToInclude.contains(avatarID); bool avatarIsDiscarded = avatarsToDiscard.contains(avatarID); - if (jointIndicesToFilter.size() == 0 && ((avatarsToInclude.size() > 0 && !avatarIsIncluded) || - (avatarsToDiscard.size() > 0 && avatarIsDiscarded))) { + if (avatarIsDiscarded || (jointNamesToFilter.size() == 0 && avatarsToInclude.size() > 0 && !avatarIsIncluded)) { continue; } - if (!(_myAvatar->getSessionUUID() == avatarID)) { + + if (_myAvatar->getSessionUUID() != avatarID) { auto avatarMap = getHashCopy(); AvatarHash::iterator itr = avatarMap.find(avatarID); if (itr != avatarMap.end()) { @@ -692,25 +694,17 @@ RayToAvatarIntersectionResult AvatarManager::findRayIntersectionVector(const Pic } else { avatar = _myAvatar; } - QVector jointsToDiscard; - if (avatar && jointIndicesToFilter.size() > 0) { + QVector jointIndicesToDiscard; + if (avatar && jointNamesToFilter.size() > 0 && avatarIsIncluded) { auto names = avatar->getJointNames(); - if (avatarIsIncluded) { - for (int i = 0; i < names.size(); i++) { - if (!jointIndicesToFilter.contains(names[i])) { - jointsToDiscard.push_back(i); - } - } - } else if (avatarIsDiscarded) { - for (int i = 0; i < names.size(); i++) { - if (jointIndicesToFilter.contains(names[i])) { - jointsToDiscard.push_back(i); - } + for (int i = 0; i < names.size(); i++) { + if (!jointNamesToFilter.contains(names[i])) { + jointIndicesToDiscard.push_back(i); } } } if (!hit._isBound) { - if (!jointsToDiscard.contains(hit._intersectWithJoint)) { + if (!jointIndicesToDiscard.contains(hit._intersectWithJoint)) { rayAvatarResult = hit; } } else if (avatar) { @@ -720,7 +714,7 @@ RayToAvatarIntersectionResult AvatarManager::findRayIntersectionVector(const Pic for (size_t i = 0; i < hit._boundJoints.size(); i++) { assert(hit._boundJoints[i] < multiSpheres.size()); auto &mSphere = multiSpheres[hit._boundJoints[i]]; - if (mSphere.isValid() && !jointsToDiscard.contains(hit._boundJoints[i])) { + if (mSphere.isValid() && jointIndicesToDiscard.contains(hit._boundJoints[i])) { float boundDistance = FLT_MAX; BoxFace face; glm::vec3 surfaceNormal; @@ -770,7 +764,7 @@ RayToAvatarIntersectionResult AvatarManager::findRayIntersectionVector(const Pic extraInfo["worldIntersectionPoint"] = vec3toVariant(rayAvatarResult._intersectionPoint); break; } - } else { + } else if (rayAvatarResult._intersect){ break; } } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 4c3b06d1af..447acee248 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -138,26 +138,26 @@ public: * @param {PickRay} ray * @param {Uuid[]} [avatarsToInclude=[]] * @param {Uuid[]} [avatarsToDiscard=[]] - * @param {string[]} [jointIndicesToFilter=[] - If included/discarded avatars are provided only this joints corresponding to those avatars would be included/discarded. ] + * @param {string[]} [jointNamesToFilter=[] - If included avatars are provided only this joints corresponding to those avatars would be included ] * @returns {RayToAvatarIntersectionResult} */ Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersection(const PickRay& ray, const QScriptValue& avatarIdsToInclude = QScriptValue(), const QScriptValue& avatarIdsToDiscard = QScriptValue(), - const QStringList& jointIndicesToFilter = QStringList(), + const QStringList& jointNamesToFilter = QStringList(), bool pickAgainstMesh = true); /**jsdoc * @function AvatarManager.findRayIntersectionVector * @param {PickRay} ray * @param {Uuid[]} avatarsToInclude * @param {Uuid[]} avatarsToDiscard - * @param {string[]} [jointIndicesToFilter=[] - If included/discarded avatars are provided only this joints corresponding to those avatars would be included/discarded. ] + * @param {string[]} [jointNamesToFilter=[] - If included avatars are provided only this joints corresponding to those avatars would be included ] * @returns {RayToAvatarIntersectionResult} */ Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersectionVector(const PickRay& ray, const QVector& avatarsToInclude, const QVector& avatarsToDiscard, - const QStringList& jointIndicesToFilter, + const QStringList& jointNamesToFilter, bool pickAgainstMesh); /**jsdoc diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 641b2dff00..abafe7dec9 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -103,7 +103,7 @@ MyAvatar::MyAvatar(QThread* thread) : _scriptedMotorFrame(SCRIPTED_MOTOR_CAMERA_FRAME), _scriptedMotorMode(SCRIPTED_MOTOR_SIMPLE_MODE), _motionBehaviors(AVATAR_MOTION_DEFAULTS), - _characterController(this), + _characterController(std::shared_ptr(this)), _eyeContactTarget(LEFT_EYE), _realWorldFieldOfView("realWorldFieldOfView", DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES), @@ -2994,14 +2994,13 @@ void MyAvatar::postUpdate(float deltaTime, const render::ScenePointer& scene) { const Rig& rig = _skeletonModel->getRig(); int jointCount = rig.getJointStateCount(); if (jointCount == (int)_multiSphereShapes.size()) { - int count = 0; for (int i = 0; i < jointCount; i++) { AnimPose jointPose; rig.getAbsoluteJointPoseInRigFrame(i, jointPose); const AnimPose pose = rigToWorldPose * jointPose; auto &multiSphere = _multiSphereShapes[i]; auto debugLines = multiSphere.getDebugLines(); - DebugDraw::getInstance().drawRays(debugLines, DEBUG_COLORS[count++ % NUM_DEBUG_COLORS], pose.trans(), pose.rot()); + DebugDraw::getInstance().drawRays(debugLines, DEBUG_COLORS[i % NUM_DEBUG_COLORS], pose.trans(), pose.rot()); } } } @@ -5218,6 +5217,3 @@ void MyAvatar::releaseGrab(const QUuid& grabID) { } } -std::shared_ptr MyAvatar::getMyAvatarSharedPointer() { - return DependencyManager::get()->getMyAvatar(); -} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 5bc9c14f1d..2b6b67ad5e 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -1158,8 +1158,6 @@ public: */ Q_INVOKABLE void releaseGrab(const QUuid& grabID); - std::shared_ptr getMyAvatarSharedPointer(); - AvatarEntityMap getAvatarEntityData() const override; void setAvatarEntityData(const AvatarEntityMap& avatarEntityData) override; void updateAvatarEntity(const QUuid& entityID, const QByteArray& entityData) override; diff --git a/interface/src/avatar/MyCharacterController.cpp b/interface/src/avatar/MyCharacterController.cpp index 7ff3a1e0ee..813bcb44ab 100755 --- a/interface/src/avatar/MyCharacterController.cpp +++ b/interface/src/avatar/MyCharacterController.cpp @@ -26,7 +26,7 @@ void MyCharacterController::RayShotgunResult::reset() { walkable = true; } -MyCharacterController::MyCharacterController(MyAvatar* avatar) { +MyCharacterController::MyCharacterController(std::shared_ptr avatar) { assert(avatar); _avatar = avatar; @@ -370,7 +370,7 @@ btCollisionShape* MyCharacterController::createDetailedCollisionShapeForJoint(in DetailedMotionState* MyCharacterController::createDetailedMotionStateForJoint(int jointIndex) { auto shape = createDetailedCollisionShapeForJoint(jointIndex); if (shape) { - DetailedMotionState* motionState = new DetailedMotionState(_avatar->getMyAvatarSharedPointer(), shape, jointIndex); + DetailedMotionState* motionState = new DetailedMotionState(_avatar, shape, jointIndex); motionState->setMass(_avatar->computeMass()); return motionState; } @@ -384,9 +384,6 @@ void MyCharacterController::clearDetailedMotionStates() { } void MyCharacterController::resetDetailedMotionStates() { - for (size_t i = 0; i < _detailedMotionStates.size(); i++) { - _detailedMotionStates[i] = nullptr; - } _detailedMotionStates.clear(); } @@ -398,7 +395,6 @@ void MyCharacterController::buildPhysicsTransaction(PhysicsEngine::Transaction& _pendingFlags &= ~PENDING_FLAG_REMOVE_DETAILED_FROM_SIMULATION; for (size_t i = 0; i < _detailedMotionStates.size(); i++) { transaction.objectsToRemove.push_back(_detailedMotionStates[i]); - _detailedMotionStates[i] = nullptr; } _detailedMotionStates.clear(); } @@ -423,9 +419,9 @@ void MyCharacterController::handleProcessedPhysicsTransaction(PhysicsEngine::Tra } -class ClosestDetailed : public btCollisionWorld::AllHitsRayResultCallback { +class DetailedRayResultCallback : public btCollisionWorld::AllHitsRayResultCallback { public: - ClosestDetailed() + DetailedRayResultCallback() : btCollisionWorld::AllHitsRayResultCallback(btVector3(0.0f, 0.0f, 0.0f), btVector3(0.0f, 0.0f, 0.0f)) { // the RayResultCallback's group and mask must match MY_AVATAR m_collisionFilterGroup = BULLET_COLLISION_GROUP_DETAILED_RAY; @@ -442,11 +438,12 @@ std::vector MyCharacterController::rayTe std::vector foundAvatars; if (_dynamicsWorld) { btVector3 end = origin + length * direction; - ClosestDetailed rayCallback = ClosestDetailed(); + DetailedRayResultCallback rayCallback = DetailedRayResultCallback(); rayCallback.m_flags |= btTriangleRaycastCallback::kF_KeepUnflippedNormal; rayCallback.m_flags |= btTriangleRaycastCallback::kF_UseSubSimplexConvexCastRaytest; _dynamicsWorld->rayTest(origin, end, rayCallback); if (rayCallback.m_hitFractions.size() > 0) { + foundAvatars.reserve(rayCallback.m_hitFractions.size()); for (int i = 0; i < rayCallback.m_hitFractions.size(); i++) { auto object = rayCallback.m_collisionObjects[i]; ObjectMotionState* motionState = static_cast(object->getUserPointer()); diff --git a/interface/src/avatar/MyCharacterController.h b/interface/src/avatar/MyCharacterController.h index d3a811cf8f..0bc781c2fa 100644 --- a/interface/src/avatar/MyCharacterController.h +++ b/interface/src/avatar/MyCharacterController.h @@ -23,7 +23,7 @@ class DetailedMotionState; class MyCharacterController : public CharacterController { public: - explicit MyCharacterController(MyAvatar* avatar); + explicit MyCharacterController(std::shared_ptr avatar); ~MyCharacterController (); void setDynamicsWorld(btDynamicsWorld* world) override; @@ -77,7 +77,7 @@ private: btConvexHullShape* computeShape() const; protected: - MyAvatar* _avatar { nullptr }; + std::shared_ptr _avatar { nullptr }; // shotgun scan data btAlignedObjectArray _topPoints; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index a34c17550f..bc708bff2d 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -1727,6 +1727,8 @@ void Avatar::computeDetailedShapeInfo(ShapeInfo& shapeInfo, int jointIndex) { auto& data = _multiSphereShapes[jointIndex].getSpheresData(); std::vector positions; std::vector radiuses; + positions.reserve(data.size()); + radiuses.reserve(data.size()); for (auto& sphere : data) { positions.push_back(sphere._position); radiuses.push_back(sphere._radius); diff --git a/libraries/physics/src/MultiSphereShape.cpp b/libraries/physics/src/MultiSphereShape.cpp index 639c8c8e90..656fb64e39 100644 --- a/libraries/physics/src/MultiSphereShape.cpp +++ b/libraries/physics/src/MultiSphereShape.cpp @@ -48,12 +48,10 @@ void SphereRegion::extractEdges(bool reverseY) { if (vec.z == 0.0f) { insertUnique(p1, _edgesX); insertUnique(p2, _edgesX); - } - else if (vec.y == 0.0f && p1.y == yVal && p2.y == yVal) { + } else if (vec.y == 0.0f && p1.y == yVal && p2.y == yVal) { insertUnique(p1, _edgesY); insertUnique(p2, _edgesY); - } - else if (vec.x == 0.0f) { + } else if (vec.x == 0.0f) { insertUnique(p1, _edgesZ); insertUnique(p2, _edgesZ); } @@ -104,8 +102,7 @@ CollisionShapeExtractionMode MultiSphereShape::getExtractionModeByName(const QSt mode = CollisionShapeExtractionMode::SphereCollapse; } else if (isRightHand || isLeftHand) { mode = CollisionShapeExtractionMode::SpheresXY; - } - else if (isSim || isFlow || isEye || isToe) { + } else if (isSim || isFlow || isEye || isToe) { mode = CollisionShapeExtractionMode::None; } return mode; @@ -174,17 +171,13 @@ bool MultiSphereShape::computeMultiSphereShape(int jointIndex, const QString& na if (xyDif < 0.5f * xyEpsilon && xzDif < 0.5f * xzEpsilon && yzDif < 0.5f * yzEpsilon) { applyMode = CollisionShapeExtractionMode::Sphere; - } - else if (xzDif < xzEpsilon) { + } else if (xzDif < xzEpsilon) { applyMode = dimensions.y > dimensions.z ? CollisionShapeExtractionMode::SpheresY : CollisionShapeExtractionMode::SpheresXZ; - } - else if (xyDif < xyEpsilon) { + } else if (xyDif < xyEpsilon) { applyMode = dimensions.z > dimensions.y ? CollisionShapeExtractionMode::SpheresZ : CollisionShapeExtractionMode::SpheresXY; - } - else if (yzDif < yzEpsilon) { + } else if (yzDif < yzEpsilon) { applyMode = dimensions.x > dimensions.y ? CollisionShapeExtractionMode::SpheresX : CollisionShapeExtractionMode::SpheresYZ; - } - else { + } else { applyMode = CollisionShapeExtractionMode::SpheresXYZ; } @@ -473,8 +466,7 @@ void MultiSphereShape::calculateSphereLines(std::vector