zoomedit: Verallgemeinerte Level-Objekte implementiert.

This commit is contained in:
neoraider 2007-12-14 02:47:03 +00:00
parent d82c597917
commit a8c1d61687
20 changed files with 499 additions and 168 deletions

View file

@ -17,6 +17,7 @@ void Drawer::realize(GtkWidget *widget, Drawer *drawer) {
glEnable(GL_BLEND); glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH); glEnable(GL_LINE_SMOOTH);
glEnable(GL_POINT_SMOOTH);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
@ -238,9 +239,13 @@ void Drawer::viewToImage(Vertex *v) const {
float Drawer::getImageWidth() const { float Drawer::getImageWidth() const {
float max = 0; float max = 0;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
for(Room::iterator v = room->begin(); v != room->end(); v++) { if((*object)->isOfType("Room")) {
max = fmaxf(max, fabsf(v->getX())); Room *room = (Room*)&**object;
for(Room::iterator v = room->begin(); v != room->end(); v++) {
max = fmaxf(max, fabsf(v->getX()));
}
} }
} }
@ -250,9 +255,13 @@ float Drawer::getImageWidth() const {
float Drawer::getImageHeight() const { float Drawer::getImageHeight() const {
float max = 0; float max = 0;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
for(Room::iterator v = room->begin(); v != room->end(); v++) { if((*object)->isOfType("Room")) {
max = fmaxf(max, fabsf(v->getY())); Room *room = (Room*)&**object;
for(Room::iterator v = room->begin(); v != room->end(); v++) {
max = fmaxf(max, fabsf(v->getY()));
}
} }
} }

View file

@ -5,23 +5,21 @@
bool EditManager::lineOk(const Line& l) const { bool EditManager::lineOk(const Line& l) const {
Line l2; Line l2;
if(activeRoom) { for(size_t i = 0; i+2 < newRoom.size(); i++) {
for(size_t i = 0; i+2 < activeRoom->size(); i++) { l2.setVertex1(newRoom.at(i));
l2.setVertex1(activeRoom->at(i)); l2.setVertex2(newRoom.at(i+1));
l2.setVertex2(activeRoom->at(i+1));
if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
}
if(activeRoom->size() > 1) { if(l.intersects(l2, NULL) == INTERSECTION_SEGMENT_SEGMENT) return false;
l2.setVertex1(activeRoom->at(activeRoom->size()-2)); }
l2.setVertex2(activeRoom->back());
if(l2.contains(l.getVertex2())) return false; if(newRoom.size() > 1) {
} l2.setVertex1(newRoom.at(newRoom.size()-2));
l2.setVertex2(newRoom.back());
if(l2.contains(l.getVertex2())) return false;
} }
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
if(room->intersects(l)) if((*room)->isOfType("Room") && ((Room*)&**room)->intersects(l))
return false; return false;
} }
@ -32,20 +30,24 @@ bool EditManager::lineOk(const Line& l) const {
EditManager::EditManager(Window *window) { EditManager::EditManager(Window *window) {
this->window = window; this->window = window;
activeRoom = NULL; selectedObject = NULL;
mode = VIEW; mode = VIEW;
hoveredRoom = NULL; hoveredObject = NULL;
hasHoveredVertex = false; hasHoveredVertex = false;
} }
void EditManager::update() {
window->update();
}
void EditManager::addRoom() { void EditManager::addRoom() {
if(mode == VIEW) { if(mode == VIEW) {
newRoom = Room(); newRoom = Room();
mode = ADD; mode = ADD;
activeRoom = &newRoom; selectedObject = &newRoom;
window->update(); window->update();
} }
@ -57,11 +59,11 @@ void EditManager::finishRoom() {
if(newRoom.size() > 2 && polygonOk(newRoom)) { if(newRoom.size() > 2 && polygonOk(newRoom)) {
newRoom.setName(idManager.generate("room")); newRoom.setName(idManager.generate("room"));
window->getLevel().push_back(newRoom); window->getLevel().push_back(SharedPtr<LevelObject>(new Room(newRoom)));
activeRoom = &window->getLevel().back(); selectedObject = &*window->getLevel().back();
} }
else { else {
activeRoom = NULL; selectedObject = NULL;
} }
window->update(); window->update();
@ -86,18 +88,18 @@ void EditManager::setHoveredVertex(Vertex *v) {
hasHoveredVertex = true; hasHoveredVertex = true;
hoveredVertex = *v; hoveredVertex = *v;
hoveredRoom = NULL; hoveredObject = NULL;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
if(room->contains(*v)) { if((*object)->hit(*v)) {
hoveredRoom = &*room; hoveredObject = &**object;
break; break;
} }
} }
} }
else { else {
hasHoveredVertex = false; hasHoveredVertex = false;
hoveredRoom = NULL; hoveredObject = NULL;
} }
window->update(); window->update();
@ -111,7 +113,7 @@ void EditManager::buttonPress(unsigned int button) {
switch(mode) { switch(mode) {
case VIEW: case VIEW:
activeRoom = getHoveredRoom(); selectedObject = hoveredObject;
break; break;
case ADD: case ADD:
@ -127,13 +129,13 @@ bool EditManager::vertexOk(const Vertex& v) const {
Line l; Line l;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
if(room->contains(v)) return false; if((*room)->isOfType("Room") && ((Room*)&**room)->contains(v)) return false;
} }
if(!(activeRoom && !activeRoom->empty())) if(newRoom.empty())
return true; return true;
l.setVertex1(activeRoom->back()); l.setVertex1(newRoom.back());
l.setVertex2(v); l.setVertex2(v);
return lineOk(l); return lineOk(l);
@ -144,7 +146,12 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
if(polygon.empty()) return false; if(polygon.empty()) return false;
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
if(!(*object)->isOfType("Room"))
continue;
Room *room = (Room*)&**object;
if(room->empty()) continue; if(room->empty()) continue;
if(room->contains(polygon.front())) if(room->contains(polygon.front()))
@ -168,7 +175,7 @@ bool EditManager::polygonOk(const Polygon& polygon) const {
l.setVertex2(*it2); l.setVertex2(*it2);
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
if(room->intersects(l)) if((*room)->isOfType("Room") && ((Room*)&**room)->intersects(l))
return false; return false;
} }
} }

View file

@ -1,6 +1,7 @@
#ifndef EDITMANAGER_H_ #ifndef EDITMANAGER_H_
#define EDITMANAGER_H_ #define EDITMANAGER_H_
#include "SharedPtr.h"
#include "Room.h" #include "Room.h"
#include "IdManager.h" #include "IdManager.h"
@ -22,9 +23,9 @@ class EditManager {
Window *window; Window *window;
Room newRoom; Room newRoom;
Room *activeRoom; LevelObject *selectedObject;
Room *hoveredRoom; LevelObject *hoveredObject;
Vertex hoveredVertex; Vertex hoveredVertex;
bool hasHoveredVertex; bool hasHoveredVertex;
@ -34,6 +35,8 @@ class EditManager {
public: public:
EditManager(Window *window); EditManager(Window *window);
void update();
void addRoom(); void addRoom();
void finishRoom(); void finishRoom();
@ -43,12 +46,12 @@ class EditManager {
return mode; return mode;
} }
Room* getActiveRoom() { LevelObject* getSelectedObject() {
return activeRoom; return selectedObject;
} }
Room* getHoveredRoom() { LevelObject* getHoveredObject() {
return hoveredRoom; return hoveredObject;
} }
Vertex* getHoveredVertex(); Vertex* getHoveredVertex();

View file

@ -159,6 +159,27 @@ bool FileManager::writeTexCoords(xmlTextWriterPtr writer, float s, float t) {
return true; return true;
} }
bool FileManager::writeStart(xmlTextWriterPtr writer, const Vertex3d &start) {
// <vertex>
if(xmlTextWriterStartElement(writer, (xmlChar*)"start") < 0)
return false;
if(xmlTextWriterWriteFormatAttribute(writer, (xmlChar*)"x", "%f", start.getX()) < 0)
return false;
if(xmlTextWriterWriteFormatAttribute(writer, (xmlChar*)"y", "%f", start.getY()) < 0)
return false;
if(xmlTextWriterWriteFormatAttribute(writer, (xmlChar*)"z", "%f", start.getZ()) < 0)
return false;
// </vertex>
if(xmlTextWriterEndElement(writer) < 0)
return false;
return true;
}
FileManager::FileManager(Window *window) { FileManager::FileManager(Window *window) {
this->window = window; this->window = window;
@ -261,32 +282,10 @@ bool FileManager::write() {
return false; return false;
} }
// <start> /*if(!writeStart(writer, window->getLevel().getPlayerStart())) {
if(xmlTextWriterStartElement(writer, (xmlChar*)"start") < 0) {
xmlFreeTextWriter(writer); xmlFreeTextWriter(writer);
return false; return false;
} }*/
if(xmlTextWriterWriteAttribute(writer, (xmlChar*)"x", (xmlChar*)"0.0") < 0) {
xmlFreeTextWriter(writer);
return false;
}
if(xmlTextWriterWriteAttribute(writer, (xmlChar*)"y", (xmlChar*)"2.0") < 0) {
xmlFreeTextWriter(writer);
return false;
}
if(xmlTextWriterWriteAttribute(writer, (xmlChar*)"z", (xmlChar*)"0.0") < 0) {
xmlFreeTextWriter(writer);
return false;
}
// </start>
if(xmlTextWriterEndElement(writer) < 0) {
xmlFreeTextWriter(writer);
return false;
}
// </info> // </info>
if(xmlTextWriterEndElement(writer) < 0) { if(xmlTextWriterEndElement(writer) < 0) {
@ -300,7 +299,12 @@ bool FileManager::write() {
return false; return false;
} }
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
if(!(*object)->isOfType("Room"))
continue;
Room *room = (Room*)&**object;
// <room> // <room>
if(xmlTextWriterStartElement(writer, (xmlChar*)"room") < 0) { if(xmlTextWriterStartElement(writer, (xmlChar*)"room") < 0) {
xmlFreeTextWriter(writer); xmlFreeTextWriter(writer);

View file

@ -4,6 +4,7 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <libxml/xmlwriter.h> #include <libxml/xmlwriter.h>
#include "Triangle.h" #include "Triangle.h"
#include "Vertex3d.h"
class Window; class Window;
@ -25,6 +26,7 @@ class FileManager
bool writeSide(xmlTextWriterPtr writer, const Vertex &v1, const Vertex &v2, float height); bool writeSide(xmlTextWriterPtr writer, const Vertex &v1, const Vertex &v2, float height);
bool writeVertex(xmlTextWriterPtr writer, float x, float y, float z); bool writeVertex(xmlTextWriterPtr writer, float x, float y, float z);
bool writeTexCoords(xmlTextWriterPtr writer, float s, float t); bool writeTexCoords(xmlTextWriterPtr writer, float s, float t);
bool writeStart(xmlTextWriterPtr writer, const Vertex3d &start);
public: public:
FileManager(Window *window); FileManager(Window *window);

10
Level.h
View file

@ -2,10 +2,16 @@
#define LEVEL_H_ #define LEVEL_H_
#include "Room.h" #include "LevelObject.h"
#include "SharedPtr.h"
#include "PlayerStart.h"
#include <vector> #include <vector>
class Level : public std::vector<Room> { class Level : public std::vector<SharedPtr<LevelObject> > {
public:
Level() {
push_back(SharedPtr<LevelObject>(new PlayerStart()));
}
}; };
#endif /*LEVEL_H_*/ #endif /*LEVEL_H_*/

20
LevelObject.h Normal file
View file

@ -0,0 +1,20 @@
#ifndef LEVELOBJECT_H_
#define LEVELOBJECT_H_
#include "Vertex.h"
#include <cstring>
class LevelObject {
public:
virtual ~LevelObject() {}
virtual const char* getType() const = 0;
virtual bool hit(const Vertex &v) const = 0;
bool isOfType(const char *type) const {
return (std::strcmp(getType(), type) == 0);
}
};
#endif /*LEVELOBJECT_H_*/

View file

@ -1,9 +1,9 @@
bin_PROGRAMS = zoomedit bin_PROGRAMS = zoomedit
zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
Line.cpp Polygon.cpp Rectangle.cpp Room.cpp Triangle.cpp \ Line.cpp Polygon.cpp Rectangle.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 \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \ EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolSelector.cpp ToolAddPolygon.cpp ToolSelector.cpp ToolAddPolygon.cpp Vertex3d.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@ zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@ zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@

View file

@ -52,15 +52,15 @@ am_zoomedit_OBJECTS = zoomedit-zoomedit.$(OBJEXT) \
zoomedit-UIManager.$(OBJEXT) zoomedit-Renderer.$(OBJEXT) \ zoomedit-UIManager.$(OBJEXT) zoomedit-Renderer.$(OBJEXT) \
zoomedit-Vertex.$(OBJEXT) zoomedit-Line.$(OBJEXT) \ zoomedit-Vertex.$(OBJEXT) zoomedit-Line.$(OBJEXT) \
zoomedit-Polygon.$(OBJEXT) zoomedit-Rectangle.$(OBJEXT) \ zoomedit-Polygon.$(OBJEXT) zoomedit-Rectangle.$(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) \
zoomedit-FileManager.$(OBJEXT) \ zoomedit-FileManager.$(OBJEXT) \
zoomedit-SidebarToolbox.$(OBJEXT) \ zoomedit-SidebarToolbox.$(OBJEXT) \
zoomedit-ToolSelector.$(OBJEXT) \ zoomedit-ToolSelector.$(OBJEXT) \
zoomedit-ToolAddPolygon.$(OBJEXT) zoomedit-ToolAddPolygon.$(OBJEXT) zoomedit-Vertex3d.$(OBJEXT)
zoomedit_OBJECTS = $(am_zoomedit_OBJECTS) zoomedit_OBJECTS = $(am_zoomedit_OBJECTS)
zoomedit_DEPENDENCIES = zoomedit_DEPENDENCIES =
DEFAULT_INCLUDES = -I.@am__isrc@ DEFAULT_INCLUDES = -I.@am__isrc@
@ -183,11 +183,11 @@ target_alias = @target_alias@
top_builddir = @top_builddir@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \ zoomedit_SOURCES = zoomedit.cpp UIManager.cpp Renderer.cpp Vertex.cpp \
Line.cpp Polygon.cpp Rectangle.cpp Room.cpp Triangle.cpp \ Line.cpp Polygon.cpp Rectangle.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 \
EditManager.cpp FileManager.cpp SidebarToolbox.cpp \ EditManager.cpp FileManager.cpp SidebarToolbox.cpp \
ToolSelector.cpp ToolAddPolygon.cpp ToolSelector.cpp ToolAddPolygon.cpp Vertex3d.cpp
zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@ zoomedit_CPPFLAGS = @GTK_CFLAGS@ @GTKGLEXT_CFLAGS@ @libxml2_CFLAGS@
zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@ zoomedit_LDADD = @GTK_LIBS@ @GTKGLEXT_LIBS@ @libxml2_LIBS@
@ -287,7 +287,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Polygon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Polygon.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Rectangle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Rectangle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Renderer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Renderer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Room.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarAdd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarAdd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-SidebarToolbox.Po@am__quote@
@ -297,6 +296,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Triangle.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Triangle.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-UIManager.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-UIManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Vertex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Vertex.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-Vertex3d.Po@am__quote@
@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-zoomedit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zoomedit-zoomedit.Po@am__quote@
@ -413,20 +413,6 @@ zoomedit-Rectangle.obj: Rectangle.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-Rectangle.obj `if test -f 'Rectangle.cpp'; then $(CYGPATH_W) 'Rectangle.cpp'; else $(CYGPATH_W) '$(srcdir)/Rectangle.cpp'; fi` @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-Rectangle.obj `if test -f 'Rectangle.cpp'; then $(CYGPATH_W) 'Rectangle.cpp'; else $(CYGPATH_W) '$(srcdir)/Rectangle.cpp'; fi`
zoomedit-Room.o: Room.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Room.o -MD -MP -MF $(DEPDIR)/zoomedit-Room.Tpo -c -o zoomedit-Room.o `test -f 'Room.cpp' || echo '$(srcdir)/'`Room.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Room.Tpo $(DEPDIR)/zoomedit-Room.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Room.cpp' object='zoomedit-Room.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-Room.o `test -f 'Room.cpp' || echo '$(srcdir)/'`Room.cpp
zoomedit-Room.obj: Room.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Room.obj -MD -MP -MF $(DEPDIR)/zoomedit-Room.Tpo -c -o zoomedit-Room.obj `if test -f 'Room.cpp'; then $(CYGPATH_W) 'Room.cpp'; else $(CYGPATH_W) '$(srcdir)/Room.cpp'; fi`
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Room.Tpo $(DEPDIR)/zoomedit-Room.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Room.cpp' object='zoomedit-Room.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-Room.obj `if test -f 'Room.cpp'; then $(CYGPATH_W) 'Room.cpp'; else $(CYGPATH_W) '$(srcdir)/Room.cpp'; fi`
zoomedit-Triangle.o: Triangle.cpp zoomedit-Triangle.o: Triangle.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Triangle.o -MD -MP -MF $(DEPDIR)/zoomedit-Triangle.Tpo -c -o zoomedit-Triangle.o `test -f 'Triangle.cpp' || echo '$(srcdir)/'`Triangle.cpp @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Triangle.o -MD -MP -MF $(DEPDIR)/zoomedit-Triangle.Tpo -c -o zoomedit-Triangle.o `test -f 'Triangle.cpp' || echo '$(srcdir)/'`Triangle.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Triangle.Tpo $(DEPDIR)/zoomedit-Triangle.Po @am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Triangle.Tpo $(DEPDIR)/zoomedit-Triangle.Po
@ -609,6 +595,20 @@ zoomedit-ToolAddPolygon.obj: ToolAddPolygon.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-ToolAddPolygon.obj `if test -f 'ToolAddPolygon.cpp'; then $(CYGPATH_W) 'ToolAddPolygon.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolAddPolygon.cpp'; fi` @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o zoomedit-ToolAddPolygon.obj `if test -f 'ToolAddPolygon.cpp'; then $(CYGPATH_W) 'ToolAddPolygon.cpp'; else $(CYGPATH_W) '$(srcdir)/ToolAddPolygon.cpp'; fi`
zoomedit-Vertex3d.o: Vertex3d.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Vertex3d.o -MD -MP -MF $(DEPDIR)/zoomedit-Vertex3d.Tpo -c -o zoomedit-Vertex3d.o `test -f 'Vertex3d.cpp' || echo '$(srcdir)/'`Vertex3d.cpp
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Vertex3d.Tpo $(DEPDIR)/zoomedit-Vertex3d.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Vertex3d.cpp' object='zoomedit-Vertex3d.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-Vertex3d.o `test -f 'Vertex3d.cpp' || echo '$(srcdir)/'`Vertex3d.cpp
zoomedit-Vertex3d.obj: Vertex3d.cpp
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(zoomedit_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT zoomedit-Vertex3d.obj -MD -MP -MF $(DEPDIR)/zoomedit-Vertex3d.Tpo -c -o zoomedit-Vertex3d.obj `if test -f 'Vertex3d.cpp'; then $(CYGPATH_W) 'Vertex3d.cpp'; else $(CYGPATH_W) '$(srcdir)/Vertex3d.cpp'; fi`
@am__fastdepCXX_TRUE@ mv -f $(DEPDIR)/zoomedit-Vertex3d.Tpo $(DEPDIR)/zoomedit-Vertex3d.Po
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='Vertex3d.cpp' object='zoomedit-Vertex3d.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-Vertex3d.obj `if test -f 'Vertex3d.cpp'; then $(CYGPATH_W) 'Vertex3d.cpp'; else $(CYGPATH_W) '$(srcdir)/Vertex3d.cpp'; fi`
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \ unique=`for i in $$list; do \

19
PlayerStart.h Normal file
View file

@ -0,0 +1,19 @@
#ifndef PLAYERSTART_H_
#define PLAYERSTART_H_
#include "LevelObject.h"
#include "Vertex3d.h"
class PlayerStart : public Vertex3d, public LevelObject {
public:
virtual bool hit(const Vertex &v) const {
return (v.distanceSq(Vertex(getX(), getZ())) < 0.09);
}
virtual const char* getType() const {
return "PlayerStart";
}
};
#endif /*PLAYERSTART_H_*/

View file

@ -1,4 +1,5 @@
#include "Renderer.h" #include "Renderer.h"
#include "PlayerStart.h"
#include <GL/gl.h> #include <GL/gl.h>
@ -77,70 +78,111 @@ void Renderer::fillPolygon(const Polygon &polygon) {
} }
void Renderer::drawPolygon(const Polygon &polygon, bool close) { void Renderer::drawPolygon(const Polygon &polygon, bool close) {
glBegin(GL_LINE_STRIP); glBegin(close ? GL_LINE_LOOP : GL_LINE_STRIP);
for(Polygon::const_iterator vertex = polygon.begin(); vertex != polygon.end(); vertex++) for(Polygon::const_iterator vertex = polygon.begin(); vertex != polygon.end(); vertex++)
glVertex2d(vertex->getX(), vertex->getY()); glVertex2f(vertex->getX(), vertex->getY());
if(close)
glVertex2d(polygon.front().getX(), polygon.front().getY());
glEnd(); glEnd();
} }
void Renderer::drawCircle(const Vertex &m, float r, int n) {
glBegin(GL_LINE_LOOP);
for(int i = 0; i < n; i++)
glVertex2f(m.getX()+r*cosf(2*M_PI*i/n), m.getY()+r*sinf(2*M_PI*i/n));
glEnd();
}
void Renderer::drawCross(const Vertex &m, float r) {
glBegin(GL_LINES);
glVertex2f(m.getX()-r*M_SQRT1_2, m.getY()-r*M_SQRT1_2);
glVertex2f(m.getX()+r*M_SQRT1_2, m.getY()+r*M_SQRT1_2);
glVertex2f(m.getX()+r*M_SQRT1_2, m.getY()-r*M_SQRT1_2);
glVertex2f(m.getX()-r*M_SQRT1_2, m.getY()+r*M_SQRT1_2);
glEnd();
}
void Renderer::renderObject(const LevelObject &object, bool selected, bool hovered, float scale) {
if(object.isOfType("Room"))
renderRoom(*(Room*)&object, selected, hovered, scale);
else if(object.isOfType("PlayerStart"))
renderPlayerStart(*(PlayerStart*)&object, selected, hovered, scale);
}
void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float scale) {
if(selected)
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
fillPolygon(room);
if(selected) {
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
glLineWidth(2.0f);
}
else if(hovered && editManager->getMode() == EditManager::VIEW) {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(2.0f);
}
else {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(1.0f);
}
drawPolygon(room);
}
void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale) {
glLineWidth(1.0f);
glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
drawCircle(Vertex(start.getX(), start.getZ()), 0.3f, 128);
glLineWidth(2.0f);
glColor4f(1.0f, 1.0f, 1.0f, 0.7f);
drawCross(Vertex(start.getX(), start.getZ()), 0.5f/sqrtf(scale));
}
void Renderer::render(const Level &level, const Rectangle &rect, float scale) { void Renderer::render(const Level &level, const Rectangle &rect, float scale) {
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(1.0f); glLineWidth(1.0f);
glPointSize(10.0f);
drawGrid(rect, scale); drawGrid(rect, scale);
for(Level::const_iterator room = level.begin(); room != level.end(); room++) { for(Level::const_iterator object = level.begin(); object != level.end(); object++) {
if(&*room == editManager->getActiveRoom() && editManager->getMode() == EditManager::ADD) continue; renderObject(**object, (&**object == editManager->getSelectedObject()),
(&**object == editManager->getHoveredObject()), scale);
if(&*room == editManager->getActiveRoom())
glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else
glColor4f(0.0f, 0.7f, 1.0f, 0.3f);
fillPolygon(*room);
if(&*room == editManager->getActiveRoom()) {
glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
glLineWidth(2.0f);
}
else if(&*room == editManager->getHoveredRoom() && editManager->getMode() == EditManager::VIEW) {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(2.0f);
}
else {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(1.0f);
}
drawPolygon(*room, true);
} }
if(editManager->getMode() == EditManager::ADD) { if(editManager->getMode() == EditManager::ADD) {
if(editManager->polygonOk(*editManager->getActiveRoom())) Room *activeRoom = (Room*)editManager->getSelectedObject();
if(editManager->polygonOk(*activeRoom))
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(*editManager->getActiveRoom()); fillPolygon(*activeRoom);
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(*editManager->getActiveRoom(), false); drawPolygon(*activeRoom, false);
if(!editManager->getActiveRoom()->empty() && editManager->getHoveredVertex()) { if(!activeRoom->empty() && editManager->getHoveredVertex()) {
if(!editManager->vertexOk(*editManager->getHoveredVertex())) if(!editManager->vertexOk(*editManager->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(editManager->getActiveRoom()->back().getX(), editManager->getActiveRoom()->back().getY()); glVertex2f(activeRoom->back().getX(), activeRoom->back().getY());
glVertex2d(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY()); glVertex2f(editManager->getHoveredVertex()->getX(), editManager->getHoveredVertex()->getY());
glEnd(); glEnd();
} }

View file

@ -5,6 +5,8 @@
#include "Polygon.h" #include "Polygon.h"
#include "EditManager.h" #include "EditManager.h"
#include "Level.h" #include "Level.h"
#include "Room.h"
#include "PlayerStart.h"
class Renderer { class Renderer {
@ -13,7 +15,14 @@ class Renderer {
void drawGrid(const Rectangle &rect, float scale); void drawGrid(const Rectangle &rect, float scale);
void fillPolygon(const Polygon &polygon); void fillPolygon(const Polygon &polygon);
void drawPolygon(const Polygon &polygon, bool close); void drawPolygon(const Polygon &polygon, bool close = true);
void drawCircle(const Vertex &m, float r, int n);
void drawCross(const Vertex &m, float r);
void renderObject(const LevelObject &object, bool selected, bool hovered, float scale);
void renderRoom(const Room &room, bool selected, bool hovered, float scale);
void renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale);
public: public:
Renderer(EditManager *editManager) { Renderer(EditManager *editManager) {

View file

@ -1,3 +0,0 @@
#include "Room.h"

10
Room.h
View file

@ -2,10 +2,11 @@
#define ROOM_H_ #define ROOM_H_
#include "Polygon.h" #include "Polygon.h"
#include "LevelObject.h"
#include <string> #include <string>
class Room : public Polygon { class Room : public Polygon, public LevelObject {
private: private:
std::string name; std::string name;
float height; float height;
@ -14,13 +15,18 @@ class Room : public Polygon {
Room() {height = 10;} Room() {height = 10;}
Room(std::string name) {this->name = name; height = 10;} Room(std::string name) {this->name = name; height = 10;}
std::string &getName() {return name;} std::string &getName() {return name;}
const std::string &getName() const {return name;} const std::string &getName() const {return name;}
void setName(const std::string &name) {this->name = name;} void setName(const std::string &name) {this->name = name;}
float getHeight() const {return height;} float getHeight() const {return height;}
void setHeight(float height) {this->height = height;} void setHeight(float height) {this->height = height;}
virtual bool hit(const Vertex &v) const {return contains(v);}
virtual const char* getType() const {
return "Room";
}
}; };
#endif /*ROOM_H_*/ #endif /*ROOM_H_*/

46
SharedPtr.h Normal file
View file

@ -0,0 +1,46 @@
#ifndef SHAREDPTR_H_
#define SHAREDPTR_H_
template <class T>
class SharedPtr {
private:
class Counter {
public:
Counter(T *o) : object(o), refCount(1) {}
~Counter() {delete object;}
T *object;
unsigned int refCount;
};
Counter *counter;
public:
SharedPtr(T *o) : counter(new Counter(o)) {}
SharedPtr(const SharedPtr<T> &c) : counter(c.counter) {
counter->refCount++;
}
virtual ~SharedPtr() {
if(--counter->refCount == 0)
delete counter;
}
SharedPtr<T>& operator=(const SharedPtr<T>& c) {
c.counter->refCount++;
if(--counter->refCount == 0)
delete counter;
counter = c.counter;
return *this;
}
T* operator->() {return counter->object;}
T& operator*() {return *counter->object;}
const T* operator->() const {return counter->object;}
const T& operator*() const {return *counter->object;}
};
#endif /*SHAREDPTR_H_*/

View file

@ -1,11 +1,25 @@
#include "SidebarView.h" #include "SidebarView.h"
#include "PlayerStart.h"
void SidebarView::spinButtonHeightChanged(GtkSpinButton *spinbutton, SidebarView *view) { void SidebarView::spinButtonChanged(GtkWidget *spinbutton, SidebarView *view) {
if(!view->editor->getActiveRoom()) if(!view->editor->getSelectedObject())
return; return;
view->editor->getActiveRoom()->setHeight(gtk_spin_button_get_value(spinbutton)); if(view->editor->getSelectedObject()->isOfType("Room")) {
if(spinbutton == view->spinButtonHeight)
((Room*)view->editor->getSelectedObject())->setHeight(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
}
else if(view->editor->getSelectedObject()->isOfType("PlayerStart")) {
if(spinbutton == view->spinButtonX)
((PlayerStart*)view->editor->getSelectedObject())->setX(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
else if(spinbutton == view->spinButtonY)
((PlayerStart*)view->editor->getSelectedObject())->setY(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
else if(spinbutton == view->spinButtonZ)
((PlayerStart*)view->editor->getSelectedObject())->setZ(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinbutton)));
}
view->editor->update();
} }
SidebarView::SidebarView(EditManager *editor) { SidebarView::SidebarView(EditManager *editor) {
@ -14,54 +28,114 @@ SidebarView::SidebarView(EditManager *editor) {
sidebar = gtk_vbox_new(FALSE, 0); sidebar = gtk_vbox_new(FALSE, 0);
g_object_ref_sink(G_OBJECT(sidebar)); g_object_ref_sink(G_OBJECT(sidebar));
GtkWidget *labelRoomInfo = gtk_label_new(NULL); labelType = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(labelRoomInfo), "<b>Room info:</b>"); gtk_misc_set_alignment(GTK_MISC(labelType), 0.0, 0.5);
gtk_misc_set_alignment(GTK_MISC(labelRoomInfo), 0.0, 0.5); gtk_box_pack_start(GTK_BOX(sidebar), labelType, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(sidebar), labelRoomInfo, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(sidebar), gtk_hseparator_new(), FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(sidebar), gtk_hseparator_new(), FALSE, FALSE, 5);
GtkWidget *labelName = gtk_label_new("Name: "); labelName = gtk_label_new("Name: ");
gtk_misc_set_alignment(GTK_MISC(labelName), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(labelName), 0.0, 0.5);
gtk_widget_set_no_show_all(labelName, TRUE);
gtk_box_pack_start(GTK_BOX(sidebar), labelName, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(sidebar), labelName, FALSE, FALSE, 0);
entryName = gtk_entry_new(); entryName = gtk_entry_new();
gtk_widget_set_size_request(entryName, 0, -1); gtk_widget_set_size_request(entryName, 0, -1);
//g_signal_connect(G_OBJECT(entryName), "focus-out-event", G_CALLBACK(sidebarNameFocusOutEvent), NULL); //g_signal_connect(G_OBJECT(entryName), "focus-out-event", G_CALLBACK(sidebarNameFocusOutEvent), NULL);
//gtk_widget_add_events(entryName, GDK_FOCUS_CHANGE_MASK); //gtk_widget_add_events(entryName, GDK_FOCUS_CHANGE_MASK);
gtk_widget_set_no_show_all(entryName, TRUE);
gtk_box_pack_start(GTK_BOX(sidebar), entryName, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(sidebar), entryName, FALSE, FALSE, 0);
GtkWidget *tableRoomData = gtk_table_new(2, 3, FALSE); tableRoomData = gtk_table_new(2, 3, FALSE);
gtk_table_set_row_spacings(GTK_TABLE(tableRoomData), 5); gtk_table_set_row_spacings(GTK_TABLE(tableRoomData), 5);
gtk_widget_set_no_show_all(tableRoomData, TRUE);
gtk_box_pack_start(GTK_BOX(sidebar), tableRoomData, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(sidebar), tableRoomData, FALSE, FALSE, 5);
GtkWidget *labelAreaLabel = gtk_label_new("Room area: "); GtkWidget *labelAreaLabel = gtk_label_new("Room area: ");
gtk_misc_set_alignment(GTK_MISC(labelAreaLabel), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(labelAreaLabel), 0.0, 0.5);
gtk_widget_show(labelAreaLabel);
gtk_table_attach(GTK_TABLE(tableRoomData), labelAreaLabel, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(tableRoomData), labelAreaLabel, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
labelArea = gtk_label_new(NULL); labelArea = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(labelArea), 1.0, 0.5); gtk_misc_set_alignment(GTK_MISC(labelArea), 1.0, 0.5);
gtk_widget_show(labelArea);
gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelArea, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelArea, 1, 2, 0, 1);
GtkWidget *labelPerimeterLabel = gtk_label_new("Room perimeter: "); GtkWidget *labelPerimeterLabel = gtk_label_new("Room perimeter: ");
gtk_misc_set_alignment(GTK_MISC(labelPerimeterLabel), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(labelPerimeterLabel), 0.0, 0.5);
gtk_widget_show(labelPerimeterLabel);
gtk_table_attach(GTK_TABLE(tableRoomData), labelPerimeterLabel, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(tableRoomData), labelPerimeterLabel, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
labelPerimeter = gtk_label_new(NULL); labelPerimeter = gtk_label_new(NULL);
gtk_misc_set_alignment(GTK_MISC(labelPerimeter), 1.0, 0.5); gtk_misc_set_alignment(GTK_MISC(labelPerimeter), 1.0, 0.5);
gtk_widget_show(labelPerimeter);
gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelPerimeter, 1, 2, 1, 2); gtk_table_attach_defaults(GTK_TABLE(tableRoomData), labelPerimeter, 1, 2, 1, 2);
GtkWidget *labelHeight = gtk_label_new("Height: "); GtkWidget *labelHeight = gtk_label_new("Height: ");
gtk_misc_set_alignment(GTK_MISC(labelHeight), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(labelHeight), 0.0, 0.5);
gtk_widget_show(labelHeight);
gtk_table_attach(GTK_TABLE(tableRoomData), labelHeight, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); gtk_table_attach(GTK_TABLE(tableRoomData), labelHeight, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
spinButtonHeight = gtk_spin_button_new_with_range(0, 10000, 0.1f); spinButtonHeight = gtk_spin_button_new_with_range(0, 10000, 0.1f);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinButtonHeight), 2); gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinButtonHeight), 2);
gtk_entry_set_alignment(GTK_ENTRY(spinButtonHeight), 1.0); gtk_entry_set_alignment(GTK_ENTRY(spinButtonHeight), 1.0);
gtk_widget_show(spinButtonHeight);
gtk_table_attach(GTK_TABLE(tableRoomData), spinButtonHeight, 1, 2, 2, 3, (GtkAttachOptions)(GTK_EXPAND|GTK_SHRINK|GTK_FILL), gtk_table_attach(GTK_TABLE(tableRoomData), spinButtonHeight, 1, 2, 2, 3, (GtkAttachOptions)(GTK_EXPAND|GTK_SHRINK|GTK_FILL),
(GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0); (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
gtk_widget_set_size_request(spinButtonHeight, 0, -1); gtk_widget_set_size_request(spinButtonHeight, 0, -1);
g_signal_connect(G_OBJECT(spinButtonHeight), "value-changed", G_CALLBACK(spinButtonHeightChanged), this); g_signal_connect(G_OBJECT(spinButtonHeight), "value-changed", G_CALLBACK(spinButtonChanged), this);
tablePlayerStart = gtk_table_new(2, 4, FALSE);
gtk_table_set_row_spacings(GTK_TABLE(tablePlayerStart), 5);
gtk_widget_set_no_show_all(tablePlayerStart, TRUE);
gtk_box_pack_start(GTK_BOX(sidebar), tablePlayerStart, FALSE, FALSE, 5);
GtkWidget *labelCoordinates = gtk_label_new("Coordinates:");
gtk_misc_set_alignment(GTK_MISC(labelCoordinates), 0.0, 0.5);
gtk_widget_show(labelCoordinates);
gtk_table_attach(GTK_TABLE(tablePlayerStart), labelCoordinates, 0, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
GtkWidget *labelX = gtk_label_new("X: ");
gtk_misc_set_alignment(GTK_MISC(labelX), 0.0, 0.5);
gtk_widget_show(labelX);
gtk_table_attach(GTK_TABLE(tablePlayerStart), labelX, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
spinButtonX = gtk_spin_button_new_with_range(-10000, 10000, 0.1f);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinButtonX), 2);
gtk_entry_set_alignment(GTK_ENTRY(spinButtonX), 1.0);
gtk_widget_show(spinButtonX);
gtk_table_attach(GTK_TABLE(tablePlayerStart), spinButtonX, 1, 2, 1, 2, (GtkAttachOptions)(GTK_EXPAND|GTK_SHRINK|GTK_FILL),
(GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
gtk_widget_set_size_request(spinButtonX, 0, -1);
g_signal_connect(G_OBJECT(spinButtonX), "value-changed", G_CALLBACK(spinButtonChanged), this);
GtkWidget *labelY = gtk_label_new("Y: ");
gtk_misc_set_alignment(GTK_MISC(labelY), 0.0, 0.5);
gtk_widget_show(labelY);
gtk_table_attach(GTK_TABLE(tablePlayerStart), labelY, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
spinButtonY = gtk_spin_button_new_with_range(-10000, 10000, 0.1f);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinButtonY), 2);
gtk_entry_set_alignment(GTK_ENTRY(spinButtonY), 1.0);
gtk_widget_show(spinButtonY);
gtk_table_attach(GTK_TABLE(tablePlayerStart), spinButtonY, 1, 2, 2, 3, (GtkAttachOptions)(GTK_EXPAND|GTK_SHRINK|GTK_FILL),
(GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
gtk_widget_set_size_request(spinButtonY, 0, -1);
g_signal_connect(G_OBJECT(spinButtonY), "value-changed", G_CALLBACK(spinButtonChanged), this);
GtkWidget *labelZ = gtk_label_new("Z: ");
gtk_misc_set_alignment(GTK_MISC(labelZ), 0.0, 0.5);
gtk_widget_show(labelZ);
gtk_table_attach(GTK_TABLE(tablePlayerStart), labelZ, 0, 1, 3, 4, GTK_FILL, GTK_FILL, 0, 0);
spinButtonZ = gtk_spin_button_new_with_range(-10000, 10000, 0.1f);
gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spinButtonZ), 2);
gtk_entry_set_alignment(GTK_ENTRY(spinButtonZ), 1.0);
gtk_widget_show(spinButtonZ);
gtk_table_attach(GTK_TABLE(tablePlayerStart), spinButtonZ, 1, 2, 3, 4, (GtkAttachOptions)(GTK_EXPAND|GTK_SHRINK|GTK_FILL),
(GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
gtk_widget_set_size_request(spinButtonZ, 0, -1);
g_signal_connect(G_OBJECT(spinButtonZ), "value-changed", G_CALLBACK(spinButtonChanged), this);
gtk_widget_show_all(sidebar); gtk_widget_show_all(sidebar);
} }
@ -75,29 +149,47 @@ GtkWidget* SidebarView::getWidget() {
} }
void SidebarView::update() { void SidebarView::update() {
if(editor->getActiveRoom()) { gtk_widget_hide(labelName);
gtk_entry_set_text(GTK_ENTRY(entryName), editor->getActiveRoom()->getName().c_str()); gtk_widget_hide(entryName);
gtk_widget_set_sensitive(entryName, TRUE); gtk_widget_hide(tableRoomData);
gtk_widget_hide(tablePlayerStart);
gchar *string = g_strdup_printf("%.2f", editor->getActiveRoom()->area());
gtk_label_set_text(GTK_LABEL(labelArea), string); if(editor->getSelectedObject()) {
g_free(string); if(editor->getSelectedObject()->isOfType("Room")) {
Room *room = (Room*)editor->getSelectedObject();
string = g_strdup_printf("%.2f", editor->getActiveRoom()->perimeter());
gtk_label_set_text(GTK_LABEL(labelPerimeter), string); gtk_label_set_markup(GTK_LABEL(labelType), "<b>Room info:</b>");
g_free(string);
gtk_widget_show(labelName);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinButtonHeight), editor->getActiveRoom()->getHeight());
gtk_widget_set_sensitive(spinButtonHeight, TRUE); gtk_entry_set_text(GTK_ENTRY(entryName), room->getName().c_str());
gtk_widget_show(entryName);
gchar *string = g_strdup_printf("%.2f", room->area());
gtk_label_set_text(GTK_LABEL(labelArea), string);
g_free(string);
string = g_strdup_printf("%.2f", room->perimeter());
gtk_label_set_text(GTK_LABEL(labelPerimeter), string);
g_free(string);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinButtonHeight), room->getHeight());
gtk_widget_show(tableRoomData);
}
else if(editor->getSelectedObject()->isOfType("PlayerStart")) {
PlayerStart *playerStart = (PlayerStart*)editor->getSelectedObject();
gtk_label_set_markup(GTK_LABEL(labelType), "<b>Player start:</b>");
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinButtonX), playerStart->getX());
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinButtonY), playerStart->getY());
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinButtonZ), playerStart->getZ());
gtk_widget_show(tablePlayerStart);
}
} }
else { else {
gtk_entry_set_text(GTK_ENTRY(entryName), ""); gtk_label_set_markup(GTK_LABEL(labelType), "<b>[Nothing selected]</b>");
gtk_widget_set_sensitive(entryName, FALSE);
gtk_label_set_text(GTK_LABEL(labelArea), NULL);
gtk_label_set_text(GTK_LABEL(labelPerimeter), NULL);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinButtonHeight), 0.0);
gtk_widget_set_sensitive(spinButtonHeight, FALSE);
} }
} }

View file

@ -8,7 +8,9 @@
class SidebarView : public Sidebar { class SidebarView : public Sidebar {
private: private:
GtkWidget *sidebar; GtkWidget *sidebar;
GtkWidget *entryName, *labelArea, *labelPerimeter, *spinButtonHeight; GtkWidget *labelType, *labelName, *entryName;
GtkWidget *tableRoomData, *labelArea, *labelPerimeter, *spinButtonHeight;
GtkWidget *tablePlayerStart, *spinButtonX, *spinButtonY, *spinButtonZ;
EditManager *editor; EditManager *editor;
@ -16,7 +18,7 @@ class SidebarView : public Sidebar {
SidebarView(const SidebarView &w); SidebarView(const SidebarView &w);
const SidebarView& operator=(const SidebarView &w); const SidebarView& operator=(const SidebarView &w);
static void spinButtonHeightChanged(GtkSpinButton *spinbutton, SidebarView *view); static void spinButtonChanged(GtkWidget *spinbutton, SidebarView *view);
public: public:
SidebarView(EditManager *editor); SidebarView(EditManager *editor);

View file

@ -4,9 +4,9 @@
class Vertex { class Vertex {
private: private:
float x, y; float x, y;
public: public:
Vertex() {x = y = 0.0;} Vertex() {x = y = 0.0;}
Vertex(const Vertex &v) {x = v.x; y = v.y;}
Vertex(float x, float y) {this->x = x; this->y = y;} Vertex(float x, float y) {this->x = x; this->y = y;}
float getX() const {return x;} float getX() const {return x;}
@ -15,7 +15,6 @@ class Vertex {
float getY() const {return y;} float getY() const {return y;}
void setY(float y) {this->y = y;} void setY(float y) {this->y = y;}
void setLocation(const Vertex &v) {x = v.x; y = v.y;}
void setLocation(float x, float y) {this->x = x; this->y = y;} void setLocation(float x, float y) {this->x = x; this->y = y;}
float distanceSq(const Vertex &v) const; float distanceSq(const Vertex &v) const;

35
Vertex3d.cpp Normal file
View file

@ -0,0 +1,35 @@
#include "Vertex3d.h"
#include <math.h>
float Vertex3d::distanceSq(const Vertex3d &v) const {
return (x - v.x)*(x - v.x) + (y - v.y)*(y - v.y) + (z - v.z)*(z - v.z);
}
float Vertex3d::distance(const Vertex3d &v) const {
return sqrtf(distanceSq(v));
}
Vertex3d Vertex3d::operator+(const Vertex3d &v) const {
return Vertex3d(x + v.x, y + v.y, z + v.z);
}
Vertex3d Vertex3d::operator-(const Vertex3d &v) const {
return Vertex3d(x - v.x, y - v.y, z - v.z);
}
Vertex3d& Vertex3d::operator+=(const Vertex3d &v) {
x += v.x;
y += v.y;
z += v.z;
return *this;
}
Vertex3d& Vertex3d::operator-=(const Vertex3d &v) {
x -= v.x;
y -= v.y;
z -= v.z;
return *this;
}

33
Vertex3d.h Normal file
View file

@ -0,0 +1,33 @@
#ifndef VERTEX3D_H_
#define VERTEX3D_H_
class Vertex3d {
private:
float x, y, z;
public:
Vertex3d() {x = y = z = 0.0;}
Vertex3d(float x, float y, float z) {this->x = x; this->y = y; this->z = z;}
float getX() const {return x;}
void setX(float x) {this->x = x;}
float getY() const {return y;}
void setY(float y) {this->y = y;}
float getZ() const {return z;}
void setZ(float z) {this->z = z;}
void setLocation(float x, float y, float z) {this->x = x; this->y = y; this->z = z;}
float distanceSq(const Vertex3d &v) const;
float distance(const Vertex3d &v) const;
Vertex3d operator+(const Vertex3d &v) const;
Vertex3d operator-(const Vertex3d &v) const;
Vertex3d& operator+=(const Vertex3d &v);
Vertex3d& operator-=(const Vertex3d &v);
};
#endif /*VERTEX3D_H_*/