summaryrefslogtreecommitdiffstats
path: root/src/View/MapView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/View/MapView.cpp')
-rw-r--r--src/View/MapView.cpp118
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()));
+ }
+ }
}
+
}
}