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 2058 - (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 <AntTweakBar.h>
14 :     #include "GL/glfw.h"
15 :     #include "util.h"
16 :     #include "vr-lite.h"
17 :     #include <unistd.h>
18 :    
19 :     /* pixel dimensions of output */
20 :     #define WIDTH 990
21 :     #define HEIGHT 990
22 :    
23 :     /* world bounds */
24 :     #define WRLD_MIN_X 0.0
25 :     #define WRLD_MIN_Y 0.0
26 :     #define WRLD_MAX_X 1.0
27 :     #define WRLD_MAX_Y 1.0
28 :     #define WRLD_CENTER_X 0.5
29 :     #define WRLD_CENTER_Y 0.5
30 :    
31 :     #define STEP_SIZE 1
32 :     #define SLEEP_MS 250
33 :    
34 :     static inline void CheckError ()
35 :     {
36 :     GLenum errCode;
37 :     if ((errCode = glGetError()) != GL_NO_ERROR) {
38 :     fprintf(stderr, "OpenGL error: %s\n", gluErrorString(errCode));
39 :     exit (1);
40 :     }
41 :     }
42 :    
43 :     /***** Globals for viewing, etc. *****/
44 :    
45 :     Nrrd *Diderot; // input image nrrd
46 :     unsigned int Width; // view window width
47 :     unsigned int Height; // view window height
48 :     GLuint ImageTexture; // Texture ID of background image
49 :     float WrldOrigin[2];
50 :     float WrldDim[2];
51 :    
52 :     typedef struct {
53 :     TwBar *ctls;
54 :     unsigned int running;
55 :     } State_t;
56 :    
57 :     // Callback function called by GLUT to render screen
58 :     void Draw (Nrrd *img)
59 :     {
60 :     // Clear frame buffer
61 :     glClearColor (0, 0, 0, 1);
62 :     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
63 :    
64 :     glDisable(GL_DEPTH_TEST);
65 :     glDisable(GL_CULL_FACE);
66 :    
67 :     // Draw image
68 :     glEnable (GL_TEXTURE_2D);
69 :     glActiveTexture (GL_TEXTURE0);
70 :     glBindTexture (GL_TEXTURE_2D, ImageTexture);
71 :     glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
72 :     glBegin (GL_QUADS);
73 :     glColor3f (0.1, 0.1, 0.1);
74 :     glTexCoord2f (0.0, 0.0);
75 :     glVertex2f (WrldOrigin[0], WrldOrigin[1]);
76 :     glTexCoord2f (1.0, 0.0);
77 :     glVertex2f (WrldOrigin[0]+WrldDim[0], WrldOrigin[1]);
78 :     glTexCoord2f (1.0, 1.0);
79 :     glVertex2f (WrldOrigin[0]+WrldDim[0], WrldOrigin[1]+WrldDim[1]);
80 :     glTexCoord2f (0.0, 1.0);
81 :     glVertex2f (WrldOrigin[0], WrldOrigin[1]+WrldDim[1]);
82 :     glEnd();
83 :     glDisable (GL_TEXTURE_2D);
84 :     CheckError ();
85 :    
86 :     // Draw current particle state
87 :     glEnable (GL_POINT_SMOOTH);
88 :     // glPointSize (2.0);
89 :     // it would be more efficient to do this as a single buffer, but it is fast enough
90 :     float *p = (float *)(positions->data);
91 :     unsigned int nPoints = positions->axis[1].size;
92 :     glBegin (GL_POINTS);
93 :     // first draw some points at known locations for testing purposes
94 :     // glColor3f (1.0, 0.0, 0.0);
95 :     // glVertex2f (WRLD_MIN_X, WRLD_MIN_Y);
96 :     // glVertex2f (WRLD_MAX_X, WRLD_MIN_Y);
97 :     // glVertex2f (WRLD_MAX_X, WRLD_MAX_Y);
98 :     // glVertex2f (WRLD_MIN_X, WRLD_MAX_Y);
99 :     glColor3f (0.2, 1.0, 0.2);
100 :     for (int i = 0; i < nPoints; i++) {
101 :     glVertex2fv(p);
102 :     p += 2;
103 :     }
104 :     glEnd ();
105 :    
106 :     // Draw tweak bars
107 :     TwDraw();
108 :    
109 :     // Present frame buffer
110 :     glfwSwapBuffers();
111 :     }
112 :    
113 :     // Callback function called by GLFW when window size changes
114 :     void GLFWCALL WindowSizeCB (int width, int height)
115 :     {
116 :     printf("window size = %d x %d\n", width, height);
117 :     // Set OpenGL viewport and camera
118 :     glViewport(0, 0, width, height);
119 :    
120 :     glMatrixMode (GL_PROJECTION);
121 :     glLoadIdentity ();
122 :     double pad = 0.05*(WRLD_MAX_X - WRLD_MIN_X); // add 10% to world dimensions
123 :     gluOrtho2D (
124 :     WRLD_MIN_X - pad, WRLD_MAX_X + pad,
125 :     WRLD_MAX_Y + pad, WRLD_MIN_Y - pad);
126 :    
127 :     glMatrixMode (GL_MODELVIEW);
128 :     glLoadIdentity ();
129 :     gluLookAt (
130 :     // WRLD_CENTER_X, WRLD_CENTER_Y, 1.0,
131 :     0.0, 0.0, 1.0,
132 :     // WRLD_CENTER_X, WRLD_CENTER_Y, 0.0,
133 :     0.0, 0.0, 0.0,
134 :     0.0, 1.0, 0.0);
135 :    
136 :     // Send the new window size to AntTweakBar
137 :     TwWindowSize(width, height);
138 :    
139 :     // remember width and height
140 :     Width = width;
141 :     Height = height;
142 :    
143 :     }
144 :    
145 :     // initialize a texture from a grayscale Nrrd file
146 :     void InitTexture ()
147 :     {
148 :     Image2D_t *img = LoadImage ("data/ddro-tx.png", true, GRAY_IMAGE);
149 :     if (img == 0) {
150 :     fprintf (stderr, "unable to load texture file\n");
151 :     exit (1);
152 :     }
153 :    
154 :     // generate the TeXID
155 :     GLuint texId;
156 :     glGenTextures (1, &texId);
157 :    
158 :     // load the texture data
159 :     glBindTexture (GL_TEXTURE_2D, texId);
160 :     int sts = TexImage (img);
161 :     if (sts != GL_NO_ERROR) {
162 :     fprintf(stderr, "error loading texture\n");
163 :     exit (1);
164 :     }
165 :     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
166 :     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
167 :    
168 :     FreeImage (img);
169 :    
170 :     ImageTexture = texId;
171 :     }
172 :    
173 :     void TW_CALL StartButtonCB (void *data)
174 :     {
175 :     State_t *st = (State_t *)data;
176 :    
177 :     if (st->running == 0) {
178 :     st->running = 1;
179 :     TwSetParam (st->ctls, "StartButton", "label", TW_PARAM_CSTRING, 1, "Stop");
180 :     }
181 :     else {
182 :     st->running = 0;
183 :     TwSetParam (st->ctls, "StartButton", "label", TW_PARAM_CSTRING, 1, "Start");
184 :     }
185 :     }
186 :    
187 :     void GetData (ISO_World_t *wrld, Nrrd *nData)
188 :     {
189 :     // get snapshot of state
190 :     if (ISO_Snapshot_pos (wrld, nData)) {
191 :     // error
192 :     fprintf(stderr, "Error getting nrrd data\n");
193 :     exit(1);
194 :     }
195 :     }
196 :    
197 :     int main (int argc, const char **argv)
198 :     {
199 :     State_t state = { .running = 0 };
200 :    
201 :     // Initialize GLFW
202 :     if (0 == glfwInit()) {
203 :     // An error occured
204 :     fprintf(stderr, "GLFW initialization failed\n");
205 :     return 1;
206 :     }
207 :    
208 :     GLFWvidmode mode;
209 :     glfwGetDesktopMode (&mode);
210 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
211 :     // A fatal error occured
212 :     fprintf(stderr, "Cannot open GLFW window\n");
213 :     glfwTerminate();
214 :     return 1;
215 :     }
216 :     glfwEnable(GLFW_MOUSE_CURSOR);
217 :     glfwEnable(GLFW_KEY_REPEAT);
218 :     glfwSetWindowTitle("Diderot Iso2D Animation");
219 :    
220 :     // Initialize AntTweakBar
221 :     TwInit (TW_OPENGL, 0);
222 :    
223 :     // create a tweakbar
224 :     TwBar *tweakBar = TwNewBar("Controls");
225 :     state.ctls = tweakBar;
226 :     unsigned int NumSteps = 0;
227 :     TwAddVarRO (tweakBar, "NumSteps", TW_TYPE_UINT32, &NumSteps, " label='# of steps' ");
228 :     TwAddButton (tweakBar, "StartButton", StartButtonCB, &state, " label='Start' ");
229 :    
230 :     // Set GLFW event callbacks
231 :     glfwSetWindowSizeCallback (WindowSizeCB);
232 :     glfwSetMouseButtonCallback ((GLFWmousebuttonfun)TwEventMouseButtonGLFW); // redirect to AntTweakBar
233 :     glfwSetMousePosCallback ((GLFWmouseposfun)TwEventMousePosGLFW); // redirect to AntTweakBar
234 :     glfwSetMouseWheelCallback ((GLFWmousewheelfun)TwEventMouseWheelGLFW); // redirect to AntTweakBar
235 :     glfwSetKeyCallback ((GLFWkeyfun)TwEventKeyGLFW); // redirect to AntTweakBar
236 :     glfwSetCharCallback ((GLFWcharfun)TwEventCharGLFW); // redirect to AntTweakBar
237 :    
238 :     // load Diderot image for background texture
239 :     InitTexture ();
240 :    
241 :     // setup the world coords.
242 :     // FIXME: we should get these from the nrrd file, but for now I'm hard coding them
243 :     WrldOrigin[0] = -0.0184375;
244 :     WrldOrigin[1] = -0.0184375;
245 :     WrldDim[0] = 0.013125 * 80.0;
246 :     WrldDim[1] = 0.013125 * 80.0;
247 :    
248 :     // initialize the Diderot program
249 :     ISO_World_t *wrld = ISO_Init ();
250 :     ISO_Initially (wrld);
251 :    
252 :     // nrrd for getting computational state
253 :     Nrrd *nData = nrrdNew();
254 :    
255 :     // get and render initial state
256 :     GetData (wrld, nData);
257 :     Draw (nData);
258 :    
259 :     // Main loop (repeated while window is not closed and [ESC] is not pressed)
260 :     while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
261 :     if (state.running != 0) {
262 :     while ((state.running != 0) && (ISO_NumActive(wrld) > 0)) {
263 :     // step the computation
264 :     NumSteps += ISO_Run (wrld, STEP_SIZE);
265 :     // get and render the state
266 :     GetData (wrld, nData);
267 :     Draw (nData);
268 :     usleep (SLEEP_MS * 1000); // sleep for a bit
269 :     }
270 :     if (ISO_NumActive(wrld) == 0) {
271 :     // get and render final state
272 :     if (ISO_OutputGet_pos (wrld, nData)) {
273 :     // error
274 :     fprintf(stderr, "Error getting nrrd data\n");
275 :     exit(1);
276 :     }
277 :     Draw (nData);
278 :     }
279 :     }
280 :     else {
281 :     glfwWaitEvents();
282 :     Draw(nData);
283 :     }
284 :     }
285 :    
286 :     // shutdown the world
287 :     ISO_Shutdown (wrld);
288 :    
289 :     // Terminate AntTweakBar and GLFW
290 :     TwTerminate();
291 :     glfwTerminate();
292 :    
293 :     return 0;
294 :     }

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