Graphic LODoptimization improvements - now draw only points in visible rect

This commit is contained in:
2021-05-27 10:21:21 +03:00
parent c5f45b7078
commit e55259e8d7
2 changed files with 64 additions and 28 deletions

View File

@@ -1202,7 +1202,6 @@ void Graphic::drawGraphics() {
QTransform mat = painter->transform();
painter->resetTransform();
painter->setWorldMatrixEnabled(false);
QPolygonF cpol;
QPen pen;
for (int i = 0; i < graphics.size(); ++i) {
GraphicType & t(graphics[i]);
@@ -1214,10 +1213,41 @@ void Graphic::drawGraphics() {
int gpcnt = src_pol.size();
qreal range = src_pol.back().x() - src_pol.front().x();
qreal ppp = (gpcnt * selrect.width() / qMax(range, 1.E-9) / cwid);
lod = qBound<int>(0, qFloor(log2(ppp) - 2), src_lod.size());
//qDebug() << "draw lod" << lod;
lod = qBound<int>(0, qFloor(log2(ppp) - 1), src_lod.size());
//qDebug() << "draw lod" << lod << src_lod[lod - 1].size();
}
QPolygonF & rpol(lod == 0 ? src_pol : src_lod[lod - 1]);
int ind_start = -1, ind_end = -1;
if (m_LODOptimization) {
qreal xs = selrect.left(), xe = selrect.right(), _offset = 2. / cwid * selrect.width();
xs -= _offset; xe += _offset;
for (int i = 0; i < rpol.size(); ++i) {
qreal px = rpol[i].x();
if (px < xs) continue;
if (ind_start < 0)
ind_start = qMax(0, i - 1);
if (px > xe && ind_end < 0) {
ind_end = qMin(rpol.size(), i + 1);
break;
}
}
if (ind_start < 0) ind_start = 0;
if (ind_end < 0) ind_end = rpol.size();
//qDebug() << "bound" << ind_start << ind_end << rpol.size();
} else {
ind_start = 0;
ind_end = rpol.size();
}
int polsize = ind_end - ind_start;
if (polsize > 0) {
QPolygonF cpol;
if (m_LODOptimization && polsize < rpol.size()) {
cpol.resize(polsize);
memcpy(cpol.data(), &(rpol[ind_start]), polsize * sizeof(QPointF));
//qDebug() << "copy" << polsize;
} else {
cpol = rpol;
}
pen = t.pen;
if (qRound(pen.widthF()) == pen.widthF()) pen.setWidth(pen.width()*thick);
else pen.setWidthF(pen.widthF()*thick);
@@ -1225,17 +1255,17 @@ void Graphic::drawGraphics() {
if (t.lines) {
painter->setPen(pen);
if (t.fill) {
cpol = rpol;
painter->setBrush(t.fill_color);
painter->drawPolygon(mat.map(cpol));
} else
painter->drawPolyline(mat.map(rpol));
painter->drawPolyline(mat.map(cpol));
}
if (t.points) {
if (qRound(t.pointWidth) == t.pointWidth) pen.setWidth(qRound(t.pointWidth*thick));
else pen.setWidthF(t.pointWidth*thick);
painter->setPen(pen);
painter->drawPoints(mat.map(rpol));
painter->drawPoints(mat.map(cpol));
}
}
}
painter->setWorldMatrixEnabled(true);

View File

@@ -151,7 +151,7 @@
<item>
<widget class="QToolButton" name="buttonVarAdd">
<property name="icon">
<iconset resource="../../utils/qad_utils.qrc">
<iconset resource="../../libs/qglview/qglview.qrc">
<normaloff>:/icons/list-add.png</normaloff>:/icons/list-add.png</iconset>
</property>
</widget>
@@ -162,7 +162,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset resource="../../utils/qad_utils.qrc">
<iconset resource="../../libs/blockview/qad_blockview.qrc">
<normaloff>:/icons/edit-delete.png</normaloff>:/icons/edit-delete.png</iconset>
</property>
<property name="shortcut">
@@ -192,7 +192,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset resource="../../utils/qad_utils.qrc">
<iconset resource="../../libs/application/qad_application.qrc">
<normaloff>:/icons/edit-clear.png</normaloff>:/icons/edit-clear.png</iconset>
</property>
</widget>
@@ -224,7 +224,7 @@
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QWidget" name="">
<widget class="QWidget" name="layoutWidget">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTreeWidget" name="treeGraphics">
@@ -272,7 +272,7 @@
<item>
<widget class="QToolButton" name="buttonGraphicAdd">
<property name="icon">
<iconset resource="../../utils/qad_utils.qrc">
<iconset resource="../../libs/qglview/qglview.qrc">
<normaloff>:/icons/list-add.png</normaloff>:/icons/list-add.png</iconset>
</property>
</widget>
@@ -283,7 +283,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset resource="../../utils/qad_utils.qrc">
<iconset resource="../../libs/blockview/qad_blockview.qrc">
<normaloff>:/icons/edit-delete.png</normaloff>:/icons/edit-delete.png</iconset>
</property>
<property name="shortcut">
@@ -313,7 +313,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset resource="../../utils/qad_utils.qrc">
<iconset resource="../../libs/application/qad_application.qrc">
<normaloff>:/icons/edit-clear.png</normaloff>:/icons/edit-clear.png</iconset>
</property>
</widget>
@@ -372,7 +372,13 @@
</customwidget>
</customwidgets>
<resources>
<include location="../../utils/qad_utils.qrc"/>
<include location="../../libs/application/qad_application.qrc"/>
<include location="../../libs/blockview/qad_blockview.qrc"/>
<include location="../../libs/qglview/qglview.qrc"/>
<include location="qpicalculator.qrc"/>
<include location="../../libs/application/qad_application.qrc"/>
<include location="../../libs/blockview/qad_blockview.qrc"/>
<include location="../../libs/qglview/qglview.qrc"/>
<include location="qpicalculator.qrc"/>
</resources>
<connections/>