From e0cb6bd23b21f126bde42f74f4b1a798c3e15b0f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 7 Jan 2010 07:03:58 +0100 Subject: Major cleanup Much better now! --- src/View/TopView.cpp | 56 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 24 deletions(-) (limited to 'src/View/TopView.cpp') diff --git a/src/View/TopView.cpp b/src/View/TopView.cpp index 6ab00d9..12bbe4a 100644 --- a/src/View/TopView.cpp +++ b/src/View/TopView.cpp @@ -31,29 +31,29 @@ namespace ZoomEdit { namespace View { bool TopView::Edge::operator<(const Edge &e) const { - if(v1->getX() < e.v1->getX()) + if(v1->x() < e.v1->x()) return true; - if(v1->getX() > e.v1->getX()) + if(v1->x() > e.v1->x()) return false; - if(v1->getY() < e.v1->getY()) + if(v1->y() < e.v1->y()) return true; - if(v1->getY() > e.v1->getY()) + if(v1->y() > e.v1->y()) return false; - if(v1->getZ() < e.v1->getZ()) + if(v1->z() < e.v1->z()) return true; - if(v1->getZ() > e.v1->getZ()) + if(v1->z() > e.v1->z()) return false; - if(v2->getX() < e.v2->getX()) + if(v2->x() < e.v2->x()) return true; - if(v2->getX() > e.v2->getX()) + if(v2->x() > e.v2->x()) return false; - if(v2->getY() < e.v2->getY()) + if(v2->y() < e.v2->y()) return true; - if(v2->getY() > e.v2->getY()) + if(v2->y() > e.v2->y()) return false; - if(v2->getZ() < e.v2->getZ()) + if(v2->z() < e.v2->z()) return true; - if(v2->getZ() > e.v2->getZ()) + if(v2->z() > e.v2->z()) return false; return false; @@ -96,7 +96,7 @@ void TopView::drawGrid() { } void TopView::renderRoom(Data::Room *room, bool selected) { - const std::list &floor = room->getFloorTriangles(); + const std::list &triangles = room->getTriangles(); std::multiset edges; if(selected) @@ -106,12 +106,20 @@ void TopView::renderRoom(Data::Room *room, bool selected) { glBegin(GL_TRIANGLES); - for(std::list::const_iterator t = floor.begin(); t != floor.end(); ++t) { + for(std::list::const_iterator t = triangles.begin(); t != triangles.end(); ++t) { + vmml::vec3f edge1 = (*t)->getVertex(1) - (*t)->getVertex(0); + vmml::vec3f edge2 = (*t)->getVertex(2) - (*t)->getVertex(0); + + vmml::vec3f normal = edge1.cross(edge2); + + if(normal.y() <= 0) + continue; + for(int i = 0; i < 3; ++i) { - const Data::Vertex &v = (*t)->getVertex(i); - const Data::Vertex &v2 = (*t)->getVertex((i+1)%3); + const vmml::vec3f &v = (*t)->getVertex(i); + const vmml::vec3f &v2 = (*t)->getVertex((i+1)%3); - glVertex2f(v.getX(), v.getZ()); + glVertex2f(v.x(), v.z()); edges.insert(Edge(&v, &v2)); } @@ -143,8 +151,8 @@ void TopView::renderRoom(Data::Room *room, bool selected) { glBegin(GL_LINES); for(std::multiset::iterator edge = edges.begin(); edge != edges.end(); ++edge) { - glVertex2f(edge->v1->getX(), edge->v1->getZ()); - glVertex2f(edge->v2->getX(), edge->v2->getZ()); + glVertex2f(edge->v1->x(), edge->v1->z()); + glVertex2f(edge->v2->x(), edge->v2->z()); } glEnd(); @@ -223,19 +231,19 @@ void TopView::click(float x, float y, unsigned int button) { if(button != 1) return; - Math::Vertex2D v(xCenter + x/scale, yCenter + y/scale); + vmml::vec2f v(xCenter + x/scale, yCenter + y/scale); selectedRoom = 0; const std::list& rooms = level->getRooms(); for(std::list::const_iterator room = rooms.begin(); room != rooms.end(); ++room) { - const std::list& triangles = (*room)->getFloorTriangles(); + const std::list& triangles = (*room)->getTriangles(); for(std::list::const_iterator t = triangles.begin(); t != triangles.end(); ++t) { - Math::Vertex2D v1((*t)->getVertex(0).getX(), (*t)->getVertex(0).getZ()); - Math::Vertex2D v2((*t)->getVertex(1).getX(), (*t)->getVertex(1).getZ()); - Math::Vertex2D v3((*t)->getVertex(2).getX(), (*t)->getVertex(2).getZ()); + vmml::vec2f v1((*t)->getVertex(0).x(), (*t)->getVertex(0).z()); + vmml::vec2f v2((*t)->getVertex(1).x(), (*t)->getVertex(1).z()); + vmml::vec2f v3((*t)->getVertex(2).x(), (*t)->getVertex(2).z()); if(Math::Triangle2D(v1, v2, v3).contains(v)) { selectedRoom = *room; -- cgit v1.2.3