zoomedit: Added some features like hover filters and connectable vertices.

This commit is contained in:
neoraider 2008-02-18 20:22:05 +00:00
parent 77b187b8eb
commit 4c9b0f34f8
20 changed files with 90 additions and 62 deletions

View file

@ -31,7 +31,6 @@ EditManager::EditManager(Window *window) {
this->window = window; this->window = window;
hoveredObject = NULL; hoveredObject = NULL;
highlightedObject = NULL;
selectedObject = NULL; selectedObject = NULL;
hasHoveredVertex = false; hasHoveredVertex = false;
@ -70,6 +69,9 @@ void EditManager::setHoveredVertex(const Vertex *v, float scale) {
hoveredObject = NULL; hoveredObject = NULL;
for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) { for(Level::iterator object = window->getLevel().begin(); object != window->getLevel().end(); object++) {
if(!window->getActiveTool()->hoverFilter(**object))
continue;
if((*object)->hit(*v, scale)) { if((*object)->hit(*v, scale)) {
if(hoveredObject && (*object)->getPriority() < hoveredObject->getPriority()) if(hoveredObject && (*object)->getPriority() < hoveredObject->getPriority())
continue; continue;

View file

@ -16,7 +16,6 @@ class EditManager {
Window *window; Window *window;
LevelObject *hoveredObject; LevelObject *hoveredObject;
LevelObject *highlightedObject;
LevelObject *selectedObject; LevelObject *selectedObject;
Vertex hoveredVertex; Vertex hoveredVertex;
@ -33,18 +32,6 @@ class EditManager {
return hoveredObject; return hoveredObject;
} }
void setHighlightedObject(LevelObject *object) {
highlightedObject = object;
}
LevelObject* getHighlightedObject() {
return highlightedObject;
}
void highlightHoveredObject() {
highlightedObject = hoveredObject;
}
void setSelectedObject(LevelObject *object) { void setSelectedObject(LevelObject *object) {
selectedObject = object; selectedObject = object;
} }

View file

@ -26,7 +26,9 @@ class LevelObject : public Object {
virtual bool hit(const Vertex &v, float scale) const {return hit(v);}; virtual bool hit(const Vertex &v, float scale) const {return hit(v);};
virtual int getPriority() const {return 0;} virtual int getPriority() const {return 0;}
virtual bool canMove() const {return false;}
virtual void move(float x, float y) {} virtual void move(float x, float y) {}
virtual bool canRotate() const {return false;}
virtual void rotate(Vertex m, float a) {} virtual void rotate(Vertex m, float a) {}
}; };

View file

@ -34,6 +34,9 @@ class LevelVertex : public LevelObject {
provider->rotateVertex(id, m, a); provider->rotateVertex(id, m, a);
} }
virtual bool canConnect() const {return provider->canConnectVertex(id);}
virtual void connect() {provider->connectVertex(id);}
const Vertex* operator->() const {return provider->getVertex(id);} const Vertex* operator->() const {return provider->getVertex(id);}
const Vertex& operator*() const {return *provider->getVertex(id);} const Vertex& operator*() const {return *provider->getVertex(id);}
}; };

View file

@ -17,6 +17,8 @@ class PlayerStart : public Vertex3d, public LevelObject {
return "PlayerStart"; return "PlayerStart";
} }
virtual bool canMove() const {return true;}
virtual void move(float x, float y) { virtual void move(float x, float y) {
setX(getX()+x); setX(getX()+x);
setZ(getZ()+y); setZ(getZ()+y);

View file

@ -16,6 +16,7 @@ class Portal : public LevelObject, public VertexProvider {
Vertex vertices[4]; Vertex vertices[4];
float s, c; float s, c;
bool connected[4];
void updateVertices() { void updateVertices() {
@ -54,6 +55,10 @@ class Portal : public LevelObject, public VertexProvider {
orient = 0; orient = 0;
for(int i = 0; i < 4; i++) {
connected[i] = false;
}
updateOrient(); updateOrient();
} }
@ -109,13 +114,25 @@ class Portal : public LevelObject, public VertexProvider {
return 1; return 1;
} }
virtual bool canMove() const {return true;}
virtual void moveVertex(size_t id, float x, float y) { virtual void moveVertex(size_t id, float x, float y) {
move(x, y); move(x, y);
} }
virtual bool canRotate() const {return true;}
virtual void rotateVertex(size_t id, Vertex m, float a) { virtual void rotateVertex(size_t id, Vertex m, float a) {
rotate(m, a); rotate(m, a);
} }
virtual bool canConnectVertex(size_t id) const {
return !connected[id];
}
virtual void connectVertex(size_t id) {
connected[id] = true;
}
}; };
#endif /*PORTAL_H_*/ #endif /*PORTAL_H_*/

View file

@ -104,39 +104,39 @@ void Renderer::drawCross(const Vertex &m, float r) {
glEnd(); glEnd();
} }
void Renderer::renderObject(const LevelObject &object, bool selected, bool highlighted, float scale) { void Renderer::renderObject(const LevelObject &object, bool selected, bool hovered, float scale) {
if(object.isOfType("LevelVertex")) if(object.isOfType("LevelVertex"))
renderLevelVertex(*(LevelVertex*)&object, selected, highlighted, scale); renderLevelVertex(*(LevelVertex*)&object, selected, hovered, scale);
else if(object.isOfType("LevelEdge")) else if(object.isOfType("LevelEdge"))
renderLevelEdge(*(LevelEdge*)&object, selected, highlighted, scale); renderLevelEdge(*(LevelEdge*)&object, selected, hovered, scale);
else if(object.isOfType("Room")) else if(object.isOfType("Room"))
renderRoom(*(Room*)&object, selected, highlighted, scale); renderRoom(*(Room*)&object, selected, hovered, scale);
else if(object.isOfType("PlayerStart")) else if(object.isOfType("PlayerStart"))
renderPlayerStart(*(PlayerStart*)&object, selected, highlighted, scale); renderPlayerStart(*(PlayerStart*)&object, selected, hovered, scale);
else if(object.isOfType("Portal")) else if(object.isOfType("Portal"))
renderPortal(*(Portal*)&object, selected, highlighted, scale); renderPortal(*(Portal*)&object, selected, hovered, scale);
} }
void Renderer::renderLevelVertex(const LevelVertex &vertex, bool selected, bool highlighted, float scale) { void Renderer::renderLevelVertex(const LevelVertex &vertex, bool selected, bool hovered, float scale) {
if(!selected && !highlighted) return; if(!selected && !hovered) return;
glColor4f(0.0f, 0.0f, 0.0f, 1.0f); glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
fillCircle(*vertex, 3.5f/scale, 16); fillCircle(*vertex, 3.5f/scale, 16);
glLineWidth(1.0f); glLineWidth(1.0f);
if(highlighted) if(hovered)
glColor4f(1.0f, 0.9f, 0.0f, 0.9f); glColor4f(1.0f, 0.9f, 0.0f, 0.9f);
else else
glColor4f(1.0f, 0.7f, 0.0f, 0.9f); glColor4f(1.0f, 0.7f, 0.0f, 0.9f);
drawCircle(*vertex, 3.5f/scale, 16); drawCircle(*vertex, 3.5f/scale, 16);
} }
void Renderer::renderLevelEdge(const LevelEdge &edge, bool selected, bool highlighted, float scale) { void Renderer::renderLevelEdge(const LevelEdge &edge, bool selected, bool hovered, float scale) {
if(selected) { if(selected) {
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(highlighted) { else if(hovered) {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f); glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(2.0f); glLineWidth(2.0f);
} }
@ -151,7 +151,7 @@ void Renderer::renderLevelEdge(const LevelEdge &edge, bool selected, bool highli
glEnd(); glEnd();
} }
void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, float scale) { void Renderer::renderRoom(const Room &room, bool selected, bool hovered, float scale) {
if(selected) if(selected)
glColor4f(0.0f, 0.7f, 1.0f, 0.2f); glColor4f(0.0f, 0.7f, 1.0f, 0.2f);
else else
@ -163,7 +163,7 @@ void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, flo
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(highlighted) { else if(hovered) {
glColor4f(0.0f, 0.7f, 1.0f, 0.7f); glColor4f(0.0f, 0.7f, 1.0f, 0.7f);
glLineWidth(2.0f); glLineWidth(2.0f);
} }
@ -175,12 +175,12 @@ void Renderer::renderRoom(const Room &room, bool selected, bool highlighted, flo
drawPolygon(room.getPolygon()); drawPolygon(room.getPolygon());
} }
void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale) { void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale) {
if(selected) { if(selected) {
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(highlighted) { else if(hovered) {
glColor4f(0.0f, 0.7f, 0.7f, 0.7f); glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
glLineWidth(2.0f); glLineWidth(2.0f);
} }
@ -195,12 +195,12 @@ void Renderer::renderPlayerStart(const PlayerStart &start, bool selected, bool h
drawCross(Vertex(start.getX(), start.getZ()), 0.5f/sqrtf(scale)); drawCross(Vertex(start.getX(), start.getZ()), 0.5f/sqrtf(scale));
} }
void Renderer::renderPortal(const Portal &portal, bool selected, bool highlighted, float scale) { void Renderer::renderPortal(const Portal &portal, bool selected, bool hovered, float scale) {
if(selected) { if(selected) {
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(highlighted) { else if(hovered) {
glColor4f(0.0f, 0.7f, 0.7f, 0.7f); glColor4f(0.0f, 0.7f, 0.7f, 0.7f);
glLineWidth(2.0f); glLineWidth(2.0f);
} }
@ -242,6 +242,6 @@ void Renderer::render(const Level &level, const Rectangle &rect, float scale) {
for(Level::const_iterator object = level.begin(); object != level.end(); object++) { for(Level::const_iterator object = level.begin(); object != level.end(); object++) {
renderObject(**object, (&**object == editManager->getSelectedObject()), renderObject(**object, (&**object == editManager->getSelectedObject()),
(&**object == editManager->getHighlightedObject()), scale); (&**object == editManager->getHoveredObject()), scale);
} }
} }

View file

@ -25,14 +25,14 @@ class Renderer {
void drawCircleDotted(const Vertex &m, float r, int n = 64, int d = 8, float rot = 0); void drawCircleDotted(const Vertex &m, float r, int n = 64, int d = 8, float rot = 0);
void drawCross(const Vertex &m, float r); void drawCross(const Vertex &m, float r);
void renderObject(const LevelObject &object, bool selected, bool highlighted, float scale); void renderObject(const LevelObject &object, bool selected, bool hovered, float scale);
void renderLevelVertex(const LevelVertex &vertex, bool selected, bool highlighted, float scale); void renderLevelVertex(const LevelVertex &vertex, bool selected, bool hovered, float scale);
void renderLevelEdge(const LevelEdge &edge, bool selected, bool highlighted, float scale); void renderLevelEdge(const LevelEdge &edge, bool selected, bool hovered, float scale);
void renderRoom(const Room &room, bool selected, bool highlighted, float scale); void renderRoom(const Room &room, bool selected, bool hovered, float scale);
void renderPlayerStart(const PlayerStart &start, bool selected, bool highlighted, float scale); void renderPlayerStart(const PlayerStart &start, bool selected, bool hovered, float scale);
void renderPortal(const Portal &portal, bool selected, bool highlighted, float scale); void renderPortal(const Portal &portal, bool selected, bool hovered, float scale);
public: public:
Renderer(EditManager *editManager) { Renderer(EditManager *editManager) {

4
Room.h
View file

@ -48,6 +48,8 @@ class Room : public LevelObject, private VertexProvider, private EdgeProvider {
return "Room"; return "Room";
} }
virtual bool canMove() const {return true;}
virtual void move(float x, float y) { virtual void move(float x, float y) {
Vertex m(x, y); Vertex m(x, y);
@ -55,6 +57,8 @@ class Room : public LevelObject, private VertexProvider, private EdgeProvider {
*v += m; *v += m;
} }
virtual bool canRotate() const {return true;}
virtual void rotate(Vertex m, float a); virtual void rotate(Vertex m, float a);
virtual const Vertex* getVertex(size_t id) const { virtual const Vertex* getVertex(size_t id) const {

2
Tool.h
View file

@ -22,6 +22,8 @@ class Tool : public Object {
virtual GtkWidget* getImage() = 0; virtual GtkWidget* getImage() = 0;
virtual bool isSensitive() = 0; virtual bool isSensitive() = 0;
virtual bool hoverFilter(const LevelObject &object) const = 0;
virtual EventHandler* getEventHandler() = 0; virtual EventHandler* getEventHandler() = 0;
virtual Sidebar* getSidebar() = 0; virtual Sidebar* getSidebar() = 0;
virtual Renderer* getRenderer() {return NULL;} virtual Renderer* getRenderer() {return NULL;}

View file

@ -16,7 +16,6 @@ ToolAddPolygon::~ToolAddPolygon() {
void ToolAddPolygon::activate() { void ToolAddPolygon::activate() {
newRoom = Room(); newRoom = Room();
editManager->setHighlightedObject(NULL);
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }

View file

@ -4,6 +4,7 @@
#include "Tool.h" #include "Tool.h"
#include "EditManager.h" #include "EditManager.h"
#include "SidebarAdd.h" #include "SidebarAdd.h"
#include "LevelVertex.h"
class ToolAddPolygon : public Tool, private EventHandler, private Renderer { class ToolAddPolygon : public Tool, private EventHandler, private Renderer {
@ -43,6 +44,13 @@ class ToolAddPolygon : public Tool, private EventHandler, private Renderer {
return image; return image;
} }
virtual bool hoverFilter(const LevelObject &object) const {
if(!object.isOfType("LevelVertex"))
return false;
return ((LevelVertex*)&object)->canConnect();
}
virtual EventHandler* getEventHandler() { virtual EventHandler* getEventHandler() {
return this; return this;
} }

View file

@ -28,7 +28,6 @@ ToolAddRect::~ToolAddRect() {
} }
void ToolAddRect::activate() { void ToolAddRect::activate() {
editManager->setHighlightedObject(NULL);
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }

View file

@ -44,6 +44,10 @@ class ToolAddRect : public Tool, public EventHandler, public Renderer {
return image; return image;
} }
virtual bool hoverFilter(const LevelObject &object) const {
return false;
}
virtual EventHandler* getEventHandler() { virtual EventHandler* getEventHandler() {
return this; return this;
} }

View file

@ -15,7 +15,6 @@ ToolGrab::~ToolGrab() {
void ToolGrab::activate() { void ToolGrab::activate() {
pressed = false; pressed = false;
editManager->highlightHoveredObject();
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }
@ -49,10 +48,8 @@ bool ToolGrab::buttonRelease(unsigned int button, const Vertex *v) {
} }
bool ToolGrab::motion(const Vertex *v) { bool ToolGrab::motion(const Vertex *v) {
if(!pressed) { if(!pressed)
editManager->highlightHoveredObject(); return false;
return true;
}
if(!v) if(!v)
return false; return false;

View file

@ -6,7 +6,7 @@
#include "SidebarView.h" #include "SidebarView.h"
class ToolGrab : public Tool, public EventHandler { class ToolGrab : public Tool, private EventHandler {
private: private:
GtkWidget *image; GtkWidget *image;
@ -43,6 +43,10 @@ class ToolGrab : public Tool, public EventHandler {
return image; return image;
} }
virtual bool hoverFilter(const LevelObject &object) const {
return object.canMove();
}
virtual EventHandler* getEventHandler() { virtual EventHandler* getEventHandler() {
return this; return this;
} }

View file

@ -17,12 +17,11 @@ ToolRotate::~ToolRotate() {
void ToolRotate::activate() { void ToolRotate::activate() {
pressed = false; pressed = false;
editManager->highlightHoveredObject();
editManager->setSelectedObject(NULL); editManager->setSelectedObject(NULL);
} }
bool ToolRotate::buttonPress(unsigned int button, const Vertex *v) { bool ToolRotate::buttonPress(unsigned int button, const Vertex *v) {
if(button != 1 || !v) if(button != 1 || !editManager->getHoveredObject())
return false; return false;
pressed = true; pressed = true;
@ -52,10 +51,8 @@ bool ToolRotate::buttonRelease(unsigned int button, const Vertex *v) {
} }
bool ToolRotate::motion(const Vertex *v, float scale) { bool ToolRotate::motion(const Vertex *v, float scale) {
if(!pressed) { if(!pressed)
editManager->highlightHoveredObject(); return false;
return true;
}
if(!v) if(!v)
return false; return false;

View file

@ -43,6 +43,10 @@ class ToolRotate : public Tool, private EventHandler, private Renderer {
return image; return image;
} }
virtual bool hoverFilter(const LevelObject &object) const {
return object.canRotate();
}
virtual EventHandler* getEventHandler() { virtual EventHandler* getEventHandler() {
return this; return this;
} }

View file

@ -26,10 +26,6 @@ class ToolSelector : public Tool, public EventHandler {
return "ToolSelector"; return "ToolSelector";
} }
virtual void activate() {
editManager->highlightHoveredObject();
}
virtual const char *getName() const { virtual const char *getName() const {
return "Select"; return "Select";
} }
@ -42,18 +38,16 @@ class ToolSelector : public Tool, public EventHandler {
return image; return image;
} }
virtual bool hoverFilter(const LevelObject &object) const {
return true;
}
virtual EventHandler *getEventHandler() { virtual EventHandler *getEventHandler() {
return this; return this;
} }
virtual bool buttonPress(unsigned int button, const Vertex *v); virtual bool buttonPress(unsigned int button, const Vertex *v);
virtual bool motion(const Vertex *v) {
editManager->highlightHoveredObject();
return true;
}
virtual Sidebar* getSidebar() { virtual Sidebar* getSidebar() {
return &sidebar; return &sidebar;
} }

View file

@ -13,6 +13,9 @@ class VertexProvider {
virtual void moveVertex(size_t id, float x, float y) {} virtual void moveVertex(size_t id, float x, float y) {}
virtual void rotateVertex(size_t id, Vertex m, float a) {} virtual void rotateVertex(size_t id, Vertex m, float a) {}
virtual bool canConnectVertex(size_t id) const {return false;}
virtual void connectVertex(size_t id) {}
}; };
#endif /*VERTEXPROVIDER_H_*/ #endif /*VERTEXPROVIDER_H_*/