mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 19:41:20 +02:00
properly delete departing avatars
This commit is contained in:
parent
e9f52b1211
commit
33634cdaa1
5 changed files with 37 additions and 24 deletions
|
@ -150,11 +150,12 @@ float Avatar::getLODDistance() const {
|
||||||
void Avatar::animateScaleChanges(float deltaTime) {
|
void Avatar::animateScaleChanges(float deltaTime) {
|
||||||
float currentScale = getUniformScale();
|
float currentScale = getUniformScale();
|
||||||
if (currentScale != _targetScale) {
|
if (currentScale != _targetScale) {
|
||||||
const float SCALE_ANIMATION_TIMESCALE = 1.0f;
|
const float SCALE_ANIMATION_TIMESCALE = 0.5f;
|
||||||
float blendFactor = deltaTime / SCALE_ANIMATION_TIMESCALE;
|
float scaleVelocity = (_targetScale - currentScale) / SCALE_ANIMATION_TIMESCALE;
|
||||||
float animatedScale = (1.0f - blendFactor) * currentScale + blendFactor * _targetScale;
|
float animatedScale = currentScale + deltaTime * scaleVelocity;
|
||||||
const float CLOSE_ENOUGH = 0.05f;
|
const float MIN_SCALE_SPEED = 0.3f;
|
||||||
if (fabsf(animatedScale - _targetScale) / _targetScale < CLOSE_ENOUGH) {
|
if (fabsf(scaleVelocity) < MIN_SCALE_SPEED) {
|
||||||
|
// close enough
|
||||||
animatedScale = _targetScale;
|
animatedScale = _targetScale;
|
||||||
}
|
}
|
||||||
setScale(glm::vec3(animatedScale)); // avatar scale is uniform
|
setScale(glm::vec3(animatedScale)); // avatar scale is uniform
|
||||||
|
@ -165,6 +166,9 @@ void Avatar::animateScaleChanges(float deltaTime) {
|
||||||
void Avatar::simulate(float deltaTime) {
|
void Avatar::simulate(float deltaTime) {
|
||||||
PerformanceTimer perfTimer("simulate");
|
PerformanceTimer perfTimer("simulate");
|
||||||
|
|
||||||
|
if (!isDead() && !_motionState) {
|
||||||
|
DependencyManager::get<AvatarManager>()->updateAvatarPhysicsShape(this);
|
||||||
|
}
|
||||||
animateScaleChanges(deltaTime);
|
animateScaleChanges(deltaTime);
|
||||||
|
|
||||||
// update the billboard render flag
|
// update the billboard render flag
|
||||||
|
@ -1107,13 +1111,14 @@ void Avatar::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
shapeInfo.setOffset(uniformScale * _skeletonModel.getBoundingCapsuleOffset());
|
shapeInfo.setOffset(uniformScale * _skeletonModel.getBoundingCapsuleOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Avatar::setMotionState(AvatarMotionState* motionState) {
|
||||||
|
_motionState = motionState;
|
||||||
|
}
|
||||||
|
|
||||||
// virtual
|
// virtual
|
||||||
void Avatar::rebuildCollisionShape() {
|
void Avatar::rebuildCollisionShape() {
|
||||||
if (_motionState) {
|
if (_motionState) {
|
||||||
_motionState->addDirtyFlags(Simulation::DIRTY_SHAPE);
|
_motionState->addDirtyFlags(Simulation::DIRTY_SHAPE);
|
||||||
} else {
|
|
||||||
// adebug TODO: move most of updateAvatarPhysicsShape() to here
|
|
||||||
DependencyManager::get<AvatarManager>()->updateAvatarPhysicsShape(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,6 @@ public:
|
||||||
|
|
||||||
virtual void computeShapeInfo(ShapeInfo& shapeInfo);
|
virtual void computeShapeInfo(ShapeInfo& shapeInfo);
|
||||||
|
|
||||||
void setMotionState(AvatarMotionState* motionState) { _motionState = motionState; }
|
|
||||||
AvatarMotionState* getMotionState() { return _motionState; }
|
AvatarMotionState* getMotionState() { return _motionState; }
|
||||||
|
|
||||||
virtual void setPosition(const glm::vec3& position) override;
|
virtual void setPosition(const glm::vec3& position) override;
|
||||||
|
@ -172,6 +171,10 @@ public slots:
|
||||||
glm::quat getRightPalmRotation();
|
glm::quat getRightPalmRotation();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
friend class AvatarManager;
|
||||||
|
|
||||||
|
void setMotionState(AvatarMotionState* motionState);
|
||||||
|
|
||||||
SkeletonModel _skeletonModel;
|
SkeletonModel _skeletonModel;
|
||||||
glm::vec3 _skeletonOffset;
|
glm::vec3 _skeletonOffset;
|
||||||
QVector<Model*> _attachmentModels;
|
QVector<Model*> _attachmentModels;
|
||||||
|
|
|
@ -223,14 +223,14 @@ AvatarSharedPointer AvatarManager::newSharedAvatar() {
|
||||||
AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer) {
|
AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer) {
|
||||||
auto newAvatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer);
|
auto newAvatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer);
|
||||||
auto rawRenderableAvatar = std::static_pointer_cast<Avatar>(newAvatar);
|
auto rawRenderableAvatar = std::static_pointer_cast<Avatar>(newAvatar);
|
||||||
|
|
||||||
render::ScenePointer scene = qApp->getMain3DScene();
|
render::ScenePointer scene = qApp->getMain3DScene();
|
||||||
render::PendingChanges pendingChanges;
|
render::PendingChanges pendingChanges;
|
||||||
if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderAvatars()) {
|
if (DependencyManager::get<SceneScriptingInterface>()->shouldRenderAvatars()) {
|
||||||
rawRenderableAvatar->addToScene(rawRenderableAvatar, scene, pendingChanges);
|
rawRenderableAvatar->addToScene(rawRenderableAvatar, scene, pendingChanges);
|
||||||
}
|
}
|
||||||
scene->enqueuePendingChanges(pendingChanges);
|
scene->enqueuePendingChanges(pendingChanges);
|
||||||
|
|
||||||
return newAvatar;
|
return newAvatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ void AvatarManager::removeAvatarMotionState(AvatarSharedPointer avatar) {
|
||||||
// virtual
|
// virtual
|
||||||
void AvatarManager::removeAvatar(const QUuid& sessionUUID) {
|
void AvatarManager::removeAvatar(const QUuid& sessionUUID) {
|
||||||
QWriteLocker locker(&_hashLock);
|
QWriteLocker locker(&_hashLock);
|
||||||
|
|
||||||
auto removedAvatar = _avatarHash.take(sessionUUID);
|
auto removedAvatar = _avatarHash.take(sessionUUID);
|
||||||
if (removedAvatar) {
|
if (removedAvatar) {
|
||||||
handleRemovedAvatar(removedAvatar);
|
handleRemovedAvatar(removedAvatar);
|
||||||
|
@ -260,7 +260,8 @@ void AvatarManager::removeAvatar(const QUuid& sessionUUID) {
|
||||||
|
|
||||||
void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar) {
|
void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar) {
|
||||||
AvatarHashMap::handleRemovedAvatar(removedAvatar);
|
AvatarHashMap::handleRemovedAvatar(removedAvatar);
|
||||||
|
|
||||||
|
removedAvatar->die();
|
||||||
removeAvatarMotionState(removedAvatar);
|
removeAvatarMotionState(removedAvatar);
|
||||||
_avatarFades.push_back(removedAvatar);
|
_avatarFades.push_back(removedAvatar);
|
||||||
}
|
}
|
||||||
|
@ -268,7 +269,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar
|
||||||
void AvatarManager::clearOtherAvatars() {
|
void AvatarManager::clearOtherAvatars() {
|
||||||
// clear any avatars that came from an avatar-mixer
|
// clear any avatars that came from an avatar-mixer
|
||||||
QWriteLocker locker(&_hashLock);
|
QWriteLocker locker(&_hashLock);
|
||||||
|
|
||||||
AvatarHash::iterator avatarIterator = _avatarHash.begin();
|
AvatarHash::iterator avatarIterator = _avatarHash.begin();
|
||||||
while (avatarIterator != _avatarHash.end()) {
|
while (avatarIterator != _avatarHash.end()) {
|
||||||
auto avatar = std::static_pointer_cast<Avatar>(avatarIterator.value());
|
auto avatar = std::static_pointer_cast<Avatar>(avatarIterator.value());
|
||||||
|
@ -278,7 +279,7 @@ void AvatarManager::clearOtherAvatars() {
|
||||||
} else {
|
} else {
|
||||||
auto removedAvatar = avatarIterator.value();
|
auto removedAvatar = avatarIterator.value();
|
||||||
avatarIterator = _avatarHash.erase(avatarIterator);
|
avatarIterator = _avatarHash.erase(avatarIterator);
|
||||||
|
|
||||||
handleRemovedAvatar(removedAvatar);
|
handleRemovedAvatar(removedAvatar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -375,7 +376,6 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::updateAvatarPhysicsShape(Avatar* avatar) {
|
void AvatarManager::updateAvatarPhysicsShape(Avatar* avatar) {
|
||||||
// adebug TODO: move most of this logic to MyAvatar class
|
|
||||||
assert(!avatar->getMotionState());
|
assert(!avatar->getMotionState());
|
||||||
|
|
||||||
ShapeInfo shapeInfo;
|
ShapeInfo shapeInfo;
|
||||||
|
@ -414,6 +414,6 @@ AvatarSharedPointer AvatarManager::getAvatarBySessionID(const QUuid& sessionID)
|
||||||
if (sessionID == _myAvatar->getSessionUUID()) {
|
if (sessionID == _myAvatar->getSessionUUID()) {
|
||||||
return _myAvatar;
|
return _myAvatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
return findAvatar(sessionID);
|
return findAvatar(sessionID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ public:
|
||||||
glm::vec3 color;
|
glm::vec3 color;
|
||||||
glm::vec3 direction;
|
glm::vec3 direction;
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_INVOKABLE void setLocalLights(const QVector<AvatarManager::LocalLight>& localLights);
|
Q_INVOKABLE void setLocalLights(const QVector<AvatarManager::LocalLight>& localLights);
|
||||||
Q_INVOKABLE QVector<AvatarManager::LocalLight> getLocalLights() const;
|
Q_INVOKABLE QVector<AvatarManager::LocalLight> getLocalLights() const;
|
||||||
// Currently, your own avatar will be included as the null avatar id.
|
// Currently, your own avatar will be included as the null avatar id.
|
||||||
|
@ -67,7 +67,7 @@ public:
|
||||||
void handleCollisionEvents(const CollisionEvents& collisionEvents);
|
void handleCollisionEvents(const CollisionEvents& collisionEvents);
|
||||||
|
|
||||||
void updateAvatarPhysicsShape(Avatar* avatar);
|
void updateAvatarPhysicsShape(Avatar* avatar);
|
||||||
|
|
||||||
// Expose results and parameter-tuning operations to other systems, such as stats and javascript.
|
// Expose results and parameter-tuning operations to other systems, such as stats and javascript.
|
||||||
Q_INVOKABLE float getRenderDistance() { return _renderDistance; }
|
Q_INVOKABLE float getRenderDistance() { return _renderDistance; }
|
||||||
Q_INVOKABLE float getRenderDistanceInverseLowLimit() { return _renderDistanceController.getControlledValueLowLimit(); }
|
Q_INVOKABLE float getRenderDistanceInverseLowLimit() { return _renderDistanceController.getControlledValueLowLimit(); }
|
||||||
|
@ -80,7 +80,7 @@ public:
|
||||||
Q_INVOKABLE void setRenderDistanceKD(float newValue) { _renderDistanceController.setKD(newValue); }
|
Q_INVOKABLE void setRenderDistanceKD(float newValue) { _renderDistanceController.setKD(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceInverseLowLimit(float newValue) { _renderDistanceController.setControlledValueLowLimit(newValue); }
|
Q_INVOKABLE void setRenderDistanceInverseLowLimit(float newValue) { _renderDistanceController.setControlledValueLowLimit(newValue); }
|
||||||
Q_INVOKABLE void setRenderDistanceInverseHighLimit(float newValue);
|
Q_INVOKABLE void setRenderDistanceInverseHighLimit(float newValue);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; }
|
void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; }
|
||||||
void updateAvatarRenderStatus(bool shouldRenderAvatars);
|
void updateAvatarRenderStatus(bool shouldRenderAvatars);
|
||||||
|
@ -90,19 +90,19 @@ private:
|
||||||
AvatarManager(const AvatarManager& other);
|
AvatarManager(const AvatarManager& other);
|
||||||
|
|
||||||
void simulateAvatarFades(float deltaTime);
|
void simulateAvatarFades(float deltaTime);
|
||||||
|
|
||||||
// virtual overrides
|
// virtual overrides
|
||||||
virtual AvatarSharedPointer newSharedAvatar();
|
virtual AvatarSharedPointer newSharedAvatar();
|
||||||
virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer);
|
virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer<Node>& mixerWeakPointer);
|
||||||
void removeAvatarMotionState(AvatarSharedPointer avatar);
|
void removeAvatarMotionState(AvatarSharedPointer avatar);
|
||||||
|
|
||||||
virtual void removeAvatar(const QUuid& sessionUUID);
|
virtual void removeAvatar(const QUuid& sessionUUID);
|
||||||
virtual void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar);
|
virtual void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar);
|
||||||
|
|
||||||
QVector<AvatarSharedPointer> _avatarFades;
|
QVector<AvatarSharedPointer> _avatarFades;
|
||||||
std::shared_ptr<MyAvatar> _myAvatar;
|
std::shared_ptr<MyAvatar> _myAvatar;
|
||||||
quint64 _lastSendAvatarDataTime = 0; // Controls MyAvatar send data rate.
|
quint64 _lastSendAvatarDataTime = 0; // Controls MyAvatar send data rate.
|
||||||
|
|
||||||
QVector<AvatarManager::LocalLight> _localLights;
|
QVector<AvatarManager::LocalLight> _localLights;
|
||||||
|
|
||||||
bool _shouldShowReceiveStats = false;
|
bool _shouldShowReceiveStats = false;
|
||||||
|
|
|
@ -342,6 +342,9 @@ public:
|
||||||
|
|
||||||
glm::vec3 getClientGlobalPosition() { return _globalPosition; }
|
glm::vec3 getClientGlobalPosition() { return _globalPosition; }
|
||||||
|
|
||||||
|
void die() { _isDead = true; }
|
||||||
|
bool isDead() const { return _isDead; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void sendAvatarDataPacket();
|
void sendAvatarDataPacket();
|
||||||
void sendIdentityPacket();
|
void sendIdentityPacket();
|
||||||
|
@ -413,6 +416,8 @@ protected:
|
||||||
// updates about one avatar to another.
|
// updates about one avatar to another.
|
||||||
glm::vec3 _globalPosition;
|
glm::vec3 _globalPosition;
|
||||||
|
|
||||||
|
bool _isDead { false };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar);
|
friend void avatarStateFromFrame(const QByteArray& frameData, AvatarData* _avatar);
|
||||||
static QUrl _defaultFullAvatarModelUrl;
|
static QUrl _defaultFullAvatarModelUrl;
|
||||||
|
|
Loading…
Reference in a new issue