zoomedit: Einige Funktionen von draw.c in den Drawer verschoben.
This commit is contained in:
parent
9c73252173
commit
7b70cc94c7
4 changed files with 94 additions and 121 deletions
59
Drawer.cpp
59
Drawer.cpp
|
@ -33,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, &drawer->window->getLevel(), &drawer->window->getEditManager());
|
drawTopView(widget, &event->expose, drawer->window, drawer);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
case GDK_MOTION_NOTIFY:
|
case GDK_MOTION_NOTIFY:
|
||||||
|
@ -96,21 +96,21 @@ void Drawer::updateViewport() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrolling() {
|
void Drawer::updateScrolling() {
|
||||||
if(getImageWidth(&window->getLevel()) < getWidth())
|
if(getImageWidth() < getWidth())
|
||||||
setXTranslate((getImageWidth(&window->getLevel())-getWidth())/2);
|
xTranslate = (getImageWidth()-getWidth())/2;
|
||||||
else
|
else
|
||||||
setXTranslate(gtk_adjustment_get_value(hAdjustment));
|
xTranslate = gtk_adjustment_get_value(hAdjustment);
|
||||||
|
|
||||||
if(getImageHeight(&window->getLevel()) < getHeight())
|
if(getImageHeight() < getHeight())
|
||||||
setYTranslate((getImageHeight(&window->getLevel())-getHeight())/2);
|
yTranslate = (getImageHeight()-getHeight())/2;
|
||||||
else
|
else
|
||||||
setYTranslate(gtk_adjustment_get_value(vAdjustment));
|
yTranslate = gtk_adjustment_get_value(vAdjustment);
|
||||||
|
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Drawer::updateScrollbars(float x, float y) {
|
void Drawer::updateScrollbars(float x, float y) {
|
||||||
const gdouble imageWidth = getImageWidth(&window->getLevel()), imageHeight = getImageHeight(&window->getLevel());
|
const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight();
|
||||||
const gdouble width = getWidth(), height = getHeight();
|
const gdouble width = getWidth(), height = getHeight();
|
||||||
gdouble upper, pageSize, value;
|
gdouble upper, pageSize, value;
|
||||||
|
|
||||||
|
@ -143,13 +143,16 @@ 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(&window->getLevel(), &v);
|
viewToImage(&v);
|
||||||
window->getEditManager().setHoveredVertex(&v);
|
window->getEditManager().setHoveredVertex(&v);
|
||||||
}
|
}
|
||||||
|
|
||||||
Drawer::Drawer(Window *window, GdkGLConfig *glconfig) {
|
Drawer::Drawer(Window *window, GdkGLConfig *glconfig) {
|
||||||
this->window = window;
|
this->window = window;
|
||||||
zoomExp = 0;
|
zoomExp = 0;
|
||||||
|
scale = 100;
|
||||||
|
xTranslate = 0;
|
||||||
|
yTranslate = 0;
|
||||||
|
|
||||||
drawer = gtk_table_new(2, 2, FALSE);
|
drawer = gtk_table_new(2, 2, FALSE);
|
||||||
g_object_ref_sink(G_OBJECT(drawer));
|
g_object_ref_sink(G_OBJECT(drawer));
|
||||||
|
@ -188,7 +191,43 @@ Drawer::~Drawer() {
|
||||||
void Drawer::zoom(int zoom, float x, float y) {
|
void Drawer::zoom(int zoom, float x, float y) {
|
||||||
zoomExp = MAX(MIN(zoomExp + zoom, 50), -100);
|
zoomExp = MAX(MIN(zoomExp + zoom, 50), -100);
|
||||||
|
|
||||||
setScale(100*powf(1.1f, zoomExp));
|
scale = 100*powf(1.1f, zoomExp);
|
||||||
|
|
||||||
updateScrollbars(x, y);
|
updateScrollbars(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Drawer::imageToView(Vertex *v) {
|
||||||
|
v->setX(v->getX()*scale+getImageWidth()/2-xTranslate);
|
||||||
|
v->setY(v->getY()*scale+getImageHeight()/2-yTranslate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Drawer::viewToImage(Vertex *v) {
|
||||||
|
v->setX((v->getX()-getImageWidth()/2+xTranslate)/scale);
|
||||||
|
v->setY((v->getY()-getImageHeight()/2+yTranslate)/scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
float Drawer::getImageWidth() {
|
||||||
|
float min = 0, max = 0;
|
||||||
|
|
||||||
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
|
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
||||||
|
min = fminf(min, v->getX());
|
||||||
|
max = fmaxf(max, v->getX());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (max-min+10)*scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
float Drawer::getImageHeight() {
|
||||||
|
float min = 0, max = 0;
|
||||||
|
|
||||||
|
for(Level::iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
|
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
||||||
|
min = fminf(min, v->getY());
|
||||||
|
max = fmaxf(max, v->getY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (max-min+10)*scale;
|
||||||
|
}
|
||||||
|
|
23
Drawer.h
23
Drawer.h
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gtk/gtkgl.h>
|
#include <gtk/gtkgl.h>
|
||||||
|
#include "Vertex.h"
|
||||||
|
|
||||||
class Window;
|
class Window;
|
||||||
|
|
||||||
|
@ -17,6 +17,9 @@ class Drawer {
|
||||||
|
|
||||||
Window *window;
|
Window *window;
|
||||||
|
|
||||||
|
float scale;
|
||||||
|
float xTranslate, yTranslate;
|
||||||
|
|
||||||
// prevent shallow copy
|
// prevent shallow copy
|
||||||
Drawer(const Drawer &w);
|
Drawer(const Drawer &w);
|
||||||
const Drawer& operator=(const Drawer &w);
|
const Drawer& operator=(const Drawer &w);
|
||||||
|
@ -45,6 +48,24 @@ class Drawer {
|
||||||
|
|
||||||
void zoom(int zoom, float x = 0.5f, float y = 0.5f);
|
void zoom(int zoom, float x = 0.5f, float y = 0.5f);
|
||||||
|
|
||||||
|
void imageToView(Vertex *v);
|
||||||
|
void viewToImage(Vertex *v);
|
||||||
|
|
||||||
|
float getImageWidth();
|
||||||
|
float getImageHeight();
|
||||||
|
|
||||||
|
float getXTranslate() {
|
||||||
|
return xTranslate;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getYTranslate() {
|
||||||
|
return yTranslate;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getScale() {
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
GtkWidget *getWidget() {
|
GtkWidget *getWidget() {
|
||||||
return drawer;
|
return drawer;
|
||||||
}
|
}
|
||||||
|
|
113
draw.cpp
113
draw.cpp
|
@ -6,11 +6,7 @@
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
|
|
||||||
|
|
||||||
static float scale = 100.0;
|
static void drawGrid(const Rectangle &rect, float scale) {
|
||||||
static float xTranslate = 0.0, yTranslate = 0.0;
|
|
||||||
|
|
||||||
|
|
||||||
static void drawGrid(const Rectangle &rect) {
|
|
||||||
float depth = log10f(scale)-0.75f;
|
float depth = log10f(scale)-0.75f;
|
||||||
float depth2 = floorf(depth);
|
float depth2 = floorf(depth);
|
||||||
float step = powf(0.1f, depth2);
|
float step = powf(0.1f, depth2);
|
||||||
|
@ -96,17 +92,15 @@ static void drawPolygon(const Polygon &polygon, bool close) {
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, EditManager *editor) {
|
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Window *window, Drawer *drawer) {
|
||||||
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(level == NULL) return FALSE;
|
drawer->viewToImage(&v1);
|
||||||
|
drawer->viewToImage(&v2);
|
||||||
viewToImage(level, &v1);
|
|
||||||
viewToImage(level, &v2);
|
|
||||||
|
|
||||||
rect.setVertex1(v1);
|
rect.setVertex1(v1);
|
||||||
rect.setVertex2(v2);
|
rect.setVertex2(v2);
|
||||||
|
@ -121,26 +115,26 @@ gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, Edi
|
||||||
|
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
|
|
||||||
glTranslatef(getImageWidth(level)/2-xTranslate, getImageHeight(level)/2-yTranslate, 0);
|
glTranslatef(drawer->getImageWidth()/2-drawer->getXTranslate(), drawer->getImageHeight()/2-drawer->getYTranslate(), 0);
|
||||||
glScalef(scale, scale, 1);
|
glScalef(drawer->getScale(), drawer->getScale(), 1);
|
||||||
|
|
||||||
drawGrid(rect);
|
drawGrid(rect, drawer->getScale());
|
||||||
|
|
||||||
for(Level::const_iterator room = level->begin(); room != level->end(); room++) {
|
for(Level::const_iterator room = window->getLevel().begin(); room != window->getLevel().end(); room++) {
|
||||||
if(&*room == editor->getActiveRoom() && editor->getMode() == EditManager::ADD) continue;
|
if(&*room == window->getEditManager().getActiveRoom() && window->getEditManager().getMode() == EditManager::ADD) continue;
|
||||||
|
|
||||||
if(&*room == editor->getActiveRoom())
|
if(&*room == window->getEditManager().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 == editor->getActiveRoom()) {
|
if(&*room == window->getEditManager().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 == editor->getHoveredRoom() && editor->getMode() == EditManager::VIEW) {
|
else if(&*room == window->getEditManager().getHoveredRoom() && window->getEditManager().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);
|
||||||
}
|
}
|
||||||
|
@ -152,26 +146,26 @@ gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, Edi
|
||||||
drawPolygon(*room, true);
|
drawPolygon(*room, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(editor->getMode() == EditManager::ADD) {
|
if(window->getEditManager().getMode() == EditManager::ADD) {
|
||||||
if(editor->polygonOk(*editor->getActiveRoom()))
|
if(window->getEditManager().polygonOk(*window->getEditManager().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(*editor->getActiveRoom());
|
fillPolygon(*window->getEditManager().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(*editor->getActiveRoom(), false);
|
drawPolygon(*window->getEditManager().getActiveRoom(), false);
|
||||||
|
|
||||||
if(!editor->getActiveRoom()->empty() && editor->getHoveredVertex()) {
|
if(!window->getEditManager().getActiveRoom()->empty() && window->getEditManager().getHoveredVertex()) {
|
||||||
if(!editor->vertexOk(*editor->getHoveredVertex()))
|
if(!window->getEditManager().vertexOk(*window->getEditManager().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(editor->getActiveRoom()->back().getX(), editor->getActiveRoom()->back().getY());
|
glVertex2d(window->getEditManager().getActiveRoom()->back().getX(), window->getEditManager().getActiveRoom()->back().getY());
|
||||||
glVertex2d(editor->getHoveredVertex()->getX(), editor->getHoveredVertex()->getY());
|
glVertex2d(window->getEditManager().getHoveredVertex()->getX(), window->getEditManager().getHoveredVertex()->getY());
|
||||||
|
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
@ -185,70 +179,3 @@ gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, Edi
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float getScale() {
|
|
||||||
return scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setScale(float s) {
|
|
||||||
scale = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void imageToView(Level *level, Vertex *v) {
|
|
||||||
v->setX(v->getX()*scale+getImageWidth(level)/2-xTranslate);
|
|
||||||
v->setY(v->getY()*scale+getImageHeight(level)/2-yTranslate);
|
|
||||||
}
|
|
||||||
|
|
||||||
void viewToImage(Level *level, Vertex *v) {
|
|
||||||
v->setX((v->getX()-getImageWidth(level)/2+xTranslate)/scale);
|
|
||||||
v->setY((v->getY()-getImageHeight(level)/2+yTranslate)/scale);
|
|
||||||
}
|
|
||||||
|
|
||||||
float getImageWidth(Level *level) {
|
|
||||||
float min = 0.0, max = 0.0;
|
|
||||||
|
|
||||||
|
|
||||||
if(level) {
|
|
||||||
for(Level::iterator room = level->begin(); room != level->end(); room++) {
|
|
||||||
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
|
||||||
min = fminf(min, v->getX());
|
|
||||||
max = fmaxf(max, v->getX());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (max-min+10)*scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getImageHeight(Level *level) {
|
|
||||||
float min = 0.0, max = 0.0;
|
|
||||||
|
|
||||||
|
|
||||||
if(level) {
|
|
||||||
for(Level::iterator room = level->begin(); room != level->end(); room++) {
|
|
||||||
for(Room::iterator v = room->begin(); v != room->end(); v++) {
|
|
||||||
min = fminf(min, v->getY());
|
|
||||||
max = fmaxf(max, v->getY());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (max-min+10)*scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getXTranslate() {
|
|
||||||
return xTranslate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setXTranslate(float x) {
|
|
||||||
xTranslate = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
float getYTranslate() {
|
|
||||||
return yTranslate;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setYTranslate(float y) {
|
|
||||||
yTranslate = y;
|
|
||||||
}
|
|
||||||
|
|
20
draw.h
20
draw.h
|
@ -3,24 +3,10 @@
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include "Vertex.h"
|
#include "Vertex.h"
|
||||||
#include "EditManager.h"
|
#include "Window.h"
|
||||||
#include "Level.h"
|
#include "Drawer.h"
|
||||||
|
|
||||||
|
|
||||||
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Level *level, EditManager *editor);
|
gboolean drawTopView(GtkWidget *widget, GdkEventExpose *event, Window *window, Drawer *drawer);
|
||||||
|
|
||||||
float getScale();
|
|
||||||
void setScale(float s);
|
|
||||||
|
|
||||||
void imageToView(Level *level, Vertex *v);
|
|
||||||
void viewToImage(Level *level, Vertex *v);
|
|
||||||
|
|
||||||
float getImageWidth(Level *level);
|
|
||||||
float getImageHeight(Level *level);
|
|
||||||
|
|
||||||
float getXTranslate();
|
|
||||||
void setXTranslate(float x);
|
|
||||||
float getYTranslate();
|
|
||||||
void setYTranslate(float y);
|
|
||||||
|
|
||||||
#endif /*DRAW_H_*/
|
#endif /*DRAW_H_*/
|
||||||
|
|
Reference in a new issue