zoomedit:

* Draw room edges
This commit is contained in:
neoraider 2008-04-15 14:15:02 +00:00
parent 7c929e6e1c
commit bb09e9e703
2 changed files with 71 additions and 0 deletions

View file

@ -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) {

View file

@ -27,14 +27,26 @@ namespace ZoomEdit {
namespace Data {
class Level;
class Room;
class Vertex;
}
namespace View {
class TopView : public View {
private:
class Edge {
public:
const Data::Vertex *v1, *v2;
Edge(const Data::Vertex *v10, const Data::Vertex *v20)
: v1(v10), v2(v20) {};
bool operator<(const Edge &e) const;
};
Data::Level *level;
bool edgeLess(const Edge &e1, const Edge &e2);
void drawGrid(Gui::RenderArea *renderArea);
void renderRoom(Data::Room *room);