mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 11:45:36 +02:00
comments, namechange, and temporary debug code
This commit is contained in:
parent
95776c2e51
commit
d4abdcb6c8
8 changed files with 92 additions and 16 deletions
|
@ -4440,8 +4440,8 @@ void Application::update(float deltaTime) {
|
|||
getEntities()->getTree()->withWriteLock([&] {
|
||||
PerformanceTimer perfTimer("handleOutgoingChanges");
|
||||
const VectorOfMotionStates& outgoingChanges = _physicsEngine->getOutgoingChanges();
|
||||
_entitySimulation->handleOutgoingChanges(outgoingChanges);
|
||||
avatarManager->handleOutgoingChanges(outgoingChanges);
|
||||
_entitySimulation->handleChangedMotionStates(outgoingChanges);
|
||||
avatarManager->handleChangedMotionStates(outgoingChanges);
|
||||
});
|
||||
|
||||
if (!_aboutToQuit) {
|
||||
|
|
|
@ -424,7 +424,7 @@ void AvatarManager::getObjectsToChange(VectorOfMotionStates& result) {
|
|||
}
|
||||
}
|
||||
|
||||
void AvatarManager::handleOutgoingChanges(const VectorOfMotionStates& motionStates) {
|
||||
void AvatarManager::handleChangedMotionStates(const VectorOfMotionStates& motionStates) {
|
||||
// TODO: extract the MyAvatar results once we use a MotionState for it.
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ public:
|
|||
void getObjectsToRemoveFromPhysics(VectorOfMotionStates& motionStates);
|
||||
void getObjectsToAddToPhysics(VectorOfMotionStates& motionStates);
|
||||
void getObjectsToChange(VectorOfMotionStates& motionStates);
|
||||
void handleOutgoingChanges(const VectorOfMotionStates& motionStates);
|
||||
void handleChangedMotionStates(const VectorOfMotionStates& motionStates);
|
||||
void handleCollisionEvents(const CollisionEvents& collisionEvents);
|
||||
|
||||
Q_INVOKABLE float getAvatarDataRate(const QUuid& sessionID, const QString& rateName = QString("")) const;
|
||||
|
|
|
@ -655,13 +655,11 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
|||
|
||||
|
||||
// pack SimulationOwner and terse update properties near each other
|
||||
|
||||
// NOTE: the server is authoritative for changes to simOwnerID so we always unpack ownership data
|
||||
// even when we would otherwise ignore the rest of the packet.
|
||||
|
||||
bool filterRejection = false;
|
||||
if (propertyFlags.getHasProperty(PROP_SIMULATION_OWNER)) {
|
||||
|
||||
QByteArray simOwnerData;
|
||||
int bytes = OctreePacketData::unpackDataFromBytes(dataAt, simOwnerData);
|
||||
SimulationOwner newSimOwner;
|
||||
|
@ -676,6 +674,13 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef
|
|||
// or rejects a set of properties, it clears this. In such cases, we don't want those custom
|
||||
// setters to ignore what the server says.
|
||||
filterRejection = newSimOwner.getID().isNull();
|
||||
bool verbose = getName() == "fubar"; // adebug
|
||||
if (verbose && _simulationOwner != newSimOwner) {
|
||||
std::cout << (void*)(this) << " adebug ownership changed "
|
||||
<< _simulationOwner.getID().toString().toStdString() << "." << (int)_simulationOwner.getPriority() << "-->"
|
||||
<< newSimOwner.getID().toString().toStdString() << "." << (int)newSimOwner.getPriority()
|
||||
<< std::endl; // adebug
|
||||
}
|
||||
if (weOwnSimulation) {
|
||||
if (newSimOwner.getID().isNull() && !_simulationOwner.pendingRelease(lastEditedFromBufferAdjusted)) {
|
||||
// entity-server is trying to clear our ownership (probably at our own request)
|
||||
|
@ -1879,12 +1884,16 @@ void EntityItem::setSimulationOwner(const SimulationOwner& owner) {
|
|||
}
|
||||
|
||||
void EntityItem::updateSimulationOwner(const SimulationOwner& owner) {
|
||||
// NOTE: this method only used by EntityServer. The Interface uses special code in readEntityDataFromBuffer().
|
||||
if (wantTerseEditLogging() && _simulationOwner != owner) {
|
||||
qCDebug(entities) << "sim ownership for" << getDebugName() << "is now" << owner;
|
||||
}
|
||||
|
||||
if (_simulationOwner.set(owner)) {
|
||||
_dirtyFlags |= Simulation::DIRTY_SIMULATOR_ID;
|
||||
if (getName() == "fubar") {
|
||||
std::cout << "debug updateSimulationOwner() " << _simulationOwner.getID().toString().toStdString() << "." << (int)(_simulationOwner.getPriority()) << std::endl; // adebug
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1892,10 +1901,14 @@ void EntityItem::clearSimulationOwnership() {
|
|||
if (wantTerseEditLogging() && !_simulationOwner.isNull()) {
|
||||
qCDebug(entities) << "sim ownership for" << getDebugName() << "is now null";
|
||||
}
|
||||
if (getName() == "fubar") {
|
||||
std::cout << "debug clearSimulationOwnership()" << std::endl; // adebug
|
||||
}
|
||||
|
||||
_simulationOwner.clear();
|
||||
// don't bother setting the DIRTY_SIMULATOR_ID flag because clearSimulationOwnership()
|
||||
// is only ever called on the entity-server and the flags are only used client-side
|
||||
// don't bother setting the DIRTY_SIMULATOR_ID flag because:
|
||||
// (a) when entity-server calls clearSimulationOwnership() the dirty-flags are meaningless (only used by interface)
|
||||
// (b) the interface only calls clearSimulationOwnership() in a context that already knows best about dirty flags
|
||||
//_dirtyFlags |= Simulation::DIRTY_SIMULATOR_ID;
|
||||
|
||||
}
|
||||
|
|
|
@ -27,6 +27,18 @@
|
|||
#include "EntityTree.h"
|
||||
#endif
|
||||
|
||||
// adebug TODO BOOKMARK:
|
||||
// The problem is that userB may deactivate and disown and object before userA deactivates
|
||||
// userA will sometimes insert non-zero velocities (and position errors) into the Entity before it is deactivated locally
|
||||
//
|
||||
// It would be nice to prevent data export from Bullet to Entity for unowned objects except in cases where it is really needed (?)
|
||||
// Maybe can recycle _serverPosition and friends to store the "before simulationStep" data to more efficiently figure out
|
||||
// if data should be used for non-owned objects.
|
||||
//
|
||||
// If we do that, we should convert _serverPosition and friends to use Bullet data types for efficiency.
|
||||
//
|
||||
// adebug
|
||||
|
||||
const uint8_t LOOPS_FOR_SIMULATION_ORPHAN = 50;
|
||||
const quint64 USECS_BETWEEN_OWNERSHIP_BIDS = USECS_PER_SECOND / 5;
|
||||
|
||||
|
@ -111,6 +123,10 @@ void EntityMotionState::handleEasyChanges(uint32_t& flags) {
|
|||
flags &= ~Simulation::DIRTY_PHYSICS_ACTIVATION;
|
||||
_body->setActivationState(WANTS_DEACTIVATION);
|
||||
_outgoingPriority = 0;
|
||||
bool verbose = _entity->getName() == "fubar"; // adebug
|
||||
if (verbose) {
|
||||
std::cout << (void*)(this) << " adebug flag for deactivation" << std::endl; // adebug
|
||||
}
|
||||
} else {
|
||||
// disowned object is still moving --> start timer for ownership bid
|
||||
// TODO? put a delay in here proportional to distance from object?
|
||||
|
@ -118,6 +134,13 @@ void EntityMotionState::handleEasyChanges(uint32_t& flags) {
|
|||
_nextOwnershipBid = usecTimestampNow() + USECS_BETWEEN_OWNERSHIP_BIDS;
|
||||
}
|
||||
_loopsWithoutOwner = 0;
|
||||
|
||||
// adebug BOOKMARK: the problem is that userB may deactivate and disown the Object
|
||||
// but it may still be active for userA... who will store slightly non-zero velocities into EntityItem in the meantime
|
||||
//
|
||||
// It would be nice if we could ignore slight outgoing changes for unowned objects that WANT_DEACTIVATION until...
|
||||
// (a) the changes exceed some threshold (--> bid for ownership) or...
|
||||
// (b) they actually get deactivated (--> slam RigidBody positions to agree with EntityItem)
|
||||
} else if (_entity->getSimulatorID() == Physics::getSessionUUID()) {
|
||||
// we just inherited ownership, make sure our desired priority matches what we have
|
||||
upgradeOutgoingPriority(_entity->getSimulationPriority());
|
||||
|
@ -223,11 +246,19 @@ void EntityMotionState::getWorldTransform(btTransform& worldTrans) const {
|
|||
// This callback is invoked by the physics simulation at the end of each simulation step...
|
||||
// iff the corresponding RigidBody is DYNAMIC and has moved.
|
||||
void EntityMotionState::setWorldTransform(const btTransform& worldTrans) {
|
||||
if (!_entity) {
|
||||
return;
|
||||
}
|
||||
|
||||
assert(_entity);
|
||||
assert(entityTreeIsLocked());
|
||||
bool verbose = _entity->getName() == "fubar"; // adebug
|
||||
// adebug BOOKMARK: the problem is that userB may deactivate and disown the Object
|
||||
// but it may still be active for userA... who will store slightly non-zero velocities into EntityItem in the meantime
|
||||
// so what we need to do is ignore setWorldTransform() events for unowned objects when the bullet data is not helpful
|
||||
// until either the data passes some threshold (bid for it) or
|
||||
// it goes inactive (at which point we should slam bullet to agree with entity)
|
||||
if (_body->getActivationState() == WANTS_DEACTIVATION && !_entity->isMoving()) {
|
||||
if (verbose) {
|
||||
std::cout << (void*)(this) << " adebug v = " << _body->getLinearVelocity().length() << " w = " << _body->getAngularVelocity().length() << std::endl; // adebug
|
||||
}
|
||||
}
|
||||
measureBodyAcceleration();
|
||||
bool positionSuccess;
|
||||
_entity->setPosition(bulletToGLM(worldTrans.getOrigin()) + ObjectMotionState::getWorldOffset(), positionSuccess, false);
|
||||
|
@ -245,6 +276,12 @@ void EntityMotionState::setWorldTransform(const btTransform& worldTrans) {
|
|||
"setOrientation failed.*");
|
||||
qCDebug(physics) << "EntityMotionState::setWorldTransform setOrientation failed" << _entity->getID();
|
||||
}
|
||||
if (verbose
|
||||
&& (glm::length(getBodyLinearVelocity()) > 0.0f || glm::length(getBodyAngularVelocity()) > 0.0f)
|
||||
&& _entity->getSimulationOwner().getID().isNull()) {
|
||||
std::cout << (void*)(this) << " adebug set non-zero v on unowned object AS = " << _body->getActivationState() << std::endl; // adebug
|
||||
|
||||
}
|
||||
_entity->setVelocity(getBodyLinearVelocity());
|
||||
_entity->setAngularVelocity(getBodyAngularVelocity());
|
||||
_entity->setLastSimulated(usecTimestampNow());
|
||||
|
@ -293,6 +330,18 @@ bool EntityMotionState::isCandidateForOwnership() const {
|
|||
assert(_body);
|
||||
assert(_entity);
|
||||
assert(entityTreeIsLocked());
|
||||
|
||||
/* adebug
|
||||
bool verbose = _entity->getName() == "fubar"; // adebug
|
||||
if (verbose) {
|
||||
bool isCandidate = _outgoingPriority != 0
|
||||
|| Physics::getSessionUUID() == _entity->getSimulatorID()
|
||||
|| _entity->actionDataNeedsTransmit();
|
||||
if (!isCandidate) {
|
||||
std::cout << (void*)(this) << " adebug not candidate --> erase" << std::endl; // adebug
|
||||
}
|
||||
}
|
||||
*/
|
||||
return _outgoingPriority != 0
|
||||
|| Physics::getSessionUUID() == _entity->getSimulatorID()
|
||||
|| _entity->actionDataNeedsTransmit();
|
||||
|
@ -491,6 +540,7 @@ bool EntityMotionState::shouldSendUpdate(uint32_t simulationStep) {
|
|||
void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_t step) {
|
||||
assert(_entity);
|
||||
assert(entityTreeIsLocked());
|
||||
bool verbose = _entity->getName() == "fubar"; // adebug
|
||||
|
||||
if (!_body->isActive()) {
|
||||
// make sure all derivatives are zero
|
||||
|
@ -576,6 +626,9 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
|
|||
properties.clearSimulationOwner();
|
||||
_outgoingPriority = 0;
|
||||
_entity->setPendingOwnershipPriority(_outgoingPriority, now);
|
||||
if (verbose) {
|
||||
std::cout << (void*)(this) << " adebug sendUpdate() clearOwnership numInactiveUpdates = " << (int)_numInactiveUpdates << std::endl; // adebug
|
||||
}
|
||||
} else if (Physics::getSessionUUID() != _entity->getSimulatorID()) {
|
||||
// we don't own the simulation for this entity yet, but we're sending a bid for it
|
||||
quint8 bidPriority = glm::max<uint8_t>(_outgoingPriority, VOLUNTEER_SIMULATION_PRIORITY);
|
||||
|
@ -586,6 +639,9 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
|
|||
// don't forget to remember that we have made a bid
|
||||
_entity->rememberHasSimulationOwnershipBid();
|
||||
// ...then reset _outgoingPriority in preparation for the next frame
|
||||
if (verbose) {
|
||||
std::cout << (void*)(this) << " adebug sendUpdate() bidOwnership at " << (int)_outgoingPriority << std::endl; // adebug
|
||||
}
|
||||
_outgoingPriority = 0;
|
||||
} else if (_outgoingPriority != _entity->getSimulationPriority()) {
|
||||
// we own the simulation but our desired priority has changed
|
||||
|
@ -597,6 +653,9 @@ void EntityMotionState::sendUpdate(OctreeEditPacketSender* packetSender, uint32_
|
|||
properties.setSimulationOwner(Physics::getSessionUUID(), _outgoingPriority);
|
||||
}
|
||||
_entity->setPendingOwnershipPriority(_outgoingPriority, now);
|
||||
if (verbose) {
|
||||
std::cout << (void*)(this) << " adebug sendUpdate() changePriority to " << (int)_outgoingPriority << std::endl; // adebug
|
||||
}
|
||||
}
|
||||
|
||||
EntityItemID id(_entity->getID());
|
||||
|
|
|
@ -259,13 +259,14 @@ void PhysicalEntitySimulation::getObjectsToChange(VectorOfMotionStates& result)
|
|||
_pendingChanges.clear();
|
||||
}
|
||||
|
||||
void PhysicalEntitySimulation::handleOutgoingChanges(const VectorOfMotionStates& motionStates) {
|
||||
void PhysicalEntitySimulation::handleChangedMotionStates(const VectorOfMotionStates& motionStates) {
|
||||
QMutexLocker lock(&_mutex);
|
||||
|
||||
// walk the motionStates looking for those that correspond to entities
|
||||
for (auto stateItr : motionStates) {
|
||||
ObjectMotionState* state = &(*stateItr);
|
||||
if (state && state->getType() == MOTIONSTATE_TYPE_ENTITY) {
|
||||
assert(state);
|
||||
if (state->getType() == MOTIONSTATE_TYPE_ENTITY) {
|
||||
EntityMotionState* entityState = static_cast<EntityMotionState*>(state);
|
||||
EntityItemPointer entity = entityState->getEntity();
|
||||
assert(entity.get());
|
||||
|
|
|
@ -56,7 +56,7 @@ public:
|
|||
void setObjectsToChange(const VectorOfMotionStates& objectsToChange);
|
||||
void getObjectsToChange(VectorOfMotionStates& result);
|
||||
|
||||
void handleOutgoingChanges(const VectorOfMotionStates& motionStates);
|
||||
void handleChangedMotionStates(const VectorOfMotionStates& motionStates);
|
||||
void handleCollisionEvents(const CollisionEvents& collisionEvents);
|
||||
|
||||
EntityEditPacketSender* getPacketSender() { return _entityPacketSender; }
|
||||
|
@ -67,7 +67,7 @@ private:
|
|||
SetOfEntities _entitiesToAddToPhysics;
|
||||
|
||||
SetOfEntityMotionStates _pendingChanges; // EntityMotionStates already in PhysicsEngine that need their physics changed
|
||||
SetOfEntityMotionStates _outgoingChanges; // EntityMotionStates for which we need to send updates to entity-server
|
||||
SetOfEntityMotionStates _outgoingChanges; // EntityMotionStates for which we may need to send updates to entity-server
|
||||
|
||||
SetOfMotionStates _physicalObjects; // MotionStates of entities in PhysicsEngine
|
||||
|
||||
|
|
|
@ -120,6 +120,9 @@ void ThreadSafeDynamicsWorld::synchronizeMotionState(btRigidBody* body) {
|
|||
void ThreadSafeDynamicsWorld::synchronizeMotionStates() {
|
||||
BT_PROFILE("synchronizeMotionStates");
|
||||
_changedMotionStates.clear();
|
||||
|
||||
// NOTE: m_synchronizeAllMotionStates is 'false' by default for optimization.
|
||||
// See PhysicsEngine::init() where we call _dynamicsWorld->setForceUpdateAllAabbs(false)
|
||||
if (m_synchronizeAllMotionStates) {
|
||||
//iterate over all collision objects
|
||||
for (int i=0;i<m_collisionObjects.size();i++) {
|
||||
|
|
Loading…
Reference in a new issue