mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 18:21:16 +02:00
plug grab leak, more correct names
This commit is contained in:
parent
ee3fde9df1
commit
09fe9735fa
5 changed files with 32 additions and 15 deletions
|
@ -452,6 +452,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar
|
||||||
_spaceProxiesToDelete.push_back(avatar->getSpaceIndex());
|
_spaceProxiesToDelete.push_back(avatar->getSpaceIndex());
|
||||||
}
|
}
|
||||||
AvatarHashMap::handleRemovedAvatar(avatar, removalReason);
|
AvatarHashMap::handleRemovedAvatar(avatar, removalReason);
|
||||||
|
avatar->tearDownGrabs();
|
||||||
|
|
||||||
avatar->die();
|
avatar->die();
|
||||||
queuePhysicsChange(avatar);
|
queuePhysicsChange(avatar);
|
||||||
|
|
|
@ -817,7 +817,7 @@ void MyAvatar::simulate(float deltaTime, bool inView) {
|
||||||
// and all of its joints, now update our attachements.
|
// and all of its joints, now update our attachements.
|
||||||
Avatar::simulateAttachments(deltaTime);
|
Avatar::simulateAttachments(deltaTime);
|
||||||
relayJointDataToChildren();
|
relayJointDataToChildren();
|
||||||
if (updateGrabs()) {
|
if (applyGrabChanges()) {
|
||||||
_cauterizationNeedsUpdate = true;
|
_cauterizationNeedsUpdate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5310,7 +5310,7 @@ void MyAvatar::releaseGrab(const QUuid& grabID) {
|
||||||
|
|
||||||
_avatarGrabsLock.withWriteLock([&] {
|
_avatarGrabsLock.withWriteLock([&] {
|
||||||
if (_avatarGrabData.remove(grabID)) {
|
if (_avatarGrabData.remove(grabID)) {
|
||||||
_deletedAvatarGrabs.push_back(grabID);
|
_grabsToDelete.push_back(grabID);
|
||||||
tellHandler = true;
|
tellHandler = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -225,7 +225,7 @@ void OtherAvatar::simulate(float deltaTime, bool inView) {
|
||||||
|
|
||||||
{
|
{
|
||||||
PROFILE_RANGE(simulation, "grabs");
|
PROFILE_RANGE(simulation, "grabs");
|
||||||
updateGrabs();
|
applyGrabChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateFadingStatus();
|
updateFadingStatus();
|
||||||
|
|
|
@ -324,8 +324,8 @@ void Avatar::removeAvatarEntitiesFromTree() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Avatar::updateGrabs() {
|
bool Avatar::applyGrabChanges() {
|
||||||
if (!_avatarGrabDataChanged && _changedAvatarGrabs.empty() && _deletedAvatarGrabs.empty()) {
|
if (!_avatarGrabDataChanged && _grabsToChange.empty() && _grabsToDelete.empty()) {
|
||||||
// early exit for most common case: nothing to do
|
// early exit for most common case: nothing to do
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -340,11 +340,11 @@ bool Avatar::updateGrabs() {
|
||||||
GrabPointer grab = std::make_shared<Grab>();
|
GrabPointer grab = std::make_shared<Grab>();
|
||||||
grab->fromByteArray(_avatarGrabData.value(grabID));
|
grab->fromByteArray(_avatarGrabData.value(grabID));
|
||||||
_avatarGrabs[grabID] = grab;
|
_avatarGrabs[grabID] = grab;
|
||||||
_changedAvatarGrabs.insert(grabID);
|
_grabsToChange.insert(grabID);
|
||||||
} else {
|
} else {
|
||||||
bool changed = itr->second->fromByteArray(_avatarGrabData.value(grabID));
|
bool changed = itr->second->fromByteArray(_avatarGrabData.value(grabID));
|
||||||
if (changed) {
|
if (changed) {
|
||||||
_changedAvatarGrabs.insert(grabID);
|
_grabsToChange.insert(grabID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -353,7 +353,7 @@ bool Avatar::updateGrabs() {
|
||||||
|
|
||||||
// delete _avatarGrabs
|
// delete _avatarGrabs
|
||||||
VectorOfIDs undeleted;
|
VectorOfIDs undeleted;
|
||||||
for (const auto& id : _deletedAvatarGrabs) {
|
for (const auto& id : _grabsToDelete) {
|
||||||
MapOfGrabs::iterator itr = _avatarGrabs.find(id);
|
MapOfGrabs::iterator itr = _avatarGrabs.find(id);
|
||||||
if (itr == _avatarGrabs.end()) {
|
if (itr == _avatarGrabs.end()) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -370,11 +370,11 @@ bool Avatar::updateGrabs() {
|
||||||
undeleted.push_back(id);
|
undeleted.push_back(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_deletedAvatarGrabs = std::move(undeleted);
|
_grabsToDelete = std::move(undeleted);
|
||||||
|
|
||||||
// change _avatarGrabs and add Actions to target
|
// change _avatarGrabs and add Actions to target
|
||||||
SetOfIDs unchanged;
|
SetOfIDs unchanged;
|
||||||
for (const auto& id : _changedAvatarGrabs) {
|
for (const auto& id : _grabsToChange) {
|
||||||
MapOfGrabs::iterator itr = _avatarGrabs.find(id);
|
MapOfGrabs::iterator itr = _avatarGrabs.find(id);
|
||||||
if (itr == _avatarGrabs.end()) {
|
if (itr == _avatarGrabs.end()) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -396,7 +396,7 @@ bool Avatar::updateGrabs() {
|
||||||
unchanged.insert(id);
|
unchanged.insert(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_changedAvatarGrabs = std::move(unchanged);
|
_grabsToChange = std::move(unchanged);
|
||||||
});
|
});
|
||||||
return grabAddedOrRemoved;
|
return grabAddedOrRemoved;
|
||||||
}
|
}
|
||||||
|
@ -423,6 +423,20 @@ void Avatar::accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& g
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Avatar::tearDownGrabs() {
|
||||||
|
_avatarGrabsLock.withWriteLock([&] {
|
||||||
|
for (const auto& entry : _avatarGrabs) {
|
||||||
|
_grabsToDelete.push_back(entry.first);
|
||||||
|
}
|
||||||
|
_grabsToChange.clear();
|
||||||
|
});
|
||||||
|
applyGrabChanges();
|
||||||
|
if (!_grabsToDelete.empty()) {
|
||||||
|
// some grabs failed to delete, which is a possible "leak", so we log about it
|
||||||
|
qWarning() << "Failed to tearDown" << _grabsToDelete.size() << "grabs for Avatar" << getID();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Avatar::relayJointDataToChildren() {
|
void Avatar::relayJointDataToChildren() {
|
||||||
forEachChild([&](SpatiallyNestablePointer child) {
|
forEachChild([&](SpatiallyNestablePointer child) {
|
||||||
if (child->getNestableType() == NestableType::Entity) {
|
if (child->getNestableType() == NestableType::Entity) {
|
||||||
|
@ -1925,7 +1939,7 @@ void Avatar::clearAvatarGrabData(const QUuid& id) {
|
||||||
AvatarData::clearAvatarGrabData(id);
|
AvatarData::clearAvatarGrabData(id);
|
||||||
_avatarGrabsLock.withWriteLock([&] {
|
_avatarGrabsLock.withWriteLock([&] {
|
||||||
if (_avatarGrabs.find(id) == _avatarGrabs.end()) {
|
if (_avatarGrabs.find(id) == _avatarGrabs.end()) {
|
||||||
_deletedAvatarGrabs.push_back(id);
|
_grabsToDelete.push_back(id);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -441,6 +441,8 @@ public:
|
||||||
|
|
||||||
void accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& grabAccumulators);
|
void accumulateGrabPositions(std::map<QUuid, GrabLocationAccumulator>& grabAccumulators);
|
||||||
|
|
||||||
|
void tearDownGrabs();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void targetScaleChanged(float targetScale);
|
void targetScaleChanged(float targetScale);
|
||||||
|
|
||||||
|
@ -543,7 +545,7 @@ protected:
|
||||||
|
|
||||||
// protected methods...
|
// protected methods...
|
||||||
bool isLookingAtMe(AvatarSharedPointer avatar) const;
|
bool isLookingAtMe(AvatarSharedPointer avatar) const;
|
||||||
bool updateGrabs();
|
bool applyGrabChanges();
|
||||||
void relayJointDataToChildren();
|
void relayJointDataToChildren();
|
||||||
|
|
||||||
void fade(render::Transaction& transaction, render::Transition::Type type);
|
void fade(render::Transaction& transaction, render::Transition::Type type);
|
||||||
|
@ -637,8 +639,8 @@ protected:
|
||||||
using MapOfGrabs = std::map<QUuid, GrabPointer>;
|
using MapOfGrabs = std::map<QUuid, GrabPointer>;
|
||||||
|
|
||||||
MapOfGrabs _avatarGrabs;
|
MapOfGrabs _avatarGrabs;
|
||||||
SetOfIDs _changedAvatarGrabs; // updated grab IDs -- changes needed to entities or physics
|
SetOfIDs _grabsToChange; // updated grab IDs -- changes needed to entities or physics
|
||||||
VectorOfIDs _deletedAvatarGrabs; // deleted grab IDs -- changes needed to entities or physics
|
VectorOfIDs _grabsToDelete; // deleted grab IDs -- changes needed to entities or physics
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_Avatar_h
|
#endif // hifi_Avatar_h
|
||||||
|
|
Loading…
Reference in a new issue