diff options
Diffstat (limited to 'EditManager.cpp')
-rw-r--r-- | EditManager.cpp | 67 |
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; } } |