Added edges to rooms.

This commit is contained in:
neoraider 2008-02-15 11:01:04 +00:00
parent c4aadd9823
commit 80b4f14530
17 changed files with 305 additions and 98 deletions

View file

@ -262,9 +262,9 @@ float Drawer::getImageWidth() const {
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
if((*object)->isOfType("Room")) { if((*object)->isOfType("Room")) {
Room *room = (Room*)&**object; const Polygon &polygon = ((Room*)&**object)->getPolygon();
for(Room::iterator v = room->begin(); v != room->end(); v++) { for(Polygon::const_iterator v = polygon.begin(); v != polygon.end(); v++) {
max = fmaxf(max, fabsf(v->getX())); max = fmaxf(max, fabsf(v->getX()));
} }
} }
@ -278,9 +278,9 @@ float Drawer::getImageHeight() const {
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
if((*object)->isOfType("Room")) { if((*object)->isOfType("Room")) {
Room *room = (Room*)&**object; const Polygon &polygon = ((Room*)&**object)->getPolygon();
for(Room::iterator v = room->begin(); v != room->end(); v++) { for(Polygon::const_iterator v = polygon.begin(); v != polygon.end(); v++) {
max = fmaxf(max, fabsf(v->getY())); max = fmaxf(max, fabsf(v->getY()));
} }
} }

24
Edge.h Normal file
View file

@ -0,0 +1,24 @@
#ifndef EDGE_H_
#define EDGE_H_
#include "LevelVertex.h"
#include "Line.h"
class Edge {
private:
LevelVertex vertex1, vertex2;
public:
Edge(const LevelVertex &v1, const LevelVertex &v2)
: vertex1(v1), vertex2(v2) {}
const LevelVertex& getVertex1() const {return vertex1;}
const LevelVertex& getVertex2() const {return vertex2;}
Line toLine() const {
return Line(*vertex1, *vertex2);
}
};
#endif /*EDGE_H_*/

18
EdgeProvider.h Normal file
View file

@ -0,0 +1,18 @@
#ifndef EDGEPROVIDER_H_
#define EDGEPROVIDER_H_
#include "Edge.h"
class EdgeProvider {
public:
virtual ~EdgeProvider() {}
virtual const Edge* getEdge(size_t id) const = 0;
virtual size_t getEdgeCount() const = 0;
virtual void moveEdge(size_t id, float x, float y) {}
virtual void rotateEdge(size_t id, float a) {}
};
#endif /*EDGEPROVIDER_H_*/

View file

@ -5,21 +5,21 @@
bool EditManager::lineOk(const Room &newRoom, const Line &l) const { bool EditManager::lineOk(const Room &newRoom, const Line &l) const {
Line l2; Line l2;
for(size_t i = 0; i+2 < newRoom.size(); i++) { for(size_t i = 0; i+2 < newRoom.getPolygon().size(); i++) {
l2.setVertex1(newRoom.at(i)); l2.setVertex1(newRoom.getPolygon()[i]);
l2.setVertex2(newRoom.at(i+1)); l2.setVertex2(newRoom.getPolygon()[i+1]);
if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false; if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
} }
if(newRoom.size() > 1) { if(newRoom.getPolygon().size() > 1) {
l2.setVertex1(newRoom.at(newRoom.size()-2)); l2.setVertex1(newRoom.getPolygon()[newRoom.getPolygon().size()-2]);
l2.setVertex2(newRoom.back()); l2.setVertex2(newRoom.getPolygon().back());
if(l2.contains(l.getVertex2())) return false; if(l2.contains(l.getVertex2())) return false;
} }
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
if((*room)->isOfType("Room") && ((Room*)&**room)->intersects(l)) if((*room)->isOfType("Room") && ((Room*)&**room)->getPolygon().intersects(l))
return false; return false;
} }
@ -42,7 +42,7 @@ void EditManager::redraw() {
} }
bool EditManager::addRoom(const Room &newRoom) { bool EditManager::addRoom(const Room &newRoom) {
if(newRoom.size() > 2 && polygonOk(newRoom)) { if(newRoom.getPolygon().size() > 2 && polygonOk(newRoom.getPolygon())) {
Room *room = new Room(newRoom); Room *room = new Room(newRoom);
room->setName(idManager.generate("room")); room->setName(idManager.generate("room"));
@ -90,16 +90,16 @@ bool EditManager::vertexOk(const Vertex &v, const Room *newRoom) const {
Line l; Line l;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
if((*room)->isOfType("Room") && ((Room*)&**room)->contains(v)) return false; if((*room)->isOfType("Room") && ((Room*)&**room)->getPolygon().contains(v)) return false;
} }
if(!newRoom) if(!newRoom)
return true; return true;
if(newRoom->empty()) if(newRoom->getPolygon().empty())
return true; return true;
l.setVertex1(newRoom->back()); l.setVertex1(newRoom->getPolygon().back());
l.setVertex2(v); l.setVertex2(v);
return lineOk(*newRoom, l); return lineOk(*newRoom, l);
@ -116,12 +116,12 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
Room *room = (Room*)&**object; Room *room = (Room*)&**object;
if(room->empty()) continue; if(room->getPolygon().empty()) continue;
if(room->contains(polygon.front())) if(room->getPolygon().contains(polygon.front()))
return false; return false;
if(polygon.contains(room->front())) if(polygon.contains(room->getPolygon().front()))
return false; return false;
} }
@ -139,7 +139,7 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
l.setVertex2(*it2); l.setVertex2(*it2);
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
if((*room)->isOfType("Room") && ((Room*)&**room)->intersects(l)) if((*room)->isOfType("Room") && ((Room*)&**room)->getPolygon().intersects(l))
return false; return false;
} }
} }

