Restore mutex in overlay interface

This commit is contained in:
Brad Davis 2017-07-03 14:43:44 -07:00
parent 70b9e9b41e
commit 97edbb7f37
2 changed files with 74 additions and 25 deletions

View file

@ -40,19 +40,23 @@
Q_LOGGING_CATEGORY(trace_render_overlays, "trace.render.overlays") Q_LOGGING_CATEGORY(trace_render_overlays, "trace.render.overlays")
void Overlays::cleanupAllOverlays() { void Overlays::cleanupAllOverlays() {
QMap<OverlayID, Overlay::Pointer> overlaysHUD;
QMap<OverlayID, Overlay::Pointer> overlaysWorld;
{ {
foreach(Overlay::Pointer overlay, _overlaysHUD) { QMutexLocker locker(&_mutex);
_overlaysToDelete.push_back(overlay); overlaysHUD.swap(_overlaysHUD);
} overlaysWorld.swap(_overlaysWorld);
foreach(Overlay::Pointer overlay, _overlaysWorld) {
_overlaysToDelete.push_back(overlay);
}
_overlaysHUD.clear();
_overlaysWorld.clear();
#if OVERLAY_PANELS
_panels.clear();
#endif
} }
foreach(Overlay::Pointer overlay, overlaysHUD) {
_overlaysToDelete.push_back(overlay);
}
foreach(Overlay::Pointer overlay, overlaysWorld) {
_overlaysToDelete.push_back(overlay);
}
#if OVERLAY_PANELS
_panels.clear();
#endif
cleanupOverlaysToDelete(); cleanupOverlaysToDelete();
} }
@ -63,14 +67,19 @@ void Overlays::init() {
} }
void Overlays::update(float deltatime) { void Overlays::update(float deltatime) {
QMap<OverlayID, Overlay::Pointer> overlaysHUD;
QMap<OverlayID, Overlay::Pointer> overlaysWorld;
{ {
foreach(Overlay::Pointer thisOverlay, _overlaysHUD) { QMutexLocker locker(&_mutex);
thisOverlay->update(deltatime); overlaysHUD = _overlaysHUD;
} overlaysWorld = _overlaysWorld;
foreach(Overlay::Pointer thisOverlay, _overlaysWorld) { }
thisOverlay->update(deltatime);
} foreach(const auto& thisOverlay, overlaysHUD) {
thisOverlay->update(deltatime);
}
foreach(const auto& thisOverlay, overlaysWorld) {
thisOverlay->update(deltatime);
} }
cleanupOverlaysToDelete(); cleanupOverlaysToDelete();
@ -110,8 +119,14 @@ void Overlays::renderHUD(RenderArgs* renderArgs) {
int height = size.y; int height = size.y;
mat4 legacyProjection = glm::ortho<float>(0, width, height, 0, -1000, 1000); mat4 legacyProjection = glm::ortho<float>(0, width, height, 0, -1000, 1000);
QMap<OverlayID, Overlay::Pointer> overlaysHUD;
{
QMutexLocker locker(&_mutex);
overlaysHUD = _overlaysHUD;
}
foreach(Overlay::Pointer thisOverlay, _overlaysHUD) {
foreach(Overlay::Pointer thisOverlay, overlaysHUD) {
// Reset all batch pipeline settings between overlay // Reset all batch pipeline settings between overlay
geometryCache->useSimpleDrawPipeline(batch); geometryCache->useSimpleDrawPipeline(batch);
@ -132,7 +147,10 @@ void Overlays::enable() {
_enabled = true; _enabled = true;
} }
// Note, can't be invoked by scripts, but can be called by the InterfaceParentFinder
// class on packet processing threads
Overlay::Pointer Overlays::getOverlay(OverlayID id) const { Overlay::Pointer Overlays::getOverlay(OverlayID id) const {
QMutexLocker locker(&_mutex);
if (_overlaysHUD.contains(id)) { if (_overlaysHUD.contains(id)) {
return _overlaysHUD[id]; return _overlaysHUD[id];
} }
@ -193,13 +211,17 @@ OverlayID Overlays::addOverlay(const Overlay::Pointer& overlay) {
overlay->setOverlayID(thisID); overlay->setOverlayID(thisID);
overlay->setStackOrder(_stackOrder++); overlay->setStackOrder(_stackOrder++);
if (overlay->is3D()) { if (overlay->is3D()) {
_overlaysWorld[thisID] = overlay; {
QMutexLocker locker(&_mutex);
_overlaysWorld[thisID] = overlay;
}
render::ScenePointer scene = qApp->getMain3DScene(); render::ScenePointer scene = qApp->getMain3DScene();
render::Transaction transaction; render::Transaction transaction;
overlay->addToScene(overlay, scene, transaction); overlay->addToScene(overlay, scene, transaction);
scene->enqueueTransaction(transaction); scene->enqueueTransaction(transaction);
} else { } else {
QMutexLocker locker(&_mutex);
_overlaysHUD[thisID] = overlay; _overlaysHUD[thisID] = overlay;
} }
@ -275,6 +297,7 @@ void Overlays::deleteOverlay(OverlayID id) {
Overlay::Pointer overlayToDelete; Overlay::Pointer overlayToDelete;
{ {
QMutexLocker locker(&_mutex);
if (_overlaysHUD.contains(id)) { if (_overlaysHUD.contains(id)) {
overlayToDelete = _overlaysHUD.take(id); overlayToDelete = _overlaysHUD.take(id);
} else if (_overlaysWorld.contains(id)) { } else if (_overlaysWorld.contains(id)) {
@ -378,7 +401,13 @@ OverlayID Overlays::getOverlayAtPoint(const glm::vec2& point) {
if (!_enabled) { if (!_enabled) {
return UNKNOWN_OVERLAY_ID; return UNKNOWN_OVERLAY_ID;
} }
QMapIterator<OverlayID, Overlay::Pointer> i(_overlaysHUD);
QMap<OverlayID, Overlay::Pointer> overlaysHUD;
{
QMutexLocker locker(&_mutex);
overlaysHUD = _overlaysHUD;
}
QMapIterator<OverlayID, Overlay::Pointer> i(overlaysHUD);
const float LARGE_NEGATIVE_FLOAT = -9999999; const float LARGE_NEGATIVE_FLOAT = -9999999;
glm::vec3 origin(pointCopy.x, pointCopy.y, LARGE_NEGATIVE_FLOAT); glm::vec3 origin(pointCopy.x, pointCopy.y, LARGE_NEGATIVE_FLOAT);
@ -466,8 +495,14 @@ RayToOverlayIntersectionResult Overlays::findRayIntersectionInternal(const PickR
float bestDistance = std::numeric_limits<float>::max(); float bestDistance = std::numeric_limits<float>::max();
bool bestIsFront = false; bool bestIsFront = false;
QMap<OverlayID, Overlay::Pointer> overlaysWorld;
{
QMutexLocker locker(&_mutex);
overlaysWorld = _overlaysWorld;
}
RayToOverlayIntersectionResult result; RayToOverlayIntersectionResult result;
QMapIterator<OverlayID, Overlay::Pointer> i(_overlaysWorld); QMapIterator<OverlayID, Overlay::Pointer> i(overlaysWorld);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
OverlayID thisID = i.key(); OverlayID thisID = i.key();
@ -598,13 +633,20 @@ QSizeF Overlays::textSize(OverlayID id, const QString& text) {
return result; return result;
} }
Overlay::Pointer thisOverlay = _overlaysHUD[id]; Overlay::Pointer thisOverlay;
{
QMutexLocker locker(&_mutex);
thisOverlay = _overlaysHUD[id];
}
if (thisOverlay) { if (thisOverlay) {
if (auto textOverlay = std::dynamic_pointer_cast<TextOverlay>(thisOverlay)) { if (auto textOverlay = std::dynamic_pointer_cast<TextOverlay>(thisOverlay)) {
return textOverlay->textSize(text); return textOverlay->textSize(text);
} }
} else { } else {
thisOverlay = _overlaysWorld[id]; {
QMutexLocker locker(&_mutex);
thisOverlay = _overlaysWorld[id];
}
if (auto text3dOverlay = std::dynamic_pointer_cast<Text3DOverlay>(thisOverlay)) { if (auto text3dOverlay = std::dynamic_pointer_cast<Text3DOverlay>(thisOverlay)) {
return text3dOverlay->textSize(text); return text3dOverlay->textSize(text);
} }
@ -675,6 +717,7 @@ bool Overlays::isAddedOverlay(OverlayID id) {
return result; return result;
} }
QMutexLocker locker(&_mutex);
return _overlaysHUD.contains(id) || _overlaysWorld.contains(id); return _overlaysHUD.contains(id) || _overlaysWorld.contains(id);
} }
@ -949,8 +992,13 @@ QVector<QUuid> Overlays::findOverlays(const glm::vec3& center, float radius) {
return result; return result;
} }
QMap<OverlayID, Overlay::Pointer> overlaysWorld;
{
QMutexLocker locker(&_mutex);
overlaysWorld = _overlaysWorld;
}
QMapIterator<OverlayID, Overlay::Pointer> i(_overlaysWorld); QMapIterator<OverlayID, Overlay::Pointer> i(overlaysWorld);
int checked = 0; int checked = 0;
while (i.hasNext()) { while (i.hasNext()) {
checked++; checked++;

View file

@ -319,6 +319,7 @@ signals:
private: private:
void cleanupOverlaysToDelete(); void cleanupOverlaysToDelete();
mutable QMutex _mutex;
QMap<OverlayID, Overlay::Pointer> _overlaysHUD; QMap<OverlayID, Overlay::Pointer> _overlaysHUD;
QMap<OverlayID, Overlay::Pointer> _overlaysWorld; QMap<OverlayID, Overlay::Pointer> _overlaysWorld;
#if OVERLAY_PANELS #if OVERLAY_PANELS