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.cpp56
1 files changed, 32 insertions, 24 deletions
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<Data::Triangle*> &floor = room->getFloorTriangles();
+ const std::list<Data::Triangle*> &triangles = room->getTriangles();
std::multiset<Edge> edges;
if(selected)
@@ -106,12 +106,20 @@ void TopView::renderRoom(Data::Room *room, bool selected) {
glBegin(GL_TRIANGLES);
- for(std::list<Data::Triangle*>::const_iterator t = floor.begin(); t != floor.end(); ++t) {
+ for(std::list<Data::Triangle*>::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<Edge>::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<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();
+ const std::list<Data::Triangle*>& triangles = (*room)->getTriangles();
for(std::list<Data::Triangle*>::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;