summaryrefslogtreecommitdiffstats
path: root/EditManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'EditManager.cpp')
-rw-r--r--EditManager.cpp67
1 files changed, 37 insertions, 30 deletions
diff --git a/EditManager.cpp b/EditManager.cpp
index 8e2c045..0656939 100644
--- a/EditManager.cpp
+++ b/EditManager.cpp
@@ -5,23 +5,21 @@
bool EditManager::lineOk(const Line& l) const {
Line l2;
- if(activeRoom) {
- for(size_t i = 0; i+2 < activeRoom->size(); i++) {
- l2.setVertex1(activeRoom->at(i));
- l2.setVertex2(activeRoom->at(i+1));
-
- if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
- }
+ for(size_t i = 0; i+2 < newRoom.size(); i++) {
+ l2.setVertex1(newRoom.at(i));
+ l2.setVertex2(newRoom.at(i+1));
- if(activeRoom->size() > 1) {
- l2.setVertex1(activeRoom->at(activeRoom->size()-2));
- l2.setVertex2(activeRoom->back());
- if(l2.contains(l.getVertex2())) return false;
- }
+ 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(l2.contains(l.getVertex2())) return false;
}
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
- if(room->intersects(l))
+ if((*room)->isOfType("Room") && ((Room*)&**room)->intersects(l))
return false;
}
@@ -32,20 +30,24 @@ bool EditManager::lineOk(const Line& l) const {
EditManager::EditManager(Window *window) {
this->window = window;
- activeRoom = NULL;
+ selectedObject = NULL;
mode = VIEW;
- hoveredRoom = NULL;
+ hoveredObject = NULL;
hasHoveredVertex = false;
}
+void EditManager::update() {
+ window->update();
+}
+
void EditManager::addRoom() {
if(mode == VIEW) {
newRoom = Room();
mode = ADD;
- activeRoom = &newRoom;
+ selectedObject = &newRoom;
window->update();
}
@@ -57,11 +59,11 @@ void EditManager::finishRoom() {
if(newRoom.size() > 2 && polygonOk(newRoom)) {
newRoom.setName(idManager.generate("room"));
- window->getLevel().push_back(newRoom);
- activeRoom = &window->getLevel().back();
+ window->getLevel().push_back(SharedPtr<LevelObject>(new Room(newRoom)));
+ selectedObject = &*window->getLevel().back();
}
else {
- activeRoom = NULL;
+ selectedObject = NULL;
}
window->update();
@@ -86,18 +88,18 @@ void EditManager::setHoveredVertex(Vertex *v) {
hasHoveredVertex = true;
hoveredVertex = *v;
- hoveredRoom = NULL;
+ hoveredObject = NULL;
- for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
- if(room->contains(*v)) {
- hoveredRoom = &*room;
+ for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
+ if((*object)->hit(*v)) {
+ hoveredObject = &**object;
break;
}
}
}
else {
hasHoveredVertex = false;
- hoveredRoom = NULL;
+ hoveredObject = NULL;
}
window->update();
@@ -111,7 +113,7 @@ void EditManager::buttonPress(unsigned int button) {
switch(mode) {
case VIEW:
- activeRoom = getHoveredRoom();
+ selectedObject = hoveredObject;
break;
case ADD:
@@ -127,13 +129,13 @@ bool EditManager::vertexOk(const Vertex& v) const {
Line l;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
- if(room->contains(v)) return false;
+ if((*room)->isOfType("Room") && ((Room*)&**room)->contains(v)) return false;
}
- if(!(activeRoom && !activeRoom->empty()))
+ if(newRoom.empty())
return true;
- l.setVertex1(activeRoom->back());
+ l.setVertex1(newRoom.back());
l.setVertex2(v);
return lineOk(l);
@@ -144,7 +146,12 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
if(polygon.empty()) return false;
- for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
+ for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
+ if(!(*object)->isOfType("Room"))
+ continue;
+
+ Room *room = (Room*)&**object;
+
if(room->empty()) continue;
if(room->contains(polygon.front()))
@@ -168,7 +175,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->intersects(l))
+ if((*room)->isOfType("Room") && ((Room*)&**room)->intersects(l))
return false;
}
}