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 <Gui/RenderArea.h>
#include <GL/gl.h> #include <GL/gl.h>
#include <cmath> #include <cmath>
#include <set>
namespace ZoomEdit { namespace ZoomEdit {
namespace View { 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) { void TopView::drawGrid(Gui::RenderArea *renderArea) {
float depth = std::log10(renderArea->getScale())-0.75f; float depth = std::log10(renderArea->getScale())-0.75f;
float depth2 = std::floor(depth); float depth2 = std::floor(depth);
@ -68,6 +98,7 @@ void TopView::drawGrid(Gui::RenderArea *renderArea) {
void TopView::renderRoom(Data::Room *room) { void TopView::renderRoom(Data::Room *room) {
const std::list<Data::Triangle*> &floor = room->getFloorTriangles(); const std::list<Data::Triangle*> &floor = room->getFloorTriangles();
std::multiset<Edge> edges;
glColor4f(0.0f, 0.7f, 1.0f, 0.3f); 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(std::list<Data::Triangle*>::const_iterator t = floor.begin(); t != floor.end(); ++t) {
for(int i = 0; i < 3; ++i) { for(int i = 0; i < 3; ++i) {
const Data::Vertex &v = (*t)->getVertex(i); const Data::Vertex &v = (*t)->getVertex(i);
const Data::Vertex &v2 = (*t)->getVertex((i+1)%3);
glVertex2f(v.getX(), v.getZ()); glVertex2f(v.getX(), v.getZ());
edges.insert(Edge(&v, &v2));
} }
} }
glEnd(); 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) { void TopView::render(Gui::RenderArea *renderArea) {

View file

@ -27,14 +27,26 @@ namespace ZoomEdit {
namespace Data { namespace Data {
class Level; class Level;
class Room; class Room;
class Vertex;
} }
namespace View { namespace View {
class TopView : public View { class TopView : public View {
private: 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; Data::Level *level;
bool edgeLess(const Edge &e1, const Edge &e2);
void drawGrid(Gui::RenderArea *renderArea); void drawGrid(Gui::RenderArea *renderArea);
void renderRoom(Data::Room *room); void renderRoom(Data::Room *room);