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

SCM Repository

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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : jhr 1880 /*! \file main.c
2 :     *
3 :     * \author John Reppy
4 :     *
5 :     * Main program for Diderot ISO2d animation.
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 : jhr 1882 #include "GL/glfw.h"
15 :     #ifdef DIDEROT_CODE
16 :     #include "vr-lite-cam.h"
17 : jhr 1880 #endif
18 : jhr 1884 #include "util.h"
19 :     #include "load-png.h"
20 : jhr 1918 #include "iso2d.h"
21 : jhr 1880
22 :     /* pixel dimensions of output */
23 :     #define WIDTH 512
24 :     #define HEIGHT 512
25 :    
26 : jhr 1918 #define STEP_SIZE 1
27 :    
28 : jhr 1884 static inline void CheckError ()
29 :     {
30 :     GLenum errCode;
31 :     if ((errCode = glGetError()) != GL_NO_ERROR) {
32 :     fprintf(stderr, "OpenGL error: %s\n", gluErrorString(errCode));
33 :     exit (1);
34 :     }
35 :     }
36 :    
37 : jhr 1880 /***** Globals for viewing, etc. *****/
38 :    
39 :     Nrrd *Diderot; // input image nrrd
40 :     unsigned int Width; // view window width
41 :     unsigned int Height; // view window height
42 : jhr 1884 GLuint ImageTexture; // Texture ID of background image
43 : jhr 1880
44 : jhr 1882 typedef struct {
45 :     TwBar *ctls;
46 :     unsigned int running;
47 :     } State_t;
48 :    
49 : jhr 1880 // Callback function called by GLUT to render screen
50 : jhr 1913 void Draw (Nrrd *positions)
51 : jhr 1880 {
52 :     // Clear frame buffer
53 :     glClearColor (0, 0, 0, 1);
54 :     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
55 :    
56 :     glEnable(GL_DEPTH_TEST);
57 :     glDisable(GL_CULL_FACE);
58 :    
59 :     // Draw background
60 : jhr 1882 float halfWid = 0.5 * (float)Width;
61 :     float halfHt = 0.5 * (float)Height;
62 : jhr 1884 glEnable (GL_TEXTURE_2D);
63 :     glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
64 : jhr 1882 glBindTexture (GL_TEXTURE_2D, ImageTexture);
65 :     glBegin (GL_QUADS);
66 : jhr 1884 glColor3f (0.1, 0.1, 0.1);
67 : jhr 1882 glTexCoord2f (0.0, 0.0);
68 :     glVertex2f (-halfWid, -halfHt);
69 :     glTexCoord2f (1.0, 0.0);
70 :     glVertex2f (halfWid, -halfHt);
71 :     glTexCoord2f (1.0, 1.0);
72 :     glVertex2f (halfWid, halfHt);
73 :     glTexCoord2f (0.0, 1.0);
74 :     glVertex2f (-halfWid, halfHt);
75 :     glEnd();
76 : jhr 1884 glDisable (GL_TEXTURE_2D);
77 :     CheckError ();
78 : jhr 1880
79 :     // Draw current render state
80 :    
81 :     // Draw tweak bars
82 :     TwDraw();
83 :    
84 :     // Present frame buffer
85 : jhr 1882 glfwSwapBuffers();
86 : jhr 1880 }
87 :    
88 : jhr 1882 // Callback function called by GLFW when window size changes
89 :     void GLFWCALL WindowSizeCB (int width, int height)
90 : jhr 1880 {
91 : jhr 1882 double halfWid = 0.5 * (double)width;
92 :     double halfHt = 0.5 * (double)height;
93 :    
94 : jhr 1880 // Set OpenGL viewport and camera
95 : jhr 1882 glViewport(0, 0, width, height);
96 :     glMatrixMode(GL_PROJECTION);
97 :     glLoadIdentity();
98 :     gluOrtho2D (-halfWid, halfWid, -halfHt, halfHt);
99 :    
100 : jhr 1880 glMatrixMode (GL_MODELVIEW);
101 :     glLoadIdentity ();
102 : jhr 1882 gluLookAt (
103 :     0.0, 0.0, 1.0,
104 :     0.0, 0.0, 0.0,
105 :     0.0, 1.0, 0.0);
106 : jhr 1880
107 : jhr 1882 // Send the new window size to AntTweakBar
108 :     TwWindowSize(width, height);
109 : jhr 1880
110 :     // remember width and height
111 :     Width = width;
112 :     Height = height;
113 :    
114 :     }
115 :    
116 :     // initialize a texture from a grayscale Nrrd file
117 : jhr 1884 void InitTexture ()
118 : jhr 1880 {
119 : jhr 1884 Image2D_t *img = LoadImage ("data/ddro-tx.png", false, GRAY_IMAGE);
120 :     if (img == 0) {
121 :     fprintf (stderr, "unable to load texture file\n");
122 : jhr 1880 exit (1);
123 :     }
124 :    
125 :     // generate the TeXID
126 :     GLuint texId;
127 :     glGenTextures (1, &texId);
128 :    
129 :     // load the texture data
130 :     glBindTexture (GL_TEXTURE_2D, texId);
131 : jhr 1884 int sts = TexImage (img);
132 :     if (sts != GL_NO_ERROR) {
133 :     fprintf(stderr, "error loading texture\n");
134 :     exit (1);
135 :     }
136 : jhr 1880
137 : jhr 1884 FreeImage (img);
138 :    
139 : jhr 1880 ImageTexture = texId;
140 :     }
141 :    
142 : jhr 1882 void TW_CALL StartButtonCB (void *data)
143 :     {
144 :     State_t *st = (State_t *)data;
145 :    
146 :     if (st->running == 0) {
147 :     st->running = 1;
148 :     TwSetParam (st->ctls, "StartButton", "label", TW_PARAM_CSTRING, 1, "Stop");
149 :     }
150 :     else {
151 :     st->running = 0;
152 :     TwSetParam (st->ctls, "StartButton", "label", TW_PARAM_CSTRING, 1, "Start");
153 :     }
154 :     }
155 :    
156 : jhr 1918 void GetData (ISO_World_t *wrld, Nrrd *nData)
157 :     {
158 :     // get snapshot of state
159 :     if (ISO_Snapshot_pos (wrld, nData)) {
160 :     // error
161 :     fprintf(stderr, "Error getting nrrd data\n");
162 :     exit(1);
163 :     }
164 :     }
165 :    
166 : jhr 1880 int main (int argc, const char **argv)
167 :     {
168 : jhr 1882 State_t state = { .running = 0 };
169 : jhr 1880
170 : jhr 1882 // Initialize GLFW
171 :     if (0 == glfwInit()) {
172 :     // An error occured
173 :     fprintf(stderr, "GLFW initialization failed\n");
174 :     return 1;
175 :     }
176 : jhr 1880
177 : jhr 1882 GLFWvidmode mode;
178 :     glfwGetDesktopMode (&mode);
179 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
180 :     // A fatal error occured
181 :     fprintf(stderr, "Cannot open GLFW window\n");
182 :     glfwTerminate();
183 :     return 1;
184 :     }
185 :     glfwEnable(GLFW_MOUSE_CURSOR);
186 :     glfwEnable(GLFW_KEY_REPEAT);
187 :     glfwSetWindowTitle("Diderot Iso2D Animation");
188 :    
189 : jhr 1880 // Initialize AntTweakBar
190 :     TwInit (TW_OPENGL, 0);
191 :    
192 : jhr 1882 // create a tweakbar
193 :     TwBar *tweakBar = TwNewBar("Controls");
194 :     state.ctls = tweakBar;
195 :     unsigned int NumSteps = 0;
196 :     TwAddVarRO (tweakBar, "NumSteps", TW_TYPE_UINT32, &NumSteps, " label='# of steps' ");
197 :     TwAddButton (tweakBar, "StartButton", StartButtonCB, &state, " label='Start' ");
198 : jhr 1880
199 : jhr 1882 // Set GLFW event callbacks
200 :     glfwSetWindowSizeCallback (WindowSizeCB);
201 :     glfwSetMouseButtonCallback ((GLFWmousebuttonfun)TwEventMouseButtonGLFW); // redirect to AntTweakBar
202 :     glfwSetMousePosCallback ((GLFWmouseposfun)TwEventMousePosGLFW); // redirect to AntTweakBar
203 :     glfwSetMouseWheelCallback ((GLFWmousewheelfun)TwEventMouseWheelGLFW); // redirect to AntTweakBar
204 :     glfwSetKeyCallback ((GLFWkeyfun)TwEventKeyGLFW); // redirect to AntTweakBar
205 :     glfwSetCharCallback ((GLFWcharfun)TwEventCharGLFW); // redirect to AntTweakBar
206 :    
207 : jhr 1884 // load Diderot image for background texture
208 :     InitTexture ();
209 : jhr 1880
210 : jhr 1918 // initialize the Diderot program
211 : jhr 1880 ISO_World_t *wrld = ISO_Init ();
212 :     ISO_Initially (wrld);
213 :    
214 : jhr 1918 // nrrd for getting computational state
215 : jhr 1913 Nrrd *nData = nrrdNew();
216 : jhr 1880
217 : jhr 1918 // get and render initial state
218 :     GetData (wrld, nData);
219 : jhr 1913 Draw (nData);
220 : jhr 1880
221 : jhr 1918 // Main loop (repeated while window is not closed and [ESC] is not pressed)
222 :     while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
223 :     if (state.running != 0) {
224 :     while ((state.running != 0) && (ISO_NumActive(wrld) > 0)) {
225 :     // step the computation
226 :     NumSteps += ISO_Run (wrld, STEP_SIZE);
227 :     printf("%d steps, %d active\n", NumSteps, ISO_NumActive(wrld));
228 :     // get and render the state
229 :     GetData (wrld, nData);
230 :     Draw (nData);
231 :     }
232 :     if (ISO_NumActive(wrld) == 0) {
233 :     // get and render final state
234 :     if (ISO_OutputGet_pos (wrld, nData)) {
235 :     // error
236 :     fprintf(stderr, "Error getting nrrd data\n");
237 :     exit(1);
238 :     }
239 :     Draw (nData);
240 :     }
241 :     }
242 :     else {
243 :     glfwWaitEvents();
244 :     Draw(nData);
245 :     }
246 :     }
247 :    
248 :     // shutdown the world
249 : jhr 1880 ISO_Shutdown (wrld);
250 :    
251 : jhr 1882 // Terminate AntTweakBar and GLFW
252 :     TwTerminate();
253 :     glfwTerminate();
254 :    
255 : jhr 1880 return 0;
256 :     }

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