diff options
-rw-r--r-- | gui/fpgaviewwidget.cc | 24 | ||||
-rw-r--r-- | gui/lineshader.cc | 8 |
2 files changed, 19 insertions, 13 deletions
diff --git a/gui/fpgaviewwidget.cc b/gui/fpgaviewwidget.cc index 16f70056..a6552ec9 100644 --- a/gui/fpgaviewwidget.cc +++ b/gui/fpgaviewwidget.cc @@ -202,8 +202,6 @@ void FPGAViewWidget::renderGraphicElement(LineShaderData &out, PickQuadTree::Bou bb.setY0(std::min(bb.y0(), y + el.y1)); bb.setX1(std::max(bb.x1(), x + el.x2)); bb.setY1(std::max(bb.y1(), y + el.y2)); - - out.last_render++; return; } @@ -213,8 +211,6 @@ void FPGAViewWidget::renderGraphicElement(LineShaderData &out, PickQuadTree::Bou bb.setY0(std::min(bb.y0(), y + el.y1)); bb.setX1(std::max(bb.x1(), x + el.x2)); bb.setY1(std::max(bb.y1(), y + el.y2)); - - out.last_render++; return; } } @@ -461,12 +457,18 @@ void FPGAViewWidget::renderLines(void) highlightedOrSelectedChanged = rendererArgs_->changed; rendererArgs_->changed = false; - flags = rendererArgs_->flags; } // Render decals if necessary. if (decalsChanged) { + int last_render[GraphicElement::STYLE_HIGHLIGHTED0]; + { + QMutexLocker locker(&rendererDataLock_); + for(int i =0; i<GraphicElement::STYLE_HIGHLIGHTED0; i++) + last_render[i] = rendererData_->gfxByStyle[(enum GraphicElement::style_t)i].last_render; + } + auto data = std::unique_ptr<FPGAViewWidget::RendererData>(new FPGAViewWidget::RendererData); // Reset bounding box. data->bbGlobal.clear(); @@ -532,7 +534,8 @@ void FPGAViewWidget::renderLines(void) for (int i = 0; i < 8; i++) data->gfxHighlighted[i] = rendererData_->gfxHighlighted[i]; } - + for(int i =0; i<GraphicElement::STYLE_HIGHLIGHTED0; i++) + data->gfxByStyle[(enum GraphicElement::style_t)i].last_render = ++last_render[i]; rendererData_ = std::move(data); } } @@ -543,6 +546,7 @@ void FPGAViewWidget::renderLines(void) // Whether the currently being hovered decal is also selected. bool hoveringSelected = false; // Render selected. + int prev = rendererData_->gfxSelected.indices.size(); rendererData_->bbSelected.clear(); rendererData_->gfxSelected.clear(); for (auto &decal : selectedDecals) { @@ -550,19 +554,27 @@ void FPGAViewWidget::renderLines(void) hoveringSelected = true; renderDecal(rendererData_->gfxSelected, rendererData_->bbSelected, decal); } + int curr = rendererData_->gfxSelected.indices.size(); + if (curr!=prev) rendererData_->gfxSelected.last_render++; // Render hovered. + prev = rendererData_->gfxHovered.indices.size(); rendererData_->gfxHovered.clear(); if (!hoveringSelected) { renderDecal(rendererData_->gfxHovered, rendererData_->bbGlobal, hoveredDecal); } + curr = rendererData_->gfxHovered.indices.size(); + if (curr!=prev) rendererData_->gfxHovered.last_render++; // Render highlighted. for (int i = 0; i < 8; i++) { + prev = rendererData_->gfxHighlighted[i].indices.size(); rendererData_->gfxHighlighted[i].clear(); for (auto &decal : highlightedDecals[i]) { renderDecal(rendererData_->gfxHighlighted[i], rendererData_->bbGlobal, decal); } + curr = rendererData_->gfxHighlighted[i].indices.size(); + if (curr!=prev) rendererData_->gfxHighlighted[i].last_render++; } } diff --git a/gui/lineshader.cc b/gui/lineshader.cc index 0f762b38..fc726df5 100644 --- a/gui/lineshader.cc +++ b/gui/lineshader.cc @@ -214,14 +214,8 @@ void LineShader::update_vbos(enum GraphicElement::style_t style, buffers_[style].last_vbo_update = line.last_render; buffers_[style].indices = line.indices.size(); - if (buffers_[style].indices == 0) { - // invalidate buffers - buffers_[style].position.allocate(nullptr, 0); - buffers_[style].normal.allocate(nullptr, 0); - buffers_[style].miter.allocate(nullptr, 0); - buffers_[style].index.allocate(nullptr, 0); + if (buffers_[style].indices == 0) return; - } buffers_[style].position.bind(); buffers_[style].position.allocate(&line.vertices[0], sizeof(Vertex2DPOD) * line.vertices.size()); |