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 2067 - (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 2067 #define OPAC_DELTA 100
29 :    
30 : jhr 2058 /* pixel dimensions of output */
31 : jhr 2061 #define WIDTH 480
32 :     #define HEIGHT 345
33 : jhr 2058
34 :     /* world bounds */
35 :     #define WRLD_MIN_X 0.0
36 :     #define WRLD_MIN_Y 0.0
37 :     #define WRLD_MAX_X 1.0
38 :     #define WRLD_MAX_Y 1.0
39 :     #define WRLD_CENTER_X 0.5
40 :     #define WRLD_CENTER_Y 0.5
41 :    
42 :     static inline void CheckError ()
43 :     {
44 :     GLenum errCode;
45 :     if ((errCode = glGetError()) != GL_NO_ERROR) {
46 :     fprintf(stderr, "OpenGL error: %s\n", gluErrorString(errCode));
47 :     exit (1);
48 :     }
49 :     }
50 :    
51 :     /***** Globals for viewing, etc. *****/
52 :    
53 : jhr 2067 VR_World_t *World;
54 : jhr 2058 unsigned int Width; // view window width
55 :     unsigned int Height; // view window height
56 : jhr 2063 bool NeedsRedraw;
57 :     bool NeedsRecompute;
58 : jhr 2067 float OpacMid = 550.0;
59 : jhr 2058
60 :    
61 :     // Callback function called by GLUT to render screen
62 :     void Draw (Nrrd *img)
63 :     {
64 :     // Clear frame buffer
65 :     glClearColor (0, 0, 0, 1);
66 :     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
67 :    
68 :     glDisable(GL_DEPTH_TEST);
69 :     glDisable(GL_CULL_FACE);
70 :    
71 :     // Draw image
72 : jhr 2062 glDrawPixels (Width, Height, GL_RGBA, GL_FLOAT, img->data);
73 : jhr 2058 CheckError ();
74 :    
75 :     // Present frame buffer
76 :     glfwSwapBuffers();
77 :     }
78 :    
79 :     // Callback function called by GLFW when window size changes
80 :     void GLFWCALL WindowSizeCB (int width, int height)
81 :     {
82 :     printf("window size = %d x %d\n", width, height);
83 :     // Set OpenGL viewport and camera
84 :     glViewport(0, 0, width, height);
85 :    
86 :     glMatrixMode (GL_PROJECTION);
87 :     glLoadIdentity ();
88 :     double pad = 0.05*(WRLD_MAX_X - WRLD_MIN_X); // add 10% to world dimensions
89 :     gluOrtho2D (
90 :     WRLD_MIN_X - pad, WRLD_MAX_X + pad,
91 :     WRLD_MAX_Y + pad, WRLD_MIN_Y - pad);
92 :    
93 :     glMatrixMode (GL_MODELVIEW);
94 :     glLoadIdentity ();
95 :     gluLookAt (
96 :     0.0, 0.0, 1.0,
97 :     0.0, 0.0, 0.0,
98 :     0.0, 1.0, 0.0);
99 :    
100 :     // remember width and height
101 :     Width = width;
102 :     Height = height;
103 :    
104 :     }
105 :    
106 : jhr 2067 void GLFWCALL KeyCB (int key, int action)
107 :     {
108 :     if (action == GLFW_PRESS) {
109 :     switch (key) {
110 :     case '+': {
111 :     float mid = OpacMid + OPAC_DELTA;
112 :     if (mid <= MAX_OPAC_MID) {
113 :     OpacMid = mid;
114 :     VR_InVarSet_valOpacMid(World, mid);
115 :     NeedsRecompute = true;
116 :     }
117 :     } break;
118 :     case '-': {
119 :     float mid = OpacMid - OPAC_DELTA;
120 :     if (mid >= MIN_OPAC_MID) {
121 :     OpacMid = mid;
122 :     VR_InVarSet_valOpacMid(World, mid);
123 :     NeedsRecompute = true;
124 :     }
125 :     } break;
126 :     default:
127 :     break;
128 :     }
129 :     }
130 :     }
131 :    
132 : jhr 2063 void GetData (VR_World_t *wrld, Nrrd *nRGB)
133 : jhr 2058 {
134 : jhr 2063 if (VR_OutputGet_outRGBA (wrld, nRGB)) {
135 : jhr 2058 // error
136 : jhr 2063 fprintf(stderr, "Error getting nrrd data\n");
137 :     exit(1);
138 : jhr 2058 }
139 :     }
140 :    
141 :     int main (int argc, const char **argv)
142 :     {
143 :     // Initialize GLFW
144 :     if (0 == glfwInit()) {
145 :     // An error occured
146 :     fprintf(stderr, "GLFW initialization failed\n");
147 :     return 1;
148 :     }
149 :    
150 :     GLFWvidmode mode;
151 :     glfwGetDesktopMode (&mode);
152 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
153 :     // A fatal error occured
154 :     fprintf(stderr, "Cannot open GLFW window\n");
155 :     glfwTerminate();
156 :     return 1;
157 :     }
158 :     glfwEnable(GLFW_KEY_REPEAT);
159 : jhr 2061 glfwSetWindowTitle("Diderot VR Demo");
160 : jhr 2058
161 :     // Set GLFW event callbacks
162 :     glfwSetWindowSizeCallback (WindowSizeCB);
163 : jhr 2067 glfwSetCharCallback (KeyCB);
164 : jhr 2058
165 :     // initialize the Diderot program
166 : jhr 2061 VR_World_t *wrld = VR_Init ();
167 : jhr 2067 World = wrld;
168 : jhr 2058
169 : jhr 2067 // initialize inputs
170 :     VR_InVarSet_valOpacMid(wrld, OpacMid);
171 :     Nrrd *nin = nrrdNew();
172 :     /* read in the nrrd from file */
173 :     if (nrrdLoad(nin, "data/vfrhand-nohip.nhdr", NULL) != 0) {
174 :     char *msg = biffGetDone(NRRD);
175 :     fprintf (stderr, "Error loading data: %s", msg);
176 :     exit (1);
177 :     }
178 :     VR_InVarSet_hand (wrld, nin);
179 :     // nrrdNix (nin);
180 :    
181 : jhr 2058 // nrrd for getting computational state
182 : jhr 2061 Nrrd *nRGB = nrrdNew();
183 : jhr 2058
184 :     // Main loop (repeated while window is not closed and [ESC] is not pressed)
185 : jhr 2062 NeedsRecompute = true;
186 : jhr 2058 while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
187 : jhr 2061 if (NeedsRecompute) {
188 : jhr 2067 printf("computing ... "); fflush(stdout);
189 : jhr 2061 // recompute
190 : jhr 2067 if (VR_Initially (wrld)) {
191 :     // error
192 :     fprintf(stderr, "Error initializing world: %s", VR_GetErrors(wrld));
193 :     exit(1);
194 :     }
195 :     int nSteps = VR_Run (wrld, 0);
196 :     printf(" %d steps\n", nSteps);
197 : jhr 2061 // get output image
198 :     if (VR_OutputGet_outRGBA (wrld, nRGB)) {
199 :     // error
200 : jhr 2067 fprintf(stderr, "Error getting nrrd data: %s", VR_GetErrors(wrld));
201 : jhr 2061 exit(1);
202 :     }
203 : jhr 2067 NeedsRecompute = false;
204 : jhr 2063 NeedsRedraw = true;
205 : jhr 2061 }
206 :     if (NeedsRedraw) {
207 : jhr 2063 Draw (nRGB);
208 :     NeedsRedraw = false;
209 : jhr 2061 }
210 :     glfwWaitEvents();
211 : jhr 2058 }
212 :    
213 :     // shutdown the world
214 : jhr 2061 VR_Shutdown (wrld);
215 : jhr 2058
216 : jhr 2063 // Terminate GLFW
217 : jhr 2058 glfwTerminate();
218 :    
219 :     return 0;
220 :     }

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