#include "Level.h" #include "edit.h" #include "geometry.h" static int editMode = EDIT_MODE_VIEW; static Level *level = NULL; static Room *activeRoom = NULL; static Room *hoveredRoom = NULL; static Room addRoom; static Vertex hoveredVertex; static int hasHoveredVertex = 0; int getEditMode() { return editMode; } Level *getLevel() { return level; } void setLevel(Level *l) { level = l; } Room *getActiveRoom() { return activeRoom; } void setActiveRoom(Room *room) { activeRoom = room; if(room == NULL) { editMode = EDIT_MODE_VIEW; } else if(editMode == EDIT_MODE_VIEW) { editMode = EDIT_MODE_SELECTED; } } Vertex *getHoveredVertex() { if(hasHoveredVertex) return &hoveredVertex; else return NULL; } void setHoveredVertex(Vertex *v) { if(v) { hasHoveredVertex = 1; hoveredVertex = *v; hoveredRoom = NULL; for(Level::iterator room = level->begin(); room != level->end(); room++) { if(room->contains(*v)) { hoveredRoom = &*room; break; } } } else { hasHoveredVertex = 0; hoveredRoom = NULL; } } void startAddMode() { addRoom = Room(); activeRoom = &addRoom; editMode = EDIT_MODE_ADD; } void endAddMode() { editMode = activeRoom ? EDIT_MODE_SELECTED : EDIT_MODE_VIEW; } Room *getHoveredRoom() { return hoveredRoom; } static bool isLineOk(Line *l) { Line l2; if(activeRoom) { for(int 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; } if(activeRoom->size() > 1) { l2.setVertex1(activeRoom->at(activeRoom->size()-2)); l2.setVertex2(activeRoom->back()); if(l2.contains(l->getVertex2())) return false; } } for(Level::iterator room = level->begin(); room != level->end(); room++) { if(room->intersects(*l)) return false; } return true; } bool isVertexOk(Vertex *v) { Line l; for(Level::iterator room = level->begin(); room != level->end(); room++) { if(room->contains(*v)) return false; } if(!(getActiveRoom() && !getActiveRoom()->empty())) return true; l.setVertex1(getActiveRoom()->back()); l.setVertex2(*v); return isLineOk(&l); } bool isPolygonOk(Polygon *polygon) { Line l, l2; if(polygon->empty()) return false; for(Level::iterator room = level->begin(); room != level->end(); room++) { if(room->empty()) continue; if(room->contains(polygon->front())) return false; if(polygon->contains(room->front())) return false; } if(polygon->size() == 1) return true; for(Polygon::const_iterator it = polygon->begin(); it != polygon->end(); it++) { Polygon::const_iterator it2 = it+1; if(it2 == polygon->end()) it2 = polygon->begin(); l.setVertex1(*it); l.setVertex2(*it2); for(Level::iterator room = level->begin(); room != level->end(); room++) { if(room->intersects(l)) return false; } if(it2 != polygon->begin()) { for(Polygon::const_iterator it3 = it2+1; it3 != polygon->end(); it3++) { Polygon::const_iterator it4 = it3+1; if(it4 == polygon->end()) it4 = polygon->begin(); if(it == polygon->begin() && it4 == polygon->begin()) continue; l2.setVertex1(*it3); l2.setVertex2(*it4); if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false; } } } return true; }