This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
neofx-zoomedit/edit.cpp

165 lines
3.1 KiB
C++
Raw Normal View History

#include "Level.h"
#include "edit.h"
static int editMode = EDIT_MODE_VIEW;
static Level *level = NULL;
static Room *activeRoom = NULL;
static Room *hoveredRoom = NULL;
static Room addRoom;
2007-09-16 14:07:03 +00:00
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;
}
}
2007-09-16 14:07:03 +00:00
Vertex *getHoveredVertex() {
if(hasHoveredVertex) return &hoveredVertex;
else return NULL;
}
2007-09-16 14:07:03 +00:00
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;
2007-09-16 19:06:02 +00:00
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;
}
2007-09-16 20:59:04 +00:00
static bool isLineOk(Line *l) {
Line l2;
if(activeRoom) {
2007-09-27 08:27:04 +00:00
for(size_t i = 0; i+2 < activeRoom->size(); i++) {
l2.setVertex1(activeRoom->at(i));
l2.setVertex2(activeRoom->at(i+1));
2007-09-16 20:59:04 +00:00
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());
2007-09-16 20:59:04 +00:00
if(l2.contains(l->getVertex2())) return false;
}
}
for(Level::iterator room = level->begin(); room != level->end(); room++) {
if(room->intersects(*l))
2007-09-16 19:06:02 +00:00
return false;
}
2007-09-16 19:06:02 +00:00
return true;
}
2007-09-16 19:06:02 +00:00
bool isVertexOk(Vertex *v) {
2007-09-16 20:59:04 +00:00
Line l;
2007-09-16 19:06:02 +00:00
for(Level::iterator room = level->begin(); room != level->end(); room++) {
if(room->contains(*v)) return false;
}
if(!(getActiveRoom() && !getActiveRoom()->empty()))
2007-09-16 19:06:02 +00:00
return true;
l.setVertex1(getActiveRoom()->back());
2007-09-16 20:59:04 +00:00
l.setVertex2(*v);
2007-09-16 19:06:02 +00:00
return isLineOk(&l);
}
2007-09-16 19:06:02 +00:00
bool isPolygonOk(Polygon *polygon) {
2007-09-16 20:59:04 +00:00
Line l, l2;
2007-09-16 19:06:02 +00:00
if(polygon->empty()) return false;
for(Level::iterator room = level->begin(); room != level->end(); room++) {
if(room->empty()) continue;
if(room->contains(polygon->front()))
2007-09-16 19:06:02 +00:00
return false;
if(polygon->contains(room->front()))
2007-09-16 19:06:02 +00:00
return false;
}
2007-09-16 19:06:02 +00:00
if(polygon->size() == 1)
return true;
if(!polygon->isSimple())
return false;
2007-09-16 19:06:02 +00:00
for(Polygon::const_iterator it = polygon->begin(); it != polygon->end(); it++) {
Polygon::const_iterator it2 = it+1;
if(it2 == polygon->end()) it2 = polygon->begin();
2007-09-16 20:59:04 +00:00
l.setVertex1(*it);
l.setVertex2(*it2);
for(Level::iterator room = level->begin(); room != level->end(); room++) {
if(room->intersects(l))
2007-09-16 19:06:02 +00:00
return false;
}
}
2007-09-16 19:06:02 +00:00
return true;
}