Graphic LODoptimization improvements - now draw only points in visible rect
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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/>
|
||||
|
||||
Reference in New Issue
Block a user