tools/drawMapTest/drawmapscene.cpp
author nemo
Mon, 10 Apr 2017 12:06:43 -0400
changeset 12213 bb5522e88ab2
parent 4471 220d44cb8659
permissions -rw-r--r--
bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
     1
#include <QDebug>
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
     2
#include <QGraphicsSceneMouseEvent>
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
     3
#include <QGraphicsPathItem>
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
     4
#include <QtEndian>
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
     5
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
     6
#include "drawmapscene.h"
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
     7
4434
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
     8
template <class T> T sqr(const T & x)
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
     9
{
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
    10
    return x*x;
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
    11
}
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
    12
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    13
DrawMapScene::DrawMapScene(QObject *parent) :
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    14
    QGraphicsScene(parent),
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    15
    m_pen(Qt::yellow),
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    16
    m_brush(Qt::yellow)
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    17
{
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    18
    setSceneRect(0, 0, 4096, 2048);
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    19
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    20
    QLinearGradient gradient(0, 0, 0, 2048);
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    21
    gradient.setColorAt(0, QColor(60, 60, 155));
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    22
    gradient.setColorAt(1, QColor(155, 155, 60));
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    23
    setBackgroundBrush(QBrush(gradient));
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    24
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    25
    m_pen.setWidth(67);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    26
    m_pen.setJoinStyle(Qt::RoundJoin);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    27
    m_pen.setCapStyle(Qt::RoundCap);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    28
    m_currPath = 0;
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    29
}
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    30
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    31
void DrawMapScene::mouseMoveEvent(QGraphicsSceneMouseEvent * mouseEvent)
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    32
{
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    33
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    34
    qDebug() << "move" << mouseEvent->scenePos();
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    35
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    36
    if(m_currPath && (mouseEvent->buttons() & Qt::LeftButton))
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    37
    {
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    38
        QPainterPath path = m_currPath->path();
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    39
        path.lineTo(mouseEvent->scenePos());
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
    40
        paths.first().append(mouseEvent->scenePos().toPoint());
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    41
        m_currPath->setPath(path);
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    42
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    43
        emit pathChanged();
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    44
    }
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    45
}
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    46
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    47
void DrawMapScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    48
{
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    49
    qDebug() << "press" << mouseEvent->scenePos();
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    50
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    51
    m_currPath = addPath(QPainterPath(), m_pen);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    52
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    53
    QPainterPath path = m_currPath->path();
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    54
    QPointF p = mouseEvent->scenePos();
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    55
    p += QPointF(0.01, 0.01);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    56
    path.moveTo(p);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    57
    path.lineTo(mouseEvent->scenePos());
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
    58
    paths.prepend(QList<QPoint>() << mouseEvent->scenePos().toPoint());
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    59
    m_currPath->setPath(path);
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    60
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    61
    emit pathChanged();
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    62
}
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    63
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    64
void DrawMapScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    65
{
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    66
    qDebug() << "release" << mouseEvent->scenePos();
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    67
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
    68
    simplifyLast();
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
    69
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    70
    m_currPath = 0;
4423
4391526e436e Initial commit of the Draw Map Scene
unc0rr
parents:
diff changeset
    71
}
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    72
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    73
void DrawMapScene::undo()
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    74
{
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    75
    if(items().size())
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    76
    {
4426
969e411c72aa Improve map editor a bit
unc0rr
parents: 4424
diff changeset
    77
        removeItem(items().first());
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
    78
        paths.removeFirst();
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    79
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    80
        emit pathChanged();
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    81
    }
4424
3225ea34e415 Some basic functionality
unc0rr
parents: 4423
diff changeset
    82
}
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    83
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    84
QByteArray DrawMapScene::encode()
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    85
{
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    86
    QByteArray b;
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    87
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    88
    foreach(QList<QPoint> points, paths)
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    89
    {
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    90
        int cnt = 0;
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    91
        foreach(QPoint point, points)
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    92
        {
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    93
            qint16 px = qToBigEndian((qint16)point.x());
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    94
            qint16 py = qToBigEndian((qint16)point.y());
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    95
            quint8 flags = 2;
4442
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
    96
            if(!cnt) flags |= 0x80;
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    97
            b.append((const char *)&px, 2);
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
    98
            b.append((const char *)&py, 2);
4457
ffb766e85150 - Change painted map file format
unc0rr
parents: 4442
diff changeset
    99
            b.append((const char *)&flags, 1);
4427
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   100
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   101
            ++cnt;
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   102
        }
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   103
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   104
    }
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   105
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   106
    return b;
c5193713055f Basic encoding of drawn map
unc0rr
parents: 4426
diff changeset
   107
}
4434
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   108
4442
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   109
void DrawMapScene::decode(QByteArray data)
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   110
{
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   111
    clear();
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   112
    paths.clear();
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   113
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   114
    QList<QPoint> points;
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   115
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   116
    while(data.size() >= 5)
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   117
    {
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   118
        qint16 px = qFromBigEndian(*(qint16 *)data.data());
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   119
        data.remove(0, 2);
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   120
        qint16 py = qFromBigEndian(*(qint16 *)data.data());
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   121
        data.remove(0, 2);
4457
ffb766e85150 - Change painted map file format
unc0rr
parents: 4442
diff changeset
   122
        quint8 flags = *(quint8 *)data.data();
ffb766e85150 - Change painted map file format
unc0rr
parents: 4442
diff changeset
   123
        data.remove(0, 1);
4442
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   124
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   125
        //last chunk or first point
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   126
        if((data.size() < 5) || (flags & 0x80))
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   127
        {
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   128
            if(points.size())
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   129
            {
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   130
                qDebug() << points;
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   131
                addPath(pointsToPath(points), m_pen);
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   132
                paths.prepend(points);
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   133
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   134
                points.clear();
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   135
            }
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   136
        }
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   137
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   138
        points.append(QPoint(px, py));
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   139
    }
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   140
}
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   141
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   142
void DrawMapScene::simplifyLast()
4434
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   143
{
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   144
    QList<QPoint> points = paths[0];
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   145
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   146
    QPoint prevPoint = points.first();
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   147
    int i = 1;
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   148
    while(i < points.size())
4434
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   149
    {
4471
220d44cb8659 Always keep last point of drawn polyline
unc0rr
parents: 4457
diff changeset
   150
        if( (i != points.size() - 1)
220d44cb8659 Always keep last point of drawn polyline
unc0rr
parents: 4457
diff changeset
   151
            && (sqr(prevPoint.x() - points[i].x()) + sqr(prevPoint.y() - points[i].y()) < 1000)
220d44cb8659 Always keep last point of drawn polyline
unc0rr
parents: 4457
diff changeset
   152
          )
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   153
            points.removeAt(i);
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   154
        else
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   155
        {
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   156
            prevPoint = points[i];
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   157
            ++i;
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   158
        }
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   159
    }
4434
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   160
4439
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   161
    paths[0] = points;
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   162
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   163
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   164
    // redraw path
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   165
    {
27a896207aae Some more improvements
unC0Rr
parents: 4434
diff changeset
   166
        QGraphicsPathItem * pathItem = static_cast<QGraphicsPathItem *>(items()[0]);
4442
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   167
        pathItem->setPath(pointsToPath(paths[0]));
4434
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   168
    }
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   169
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   170
    emit pathChanged();
34c305fbc63c Simple simplify() function
unc0rr
parents: 4427
diff changeset
   171
}
4442
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   172
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   173
QPainterPath DrawMapScene::pointsToPath(const QList<QPoint> points)
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   174
{
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   175
    QPainterPath path;
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   176
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   177
    if(points.size())
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   178
    {
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   179
        QPointF p = points[0] + QPointF(0.01, 0.01);
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   180
        path.moveTo(p);
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   181
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   182
        foreach(QPoint p, points)
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   183
            path.lineTo(p);
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   184
    }
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   185
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   186
    return path;
f8424e1bc936 - Implement decode() function.
unc0rr
parents: 4439
diff changeset
   187
}