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 2079 - (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 : jhr 2079 #include "teem/air.h"
18 : jhr 2058
19 : jhr 2061 /* minimum and maximum values from */
20 :     #define MIN_VALUE 0
21 :     #define MAX_VALUE 2632
22 :    
23 :     /* half the width of the opacity range */
24 :     #define OPAC_HALF_WID 150
25 :    
26 :     #define MIN_OPAC_MID ((float)(MIN_VALUE+OPAC_HALF_WID))
27 :     #define MAX_OPAC_MID ((float)(MAX_VALUE-OPAC_HALF_WID))
28 :    
29 : jhr 2079 #define OPAC_DELTA 25
30 : jhr 2067
31 : jhr 2079 /* reduced-size inputs */
32 :     #define REDUCED_WID 256
33 :     #define REDUCED_HT 184
34 :     #define REDUCED_STEP 1
35 : jhr 2058
36 :    
37 : jhr 2079 /* full-size inputs */
38 :     #define FULL_WID 512
39 :     #define FULL_HT 368
40 :     #define FULL_STEP 0.5
41 :    
42 :     #define WIDTH (2*FULL_WID)
43 :     #define HEIGHT (2*FULL_HT)
44 :    
45 : jhr 2058 static inline void CheckError ()
46 :     {
47 :     GLenum errCode;
48 :     if ((errCode = glGetError()) != GL_NO_ERROR) {
49 :     fprintf(stderr, "OpenGL error: %s\n", gluErrorString(errCode));
50 :     exit (1);
51 :     }
52 :     }
53 :    
54 :     /***** Globals for viewing, etc. *****/
55 :    
56 : jhr 2079 typedef struct {
57 :     bool init;
58 :     GLuint wid;
59 :     GLuint ht;
60 :     GLuint id;
61 :     } TexInfo_t;
62 :    
63 : jhr 2067 VR_World_t *World;
64 : jhr 2058 unsigned int Width; // view window width
65 :     unsigned int Height; // view window height
66 : jhr 2079 TexInfo_t ReducedTexure = { // Texture ID of reduced image
67 :     false, REDUCED_WID, REDUCED_HT, 0
68 :     };
69 :     TexInfo_t FullTexture = { // Texture ID of full image
70 :     false, FULL_WID, FULL_HT, 0
71 :     };
72 : jhr 2063 bool NeedsRedraw;
73 :     bool NeedsRecompute;
74 : jhr 2067 float OpacMid = 550.0;
75 : jhr 2079 int Dir = 0; /* -1, 0, 1 */
76 : jhr 2058
77 :    
78 : jhr 2079 // initialize a texture from a grayscale Nrrd file
79 :     void InitTexture (TexInfo_t *txt, Nrrd *img)
80 :     {
81 :     if (! txt->init) {
82 :     // generate the TeXID
83 :     glGenTextures (1, &(txt->id));
84 :    
85 :     // load the texture data
86 :     glBindTexture (GL_TEXTURE_2D, txt->id);
87 :     glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, txt->wid, txt->ht, 0, GL_RGBA, GL_FLOAT, img->data);
88 :     CheckError();
89 :     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
90 :     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
91 :     CheckError();
92 :     }
93 :     else {
94 :     // reload the texture data
95 :     glBindTexture (GL_TEXTURE_2D, txt->id);
96 :     glTexSubImage2D (GL_TEXTURE_2D, 0, 0, 0, txt->wid, txt->ht, GL_RGBA, GL_FLOAT, img->data);
97 :     CheckError();
98 :     }
99 :     }
100 :    
101 : jhr 2058 // Callback function called by GLUT to render screen
102 : jhr 2079 void Draw (GLuint txtId)
103 : jhr 2058 {
104 :     // Clear frame buffer
105 :     glClearColor (0, 0, 0, 1);
106 :     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
107 :    
108 :     glDisable(GL_DEPTH_TEST);
109 :     glDisable(GL_CULL_FACE);
110 :    
111 :     // Draw image
112 : jhr 2079 glEnable (GL_TEXTURE_2D);
113 :     glActiveTexture (GL_TEXTURE0);
114 :     glBindTexture (GL_TEXTURE_2D, txtId);
115 :     glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
116 :     glBegin (GL_QUADS);
117 :     glTexCoord2f (0.0, 0.0);
118 :     glVertex2f (0.0, 0.0);
119 :     glTexCoord2f (1.0, 0.0);
120 :     glVertex2f (1.0, 0.0);
121 :     glTexCoord2f (1.0, 1.0);
122 :     glVertex2f (1.0, 1.0);
123 :     glTexCoord2f (0.0, 1.0);
124 :     glVertex2f (0.0, 1.0);
125 :     glEnd();
126 :     glDisable (GL_TEXTURE_2D);
127 : jhr 2058 CheckError ();
128 :    
129 :     // Present frame buffer
130 :     glfwSwapBuffers();
131 :     }
132 :    
133 :     // Callback function called by GLFW when window size changes
134 :     void GLFWCALL WindowSizeCB (int width, int height)
135 :     {
136 :     // Set OpenGL viewport and camera
137 :     glViewport(0, 0, width, height);
138 :    
139 : jhr 2079 glMatrixMode (GL_PROJECTION);
140 :     glLoadIdentity ();
141 :     gluOrtho2D (0.0, 1.0, 0.0, 1.0);
142 :    
143 :     glMatrixMode (GL_MODELVIEW);
144 :     glLoadIdentity ();
145 :     gluLookAt (
146 :     0.0, 0.0, 1.0,
147 :     0.0, 0.0, 0.0,
148 :     0.0, 1.0, 0.0);
149 :    
150 : jhr 2058 // remember width and height
151 :     Width = width;
152 :     Height = height;
153 :    
154 :     }
155 :    
156 : jhr 2067 void GLFWCALL KeyCB (int key, int action)
157 :     {
158 : jhr 2079 switch (key) {
159 :     case '+':
160 :     if ((action == GLFW_PRESS) && (Dir >= 0))
161 :     Dir++;
162 :     break;
163 :     case '-':
164 :     if ((action == GLFW_PRESS) && (Dir <= 0))
165 :     Dir--;
166 :     break;
167 :     default:
168 :     break;
169 : jhr 2067 }
170 :     }
171 :    
172 : jhr 2079 void Compute (VR_World_t *wrld, bool fullSize, Nrrd *nRGB)
173 : jhr 2058 {
174 : jhr 2079 printf("computing %s... ", fullSize ? "" : "(fast) "); fflush(stdout);
175 :     double t0 = airTime();
176 :     // setup raycast parameters
177 :     if (fullSize) {
178 :     VR_InVarSet_imgResU (wrld, FULL_WID);
179 :     VR_InVarSet_imgResV (wrld, FULL_HT);
180 :     VR_InVarSet_rayStep (wrld, FULL_STEP);
181 :     }
182 :     else {
183 :     VR_InVarSet_imgResU (wrld, REDUCED_WID);
184 :     VR_InVarSet_imgResV (wrld, REDUCED_HT);
185 :     VR_InVarSet_rayStep (wrld, REDUCED_STEP);
186 :     }
187 :     // recompute
188 :     if (VR_Initially (wrld)) {
189 :     // error
190 :     fprintf(stderr, "Error initializing world: %s", VR_GetErrors(wrld));
191 :     exit(1);
192 :     }
193 :     int nSteps = VR_Run (wrld, 0);
194 :     printf(" %d steps in %5.3f seconds\n", nSteps, airTime() - t0);
195 :     // get output image
196 : jhr 2063 if (VR_OutputGet_outRGBA (wrld, nRGB)) {
197 : jhr 2058 // error
198 : jhr 2079 fprintf(stderr, "Error getting nrrd data: %s", VR_GetErrors(wrld));
199 : jhr 2063 exit(1);
200 : jhr 2058 }
201 :     }
202 :    
203 :     int main (int argc, const char **argv)
204 :     {
205 :     // Initialize GLFW
206 :     if (0 == glfwInit()) {
207 :     // An error occured
208 :     fprintf(stderr, "GLFW initialization failed\n");
209 :     return 1;
210 :     }
211 :    
212 :     GLFWvidmode mode;
213 :     glfwGetDesktopMode (&mode);
214 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
215 :     // A fatal error occured
216 :     fprintf(stderr, "Cannot open GLFW window\n");
217 :     glfwTerminate();
218 :     return 1;
219 :     }
220 :     glfwEnable(GLFW_KEY_REPEAT);
221 : jhr 2061 glfwSetWindowTitle("Diderot VR Demo");
222 : jhr 2058
223 :     // Set GLFW event callbacks
224 :     glfwSetWindowSizeCallback (WindowSizeCB);
225 : jhr 2067 glfwSetCharCallback (KeyCB);
226 : jhr 2058
227 :     // initialize the Diderot program
228 : jhr 2061 VR_World_t *wrld = VR_Init ();
229 : jhr 2067 World = wrld;
230 : jhr 2058
231 : jhr 2067 // initialize inputs
232 :     VR_InVarSet_valOpacMid(wrld, OpacMid);
233 : jhr 2079 VR_InVarSetByName_hand (wrld, "data/vfrhand-nohip.nhdr");
234 : jhr 2067
235 : jhr 2058 // nrrd for getting computational state
236 : jhr 2061 Nrrd *nRGB = nrrdNew();
237 : jhr 2058
238 :     // Main loop (repeated while window is not closed and [ESC] is not pressed)
239 : jhr 2062 NeedsRecompute = true;
240 : jhr 2079 GLuint txtId;
241 : jhr 2058 while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
242 : jhr 2079 if (Dir < 0) {
243 :     Dir++;
244 :     float mid = OpacMid - OPAC_DELTA;
245 :     if (mid >= MIN_OPAC_MID) {
246 :     OpacMid = mid;
247 :     VR_InVarSet_valOpacMid(World, mid);
248 :     NeedsRecompute = true;
249 :     }
250 :     }
251 :     else if (Dir > 0) {
252 :     Dir--;
253 :     float mid = OpacMid + OPAC_DELTA;
254 :     if (mid <= MAX_OPAC_MID) {
255 :     OpacMid = mid;
256 :     VR_InVarSet_valOpacMid(World, mid);
257 :     NeedsRecompute = true;
258 :     }
259 :     }
260 : jhr 2061 if (NeedsRecompute) {
261 : jhr 2079 if (Dir != 0) {
262 :     Compute(wrld, false, nRGB);
263 :     InitTexture(&ReducedTexure, nRGB);
264 :     txtId = ReducedTexure.id;
265 : jhr 2067 }
266 : jhr 2079 else {
267 :     Compute (wrld, true, nRGB);
268 :     InitTexture(&FullTexture, nRGB);
269 :     NeedsRecompute = false;
270 :     txtId = FullTexture.id;
271 :     }
272 : jhr 2063 NeedsRedraw = true;
273 : jhr 2061 }
274 :     if (NeedsRedraw) {
275 : jhr 2079 Draw (txtId);
276 : jhr 2063 NeedsRedraw = false;
277 : jhr 2061 }
278 : jhr 2079 if (NeedsRecompute)
279 :     glfwPollEvents();
280 :     else
281 :     glfwWaitEvents();
282 : jhr 2058 }
283 :    
284 :     // shutdown the world
285 : jhr 2061 VR_Shutdown (wrld);
286 : jhr 2058
287 : jhr 2063 // Terminate GLFW
288 : jhr 2058 glfwTerminate();
289 :    
290 :     return 0;
291 :     }

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