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

SCM Repository

[diderot] Annotation of /branches/lamont/test/flocking/main.c
ViewVC logotype

Annotation of /branches/lamont/test/flocking/main.c

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : lamonts 2119 #include <stdlib.h>
2 :     #include <time.h>
3 :     #ifdef __APPLE__
4 :     # include <GLUT/glut.h>
5 :     #else
6 :     # include <GL/glut.h>
7 :     #endif
8 :    
9 : lamonts 2120 #define PI 3.1415926535897932384626433832795
10 : lamonts 2119
11 :     /* pixel dimensions of output */
12 :     #define WIDTH 800
13 :     #define HEIGHT 600
14 :    
15 : lamonts 2122 #define NUMBOIDS
16 :    
17 : lamonts 2119 /* Wrapping dimensions and indices */
18 :     #define NORTH 0
19 :     #define SOUTH 1
20 :     #define WEST 2
21 :     #define EAST 3
22 :     int wrapDimensions[4] = {-10,
23 :     600 + 10,
24 :     -10,
25 :     800 + 10};
26 :    
27 :     #define STEP_SIZE 1
28 :     #define SLEEP_MS 250
29 :    
30 : lamonts 2122 BOID_World_t *wrld = BOID_Init();
31 :     bool isInitial = true;
32 :    
33 : lamonts 2119 // nrrd for getting computational state
34 :     Nrrd *nData = nrrdNew();
35 :    
36 :     void setUpView(void)
37 :     {
38 :     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
39 :     glMatrixMode(GL_PROJECTION);
40 :     glLoadIdentity();
41 :     glOrtho(0, // left
42 :     CurrentWidth, // right
43 :     CurrentHeight, // bottom
44 :     0, // top
45 :     0, // zNear
46 :     1 // zFar
47 :     );
48 :     }
49 : lamonts 2120 void shouldWrap(float * b)
50 : lamonts 2119 {
51 : lamonts 2120 if(b[0] < wrapDimensions[WEST])
52 :     b[0] = wrapDimensions[EAST];
53 :     else if(b[0] > wrapDimensions[EAST])
54 :     b[0] = wrapDimensions[WEST];
55 : lamonts 2119
56 : lamonts 2120 if(b[1] < wrapDimensions[NORTH])
57 :     b[1] = wrapDimensions[SOUTH];
58 :     else if(b[1] > wrapDimensions[SOUTH])
59 :     b[1] = wrapDimensions[NORTH];
60 : lamonts 2119 }
61 : lamonts 2122 void DrawBoids(Nrrd *positions)
62 : lamonts 2119 {
63 :     glMatrixMode(GL_MODELVIEW);
64 :     int r = 5; // "radius" of the triangle
65 :    
66 :     float *boids = (float *)(positions->data);
67 :     unsigned int nBoids = positions->axis[1].size;
68 :    
69 : lamonts 2120 for(int i = 0; i < nBoids; i+=4)
70 : lamonts 2119 {
71 : lamonts 2120 float theta = (-1 * atan2(-1 * boids[i + 2], boids[i + 3])) + (PI/2.0);
72 :     float degTheta = (theta * 180/PI);
73 : lamonts 2119 glColor3f(0.0f, 0.0f, 1.0f);
74 :     glLoadIdentity();
75 :     glPushMatrix();
76 : lamonts 2120 shouldWrap(&b[i]);
77 : lamonts 2119 glTranslatef(boids[i],boids[i+1],0.0f);
78 : lamonts 2120 glRotatef(degTheta,0.0f,0.0f,1.0f);
79 : lamonts 2119 glBegin(GL_TRIANGLES);
80 :     glVertex2f(0, -1 * r * 2);
81 :     glVertex2f(-1 * r, r * 2);
82 :     glVertex2f(r, r * 2);
83 :     glEnd();
84 :     glPopMatrix();
85 :     }
86 :     }
87 : lamonts 2122 void Display(void)
88 : lamonts 2119 {
89 :     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
90 : lamonts 2122 glClear(GL_COLOR_BUFFER_BIT); // Clear The Screen And The Depth Buffer
91 : lamonts 2119 setUpView();
92 :    
93 : lamonts 2122 // get and render initial state
94 :     if(isInitial){
95 :     GetData (wrld, nData);
96 :     DrawBoids(nData);
97 :     isInitial = false;
98 :     glutSwapBuffers();
99 :     }else {
100 :     if(BOID_NumActive(wrld) > 0){
101 :     // step the computation
102 :     BOID_Run(wrld, STEP_SIZE);
103 :     // get and render the state
104 :     GetData (wrld, nData);
105 :     DrawBoids(nData);
106 :     glutSwapBuffers();
107 :     glutTimerFunc(50,flock, 0);
108 : lamonts 2119 }
109 :     }
110 :    
111 :     }
112 :     void GetData (BOID_World_t *wrld, Nrrd *nData)
113 :     {
114 :     // get snapshot of state
115 : lamonts 2122 if (BOID_Snapshot_boidInfo(wrld, nData)) {
116 : lamonts 2119 // error
117 :     fprintf(stderr, "Error getting nrrd data\n");
118 :     exit(1);
119 :     }
120 :     }
121 :    
122 :     int main(int argc, char** argv)
123 :     {
124 :     glutInit(&argc, argv);
125 :     glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
126 :     glutInitWindowSize(CurrentWidth, CurrentHeight);
127 : lamonts 2122 glutCreateWindow("Flocking Diderot Program");
128 :     glutDisplayFunc(&Display);
129 : lamonts 2119 glutReshapeFunc(&resizeWindow);
130 :    
131 :     // initialize the Diderot program
132 : lamonts 2122 BOID_InVarSet_width (wrld, CurrentWidth);
133 :     BOID_InVarSet_height(wrld, CurrentHeight);
134 :     BOID_Initially (wrld);
135 : lamonts 2119
136 : lamonts 2122 glutTimerFunc(50,Display, 0);
137 : lamonts 2119
138 :     glutMainLoop();
139 : lamonts 2122
140 : lamonts 2119 return 0;
141 :     }

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