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 2068 - (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 :     // Set OpenGL viewport and camera
83 :     glViewport(0, 0, width, height);
84 :    
85 :     // remember width and height
86 :     Width = width;
87 :     Height = height;
88 :    
89 :     }
90 :    
91 : jhr 2067 void GLFWCALL KeyCB (int key, int action)
92 :     {
93 :     if (action == GLFW_PRESS) {
94 :     switch (key) {
95 :     case '+': {
96 :     float mid = OpacMid + OPAC_DELTA;
97 :     if (mid <= MAX_OPAC_MID) {
98 :     OpacMid = mid;
99 :     VR_InVarSet_valOpacMid(World, mid);
100 :     NeedsRecompute = true;
101 :     }
102 :     } break;
103 :     case '-': {
104 :     float mid = OpacMid - OPAC_DELTA;
105 :     if (mid >= MIN_OPAC_MID) {
106 :     OpacMid = mid;
107 :     VR_InVarSet_valOpacMid(World, mid);
108 :     NeedsRecompute = true;
109 :     }
110 :     } break;
111 :     default:
112 :     break;
113 :     }
114 :     }
115 :     }
116 :    
117 : jhr 2063 void GetData (VR_World_t *wrld, Nrrd *nRGB)
118 : jhr 2058 {
119 : jhr 2063 if (VR_OutputGet_outRGBA (wrld, nRGB)) {
120 : jhr 2058 // error
121 : jhr 2063 fprintf(stderr, "Error getting nrrd data\n");
122 :     exit(1);
123 : jhr 2058 }
124 :     }
125 :    
126 :     int main (int argc, const char **argv)
127 :     {
128 :     // Initialize GLFW
129 :     if (0 == glfwInit()) {
130 :     // An error occured
131 :     fprintf(stderr, "GLFW initialization failed\n");
132 :     return 1;
133 :     }
134 :    
135 :     GLFWvidmode mode;
136 :     glfwGetDesktopMode (&mode);
137 :     if (0 == glfwOpenWindow(WIDTH, HEIGHT, mode.RedBits, mode.GreenBits, mode.BlueBits, 0, 0, 0, GLFW_WINDOW) ) {
138 :     // A fatal error occured
139 :     fprintf(stderr, "Cannot open GLFW window\n");
140 :     glfwTerminate();
141 :     return 1;
142 :     }
143 :     glfwEnable(GLFW_KEY_REPEAT);
144 : jhr 2061 glfwSetWindowTitle("Diderot VR Demo");
145 : jhr 2058
146 :     // Set GLFW event callbacks
147 :     glfwSetWindowSizeCallback (WindowSizeCB);
148 : jhr 2067 glfwSetCharCallback (KeyCB);
149 : jhr 2058
150 :     // initialize the Diderot program
151 : jhr 2061 VR_World_t *wrld = VR_Init ();
152 : jhr 2067 World = wrld;
153 : jhr 2058
154 : jhr 2067 // initialize inputs
155 :     VR_InVarSet_valOpacMid(wrld, OpacMid);
156 :     Nrrd *nin = nrrdNew();
157 :     /* read in the nrrd from file */
158 :     if (nrrdLoad(nin, "data/vfrhand-nohip.nhdr", NULL) != 0) {
159 :     char *msg = biffGetDone(NRRD);
160 :     fprintf (stderr, "Error loading data: %s", msg);
161 :     exit (1);
162 :     }
163 :     VR_InVarSet_hand (wrld, nin);
164 :     // nrrdNix (nin);
165 :    
166 : jhr 2058 // nrrd for getting computational state
167 : jhr 2061 Nrrd *nRGB = nrrdNew();
168 : jhr 2058
169 :     // Main loop (repeated while window is not closed and [ESC] is not pressed)
170 : jhr 2062 NeedsRecompute = true;
171 : jhr 2058 while (glfwGetWindowParam(GLFW_OPENED) && !glfwGetKey(GLFW_KEY_ESC)) {
172 : jhr 2061 if (NeedsRecompute) {
173 : jhr 2067 printf("computing ... "); fflush(stdout);
174 : jhr 2061 // recompute
175 : jhr 2067 if (VR_Initially (wrld)) {
176 :     // error
177 :     fprintf(stderr, "Error initializing world: %s", VR_GetErrors(wrld));
178 :     exit(1);
179 :     }
180 :     int nSteps = VR_Run (wrld, 0);
181 :     printf(" %d steps\n", nSteps);
182 : jhr 2061 // get output image
183 :     if (VR_OutputGet_outRGBA (wrld, nRGB)) {
184 :     // error
185 : jhr 2067 fprintf(stderr, "Error getting nrrd data: %s", VR_GetErrors(wrld));
186 : jhr 2061 exit(1);
187 :     }
188 : jhr 2067 NeedsRecompute = false;
189 : jhr 2063 NeedsRedraw = true;
190 : jhr 2061 }
191 :     if (NeedsRedraw) {
192 : jhr 2063 Draw (nRGB);
193 :     NeedsRedraw = false;
194 : jhr 2061 }
195 :     glfwWaitEvents();
196 : jhr 2058 }
197 :    
198 :     // shutdown the world
199 : jhr 2061 VR_Shutdown (wrld);
200 : jhr 2058
201 : jhr 2063 // Terminate GLFW
202 : jhr 2058 glfwTerminate();
203 :    
204 :     return 0;
205 :     }

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