zoomedit:
* Draw room edges
This commit is contained in:
parent
7c929e6e1c
commit
bb09e9e703
2 changed files with 71 additions and 0 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Reference in a new issue