2007-10-04 23:38:05 +00:00
|
|
|
#include "EditManager.h"
|
|
|
|
#include "Window.h"
|
2007-10-18 19:18:01 +00:00
|
|
|
|
|
|
|
|
2007-12-24 00:04:02 +00:00
|
|
|
bool EditManager::lineOk(const Room &newRoom, const Line &l) const {
|
2007-10-18 19:18:01 +00:00
|
|
|
Line l2;
|
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
for(size_t i = 0; i+2 < newRoom.getPolygon().size(); i++) {
|
|
|
|
l2.setVertex1(newRoom.getPolygon()[i]);
|
|
|
|
l2.setVertex2(newRoom.getPolygon()[i+1]);
|
2007-10-18 19:18:01 +00:00
|
|
|
|
2007-12-14 02:47:03 +00:00
|
|
|
if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
|
|
|
|
}
|
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
if(newRoom.getPolygon().size() > 1) {
|
|
|
|
l2.setVertex1(newRoom.getPolygon()[newRoom.getPolygon().size()-2]);
|
|
|
|
l2.setVertex2(newRoom.getPolygon().back());
|
2007-12-14 02:47:03 +00:00
|
|
|
if(l2.contains(l.getVertex2())) return false;
|
2007-10-18 19:18:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
2008-02-15 11:01:04 +00:00
|
|
|
if((*room)->isOfType("Room") && ((Room*)&**room)->getPolygon().intersects(l))
|
2007-10-18 19:18:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2007-10-04 23:38:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
EditManager::EditManager(Window *window) {
|
|
|
|
this->window = window;
|
|
|
|
|
2007-12-14 02:47:03 +00:00
|
|
|
hoveredObject = NULL;
|
2008-01-16 16:11:00 +00:00
|
|
|
highlightedObject = NULL;
|
2007-12-24 00:04:02 +00:00
|
|
|
selectedObject = NULL;
|
2007-10-18 19:18:01 +00:00
|
|
|
|
|
|
|
hasHoveredVertex = false;
|
2007-10-04 23:38:05 +00:00
|
|
|
}
|
|
|
|
|
2007-12-14 18:22:04 +00:00
|
|
|
void EditManager::redraw() {
|
|
|
|
window->redraw();
|
2007-12-14 02:47:03 +00:00
|
|
|
}
|
|
|
|
|
2007-12-24 00:04:02 +00:00
|
|
|
bool EditManager::addRoom(const Room &newRoom) {
|
2008-02-15 11:01:04 +00:00
|
|
|
if(newRoom.getPolygon().size() > 2 && polygonOk(newRoom.getPolygon())) {
|
2007-12-24 00:04:02 +00:00
|
|
|
Room *room = new Room(newRoom);
|
|
|
|
room->setName(idManager.generate("room"));
|
2007-12-05 18:34:01 +00:00
|
|
|
|
2008-02-13 21:06:01 +00:00
|
|
|
window->getLevel().addWithChildren(SharedPtr<LevelObject>(room));
|
2007-12-25 03:27:03 +00:00
|
|
|
selectedObject = room;
|
|
|
|
|
|
|
|
window->resetTool();
|
2007-12-05 18:34:01 +00:00
|
|
|
|
2007-12-24 00:04:02 +00:00
|
|
|
return true;
|
2007-10-04 23:38:05 +00:00
|
|
|
}
|
|
|
|
|
2007-12-24 00:04:02 +00:00
|
|
|
return false;
|
2007-10-04 23:38:05 +00:00
|
|
|
}
|
2007-10-18 19:18:01 +00:00
|
|
|
|
2008-01-16 16:11:00 +00:00
|
|
|
const Vertex* EditManager::getHoveredVertex() const {
|
2007-10-18 19:18:01 +00:00
|
|
|
if(hasHoveredVertex) return &hoveredVertex;
|
|
|
|
else return NULL;
|
|
|
|
}
|
|
|
|
|
2008-02-13 21:06:01 +00:00
|
|
|
void EditManager::setHoveredVertex(const Vertex *v, float scale) {
|
2007-10-18 19:18:01 +00:00
|
|
|
if(v) {
|
|
|
|
hasHoveredVertex = true;
|
|
|
|
hoveredVertex = *v;
|
|
|
|
|
2007-12-14 02:47:03 +00:00
|
|
|
hoveredObject = NULL;
|
2007-10-18 19:18:01 +00:00
|
|
|
|
2007-12-14 02:47:03 +00:00
|
|
|
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
|
2008-02-13 21:06:01 +00:00
|
|
|
if((*object)->hit(*v, scale)) {
|
2007-12-14 18:22:04 +00:00
|
|
|
if(hoveredObject && (*object)->getPriority() < hoveredObject->getPriority())
|
|
|
|
continue;
|
|
|
|
|
2007-12-14 02:47:03 +00:00
|
|
|
hoveredObject = &**object;
|
2007-10-18 19:18:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
hasHoveredVertex = false;
|
2007-12-14 02:47:03 +00:00
|
|
|
hoveredObject = NULL;
|
2007-10-18 19:18:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
window->update();
|
|
|
|
}
|
|
|
|
|
2007-12-25 03:27:03 +00:00
|
|
|
bool EditManager::vertexOk(const Vertex &v, const Room *newRoom) const {
|
2007-10-18 19:18:01 +00:00
|
|
|
Line l;
|
|
|
|
|
|
|
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
2008-02-15 11:01:04 +00:00
|
|
|
if((*room)->isOfType("Room") && ((Room*)&**room)->getPolygon().contains(v)) return false;
|
2007-10-18 19:18:01 +00:00
|
|
|
}
|
|
|
|
|
2007-12-25 03:27:03 +00:00
|
|
|
if(!newRoom)
|
|
|
|
return true;
|
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
if(newRoom->getPolygon().empty())
|
2007-10-18 19:18:01 +00:00
|
|
|
return true;
|
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
l.setVertex1(newRoom->getPolygon().back());
|
2007-10-18 19:18:01 +00:00
|
|
|
l.setVertex2(v);
|
|
|
|
|
2007-12-25 03:27:03 +00:00
|
|
|
return lineOk(*newRoom, l);
|
2007-10-18 19:18:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool EditManager::polygonOk(const Polygon& polygon) const {
|
|
|
|
Line l, l2;
|
|
|
|
|
|
|
|
if(polygon.empty()) return false;
|
|
|
|
|
2007-12-14 02:47:03 +00:00
|
|
|
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
|
|
|
|
if(!(*object)->isOfType("Room"))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
Room *room = (Room*)&**object;
|
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
if(room->getPolygon().empty()) continue;
|
2007-10-18 19:18:01 +00:00
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
if(room->getPolygon().contains(polygon.front()))
|
2007-10-18 19:18:01 +00:00
|
|
|
return false;
|
|
|
|
|
2008-02-15 11:01:04 +00:00
|
|
|
if(polygon.contains(room->getPolygon().front()))
|
2007-10-18 19:18:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(polygon.size() == 1)
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if(!polygon.isSimple())
|
|
|
|
return false;
|
|
|
|
|
|
|
|
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 = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
2008-02-15 11:01:04 +00:00
|
|
|
if((*room)->isOfType("Room") && ((Room*)&**room)->getPolygon().intersects(l))
|
2007-10-18 19:18:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|