zoomedit:
* Calculate model dimensions
This commit is contained in:
parent
bb09e9e703
commit
cfd608527e
5 changed files with 95 additions and 51 deletions
|
@ -49,20 +49,16 @@ RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade:
|
||||||
|
|
||||||
Gtk::ToolButton *button;
|
Gtk::ToolButton *button;
|
||||||
xml->get_widget("ToolButtonZoomIn", button);
|
xml->get_widget("ToolButtonZoomIn", button);
|
||||||
if(button)
|
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), 2, 0.5f, 0.5f));
|
||||||
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), 2, 0.5f, 0.5f));
|
|
||||||
|
|
||||||
xml->get_widget("ToolButtonZoomOut", button);
|
xml->get_widget("ToolButtonZoomOut", button);
|
||||||
if(button)
|
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), -2, 0.5f, 0.5f));
|
||||||
button->signal_clicked().connect(sigc::bind(sigc::mem_fun(this, &RenderArea::zoom), -2, 0.5f, 0.5f));
|
|
||||||
|
|
||||||
xml->get_widget("Hscrollbar", hScrollbar);
|
xml->get_widget("Hscrollbar", hScrollbar);
|
||||||
if(hScrollbar)
|
hScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling));
|
||||||
hScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling));
|
|
||||||
|
|
||||||
xml->get_widget("Vscrollbar", vScrollbar);
|
xml->get_widget("Vscrollbar", vScrollbar);
|
||||||
if(vScrollbar)
|
vScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling));
|
||||||
vScrollbar->signal_value_changed().connect(sigc::mem_fun(this, &RenderArea::updateScrolling));
|
|
||||||
|
|
||||||
gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, 0, TRUE, GDK_GL_RGBA_TYPE);
|
gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, 0, TRUE, GDK_GL_RGBA_TYPE);
|
||||||
}
|
}
|
||||||
|
@ -152,63 +148,69 @@ void RenderArea::updateViewport() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderArea::updateScrollbars(float x, float y) {
|
void RenderArea::updateScrollbars(float x, float y) {
|
||||||
const gdouble imageWidth = getImageWidth(), imageHeight = getImageHeight();
|
float minX, maxX, minY, maxY;
|
||||||
const gdouble minX = -imageWidth/2, maxX = imageWidth/2;
|
|
||||||
const gdouble minY = -imageHeight/2, maxY = imageHeight/2;
|
|
||||||
const gdouble width = getViewWidth(), height = getViewHeight();
|
const gdouble width = getViewWidth(), height = getViewHeight();
|
||||||
gdouble lower, upper, pageSize, value;
|
gdouble lower, upper, pageSize, value;
|
||||||
|
|
||||||
|
if(!view)
|
||||||
|
return;
|
||||||
|
|
||||||
|
view->getBounds(&minX, &maxX, &minY, &maxY);
|
||||||
|
float xVal = std::max(std::fabs(minX), std::fabs(maxX));
|
||||||
|
float yVal = std::max(std::fabs(minY), std::fabs(maxY));
|
||||||
|
|
||||||
get_window()->freeze_updates();
|
get_window()->freeze_updates();
|
||||||
|
|
||||||
if(hScrollbar) {
|
lower = hScrollbar->get_adjustment()->get_lower();
|
||||||
lower = hScrollbar->get_adjustment()->get_lower();
|
upper = hScrollbar->get_adjustment()->get_upper();
|
||||||
upper = hScrollbar->get_adjustment()->get_upper();
|
pageSize = hScrollbar->get_adjustment()->get_page_size();
|
||||||
pageSize = hScrollbar->get_adjustment()->get_page_size();
|
|
||||||
|
|
||||||
hScrollbar->get_adjustment()->set_lower(minX + width/2);
|
hScrollbar->get_adjustment()->set_lower(-xVal + width/2);
|
||||||
hScrollbar->get_adjustment()->set_upper(maxX + width/2);
|
hScrollbar->get_adjustment()->set_upper(xVal + width/2);
|
||||||
hScrollbar->get_adjustment()->set_page_size(width);
|
hScrollbar->get_adjustment()->set_page_size(width);
|
||||||
|
|
||||||
if(pageSize > (upper-lower) && width < imageWidth)
|
if(pageSize > (upper-lower) && width < 2*xVal)
|
||||||
value = 0;
|
value = 0;
|
||||||
else
|
else
|
||||||
value = hScrollbar->get_value() + (x-0.5)*(pageSize-width);
|
value = hScrollbar->get_value() + (x-0.5)*(pageSize-width);
|
||||||
|
|
||||||
hScrollbar->set_value(std::max(std::min(value, maxX - width/2), minX + width/2));
|
hScrollbar->set_value(std::max(std::min(value, xVal - width/2), -xVal + width/2));
|
||||||
}
|
|
||||||
|
|
||||||
if(vScrollbar) {
|
lower = vScrollbar->get_adjustment()->get_lower();
|
||||||
lower = vScrollbar->get_adjustment()->get_lower();
|
upper = vScrollbar->get_adjustment()->get_upper();
|
||||||
upper = vScrollbar->get_adjustment()->get_upper();
|
pageSize = vScrollbar->get_adjustment()->get_page_size();
|
||||||
pageSize = vScrollbar->get_adjustment()->get_page_size();
|
|
||||||
|
|
||||||
vScrollbar->get_adjustment()->set_lower(minY + height/2);
|
vScrollbar->get_adjustment()->set_lower(-yVal + height/2);
|
||||||
vScrollbar->get_adjustment()->set_upper(maxY + height/2);
|
vScrollbar->get_adjustment()->set_upper(yVal + height/2);
|
||||||
vScrollbar->get_adjustment()->set_page_size(height);
|
vScrollbar->get_adjustment()->set_page_size(height);
|
||||||
|
|
||||||
if(pageSize > (upper-lower) && height < imageHeight)
|
if(pageSize > (upper-lower) && height < 2*yVal)
|
||||||
value = 0;
|
value = 0;
|
||||||
else
|
else
|
||||||
value = vScrollbar->get_value() + (y-0.5)*(pageSize-height);
|
value = vScrollbar->get_value() + (y-0.5)*(pageSize-height);
|
||||||
|
|
||||||
vScrollbar->set_value(std::max(std::min(value, maxY - height/2), minY + height/2));
|
vScrollbar->set_value(std::max(std::min(value, yVal - height/2), -yVal + height/2));
|
||||||
}
|
|
||||||
|
|
||||||
get_window()->thaw_updates();
|
get_window()->thaw_updates();
|
||||||
|
|
||||||
updateScrolling();
|
updateScrollingWithSize(2*xVal, 2*yVal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderArea::updateScrolling() {
|
void RenderArea::updateScrolling() {
|
||||||
|
updateScrollingWithSize(hScrollbar->get_adjustment()->get_upper()-hScrollbar->get_adjustment()->get_lower(),
|
||||||
|
vScrollbar->get_adjustment()->get_upper()-vScrollbar->get_adjustment()->get_lower());
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderArea::updateScrollingWithSize(float imageWidth, float imageHeight) {
|
||||||
if(hScrollbar) {
|
if(hScrollbar) {
|
||||||
if(getImageWidth() < getViewWidth())
|
if(imageWidth < getViewWidth())
|
||||||
xCenter = 0;
|
xCenter = 0;
|
||||||
else
|
else
|
||||||
xCenter = hScrollbar->get_value();
|
xCenter = hScrollbar->get_value();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(vScrollbar) {
|
if(vScrollbar) {
|
||||||
if(getImageHeight() < getViewHeight())
|
if(imageHeight < getViewHeight())
|
||||||
yCenter = 0;
|
yCenter = 0;
|
||||||
else
|
else
|
||||||
yCenter = vScrollbar->get_value();
|
yCenter = vScrollbar->get_value();
|
||||||
|
|
|
@ -51,9 +51,6 @@ class RenderArea : public Gtk::DrawingArea {
|
||||||
return get_height()/scale;
|
return get_height()/scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
float getImageWidth() const {return 10;}
|
|
||||||
float getImageHeight() const {return 10;}
|
|
||||||
|
|
||||||
float getScale() const {return scale;}
|
float getScale() const {return scale;}
|
||||||
|
|
||||||
float getXCenter() const {return xCenter;}
|
float getXCenter() const {return xCenter;}
|
||||||
|
@ -82,6 +79,7 @@ class RenderArea : public Gtk::DrawingArea {
|
||||||
void updateViewport();
|
void updateViewport();
|
||||||
void updateScrollbars(float x = 0.5f, float y = 0.5f);
|
void updateScrollbars(float x = 0.5f, float y = 0.5f);
|
||||||
void updateScrolling();
|
void updateScrolling();
|
||||||
|
void updateScrollingWithSize(float imageWidth, float imageHeight);
|
||||||
|
|
||||||
bool gdkGLBegin() {
|
bool gdkGLBegin() {
|
||||||
GtkWidget *widget = GTK_WIDGET(gobj());
|
GtkWidget *widget = GTK_WIDGET(gobj());
|
||||||
|
|
|
@ -154,5 +154,47 @@ void TopView::render(Gui::RenderArea *renderArea) {
|
||||||
renderRoom(*room);
|
renderRoom(*room);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TopView::getBounds(float *minX, float *maxX, float *minY, float *maxY) {
|
||||||
|
if(!level)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(minX)
|
||||||
|
*minX = 0;
|
||||||
|
if(maxX)
|
||||||
|
*maxX = 0;
|
||||||
|
if(minY)
|
||||||
|
*minY = 0;
|
||||||
|
if(maxY)
|
||||||
|
*maxY = 0;
|
||||||
|
|
||||||
|
const std::list<Data::Room*> &rooms = level->getRooms();
|
||||||
|
|
||||||
|
for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) {
|
||||||
|
const std::list<Data::Triangle*> &triangles = (*room)->getFloorTriangles();
|
||||||
|
|
||||||
|
for(std::list<Data::Triangle*>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
|
||||||
|
const Data::Vertex &v1 = (*t)->getVertex(0), &v2 = (*t)->getVertex(1), &v3 = (*t)->getVertex(2);
|
||||||
|
|
||||||
|
if(minX)
|
||||||
|
*minX = std::min(std::min(*minX, v1.getX()), std::min(v2.getX(), v3.getX()));
|
||||||
|
if(maxX)
|
||||||
|
*maxX = std::max(std::max(*maxX, v1.getX()), std::max(v2.getX(), v3.getX()));
|
||||||
|
if(minY)
|
||||||
|
*minY = std::min(std::min(*minY, v1.getZ()), std::min(v2.getZ(), v3.getZ()));
|
||||||
|
if(maxY)
|
||||||
|
*maxY = std::max(std::max(*maxY, v1.getZ()), std::max(v2.getZ(), v3.getZ()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(minX)
|
||||||
|
*minX -= 5;
|
||||||
|
if(maxX)
|
||||||
|
*maxX += 5;
|
||||||
|
if(minY)
|
||||||
|
*minY -= 5;
|
||||||
|
if(maxY)
|
||||||
|
*maxY += 5;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,6 @@ class TopView : public View {
|
||||||
bool edgeLess(const Edge &e1, const Edge &e2);
|
bool edgeLess(const Edge &e1, const Edge &e2);
|
||||||
|
|
||||||
void drawGrid(Gui::RenderArea *renderArea);
|
void drawGrid(Gui::RenderArea *renderArea);
|
||||||
|
|
||||||
void renderRoom(Data::Room *room);
|
void renderRoom(Data::Room *room);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -58,6 +57,8 @@ class TopView : public View {
|
||||||
void setLevel(Data::Level *level0) {level = level0;}
|
void setLevel(Data::Level *level0) {level = level0;}
|
||||||
|
|
||||||
virtual void render(Gui::RenderArea *renderArea);
|
virtual void render(Gui::RenderArea *renderArea);
|
||||||
|
|
||||||
|
virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ class View {
|
||||||
virtual ~View() {}
|
virtual ~View() {}
|
||||||
|
|
||||||
virtual void render(Gui::RenderArea *renderArea) = 0;
|
virtual void render(Gui::RenderArea *renderArea) = 0;
|
||||||
|
virtual void getBounds(float *minX, float *maxX, float *minY, float *maxY) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue