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

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