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
2007-09-16 20:59:04 +00:00

175 lines
3.6 KiB
C++

#include "edit.h"
#include "level.h"
#include "geometry.h"
static int editMode = EDIT_MODE_VIEW;
static ROOM *activeRoom = NULL;
static ROOM *hoveredRoom = NULL;
static Vertex hoveredVertex;
static int hasHoveredVertex = 0;
int getEditMode() {
return editMode;
}
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) {
int i;
LEVEL *l;
if(v) {
hasHoveredVertex = 1;
hoveredVertex = *v;
l = getLevel();
hoveredRoom = NULL;
for(i = 0; i < l->nRooms; i++) {
if(l->rooms[i].polygon.contains(*v)) {
hoveredRoom = &l->rooms[i];
break;
}
}
}
else {
hasHoveredVertex = 0;
hoveredRoom = NULL;
}
}
void startAddMode() {
activeRoom = (ROOM*)calloc(1, sizeof(ROOM));
activeRoom->polygon = Polygon();
activeRoom->name = (char*)calloc(1, sizeof(unsigned char));
editMode = EDIT_MODE_ADD;
}
void endAddMode() {
editMode = activeRoom ? EDIT_MODE_SELECTED : EDIT_MODE_VIEW;
}
ROOM *getHoveredRoom() {
return hoveredRoom;
}
static bool isLineOk(Line *l) {
LEVEL *lvl = getLevel();
Line l2;
if(activeRoom) {
for(int i = 0; i+2 < activeRoom->polygon.size(); i++) {
l2.setVertex1(activeRoom->polygon[i]);
l2.setVertex2(activeRoom->polygon[i+1]);
if(l->intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
}
if(activeRoom->polygon.size() > 1) {
l2.setVertex1(activeRoom->polygon[activeRoom->polygon.size()-2]);
l2.setVertex2(activeRoom->polygon.back());
if(l2.contains(l->getVertex2())) return false;
}
}
for(int i = 0; i < lvl->nRooms; i++) {
if(lvl->rooms[i].polygon.intersects(*l))
return false;
}
return true;
}
bool isVertexOk(Vertex *v) {
LEVEL *lvl = getLevel();
Line l;
int i;
for(i = 0; i < lvl->nRooms; i++) {
if(lvl->rooms[i].polygon.contains(*v)) return false;
}
if(!(getActiveRoom() && !getActiveRoom()->polygon.empty()))
return true;
l.setVertex1(getActiveRoom()->polygon.back());
l.setVertex2(*v);
return isLineOk(&l);
}
bool isPolygonOk(Polygon *polygon) {
LEVEL *lvl = getLevel();
Line l, l2;
if(polygon->empty()) return false;
for(int i = 0; i < lvl->nRooms; i++) {
if(lvl->rooms[i].polygon.empty()) continue;
if(lvl->rooms[i].polygon.contains(polygon->front()));
return false;
if(polygon->contains(lvl->rooms[i].polygon.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(int i = 0; i < lvl->nRooms; i++) {
if(lvl->rooms[i].polygon.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;
}