mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-29 12:39:55 +02:00
Restore mutex in overlay interface
This commit is contained in:
parent
70b9e9b41e
commit
97edbb7f37
2 changed files with 74 additions and 25 deletions
|
@ -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++;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue