Change meaning/naming of collision points in CollisionPick API to better match spec and be more clear

This commit is contained in:
sabrina-shanman 2018-07-25 11:31:27 -07:00
parent 083991dc1a
commit 8f993e4740
3 changed files with 35 additions and 28 deletions

View file

@ -40,25 +40,25 @@ public:
variantMap["intersects"] = intersects;
QVariantList qIntersectingEntities;
QVariantList qEntityIntersections;
for (auto intersectingEntity : intersectingEntities) {
QVariantMap qIntersectingEntity;
qIntersectingEntity["objectID"] = intersectingEntity.id;
qIntersectingEntity["pickCollisionPoint"] = vec3toVariant(intersectingEntity.pickCollisionPoint);
qIntersectingEntity["entityCollisionPoint"] = vec3toVariant(intersectingEntity.entityCollisionPoint);
qIntersectingEntities.append(qIntersectingEntity);
QVariantMap qEntityIntersection;
qEntityIntersection["objectID"] = intersectingEntity.id;
qEntityIntersection["pickCollisionPoint"] = vec3toVariant(intersectingEntity.testCollisionPoint);
qEntityIntersection["entityCollisionPoint"] = vec3toVariant(intersectingEntity.foundCollisionPoint);
qEntityIntersections.append(qEntityIntersection);
}
variantMap["intersectingEntities"] = qIntersectingEntities;
variantMap["entityIntersections"] = qEntityIntersections;
QVariantList qIntersectingAvatars;
QVariantList qAvatarIntersections;
for (auto intersectingAvatar : intersectingAvatars) {
QVariantMap qIntersectingAvatar;
qIntersectingAvatar["objectID"] = intersectingAvatar.id;
qIntersectingAvatar["pickCollisionPoint"] = vec3toVariant(intersectingAvatar.pickCollisionPoint);
qIntersectingAvatar["entityCollisionPoint"] = vec3toVariant(intersectingAvatar.entityCollisionPoint);
qIntersectingAvatars.append(qIntersectingAvatar);
QVariantMap qAvatarIntersection;
qAvatarIntersection["objectID"] = intersectingAvatar.id;
qAvatarIntersection["pickCollisionPoint"] = vec3toVariant(intersectingAvatar.testCollisionPoint);
qAvatarIntersection["entityCollisionPoint"] = vec3toVariant(intersectingAvatar.foundCollisionPoint);
qAvatarIntersections.append(qAvatarIntersection);
}
variantMap["intersectingAvatars"] = qIntersectingAvatars;
variantMap["avatarIntersections"] = qAvatarIntersections;
variantMap["collisionRegion"] = pickVariant;

View file

@ -874,17 +874,17 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback {
btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0, int partId0, int index0, const btCollisionObjectWrapper* colObj1, int partId1, int index1) override {
const btCollisionObject* otherBody;
btVector3 point;
btVector3 otherPoint;
btVector3 penetrationPoint;
btVector3 otherPenetrationPoint;
if (colObj0->m_collisionObject == &collisionObject) {
otherBody = colObj1->m_collisionObject;
point = cp.m_localPointA;
otherPoint = cp.m_localPointB;
penetrationPoint = getWorldPoint(cp.m_localPointB, colObj1->getWorldTransform());
otherPenetrationPoint = getWorldPoint(cp.m_localPointA, colObj0->getWorldTransform());
}
else {
otherBody = colObj0->m_collisionObject;
point = cp.m_localPointB;
otherPoint = cp.m_localPointA;
penetrationPoint = getWorldPoint(cp.m_localPointA, colObj0->getWorldTransform());
otherPenetrationPoint = getWorldPoint(cp.m_localPointB, colObj1->getWorldTransform());
}
if (!(otherBody->getInternalType() & btCollisionObject::CO_RIGID_BODY)) {
@ -899,10 +899,15 @@ struct AllContactsCallback : public btCollisionWorld::ContactResultCallback {
}
// This is the correct object type. Add it to the list.
intersectingObjects.emplace_back(candidate->getObjectID(), bulletToGLM(point), bulletToGLM(otherPoint));
intersectingObjects.emplace_back(candidate->getObjectID(), bulletToGLM(penetrationPoint), bulletToGLM(otherPenetrationPoint));
return 0;
}
protected:
static btVector3 getWorldPoint(const btVector3& localPoint, const btTransform& transform) {
return quatRotate(transform.getRotation(), localPoint) + transform.getOrigin();
}
};
std::vector<EntityIntersection> PhysicsEngine::getCollidingInRegion(MotionStateType desiredObjectType, const ShapeInfo& regionShapeInfo, const Transform& regionTransform) const {

View file

@ -48,19 +48,21 @@ struct EntityIntersection {
EntityIntersection(const EntityIntersection& entityIntersection) :
id(entityIntersection.id),
pickCollisionPoint(entityIntersection.pickCollisionPoint),
entityCollisionPoint(entityIntersection.entityCollisionPoint) {
testCollisionPoint(entityIntersection.testCollisionPoint),
foundCollisionPoint(entityIntersection.foundCollisionPoint) {
}
EntityIntersection(QUuid id, glm::vec3 selfCollisionPoint, glm::vec3 otherCollisionPoint) :
EntityIntersection(QUuid id, glm::vec3 testCollisionPoint, glm::vec3 otherCollisionPoint) :
id(id),
pickCollisionPoint(selfCollisionPoint),
entityCollisionPoint(otherCollisionPoint) {
testCollisionPoint(testCollisionPoint),
foundCollisionPoint(otherCollisionPoint) {
}
QUuid id;
glm::vec3 pickCollisionPoint;
glm::vec3 entityCollisionPoint;
// The deepest point of an intersection within the volume of the test shape, in world space.
glm::vec3 testCollisionPoint;
// The deepest point of an intersection within the volume of the found object, in world space.
glm::vec3 foundCollisionPoint;
};
using ContactMap = std::map<ContactKey, ContactInfo>;