diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-23 19:56:46 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-23 19:56:46 (GMT) |
commit | 4daae374011de97aafa999f2353e2c7d17511046 (patch) | |
tree | bc51daf75fb7d4be3d17ed4fd3206f08bf7d0aee /glview.cc | |
parent | 0fcdcb6bd6117e8e8ccaff15b0a083c2f76266a6 (diff) |
Clifford Wolf:
Added GUI
git-svn-id: http://svn.clifford.at/openscad/trunk@13 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'glview.cc')
-rw-r--r-- | glview.cc | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/glview.cc b/glview.cc new file mode 100644 index 0000000..db9a303 --- /dev/null +++ b/glview.cc @@ -0,0 +1,138 @@ +/* + * OpenSCAD (www.openscad.at) + * Copyright (C) 2009 Clifford Wolf <clifford@clifford.at> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "openscad.h" + +#include <QWheelEvent> +#include <QMouseEvent> + +#define FAR_FAR_AWAY 100000.0 + +GLView::GLView(QWidget *parent) : QGLWidget(parent) +{ + viewer_distance = 10; + object_rot_y = 0; + object_rot_z = 0; + + mouse_drag_active = false; + last_mouse_x = 0; + last_mouse_y = 0; + + renderfunc = NULL; + renderfunc_vp = NULL; + + setMouseTracking(true); +} + +void GLView::initializeGL() +{ + glEnable(GL_DEPTH_TEST); + glDepthRange(-FAR_FAR_AWAY, +FAR_FAR_AWAY); + + glClearColor(1.0, 1.0, 0.9, 0.0); +} + +void GLView::resizeGL(int w, int h) +{ + glViewport(0, 0, (GLint)w, (GLint)h); +} + +void GLView::paintGL() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, +1.0, -1.0, +1.0, +10.0, +FAR_FAR_AWAY); + gluLookAt(0.0, -viewer_distance, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotated(object_rot_y, 1.0, 0.0, 0.0); + glRotated(object_rot_z, 0.0, 0.0, 1.0); + +#if 0 + glColor3d(0.0, 0.0, 1.0); + glBegin(GL_LINES); + glVertex3d(0, 0, 0); glVertex3d(10, 0, 0); + glVertex3d(0, 0, 0); glVertex3d(0, 10, 0); + glVertex3d(0, 0, 0); glVertex3d(0, 0, 10); + glEnd(); +#endif + + if (renderfunc) + renderfunc(renderfunc_vp); + + glColor3d(1.0, 0.0, 0.0); + for (int i=0; i<polygons.size(); i++) { + Polygon *poly = &polygons[i]; + glBegin(GL_POLYGON); + for (int j=0; j<poly->size(); j++) { + const Point *p = &poly->at(j); + glVertex3d(p->x, p->y, p->z); + } + glEnd(); + } + + glColor3d(0.5, 0.0, 0.0); + for (int i=0; i<polygons.size(); i++) { + Polygon *poly = &polygons[i]; + glBegin(GL_LINE_LOOP); + for (int j=0; j<poly->size(); j++) { + const Point *p = &poly->at(j); + glVertex3d(p->x, p->y, p->z); + } + glEnd(); + } +} + +void GLView::wheelEvent(QWheelEvent *event) +{ + viewer_distance *= pow(0.9, event->delta() / 120.0); + updateGL(); +} + +void GLView::mousePressEvent(QMouseEvent *event) +{ + mouse_drag_active = true; + last_mouse_x = event->globalX(); + last_mouse_y = event->globalY(); + grabMouse(); +} + +void GLView::mouseMoveEvent(QMouseEvent *event) +{ + int this_mouse_x = event->globalX(); + int this_mouse_y = event->globalY(); + if (mouse_drag_active) { + object_rot_y += (this_mouse_y-last_mouse_y) * 0.7; + object_rot_z += (this_mouse_x-last_mouse_x) * 0.7; + updateGL(); + } + last_mouse_x = this_mouse_x; + last_mouse_y = this_mouse_y; +} + +void GLView::mouseReleaseEvent(QMouseEvent*) +{ + mouse_drag_active = false; + releaseMouse(); +} + |