/***************************************************************************
 *   Copyright (C) 2008-2013 by Heiko Koehn - KoehnHeiko@googlemail.com    *
 *   Copyright (C) 2014 by Ahmed Charles - acharles@outlook.com            *
 *   Copyright (C) 2014, 2016 by Stephen Lyons - slysven@virginmedia.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#include "glwidget.h"


#include "Host.h"
#include "TArea.h"
#include "TMap.h"
#include "TRoom.h"
#include "TRoomDB.h"
#include "dlgMapper.h"

#include "pre_guard.h"
#include <QtEvents>
#include "post_guard.h"

#include <math.h>

#ifdef Q_OS_MACOS
#include <OpenGL/glu.h>
#else
#include <GL/glu.h>
#endif

#ifndef GL_MULTISAMPLE
#define GL_MULTISAMPLE 0x809D
#endif

bool ortho;
bool selectionMode = false;
bool mPanMode = false;
float xpos = 0, ypos = 0, zpos = 0, xrot = 0, yrot = 0, angle = 0.0, mPanXStart = 0, mPanYStart = 0;
float zmax, zmin;

GLWidget::GLWidget(QWidget *parent)
    : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
, mShowInfo()
, dehnung()
, rotTri()
, rotQuad()
, mTarget()
{
    mpMap = nullptr;
    xDist = 0.0;
    yDist = 0.0;
    zDist = 0.0;
    xRot = 1.0;
    yRot = 5.0;
    zRot = 10.0;
    ortho = false; //true;
    xDist = 0;
    yDist = 0;
    zDist = -1;
    mScale = 1.0;
    zmax = 9999999.0;
    zmin = 9999999.0;
    mShowTopLevels = 9999999;
    mShowBottomLevels = 999999;
    setAttribute(Qt::WA_OpaquePaintEvent);
    is2DView = false;
    mShiftMode = false;
    mAID = 0;
    mRID = 0;
    mOx = 0;
    mOy = 0;
    mOz = 0;
}


GLWidget::GLWidget(TMap* pM, QWidget* parent)
: QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
, mShowInfo()
, xRot()
, yRot()
, zRot()
, xDist()
, yDist()
, zDist()
, dehnung()
, mShowTopLevels()
, mShowBottomLevels()
, rotTri()
, rotQuad()
, mScale()
, mTarget()
{
    mpHost = nullptr;
    mpMap = pM;
    is2DView = false;
    mShiftMode = false;
    mAID = 0;
    mRID = 0;
    mOx = 0;
    mOy = 0;
    mOz = 0;
}


GLWidget::~GLWidget()
{
}

QSize GLWidget::minimumSizeHint() const
{
    return QSize(50, 50);
}

QSize GLWidget::sizeHint() const
{
    return QSize(400, 400);
}

static void qNormalizeAngle(int& angle)
{
    angle /= 10;
}

void GLWidget::fullView()
{
    mShowTopLevels = 9999999;
    mShowBottomLevels = 999999;
    updateGL();
}


void GLWidget::shiftDown()
{
    mShiftMode = true;
    mOy--;
    updateGL();
}

void GLWidget::shiftUp()
{
    mShiftMode = true;
    mOy++;
    updateGL();
}

void GLWidget::shiftLeft()
{
    mShiftMode = true;
    mOx--;
    updateGL();
}

void GLWidget::shiftRight()
{
    mShiftMode = true;
    mOx++;
    updateGL();
}
void GLWidget::shiftZup()
{
    mShiftMode = true;
    mOz++;
    updateGL();
}

void GLWidget::shiftZdown()
{
    mShiftMode = true;
    mOz--;
    updateGL();
}

void GLWidget::showInfo()
{
    mShowInfo = !mShowInfo;
    updateGL();
}


void GLWidget::singleView()
{
    mShowTopLevels = 0;
    mShowBottomLevels = 0;
    updateGL();
}

void GLWidget::increaseTop()
{
    mShowTopLevels += 1;
    updateGL();
}

void GLWidget::reduceTop()
{
    if (mShowTopLevels <= 0) {
        mShowTopLevels = abs(zmax);
    }
    if (abs(mShowTopLevels) > abs(zmax)) {
        mShowTopLevels = abs(zmax);
    }
    mShowTopLevels--;
    updateGL();
}

void GLWidget::increaseBottom()
{
    mShowBottomLevels++;
    updateGL();
}

void GLWidget::reduceBottom()
{
    if (mShowBottomLevels <= 0) {
        mShowBottomLevels = abs(zmin);
    }
    if (abs(mShowBottomLevels) > abs(zmin)) {
        mShowBottomLevels = abs(zmin);
    }
    mShowBottomLevels--;
    updateGL();
}

void GLWidget::defaultView()
{
    xRot = 1.0;
    yRot = 5.0;
    zRot = 10.0;
    mScale = 1.0;
    is2DView = false;
    setVisible(!isVisible());
    mpMap->mpMapper->mp2dMap->setVisible(!mpMap->mpMapper->mp2dMap->isVisible());
    updateGL();
}

void GLWidget::sideView()
{
    xRot = 7.0;
    yRot = -10.0;
    zRot = 0.0;
    mScale = 1.0;
    is2DView = false;
    updateGL();
}

void GLWidget::topView()
{
    xRot = 0.0;
    yRot = 0.0;
    zRot = 15.0;
    mScale = 1.0;
    is2DView = true;
    updateGL();
}


void GLWidget::goRoom(const QString& s)
{
}

void GLWidget::setScale(int angle)
{
    mScale = 150 / ((float)angle + 300);
    resizeGL(width(), height());
    updateGL();
    return;
}

void GLWidget::setXRotation(int angle)
{
    qNormalizeAngle(angle);
    xRot = angle;
    is2DView = false;
    updateGL();
    return;
}

void GLWidget::setYRotation(int angle)
{
    qNormalizeAngle(angle);
    yRot = angle;
    is2DView = false;
    updateGL();
    return;
}

void GLWidget::setZRotation(int angle)
{
    qNormalizeAngle(angle);
    zRot = angle;
    is2DView = false;
    updateGL();
    return;
}

void GLWidget::setXDist(int angle)
{
    xDist = angle;
    is2DView = false;
    updateGL();
    return;
}

void GLWidget::setYDist(int angle)
{
    yDist = angle;
    is2DView = false;
    updateGL();
    return;
}

void GLWidget::setZDist(int angle)
{
    zDist = angle;
    is2DView = false;
    updateGL();
    return;
}


void GLWidget::initializeGL()
{
    qglClearColor(Qt::black);
    xRot = 1;
    yRot = 5;
    zRot = 10;
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearDepth(1.0);
    is2DView = false;
}

// Replaces setArea() - now fed the coordinates of the room choosen as the
// view center in the area given from the set operation in the 2D Map
void GLWidget::setViewCenter(int areaId, int xPos, int yPos, int zPos)
{
    mAID = areaId;
    mShiftMode = true;
    mOx = xPos;
    mOy = yPos;
    mOz = zPos;
    updateGL();
}

void GLWidget::paintGL()
{
    if (!mpMap) {
        return;
    }
    float px, py, pz;
    if (mRID != mpMap->mRoomIdHash.value(mpMap->mpHost->getName()) && mShiftMode) {
        mShiftMode = false;
    }

    int ox, oy, oz;
    if (!mShiftMode) {
        mRID = mpMap->mRoomIdHash.value(mpMap->mpHost->getName());
        TRoom* pRID = mpMap->mpRoomDB->getRoom(mRID);
        if (!pRID) {
            glClearDepth(1.0);
            glDepthFunc(GL_LESS);
            glClearColor(0.0, 0.0, 0.0, 1.0);
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            renderText(width() / 3, height() / 2, "no map or no valid position on map", QFont("Bitstream Vera Sans Mono", 30, QFont::Normal));

            glLoadIdentity();
            glFlush();
            return;
        }
        mAID = pRID->getArea();
        ox = pRID->x;
        oy = pRID->y;
        oz = pRID->z;
        mOx = ox;
        mOy = oy;
        mOz = oz;

    } else {
        ox = mOx;
        oy = mOy;
        oz = mOz;
    }
    px = static_cast<float>(ox); //mpMap->rooms[mpMap->mRoomId]->x);
    py = static_cast<float>(oy); //mpMap->rooms[mpMap->mRoomId]->y);
    pz = static_cast<float>(oz); //mpMap->rooms[mpMap->mRoomId]->z);
    TArea* pArea = mpMap->mpRoomDB->getArea(mAID);
    if (!pArea) {
        return;
    }
    if (pArea->gridMode) {
        xRot = 0.0;
        yRot = 0.0;
        zRot = 15.0;
    }
    zmax = static_cast<float>(pArea->max_z);
    zmin = static_cast<float>(pArea->min_z);
    float zEbene;
    glEnable(GL_CULL_FACE);
    glClearDepth(1.0);
    glDepthFunc(GL_LESS);

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    GLfloat diffuseLight[] = {0.507, 0.507, 0.507, 1.0};
    GLfloat diffuseLight2[] = {0.501, 0.901, 0.501, 1.0};
    GLfloat ambientLight[] = {0.403, 0.403, 0.403, 1.0};
    GLfloat ambientLight2[] = {0.4501, 0.4501, 0.4501, 1.0};

    //GLfloat specularLight[] = {.01, .01, .01, 1.};//TODO: fuer ich-sphere
    GLfloat light0Pos[] = {5000.0, 4000.0, 1000.0, 0};
    GLfloat light1Pos[] = {5000.0, 1000.0, 1000.0, 0};
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_POSITION, light0Pos);
    glLightfv(GL_LIGHT1, GL_AMBIENT, ambientLight2);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuseLight2);
    glLightfv(GL_LIGHT1, GL_POSITION, light1Pos);
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
    glLightfv(GL_LIGHT0, GL_POSITION, light0Pos);
    glLightfv(GL_LIGHT1, GL_POSITION, light1Pos);
    glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR); //GL_ONE_MINUS_SRC_ALPHA);
    glLoadIdentity();

    dehnung = 4.0;

    glDisable(GL_FOG);
    glEnable(GL_BLEND);
    glEnable(GL_LIGHTING);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHT1);

    if (zRot <= 0) {
        zEbene = zmax;
    } else {
        zEbene = zmin;
    }

    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_LINE_STIPPLE);
    glLineWidth(1.0);
    int quads = 0;
    int verts = 0;
    float ebenenColor2[][4] = {{0.9, 0.5, 0.0, 1.0},
                               {165.0 / 255.0, 102.0 / 255.0, 167.0 / 255.0, 1.0},
                               {170.0 / 255.0, 10.0 / 255.0, 127.0 / 255.0, 1.0},
                               {203.0 / 255.0, 135.0 / 255.0, 101.0 / 255.0, 1.0},
                               {154.0 / 255.0, 154.0 / 255.0, 115.0 / 255.0, 1.0},
                               {107.0 / 255.0, 154.0 / 255.0, 100.0 / 255.0, 1.0},
                               {154.0 / 255.0, 184.0 / 255.0, 111.0 / 255.0, 1.0},
                               {67.0 / 255.0, 154.0 / 255.0, 148.0 / 255.0, 1.0},
                               {154.0 / 255.0, 118.0 / 255.0, 151.0 / 255.0, 1.0},
                               {208.0 / 255.0, 213.0 / 255.0, 164.0 / 255.0, 1.0},
                               {213.0 / 255.0, 169.0 / 255.0, 158.0 / 255.0, 1.0},
                               {139.0 / 255.0, 209.0 / 255.0, 0, 1.0},
                               {163.0 / 255.0, 209.0 / 255.0, 202.0 / 255.0, 1.0},
                               {158.0 / 255.0, 156.0 / 255.0, 209.0 / 255.0, 1.0},
                               {209.0 / 255.0, 144.0 / 255.0, 162.0 / 255.0, 1.0},
                               {209.0 / 255.0, 183.0 / 255.0, 78.0 / 255.0, 1.0},
                               {111.0 / 255.0, 209.0 / 255.0, 88.0 / 255.0, 1.0},
                               {95.0 / 255.0, 120.0 / 255.0, 209.0 / 255.0, 1.0},
                               {31.0 / 255.0, 209.0 / 255.0, 126.0 / 255.0, 1.0},
                               {1.0, 170.0 / 255.0, 1.0, 1.0},
                               {158.0 / 255.0, 105.0 / 255.0, 158.0 / 255.0, 1.0},
                               {68.0 / 255.0, 189.0 / 255.0, 189.0 / 255.0, 1.0},
                               {0.1, 0.69, 0.49, 1.0},
                               {0.0, 0.15, 1.0, 1.0},
                               {0.12, 0.02, 0.20, 1.0},
                               {0.0, 0.3, 0.1, 1.0}};


    float ebenenColor[][4] = {{0.5, 0.6, 0.5, 0.2},
                              {0.233, 0.498, 0.113, 0.2},
                              {0.666, 0.333, 0.498, 0.2},
                              {0.5, 0.333, 0.666, 0.2},
                              {0.69, 0.458, 0.0, 0.2},
                              {0.333, 0.0, 0.49, 0.2},
                              {133.0 / 255.0, 65.0 / 255.0, 98.0 / 255.0, 0.2},
                              {0.3, 0.3, 0.0, 0.2},
                              {0.6, 0.2, 0.6, 0.2},
                              {0.6, 0.6, 0.2, 0.2},
                              {0.4, 0.1, 0.4, 0.2},
                              {0.4, 0.4, 0.1, 0.2},
                              {0.3, 0.1, 0.3, 0.2},
                              {0.3, 0.3, 0.1, 0.2},
                              {0.2, 0.1, 0.2, 0.2},
                              {0.2, 0.2, 0.1, 0.2},
                              {0.24, 0.1, 0.5, 0.2},
                              {0.1, 0.1, 0.0, 0.2},
                              {0.54, 0.6, 0.2, 0.2},
                              {0.2, 0.2, 0.5, 0.2},
                              {0.6, 0.6, 0.2, 0.2},
                              {0.6, 0.4, 0.6, 0.2},
                              {0.4, 0.4, 0.1, 0.2},
                              {0.4, 0.2, 0.4, 0.2},
                              {0.2, 0.2, 0.0, 0.2},
                              {0.2, 0.1, 0.3, 0.2}};

    while (true) {
        if (zRot <= 0) {
            if (zEbene < zmin) {
                break;
            }
        } else {
            if (zEbene > zmax) {
                break;
            }
        }
        QSetIterator<int> itRoom(pArea->getAreaRooms());
        while (itRoom.hasNext()) {
            TRoom* pR = mpMap->mpRoomDB->getRoom(itRoom.next());
            if (!pR) {
                continue;
            }
            float rx = static_cast<float>(pR->x);
            float ry = static_cast<float>(pR->y);
            float rz = static_cast<float>(pR->z);
            if (rz != zEbene) {
                continue;
            }
            if (rz > pz) {
                if (abs(rz - pz) > mShowTopLevels) {
                    continue;
                }
            }
            if (rz < pz) {
                if (abs(rz - pz) > mShowBottomLevels) {
                    continue;
                }
            }
            QList<int> exitList;
            exitList.push_back(pR->getNorth());
            exitList.push_back(pR->getNorthwest());
            exitList.push_back(pR->getEast());
            exitList.push_back(pR->getSoutheast());
            exitList.push_back(pR->getSouth());
            exitList.push_back(pR->getSouthwest());
            exitList.push_back(pR->getWest());
            exitList.push_back(pR->getNorthwest());
            exitList.push_back(pR->getUp());
            exitList.push_back(pR->getDown());
            int e = pR->z;
            const int ef = abs(e % 26);
            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor[ef]);
            glMateriali(GL_FRONT, GL_SHININESS, 1);
            glDisable(GL_DEPTH_TEST);
            if (rz <= pz) {
                if ((rz == pz) && (rx == px) && (ry == py)) {
                    glDisable(GL_BLEND);
                    glEnable(GL_LIGHTING);
                    float mc3[] = {1.0f, 0.0f, 0.0f, 1.0f};
                    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
                    glMateriali(GL_FRONT, GL_SHININESS, 1);
                    glColor4f(1.0, 0.0, 0.0, 1.0);
                } else {
                    glDisable(GL_BLEND);
                    glEnable(GL_LIGHTING);
                    glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor[ef]);
                    glMateriali(GL_FRONT, GL_SHININESS, 1);
                    glColor4f(0.3, 0.3, 0.3, 1.0); /*ebenenColor[ef][0],
                              ebenenColor[ef][1],
                              ebenenColor[ef][2],
                              ebenenColor[ef][3]);*/
                }
                for (int k : exitList) {
                    bool areaExit = false;
                    if (k == -1) {
                        continue;
                    }
                    TRoom* pExit = mpMap->mpRoomDB->getRoom(k);
                    if (!pExit) {
                        continue;
                    }
                    if (pExit->getArea() != mAID) {
                        areaExit = true;
                    } else {
                        areaExit = false;
                    }
                    float ex = static_cast<float>(pExit->x);
                    float ey = static_cast<float>(pExit->y);
                    float ez = static_cast<float>(pExit->z);
                    QVector3D p1(ex, ey, ez);
                    QVector3D p2(rx, ry, rz);
                    glLoadIdentity();
                    gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                    glScalef(0.1, 0.1, 0.1);
                    if (areaExit) {
                        glLineWidth(1); //1/mScale+2);
                    } else {
                        glLineWidth(1); //1/mScale);
                    }
                    if (k == mRID || ((rz == pz) && (rx == px) && (ry == py))) {
                        glDisable(GL_BLEND);
                        glEnable(GL_LIGHTING);
                        float mc3[] = {1.0f, 0.0f, 0.0f, 1.0f};
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
                        glMateriali(GL_FRONT, GL_SHININESS, 1);
                        glColor4f(1.0, 0.0, 0.0, 1.0);
                    } else {
                        glDisable(GL_BLEND);
                        glEnable(GL_LIGHTING);
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor[ef]);
                        glMateriali(GL_FRONT, GL_SHININESS, 1);
                        glColor4f(0.3, 0.3, 0.3, 1.0); //ebenenColor[ef][0],
                                                       //                                  ebenenColor[ef][1],
                                                       //                                  ebenenColor[ef][2],
                                                       //                                  ebenenColor[ef][3]);
                    }
                    glBegin(GL_LINES);
                    if (!areaExit) {
                        glVertex3f(p1.x(), p1.y(), p1.z());
                    } else {
                        if (pR->getNorth() == k) {
                            glVertex3f(p2.x(), p2.y() + 1, p2.z());
                        } else if (pR->getSouth() == k) {
                            glVertex3f(p2.x(), p2.y() - 1, p2.z());
                        } else if (pR->getWest() == k) {
                            glVertex3f(p2.x() - 1, p2.y(), p2.z());
                        } else if (pR->getEast() == k) {
                            glVertex3f(p2.x() + 1, p2.y(), p2.z());
                        } else if (pR->getSouthwest() == k) {
                            glVertex3f(p2.x() - 1, p2.y() - 1, p2.z());
                        } else if (pR->getSoutheast() == k) {
                            glVertex3f(p2.x() + 1, p2.y() - 1, p2.z());
                        } else if (pR->getNortheast() == k) {
                            glVertex3f(p2.x() + 1, p2.y() + 1, p2.z());
                        } else if (pR->getNorthwest() == k) {
                            glVertex3f(p2.x() - 1, p2.y() + 1, p2.z());
                        } else if (pR->getUp() == k) {
                            glVertex3f(p2.x(), p2.y(), p2.z() + 1);
                        } else if (pR->getDown() == k) {
                            glVertex3f(p2.x(), p2.y(), p2.z() - 1);
                        }
                    }
                    glVertex3f(p2.x(), p2.y(), p2.z());
                    glEnd();
                    verts++;
                    if (areaExit) {
                        glDisable(GL_BLEND);
                        glEnable(GL_LIGHTING);
                        glDisable(GL_LIGHT1);
                        float mc4[] = {85.0 / 255.0, 170.0 / 255.0, 0.0 / 255.0, 1.0};
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc4);
                        glMateriali(GL_FRONT, GL_SHININESS, 1);
                        glColor4f(85.0 / 255.0, 170.0 / 255.0, 0.0 / 255.0, 1.0);
                        glLoadIdentity();
                        gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                        glScalef(0.1, 0.1, 0.1);
                        if (pR->getNorth() == k) {
                            glTranslatef(p2.x(), p2.y() + 1, p2.z());
                        } else if (pR->getSouth() == k) {
                            glTranslatef(p2.x(), p2.y() - 1, p2.z());
                        } else if (pR->getWest() == k) {
                            glTranslatef(p2.x() - 1, p2.y(), p2.z());
                        } else if (pR->getEast() == k) {
                            glTranslatef(p2.x() + 1, p2.y(), p2.z());
                        } else if (pR->getSouthwest() == k) {
                            glTranslatef(p2.x() - 1, p2.y() - 1, p2.z());
                        } else if (pR->getSoutheast() == k) {
                            glTranslatef(p2.x() + 1, p2.y() - 1, p2.z());
                        } else if (pR->getNortheast() == k) {
                            glTranslatef(p2.x() + 1, p2.y() + 1, p2.z());
                        } else if (pR->getNorthwest() == k) {
                            glTranslatef(p2.x() - 1, p2.y() + 1, p2.z());
                        } else if (pR->getUp() == k) {
                            glTranslatef(p2.x(), p2.y(), p2.z() + 1);
                        } else if (pR->getDown() == k) {
                            glTranslatef(p2.x(), p2.y(), p2.z() - 1);
                        }

                        float mc6[] = {85.0 / 255.0, 170.0 / 255.0, 0.0 / 255.0, 0.0};
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc6);
                        glMateriali(GL_FRONT, GL_SHININESS, 96);

                        glLoadName(k);
                        quads++;
                        glBegin(GL_QUADS);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glEnd();
                        //drauf
                        float mc3[] = {0.2, 0.2, 0.6, 1.0};
                        int env = pExit->environment;
                        if (mpMap->envColors.contains(env)) {
                            env = mpMap->envColors[env];
                        } else {
                            if (!mpMap->customEnvColors.contains(env)) {
                                env = 1;
                            }
                        }
                        switch (env) {
                        case 1:
                            glColor4ub(128, 50, 50, 200);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 0.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 2:
                            glColor4ub(128, 128, 50, 200);
                            mc3[0] = 0.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 3:
                            glColor4ub(50, 128, 50, 200);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 4:
                            glColor4ub(50, 50, 128, 200);
                            mc3[0] = 0.0 / 255.0;
                            mc3[1] = 0.0 / 255.0;
                            mc3[2] = 128.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 5:
                            glColor4ub(128, 50, 128, 200);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 6:
                            glColor4ub(50, 128, 128, 200);
                            mc3[0] = 0.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 128.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 7:
                            glColor4ub(52, 38, 78, 200);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 128.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 8:
                            glColor4ub(65, 55, 35, 200);
                            mc3[0] = 55.0 / 255.0;
                            mc3[1] = 55.0 / 255.0;
                            mc3[2] = 55.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 9:
                            glColor4ub(175, 50, 50, 200);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 50.0 / 255.0;
                            mc3[2] = 50.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 10:
                            glColor4ub(255, 255, 50, 200);
                            mc3[0] = 50.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 50.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 11:
                            glColor4ub(50, 175, 175, 200);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 50.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 12:
                            glColor4ub(175, 175, 50, 200);
                            mc3[0] = 50.0 / 255.0;
                            mc3[1] = 50.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 13:
                            glColor4ub(175, 50, 175, 200);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 50.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 14:
                            glColor4ub(50, 175, 50, 200);
                            mc3[0] = 50.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 15:
                            glColor4ub(50, 50, 175, 200);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        default: //user defined room color
                            if (!mpMap->customEnvColors.contains(env)) {
                                break;
                            }
                            QColor& _c = mpMap->customEnvColors[env];
                            glColor4ub(_c.red(), _c.green(), _c.blue(), 25);
                            mc3[0] = _c.redF();
                            mc3[1] = _c.greenF();
                            mc3[2] = _c.blueF();
                            mc3[3] = 0.2;
                        }
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
                        glMateriali(GL_FRONT, GL_SHININESS, 1);
                        glDisable(GL_DEPTH_TEST);
                        glLoadIdentity();
                        gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                        glScalef(0.05, 0.05, 0.020);
                        if (pR->getNorth() == k) {
                            glTranslatef(2 * p2.x(), 2 * (p2.y() + 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getSouth() == k) {
                            glTranslatef(2 * p2.x(), 2 * (p2.y() - 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getWest() == k) {
                            glTranslatef(2 * (p2.x() - 1), 2 * p2.y(), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getEast() == k) {
                            glTranslatef(2 * (p2.x() + 1), 2 * p2.y(), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getSouthwest() == k) {
                            glTranslatef(2 * (p2.x() - 1), 2 * (p2.y() - 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getSoutheast() == k) {
                            glTranslatef(2 * (p2.x() + 1), 2 * (p2.y() - 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getNortheast() == k) {
                            glTranslatef(2 * (p2.x() + 1), 2 * (p2.y() + 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getNorthwest() == k) {
                            glTranslatef(2 * (p2.x() - 1), 2 * (p2.y() + 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getUp() == k) {
                            glTranslatef(2 * p2.x(), 2 * p2.y(), 5.0 * (p2.z() + 1 + 0.25));
                        } else if (pR->getDown() == k) {
                            glTranslatef(2 * p2.x(), 2 * p2.y(), 5.0 * (p2.z() - 1 + 0.25));
                        }

                        glBegin(GL_QUADS);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glEnd();
                    }
                }
            } else {
                for (int k : exitList) {
                    bool areaExit = false;
                    if (k == -1) {
                        continue;
                    }
                    TRoom* pExit = mpMap->mpRoomDB->getRoom(k);
                    if (!pExit) {
                        continue;
                    }
                    if (pExit->getArea() != mAID) {
                        areaExit = true;
                    } else {
                        areaExit = false;
                    }

                    float ex = static_cast<float>(pExit->x);
                    float ey = static_cast<float>(pExit->y);
                    float ez = static_cast<float>(pExit->z);
                    QVector3D p1(ex, ey, ez);
                    QVector3D p2(rx, ry, rz);
                    glLoadIdentity();
                    gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                    glScalef(0.1, 0.1, 0.1);
                    if (areaExit) {
                        glLineWidth(1); //1/mScale+2);
                    } else {
                        glLineWidth(1); //1/mScale);
                    }
                    if (k == mRID || ((rz == pz) && (rx == px) && (ry == py))) {
                        glDisable(GL_BLEND);
                        glEnable(GL_LIGHTING);
                        float mc3[] = {1.0f, 0.0f, 0.0f, 1.0f};
                        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mc3);
                        glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 1);
                        glColor4f(1.0, 0.0, 0.0, 1.0);
                    } else {
                        glEnable(GL_BLEND);
                        glEnable(GL_LIGHTING);
                        glEnable(GL_LIGHT1);
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor2[ef]);
                        glMateriali(GL_FRONT, GL_SHININESS, 1); //gut:36
                        glColor4f(0.3, 0.3, 0.3, 1.0); /*ebenenColor2[ef][0],
                                  ebenenColor2[ef][1],
                                  ebenenColor2[ef][2],
                                  ebenenColor2[ef][3])*/
                        ;
                    }
                    glBegin(GL_LINES);
                    if (!areaExit) {
                        glVertex3f(p1.x(), p1.y(), p1.z());
                    } else {
                        if (pR->getNorth() == k) {
                            glVertex3f(p2.x(), p2.y() + 1, p2.z());
                        } else if (pR->getSouth() == k) {
                            glVertex3f(p2.x(), p2.y() - 1, p2.z());
                        } else if (pR->getWest() == k) {
                            glVertex3f(p2.x() - 1, p2.y(), p2.z());
                        } else if (pR->getEast() == k) {
                            glVertex3f(p2.x() + 1, p2.y(), p2.z());
                        } else if (pR->getSouthwest() == k) {
                            glVertex3f(p2.x() - 1, p2.y() - 1, p2.z());
                        } else if (pR->getSoutheast() == k) {
                            glVertex3f(p2.x() + 1, p2.y() - 1, p2.z());
                        } else if (pR->getNortheast() == k) {
                            glVertex3f(p2.x() + 1, p2.y() - 1, p2.z());
                        } else if (pR->getNorthwest() == k) {
                            glVertex3f(p2.x() - 1, p2.y() + 1, p2.z());
                        } else if (pR->getUp() == k) {
                            glVertex3f(p2.x(), p2.y(), p2.z() + 1);
                        } else if (pR->getDown() == k) {
                            glVertex3f(p2.x(), p2.y(), p2.z() - 1);
                        }
                    }
                    glVertex3f(p2.x(), p2.y(), p2.z());
                    glEnd();
                    verts++;
                    if (areaExit) {
                        glDisable(GL_BLEND);
                        glEnable(GL_LIGHTING);
                        glDisable(GL_LIGHT1);
                        float mc4[] = {85.0 / 255.0, 170.0 / 255.0, 0.0 / 255.0, 1.0};
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc4);
                        glMateriali(GL_FRONT, GL_SHININESS, 1);
                        glColor4f(85.0 / 255.0, 170.0 / 255.0, 0.0 / 255.0, 1.0);
                        glLoadIdentity();
                        gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                        glScalef(0.1, 0.1, 0.1);
                        if (pR->getNorth() == k) {
                            glTranslatef(p2.x(), p2.y() + 1, p2.z());
                        } else if (pR->getSouth() == k) {
                            glTranslatef(p2.x(), p2.y() - 1, p2.z());
                        } else if (pR->getWest() == k) {
                            glTranslatef(p2.x() - 1, p2.y(), p2.z());
                        } else if (pR->getEast() == k) {
                            glTranslatef(p2.x() + 1, p2.y(), p2.z());
                        } else if (pR->getSouthwest() == k) {
                            glTranslatef(p2.x() - 1, p2.y() - 1, p2.z());
                        } else if (pR->getSoutheast() == k) {
                            glTranslatef(p2.x() + 1, p2.y() - 1, p2.z());
                        } else if (pR->getNortheast() == k) {
                            glTranslatef(p2.x() + 1, p2.y() + 1, p2.z());
                        } else if (pR->getNorthwest() == k) {
                            glTranslatef(p2.x() - 1, p2.y() + 1, p2.z());
                        } else if (pR->getUp() == k) {
                            glTranslatef(p2.x(), p2.y(), p2.z() + 1);
                        } else if (pR->getDown() == k) {
                            glTranslatef(p2.x(), p2.y(), p2.z() - 1);
                        }

                        glLoadName(k);
                        quads++;
                        glBegin(GL_QUADS);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glEnd();

                        //drauf
                        float mc3[] = {0.2, 0.2, 0.6, 0.2};
                        int env = pExit->environment;
                        if (mpMap->envColors.contains(env)) {
                            env = mpMap->envColors[env];
                        } else {
                            if (!mpMap->customEnvColors.contains(env)) {
                                env = 1;
                            }
                        }
                        switch (env) {
                        case 1:
                            glColor4ub(128, 50, 50, 2);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 0.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 2:
                            glColor4ub(128, 128, 50, 2);
                            mc3[0] = 0.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 3:
                            glColor4ub(50, 128, 50, 2);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 4:
                            glColor4ub(50, 50, 128, 2);
                            mc3[0] = 0.0 / 255.0;
                            mc3[1] = 0.0 / 255.0;
                            mc3[2] = 128.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 5:
                            glColor4ub(128, 50, 128, 2);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 0.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 6:
                            glColor4ub(50, 128, 128, 2);
                            mc3[0] = 0.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 128.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 7:
                            glColor4ub(52, 38, 78, 2);
                            mc3[0] = 128.0 / 255.0;
                            mc3[1] = 128.0 / 255.0;
                            mc3[2] = 128.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 8:
                            glColor4ub(65, 55, 35, 2);
                            mc3[0] = 55.0 / 255.0;
                            mc3[1] = 55.0 / 255.0;
                            mc3[2] = 55.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 9:
                            glColor4ub(175, 50, 50, 2);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 50.0 / 255.0;
                            mc3[2] = 50.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 10:
                            glColor4ub(255, 255, 50, 2);
                            mc3[0] = 50.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 50.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 11:
                            glColor4ub(50, 175, 175, 2);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 50.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 12:
                            glColor4ub(175, 175, 50, 2);
                            mc3[0] = 50.0 / 255.0;
                            mc3[1] = 50.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;

                        case 13:
                            glColor4ub(175, 50, 175, 2);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 50.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 14:
                            glColor4ub(50, 175, 50, 2);
                            mc3[0] = 50.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        case 15:
                            glColor4ub(50, 50, 175, 2);
                            mc3[0] = 255.0 / 255.0;
                            mc3[1] = 255.0 / 255.0;
                            mc3[2] = 255.0 / 255.0;
                            mc3[3] = 0.2;
                            break;
                        default: //user defined room color
                            if (!mpMap->customEnvColors.contains(env)) {
                                break;
                            }
                            QColor& _c = mpMap->customEnvColors[env];
                            glColor4ub(_c.red(), _c.green(), _c.blue(), 255);
                            mc3[0] = _c.redF();
                            mc3[1] = _c.greenF();
                            mc3[2] = _c.blueF();
                            mc3[3] = 0.2;
                        }
                        glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
                        glMateriali(GL_FRONT, GL_SHININESS, 36);
                        glDisable(GL_DEPTH_TEST);
                        glLoadIdentity();
                        gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                        glScalef(0.05, 0.05, 0.020);
                        if (pR->getNorth() == k) {
                            glTranslatef(2 * p2.x(), 2 * (p2.y() + 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getSouth() == k) {
                            glTranslatef(2 * p2.x(), 2 * (p2.y() - 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getWest() == k) {
                            glTranslatef(2 * (p2.x() - 1), 2 * p2.y(), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getEast() == k) {
                            glTranslatef(2 * (p2.x() + 1), 2 * p2.y(), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getSouthwest() == k) {
                            glTranslatef(2 * (p2.x() - 1), 2 * (p2.y() - 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getSoutheast() == k) {
                            glTranslatef(2 * (p2.x() + 1), 2 * (p2.y() - 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getNortheast() == k) {
                            glTranslatef(2 * (p2.x() + 1), 2 * (p2.y() + 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getNorthwest() == k) {
                            glTranslatef(2 * (p2.x() - 1), 2 * (p2.y() + 1), 5.0 * (p2.z() + 0.25));
                        } else if (pR->getUp() == k) {
                            glTranslatef(2 * p2.x(), 2 * p2.y(), 5.0 * (p2.z() + 1 + 0.25));
                        } else if (pR->getDown() == k) {
                            glTranslatef(2 * p2.x(), 2 * p2.y(), 5.0 * (p2.z() - 1 + 0.25));
                        }

                        glBegin(GL_QUADS);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, -0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, -0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                        glNormal3f(0.57735, 0.57735, -0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, -0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                        glNormal3f(-0.57735, 0.57735, 0.57735);
                        glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glNormal3f(0.57735, 0.57735, 0.57735);
                        glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                        glEnd();
                    }
                }
                glFlush();
            }
        }

        if (zRot <= 0) {
            zEbene -= 1.0;
        } else {
            zEbene += 1.0;
        }
    }

    quads = 0;
    zEbene = zmin;
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDisable(GL_LIGHT1);

    while (true) {
        if (zEbene > zmax) {
            break;
        }
        QSetIterator<int> itRoom(pArea->getAreaRooms());
        while (itRoom.hasNext()) {
            glDisable(GL_LIGHT1);
            int currentRoomId = itRoom.next();
            TRoom* pR = mpMap->mpRoomDB->getRoom(currentRoomId);
            if (!pR) {
                continue;
            }
            float rx = static_cast<float>(pR->x);
            float ry = static_cast<float>(pR->y);
            float rz = static_cast<float>(pR->z);
            if (rz != zEbene) {
                continue;
            }

            if (rz > pz) {
                if (abs(rz - pz) > mShowTopLevels) {
                    continue;
                }
            }
            if (rz < pz) {
                if (abs(rz - pz) > mShowBottomLevels) {
                    continue;
                }
            }

            int e = pR->z;
            const int ef = abs(e % 26);
            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor[ef]);
            glMateriali(GL_FRONT, GL_SHININESS, 36); //gut:96

            if ((rz == pz) && (rx == px) && (ry == py)) {
                glDisable(GL_BLEND);
                glEnable(GL_LIGHTING);
                glDisable(GL_LIGHT1);
                float mc3[] = {1.0f, 0.0f, 0.0f, 1.0f};
                glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
                glMateriali(GL_FRONT, GL_SHININESS, 36);
                glColor4f(1.0, 0.0, 0.0, 1.0);
            } else if (currentRoomId == mTarget) {
                glDisable(GL_BLEND);
                glEnable(GL_LIGHTING);
                glDisable(GL_LIGHT1);
                float mc4[] = {0.0, 1.0, 0.0, 1.0};
                glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc4);
                glMateriali(GL_FRONT, GL_SHININESS, 36); //36
                glColor4f(0.0, 1.0, 0.0, 1.0);
            } else if (rz <= pz) {
                glDisable(GL_BLEND);
                glEnable(GL_LIGHTING);
                glDisable(GL_LIGHT1);
                glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor2[ef]);
                glMateriali(GL_FRONT, GL_SHININESS, 36);
                glColor4f(ebenenColor[ef][0], ebenenColor[ef][1], ebenenColor[ef][2], ebenenColor[ef][3]);
            } else {
                glEnable(GL_BLEND);
                glEnable(GL_LIGHTING);
                glEnable(GL_LIGHT1);
                glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ebenenColor[ef]);
                glMateriali(GL_FRONT, GL_SHININESS, 36); //56);//gut:36
                glColor4f(ebenenColor2[ef][0], ebenenColor2[ef][1], ebenenColor2[ef][2], ebenenColor2[ef][3]);

                glLoadIdentity();
                gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
                if (pArea->gridMode) {
                    glScalef(0.2, 0.2, 0.1);
                    glTranslatef(0.5 * rx, 0.5 * ry, rz);
                } else {
                    glScalef(0.1, 0.1, 0.1);
                    glTranslatef(rx, ry, rz);
                }

                glLoadName(currentRoomId);
                quads++;
                glBegin(GL_QUADS);
                glNormal3f(0.57735, -0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);


                glNormal3f(0.57735, 0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                glNormal3f(-0.57735, 0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, 0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                glNormal3f(0.57735, 0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, 0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                glNormal3f(-0.57735, 0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                glNormal3f(0.57735, 0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, 0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glEnd();

                float mc3[] = {0.2, 0.2, 0.6, 0.2};
                int env = pR->environment;
                if (mpMap->envColors.contains(env)) {
                    env = mpMap->envColors[env];
                } else {
                    if (!mpMap->customEnvColors.contains(env)) {
                        env = 1;
                    }
                }

                switch (env) {
                case 1:
                    glColor4ub(128, 50, 50, 2);
                    mc3[0] = 128.0 / 255.0;
                    mc3[1] = 0.0 / 255.0;
                    mc3[2] = 0.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 2:
                    glColor4ub(128, 128, 50, 2);
                    mc3[0] = 0.0 / 255.0;
                    mc3[1] = 128.0 / 255.0;
                    mc3[2] = 0.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 3:
                    glColor4ub(50, 128, 50, 2);
                    mc3[0] = 128.0 / 255.0;
                    mc3[1] = 128.0 / 255.0;
                    mc3[2] = 0.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 4:
                    glColor4ub(50, 50, 128, 2);
                    mc3[0] = 0.0 / 255.0;
                    mc3[1] = 0.0 / 255.0;
                    mc3[2] = 128.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 5:
                    glColor4ub(128, 50, 128, 2);
                    mc3[0] = 128.0 / 255.0;
                    mc3[1] = 128.0 / 255.0;
                    mc3[2] = 0.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 6:
                    glColor4ub(50, 128, 128, 2);
                    mc3[0] = 0.0 / 255.0;
                    mc3[1] = 128.0 / 255.0;
                    mc3[2] = 128.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 7:
                    glColor4ub(52, 38, 78, 2);
                    mc3[0] = 128.0 / 255.0;
                    mc3[1] = 128.0 / 255.0;
                    mc3[2] = 128.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 8:
                    glColor4ub(65, 55, 35, 2);
                    mc3[0] = 55.0 / 255.0;
                    mc3[1] = 55.0 / 255.0;
                    mc3[2] = 55.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 9:
                    glColor4ub(175, 50, 50, 2);
                    mc3[0] = 255.0 / 255.0;
                    mc3[1] = 50.0 / 255.0;
                    mc3[2] = 50.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 10:
                    glColor4ub(255, 255, 50, 2);
                    mc3[0] = 50.0 / 255.0;
                    mc3[1] = 255.0 / 255.0;
                    mc3[2] = 50.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 11:
                    glColor4ub(50, 175, 175, 2);
                    mc3[0] = 255.0 / 255.0;
                    mc3[1] = 255.0 / 255.0;
                    mc3[2] = 50.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 12:
                    glColor4ub(175, 175, 50, 2);
                    mc3[0] = 50.0 / 255.0;
                    mc3[1] = 50.0 / 255.0;
                    mc3[2] = 255.0 / 255.0;
                    mc3[3] = 0.2;
                    break;

                case 13:
                    glColor4ub(175, 50, 175, 2);
                    mc3[0] = 255.0 / 255.0;
                    mc3[1] = 50.0 / 255.0;
                    mc3[2] = 255.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 14:
                    glColor4ub(50, 175, 50, 2);
                    mc3[0] = 50.0 / 255.0;
                    mc3[1] = 255.0 / 255.0;
                    mc3[2] = 255.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                case 15:
                    glColor4ub(50, 50, 175, 2);
                    mc3[0] = 255.0 / 255.0;
                    mc3[1] = 255.0 / 255.0;
                    mc3[2] = 255.0 / 255.0;
                    mc3[3] = 0.2;
                    break;
                default: //user defined room color
                    if (!mpMap->customEnvColors.contains(env)) {
                        break;
                    }
                    QColor& _c = mpMap->customEnvColors[env];
                    glColor4ub(_c.red(), _c.green(), _c.blue(), 255);
                    mc3[0] = _c.redF();
                    mc3[1] = _c.greenF();
                    mc3[2] = _c.blueF();
                    mc3[3] = 0.2;
                }
                glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
                glMateriali(GL_FRONT, GL_SHININESS, 96);
                glDisable(GL_DEPTH_TEST);
                glLoadIdentity();
                gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);

                if (pArea->gridMode) {
                    if ((rz == pz) && (rx == px) && (ry == py)) {
                        glScalef(0.1, 0.1, 0.020);
                        glTranslatef(0.1 * rx, 0.1 * ry, 5.0 * (rz + 0.25));
                    } else {
                        glScalef(0.2, 0.2, 0.020);
                        glTranslatef(0.5 * rx, 0.5 * ry, 5.0 * (rz + 0.25));
                    }
                } else {
                    glScalef(0.075, 0.075, 0.020);
                    glTranslatef(1.333333333 * rx, 1.333333333 * ry, 5.0 * (rz + 0.25)); //+0.4
                }

                glBegin(GL_QUADS);
                glNormal3f(0.57735, -0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                glNormal3f(0.57735, 0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                glNormal3f(-0.57735, 0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, 0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                glNormal3f(0.57735, 0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(0.57735, 0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, -0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

                glNormal3f(-0.57735, 0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, -0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

                glNormal3f(0.57735, 0.57735, -0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, -0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
                glNormal3f(-0.57735, 0.57735, 0.57735);
                glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glNormal3f(0.57735, 0.57735, 0.57735);
                glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
                glEnd();

                continue;
            }

            float mc3[] = {0.2f, 0.2f, 0.7f, 1.0f};
            glLoadIdentity();
            gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
            if (pArea->gridMode) {
                glScalef(0.2, 0.2, 0.1);
                glTranslatef(0.5 * rx, 0.5 * ry, rz);
            } else {
                glScalef(0.1, 0.1, 0.1);
                glTranslatef(rx, ry, rz);
            }

            glLoadName(currentRoomId);
            quads++;
            glBegin(GL_QUADS);
            glNormal3f(0.57735, -0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

            glNormal3f(0.57735, 0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

            glNormal3f(-0.57735, 0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, 0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

            glNormal3f(0.57735, 0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, 0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

            glNormal3f(-0.57735, 0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

            glNormal3f(0.57735, 0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, 0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);

            glEnd();

            int env = pR->environment;
            if (mpMap->envColors.contains(env)) {
                env = mpMap->envColors[env];
            } else {
                if (!mpMap->customEnvColors.contains(env)) {
                    env = 1;
                }
            }
            switch (env) {
            case 1:
                glColor4ub(128, 50, 50, 255);
                mc3[0] = 128.0 / 255.0;
                mc3[1] = 0.0 / 255.0;
                mc3[2] = 0.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 2:
                glColor4ub(128, 128, 50, 255);
                mc3[0] = 0.0 / 255.0;
                mc3[1] = 128.0 / 255.0;
                mc3[2] = 0.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 3:
                glColor4ub(50, 128, 50, 255);
                mc3[0] = 128.0 / 255.0;
                mc3[1] = 128.0 / 255.0;
                mc3[2] = 0.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 4:
                glColor4ub(50, 50, 128, 255);
                mc3[0] = 0.0 / 255.0;
                mc3[1] = 0.0 / 255.0;
                mc3[2] = 128.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 5:
                glColor4ub(128, 50, 128, 255);
                mc3[0] = 128.0 / 255.0;
                mc3[1] = 128.0 / 255.0;
                mc3[2] = 0.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 6:
                glColor4ub(50, 128, 128, 255);
                mc3[0] = 0.0 / 255.0;
                mc3[1] = 128.0 / 255.0;
                mc3[2] = 128.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 7:
                glColor4ub(52, 38, 78, 255);
                mc3[0] = 128.0 / 255.0;
                mc3[1] = 128.0 / 255.0;
                mc3[2] = 128.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 8:
                glColor4ub(65, 55, 35, 255);
                mc3[0] = 55.0 / 255.0;
                mc3[1] = 55.0 / 255.0;
                mc3[2] = 55.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 9:
                glColor4ub(175, 50, 50, 255);
                mc3[0] = 255.0 / 255.0;
                mc3[1] = 50.0 / 255.0;
                mc3[2] = 50.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 10:
                glColor4ub(255, 255, 50, 255);
                mc3[0] = 50.0 / 255.0;
                mc3[1] = 255.0 / 255.0;
                mc3[2] = 50.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 11:
                glColor4ub(50, 175, 175, 255);
                mc3[0] = 255.0 / 255.0;
                mc3[1] = 255.0 / 255.0;
                mc3[2] = 50.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 12:
                glColor4ub(175, 175, 50, 255);
                mc3[0] = 50.0 / 255.0;
                mc3[1] = 50.0 / 255.0;
                mc3[2] = 255.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;

            case 13:
                glColor4ub(175, 50, 175, 255);
                mc3[0] = 255.0 / 255.0;
                mc3[1] = 50.0 / 255.0;
                mc3[2] = 255.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 14:
                glColor4ub(50, 175, 50, 255);
                mc3[0] = 50.0 / 255.0;
                mc3[1] = 255.0 / 255.0;
                mc3[2] = 255.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            case 15:
                glColor4ub(50, 50, 175, 255);
                mc3[0] = 255.0 / 255.0;
                mc3[1] = 255.0 / 255.0;
                mc3[2] = 255.0 / 255.0;
                mc3[3] = 255.0 / 255.0;
                break;
            default: //user defined room color
                if (!mpMap->customEnvColors.contains(env)) {
                    break;
                }
                QColor& _c = mpMap->customEnvColors[env];
                glColor4ub(_c.red(), _c.green(), _c.blue(), 255);
                mc3[0] = _c.redF();
                mc3[1] = _c.greenF();
                mc3[2] = _c.blueF();
                mc3[3] = 1.0;
            }
            glDisable(GL_DEPTH_TEST);
            glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mc3);
            glMateriali(GL_FRONT, GL_SHININESS, 6);
            glLoadIdentity();
            gluLookAt(px * 0.1 + xRot, py * 0.1 + yRot, pz * 0.1 + zRot, px * 0.1, py * 0.1, pz * 0.1, 0.0, 1.0, 0.0);
            if (pArea->gridMode) {
                if ((rz == pz) && (rx == px) && (ry == py)) {
                    glScalef(0.1, 0.1, 0.020);
                    glTranslatef(rx, ry, 5.0 * (rz + 0.25));
                } else {
                    glScalef(0.2, 0.2, 0.020);
                    glTranslatef(0.5 * rx, 0.5 * ry, 5.0 * (rz + 0.25));
                }
            } else {
                if (is2DView) {
                    glScalef(0.090, 0.090, 0.020);
                    glTranslatef(1.1111111 * rx, 1.1111111 * ry, 5.0 * (rz + 0.25)); //+0.4
                } else {
                    glScalef(0.075, 0.075, 0.020);
                    glTranslatef(1.333333333 * rx, 1.333333333 * ry, 5.0 * (rz + 0.25)); //+0.4
                }
            }
            glBegin(GL_QUADS);
            glNormal3f(0.57735, -0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

            glNormal3f(0.57735, 0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

            glNormal3f(-0.57735, 0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, 0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

            glNormal3f(0.57735, 0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(0.57735, 0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, -0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);

            glNormal3f(-0.57735, 0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, -0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, -1.0 / dehnung, 1.0 / dehnung);

            glNormal3f(0.57735, 0.57735, -0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, -0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, -1.0 / dehnung);
            glNormal3f(-0.57735, 0.57735, 0.57735);
            glVertex3f(-1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glNormal3f(0.57735, 0.57735, 0.57735);
            glVertex3f(1.0 / dehnung, 1.0 / dehnung, 1.0 / dehnung);
            glEnd();

            glColor4ub(128, 128, 128, 255);


            glBegin(GL_TRIANGLES);

            if (pR->getDown() > -1) {
                glVertex3f(0.0, -0.95 / dehnung, 0.0);
                glVertex3f(0.95 / dehnung, -0.25 / dehnung, 0.0);
                glVertex3f(-0.95 / dehnung, -0.25 / dehnung, 0.0);
            }
            if (pR->getUp() > -1) {
                glVertex3f(0.0, 0.95 / dehnung, 0.0);
                glVertex3f(-0.95 / dehnung, 0.25 / dehnung, 0.0);
                glVertex3f(0.95 / dehnung, 0.25 / dehnung, 0.0);
            }
            glEnd();

//            if( mpMap->rooms[pArea->rooms[i]]->out > -1 )
//            {
//                glBegin( GL_LINE_LOOP );
//                for( int angle=0; angle<360; angle += 1 )
//                {
//                    glVertex3f( (0.5 + sin((float)angle) * 0.25)/dehnung, ( cos((float)angle) * 0.25)/dehnung, 0.0);
//                }
//                glEnd();
//            }


//            glTranslatef( -0.1, 0.0, 0.0 );
//            if( mpMap->rooms[pArea->rooms[i]]->in > -1 )
//            {
//                glBegin( GL_TRIANGLE_FAN );
//                glVertex3f( 0.0, 0.0, 0.0);
//                for( int angle=0; angle<=360; angle += 5 )
//                {
//                    glVertex3f( (sin((float)angle)*0.25)/dehnung, (cos((float)angle)*0.25)/dehnung, 0.0);
//                }
//                glEnd();
//            }
        }


        zEbene += 1.0;
    }
    //   qDebug()<<"FINAL: mQuads.size()="<<mQuads.size()<<"area.size()="<<pArea->rooms.size()<<" quads="<<quads<<" verts="<<verts;
    //    qDebug()<<"mScale="<<mScale<<" 1/mScale="<<1/mScale<<" env="<<env;
    //    cout<<"dif r="<<diffuseLight[0]<<" g="<<diffuseLight[1]<<" b="<<diffuseLight[2]<<endl;
    //    cout << "xRot:"<<xRot<<" yRot:"<<yRot<<" zRot:"<<zRot<<endl;
    glFlush();
}

void GLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, (GLint)w, (GLint)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (!ortho) {
        gluPerspective(60 * mScale, (GLfloat)w / (GLfloat)h, 0.0001, 10000.0);
    } else {
        gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
    }
    glMatrixMode(GL_MODELVIEW);
}

void GLWidget::mousePressEvent(QMouseEvent* event)
{
    if (event->buttons() & Qt::LeftButton) {
        int x = event->x();
        int y = height() - event->y(); //opengl ursprungspunkt liegt unten links
        GLuint buff[16] = {0};
        GLint hits;
        GLint view[4];
        glSelectBuffer(16, buff);
        glGetIntegerv(GL_VIEWPORT, view);
        glRenderMode(GL_SELECT);
        glInitNames();
        glPushName(0);
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        gluPickMatrix(x, y, 0.1, 0.1, view);
        gluPerspective(60 * mScale, (GLfloat)width() / (GLfloat)height(), 0.0001, 10000.0);
        glMatrixMode(GL_MODELVIEW);

        mQuads.clear();
        mTarget = -22;
        selectionMode = true;
        paintGL();
        selectionMode = false;

        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        hits = glRenderMode(GL_RENDER);

        for (int i = 0; i < hits; i++) {
            mTarget = buff[i * 4 + 3];
            //TODO: Mehrfachbelegungen
            //            unsigned int minZ = buff[i * 4 + 1];
            //            unsigned int maxZ = buff[i * 4 + 2];
        }
        glViewport(0, 0, (GLint)width(), (GLint)height());
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60 * mScale, (GLfloat)width() / (GLfloat)height(), 0.0001, 10000.0);
        glMatrixMode(GL_MODELVIEW);
        updateGL();
        if (mpMap->mpRoomDB->getRoom(mTarget)) {
            mpMap->mTargetID = mTarget;
            if (mpMap->findPath(mpMap->mRoomIdHash.value(mpMap->mpHost->getName()), mpMap->mTargetID)) {
                mpMap->mpHost->startSpeedWalk();
            }
            //            else
            //            {
            //                QMessageBox msgBox;
            //                msgBox.setText("Cannot find a path to this room using regular exits.#glWidget\n");
            //                msgBox.exec();
            //            }
        } else {
            mPanMode = true;
            mPanXStart = x;
            mPanYStart = y;
        }
        //        else
        //        {
        //            QMessageBox msgBox;
        //            msgBox.setText("ERROR: Target room cannot be found in map db.\n");
        //            msgBox.exec();
        //        }
    }
}

void GLWidget::mouseMoveEvent(QMouseEvent* event)
{
    if (mPanMode) {
        int x = event->x();
        int y = height() - event->y(); //opengl ursprungspunkt liegt unten links
        if ((mPanXStart - x) > 1) {
            shiftRight();
            mPanXStart = x;
        } else if ((mPanXStart - x) < -1) {
            shiftLeft();
            mPanXStart = x;
        }
        if ((mPanYStart - y) > 1) {
            shiftUp();
            mPanYStart = y;
        } else if ((mPanYStart - y) < -1) {
            shiftDown();
            mPanYStart = y;
        }
    }
}

void GLWidget::mouseReleaseEvent(QMouseEvent* event)
{
    mPanMode = false;
}

void GLWidget::wheelEvent(QWheelEvent* e)
{
    //int delta = e->delta() / 8 / 15;
    if (e->delta() < 0) {
        if (abs(mScale) < 0.3) {
            mScale -= 0.01;
        } else {
            mScale -= 0.03;
        }
        resizeGL(width(), height());
        updateGL();
        e->accept();
        return;
    }
    if (e->delta() > 0) {
        if (abs(mScale) < 0.3) {
            mScale += 0.01;
        } else {
            mScale += 0.03;
        }
        resizeGL(width(), height());
        updateGL();
        e->accept();
        return;
    }
    e->ignore();
    return;
}
