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:
Olivier Prat 2017-07-21 12:49:51 +02:00
parent 7bc7b1eabc
commit b08e2598c2
4 changed files with 66 additions and 41 deletions

View file

@ -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) {

View file

@ -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);
};

View file

@ -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

View file

@ -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;