Commit 4d80c1dd5184bd4468684903ae0c66ce77472f67

Authored by David Mayerich
1 parent 59071526

added a GLUT template header file that can be added to GLUT projects to create a…

… standard visualization environment
Showing 2 changed files with 103 additions and 1 deletions   Show diff stats
stim/image/image.h
1 1 #ifndef STIM_IMAGE_H
2 2 #define STIM_IMAGE_H
3 3  
  4 +#ifdef _WIN32
  5 +#undef max
  6 +#endif
  7 +
4 8 #ifdef USING_OPENCV
5 9 //#include <opencv2/core/core.hpp>
6 10 //#include <opencv2/highgui/highgui.hpp>
... ... @@ -11,7 +15,6 @@
11 15 #include <vector>
12 16 #include <iostream>
13 17 #include <climits> //use limits and remove the MIN and MAX macros
14   -#define NOMINMAX
15 18 #include <typeinfo>
16 19 #include <fstream>
17 20 #include <cstring>
... ...
stim/visualization/glut_template.h 0 → 100644
  1 +/* Don't change this file. Make a copy in your project and change parameters as necessary. */
  2 +
  3 +#ifndef GLUT_TEMPLATE_H
  4 +#define GLUT_TEMPLATE_H
  5 +
  6 +#include <stim/visualization/camera.h>
  7 +#include <GL/glut.h>
  8 +
  9 +struct glut_template_struct {
  10 + float theta_scale = 0.01f;
  11 + float phi_scale = 0.01f;
  12 + float zoom_scale = 0.1f;
  13 + stim::camera cam; //create a camera object
  14 + int mx, my; //mouse coordinates in the window space
  15 + float d = 1.5; //initial distance between the camera and the sphere
  16 + bool rotate_zoom = true; //sets the current camera mode (rotation = true, zoom = false)
  17 +
  18 + bool axis = false; //render the z-axis (set via a command line flag)
  19 +} gt;
  20 +
  21 +//render the XYZ axes
  22 +void render_axes() {
  23 + glDisable(GL_TEXTURE_2D); //turn off texture mapping
  24 + glBegin(GL_LINES);
  25 + glColor3f(1.0f, 0.0f, 0.0f); //set the color to RED and render X
  26 + glVertex3f(0.0, 0.0, 0.0);
  27 + glVertex3f(100.0, 0.0, 0.0);
  28 +
  29 + glColor3f(0.0f, 1.0f, 0.0f); //set the color to RED and render X
  30 + glVertex3f(0.0, 0.0, 0.0);
  31 + glVertex3f(0.0, 100.0, 0.0);
  32 +
  33 + glColor3f(0.0f, 0.0f, 1.0f); //set the color to RED and render X
  34 + glVertex3f(0.0, 0.0, 0.0);
  35 + glVertex3f(0.0, 0.0, 100.0);
  36 + glEnd();
  37 +}
  38 +
  39 +//display function executed to update every frame
  40 +void glut_display() {
  41 +
  42 + glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); //clear the screen
  43 +
  44 + glMatrixMode(GL_PROJECTION); //put the projection matrix on the stack
  45 + glLoadIdentity(); //set it to the identity matrix
  46 + gluPerspective(gt.cam.getFOV(), 1, 0.001, 1000000); //set up a perspective projection
  47 + glMatrixMode(GL_MODELVIEW); //load the model view matrix to the stack
  48 + glLoadIdentity(); //set it to the identity matrix
  49 + stim::vec3<float> p = gt.cam.getPosition(); //get the camera parameters
  50 + stim::vec3<float> u = gt.cam.getUp();
  51 + stim::vec3<float> d = gt.cam.getDirection();
  52 + gluLookAt(p[0], p[1], p[2], d[0], d[1], d[2], u[0], u[1], u[2]); //specify the camera parameters to OpenGL
  53 +
  54 +
  55 + render_axes(); //render the axes if the user requests them
  56 + glutSwapBuffers(); //swap in the back buffer (double-buffering is used to prevent tearing)
  57 +}
  58 +
  59 +//process mouse press events
  60 +void glut_mouse_press(int button, int state, int x, int y) {
  61 + if (button == GLUT_LEFT_BUTTON) //set the camera motion mode based on the mouse button pressed
  62 + gt.rotate_zoom = true;
  63 + else if (button == GLUT_RIGHT_BUTTON)
  64 + gt.rotate_zoom = false;
  65 + if (state == GLUT_DOWN) { //if the mouse is pressed
  66 + gt.mx = x; gt.my = y; //set the current mouse position
  67 + }
  68 +}
  69 +
  70 +//process mouse drags to update the camera
  71 +void glut_mouse_drag(int x, int y) {
  72 + if (gt.rotate_zoom == true) { //if the camera is in rotation mode, rotate
  73 + float theta = gt.theta_scale * (gt.mx - x);
  74 + float phi = -gt.phi_scale * (gt.my - y);
  75 + gt.cam.OrbitFocus(theta, phi); //if the mouse is dragged
  76 + }
  77 + else { //otherwize zoom
  78 + gt.cam.Push(gt.zoom_scale*(gt.my - y));
  79 + }
  80 + gt.mx = x; gt.my = y; //update the mouse position
  81 + glutPostRedisplay();
  82 +}
  83 +
  84 +void glut_init(int argc, char* argv[]) {
  85 + glutInit(&argc, argv); //initialize GLUT
  86 + glutInitWindowSize(500, 500); //set the size of the GLUT window
  87 + glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA | GLUT_DOUBLE);
  88 + glutCreateWindow("3D Tensor Visualization"); //create the GLUT window (and an OpenGL context)
  89 + glutDisplayFunc(glut_display); //set the display function (which will be called repeatedly by glutMainLoop)
  90 + glutMouseFunc(glut_mouse_press); //set the mouse press function (called when a mouse button is pressed)
  91 + glutMotionFunc(glut_mouse_drag); //set the mouse motion function (which will be called any time the mouse is dragged)
  92 + glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //set the clear color to white
  93 + gt.cam.setPosition(gt.d, gt.d, gt.d); //initialize the camera
  94 + gt.cam.LookAt(0, 0, 0, 0, 1, 1);
  95 + gt.cam.setFOV(40);
  96 + glutMainLoop(); //enter the main loop
  97 +}
  98 +
  99 +#endif
0 100 \ No newline at end of file
... ...