summaryrefslogtreecommitdiff
path: root/src/GudhUI/view/Viewer.cpp
diff options
context:
space:
mode:
authorsalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2015-01-27 10:20:13 +0000
committersalinasd <salinasd@636b058d-ea47-450e-bf9e-a15bfbe3eedb>2015-01-27 10:20:13 +0000
commitf527cde6342c5b8109a20f0a6b483327c6569844 (patch)
tree1c0464b56b21ef7767f814b9a35a6e5c68aa7613 /src/GudhUI/view/Viewer.cpp
parentdf6c26bdcb28805e8949d08dad5acd012e91ecb8 (diff)
Merge GudhUI, a UI for gudhi based on Qt
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/trunk@427 636b058d-ea47-450e-bf9e-a15bfbe3eedb Former-commit-id: 17fedd974f14a8225b27d94361e835964eeb5cba
Diffstat (limited to 'src/GudhUI/view/Viewer.cpp')
-rw-r--r--src/GudhUI/view/Viewer.cpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/GudhUI/view/Viewer.cpp b/src/GudhUI/view/Viewer.cpp
new file mode 100644
index 00000000..d8a35faf
--- /dev/null
+++ b/src/GudhUI/view/Viewer.cpp
@@ -0,0 +1,197 @@
+/*
+ * Viewer.cpp
+ *
+ * Created on: Aug 26, 2014
+ * Author: dsalinas
+ */
+
+#include "Viewer.h"
+#include "utils/UI_utils.h"
+
+Viewer::Viewer(QWidget* parent): QGLViewer(QGLFormat(QGL::SampleBuffers),parent),instructor(0),theta(0),phi(0){
+}
+
+void
+Viewer::set_instructor(Viewer_instructor* instructor_){
+ instructor = instructor_;
+}
+
+void
+Viewer::show_entire_scene(){
+ this->showEntireScene();
+}
+
+void
+Viewer::draw(){
+ instructor->give_instructions();
+}
+
+
+void
+Viewer::set_bounding_box(const Point_3 & lower_left,const Point_3 & upper_right){
+ this->camera()->setSceneBoundingBox(
+ qglviewer::Vec(lower_left[0], lower_left[1], lower_left[2]),
+ qglviewer::Vec(upper_right[0], upper_right[1], upper_right[2])
+ );
+}
+
+void
+Viewer::update_GL(){
+ this->updateGL();
+
+}
+
+void
+Viewer::init_scene(){
+ this->setBackgroundColor(Qt::white);
+ ::glEnable(GL_LINE_SMOOTH);
+ init_light();
+}
+
+void
+Viewer::init_light(){
+ ::glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+}
+
+void
+Viewer::set_light(){
+ if(theta>=0 && phi >=0){
+ const GLfloat pos[4] = {(float)(sin(phi)*cos(theta)),(float)(sin(phi)*sin(theta)),(float)(cos(phi)),0.};
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ }
+}
+
+void
+Viewer::set_light_direction(double theta_,double phi_){
+ theta = theta_;
+ phi = phi_;
+}
+
+/**
+ * set the light in the direction of the observer
+ */
+void
+Viewer::set_light_direction(){
+ theta = -1;
+ phi = -1;
+}
+
+
+void
+Viewer::postSelection(const QPoint& point){
+ bool found;
+
+ auto vec = this->camera()->pointUnderPixel(point,found);
+
+ if(found){
+ Point_3 position(vec[0],vec[1],vec[2]);
+ emit(click(position));
+ }
+}
+
+////////////////////////
+// draw
+////////////////////////
+void
+Viewer::set_size_point(double size_points){
+ ::glPointSize(size_points);
+}
+
+void
+Viewer::draw_point(const Point_3& p,const Color& color,double size_points){
+ ::glColor3f(color.r,color.g,color.b);
+ ::glDisable(GL_LIGHTING);
+ ::glEnable(GL_POINT_SMOOTH);
+ ::glPointSize(size_points);
+ ::glBegin(GL_POINTS);
+ ::glVertex3d(p.x(), p.y(), p.z());
+ ::glEnd();
+ ::glDisable(GL_POINT_SMOOTH);
+}
+
+void
+Viewer::begin_draw_points(double size,bool light){
+ light?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);
+ ::glEnable(GL_POINT_SMOOTH);
+ ::glPointSize(size);
+ ::glBegin(GL_POINTS);
+}
+
+void
+Viewer::set_color(const Color& color){
+ ::glColor3f(color.r,color.g,color.b);
+}
+
+void
+Viewer::draw_points(const Point_3 & point){
+ ::glVertex3d(point.x(),point.y(),point.z());
+}
+
+void
+Viewer::end_draw_points(){
+ ::glEnd();
+ ::glDisable(GL_POINT_SMOOTH);
+}
+
+void
+Viewer::draw_edge(const Point_3 &a,const Point_3 &b,const Color& color,double size){
+ ::glColor3f(color.r,color.g,color.b);
+ ::glPointSize(3.0);
+ ::glLineWidth(size);
+ ::glBegin(GL_LINES);
+ ::glVertex3f(a.x(),a.y(),a.z());
+ ::glVertex3f(b.x(),b.y(),b.z());
+ ::glEnd();
+}
+
+void
+Viewer::begin_draw_edges(double size,bool light){
+ ::glLineWidth(size);
+ ::glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+ ::glEnable(GL_POLYGON_OFFSET_LINE);
+ ::glPolygonOffset(3.0f,-3.0f);
+ light?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);
+ ::glBegin(GL_LINES);
+}
+
+void
+Viewer::draw_edges(const Point_3 &a,const Point_3 &b){
+ ::glVertex3f(a.x(),a.y(),a.z());
+ ::glVertex3f(b.x(),b.y(),b.z());
+}
+
+void
+Viewer::end_draw_edges(){
+ ::glEnd();
+}
+
+void
+Viewer::begin_draw_triangles(double size,bool light,bool transparent){
+ if(transparent){
+ ::glEnable (GL_BLEND);
+ ::glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ ::glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
+ ::glEnable(GL_POLYGON_OFFSET_FILL);
+ ::glPolygonOffset(3.0f,-3.0f);
+ light?glEnable(GL_LIGHTING):glDisable(GL_LIGHTING);
+ ::glBegin(GL_TRIANGLES);
+}
+
+void
+Viewer::draw_triangles(const Point_3& p1,const Point_3& p2,const Point_3& p3){
+ if(!CGAL::collinear(p1,p2,p3)){
+ auto triangle_normal = CGAL::unit_normal(p1,p2,p3);
+ ::glNormal3d(triangle_normal.x(),triangle_normal.y(),triangle_normal.z());
+ ::glVertex3d(p1.x(),p1.y(),p1.z());
+ ::glVertex3d(p2.x(),p2.y(),p2.z());
+ ::glVertex3d(p3.x(),p3.y(),p3.z());
+ }
+}
+
+void
+Viewer::end_draw_triangles(){
+ ::glEnd();
+}
+
+#include "Viewer.moc"