summaryrefslogtreecommitdiffstats
path: root/src/View/TopView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/View/TopView.cpp')
-rw-r--r--src/View/TopView.cpp59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/View/TopView.cpp b/src/View/TopView.cpp
index 684f4ef..8ca047f 100644
--- a/src/View/TopView.cpp
+++ b/src/View/TopView.cpp
@@ -24,10 +24,40 @@
#include <Gui/RenderArea.h>
#include <GL/gl.h>
#include <cmath>
+#include <set>
namespace ZoomEdit {
namespace View {
+bool TopView::Edge::operator<(const Edge &e) const {
+ if(v1->getX() < e.v1->getX())
+ return true;
+ if(v1->getX() > e.v1->getX())
+ return false;
+ if(v1->getY() < e.v1->getY())
+ return true;
+ if(v1->getY() > e.v1->getY())
+ return false;
+ if(v1->getZ() < e.v1->getZ())
+ return true;
+ if(v1->getZ() > e.v1->getZ())
+ return false;
+ if(v2->getX() < e.v2->getX())
+ return true;
+ if(v2->getX() > e.v2->getX())
+ return false;
+ if(v2->getY() < e.v2->getY())
+ return true;
+ if(v2->getY() > e.v2->getY())
+ return false;
+ if(v2->getZ() < e.v2->getZ())
+ return true;
+ if(v2->getZ() > e.v2->getZ())
+ return false;
+
+ return false;
+}
+
void TopView::drawGrid(Gui::RenderArea *renderArea) {
float depth = std::log10(renderArea->getScale())-0.75f;
float depth2 = std::floor(depth);
@@ -68,6 +98,7 @@ void TopView::drawGrid(Gui::RenderArea *renderArea) {
void TopView::renderRoom(Data::Room *room) {
const std::list<Data::Triangle*> &floor = room->getFloorTriangles();
+ std::multiset<Edge> edges;
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
@@ -76,11 +107,39 @@ void TopView::renderRoom(Data::Room *room) {
for(std::list<Data::Triangle*>::const_iterator t = floor.begin(); t != floor.end(); ++t) {
for(int i = 0; i < 3; ++i) {
const Data::Vertex &v = (*t)->getVertex(i);
+ const Data::Vertex &v2 = (*t)->getVertex((i+1)%3);
+
glVertex2f(v.getX(), v.getZ());
+
+ edges.insert(Edge(&v, &v2));
}
}
glEnd();
+
+ for(std::multiset<Edge>::iterator next = edges.begin(); next != edges.end();) {
+ std::multiset<Edge>::iterator edge = next++;
+ std::multiset<Edge>::iterator edge2 = edges.find(Edge(edge->v2, edge->v1));
+
+ if(edge2 != edges.end()) {
+ edges.erase(edge2);
+ next = edge;
+ ++next;
+ edges.erase(edge);
+ }
+ }
+
+ glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
+ glLineWidth(1.0f);
+
+ glBegin(GL_LINES);
+
+ for(std::multiset<Edge>::iterator edge = edges.begin(); edge != edges.end(); ++edge) {
+ glVertex2f(edge->v1->getX(), edge->v1->getZ());
+ glVertex2f(edge->v2->getX(), edge->v2->getZ());
+ }
+
+ glEnd();
}
void TopView::render(Gui::RenderArea *renderArea) {