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 2062 - (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 :     #include "vr-lite.h"
16 :     #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 :     GLuint ImageTexture; // Texture ID of background image
58 :    
59 :    
60 : jhr 2061
61 : jhr 2058 // 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 :     // WRLD_CENTER_X, WRLD_CENTER_Y, 1.0,
97 :     0.0, 0.0, 1.0,
98 :     // WRLD_CENTER_X, WRLD_CENTER_Y, 0.0,
99 :     0.0, 0.0, 0.0,
100 :     0.0, 1.0, 0.0);
101 :    
102 :     // Send the new window size to AntTweakBar
103 :     TwWindowSize(width, height);
104 :    
105 :     // remember width and height
106 :     Width = width;
107 :     Height = height;
108 :    
109 :     }
110 :    
111 :     // initialize a texture from a grayscale Nrrd file
112 :     void InitTexture ()
113 :     {
114 :     Image2D_t *img = LoadImage ("data/ddro-tx.png", true, GRAY_IMAGE);
115 :     if (img == 0) {
116 :     fprintf (stderr, "unable to load texture file\n");
117 :     exit (1);
118 :     }
119 :    
120 :     // generate the TeXID
121 :     GLuint texId;
122 :     glGenTextures (1, &texId);
123 :    
124 :     // load the texture data
125 :     glBindTexture (GL_TEXTURE_2D, texId);
126 :     int sts = TexImage (img);
127 :     if (sts != GL_NO_ERROR) {
128 :     fprintf(stderr, "error loading texture\n");
129 :     exit (1);
130 :     }
131 :     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
132 :     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
133 :    
134 :     FreeImage (img);
135 :    
136 :     ImageTexture = texId;
137 :     }
138 :    
139 :     void TW_CALL StartButtonCB (void *data)
140 :     {
141 :     State_t *st = (State_t *)data;
142 :    
143 :     if (st->running == 0) {
144 :     st->running = 1;
145 :     TwSetParam (st->ctls, "StartButton", "label", TW_PARAM_CSTRING, 1, "Stop");
146 :     }
147 :     else {
148 :     st->running = 0;
149 :     TwSetParam (st->ctls, "StartButton", "label", TW_PARAM_CSTRING, 1, "Start");
150 :     }
151 :     }
152 :    
153 : jhr 2061 void GetData (VR_World_t *wrld, Nrrd *nData)
154 : jhr 2058 {
155 :     // get snapshot of state
156 : jhr 2061 if (VR_Snapshot_pos (wrld, nData)) {
157 : jhr 2058 // error
158 :     fprintf(stderr, "Error getting nrrd data\n");
159 :     exit(1);
160 :     }
161 :     }
162 :    
163 :     int main (int argc, const char **argv)
164 :     {
165 :     // Initialize GLFW
166 :     if (0 == glfwInit()) {
167 :     // An error occured
168 :     fprintf(stderr, "GLFW initialization failed\n");
169 :     return 1;
170 :     }
171 :    
172 :     GLFWvidmode mode;
173 :     glfwGetDesktopMode (&mode);
174 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
175 :     // A fatal error occured
176 :     fprintf(stderr, "Cannot open GLFW window\n");
177 :     glfwTerminate();
178 :     return 1;
179 :     }
180 :     glfwEnable(GLFW_KEY_REPEAT);
181 : jhr 2061 glfwSetWindowTitle("Diderot VR Demo");
182 : jhr 2058
183 :     // Set GLFW event callbacks
184 :     glfwSetWindowSizeCallback (WindowSizeCB);
185 : jhr 2061 glfwSetKeyCallback ((GLFWkeyfun)TwEventKeyGLFW);
186 : jhr 2058
187 :     // load Diderot image for background texture
188 :     InitTexture ();
189 :    
190 :     // setup the world coords.
191 :     // FIXME: we should get these from the nrrd file, but for now I'm hard coding them
192 :     WrldOrigin[0] = -0.0184375;
193 :     WrldOrigin[1] = -0.0184375;
194 :     WrldDim[0] = 0.013125 * 80.0;
195 :     WrldDim[1] = 0.013125 * 80.0;
196 :    
197 :     // initialize the Diderot program
198 : jhr 2061 VR_World_t *wrld = VR_Init ();
199 : jhr 2058
200 :     // nrrd for getting computational state
201 : jhr 2061 Nrrd *nRGB = nrrdNew();
202 : jhr 2058
203 :     // get and render initial state
204 :     GetData (wrld, nData);
205 :     Draw (nData);
206 :    
207 :     // Main loop (repeated while window is not closed and [ESC] is not pressed)
208 : jhr 2062 NeedsRecompute = true;
209 : jhr 2058 while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
210 : jhr 2061 if (NeedsRecompute) {
211 :     // recompute
212 :     VR_Initially (wrld);
213 :     VR_Run (wrld, 0);
214 :     // get output image
215 :     if (VR_OutputGet_outRGBA (wrld, nRGB)) {
216 :     // error
217 :     fprintf(stderr, "Error getting nrrd data\n");
218 :     exit(1);
219 :     }
220 :     }
221 :     if (NeedsRedraw) {
222 :     }
223 :     glfwWaitEvents();
224 : jhr 2058 }
225 :    
226 :     // shutdown the world
227 : jhr 2061 VR_Shutdown (wrld);
228 : jhr 2058
229 :     // Terminate AntTweakBar and GLFW
230 :     TwTerminate();
231 :     glfwTerminate();
232 :    
233 :     return 0;
234 :     }

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