mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 18:16:45 +02:00
adding entities to fade out list;
This commit is contained in:
parent
b9d04c6ebb
commit
db17f094da
8 changed files with 51 additions and 33 deletions
|
@ -531,7 +531,7 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar
|
||||||
// it might not fire until after we create a new instance for the same remote avatar, which creates a race
|
// it might not fire until after we create a new instance for the same remote avatar, which creates a race
|
||||||
// on the creation of entities for that avatar instance and the deletion of entities for this instance
|
// on the creation of entities for that avatar instance and the deletion of entities for this instance
|
||||||
avatar->removeAvatarEntitiesFromTree();
|
avatar->removeAvatarEntitiesFromTree();
|
||||||
|
avatar->setIsFading(false);
|
||||||
if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) {
|
if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) {
|
||||||
emit DependencyManager::get<UsersScriptingInterface>()->enteredIgnoreRadius();
|
emit DependencyManager::get<UsersScriptingInterface>()->enteredIgnoreRadius();
|
||||||
} else if (removalReason == KillAvatarReason::AvatarDisconnected) {
|
} else if (removalReason == KillAvatarReason::AvatarDisconnected) {
|
||||||
|
@ -540,12 +540,11 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar
|
||||||
DependencyManager::get<UsersScriptingInterface>()->avatarDisconnected(avatar->getSessionUUID());
|
DependencyManager::get<UsersScriptingInterface>()->avatarDisconnected(avatar->getSessionUUID());
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
auto scene = qApp->getMain3DScene();
|
auto scene = qApp->getMain3DScene();
|
||||||
avatar->fadeOut(scene, removalReason);
|
avatar->fadeOut(transaction, removalReason);
|
||||||
|
|
||||||
transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatar]() {
|
transaction.transitionFinishedOperator(avatar->getRenderItemID(), [avatar]() {
|
||||||
avatar->setIsFading(false);
|
avatar->setIsFading(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -659,9 +659,8 @@ void Avatar::fadeIn(render::ScenePointer scene) {
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::fadeOut(render::ScenePointer scene, KillAvatarReason reason) {
|
void Avatar::fadeOut(render::Transaction& transaction, KillAvatarReason reason) {
|
||||||
render::Transition::Type transitionType = render::Transition::USER_LEAVE_DOMAIN;
|
render::Transition::Type transitionType = render::Transition::USER_LEAVE_DOMAIN;
|
||||||
render::Transaction transaction;
|
|
||||||
|
|
||||||
if (reason == KillAvatarReason::YourAvatarEnteredTheirBubble) {
|
if (reason == KillAvatarReason::YourAvatarEnteredTheirBubble) {
|
||||||
transitionType = render::Transition::BUBBLE_ISECT_TRESPASSER;
|
transitionType = render::Transition::BUBBLE_ISECT_TRESPASSER;
|
||||||
|
@ -669,7 +668,6 @@ void Avatar::fadeOut(render::ScenePointer scene, KillAvatarReason reason) {
|
||||||
transitionType = render::Transition::BUBBLE_ISECT_OWNER;
|
transitionType = render::Transition::BUBBLE_ISECT_OWNER;
|
||||||
}
|
}
|
||||||
fade(transaction, transitionType);
|
fade(transaction, transitionType);
|
||||||
scene->enqueueTransaction(transaction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Avatar::fade(render::Transaction& transaction, render::Transition::Type type) {
|
void Avatar::fade(render::Transaction& transaction, render::Transition::Type type) {
|
||||||
|
|
|
@ -461,7 +461,7 @@ public:
|
||||||
bool isMoving() const { return _moving; }
|
bool isMoving() const { return _moving; }
|
||||||
|
|
||||||
void fadeIn(render::ScenePointer scene);
|
void fadeIn(render::ScenePointer scene);
|
||||||
void fadeOut(render::ScenePointer scene, KillAvatarReason reason);
|
void fadeOut(render::Transaction& transaction, KillAvatarReason reason);
|
||||||
bool isFading() const { return _isFading; }
|
bool isFading() const { return _isFading; }
|
||||||
void setIsFading(bool isFading) { _isFading = isFading; }
|
void setIsFading(bool isFading) { _isFading = isFading; }
|
||||||
|
|
||||||
|
|
|
@ -214,6 +214,30 @@ void EntityTreeRenderer::stopDomainAndNonOwnedEntities() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EntityTreeRenderer::removeFadedRenderables() {
|
||||||
|
if (_entityRenderablesToFadeOut.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_lock<std::mutex> lock(_entitiesToFadeLock);
|
||||||
|
auto entityIter = _entityRenderablesToFadeOut.begin();
|
||||||
|
auto scene = _viewState->getMain3DScene();
|
||||||
|
render::Transaction transaction;
|
||||||
|
|
||||||
|
while (entityIter != _entityRenderablesToFadeOut.end()) {
|
||||||
|
auto entityRenderable = *entityIter;
|
||||||
|
|
||||||
|
if (!entityRenderable->getIsFading()) {
|
||||||
|
entityRenderable->removeFromScene(scene, transaction);
|
||||||
|
entityIter = _entityRenderablesToFadeOut.erase(entityIter);
|
||||||
|
} else {
|
||||||
|
++entityIter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scene->enqueueTransaction(transaction);
|
||||||
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::clearDomainAndNonOwnedEntities() {
|
void EntityTreeRenderer::clearDomainAndNonOwnedEntities() {
|
||||||
stopDomainAndNonOwnedEntities();
|
stopDomainAndNonOwnedEntities();
|
||||||
|
|
||||||
|
@ -221,17 +245,15 @@ void EntityTreeRenderer::clearDomainAndNonOwnedEntities() {
|
||||||
// remove all entities from the scene
|
// remove all entities from the scene
|
||||||
auto scene = _viewState->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
if (scene) {
|
if (scene) {
|
||||||
render::Transaction transaction;
|
|
||||||
for (const auto& entry : _entitiesInScene) {
|
for (const auto& entry : _entitiesInScene) {
|
||||||
const auto& renderer = entry.second;
|
const auto& renderer = entry.second;
|
||||||
const EntityItemPointer& entityItem = renderer->getEntity();
|
const EntityItemPointer& entityItem = renderer->getEntity();
|
||||||
if (!(entityItem->isLocalEntity() || (entityItem->isAvatarEntity() && entityItem->getOwningAvatarID() == getTree()->getMyAvatarSessionUUID()))) {
|
if (!(entityItem->isLocalEntity() || (entityItem->isAvatarEntity() && entityItem->getOwningAvatarID() == getTree()->getMyAvatarSessionUUID()))) {
|
||||||
renderer->removeFromScene(scene, transaction);
|
fadeOutRenderable(renderer);
|
||||||
} else {
|
} else {
|
||||||
savedEntities[entry.first] = entry.second;
|
savedEntities[entry.first] = entry.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scene->enqueueTransaction(transaction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_renderablesToUpdate = savedEntities;
|
_renderablesToUpdate = savedEntities;
|
||||||
|
@ -258,12 +280,10 @@ void EntityTreeRenderer::clear() {
|
||||||
// remove all entities from the scene
|
// remove all entities from the scene
|
||||||
auto scene = _viewState->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
if (scene) {
|
if (scene) {
|
||||||
render::Transaction transaction;
|
|
||||||
for (const auto& entry : _entitiesInScene) {
|
for (const auto& entry : _entitiesInScene) {
|
||||||
const auto& renderer = entry.second;
|
const auto& renderer = entry.second;
|
||||||
renderer->removeFromScene(scene, transaction);
|
fadeOutRenderable(renderer);
|
||||||
}
|
}
|
||||||
scene->enqueueTransaction(transaction);
|
|
||||||
} else {
|
} else {
|
||||||
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
|
qCWarning(entitiesrenderer) << "EntitityTreeRenderer::clear(), Unexpected null scene, possibly during application shutdown";
|
||||||
}
|
}
|
||||||
|
@ -531,6 +551,7 @@ void EntityTreeRenderer::update(bool simulate) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
removeFadedRenderables();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::handleSpaceUpdate(std::pair<int32_t, glm::vec4> proxyUpdate) {
|
void EntityTreeRenderer::handleSpaceUpdate(std::pair<int32_t, glm::vec4> proxyUpdate) {
|
||||||
|
@ -1016,10 +1037,7 @@ void EntityTreeRenderer::deletingEntity(const EntityItemID& entityID) {
|
||||||
|
|
||||||
forceRecheckEntities(); // reset our state to force checking our inside/outsideness of entities
|
forceRecheckEntities(); // reset our state to force checking our inside/outsideness of entities
|
||||||
|
|
||||||
// here's where we remove the entity payload from the scene
|
fadeOutRenderable(renderable);
|
||||||
render::Transaction transaction;
|
|
||||||
renderable->removeFromScene(scene, transaction);
|
|
||||||
scene->enqueueTransaction(transaction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) {
|
void EntityTreeRenderer::addingEntity(const EntityItemID& entityID) {
|
||||||
|
@ -1057,15 +1075,17 @@ void EntityTreeRenderer::checkAndCallPreload(const EntityItemID& entityID, bool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderable::fadeOutRenderable(const EntityRendererPointer& renderable) {
|
void EntityTreeRenderer::fadeOutRenderable(const EntityRendererPointer& renderable) {
|
||||||
render::Transaction transaction;
|
render::Transaction transaction;
|
||||||
auto scene = qApp->getMain3DScene();
|
auto scene = _viewState->getMain3DScene();
|
||||||
|
|
||||||
|
renderable->setIsFading(true);
|
||||||
transaction.transitionFinishedOperator(renderable->getRenderItemID(), [renderable]() {
|
transaction.transitionFinishedOperator(renderable->getRenderItemID(), [renderable]() {
|
||||||
renderable->setIsFading(false);
|
renderable->setIsFading(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
scene->enqueueTransaction(transaction);
|
scene->enqueueTransaction(transaction);
|
||||||
|
_entityRenderablesToFadeOut.push_back(renderable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityTreeRenderer::playEntityCollisionSound(const EntityItemPointer& entity, const Collision& collision) {
|
void EntityTreeRenderer::playEntityCollisionSound(const EntityItemPointer& entity, const Collision& collision) {
|
||||||
|
|
|
@ -93,7 +93,7 @@ public:
|
||||||
/// reloads the entity scripts, calling unload and preload
|
/// reloads the entity scripts, calling unload and preload
|
||||||
void reloadEntityScripts();
|
void reloadEntityScripts();
|
||||||
|
|
||||||
void fadeOutRenderable(const EntityRenderablePointer& renderable);
|
void fadeOutRenderable(const EntityRendererPointer& renderable);
|
||||||
void removeFadedRenderables();
|
void removeFadedRenderables();
|
||||||
|
|
||||||
// event handles which may generate entity related events
|
// event handles which may generate entity related events
|
||||||
|
@ -258,7 +258,9 @@ private:
|
||||||
std::unordered_map<EntityItemID, EntityRendererPointer> _renderablesToUpdate;
|
std::unordered_map<EntityItemID, EntityRendererPointer> _renderablesToUpdate;
|
||||||
std::unordered_map<EntityItemID, EntityRendererPointer> _entitiesInScene;
|
std::unordered_map<EntityItemID, EntityRendererPointer> _entitiesInScene;
|
||||||
std::unordered_map<EntityItemID, EntityItemWeakPointer> _entitiesToAdd;
|
std::unordered_map<EntityItemID, EntityItemWeakPointer> _entitiesToAdd;
|
||||||
std::vector<EntityRendererPointer> _entityRendersToFadeOut;
|
|
||||||
|
std::mutex _entitiesToFadeLock;
|
||||||
|
std::vector<EntityRendererPointer> _entityRenderablesToFadeOut;
|
||||||
// For Scene.shouldRenderEntities
|
// For Scene.shouldRenderEntities
|
||||||
QList<EntityItemID> _entityIDsLastInScene;
|
QList<EntityItemID> _entityIDsLastInScene;
|
||||||
|
|
||||||
|
|
|
@ -418,9 +418,7 @@ void EntityRenderer::doRenderUpdateSynchronous(const ScenePointer& scene, Transa
|
||||||
if (fading || _prevIsTransparent != transparent) {
|
if (fading || _prevIsTransparent != transparent) {
|
||||||
emit requestRenderUpdate();
|
emit requestRenderUpdate();
|
||||||
}
|
}
|
||||||
if (fading) {
|
|
||||||
_isFading = Interpolate::calculateFadeRatio(_fadeStartTime) < 1.0f;
|
|
||||||
}
|
|
||||||
_prevIsTransparent = transparent;
|
_prevIsTransparent = transparent;
|
||||||
|
|
||||||
updateModelTransformAndBound();
|
updateModelTransformAndBound();
|
||||||
|
|
|
@ -461,8 +461,8 @@ void Scene::resetTransitionFinishedOperator(const Transaction::TransitionFinishe
|
||||||
TransitionStage::Index transitionId = item.getTransitionId();
|
TransitionStage::Index transitionId = item.getTransitionId();
|
||||||
if (!TransitionStage::isIndexInvalid(transitionId)) {
|
if (!TransitionStage::isIndexInvalid(transitionId)) {
|
||||||
_transitionFinishedOperatorMap[transitionId].emplace_back(func);
|
_transitionFinishedOperatorMap[transitionId].emplace_back(func);
|
||||||
} else {
|
} else if (func) {
|
||||||
fucn();
|
func();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -559,7 +559,7 @@ void Scene::resetItemTransition(ItemID itemId) {
|
||||||
auto transitionStage = getStage<TransitionStage>(TransitionStage::getName());
|
auto transitionStage = getStage<TransitionStage>(TransitionStage::getName());
|
||||||
|
|
||||||
auto finishedOperators = _transitionFinishedOperatorMap[transitionId];
|
auto finishedOperators = _transitionFinishedOperatorMap[transitionId];
|
||||||
|
qDebug() << "removing transition: " << transitionId;
|
||||||
for (auto finishedOperator : finishedOperators) {
|
for (auto finishedOperator : finishedOperators) {
|
||||||
if (finishedOperator) {
|
if (finishedOperator) {
|
||||||
finishedOperator();
|
finishedOperator();
|
||||||
|
|
|
@ -34,6 +34,7 @@ class Scene;
|
||||||
// of updating the scene before it s rendered.
|
// of updating the scene before it s rendered.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
class Transaction {
|
class Transaction {
|
||||||
friend class Scene;
|
friend class Scene;
|
||||||
public:
|
public:
|
||||||
|
@ -230,7 +231,7 @@ protected:
|
||||||
mutable std::mutex _selectionsMutex; // mutable so it can be used in the thread safe getSelection const method
|
mutable std::mutex _selectionsMutex; // mutable so it can be used in the thread safe getSelection const method
|
||||||
SelectionMap _selections;
|
SelectionMap _selections;
|
||||||
|
|
||||||
std::unordered_map<TransitionStage::Index, std::vector<Transaction::TransitionFinishedFunc>> _transitionFinishedOperatorMap;
|
std::unordered_map<int32_t, std::vector<Transaction::TransitionFinishedFunc>> _transitionFinishedOperatorMap;
|
||||||
|
|
||||||
void resetSelections(const Transaction::SelectionResets& transactions);
|
void resetSelections(const Transaction::SelectionResets& transactions);
|
||||||
// More actions coming to selections soon:
|
// More actions coming to selections soon:
|
||||||
|
|
Loading…
Reference in a new issue