Added edges to rooms.
This commit is contained in:
parent
c4aadd9823
commit
80b4f14530
17 changed files with 305 additions and 98 deletions
|
@ -262,9 +262,9 @@ float Drawer::getImageWidth() const {
|
|||
|
||||
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
|
||||
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()));
|
||||
}
|
||||
}
|
||||
|
@ -278,9 +278,9 @@ float Drawer::getImageHeight() const {
|
|||
|
||||
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
|
||||
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()));
|
||||
}
|
||||
}
|
||||
|
|
24
Edge.h
Normal file
24
Edge.h
Normal 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
18
EdgeProvider.h
Normal 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_*/
|
|
@ -5,21 +5,21 @@
|
|||
bool EditManager::lineOk(const Room &newRoom, const Line &l) const {
|
||||
Line l2;
|
||||
|
||||
for(size_t i = 0; i+2 < newRoom.size(); i++) {
|
||||
l2.setVertex1(newRoom.at(i));
|
||||
l2.setVertex2(newRoom.at(i+1));
|
||||
for(size_t i = 0; i+2 < newRoom.getPolygon().size(); i++) {
|
||||
l2.setVertex1(newRoom.getPolygon()[i]);
|
||||
l2.setVertex2(newRoom.getPolygon()[i+1]);
|
||||
|
||||
if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
|
||||
}
|
||||
|
||||
if(newRoom.size() > 1) {
|
||||
l2.setVertex1(newRoom.at(newRoom.size()-2));
|
||||
l2.setVertex2(newRoom.back());
|
||||
if(newRoom.getPolygon().size() > 1) {
|
||||
l2.setVertex1(newRoom.getPolygon()[newRoom.getPolygon().size()-2]);
|
||||
l2.setVertex2(newRoom.getPolygon().back());
|
||||
if(l2.contains(l.getVertex2())) return false;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -42,7 +42,7 @@ void EditManager::redraw() {
|
|||
}
|
||||
|
||||
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->setName(idManager.generate("room"));
|
||||
|
||||
|
@ -90,16 +90,16 @@ bool EditManager::vertexOk(const Vertex &v, const Room *newRoom) const {
|
|||
Line l;
|
||||
|
||||
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)
|
||||
return true;
|
||||
|
||||
if(newRoom->empty())
|
||||
if(newRoom->getPolygon().empty())
|
||||
return true;
|
||||
|
||||
l.setVertex1(newRoom->back());
|
||||
l.setVertex1(newRoom->getPolygon().back());
|
||||
l.setVertex2(v);
|
||||
|
||||
return lineOk(*newRoom, l);
|
||||
|
@ -116,12 +116,12 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
|
|||
|
||||
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;
|
||||
|
||||
if(polygon.contains(room->front()))
|
||||
if(polygon.contains(room->getPolygon().front()))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -139,7 +139,7 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
|
|||
l.setVertex2(*it2);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -328,7 +328,7 @@ bool FileManager::write() {
|
|||
}
|
||||
|
||||
std::vector<Triangle> triangles;
|
||||
room->triangulate(triangles);
|
||||
room->getPolygon().triangulate(triangles);
|
||||
|
||||
for(std::vector<Triangle>::iterator triangle = triangles.begin(); triangle != triangles.end(); triangle++) {
|
||||
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());
|
||||
}
|
||||
|
||||
|
|
68
LevelEdge.h
Normal file
68
LevelEdge.h
Normal 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_*/
|
|
@ -5,14 +5,14 @@
|
|||
#include "VertexProvider.h"
|
||||
|
||||
|
||||
class LevelVertex : public LevelObject, public VertexProvider {
|
||||
class LevelVertex : public LevelObject {
|
||||
private:
|
||||
VertexProvider *provider;
|
||||
size_t id;
|
||||
|
||||
public:
|
||||
LevelVertex(VertexProvider *p, size_t i)
|
||||
: provider(p), id(i) {}
|
||||
LevelVertex(VertexProvider *p, size_t i, LevelObject *parent)
|
||||
: LevelObject(parent), provider(p), id(i) {}
|
||||
|
||||
virtual const char* getType() const {
|
||||
return "LevelVertex";
|
||||
|
@ -38,22 +38,6 @@ class LevelVertex : public LevelObject, public VertexProvider {
|
|||
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);}
|
||||
};
|
||||
|
|
|
@ -5,6 +5,6 @@ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
|
|||
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
||||
EditManager.cpp FileManager.cpp SidebarToolbox.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_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
|
20
Makefile.in
20
Makefile.in
|
@ -62,7 +62,8 @@ am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
|
|||
zoomedit-ToolSelector.$(OBJEXT) \
|
||||
zoomedit-ToolAddPolygon.$(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_DEPENDENCIES =
|
||||
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 \
|
||||
EditManager.cpp FileManager.cpp SidebarToolbox.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_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-Rectangle.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-SidebarManager.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@
|
||||
@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)
|
||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
||||
unique=`for i in $$list; do \
|
||||
|
|
2
Portal.h
2
Portal.h
|
@ -71,7 +71,7 @@ class Portal : public LevelObject, public VertexProvider {
|
|||
std::vector<SharedPtr<LevelObject> > children;
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
26
Renderer.cpp
26
Renderer.cpp
|
@ -93,6 +93,8 @@ void Renderer::drawCross(const Vertex &m, float r) {
|
|||
void Renderer::renderObject(const LevelObject &object, bool selected, bool highlighted, float scale) {
|
||||
if(object.isOfType("LevelVertex"))
|
||||
renderLevelVertex(*(LevelVertex*)&object, selected, highlighted, scale);
|
||||
else if(object.isOfType("LevelEdge"))
|
||||
renderLevelEdge(*(LevelEdge*)&object, selected, highlighted, scale);
|
||||
else if(object.isOfType("Room"))
|
||||
renderRoom(*(Room*)&object, selected, highlighted, scale);
|
||||
else if(object.isOfType("PlayerStart"))
|
||||
|
@ -115,13 +117,33 @@ void Renderer::renderLevelVertex(const LevelVertex &vertex, bool selected, bool
|
|||
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) {
|
||||
if(selected)
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
||||
else
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
|
||||
|
||||
fillPolygon(room);
|
||||
fillPolygon(room.getPolygon());
|
||||
|
||||
if(selected) {
|
||||
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);
|
||||
}
|
||||
|
||||
drawPolygon(room);
|
||||
drawPolygon(room.getPolygon());
|
||||
}
|
||||
|
||||
void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale) {
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#include "Room.h"
|
||||
#include "PlayerStart.h"
|
||||
#include "Portal.h"
|
||||
#include "LevelEdge.h"
|
||||
|
||||
|
||||
class Renderer {
|
||||
|
@ -26,6 +27,7 @@ class Renderer {
|
|||
void renderObject(const LevelObject &object, 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 renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale);
|
||||
|
|
63
Room.cpp
Normal file
63
Room.cpp
Normal 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
80
Room.h
|
@ -2,21 +2,34 @@
|
|||
#define ROOM_H_
|
||||
|
||||
#include "Polygon.h"
|
||||
#include "SharedPtr.h"
|
||||
#include "LevelObject.h"
|
||||
#include "VertexProvider.h"
|
||||
#include "LevelVertex.h"
|
||||
#include "EdgeProvider.h"
|
||||
#include <string>
|
||||
|
||||
|
||||
class Room : public Polygon, public LevelObject, public VertexProvider {
|
||||
class Room : public LevelObject, private VertexProvider, private EdgeProvider {
|
||||
private:
|
||||
Polygon polygon;
|
||||
std::string name;
|
||||
float height;
|
||||
|
||||
std::vector<Edge> edges;
|
||||
|
||||
void rotateAround(Vertex z, float a);
|
||||
|
||||
public:
|
||||
Room() {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;}
|
||||
const std::string &getName() const {return 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;}
|
||||
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 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 std::vector<SharedPtr<LevelObject> > getChildren();
|
||||
|
||||
virtual const char* getType() const {
|
||||
return "Room";
|
||||
|
@ -43,55 +53,55 @@ class Room : public Polygon, public LevelObject, public VertexProvider {
|
|||
virtual void move(float x, float y) {
|
||||
Vertex m(x, y);
|
||||
|
||||
for(iterator v = begin(); v != end(); v++)
|
||||
for(Polygon::iterator v = polygon.begin(); v != polygon.end(); v++)
|
||||
*v += m;
|
||||
}
|
||||
|
||||
virtual void rotate(float a) {
|
||||
Vertex z = getCenter();
|
||||
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;
|
||||
}
|
||||
rotateAround(getCenter(), a);
|
||||
}
|
||||
|
||||
virtual Vertex getCenter() const {
|
||||
Vertex ret;
|
||||
|
||||
for(const_iterator v = begin(); v != end(); v++)
|
||||
for(Polygon::const_iterator v = polygon.begin(); v != polygon.end(); v++)
|
||||
ret += *v;
|
||||
|
||||
return ret / size();
|
||||
return ret / polygon.size();
|
||||
}
|
||||
|
||||
virtual const Vertex* getVertex(size_t id) const {
|
||||
return &at(id);
|
||||
return &polygon[id];
|
||||
}
|
||||
|
||||
virtual size_t getVertexCount() const {
|
||||
return size();
|
||||
return polygon.size();
|
||||
}
|
||||
|
||||
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) {
|
||||
Vertex z = at(id);
|
||||
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;
|
||||
}
|
||||
rotateAround(polygon[id], a);
|
||||
}
|
||||
|
||||
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_*/
|
||||
|
|
|
@ -166,11 +166,11 @@ void SidebarView::update() {
|
|||
gtk_entry_set_text(GTK_ENTRY(entryName), room->getName().c_str());
|
||||
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);
|
||||
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);
|
||||
g_free(string);
|
||||
|
||||
|
|
|
@ -25,24 +25,24 @@ void ToolAddPolygon::deactivate() {
|
|||
}
|
||||
|
||||
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);
|
||||
else
|
||||
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
||||
|
||||
fillPolygon(newRoom);
|
||||
fillPolygon(newRoom.getPolygon());
|
||||
|
||||
glLineWidth(2.0f);
|
||||
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))
|
||||
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
||||
|
||||
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());
|
||||
|
||||
glEnd();
|
||||
|
@ -59,7 +59,7 @@ bool ToolAddPolygon::buttonPress(unsigned int button) {
|
|||
if(!editManager->vertexOk(*editManager->getHoveredVertex(), &newRoom))
|
||||
return false;
|
||||
|
||||
newRoom.push_back(*editManager->getHoveredVertex());
|
||||
newRoom.addVertex(*editManager->getHoveredVertex());
|
||||
|
||||
editManager->redraw();
|
||||
sidebar.update();
|
||||
|
|
|
@ -6,10 +6,10 @@ Room ToolAddRect::createRoom() {
|
|||
const Vertex *v2 = editManager->getHoveredVertex();
|
||||
|
||||
Room room;
|
||||
room.push_back(v1);
|
||||
room.push_back(Vertex(v1.getX(), v2->getY()));
|
||||
room.push_back(*v2);
|
||||
room.push_back(Vertex(v2->getX(), v1.getY()));
|
||||
room.addVertex(v1);
|
||||
room.addVertex(Vertex(v1.getX(), v2->getY()));
|
||||
room.addVertex(*v2);
|
||||
room.addVertex(Vertex(v2->getX(), v1.getY()));
|
||||
|
||||
return room;
|
||||
}
|
||||
|
@ -38,16 +38,16 @@ void ToolAddRect::render(const Level &level, const Rectangle &rect, float scale)
|
|||
|
||||
Room room = createRoom();
|
||||
|
||||
if(editManager->polygonOk(room))
|
||||
if(editManager->polygonOk(room.getPolygon()))
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
||||
else
|
||||
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
||||
|
||||
fillPolygon(room);
|
||||
fillPolygon(room.getPolygon());
|
||||
|
||||
glLineWidth(2.0f);
|
||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||
drawPolygon(room);
|
||||
drawPolygon(room.getPolygon());
|
||||
}
|
||||
|
||||
bool ToolAddRect::buttonPress(unsigned int button) {
|
||||
|
@ -78,7 +78,7 @@ bool ToolAddRect::buttonRelease(unsigned int button) {
|
|||
if(editManager->getHoveredVertex()) {
|
||||
Room room = createRoom();
|
||||
|
||||
if(editManager->polygonOk(room)) {
|
||||
if(editManager->polygonOk(room.getPolygon())) {
|
||||
editManager->addRoom(room);
|
||||
|
||||
editManager->redraw();
|
||||
|
|
Reference in a new issue