| [2931] | 1 | #include "framework.h" | 
|---|
| [2748] | 2 |  | 
|---|
| [2933] | 3 | int verbose = 1; | 
|---|
| [2748] | 4 |  | 
|---|
 | 5 | void DrawGLScene() | 
|---|
 | 6 | { | 
|---|
| [2940] | 7 |   currFrame = SDL_GetTicks(); | 
|---|
 | 8 |   dt = currFrame - lastFrame;  | 
|---|
 | 9 |   if (dt == 0) | 
|---|
 | 10 |     dist += (zoomTo-dist)/500; | 
|---|
 | 11 |   else  | 
|---|
 | 12 |     dist += (zoomTo-dist)/500 *(float)dt; | 
|---|
| [2939] | 13 |  | 
|---|
| [2940] | 14 |   rotatorP += rotatorV *(float)dt; | 
|---|
| [2759] | 15 |    | 
|---|
| [2952] | 16 |  | 
|---|
| [2748] | 17 |   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); | 
|---|
 | 18 |   glLoadIdentity(); // Reset the view | 
|---|
 | 19 |    | 
|---|
| [2794] | 20 |   glMatrixMode(GL_PROJECTION); | 
|---|
| [2759] | 21 |   glLoadIdentity();      | 
|---|
| [2933] | 22 |   gluPerspective(45.0f,500/375,0.1f,dist * 5.0f); | 
|---|
| [2963] | 23 |     gluLookAt (0, dist , dist, 0,0,0, up.x,up.y,up.z); | 
|---|
| [2794] | 24 |  | 
|---|
| [2963] | 25 |   glMatrixMode(GL_MODELVIEW); | 
|---|
 | 26 |   glPushMatrix(); | 
|---|
 | 27 |   //  glRotatef (180, dir.x, dir.y, dir.z); | 
|---|
 | 28 |   glMultMatrixf (*matQ); | 
|---|
| [2748] | 29 |   obj->draw(); | 
|---|
 | 30 |  | 
|---|
| [2963] | 31 |   glPopMatrix(); | 
|---|
 | 32 |  | 
|---|
| [2748] | 33 |   SDL_GL_SwapBuffers(); // Swap the buffers | 
|---|
| [2940] | 34 |   lastFrame = currFrame; | 
|---|
| [2748] | 35 | } | 
|---|
 | 36 |  | 
|---|
 | 37 |  | 
|---|
 | 38 | int main(int argc, char *argv[]) | 
|---|
 | 39 | { | 
|---|
 | 40 |   Uint8* keys; // This variable will be used in the keyboard routine | 
|---|
 | 41 |   int done=FALSE; // We aren't done yet, are we? | 
|---|
 | 42 |  | 
|---|
 | 43 |   // Create a new OpenGL window with the title "Cone3D Basecode" at | 
|---|
 | 44 |   // 640x480x32, fullscreen and check for errors along the way | 
|---|
| [2988] | 45 |   if(wHandler.CreateGLWindow("Whandler Basecode", 640, 480, 32, FALSE) == FALSE) | 
|---|
| [2748] | 46 |   { | 
|---|
 | 47 |     // If an error is found, display a message, kill the GL and SDL screens (if they were created) and exit | 
|---|
 | 48 |     printf("Could not initalize OpenGL :(\n\n"); | 
|---|
 | 49 |     wHandler.KillGLWindow(); | 
|---|
 | 50 |     return 0; | 
|---|
 | 51 |   } | 
|---|
| [2936] | 52 |    | 
|---|
 | 53 |   printf ("%i, %i\n", wHandler.screen->w, wHandler.screen->h); | 
|---|
| [2846] | 54 |   if (argc>=3) | 
|---|
| [2837] | 55 |     obj = new Object (argv[1], atof(argv[2])); | 
|---|
| [2846] | 56 |   else if (argc>=2) | 
|---|
| [2837] | 57 |     obj = new Object(argv[1]); | 
|---|
| [2848] | 58 |   else  | 
|---|
 | 59 |     obj = new Object(); | 
|---|
| [2850] | 60 |    | 
|---|
| [2952] | 61 |   M = Vector(wHandler.screen->w/2, wHandler.screen->h/2, 0);  | 
|---|
 | 62 |   rotAxis = Vector (0.0,1.0,0.0); | 
|---|
 | 63 |   rotAngle = 0; | 
|---|
| [2963] | 64 |  | 
|---|
 | 65 |   matQ[0][0] = matQ[1][1] = matQ[2][2] = matQ[3][3] = 1; | 
|---|
| [2952] | 66 |   rotQ = Quaternion (rotAngle, rotAxis); | 
|---|
| [2963] | 67 |   rotQlast = rotQ; | 
|---|
| [2952] | 68 |   dir = Vector (0.0, 0.0, 1.0); | 
|---|
| [2963] | 69 |   up = Vector (0.0, 1.0, 0.0); | 
|---|
| [2952] | 70 |  | 
|---|
| [2931] | 71 |   glEnable(GL_LIGHTING); | 
|---|
 | 72 |   glEnable(GL_DEPTH_TEST); | 
|---|
 | 73 |  | 
|---|
 | 74 |   GLfloat whiteLight[] = {1.0, 1.0, 1.0,1.0}; | 
|---|
 | 75 |   GLfloat light0Position[] = {10.0, 10.0, 10.0, 0.0}; | 
|---|
 | 76 |   GLfloat light1Position[] = {-10.0, -7.0, -6.0, 0.0}; | 
|---|
| [2780] | 77 |   GLfloat lmodelAmbient[] = {.1, .1, .1, 1.0}; | 
|---|
| [2931] | 78 |  | 
|---|
 | 79 |   glEnable(GL_LIGHT0); | 
|---|
 | 80 |   glLightfv(GL_LIGHT0, GL_POSITION, light0Position); | 
|---|
| [2780] | 81 |   glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteLight); | 
|---|
 | 82 |   glLightfv(GL_LIGHT0, GL_SPECULAR, whiteLight); | 
