Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /examples/vr-demo/main.c
ViewVC logotype

Annotation of /examples/vr-demo/main.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2063 - (view) (download) (as text)

1 : jhr 2058 /*! \file main.c
2 :     *
3 :     * \author John Reppy
4 :     *
5 :     * Main program for Diderot VR viewer.
6 :     */
7 :    
8 :     /*
9 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
10 :     * All rights reserved.
11 :     */
12 :    
13 :     #include "GL/glfw.h"
14 :     #include "util.h"
15 : jhr 2063 #include "vr.h"
16 : jhr 2058 #include <unistd.h>
17 :    
18 : jhr 2061 /* minimum and maximum values from */
19 :     #define MIN_VALUE 0
20 :     #define MAX_VALUE 2632
21 :    
22 :     /* half the width of the opacity range */
23 :     #define OPAC_HALF_WID 150
24 :    
25 :     #define MIN_OPAC_MID ((float)(MIN_VALUE+OPAC_HALF_WID))
26 :     #define MAX_OPAC_MID ((float)(MAX_VALUE-OPAC_HALF_WID))
27 :    
28 : jhr 2058 /* pixel dimensions of output */
29 : jhr 2061 #define WIDTH 480
30 :     #define HEIGHT 345
31 : jhr 2058
32 :     /* world bounds */
33 :     #define WRLD_MIN_X 0.0
34 :     #define WRLD_MIN_Y 0.0
35 :     #define WRLD_MAX_X 1.0
36 :     #define WRLD_MAX_Y 1.0
37 :     #define WRLD_CENTER_X 0.5
38 :     #define WRLD_CENTER_Y 0.5
39 :    
40 :     #define STEP_SIZE 1
41 :     #define SLEEP_MS 250
42 :    
43 :     static inline void CheckError ()
44 :     {
45 :     GLenum errCode;
46 :     if ((errCode = glGetError()) != GL_NO_ERROR) {
47 :     fprintf(stderr, "OpenGL error: %s\n", gluErrorString(errCode));
48 :     exit (1);
49 :     }
50 :     }
51 :    
52 :     /***** Globals for viewing, etc. *****/
53 :    
54 :     Nrrd *Diderot; // input image nrrd
55 :     unsigned int Width; // view window width
56 :     unsigned int Height; // view window height
57 : jhr 2063 bool NeedsRedraw;
58 :     bool NeedsRecompute;
59 : jhr 2058
60 :    
61 : jhr 2061
62 : jhr 2058 // Callback function called by GLUT to render screen
63 :     void Draw (Nrrd *img)
64 :     {
65 :     // Clear frame buffer
66 :     glClearColor (0, 0, 0, 1);
67 :     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
68 :    
69 :     glDisable(GL_DEPTH_TEST);
70 :     glDisable(GL_CULL_FACE);
71 :    
72 :     // Draw image
73 : jhr 2062 glDrawPixels (Width, Height, GL_RGBA, GL_FLOAT, img->data);
74 : jhr 2058 CheckError ();
75 :    
76 :     // Present frame buffer
77 :     glfwSwapBuffers();
78 :     }
79 :    
80 :     // Callback function called by GLFW when window size changes
81 :     void GLFWCALL WindowSizeCB (int width, int height)
82 :     {
83 :     printf("window size = %d x %d\n", width, height);
84 :     // Set OpenGL viewport and camera
85 :     glViewport(0, 0, width, height);
86 :    
87 :     glMatrixMode (GL_PROJECTION);
88 :     glLoadIdentity ();
89 :     double pad = 0.05*(WRLD_MAX_X - WRLD_MIN_X); // add 10% to world dimensions
90 :     gluOrtho2D (
91 :     WRLD_MIN_X - pad, WRLD_MAX_X + pad,
92 :     WRLD_MAX_Y + pad, WRLD_MIN_Y - pad);
93 :    
94 :     glMatrixMode (GL_MODELVIEW);
95 :     glLoadIdentity ();
96 :     gluLookAt (
97 :     // WRLD_CENTER_X, WRLD_CENTER_Y, 1.0,
98 :     0.0, 0.0, 1.0,
99 :     // WRLD_CENTER_X, WRLD_CENTER_Y, 0.0,
100 :     0.0, 0.0, 0.0,
101 :     0.0, 1.0, 0.0);
102 :    
103 :     // remember width and height
104 :     Width = width;
105 :     Height = height;
106 :    
107 :     }
108 :    
109 : jhr 2063 void GetData (VR_World_t *wrld, Nrrd *nRGB)
110 : jhr 2058 {
111 : jhr 2063 if (VR_OutputGet_outRGBA (wrld, nRGB)) {
112 : jhr 2058 // error
113 : jhr 2063 fprintf(stderr, "Error getting nrrd data\n");
114 :     exit(1);
115 : jhr 2058 }
116 :     }
117 :    
118 :     int main (int argc, const char **argv)
119 :     {
120 :     // Initialize GLFW
121 :     if (0 == glfwInit()) {
122 :     // An error occured
123 :     fprintf(stderr, "GLFW initialization failed\n");
124 :     return 1;
125 :     }
126 :    
127 :     GLFWvidmode mode;
128 :     glfwGetDesktopMode (&mode);
129 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
130 :     // A fatal error occured
131 :     fprintf(stderr, "Cannot open GLFW window\n");
132 :     glfwTerminate();
133 :     return 1;
134 :     }
135 :     glfwEnable(GLFW_KEY_REPEAT);
136 : jhr 2061 glfwSetWindowTitle("Diderot VR Demo");
137 : jhr 2058
138 :     // Set GLFW event callbacks
139 :     glfwSetWindowSizeCallback (WindowSizeCB);
140 : jhr 2063 /* FIXME: set up key callback */
141 : jhr 2058
142 :     // initialize the Diderot program
143 : jhr 2061 VR_World_t *wrld = VR_Init ();
144 : jhr 2058
145 :     // nrrd for getting computational state
146 : jhr 2061 Nrrd *nRGB = nrrdNew();
147 : jhr 2058
148 :     // get and render initial state
149 : jhr 2063 GetData (wrld, nRGB);
150 :     Draw (nRGB);
151 : jhr 2058
152 :     // Main loop (repeated while window is not closed and [ESC] is not pressed)
153 : jhr 2062 NeedsRecompute = true;
154 : jhr 2058 while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
155 : jhr 2061 if (NeedsRecompute) {
156 :     // recompute
157 :     VR_Initially (wrld);
158 :     VR_Run (wrld, 0);
159 :     // get output image
160 :     if (VR_OutputGet_outRGBA (wrld, nRGB)) {
161 :     // error
162 :     fprintf(stderr, "Error getting nrrd data\n");
163 :     exit(1);
164 :     }
165 : jhr 2063 NeedsRedraw = true;
166 : jhr 2061 }
167 :     if (NeedsRedraw) {
168 : jhr 2063 Draw (nRGB);
169 :     NeedsRedraw = false;
170 : jhr 2061 }
171 :     glfwWaitEvents();
172 : jhr 2058 }
173 :    
174 :     // shutdown the world
175 : jhr 2061 VR_Shutdown (wrld);
176 : jhr 2058
177 : jhr 2063 // Terminate GLFW
178 : jhr 2058 glfwTerminate();
179 :    
180 :     return 0;
181 :     }

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0