View file

@ -328,7 +328,7 @@ bool FileManager::write() {
} }
std::vector<Triangle> triangles; std::vector<Triangle> triangles;
room->triangulate(triangles); room->getPolygon().triangulate(triangles);
for(std::vector<Triangle>::iterator triangle = triangles.begin(); triangle != triangles.end(); triangle++) { for(std::vector<Triangle>::iterator triangle = triangles.begin(); triangle != triangles.end(); triangle++) {
if(!writeTriangle(writer, *triangle, room->getHeight())) { if(!writeTriangle(writer, *triangle, room->getHeight())) {
@ -337,9 +337,9 @@ bool FileManager::write() {
} }
} }
std::vector<Vertex> vertices = *room; std::vector<Vertex> vertices = room->getPolygon();
if(room->getDirection() == Triangle::CCW) { if(room->getPolygon().getDirection() == Triangle::CCW) {
vertices = std::vector<Vertex>(vertices.rbegin(), vertices.rend()); vertices = std::vector<Vertex>(vertices.rbegin(), vertices.rend());
} }

68
LevelEdge.h Normal file
View file

@ -0,0 +1,68 @@
#ifndef LEVELEDGE_H_
#define LEVELEDGE_H_
#include "LevelObject.h"
#include "EdgeProvider.h"
#include <math.h>
class LevelEdge : public LevelObject {
private:
EdgeProvider *provider;
size_t id;
static const float width = 1;
public:
LevelEdge(EdgeProvider *p, size_t i, LevelObject *parent)
: LevelObject(parent), provider(p), id(i) {}
virtual bool hit(const Vertex &v, float scale) const {
const Edge &edge = **this;
const Vertex &v1 = *edge.getVertex1(), &v2 = *edge.getVertex2();
float width = this->width/scale;
if(v.getX() < fminf(v1.getX(), v2.getX())-width)
return false;
if(v.getX() > fmaxf(v1.getX(), v2.getX())+width)
return false;
if(v.getY() < fminf(v1.getY(), v2.getY())-width)
return false;
if(v.getY() > fmaxf(v1.getY(), v2.getY())+width)
return false;
Vertex r = v2 - v1, p = v - v1;
r *= (r.getX()*p.getX() + r.getY()*p.getY())/v1.distanceSq(v2);
return (r.distanceSq(p) <= width*width);
}
virtual int getPriority() const {return 500;}
virtual const char* getType() const {
return "LevelEdge";
}
virtual void move(float x, float y) {
provider->moveEdge(id, x, y);
}
virtual void rotate(float a) {
provider->rotateEdge(id, a);
}
virtual Vertex getCenter() const {
Line l = provider->getEdge(id)->toLine();
return (l.getVertex1()+l.getVertex2()) / 2;
}
const Edge* operator->() const {return provider->getEdge(id);}
const Edge& operator*() const {return *provider->getEdge(id);}
};
#endif /*LEVELEDGE_H_*/

View file

@ -5,14 +5,14 @@
#include "VertexProvider.h" #include "VertexProvider.h"
class LevelVertex : public LevelObject, public VertexProvider { class LevelVertex : public LevelObject {
private: private:
VertexProvider *provider; VertexProvider *provider;
size_t id; size_t id;
public: public:
LevelVertex(VertexProvider *p, size_t i) LevelVertex(VertexProvider *p, size_t i, LevelObject *parent)
: provider(p), id(i) {} : LevelObject(parent), provider(p), id(i) {}
virtual const char* getType() const { virtual const char* getType() const {
return "LevelVertex"; return "LevelVertex";
@ -38,22 +38,6 @@ class LevelVertex : public LevelObject, public VertexProvider {
return *provider->getVertex(id); return *provider->getVertex(id);
} }
virtual const Vertex* getVertex(size_t id) const {
return provider->getVertex(this->id);
}
virtual size_t getVertexCount() const {
return 1;
}
virtual void moveVertex(size_t id, float x, float y) {
provider->moveVertex(this->id, x, y);
}
virtual void rotateVertex(size_t id, float a) {
provider->rotateVertex(this->id, a);
}
const Vertex* operator->() const {return provider->getVertex(id);} const Vertex* operator->() const {return provider->getVertex(id);}
const Vertex& operator*() const {return *provider->getVertex(id);} const Vertex& operator*() const {return *provider->getVertex(id);}
}; };

View file

@ -5,6 +5,6 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \ Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \ EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolSelector.cpp ToolAddPolygon.cpp ToolAddRect.cpp \ ToolSelector.cpp ToolAddPolygon.cpp ToolAddRect.cpp \
ToolGrab.cpp ToolRotate.cpp Vertex3d.cpp ToolGrab.cpp ToolRotate.cpp Vertex3d.cpp Room.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@ zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@ zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@

View file

@ -62,7 +62,8 @@ am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
zoomedit-ToolSelector.$(OBJEXT) \ zoomedit-ToolSelector.$(OBJEXT) \
zoomedit-ToolAddPolygon.$(OBJEXT) \ zoomedit-ToolAddPolygon.$(OBJEXT) \
zoomedit-ToolAddRect.$(OBJEXT) zoomedit-ToolGrab.$(OBJEXT) \ zoomedit-ToolAddRect.$(OBJEXT) zoomedit-ToolGrab.$(OBJEXT) \
zoomedit-ToolRotate.$(OBJEXT) zoomedit-Vertex3d.$(OBJEXT) zoomedit-ToolRotate.$(OBJEXT) zoomedit-Vertex3d.$(OBJEXT) \
zoomedit-Room.$(OBJEXT)
zoomedit_OBJECTS = $(am_zoomedit_OBJECTS) zoomedit_OBJECTS = $(am_zoomedit_OBJECTS)
zoomedit_DEPENDENCIES = zoomedit_DEPENDENCIES =
DEFAULT_INCLUDES = -I.@am__isrc@ DEFAULT_INCLUDES = -I.@am__isrc@
@ -190,7 +191,7 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \ Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \ EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolSelector.cpp ToolAddPolygon.cpp ToolAddRect.cpp \ ToolSelector.cpp ToolAddPolygon.cpp ToolAddRect.cpp \
ToolGrab.cpp ToolRotate.cpp Vertex3d.cpp ToolGrab.cpp ToolRotate.cpp Vertex3d.cpp Room.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@ zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@ zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
@ -290,6 +291,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Polygon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Polygon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Rectangle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Rectangle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Renderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Renderer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Room.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarAdd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarAdd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@
@ -657,6 +659,20 @@ zoomedit-Vertex3d.obj: Vertex3d.cpp
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-Vertex3d.obj `if test -f 'Vertex3d.cpp'; then $(CYGPATH_W) 'Vertex3d.cpp'; else $(CYGPATH_W) '$(srcdir)/Vertex3d.cpp'; fi` @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-Vertex3d.obj `if test -f 'Vertex3d.cpp'; then $(CYGPATH_W) 'Vertex3d.cpp'; else $(CYGPATH_W) '$(srcdir)/Vertex3d.cpp'; fi`
zoomedit-Room.o: Room.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Room.o -MD -MP -MF $(DEPDIR)/zoomedit-Room.Tpo -c -o zoomedit-Room.o `test -f 'Room.cpp' || echo '$(srcdir)/'`Room.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Room.Tpo $(DEPDIR)/zoomedit-Room.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Room.cpp' object='zoomedit-Room.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-Room.o `test -f 'Room.cpp' || echo '$(srcdir)/'`Room.cpp
zoomedit-Room.obj: Room.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Room.obj -MD -MP -MF $(DEPDIR)/zoomedit-Room.Tpo -c -o zoomedit-Room.obj `if test -f 'Room.cpp'; then $(CYGPATH_W) 'Room.cpp'; else $(CYGPATH_W) '$(srcdir)/Room.cpp'; fi`
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Room.Tpo $(DEPDIR)/zoomedit-Room.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Room.cpp' object='zoomedit-Room.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-Room.obj `if test -f 'Room.cpp'; then $(CYGPATH_W) 'Room.cpp'; else $(CYGPATH_W) '$(srcdir)/Room.cpp'; fi`
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \ unique=`for i in $$list; do \

View file

@ -71,7 +71,7 @@ class Portal : public LevelObject, public VertexProvider {
std::vector<SharedPtr<LevelObject> > children; std::vector<SharedPtr<LevelObject> > children;
for(size_t i = 0; i < 4; i++) for(size_t i = 0; i < 4; i++)
children.push_back(SharedPtr<LevelObject>(new LevelVertex(this, i))); children.push_back(SharedPtr<LevelObject>(new LevelVertex(this, i, this)));
return children; return children;
} }

View file

@ -93,6 +93,8 @@ void Renderer::drawCross(const Vertex &m, float r) {
void Renderer::renderObject(const LevelObject &object, bool selected, bool highlighted, float scale) { void Renderer::renderObject(const LevelObject &object, bool selected, bool highlighted, float scale) {
if(object.isOfType("LevelVertex")) if(object.isOfType("LevelVertex"))
renderLevelVertex(*(LevelVertex*)&object, selected, highlighted, scale); renderLevelVertex(*(LevelVertex*)&object, selected, highlighted, scale);
else if(object.isOfType("LevelEdge"))
renderLevelEdge(*(LevelEdge*)&object, selected, highlighted, scale);
else if(object.isOfType("Room")) else if(object.isOfType("Room"))
renderRoom(*(Room*)&object, selected, highlighted, scale); renderRoom(*(Room*)&object, selected, highlighted, scale);
else if(object.isOfType("PlayerStart")) else if(object.isOfType("PlayerStart"))
@ -115,13 +117,33 @@ void Renderer::renderLevelVertex(const LevelVertex &vertex, bool selected, bool
drawCircle(*vertex, 3.5f/scale, 16); drawCircle(*vertex, 3.5f/scale, 16);
} }
void Renderer::renderLevelEdge(const LevelEdge &edge, bool selected, bool highlighted, float scale) {
if(selected) {
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
glLineWidth(2.0f);
}
else if(highlighted) {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(2.0f);
}
else
return;
glBegin(GL_LINES);
glVertex2f(edge->getVertex1()->getX(), edge->getVertex1()->getY());
glVertex2f(edge->getVertex2()->getX(), edge->getVertex2()->getY());
glEnd();
}
void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, float scale) { void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, float scale) {
if(selected) if(selected)
glColor4f(0.0f, 0.7f, 1.0f, 0.2f); glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else else
glColor4f(0.0f, 0.7f, 1.0f, 0.3f); glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
fillPolygon(room); fillPolygon(room.getPolygon());
if(selected) { if(selected) {
glColor4f(1.0f, 1.0f, 1.0f, 0.9f); glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
@ -136,7 +158,7 @@ void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, flo
glLineWidth(1.0f); glLineWidth(1.0f);
} }
drawPolygon(room); drawPolygon(room.getPolygon());
} }
void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale) { void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale) {

View file

@ -8,6 +8,7 @@
#include "Room.h" #include "Room.h"
#include "PlayerStart.h" #include "PlayerStart.h"
#include "Portal.h" #include "Portal.h"
#include "LevelEdge.h"
class Renderer { class Renderer {
@ -26,6 +27,7 @@ class Renderer {
void renderObject(const LevelObject &object, bool selected, bool highlighted, float scale); void renderObject(const LevelObject &object, bool selected, bool highlighted, float scale);
void renderLevelVertex(const LevelVertex &vertex, bool selected, bool highlighted, float scale); void renderLevelVertex(const LevelVertex &vertex, bool selected, bool highlighted, float scale);
void renderLevelEdge(const LevelEdge &edge, bool selected, bool highlighted, float scale);
void renderRoom(const Room &room, bool selected, bool highlighted, float scale); void renderRoom(const Room &room, bool selected, bool highlighted, float scale);
void renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale); void renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale);

63
Room.cpp Normal file
View file

@ -0,0 +1,63 @@
#include "Room.h"
#include "LevelEdge.h"
void Room::rotateAround(Vertex z, float a) {
float s = sinf(a);
float c = cosf(a);
for(Polygon::iterator v = polygon.begin(); v != polygon.end(); v++) {
*v -= z;
v->setLocation(c*v->getX() - s*v->getY(), c*v->getY() + s*v->getX());
*v += z;
}
}
const Room& Room::operator=(const Room &room) {
polygon.clear();
edges.clear();
name = room.name;
height = room.height;
for(Polygon::const_iterator v = room.polygon.begin(); v != room.polygon.end(); v++)
addVertex(*v);
return room;
}
void Room::addVertex(Vertex v) {
polygon.push_back(v);
if(polygon.size() < 2)
return;
if(polygon.size() == 2) {
LevelVertex v1(this, 0, this), v2(this, 1, this);
edges.push_back(Edge(v1, v2));
edges.push_back(Edge(v2, v1));
return;
}
edges.pop_back();
LevelVertex v1(edges.back().getVertex2());
LevelVertex v2(this, polygon.size()-1, this);
LevelVertex v3(edges.front().getVertex1());
edges.push_back(Edge(v1, v2));
edges.push_back(Edge(v2, v3));
}
std::vector<SharedPtr<LevelObject> > Room::getChildren() {
std::vector<SharedPtr<LevelObject> > children;
for(size_t i = 0; i < polygon.size(); i++)
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)));
return children;
}

80
Room.h
View file

@ -2,21 +2,34 @@
#define ROOM_H_ #define ROOM_H_
#include "Polygon.h" #include "Polygon.h"
#include "SharedPtr.h"
#include "LevelObject.h" #include "LevelObject.h"
#include "VertexProvider.h" #include "VertexProvider.h"
#include "LevelVertex.h" #include "EdgeProvider.h"
#include <string> #include <string>
class Room : public Polygon, public LevelObject, public VertexProvider { class Room : public LevelObject, private VertexProvider, private EdgeProvider {
private: private:
Polygon polygon;
std::string name; std::string name;
float height; float height;
std::vector<Edge> edges;
void rotateAround(Vertex z, float a);
public: public:
Room() {height = 10;} Room() {height = 10;}
Room(std::string name) {this->name = name; height = 10;} Room(std::string name) {this->name = name; height = 10;}
Room(const Room &room) : name(room.name), height(room.height) {
for(Polygon::const_iterator v = room.polygon.begin(); v != room.polygon.end(); v++)
addVertex(*v);
}
const Room& operator=(const Room &room);
std::string &getName() {return name;} std::string &getName() {return name;}
const std::string &getName() const {return name;} const std::string &getName() const {return name;}
void setName(const std::string &name) {this->name = name;} void setName(const std::string &name) {this->name = name;}
@ -24,17 +37,14 @@ class Room : public Polygon, public LevelObject, public VertexProvider {
float getHeight() const {return height;} float getHeight() const {return height;}
void setHeight(float height) {this->height = height;} void setHeight(float height) {this->height = height;}
virtual bool hit(const Vertex &v, float scale) const {return contains(v);} void addVertex(Vertex v);
const Polygon& getPolygon() const {return polygon;}
virtual bool hit(const Vertex &v, float scale) const {return polygon.contains(v);}
virtual int getPriority() const {return 0;} virtual int getPriority() const {return 0;}
virtual std::vector<SharedPtr<LevelObject> > getChildren() { virtual std::vector<SharedPtr<LevelObject> > getChildren();
std::vector<SharedPtr<LevelObject> > children;
for(size_t i = 0; i < size(); i++)
children.push_back(SharedPtr<LevelObject>(new LevelVertex(this, i)));
return children;
}
virtual const char* getType() const { virtual const char* getType() const {
return "Room"; return "Room";
@ -43,55 +53,55 @@ class Room : public Polygon, public LevelObject, public VertexProvider {
virtual void move(float x, float y) { virtual void move(float x, float y) {
Vertex m(x, y); Vertex m(x, y);
for(iterator v = begin(); v != end(); v++) for(Polygon::iterator v = polygon.begin(); v != polygon.end(); v++)
*v += m; *v += m;
} }
virtual void rotate(float a) { virtual void rotate(float a) {
Vertex z = getCenter(); rotateAround(getCenter(), a);
float s = sinf(a);
float c = cosf(a);
for(iterator v = begin(); v != end(); v++) {
*v -= z;
v->setLocation(c*v->getX() - s*v->getY(), c*v->getY() + s*v->getX());
*v += z;
}
} }
virtual Vertex getCenter() const { virtual Vertex getCenter() const {
Vertex ret; Vertex ret;
for(const_iterator v = begin(); v != end(); v++) for(Polygon::const_iterator v = polygon.begin(); v != polygon.end(); v++)
ret += *v; ret += *v;
return ret / size(); return ret / polygon.size();
} }
virtual const Vertex* getVertex(size_t id) const { virtual const Vertex* getVertex(size_t id) const {
return &at(id); return &polygon[id];
} }
virtual size_t getVertexCount() const { virtual size_t getVertexCount() const {
return size(); return polygon.size();
} }
virtual void moveVertex(size_t id, float x, float y) { virtual void moveVertex(size_t id, float x, float y) {
at(id) += Vertex(x, y); polygon[id] += Vertex(x, y);
} }
virtual void rotateVertex(size_t id, float a) { virtual void rotateVertex(size_t id, float a) {
Vertex z = at(id); rotateAround(polygon[id], a);
float s = sinf(a);
float c = cosf(a);
for(iterator v = begin(); v != end(); v++) {
*v -= z;
v->setLocation(c*v->getX() - s*v->getY(), c*v->getY() + s*v->getX());
*v += z;
}
} }
virtual const Edge* getEdge(size_t id) const {
return &edges[id];
}
virtual size_t getEdgeCount() const {
return edges.size();
}
virtual void moveEdge(size_t id, float x, float y) {
moveVertex(id, x, y);
moveVertex((id+1)%polygon.size(), x, y);
}
virtual void rotateEdge(size_t id, float a) {
rotateAround((polygon[id]+polygon[(id+1)%polygon.size()])/2, a);
}
}; };
#endif /*ROOM_H_*/ #endif /*ROOM_H_*/

View file

@ -166,11 +166,11 @@ void SidebarView::update() {
gtk_entry_set_text(GTK_ENTRY(entryName), room->getName().c_str()); gtk_entry_set_text(GTK_ENTRY(entryName), room->getName().c_str());
gtk_widget_show(entryName); gtk_widget_show(entryName);
gchar *string = g_strdup_printf("%.2f", room->area()); gchar *string = g_strdup_printf("%.2f", room->getPolygon().area());
gtk_label_set_text(GTK_LABEL(labelArea), string); gtk_label_set_text(GTK_LABEL(labelArea), string);
g_free(string); g_free(string);
string = g_strdup_printf("%.2f", room->perimeter()); string = g_strdup_printf("%.2f", room->getPolygon().perimeter());
gtk_label_set_text(GTK_LABEL(labelPerimeter), string); gtk_label_set_text(GTK_LABEL(labelPerimeter), string);
g_free(string); g_free(string);

View file

@ -25,24 +25,24 @@ void ToolAddPolygon::deactivate() {
} }
void ToolAddPolygon::render(const Level &level, const Rectangle &rect, float scale) { void ToolAddPolygon::render(const Level &level, const Rectangle &rect, float scale) {
if(editManager->polygonOk(newRoom)) if(editManager->polygonOk(newRoom.getPolygon()))
glColor4f(0.0f, 0.7f, 1.0f, 0.2f); glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else else
glColor4f(1.0f, 0.3f, 0.3f, 0.2f); glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
fillPolygon(newRoom); fillPolygon(newRoom.getPolygon());
glLineWidth(2.0f); glLineWidth(2.0f);
glColor4f(0.0f, 0.7f, 1.0f, 0.7f); glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
drawPolygon(newRoom, false); drawPolygon(newRoom.getPolygon(), false);
if(!newRoom.empty() && editManager->getHoveredVertex()) { if(!newRoom.getPolygon().empty() && editManager->getHoveredVertex()) {
if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom)) if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom))
glColor4f(1.0f, 0.3f, 0.3f, 0.7f); glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
glBegin(GL_LINES); glBegin(GL_LINES);
glVertex2f(newRoom.back().getX(), newRoom.back().getY()); glVertex2f(newRoom.getPolygon().back().getX(), newRoom.getPolygon().back().getY());
glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY()); glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
glEnd(); glEnd();
@ -59,7 +59,7 @@ bool ToolAddPolygon::buttonPress(unsigned int button) {
if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom)) if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom))
return false; return false;
newRoom.push_back(*editManager->getHoveredVertex()); newRoom.addVertex(*editManager->getHoveredVertex());
editManager->redraw(); editManager->redraw();
sidebar.update(); sidebar.update();

View file

@ -6,10 +6,10 @@ Room ToolAddRect::createRoom() {
const Vertex *v2 = editManager->getHoveredVertex(); const Vertex *v2 = editManager->getHoveredVertex();
Room room; Room room;
room.push_back(v1); room.addVertex(v1);
room.push_back(Vertex(v1.getX(), v2->getY())); room.addVertex(Vertex(v1.getX(), v2->getY()));
room.push_back(*v2); room.addVertex(*v2);
room.push_back(Vertex(v2->getX(), v1.getY())); room.addVertex(Vertex(v2->getX(), v1.getY()));
return room; return room;
} }
@ -38,16 +38,16 @@ void ToolAddRect::render(const Level &level, const Rectangle &rect, float scale)
Room room = createRoom(); Room room = createRoom();
if(editManager->polygonOk(room)) if(editManager->polygonOk(room.getPolygon()))
glColor4f(0.0f, 0.7f, 1.0f, 0.2f); glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else else
glColor4f(1.0f, 0.3f, 0.3f, 0.2f); glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
fillPolygon(room); fillPolygon(room.getPolygon());
glLineWidth(2.0f); glLineWidth(2.0f);
glColor4f(0.0f, 0.7f, 1.0f, 0.7f); glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
drawPolygon(room); drawPolygon(room.getPolygon());
} }
bool ToolAddRect::buttonPress(unsigned int button) { bool ToolAddRect::buttonPress(unsigned int button) {
@ -78,7 +78,7 @@ bool ToolAddRect::buttonRelease(unsigned int button) {
if(editManager->getHoveredVertex()) { if(editManager->getHoveredVertex()) {
Room room = createRoom(); Room room = createRoom();
if(editManager->polygonOk(room)) { if(editManager->polygonOk(room.getPolygon())) {
editManager->addRoom(room); editManager->addRoom(room);
editManager->redraw(); editManager->redraw();