mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 16:55:07 +02:00
Change meaning/naming of collision points in CollisionPick API to better match spec and be more clear
This commit is contained in:
parent
083991dc1a
commit
8f993e4740
3 changed files with 35 additions and 28 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>;
|
||||
|
|
Loading…
Reference in a new issue