zoomedit: edit.c in den EditManager integriert
This commit is contained in:
parent
b660b965bc
commit
2bc9bb15dc
13 changed files with 227 additions and 316 deletions
44
Drawer.cpp
44
Drawer.cpp
|
@ -1,7 +1,6 @@
|
||||||
#include "Drawer.h"
|
#include "Drawer.h"
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
#include "edit.h"
|
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
@ -34,7 +33,7 @@ gboolean Drawer::eventHandler(GtkWidget *widget, GdkEvent *event, Drawer *drawer
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_EXPOSE:
|
case GDK_EXPOSE:
|
||||||
drawTopView(widget, &event->expose, NULL);
|
drawTopView(widget, &event->expose, &drawer->window->getLevel(), &drawer->window->getEditManager());
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_MOTION_NOTIFY:
|
case GDK_MOTION_NOTIFY:
|
||||||
|
@ -46,32 +45,11 @@ gboolean Drawer::eventHandler(GtkWidget *widget, GdkEvent *event, Drawer *drawer
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_LEAVE_NOTIFY:
|
case GDK_LEAVE_NOTIFY:
|
||||||
setHoveredVertex(NULL);
|
drawer->window->getEditManager().setHoveredVertex(NULL);
|
||||||
drawer->window->update();
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_BUTTON_PRESS:
|
case GDK_BUTTON_PRESS:
|
||||||
switch(event->button.button) {
|
drawer->window->getEditManager().buttonPress(event->button.button);
|
||||||
case 1:
|
|
||||||
if(!getHoveredVertex())
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch(drawer->window->getEditManager().getMode()) {
|
|
||||||
case EditManager::VIEW:
|
|
||||||
setActiveRoom(getHoveredRoom());
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EditManager::ADD:
|
|
||||||
if(isVertexOk(getHoveredVertex()))
|
|
||||||
drawer->window->getEditManager().addVertex(*getHoveredVertex());
|
|
||||||
}
|
|
||||||
|
|
||||||
drawer->window->update();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_SCROLL:
|
case GDK_SCROLL:
|
||||||
|
@ -118,13 +96,13 @@ void Drawer::updateViewport() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrolling() {
|
void Drawer::updateScrolling() {
|
||||||
if(getImageWidth() < getWidth())
|
if(getImageWidth(&window->getLevel()) < getWidth())
|
||||||
setXTranslate((getImageWidth()-getWidth())/2);
|
setXTranslate((getImageWidth(&window->getLevel())-getWidth())/2);
|
||||||
else
|
else
|
||||||
setXTranslate(gtk_adjustment_get_value(hAdjustment));
|
setXTranslate(gtk_adjustment_get_value(hAdjustment));
|
||||||
|
|
||||||
if(getImageHeight() < getHeight())
|
if(getImageHeight(&window->getLevel()) < getHeight())
|
||||||
setYTranslate((getImageHeight()-getHeight())/2);
|
setYTranslate((getImageHeight(&window->getLevel())-getHeight())/2);
|
||||||
else
|
else
|
||||||
setYTranslate(gtk_adjustment_get_value(vAdjustment));
|
setYTranslate(gtk_adjustment_get_value(vAdjustment));
|
||||||
|
|
||||||
|
@ -132,7 +110,7 @@ void Drawer::updateScrolling() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrollbars(float x, float y) {
|
void Drawer::updateScrollbars(float x, float y) {
|
||||||
const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight();
|
const gdouble imageWidth = getImageWidth(&window->getLevel()), imageHeight = getImageHeight(&window->getLevel());
|
||||||
const gdouble width = getWidth(), height = getHeight();
|
const gdouble width = getWidth(), height = getHeight();
|
||||||
gdouble upper, pageSize, value;
|
gdouble upper, pageSize, value;
|
||||||
|
|
||||||
|
@ -165,10 +143,8 @@ void Drawer::updateScrollbars(float x, float y) {
|
||||||
|
|
||||||
void Drawer::updateHoveredPoint(float x, float y) {
|
void Drawer::updateHoveredPoint(float x, float y) {
|
||||||
Vertex v(x, y);
|
Vertex v(x, y);
|
||||||
viewToImage(&v);
|
viewToImage(&window->getLevel(), &v);
|
||||||
setHoveredVertex(&v);
|
window->getEditManager().setHoveredVertex(&v);
|
||||||
|
|
||||||
window->update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawer::Drawer(Window *window, GdkGLConfig *glconfig) {
|
Drawer::Drawer(Window *window, GdkGLConfig *glconfig) {
|
||||||
|
|
149
EditManager.cpp
149
EditManager.cpp
|
@ -1,19 +1,50 @@
|
||||||
#include "EditManager.h"
|
#include "EditManager.h"
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include "edit.h"
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
|
if(room->intersects(l))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
EditManager::EditManager(Window *window) {
|
EditManager::EditManager(Window *window) {
|
||||||
this->window = window;
|
this->window = window;
|
||||||
|
|
||||||
|
activeRoom = NULL;
|
||||||
mode = VIEW;
|
mode = VIEW;
|
||||||
|
|
||||||
|
hoveredRoom = NULL;
|
||||||
|
|
||||||
|
hasHoveredVertex = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditManager::addRoom() {
|
void EditManager::addRoom() {
|
||||||
//newRoom = Room();
|
newRoom = Room(idManager.generate("room"));
|
||||||
mode = ADD;
|
mode = ADD;
|
||||||
|
|
||||||
startAddMode();
|
activeRoom = &newRoom;
|
||||||
|
|
||||||
window->update();
|
window->update();
|
||||||
}
|
}
|
||||||
|
@ -21,20 +52,118 @@ void EditManager::addRoom() {
|
||||||
void EditManager::finishRoom() {
|
void EditManager::finishRoom() {
|
||||||
mode = VIEW;
|
mode = VIEW;
|
||||||
|
|
||||||
if(getActiveRoom() && getActiveRoom()->size() > 2 && isPolygonOk(getActiveRoom())) {
|
if(newRoom.size() > 2 && polygonOk(newRoom)) {
|
||||||
getLevel()->push_back(*getActiveRoom());
|
window->getLevel().push_back(newRoom);
|
||||||
setActiveRoom(&getLevel()->back());
|
activeRoom = &window->getLevel().back();
|
||||||
|
|
||||||
endAddMode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window->update();
|
window->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EditManager::addVertex(const Vertex &v) {
|
void EditManager::addVertex(const Vertex &v) {
|
||||||
if(mode != ADD || !getActiveRoom())
|
if(mode != ADD || !activeRoom)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
getActiveRoom()->push_back(v);
|
activeRoom->push_back(v);
|
||||||
window->update();
|
window->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vertex* EditManager::getHoveredVertex() {
|
||||||
|
if(hasHoveredVertex) return &hoveredVertex;
|
||||||
|
else return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditManager::setHoveredVertex(Vertex *v) {
|
||||||
|
if(v) {
|
||||||
|
hasHoveredVertex = true;
|
||||||
|
hoveredVertex = *v;
|
||||||
|
|
||||||
|
hoveredRoom = NULL;
|
||||||
|
|
||||||
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
|
if(room->contains(*v)) {
|
||||||
|
hoveredRoom = &*room;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hasHoveredVertex = false;
|
||||||
|
hoveredRoom = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
window->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EditManager::buttonPress(unsigned int button) {
|
||||||
|
switch(button) {
|
||||||
|
case 1:
|
||||||
|
if(!hasHoveredVertex)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch(mode) {
|
||||||
|
case VIEW:
|
||||||
|
activeRoom = getHoveredRoom();;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ADD:
|
||||||
|
if(vertexOk(hoveredVertex))
|
||||||
|
addVertex(hoveredVertex);
|
||||||
|
}
|
||||||
|
|
||||||
|
window->update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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(!(activeRoom && !activeRoom->empty()))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
l.setVertex1(activeRoom->back());
|
||||||
|
l.setVertex2(v);
|
||||||
|
|
||||||
|
return lineOk(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EditManager::polygonOk(const Polygon& polygon) const {
|
||||||
|
Line l, l2;
|
||||||
|
|
||||||
|
if(polygon.empty()) return false;
|
||||||
|
|
||||||
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().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;
|
||||||
|
|
||||||
|
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++) {
|
||||||
|
if(room->intersects(l))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define EDITMANAGER_H_
|
#define EDITMANAGER_H_
|
||||||
|
|
||||||
#include "Room.h"
|
#include "Room.h"
|
||||||
|
#include "IdManager.h"
|
||||||
|
|
||||||
|
|
||||||
class Window;
|
class Window;
|
||||||
|
@ -16,9 +17,19 @@ class EditManager {
|
||||||
private:
|
private:
|
||||||
Mode mode;
|
Mode mode;
|
||||||
|
|
||||||
|
IdManager idManager;
|
||||||
|
|
||||||
Window *window;
|
Window *window;
|
||||||
|
|
||||||
//Room newRoom;
|
Room newRoom;
|
||||||
|
Room *activeRoom;
|
||||||
|
|
||||||
|
Room *hoveredRoom;
|
||||||
|
|
||||||
|
Vertex hoveredVertex;
|
||||||
|
bool hasHoveredVertex;
|
||||||
|
|
||||||
|
bool lineOk(const Line& l) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EditManager(Window *window);
|
EditManager(Window *window);
|
||||||
|
@ -28,9 +39,25 @@ class EditManager {
|
||||||
|
|
||||||
void addVertex(const Vertex &v);
|
void addVertex(const Vertex &v);
|
||||||
|
|
||||||
Mode getMode() {
|
Mode getMode() const {
|
||||||
return mode;
|
return mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Room* getActiveRoom() {
|
||||||
|
return activeRoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
Room* getHoveredRoom() {
|
||||||
|
return hoveredRoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vertex* getHoveredVertex();
|
||||||
|
void setHoveredVertex(Vertex *v);
|
||||||
|
|
||||||
|
void buttonPress(unsigned int button);
|
||||||
|
|
||||||
|
bool vertexOk(const Vertex& v) const;
|
||||||
|
bool polygonOk(const Polygon& polygon) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*EDITMANAGER_H_*/
|
#endif /*EDITMANAGER_H_*/
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
bin_PROGRAMS = zoomedit
|
bin_PROGRAMS = zoomedit
|
||||||
zoomedit_SOURCES = zoomedit.cpp ui.cpp draw.cpp edit.cpp Vertex.cpp \
|
zoomedit_SOURCES = zoomedit.cpp ui.cpp draw.cpp Vertex.cpp \
|
||||||
Line.cpp Polygon.cpp Rectangle.cpp Room.cpp Triangle.cpp \
|
Line.cpp Polygon.cpp Rectangle.cpp Room.cpp Triangle.cpp \
|
||||||
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
|
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
|
||||||
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
||||||
|
|
26
Makefile.in
26
Makefile.in
|
@ -50,11 +50,10 @@ binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
|
||||||
PROGRAMS = $(bin_PROGRAMS)
|
PROGRAMS = $(bin_PROGRAMS)
|
||||||
am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
|
am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
|
||||||
zoomedit-ui.$(OBJEXT) zoomedit-draw.$(OBJEXT) \
|
zoomedit-ui.$(OBJEXT) zoomedit-draw.$(OBJEXT) \
|
||||||
zoomedit-edit.$(OBJEXT) zoomedit-Vertex.$(OBJEXT) \
|
zoomedit-Vertex.$(OBJEXT) zoomedit-Line.$(OBJEXT) \
|
||||||
zoomedit-Line.$(OBJEXT) zoomedit-Polygon.$(OBJEXT) \
|
zoomedit-Polygon.$(OBJEXT) zoomedit-Rectangle.$(OBJEXT) \
|
||||||
zoomedit-Rectangle.$(OBJEXT) zoomedit-Room.$(OBJEXT) \
|
zoomedit-Room.$(OBJEXT) zoomedit-Triangle.$(OBJEXT) \
|
||||||
zoomedit-Triangle.$(OBJEXT) zoomedit-IdManager.$(OBJEXT) \
|
zoomedit-IdManager.$(OBJEXT) zoomedit-WindowManager.$(OBJEXT) \
|
||||||
zoomedit-WindowManager.$(OBJEXT) \
|
|
||||||
zoomedit-SidebarManager.$(OBJEXT) zoomedit-Window.$(OBJEXT) \
|
zoomedit-SidebarManager.$(OBJEXT) zoomedit-Window.$(OBJEXT) \
|
||||||
zoomedit-SidebarView.$(OBJEXT) zoomedit-SidebarAdd.$(OBJEXT) \
|
zoomedit-SidebarView.$(OBJEXT) zoomedit-SidebarAdd.$(OBJEXT) \
|
||||||
zoomedit-Drawer.$(OBJEXT) zoomedit-EditManager.$(OBJEXT)
|
zoomedit-Drawer.$(OBJEXT) zoomedit-EditManager.$(OBJEXT)
|
||||||
|
@ -177,7 +176,7 @@ sysconfdir = @sysconfdir@
|
||||||
target_alias = @target_alias@
|
target_alias = @target_alias@
|
||||||
top_builddir = @top_builddir@
|
top_builddir = @top_builddir@
|
||||||
top_srcdir = @top_srcdir@
|
top_srcdir = @top_srcdir@
|
||||||
zoomedit_SOURCES = zoomedit.cpp ui.cpp draw.cpp edit.cpp Vertex.cpp \
|
zoomedit_SOURCES = zoomedit.cpp ui.cpp draw.cpp Vertex.cpp \
|
||||||
Line.cpp Polygon.cpp Rectangle.cpp Room.cpp Triangle.cpp \
|
Line.cpp Polygon.cpp Rectangle.cpp Room.cpp Triangle.cpp \
|
||||||
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
|
IdManager.cpp WindowManager.cpp SidebarManager.cpp \
|
||||||
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
Window.cpp SidebarView.cpp SidebarAdd.cpp Drawer.cpp \
|
||||||
|
@ -288,7 +287,6 @@ distclean-compile:
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Window.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Window.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-WindowManager.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-WindowManager.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-draw.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-draw.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-edit.Po@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ui.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-ui.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-zoomedit.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-zoomedit.Po@am__quote@
|
||||||
|
|
||||||
|
@ -348,20 +346,6 @@ zoomedit-draw.obj: draw.cpp
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||||
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-draw.obj `if test -f 'draw.cpp'; then $(CYGPATH_W) 'draw.cpp'; else $(CYGPATH_W) '$(srcdir)/draw.cpp'; fi`
|
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-draw.obj `if test -f 'draw.cpp'; then $(CYGPATH_W) 'draw.cpp'; else $(CYGPATH_W) '$(srcdir)/draw.cpp'; fi`
|
||||||
|
|
||||||
zoomedit-edit.o: edit.cpp
|
|
||||||
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-edit.o -MD -MP -MF $(DEPDIR)/zoomedit-edit.Tpo -c -o zoomedit-edit.o `test -f 'edit.cpp' || echo '$(srcdir)/'`edit.cpp
|
|
||||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-edit.Tpo $(DEPDIR)/zoomedit-edit.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='edit.cpp' object='zoomedit-edit.o' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-edit.o `test -f 'edit.cpp' || echo '$(srcdir)/'`edit.cpp
|
|
||||||
|
|
||||||
zoomedit-edit.obj: edit.cpp
|
|
||||||
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-edit.obj -MD -MP -MF $(DEPDIR)/zoomedit-edit.Tpo -c -o zoomedit-edit.obj `if test -f 'edit.cpp'; then $(CYGPATH_W) 'edit.cpp'; else $(CYGPATH_W) '$(srcdir)/edit.cpp'; fi`
|
|
||||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-edit.Tpo $(DEPDIR)/zoomedit-edit.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='edit.cpp' object='zoomedit-edit.obj' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-edit.obj `if test -f 'edit.cpp'; then $(CYGPATH_W) 'edit.cpp'; else $(CYGPATH_W) '$(srcdir)/edit.cpp'; fi`
|
|
||||||
|
|
||||||
zoomedit-Vertex.o: Vertex.cpp
|
zoomedit-Vertex.o: Vertex.cpp
|
||||||
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Vertex.o -MD -MP -MF $(DEPDIR)/zoomedit-Vertex.Tpo -c -o zoomedit-Vertex.o `test -f 'Vertex.cpp' || echo '$(srcdir)/'`Vertex.cpp
|
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Vertex.o -MD -MP -MF $(DEPDIR)/zoomedit-Vertex.Tpo -c -o zoomedit-Vertex.o `test -f 'Vertex.cpp' || echo '$(srcdir)/'`Vertex.cpp
|
||||||
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Vertex.Tpo $(DEPDIR)/zoomedit-Vertex.Po
|
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Vertex.Tpo $(DEPDIR)/zoomedit-Vertex.Po
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "SidebarAdd.h"
|
#include "SidebarAdd.h"
|
||||||
#include "edit.h"
|
|
||||||
|
|
||||||
|
|
||||||
void SidebarAdd::buttonClicked(GtkButton *button, SidebarAdd *sidebar) {
|
void SidebarAdd::buttonClicked(GtkButton *button, SidebarAdd *sidebar) {
|
||||||
|
@ -33,10 +32,10 @@ GtkWidget* SidebarAdd::getWidget() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SidebarAdd::update() {
|
void SidebarAdd::update() {
|
||||||
if(!getActiveRoom())
|
if(!editor->getActiveRoom())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(getActiveRoom()->size() > 2 && isPolygonOk(getActiveRoom()))
|
if(editor->getActiveRoom()->size() > 2 && editor->polygonOk(*editor->getActiveRoom()))
|
||||||
gtk_widget_set_sensitive(buttonAdd, TRUE);
|
gtk_widget_set_sensitive(buttonAdd, TRUE);
|
||||||
else
|
else
|
||||||
gtk_widget_set_sensitive(buttonAdd, FALSE);
|
gtk_widget_set_sensitive(buttonAdd, FALSE);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "SidebarView.h"
|
#include "SidebarView.h"
|
||||||
#include "edit.h"
|
|
||||||
|
|
||||||
|
|
||||||
void SidebarView::buttonClicked(GtkButton *button, SidebarView *sidebar) {
|
void SidebarView::buttonClicked(GtkButton *button, SidebarView *sidebar) {
|
||||||
|
@ -66,15 +65,15 @@ GtkWidget* SidebarView::getWidget() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SidebarView::update() {
|
void SidebarView::update() {
|
||||||
if(getActiveRoom()) {
|
if(editor->getActiveRoom()) {
|
||||||
gtk_entry_set_text(GTK_ENTRY(entryName), getActiveRoom()->getName().c_str());
|
gtk_entry_set_text(GTK_ENTRY(entryName), editor->getActiveRoom()->getName().c_str());
|
||||||
gtk_widget_set_sensitive(entryName, TRUE);
|
gtk_widget_set_sensitive(entryName, TRUE);
|
||||||
|
|
||||||
gchar *string = g_strdup_printf("%.2f", getActiveRoom()->area());
|
gchar *string = g_strdup_printf("%.2f", editor->getActiveRoom()->area());
|
||||||
gtk_label_set_text(GTK_LABEL(labelArea), string);
|
gtk_label_set_text(GTK_LABEL(labelArea), string);
|
||||||
g_free(string);
|
g_free(string);
|
||||||
|
|
||||||
string = g_strdup_printf("%.2f", getActiveRoom()->perimeter());
|
string = g_strdup_printf("%.2f", editor->getActiveRoom()->perimeter());
|
||||||
gtk_label_set_text(GTK_LABEL(labelPerimeter), string);
|
gtk_label_set_text(GTK_LABEL(labelPerimeter), string);
|
||||||
g_free(string);
|
g_free(string);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include "WindowManager.h"
|
#include "WindowManager.h"
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "edit.h"
|
|
||||||
|
|
||||||
|
|
||||||
gboolean Window::deleteEvent(GtkWidget *widget, GdkEvent *event, Window *window) {
|
gboolean Window::deleteEvent(GtkWidget *widget, GdkEvent *event, Window *window) {
|
||||||
|
@ -16,7 +15,6 @@ Window::Window(GdkGLConfig *glconfig, WindowManager *manager)
|
||||||
: editor(this), drawer(this, glconfig), sidebar(&editor)
|
: editor(this), drawer(this, glconfig), sidebar(&editor)
|
||||||
{
|
{
|
||||||
this->manager = manager;
|
this->manager = manager;
|
||||||
setLevel(&level);
|
|
||||||
|
|
||||||
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
|
gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
|
||||||
|
|
61
draw.cpp
61
draw.cpp
|
@ -1,5 +1,4 @@
|
||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
#include "edit.h"
|
|
||||||
#include "Rectangle.h"
|
#include "Rectangle.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
@ -97,17 +96,17 @@ static void drawPolygon(const Polygon &polygon, bool close) {
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
|
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, EditManager *editor) {
|
||||||
GdkGLContext *context = gtk_widget_get_gl_context(widget);
|
GdkGLContext *context = gtk_widget_get_gl_context(widget);
|
||||||
GdkGLDrawable *drawable = gtk_widget_get_gl_drawable(widget);
|
GdkGLDrawable *drawable = gtk_widget_get_gl_drawable(widget);
|
||||||
Vertex v1(0, 0), v2(widget->allocation.width, widget->allocation.height);
|
Vertex v1(0, 0), v2(widget->allocation.width, widget->allocation.height);
|
||||||
Rectangle rect;
|
Rectangle rect;
|
||||||
|
|
||||||
|
|
||||||
if(getLevel() == NULL) return FALSE;
|
if(level == NULL) return FALSE;
|
||||||
|
|
||||||
viewToImage(&v1);
|
viewToImage(level, &v1);
|
||||||
viewToImage(&v2);
|
viewToImage(level, &v2);
|
||||||
|
|
||||||
rect.setVertex1(v1);
|
rect.setVertex1(v1);
|
||||||
rect.setVertex2(v2);
|
rect.setVertex2(v2);
|
||||||
|
@ -122,26 +121,26 @@ gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
|
||||||
|
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
|
|
||||||
glTranslatef(getImageWidth()/2-xTranslate, getImageHeight()/2-yTranslate, 0);
|
glTranslatef(getImageWidth(level)/2-xTranslate, getImageHeight(level)/2-yTranslate, 0);
|
||||||
glScalef(scale, scale, 1);
|
glScalef(scale, scale, 1);
|
||||||
|
|
||||||
drawGrid(rect);
|
drawGrid(rect);
|
||||||
|
|
||||||
for(Level::const_iterator room = getLevel()->begin(); room != getLevel()->end(); room++) {
|
for(Level::const_iterator room = level->begin(); room != level->end(); room++) {
|
||||||
if(&*room == getActiveRoom() && getEditMode() == EDIT_MODE_ADD) continue;
|
if(&*room == editor->getActiveRoom() && editor->getMode() == EditManager::ADD) continue;
|
||||||
|
|
||||||
if(&*room == getActiveRoom())
|
if(&*room == editor->getActiveRoom())
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
||||||
else
|
else
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
|
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
|
||||||
|
|
||||||
fillPolygon(*room);
|
fillPolygon(*room);
|
||||||
|
|
||||||
if(&*room == getActiveRoom()) {
|
if(&*room == editor->getActiveRoom()) {
|
||||||
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
|
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
}
|
}
|
||||||
else if(&*room == getHoveredRoom() && getEditMode() != EDIT_MODE_ADD) {
|
else if(&*room == editor->getHoveredRoom() && editor->getMode() == EditManager::VIEW) {
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
}
|
}
|
||||||
|
@ -153,26 +152,26 @@ gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
|
||||||
drawPolygon(*room, true);
|
drawPolygon(*room, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(getEditMode() == EDIT_MODE_ADD) {
|
if(editor->getMode() == EditManager::ADD) {
|
||||||
if(isPolygonOk(getActiveRoom()))
|
if(editor->polygonOk(*editor->getActiveRoom()))
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
|
||||||
else
|
else
|
||||||
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
glColor4f(1.0f, 0.3f, 0.3f, 0.2f);
|
||||||
|
|
||||||
fillPolygon(*getActiveRoom());
|
fillPolygon(*editor->getActiveRoom());
|
||||||
|
|
||||||
glLineWidth(2.0f);
|
glLineWidth(2.0f);
|
||||||
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
|
||||||
drawPolygon(*getActiveRoom(), false);
|
drawPolygon(*editor->getActiveRoom(), false);
|
||||||
|
|
||||||
if(!getActiveRoom()->empty() && getHoveredVertex()) {
|
if(!editor->getActiveRoom()->empty() && editor->getHoveredVertex()) {
|
||||||
if(!isVertexOk(getHoveredVertex()))
|
if(!editor->vertexOk(*editor->getHoveredVertex()))
|
||||||
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
glColor4f(1.0f, 0.3f, 0.3f, 0.7f);
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
|
|
||||||
glVertex2d(getActiveRoom()->back().getX(), getActiveRoom()->back().getY());
|
glVertex2d(editor->getActiveRoom()->back().getX(), editor->getActiveRoom()->back().getY());
|
||||||
glVertex2d(getHoveredVertex()->getX(), getHoveredVertex()->getY());
|
glVertex2d(editor->getHoveredVertex()->getX(), editor->getHoveredVertex()->getY());
|
||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
@ -196,22 +195,22 @@ void setScale(float s) {
|
||||||
scale = s;
|
scale = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void imageToView(Vertex *v) {
|
void imageToView(Level *level, Vertex *v) {
|
||||||
v->setX(v->getX()*scale+getImageWidth()/2-xTranslate);
|
v->setX(v->getX()*scale+getImageWidth(level)/2-xTranslate);
|
||||||
v->setY(v->getY()*scale+getImageHeight()/2-yTranslate);
|
v->setY(v->getY()*scale+getImageHeight(level)/2-yTranslate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void viewToImage(Vertex *v) {
|
void viewToImage(Level *level, Vertex *v) {
|
||||||
v->setX((v->getX()-getImageWidth()/2+xTranslate)/scale);
|
v->setX((v->getX()-getImageWidth(level)/2+xTranslate)/scale);
|
||||||
v->setY((v->getY()-getImageHeight()/2+yTranslate)/scale);
|
v->setY((v->getY()-getImageHeight(level)/2+yTranslate)/scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
float getImageWidth() {
|
float getImageWidth(Level *level) {
|
||||||
float min = 0.0, max = 0.0;
|
float min = 0.0, max = 0.0;
|
||||||
|
|
||||||
|
|
||||||
if(getLevel()) {
|
if(level) {
|
||||||
for(Level::iterator room = getLevel()->begin(); room != getLevel()->end(); room++) {
|
for(Level::iterator room = level->begin(); room != level->end(); room++) {
|
||||||
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
||||||
min = fminf(min, v->getX());
|
min = fminf(min, v->getX());
|
||||||
max = fmaxf(max, v->getX());
|
max = fmaxf(max, v->getX());
|
||||||
|
@ -222,12 +221,12 @@ float getImageWidth() {
|
||||||
return (max-min+10)*scale;
|
return (max-min+10)*scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getImageHeight() {
|
float getImageHeight(Level *level) {
|
||||||
float min = 0.0, max = 0.0;
|
float min = 0.0, max = 0.0;
|
||||||
|
|
||||||
|
|
||||||
if(getLevel()) {
|
if(level) {
|
||||||
for(Level::iterator room = getLevel()->begin(); room != getLevel()->end(); room++) {
|
for(Level::iterator room = level->begin(); room != level->end(); room++) {
|
||||||
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
||||||
min = fminf(min, v->getY());
|
min = fminf(min, v->getY());
|
||||||
max = fmaxf(max, v->getY());
|
max = fmaxf(max, v->getY());
|
||||||
|
|
12
draw.h
12
draw.h
|
@ -3,18 +3,20 @@
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include "Vertex.h"
|
#include "Vertex.h"
|
||||||
|
#include "EditManager.h"
|
||||||
|
#include "Level.h"
|
||||||
|
|
||||||
|
|
||||||
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, gpointer data);
|
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, EditManager *editor);
|
||||||
|
|
||||||
float getScale();
|
float getScale();
|
||||||
void setScale(float s);
|
void setScale(float s);
|
||||||
|
|
||||||
void imageToView(Vertex *v);
|
void imageToView(Level *level, Vertex *v);
|
||||||
void viewToImage(Vertex *v);
|
void viewToImage(Level *level, Vertex *v);
|
||||||
|
|
||||||
float getImageWidth();
|
float getImageWidth(Level *level);
|
||||||
float getImageHeight();
|
float getImageHeight(Level *level);
|
||||||
|
|
||||||
float getXTranslate();
|
float getXTranslate();
|
||||||
void setXTranslate(float x);
|
void setXTranslate(float x);
|
||||||
|
|
169
edit.cpp
169
edit.cpp
|
@ -1,169 +0,0 @@
|
||||||
#include "edit.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;
|
|
||||||
|
|
||||||
static IdManager idManager;
|
|
||||||
|
|
||||||
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(idManager.generate("room"));
|
|
||||||
activeRoom = &addRoom;
|
|
||||||
|
|
||||||
editMode = EDIT_MODE_ADD;
|
|
||||||
}
|
|
||||||
|
|
||||||
void endAddMode() {
|
|
||||||
editMode = activeRoom ? EDIT_MODE_SELECTED : EDIT_MODE_VIEW;
|
|
||||||
}
|
|
||||||
|
|
||||||
Room *getHoveredRoom() {
|
|
||||||
return hoveredRoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
IdManager *getIdManager() {
|
|
||||||
return &idManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool isLineOk(Line *l) {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
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 = level->begin(); room != level->end(); room++) {
|
|
||||||
if(room->intersects(l))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
32
edit.h
32
edit.h
|
@ -1,32 +0,0 @@
|
||||||
#ifndef EDIT_H_
|
|
||||||
#define EDIT_H_
|
|
||||||
|
|
||||||
#include "Level.h"
|
|
||||||
#include "IdManager.h"
|
|
||||||
|
|
||||||
#define EDIT_MODE_VIEW 0
|
|
||||||
#define EDIT_MODE_SELECTED 1
|
|
||||||
#define EDIT_MODE_ADD 2
|
|
||||||
|
|
||||||
int getEditMode();
|
|
||||||
|
|
||||||
Level *getLevel();
|
|
||||||
void setLevel(Level *l);
|
|
||||||
|
|
||||||
Room *getActiveRoom();
|
|
||||||
void setActiveRoom(Room *room);
|
|
||||||
|
|
||||||
void startAddMode();
|
|
||||||
void endAddMode();
|
|
||||||
|
|
||||||
Room *getHoveredRoom();
|
|
||||||
|
|
||||||
Vertex *getHoveredVertex();
|
|
||||||
void setHoveredVertex(Vertex *v);
|
|
||||||
|
|
||||||
IdManager *getIdManager();
|
|
||||||
|
|
||||||
bool isVertexOk(Vertex *v);
|
|
||||||
bool isPolygonOk(Polygon *polygon);
|
|
||||||
|
|
||||||
#endif /*EDIT_H_*/
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "Level.h"
|
#include "Level.h"
|
||||||
#include "WindowManager.h"
|
#include "WindowManager.h"
|
||||||
#include "edit.h"
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
Reference in a new issue