zoomedit: Improved vertex handling and edge rendering.
This commit is contained in:
parent
f457ec5027
commit
258eb984ba
5 changed files with 34 additions and 13 deletions
14
Renderer.cpp
14
Renderer.cpp
|
@ -51,8 +51,8 @@ void Renderer::fillPolygon(const Polygon &polygon) {
|
|||
glEnd();
|
||||
}
|
||||
|
||||
void Renderer::drawPolygon(const Polygon &polygon, bool close) {
|
||||
glBegin(close ? GL_LINE_LOOP : GL_LINE_STRIP);
|
||||
void Renderer::drawPolygon(const Polygon &polygon) {
|
||||
glBegin(GL_LINE_LOOP);
|
||||
|
||||
for(Polygon::const_iterator vertex = polygon.begin(); vertex != polygon.end(); vertex++)
|
||||
glVertex2f(vertex->getX(), vertex->getY());
|
||||
|
@ -172,7 +172,15 @@ void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float s
|
|||
glLineWidth(1.0f);
|
||||
}
|
||||
|
||||
drawPolygon(room.getPolygon());
|
||||
glBegin(GL_LINES);
|
||||
|
||||
for(size_t i = 0; i < room.getEdgeCount(); i++) {
|
||||
const Edge *edge = room.getEdge(i);
|
||||
glVertex2f(edge->getVertex1()->getX(), edge->getVertex1()->getY());
|
||||
glVertex2f(edge->getVertex2()->getX(), edge->getVertex2()->getY());
|
||||
}
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale) {
|
||||
|
|
|
@ -19,7 +19,7 @@ class Renderer {
|
|||
|
||||
protected:
|
||||
void fillPolygon(const Polygon &polygon);
|
||||
void drawPolygon(const Polygon &polygon, bool close = true);
|
||||
void drawPolygon(const Polygon &polygon);
|
||||
void fillCircle(const Vertex &m, float r, int n = 64);
|
||||
void drawCircle(const Vertex &m, float r, int n = 64);
|
||||
void drawCircleDotted(const Vertex &m, float r, int n = 64, int d = 8, float rot = 0);
|
||||
|
|
4
Room.cpp
4
Room.cpp
|
@ -23,8 +23,10 @@ const Room& Room::operator=(const Room &room) {
|
|||
std::vector<SharedPtr<LevelObject> > Room::getChildren() {
|
||||
std::vector<SharedPtr<LevelObject> > children;
|
||||
|
||||
for(size_t i = 0; i < vertices.size(); i++)
|
||||
for(size_t i = 0; i < vertices.size(); i++) {
|
||||
if(vertices[i]->isDirect())
|
||||
children.push_back(SharedPtr<LevelObject>(new LevelVertex(this, i, this)));
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < edges.size(); i++)
|
||||
children.push_back(SharedPtr<LevelObject>(new LevelEdge(this, i, this)));
|
||||
|
|
10
Room.h
10
Room.h
|
@ -22,6 +22,8 @@ class Room : public LevelObject, private VertexProvider, private EdgeProvider {
|
|||
virtual const Vertex& operator-=(const Vertex &v) {return **this;}
|
||||
|
||||
virtual void setLocation(float x, float y) {}
|
||||
|
||||
virtual bool isDirect() const = 0;
|
||||
};
|
||||
|
||||
class RoomVertexDirect : public RoomVertex {
|
||||
|
@ -48,6 +50,8 @@ class Room : public LevelObject, private VertexProvider, private EdgeProvider {
|
|||
virtual void setLocation(float x, float y) {
|
||||
vertex.setLocation(x, y);
|
||||
}
|
||||
|
||||
virtual bool isDirect() const {return true;}
|
||||
};
|
||||
|
||||
class RoomVertexIndirect : public RoomVertex {
|
||||
|
@ -60,6 +64,8 @@ class Room : public LevelObject, private VertexProvider, private EdgeProvider {
|
|||
virtual const Vertex& operator*() const {
|
||||
return *vertex;
|
||||
}
|
||||
|
||||
virtual bool isDirect() const {return false;}
|
||||
};
|
||||
|
||||
|
||||
|
@ -132,8 +138,8 @@ class Room : public LevelObject, private VertexProvider, private EdgeProvider {
|
|||
}
|
||||
|
||||
void close() {
|
||||
if(!edges.empty())
|
||||
edges.push_back(Edge(edges.back().getVertex2(), edges.front().getVertex1()));
|
||||
if(vertices.size() >= 2)
|
||||
edges.push_back(Edge(LevelVertex(this, vertices.size()-1, this), LevelVertex(this, 0, this)));
|
||||
}
|
||||
|
||||
Polygon getPolygon() const {
|
||||
|
|
|
@ -34,20 +34,25 @@ void ToolAddPolygon::render(const Level &level, const Rectangle &rect, float sca
|
|||
|
||||
glLineWidth(2.0f);
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||
drawPolygon(newRoom.getPolygon(), false);
|
||||
|
||||
glBegin(GL_LINES);
|
||||
|
||||
for(size_t i = 0; i < newRoom.getEdgeCount(); i++) {
|
||||
const Edge *edge = newRoom.getEdge(i);
|
||||
glVertex2f(edge->getVertex1()->getX(), edge->getVertex1()->getY());
|
||||
glVertex2f(edge->getVertex2()->getX(), edge->getVertex2()->getY());
|
||||
}
|
||||
|
||||
if(!newRoom.getPolygon().empty() && editManager->getHoveredVertex()) {
|
||||
if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom))
|
||||
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
||||
|
||||
glBegin(GL_LINES);
|
||||
|
||||
glVertex2f(newRoom.getPolygon().back().getX(), newRoom.getPolygon().back().getY());
|
||||
glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
|
||||
}
|
||||
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
|
||||
bool ToolAddPolygon::buttonPress(unsigned int button, const Vertex *v) {
|
||||
if(button != 1)
|
||||
|
|
Reference in a new issue