|---|
| [2931] | 83 |    | 
|---|
 | 84 |   glEnable(GL_LIGHT1); | 
|---|
 | 85 |   glLightfv(GL_LIGHT1, GL_POSITION, light1Position); | 
|---|
 | 86 |   glLightfv(GL_LIGHT1, GL_DIFFUSE, whiteLight); | 
|---|
 | 87 |   glLightfv(GL_LIGHT1, GL_SPECULAR, whiteLight); | 
|---|
 | 88 |    | 
|---|
 | 89 |   rotatorP = .0; | 
|---|
 | 90 |   rotatorV = .0; | 
|---|
| [2933] | 91 |   dist = 5.0; | 
|---|
| [2938] | 92 |   zoomTo = dist; | 
|---|
| [2748] | 93 |   // Build the font from a TGA image font.tga in the data directory | 
|---|
 | 94 |   // Hide the mouse cursor | 
|---|
| [2931] | 95 |     SDL_ShowCursor(2); | 
|---|
| [2952] | 96 |     mouse1Down = false; | 
|---|
| [2748] | 97 |  | 
|---|
 | 98 |   // This is the main loop for the entire program and it will run until done==TRUE | 
|---|
 | 99 |   while(!done) | 
|---|
 | 100 |   { | 
|---|
 | 101 |     // Draw the scene | 
|---|
 | 102 |     DrawGLScene(); | 
|---|
 | 103 |     // And poll for events | 
|---|
 | 104 |     SDL_Event event; | 
|---|
 | 105 |     while ( SDL_PollEvent(&event) ) { | 
|---|
 | 106 |       switch (event.type) { | 
|---|
| [2931] | 107 |       case SDL_MOUSEMOTION: | 
|---|
 | 108 |         if (verbose >=3) | 
|---|
 | 109 |           printf("Mouse motion about %d,%d Pixels to (%d,%d).\n",  | 
|---|
 | 110 |                  event.motion.xrel, event.motion.yrel, | 
|---|
 | 111 |                  event.motion.x, event.motion.y); | 
|---|
| [2952] | 112 |         // TRACKBALL | 
|---|
 | 113 |         if (mouse1Down) | 
|---|
 | 114 |           { | 
|---|
| [2963] | 115 |             int mX = event.button.x; | 
|---|
 | 116 |             int mY = event.button.y; | 
|---|
 | 117 |             int wH = wHandler.screen->h; | 
|---|
 | 118 |             int wW = wHandler.screen->w; | 
|---|
 | 119 |             Vector tmpV (mX, mY, sqrt ( (float) abs(wH * wH/4 - (wW/2-mX) * (wW/2-mX) - (wH/2-mY) * (wH/2-mY)) )); | 
|---|
 | 120 |             //      printf ("tmpV: %f, %f, %f\n", tmpV.x, tmpV.y, tmpV.z); | 
|---|
| [2952] | 121 |             p2 = tmpV-M; | 
|---|
| [2966] | 122 |             p2.y = -p2.y; | 
|---|
| [2952] | 123 |             rotAxis = p1.cross(p2); | 
|---|
| [2963] | 124 |             //  printf ("rotAxis: %f, %f, %f\n", rotAxis.x, rotAxis.y, rotAxis.z); | 
|---|
| [2952] | 125 |  | 
|---|
| [2963] | 126 |             // in case that there is no rotation-axis defined | 
|---|
 | 127 |             if (rotAxis.x != 0 || rotAxis.y != 0 || rotAxis.z != 0) | 
|---|
 | 128 |               { | 
|---|
 | 129 |                 rotAxis.normalize(); | 
|---|
| [2968] | 130 |                 //              printf ("rotAxis: %f, %f, %f\n", rotAxis.x, rotAxis.y, rotAxis.z, rotAngle); | 
|---|
| [2963] | 131 |                                  | 
|---|
 | 132 |                 rotAngle = angle_rad (p1, p2); | 
|---|
 | 133 |                 rotQ = Quaternion (rotAngle, rotAxis); | 
|---|
 | 134 |                 rotQ = rotQ * rotQlast; | 
|---|
 | 135 |                 rotQ.matrix (matQ); | 
|---|
 | 136 |                 //      dir = rotQ.apply(dir); | 
|---|
 | 137 |                 //      dir.normalize(); | 
|---|
| [2966] | 138 |                 //      printf ("rotAxis: %f, %f, %f, %f\n", dir.x, dir.y, dir.z, rotAngle); | 
|---|
| [2963] | 139 |               } | 
|---|
 | 140 |             rotQlast = rotQ; | 
|---|
| [2952] | 141 |             p1 = p2; | 
|---|
| [2963] | 142 |  | 
|---|
| [2952] | 143 |           } | 
|---|
| [2931] | 144 |         break; | 
|---|
 | 145 |       case SDL_MOUSEBUTTONDOWN: | 
|---|
| [2932] | 146 |         if (event.button.button == 4) | 
|---|
| [2933] | 147 |           { | 
|---|
 | 148 |             printf("MouseWheel up\n"); | 
|---|
| [2938] | 149 |             zoomTo *= .5; | 
|---|
| [2933] | 150 |           } | 
|---|
| [2932] | 151 |         else if (event.button.button == 5) | 
|---|
| [2933] | 152 |           { | 
|---|
 | 153 |             printf("MouseWheel down\n"); | 
|---|
| [2940] | 154 |             zoomTo *= 2.0; | 
|---|
| [2933] | 155 |           } | 
|---|
| [2952] | 156 |         else if (event.button.button == 1) | 
|---|
 | 157 |           { | 
|---|
 | 158 |             mouse1Down = true; | 
|---|
| [2963] | 159 |             int mX = event.button.x; | 
|---|
 | 160 |             int mY = event.button.y; | 
|---|
 | 161 |             int wH = wHandler.screen->h; | 
|---|
 | 162 |             int wW = wHandler.screen->w; | 
|---|
 | 163 |             Vector tmpV (mX, mY, sqrt ( (float) abs(wH * wH/4 - (wW/2-mX) * (wW/2-mX) - (wH/2-mY) * (wH/2-mY)) )); | 
|---|
| [2952] | 164 |             p1 = tmpV-M; | 
|---|
| [2966] | 165 |             p1.y = -p1.y; | 
|---|
| [2952] | 166 |  | 
|---|
 | 167 |           } | 
|---|
| [2932] | 168 |         else | 
|---|
 | 169 |           { | 
|---|
 | 170 |             printf("MouseButton %d pressed at (%d,%d).\n", | 
|---|
 | 171 |                    event.button.button, event.button.x, event.button.y); | 
|---|
| [2936] | 172 |             rotatorV = ( (float)wHandler.screen->w/2 -event.button.x) / (float)wHandler.screen->w / 100.0; | 
|---|
| [2932] | 173 |           } | 
|---|
 | 174 |              | 
|---|
| [2931] | 175 |         break; | 
|---|
| [2952] | 176 |       case SDL_MOUSEBUTTONUP: | 
|---|
 | 177 |         if (event.button.button == 4); | 
|---|
 | 178 |         else if (event.button.button == 5); | 
|---|
 | 179 |         else if (event.button.button == 1) | 
|---|
 | 180 |           mouse1Down =false; | 
|---|
 | 181 |         else  | 
|---|
 | 182 |             { | 
|---|
| [2931] | 183 |         printf("MouseButton %d released at (%d,%d).\n", | 
|---|
 | 184 |                event.button.button, event.button.x, event.button.y); | 
|---|
| [2952] | 185 |             } | 
|---|
| [2931] | 186 |         break; | 
|---|
| [2952] | 187 |              | 
|---|
| [2748] | 188 |         // If a quit event was recieved | 
|---|
| [2863] | 189 |       case SDL_QUIT: | 
|---|
 | 190 |         // then we're done and we'll end this program | 
|---|
| [2748] | 191 |           done=TRUE; | 
|---|
 | 192 |           break; | 
|---|
| [2863] | 193 |       default: | 
|---|
| [2748] | 194 |           break; | 
|---|
 | 195 |       } | 
|---|
| [2952] | 196 |  | 
|---|
 | 197 |  | 
|---|
| [2748] | 198 |     } | 
|---|
 | 199 |  | 
|---|
 | 200 |     // Get the state of the keyboard keys | 
|---|
 | 201 |     keys = SDL_GetKeyState(NULL); | 
|---|
 | 202 |  | 
|---|
 | 203 |     // and check if ESCAPE has been pressed. If so then quit | 
|---|
 | 204 |     if(keys[SDLK_ESCAPE]) done=TRUE; | 
|---|
 | 205 |   } | 
|---|
 | 206 |  | 
|---|
 | 207 |   // Kill the GL & SDL screens | 
|---|
| [2848] | 208 |   delete obj; | 
|---|
| [2748] | 209 |   wHandler.KillGLWindow(); | 
|---|
 | 210 |   // And quit | 
|---|
 | 211 |   return 0; | 
|---|
 | 212 | } | 
|---|