From ce986c367e61549c4e175b74de1807a3e56098b7 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Sun, 15 Dec 2013 19:53:24 -0800 Subject: [PATCH] palms detect collision --- interface/src/avatar/Hand.cpp | 19 ++++++++++++++++++- interface/src/avatar/Hand.h | 1 - libraries/avatars/src/HandData.cpp | 3 ++- libraries/avatars/src/HandData.h | 4 ++++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/Hand.cpp b/interface/src/avatar/Hand.cpp index f59929b35a..164f7e9791 100755 --- a/interface/src/avatar/Hand.cpp +++ b/interface/src/avatar/Hand.cpp @@ -293,9 +293,22 @@ void Hand::updateCollisions() { for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { if (node->getLinkedData() && node->getType() == NODE_TYPE_AGENT) { Avatar* otherAvatar = (Avatar*)node->getLinkedData(); + // Check for palm collisions + glm::vec3 myPalmPosition = palm.getPosition(); + float palmCollisionDistance = 0.1f; + palm.setIsCollidingWithPalm(false); + for (int j = 0; j < getNumPalms(); j++) { + PalmData& otherPalm = otherAvatar->getHand().getPalms()[j]; + glm::vec3 otherPalmPosition = otherPalm.getPosition(); + if (glm::length(otherPalmPosition - myPalmPosition) < palmCollisionDistance) { + palm.setIsCollidingWithPalm(true); + + } + } glm::vec3 avatarPenetration; if (otherAvatar->findSpherePenetration(palm.getPosition(), scaledPalmRadius, avatarPenetration)) { totalPenetration = addPenetrations(totalPenetration, avatarPenetration); + // Check for collisions with the other avatar's leap palms } } } @@ -469,7 +482,11 @@ void Hand::renderLeapHands() { PalmData& palm = getPalms()[i]; if (palm.isActive()) { const float palmThickness = 0.02f; - glColor4f(handColor.r, handColor.g, handColor.b, 0.25); + if (palm.getIsCollidingWithPalm()) { + glColor4f(1, 0, 0, 0.50); + } else { + glColor4f(handColor.r, handColor.g, handColor.b, 0.25); + } glm::vec3 tip = palm.getPosition(); glm::vec3 root = palm.getPosition() + palm.getNormal() * palmThickness; Avatar::renderJointConnectingCone(root, tip, 0.05, 0.03); diff --git a/interface/src/avatar/Hand.h b/interface/src/avatar/Hand.h index 451da1b878..0e5355c721 100755 --- a/interface/src/avatar/Hand.h +++ b/interface/src/avatar/Hand.h @@ -79,7 +79,6 @@ private: std::vector _leapFingerRootBalls; glm::vec3 _lastFingerAddVoxel, _lastFingerDeleteVoxel; - bool _isCollidingWithVoxel; VoxelDetail _collidingVoxel; glm::vec3 _collisionCenter; diff --git a/libraries/avatars/src/HandData.cpp b/libraries/avatars/src/HandData.cpp index 12af614de3..6dd54bf08c 100644 --- a/libraries/avatars/src/HandData.cpp +++ b/libraries/avatars/src/HandData.cpp @@ -70,7 +70,8 @@ _leapID(LEAPID_INVALID), _sixenseID(SIXENSEID_INVALID), _numFramesWithoutData(0), _owningHandData(owningHandData), -_isCollidingWithVoxel(false) +_isCollidingWithVoxel(false), +_isCollidingWithPalm(false) { for (int i = 0; i < NUM_FINGERS_PER_HAND; ++i) { _fingers.push_back(FingerData(this, owningHandData)); diff --git a/libraries/avatars/src/HandData.h b/libraries/avatars/src/HandData.h index e299382c66..753e24d38b 100755 --- a/libraries/avatars/src/HandData.h +++ b/libraries/avatars/src/HandData.h @@ -172,6 +172,9 @@ public: bool getIsCollidingWithVoxel() { return _isCollidingWithVoxel; } void setIsCollidingWithVoxel(bool isCollidingWithVoxel) { _isCollidingWithVoxel = isCollidingWithVoxel; } + bool getIsCollidingWithPalm() { return _isCollidingWithPalm; } + void setIsCollidingWithPalm(bool isCollidingWithPalm) { _isCollidingWithPalm = isCollidingWithPalm; } + private: std::vector _fingers; glm::quat _rawRotation; @@ -195,6 +198,7 @@ private: HandData* _owningHandData; bool _isCollidingWithVoxel; /// Whether the finger of this palm is inside a leaf voxel + bool _isCollidingWithPalm; };