mirror of
https://github.com/overte-org/overte.git
synced 2025-08-12 15:54:50 +02:00
Some factorization in transition management and transition item application is now completely recursive on sub items and not just level 1 subitems
This commit is contained in:
parent
7bc7b1eabc
commit
b08e2598c2
4 changed files with 66 additions and 41 deletions
|
@ -173,7 +173,7 @@ FadeConfig::FadeConfig()
|
|||
}
|
||||
|
||||
void FadeConfig::setEditedCategory(int value) {
|
||||
assert(value < CATEGORY_COUNT);
|
||||
assert(value < FADE_CATEGORY_COUNT);
|
||||
editedCategory = std::min<int>(FADE_CATEGORY_COUNT, value);
|
||||
emit dirtyCategory();
|
||||
emit dirty();
|
||||
|
@ -578,20 +578,31 @@ void FadeJob::run(const render::RenderContextPointer& renderContext, FadeJob::Ou
|
|||
auto transitionStage = scene->getStage<render::TransitionStage>(render::TransitionStage::getName());
|
||||
uint64_t now = usecTimestampNow();
|
||||
const double deltaTime = (int64_t(now) - int64_t(_previousTime)) / double(USECS_PER_SECOND);
|
||||
render::Transaction transaction;
|
||||
bool isFirstItem = true;
|
||||
bool hasTransaction = false;
|
||||
|
||||
output = (FadeCategory) jobConfig->editedCategory;
|
||||
|
||||
// And now update fade effect
|
||||
for (auto transitionId : *transitionStage) {
|
||||
auto& state = transitionStage->editTransition(transitionId);
|
||||
update(*jobConfig, scene, state, deltaTime);
|
||||
#ifdef DEBUG
|
||||
auto& item = scene->getItem(state.itemId);
|
||||
assert(item.getTransitionId() == transitionId);
|
||||
#endif
|
||||
if (update(*jobConfig, scene, transaction, state, deltaTime)) {
|
||||
hasTransaction = true;
|
||||
}
|
||||
if (isFirstItem) {
|
||||
jobConfig->setProperty("threshold", state.threshold);
|
||||
isFirstItem = false;
|
||||
}
|
||||
}
|
||||
_previousTime = now;
|
||||
if (hasTransaction) {
|
||||
scene->enqueueTransaction(transaction);
|
||||
}
|
||||
}
|
||||
|
||||
const FadeCategory FadeJob::transitionToCategory[render::Transition::TYPE_COUNT] = {
|
||||
|
@ -604,17 +615,17 @@ const FadeCategory FadeJob::transitionToCategory[render::Transition::TYPE_COUNT]
|
|||
FADE_AVATAR_CHANGE
|
||||
};
|
||||
|
||||
void FadeJob::update(const Config& config, const render::ScenePointer& scene, render::Transition& transition, const double deltaTime) const {
|
||||
bool FadeJob::update(const Config& config, const render::ScenePointer& scene, render::Transaction& transaction, render::Transition& transition, const double deltaTime) const {
|
||||
const auto fadeCategory = transitionToCategory[transition.eventType];
|
||||
auto& eventConfig = config.events[fadeCategory];
|
||||
auto& item = scene->getItem(transition.itemId);
|
||||
auto item = scene->getItemSafe(transition.itemId);
|
||||
const double eventDuration = (double)eventConfig.duration;
|
||||
const FadeConfig::Timing timing = (FadeConfig::Timing) eventConfig.timing;
|
||||
|
||||
if (item.exist()) {
|
||||
auto aabb = item.getBound();
|
||||
if (render::Item::isValidID(transition.boundItemId)) {
|
||||
auto& boundItem = scene->getItem(transition.boundItemId);
|
||||
auto boundItem = scene->getItemSafe(transition.boundItemId);
|
||||
if (boundItem.exist()) {
|
||||
aabb = boundItem.getBound();
|
||||
}
|
||||
|
@ -687,12 +698,12 @@ void FadeJob::update(const Config& config, const render::ScenePointer& scene, re
|
|||
transition.threshold = (transition.threshold - 0.5f)*_thresholdScale[fadeCategory] + 0.5f;
|
||||
transition.time += deltaTime;
|
||||
|
||||
// If the transition is finished for more than a number of frames (here 3), garbage collect it.
|
||||
if (transition.isFinished > 3) {
|
||||
render::Transaction transaction;
|
||||
// If the transition is finished for more than a number of frames (here 1), garbage collect it.
|
||||
if (transition.isFinished > 1) {
|
||||
transaction.removeTransitionFromItem(transition.itemId);
|
||||
scene->enqueueTransaction(transaction);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
float FadeJob::computeElementEnterRatio(double time, const double period, FadeConfig::Timing timing) {
|
||||
|
|
|
@ -240,7 +240,7 @@ private:
|
|||
float _thresholdScale[FADE_CATEGORY_COUNT];
|
||||
uint64_t _previousTime{ 0 };
|
||||
|
||||
void update(const Config& config, const render::ScenePointer& scene, render::Transition& transition, const double deltaTime) const;
|
||||
bool update(const Config& config, const render::ScenePointer& scene, render::Transaction& transaction, render::Transition& transition, const double deltaTime) const;
|
||||
static float computeElementEnterRatio(double time, const double period, FadeConfig::Timing timing);
|
||||
|
||||
};
|
||||
|
|
|
@ -41,6 +41,10 @@ void Transaction::removeTransitionFromItem(ItemID id) {
|
|||
_addedTransitions.emplace_back(TransitionAdd{ id, Transition::NONE, render::Item::INVALID_ITEM_ID });
|
||||
}
|
||||
|
||||
void Transaction::reApplyTransitionToItem(ItemID id) {
|
||||
_reAppliedTransitions.emplace_back(TransitionReApply{ id });
|
||||
}
|
||||
|
||||
void Transaction::queryTransitionOnItem(ItemID id, TransitionQueryFunc func) {
|
||||
_queriedTransitions.emplace_back(TransitionQuery{ id, func });
|
||||
}
|
||||
|
@ -60,6 +64,7 @@ void Transaction::merge(const Transaction& transaction) {
|
|||
_resetSelections.insert(_resetSelections.end(), transaction._resetSelections.begin(), transaction._resetSelections.end());
|
||||
_addedTransitions.insert(_addedTransitions.end(), transaction._addedTransitions.begin(), transaction._addedTransitions.end());
|
||||
_queriedTransitions.insert(_queriedTransitions.end(), transaction._queriedTransitions.begin(), transaction._queriedTransitions.end());
|
||||
_reAppliedTransitions.insert(_reAppliedTransitions.end(), transaction._reAppliedTransitions.begin(), transaction._reAppliedTransitions.end());
|
||||
}
|
||||
|
||||
|
||||
|
@ -132,7 +137,7 @@ void Scene::processTransactionQueue() {
|
|||
#ifdef SCENE_ENABLE_TRANSITIONS
|
||||
// add transitions
|
||||
transitionItems(consolidatedTransaction._addedTransitions);
|
||||
|
||||
reApplyTransitions(consolidatedTransaction._reAppliedTransitions);
|
||||
queryTransitionItems(consolidatedTransaction._queriedTransitions);
|
||||
#endif
|
||||
// Update the numItemsAtomic counter AFTER the pending changes went through
|
||||
|
@ -184,11 +189,8 @@ void Scene::removeItems(const Transaction::Removes& transactions) {
|
|||
_masterNonspatialSet.erase(removedID);
|
||||
}
|
||||
|
||||
// If there is a transition on this item, remove it
|
||||
if (item.getTransitionId() != render::TransitionStage::INVALID_INDEX) {
|
||||
auto transitionStage = getStage<TransitionStage>(TransitionStage::getName());
|
||||
transitionStage->removeTransition(item.getTransitionId());
|
||||
}
|
||||
// Remove the transition to prevent updating it for nothing
|
||||
resetItemTransition(removedID);
|
||||
|
||||
// Kill it
|
||||
item.kill();
|
||||
|
@ -240,22 +242,30 @@ void Scene::transitionItems(const Transaction::TransitionAdds& transactions) {
|
|||
auto itemId = std::get<0>(add);
|
||||
// Access the true item
|
||||
const auto& item = _items[itemId];
|
||||
if (item.exist()) {
|
||||
auto transitionId = INVALID_INDEX;
|
||||
auto transitionType = std::get<1>(add);
|
||||
auto boundId = std::get<2>(add);
|
||||
auto transitionId = item.getTransitionId();
|
||||
auto transitionType = std::get<1>(add);
|
||||
auto boundId = std::get<2>(add);
|
||||
|
||||
// Remove pre-existing transition, if need be
|
||||
if (!TransitionStage::isIndexInvalid(item.getTransitionId())) {
|
||||
transitionStage->removeTransition(item.getTransitionId());
|
||||
}
|
||||
// Add a new one.
|
||||
if (transitionType != Transition::NONE) {
|
||||
transitionId = transitionStage->addTransition(itemId, transitionType, boundId);
|
||||
}
|
||||
|
||||
setItemTransition(itemId, transitionId);
|
||||
// Remove pre-existing transition, if need be
|
||||
if (!TransitionStage::isIndexInvalid(transitionId)) {
|
||||
transitionStage->removeTransition(transitionId);
|
||||
transitionId = TransitionStage::INVALID_INDEX;
|
||||
}
|
||||
// Add a new one.
|
||||
if (transitionType != Transition::NONE) {
|
||||
transitionId = transitionStage->addTransition(itemId, transitionType, boundId);
|
||||
}
|
||||
|
||||
setItemTransition(itemId, transitionId);
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::reApplyTransitions(const Transaction::TransitionReApplies& transactions) {
|
||||
for (auto itemId : transactions) {
|
||||
// Access the true item
|
||||
const auto& item = _items[itemId];
|
||||
auto transitionId = item.getTransitionId();
|
||||
setItemTransition(itemId, transitionId);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -302,29 +312,28 @@ void Scene::setItemTransition(ItemID itemId, Index transitionId) {
|
|||
// Access the true item
|
||||
auto& item = _items[itemId];
|
||||
|
||||
item.setTransitionId(transitionId);
|
||||
if (item.exist()) {
|
||||
ItemIDs subItems;
|
||||
|
||||
item.setTransitionId(transitionId);
|
||||
|
||||
// Sub-items share the same transition Id
|
||||
collectSubItems(itemId, subItems);
|
||||
for (auto subItemId : subItems) {
|
||||
auto& subItem = _items[subItemId];
|
||||
subItem.setTransitionId(transitionId);
|
||||
// Curiously... this can happen
|
||||
if (subItemId != itemId) {
|
||||
setItemTransition(subItemId, transitionId);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
qWarning() << "Collecting sub items on item without payload";
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::resetItemTransition(ItemID itemId) {
|
||||
// Access the true item
|
||||
auto& item = _items[itemId];
|
||||
auto transitionStage = getStage<TransitionStage>(TransitionStage::getName());
|
||||
|
||||
transitionStage->removeTransition(item.getTransitionId());
|
||||
setItemTransition(itemId, Transition::NONE);
|
||||
if (!render::TransitionStage::isIndexInvalid(item.getTransitionId())) {
|
||||
auto transitionStage = getStage<TransitionStage>(TransitionStage::getName());
|
||||
transitionStage->removeTransition(item.getTransitionId());
|
||||
setItemTransition(itemId, render::TransitionStage::INVALID_INDEX);
|
||||
}
|
||||
}
|
||||
|
||||
// THis fucntion is thread safe
|
||||
|
|
|
@ -48,6 +48,7 @@ public:
|
|||
|
||||
void addTransitionToItem(ItemID id, Transition::Type transition, ItemID boundId = render::Item::INVALID_ITEM_ID);
|
||||
void removeTransitionFromItem(ItemID id);
|
||||
void reApplyTransitionToItem(ItemID id);
|
||||
void queryTransitionOnItem(ItemID id, TransitionQueryFunc func);
|
||||
|
||||
template <class T> void updateItem(ItemID id, std::function<void(T&)> func) {
|
||||
|
@ -72,6 +73,7 @@ protected:
|
|||
using Update = std::tuple<ItemID, UpdateFunctorPointer>;
|
||||
using TransitionAdd = std::tuple<ItemID, Transition::Type, ItemID>;
|
||||
using TransitionQuery = std::tuple<ItemID, TransitionQueryFunc>;
|
||||
using TransitionReApply = ItemID;
|
||||
using SelectionReset = Selection;
|
||||
|
||||
using Resets = std::vector<Reset>;
|
||||
|
@ -79,6 +81,7 @@ protected:
|
|||
using Updates = std::vector<Update>;
|
||||
using TransitionAdds = std::vector<TransitionAdd>;
|
||||
using TransitionQueries = std::vector<TransitionQuery>;
|
||||
using TransitionReApplies = std::vector<TransitionReApply>;
|
||||
using SelectionResets = std::vector<SelectionReset>;
|
||||
|
||||
Resets _resetItems;
|
||||
|
@ -86,6 +89,7 @@ protected:
|
|||
Updates _updatedItems;
|
||||
TransitionAdds _addedTransitions;
|
||||
TransitionQueries _queriedTransitions;
|
||||
TransitionReApplies _reAppliedTransitions;
|
||||
SelectionResets _resetSelections;
|
||||
};
|
||||
typedef std::queue<Transaction> TransactionQueue;
|
||||
|
@ -169,6 +173,7 @@ protected:
|
|||
void removeItems(const Transaction::Removes& transactions);
|
||||
void updateItems(const Transaction::Updates& transactions);
|
||||
void transitionItems(const Transaction::TransitionAdds& transactions);
|
||||
void reApplyTransitions(const Transaction::TransitionReApplies& transactions);
|
||||
void queryTransitionItems(const Transaction::TransitionQueries& transactions);
|
||||
|
||||
void collectSubItems(ItemID parentId, ItemIDs& subItems) const;
|
||||
|
|
Loading…
Reference in a new issue