Update scene items on overlay3d edits

This commit is contained in:
Zach Pomerantz 2016-02-11 14:09:06 -08:00
parent 01309ffd5f
commit 5d1aedf707
3 changed files with 23 additions and 4 deletions

View file

@ -229,5 +229,6 @@ bool Overlay::addToScene(Overlay::Pointer overlay, std::shared_ptr<render::Scene
void Overlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) { void Overlay::removeFromScene(Overlay::Pointer overlay, std::shared_ptr<render::Scene> scene, render::PendingChanges& pendingChanges) {
pendingChanges.removeItem(_renderItemID); pendingChanges.removeItem(_renderItemID);
_renderItemID = render::Item::INVALID_ITEM_ID;
} }

View file

@ -208,9 +208,7 @@ unsigned int Overlays::addOverlay(Overlay::Pointer overlay) {
render::ScenePointer scene = qApp->getMain3DScene(); render::ScenePointer scene = qApp->getMain3DScene();
render::PendingChanges pendingChanges; render::PendingChanges pendingChanges;
overlay->addToScene(overlay, scene, pendingChanges); overlay->addToScene(overlay, scene, pendingChanges);
scene->enqueuePendingChanges(pendingChanges); scene->enqueuePendingChanges(pendingChanges);
} }
} else { } else {
@ -244,18 +242,35 @@ bool Overlays::editOverlay(unsigned int id, const QScriptValue& properties) {
auto overlay3D = std::static_pointer_cast<Base3DOverlay>(thisOverlay); auto overlay3D = std::static_pointer_cast<Base3DOverlay>(thisOverlay);
bool oldDrawOnHUD = overlay3D->getDrawOnHUD(); bool oldDrawOnHUD = overlay3D->getDrawOnHUD();
thisOverlay->setProperties(properties); render::ItemKey oldItemKey = render::payloadGetKey(thisOverlay);
bool drawOnHUD = overlay3D->getDrawOnHUD();
thisOverlay->setProperties(properties);
render::ScenePointer scene = qApp->getMain3DScene();
render::PendingChanges pendingChanges;
auto itemID = thisOverlay->getRenderItemID();
bool drawOnHUD = overlay3D->getDrawOnHUD();
render::ItemKey itemKey = render::payloadGetKey(thisOverlay);
if (drawOnHUD != oldDrawOnHUD) { if (drawOnHUD != oldDrawOnHUD) {
if (drawOnHUD) { if (drawOnHUD) {
_overlaysWorld.remove(id); _overlaysWorld.remove(id);
_overlaysHUD[id] = thisOverlay; _overlaysHUD[id] = thisOverlay;
if (itemID != render::Item::INVALID_ITEM_ID) {
thisOverlay->removeFromScene(thisOverlay, scene, pendingChanges);
}
} else { } else {
_overlaysHUD.remove(id); _overlaysHUD.remove(id);
_overlaysWorld[id] = thisOverlay; _overlaysWorld[id] = thisOverlay;
thisOverlay->addToScene(thisOverlay, scene, pendingChanges);
}
} else if (itemKey != oldItemKey && !drawOnHUD) {
if (itemID != render::Item::INVALID_ITEM_ID) {
pendingChanges.resortItem(itemID, oldItemKey, itemKey);
} }
} }
scene->enqueuePendingChanges(pendingChanges);
} else { } else {
thisOverlay->setProperties(properties); thisOverlay->setProperties(properties);
} }

View file

@ -117,7 +117,10 @@ public:
bool isSmall() const { return _flags[SMALLER]; } bool isSmall() const { return _flags[SMALLER]; }
void setSmaller(bool smaller) { (smaller ? _flags.set(SMALLER) : _flags.reset(SMALLER)); } void setSmaller(bool smaller) { (smaller ? _flags.set(SMALLER) : _flags.reset(SMALLER)); }
bool operator==(const ItemKey& key) { return (_flags == key._flags); }
bool operator!=(const ItemKey& key) { return (_flags != key._flags); }
}; };
using ItemKeys = std::vector<ItemKey>;
inline QDebug operator<<(QDebug debug, const ItemKey& itemKey) { inline QDebug operator<<(QDebug debug, const ItemKey& itemKey) {
debug << "[ItemKey: isOpaque:" << itemKey.isOpaque() debug << "[ItemKey: isOpaque:" << itemKey.isOpaque()