diff options
Diffstat (limited to 'src/View/MapView.cpp')
-rw-r--r-- | src/View/MapView.cpp | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/View/MapView.cpp b/src/View/MapView.cpp index 263383f..69c9d2f 100644 --- a/src/View/MapView.cpp +++ b/src/View/MapView.cpp @@ -18,13 +18,131 @@ */ #include "MapView.h" +#include "TopView.h" +#include <Data/Level.h> +#include <Data/Room.h> +#include <Data/Triangle.h> +#include <Gui/RenderArea.h> +#include <GL/gl.h> +#include <cmath> +#include <list> namespace ZoomEdit { namespace View { +void MapView::click(Gui::RenderArea *renderArea, float x, float y) { + if(!mainArea) + return; + + TopView *mainView = dynamic_cast<TopView*>(mainArea->getView()); + if(!mainView) + return; + + mainView->setXCenter(xCenter + (x - renderArea->get_width()/2)/scale); + mainView->setYCenter(yCenter + (y - renderArea->get_height()/2)/scale); + + mainArea->queue_draw(); +} + void MapView::render(Gui::RenderArea *renderArea) { + glClear(GL_COLOR_BUFFER_BIT); + + if(!level) + return; + + float minX, maxX, minY, maxY; + getBounds(&minX, &maxX, &minY, &maxY); + + xCenter = (minX+maxX)/2; yCenter = (minY+maxY)/2; + float width = maxX-minX, height=maxY-minY; + + if(width == 0 || height == 0) + return; + + scale = std::min(renderArea->get_width()/width, renderArea->get_height()/height)*0.75f; + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glScalef(scale, scale, 1); + glTranslatef(-xCenter, -yCenter, 0); + + const std::list<Data::Room*> &rooms = level->getRooms(); + + for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) + TopView::renderRoom(*room); + + if(mainArea) { + TopView *mainView = dynamic_cast<TopView*>(mainArea->getView()); + + if(mainView) { + float mainXCenter = mainView->getXCenter(), mainYCenter = mainView->getYCenter(); + float mainScale = mainView->getScale(); + + float mainWidth = mainArea->get_width()/mainScale, mainHeight = mainArea->get_height()/mainScale; + + glColor4f(0.7f, 0.7f, 0.7f, 0.3f); + + glBegin(GL_POLYGON); + + glVertex2f(mainXCenter-mainWidth/2, mainYCenter-mainHeight/2); + glVertex2f(mainXCenter+mainWidth/2, mainYCenter-mainHeight/2); + glVertex2f(mainXCenter+mainWidth/2, mainYCenter+mainHeight/2); + glVertex2f(mainXCenter-mainWidth/2, mainYCenter+mainHeight/2); + + glEnd(); + + glColor4f(0.7f, 0.7f, 0.7f, 0.7f); + glLineWidth(1.0f); + + glBegin(GL_LINE_LOOP); + + glVertex2f(mainXCenter-mainWidth/2, mainYCenter-mainHeight/2); + glVertex2f(mainXCenter+mainWidth/2, mainYCenter-mainHeight/2); + glVertex2f(mainXCenter+mainWidth/2, mainYCenter+mainHeight/2); + glVertex2f(mainXCenter-mainWidth/2, mainYCenter+mainHeight/2); + + glEnd(); + } + } + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + +void MapView::getBounds(float *minX, float *maxX, float *minY, float *maxY) { + if(minX) + *minX = 0; + if(maxX) + *maxX = 0; + if(minY) + *minY = 0; + if(maxY) + *maxY = 0; + + if(!level) + return; + + const std::list<Data::Room*> &rooms = level->getRooms(); + + for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) { + const std::list<Data::Triangle*> &triangles = (*room)->getFloorTriangles(); + + for(std::list<Data::Triangle*>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) { + const Data::Vertex &v1 = (*t)->getVertex(0), &v2 = (*t)->getVertex(1), &v3 = (*t)->getVertex(2); + + if(minX) + *minX = std::min(std::min(*minX, v1.getX()), std::min(v2.getX(), v3.getX())); + if(maxX) + *maxX = std::max(std::max(*maxX, v1.getX()), std::max(v2.getX(), v3.getX())); + if(minY) + *minY = std::min(std::min(*minY, v1.getZ()), std::min(v2.getZ(), v3.getZ())); + if(maxY) + *maxY = std::max(std::max(*maxY, v1.getZ()), std::max(v2.getZ(), v3.getZ())); + } + } } + } } |