mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:50:00 +02:00
only create collision events for owned entities
This commit is contained in:
parent
0809149a8c
commit
2541bfb1a8
5 changed files with 26 additions and 8 deletions
|
@ -1045,8 +1045,6 @@ void EntityTreeRenderer::entityCollisionWithEntity(const EntityItemID& idA, cons
|
||||||
const QUuid& myNodeID = DependencyManager::get<NodeList>()->getSessionUUID();
|
const QUuid& myNodeID = DependencyManager::get<NodeList>()->getSessionUUID();
|
||||||
|
|
||||||
// trigger scripted collision sounds and events for locally owned objects
|
// trigger scripted collision sounds and events for locally owned objects
|
||||||
// BUG! scripts don't get the final COLLISION_EVENT_TYPE_END event in a timely manner because
|
|
||||||
// by the time it gets here the object has been deactivated and local ownership is relenquished.
|
|
||||||
EntityItemPointer entityA = entityTree->findEntityByEntityItemID(idA);
|
EntityItemPointer entityA = entityTree->findEntityByEntityItemID(idA);
|
||||||
if ((bool)entityA && myNodeID == entityA->getSimulatorID()) {
|
if ((bool)entityA && myNodeID == entityA->getSimulatorID()) {
|
||||||
playEntityCollisionSound(entityA, collision);
|
playEntityCollisionSound(entityA, collision);
|
||||||
|
|
|
@ -762,6 +762,11 @@ void EntityMotionState::computeCollisionGroupAndMask(int16_t& group, int16_t& ma
|
||||||
_entity->computeCollisionGroupAndFinalMask(group, mask);
|
_entity->computeCollisionGroupAndFinalMask(group, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EntityMotionState::shouldBeLocallyOwned() const {
|
||||||
|
return (_outgoingPriority > VOLUNTEER_SIMULATION_PRIORITY && _outgoingPriority > _entity->getSimulationPriority()) ||
|
||||||
|
_entity->getSimulatorID() == Physics::getSessionUUID();
|
||||||
|
}
|
||||||
|
|
||||||
void EntityMotionState::upgradeOutgoingPriority(uint8_t priority) {
|
void EntityMotionState::upgradeOutgoingPriority(uint8_t priority) {
|
||||||
_outgoingPriority = glm::max<uint8_t>(_outgoingPriority, priority);
|
_outgoingPriority = glm::max<uint8_t>(_outgoingPriority, priority);
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,8 @@ public:
|
||||||
|
|
||||||
virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const override;
|
virtual void computeCollisionGroupAndMask(int16_t& group, int16_t& mask) const override;
|
||||||
|
|
||||||
|
bool shouldBeLocallyOwned() const override;
|
||||||
|
|
||||||
friend class PhysicalEntitySimulation;
|
friend class PhysicalEntitySimulation;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -146,6 +146,8 @@ public:
|
||||||
void dirtyInternalKinematicChanges() { _hasInternalKinematicChanges = true; }
|
void dirtyInternalKinematicChanges() { _hasInternalKinematicChanges = true; }
|
||||||
void clearInternalKinematicChanges() { _hasInternalKinematicChanges = false; }
|
void clearInternalKinematicChanges() { _hasInternalKinematicChanges = false; }
|
||||||
|
|
||||||
|
virtual bool shouldBeLocallyOwned() const { return false; }
|
||||||
|
|
||||||
friend class PhysicsEngine;
|
friend class PhysicsEngine;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -405,25 +405,36 @@ const CollisionEvents& PhysicsEngine::getCollisionEvents() {
|
||||||
if (type != CONTACT_EVENT_TYPE_CONTINUE || _numSubsteps % CONTINUE_EVENT_FILTER_FREQUENCY == 0) {
|
if (type != CONTACT_EVENT_TYPE_CONTINUE || _numSubsteps % CONTINUE_EVENT_FILTER_FREQUENCY == 0) {
|
||||||
ObjectMotionState* motionStateA = static_cast<ObjectMotionState*>(contactItr->first._a);
|
ObjectMotionState* motionStateA = static_cast<ObjectMotionState*>(contactItr->first._a);
|
||||||
ObjectMotionState* motionStateB = static_cast<ObjectMotionState*>(contactItr->first._b);
|
ObjectMotionState* motionStateB = static_cast<ObjectMotionState*>(contactItr->first._b);
|
||||||
glm::vec3 velocityChange = (motionStateA ? motionStateA->getObjectLinearVelocityChange() : glm::vec3(0.0f)) +
|
|
||||||
(motionStateB ? motionStateB->getObjectLinearVelocityChange() : glm::vec3(0.0f));
|
|
||||||
|
|
||||||
if (motionStateA) {
|
// NOTE: the MyAvatar RigidBody is the only object in the simulation that does NOT have a MotionState
|
||||||
|
// which means should we ever want to report ALL collision events against the avatar we can
|
||||||
|
// modify the logic below.
|
||||||
|
//
|
||||||
|
// We only create events when at least one of the objects is (or should be) owned in the local simulation.
|
||||||
|
if (motionStateA && (motionStateA->shouldBeLocallyOwned())) {
|
||||||
QUuid idA = motionStateA->getObjectID();
|
QUuid idA = motionStateA->getObjectID();
|
||||||
QUuid idB;
|
QUuid idB;
|
||||||
if (motionStateB) {
|
if (motionStateB) {
|
||||||
idB = motionStateB->getObjectID();
|
idB = motionStateB->getObjectID();
|
||||||
}
|
}
|
||||||
glm::vec3 position = bulletToGLM(contact.getPositionWorldOnB()) + _originOffset;
|
glm::vec3 position = bulletToGLM(contact.getPositionWorldOnB()) + _originOffset;
|
||||||
|
glm::vec3 velocityChange = motionStateA->getObjectLinearVelocityChange() +
|
||||||
|
(motionStateB ? motionStateB->getObjectLinearVelocityChange() : glm::vec3(0.0f));
|
||||||
glm::vec3 penetration = bulletToGLM(contact.distance * contact.normalWorldOnB);
|
glm::vec3 penetration = bulletToGLM(contact.distance * contact.normalWorldOnB);
|
||||||
_collisionEvents.push_back(Collision(type, idA, idB, position, penetration, velocityChange));
|
_collisionEvents.push_back(Collision(type, idA, idB, position, penetration, velocityChange));
|
||||||
} else if (motionStateB) {
|
} else if (motionStateB && (motionStateB->shouldBeLocallyOwned())) {
|
||||||
QUuid idB = motionStateB->getObjectID();
|
QUuid idB = motionStateB->getObjectID();
|
||||||
|
QUuid idA;
|
||||||
|
if (motionStateA) {
|
||||||
|
idA = motionStateA->getObjectID();
|
||||||
|
}
|
||||||
glm::vec3 position = bulletToGLM(contact.getPositionWorldOnA()) + _originOffset;
|
glm::vec3 position = bulletToGLM(contact.getPositionWorldOnA()) + _originOffset;
|
||||||
|
glm::vec3 velocityChange = motionStateB->getObjectLinearVelocityChange() +
|
||||||
|
(motionStateA ? motionStateA->getObjectLinearVelocityChange() : glm::vec3(0.0f));
|
||||||
// NOTE: we're flipping the order of A and B (so that the first objectID is never NULL)
|
// NOTE: we're flipping the order of A and B (so that the first objectID is never NULL)
|
||||||
// hence we must negate the penetration (because penetration always points from B to A).
|
// hence we negate the penetration (because penetration always points from B to A).
|
||||||
glm::vec3 penetration = - bulletToGLM(contact.distance * contact.normalWorldOnB);
|
glm::vec3 penetration = - bulletToGLM(contact.distance * contact.normalWorldOnB);
|
||||||
_collisionEvents.push_back(Collision(type, idB, QUuid(), position, penetration, velocityChange));
|
_collisionEvents.push_back(Collision(type, idB, idA, position, penetration, velocityChange));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue