annotate src/solar-system.cpp @ 4:7ae4ee5c27f8

Corrected orientation and orbital speed of Moon
author Eris Caffee <discordia@eldalin.com>
date Sun, 28 Apr 2013 18:36:00 -0500
parents c24af3462002
children
rev   line source
discordia@2 1 #include <GLTools.h>
discordia@2 2 #include <GLShaderManager.h>
discordia@2 3 #include <GLFrustum.h>
discordia@2 4 #include <GLBatch.h>
discordia@2 5 #include <GLFrame.h>
discordia@2 6 #include <GLMatrixStack.h>
discordia@2 7 #include <GLGeometryTransform.h>
discordia@2 8 #include <StopWatch.h>
discordia@2 9
discordia@2 10 #include <math.h>
discordia@2 11 #include <ctype.h>
discordia@2 12 #include <stdlib.h>
discordia@2 13 #include <string.h>
discordia@2 14
discordia@2 15 #include <dirent.h>
discordia@2 16
discordia@4 17 #include <string>
discordia@4 18
discordia@2 19 #include <GL/glut.h>
discordia@2 20 #include <GL/glx.h>
discordia@2 21
discordia@4 22 ////////////////////////////////////////////////////////////////////////////////
discordia@4 23
discordia@2 24 GLShaderManager shaderManager;
discordia@2 25 GLMatrixStack modelViewMatrix;
discordia@2 26 GLMatrixStack projectionMatrix;
discordia@2 27 GLFrustum viewFrustum;
discordia@2 28 GLGeometryTransform transformPipeline;
discordia@2 29
discordia@2 30 GLFrame cameraFrame;
discordia@2 31
discordia@2 32 GLenum polymode = GL_FILL;
discordia@2 33
discordia@2 34 int width = 800;
discordia@2 35 int height = 600;
discordia@4 36 int fullscreen = 1;
discordia@2 37
discordia@4 38 ////////////////////////////////////////////////////////////////////////////////
discordia@2 39
discordia@2 40 GLTriangleBatch jupiterBatch;
discordia@2 41 GLTriangleBatch earthBatch;
discordia@2 42 GLTriangleBatch moonBatch;
discordia@2 43 GLTriangleBatch sunBatch;
discordia@4 44
discordia@4 45 ////////////////////////////////////////////////////////////////////////////////
discordia@2 46
discordia@2 47 #define TEX_EARTH 1
discordia@2 48 #define TEX_MOON 2
discordia@2 49 #define TEX_JUPITER 3
discordia@2 50 #define TEX_SUN 4
discordia@2 51 #define NUM_TEXTURES 5
discordia@2 52 GLuint uiTextures[NUM_TEXTURES];
discordia@2 53
discordia@2 54 ////////////////////////////////////////////////////////////////////////////////
discordia@4 55
discordia@4 56 const std::string Data_Dir("../textures/");
discordia@4 57
discordia@4 58 ////////////////////////////////////////////////////////////////////////////////
discordia@4 59
discordia@2 60 #define SCREENSHOT_FILENAME_BASE "screenshot-"
discordia@2 61 #define SCREENSHOT_FILENAME_BASELEN 11
discordia@2 62 #define SCREENSHOT_FILENAME_EXT ".tga"
discordia@2 63 #define SCREENSHOT_FILENAME_EXTLEN 4
discordia@2 64
discordia@2 65 int scandir_filter(const struct dirent * d)
discordia@2 66 {
discordia@2 67 if (memcmp(d->d_name, SCREENSHOT_FILENAME_BASE,
discordia@2 68 SCREENSHOT_FILENAME_BASELEN) != 0) return 0;
discordia@2 69 if (memcmp(d->d_name+SCREENSHOT_FILENAME_BASELEN+3,
discordia@2 70 SCREENSHOT_FILENAME_EXT, SCREENSHOT_FILENAME_EXTLEN) != 0)
discordia@2 71 return 0;
discordia@2 72 if (isdigit(d->d_name[SCREENSHOT_FILENAME_BASELEN])
discordia@2 73 && isdigit(d->d_name[SCREENSHOT_FILENAME_BASELEN+1])
discordia@2 74 && isdigit(d->d_name[SCREENSHOT_FILENAME_BASELEN+2]))
discordia@2 75 return 1;
discordia@2 76 return 0;
discordia@2 77 }
discordia@2 78
discordia@2 79
discordia@2 80 int get_next_file_name(char * filename)
discordia@2 81 {
discordia@2 82 static int i = 0;
discordia@2 83
discordia@2 84 if (i == 0)
discordia@2 85 {
discordia@2 86 char pattern[SCREENSHOT_FILENAME_BASELEN+3+SCREENSHOT_FILENAME_EXTLEN];
discordia@2 87 struct dirent ** file_list;
discordia@2 88 int num_files = scandir(".", &file_list, scandir_filter, alphasort);
discordia@2 89 if (num_files != 0)
discordia@2 90 sprintf(pattern, "%s%%03d%s", SCREENSHOT_FILENAME_BASE,
discordia@2 91 SCREENSHOT_FILENAME_EXT);
discordia@2 92 sscanf(file_list[num_files-1]->d_name, pattern, &i);
discordia@2 93 }
discordia@2 94 i++;
discordia@2 95
discordia@2 96 sprintf(filename, "%s%03d%s", SCREENSHOT_FILENAME_BASE, i,
discordia@2 97 SCREENSHOT_FILENAME_EXT);
discordia@2 98 return i;
discordia@2 99 }
discordia@2 100
discordia@2 101 ////////////////////////////////////////////////////////////////////////////////
discordia@2 102 bool LoadTGATexture(const char * szFileName, GLenum minFilter,
discordia@2 103 GLenum magFilter, GLenum wrapMode)
discordia@2 104 {
discordia@2 105 GLbyte * pBits;
discordia@2 106 int nWidth, nHeight, nComponents;
discordia@2 107 GLenum eFormat;
discordia@2 108
discordia@2 109 pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
discordia@2 110 if (pBits == NULL)
discordia@2 111 {
discordia@2 112 fprintf(stderr, "Failed to load %s\n", szFileName);
discordia@2 113 exit(EXIT_FAILURE);
discordia@2 114 }
discordia@2 115
discordia@2 116 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
discordia@2 117 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);
discordia@2 118
discordia@2 119 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
discordia@2 120 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
discordia@2 121
discordia@2 122 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
discordia@2 123 glTexImage2D(GL_TEXTURE_2D, 0, nComponents, nWidth, nHeight, 0,
discordia@2 124 eFormat, GL_UNSIGNED_BYTE, pBits);
discordia@2 125
discordia@2 126 free(pBits);
discordia@2 127
discordia@2 128 if (minFilter == GL_LINEAR_MIPMAP_LINEAR ||
discordia@2 129 minFilter == GL_LINEAR_MIPMAP_NEAREST ||
discordia@2 130 minFilter == GL_NEAREST_MIPMAP_LINEAR ||
discordia@2 131 minFilter == GL_NEAREST_MIPMAP_NEAREST)
discordia@2 132 {
discordia@2 133 glGenerateMipmap(GL_TEXTURE_2D);
discordia@2 134 }
discordia@2 135
discordia@2 136 return true;
discordia@2 137 }
discordia@2 138
discordia@2 139 ////////////////////////////////////////////////////////////////////////////////
discordia@2 140 void DrawSolarSystem(GLfloat yRot)
discordia@2 141 {
discordia@2 142 static GLfloat vWhite[] = { 1.0f, 1.0f, 1.0f, 1.0f };
discordia@2 143 static GLfloat vLightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f };
discordia@2 144 static M3DVector3f vSunPos = { 0.0f, 0.0f, 0.0f };
discordia@2 145 static M3DVector3f vEarthPos = { 5.0f, 0.0f, 0.0f };
discordia@2 146 static M3DVector3f vJupiterPos = { 10.0f, 0.0f, 0.0f };
discordia@2 147
discordia@2 148 float RotScale = 100.0;
discordia@2 149 float SunRotSpeed = 1.0/(25*24) * RotScale;
discordia@2 150
discordia@2 151 float JupiterRotSpeed = 1.0/9 * RotScale;
discordia@2 152 float JupiterAxialTilt = 3.13;
discordia@2 153
discordia@2 154 float EarthRotSpeed = 1.0/24 * RotScale;
discordia@2 155 float EarthAxialTilt = 23.5;
discordia@2 156
discordia@2 157 float MoonRotSpeed = 1.0/29.5 * RotScale;
discordia@2 158 float MoonAxialTilt = 6.7;
discordia@4 159 float MoonOrbitSpeed = 1.0/(24*29.5) * RotScale;
discordia@2 160 float MoonOrbitTilt = 5.145;
discordia@2 161
discordia@2 162 static CStopWatch rotTimer;
discordia@2 163
discordia@2 164 // Get the light position in eye space
discordia@2 165 M3DVector4f vLightTransformed;
discordia@2 166 M3DMatrix44f mCamera;
discordia@2 167 modelViewMatrix.GetMatrix(mCamera);
discordia@2 168 m3dTransformVector4(vLightTransformed, vLightPos, mCamera);
discordia@2 169
discordia@2 170
discordia@2 171 ////////////////////////////////
discordia@2 172 // Begin Sun
discordia@2 173
discordia@2 174 float SunRot = rotTimer.GetElapsedSeconds() * SunRotSpeed;
discordia@2 175
discordia@2 176 modelViewMatrix.PushMatrix();
discordia@2 177
discordia@2 178 modelViewMatrix.Translatev(vSunPos);
discordia@2 179 // North is up!
discordia@2 180 modelViewMatrix.Rotate(-90.0f, 1.0f, 0.0f, 0.0f);
discordia@2 181 // Rotate on axis
discordia@2 182 modelViewMatrix.Rotate(SunRot, 0.0f, 0.0f, 1.0f);
discordia@2 183
discordia@2 184 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_SUN]);
discordia@2 185 if (polymode == GL_FILL)
discordia@2 186 {
discordia@2 187 shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE,
discordia@2 188 transformPipeline.GetModelViewProjectionMatrix(),
discordia@2 189 0);
discordia@2 190 }
discordia@2 191 else
discordia@2 192 {
discordia@2 193 shaderManager.UseStockShader(GLT_SHADER_FLAT,
discordia@2 194 transformPipeline.GetModelViewProjectionMatrix(),
discordia@2 195 vWhite);
discordia@2 196 }
discordia@2 197 sunBatch.Draw();
discordia@2 198 modelViewMatrix.PopMatrix();
discordia@2 199 // End Sun
discordia@2 200 /////////////////////////////////
discordia@2 201
discordia@2 202
discordia@2 203 ////////////////////////////////
discordia@2 204 // Jupiter
discordia@2 205 float JupiterRot = rotTimer.GetElapsedSeconds() * JupiterRotSpeed;
discordia@2 206
discordia@2 207 modelViewMatrix.PushMatrix();
discordia@2 208 modelViewMatrix.Translatev(vJupiterPos);
discordia@2 209 // North is up!
discordia@2 210 modelViewMatrix.Rotate(-90.0f - JupiterAxialTilt, 1.0f, 0.0f, 0.0f);
discordia@2 211 // Rotate on axis
discordia@2 212 modelViewMatrix.Rotate(JupiterRot, 0.0f, 0.0f, 1.0f);
discordia@2 213
discordia@2 214 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_JUPITER]);
discordia@2 215 if (polymode == GL_FILL)
discordia@2 216 {
discordia@2 217 // shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE,
discordia@2 218 // transformPipeline.GetModelViewProjectionMatrix(),
discordia@2 219 // 0);
discordia@2 220 shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
discordia@2 221 modelViewMatrix.GetMatrix(),
discordia@2 222 transformPipeline.GetProjectionMatrix(),
discordia@2 223 vLightTransformed,
discordia@2 224 vWhite,
discordia@2 225 0);
discordia@2 226 }
discordia@2 227 else
discordia@2 228 {
discordia@2 229 shaderManager.UseStockShader(GLT_SHADER_FLAT,
discordia@2 230 transformPipeline.GetModelViewProjectionMatrix(),
discordia@2 231 vWhite);
discordia@2 232
discordia@2 233 }
discordia@2 234 jupiterBatch.Draw();
discordia@2 235 modelViewMatrix.PopMatrix();
discordia@2 236 // End Jupiter
discordia@2 237 ////////////////////////////////
discordia@2 238
discordia@2 239
discordia@2 240
discordia@2 241
discordia@2 242 /////////////////////////////////
discordia@2 243 // Begin Earth/Moon
discordia@2 244
discordia@2 245 // Begin Earth
discordia@2 246 float EarthRot = rotTimer.GetElapsedSeconds() * EarthRotSpeed;
discordia@2 247
discordia@2 248 modelViewMatrix.PushMatrix();
discordia@2 249 modelViewMatrix.Translatev(vEarthPos);
discordia@2 250 modelViewMatrix.PushMatrix(); // Save unrotated matrix for when we do the Moon
discordia@2 251
discordia@2 252 // NOrth is up!
discordia@2 253 modelViewMatrix.Rotate(-90.0f - EarthAxialTilt, 1.0f, 0.0f, 0.0f);
discordia@2 254 // Rotate on the axis
discordia@2 255 modelViewMatrix.Rotate(EarthRot, 0.0f, 0.0f, 1.0f);
discordia@2 256
discordia@2 257 if (polymode == GL_FILL)
discordia@2 258 {
discordia@2 259 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_EARTH]);
discordia@2 260 shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
discordia@2 261 modelViewMatrix.GetMatrix(),
discordia@2 262 transformPipeline.GetProjectionMatrix(),
discordia@2 263 vLightTransformed,
discordia@2 264 vWhite,
discordia@2 265 0);
discordia@2 266 }
discordia@2 267 else
discordia@2 268 {
discordia@2 269 shaderManager.UseStockShader(GLT_SHADER_FLAT,
discordia@2 270 transformPipeline.GetModelViewProjectionMatrix(),
discordia@2 271 vWhite);
discordia@2 272
discordia@2 273 }
discordia@2 274 earthBatch.Draw();
discordia@2 275 modelViewMatrix.PopMatrix();
discordia@2 276
discordia@2 277 // Begin Moon
discordia@2 278
discordia@2 279
discordia@2 280 // orbit the Earth
discordia@2 281 modelViewMatrix.Rotate(MoonOrbitTilt, 0.0f, 0.0f, 1.0f);
discordia@4 282
discordia@2 283 // NOrth is up!
discordia@4 284 modelViewMatrix.Rotate(90.0f - MoonAxialTilt, -1.0f, 0.0f, 0.0f);
discordia@4 285 modelViewMatrix.Rotate(90.0f, 0.0f, 0.0f, 1.0f);
discordia@2 286
discordia@2 287 float MoonRot = rotTimer.GetElapsedSeconds() * MoonOrbitSpeed * 10;
discordia@4 288 modelViewMatrix.Rotate(MoonRot, 0.0f, 0.0f, 1.0f);
discordia@2 289
discordia@4 290 modelViewMatrix.Translate(0.0f, 0.5f, 0.0f);
discordia@2 291
discordia@2 292
discordia@2 293 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_MOON]);
discordia@2 294 if (polymode == GL_FILL)
discordia@2 295 {
discordia@2 296 shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
discordia@2 297 modelViewMatrix.GetMatrix(),
discordia@2 298 transformPipeline.GetProjectionMatrix(),
discordia@2 299 vLightTransformed,
discordia@2 300 vWhite,
discordia@2 301 0);
discordia@2 302 }
discordia@2 303 else
discordia@2 304 {
discordia@2 305 shaderManager.UseStockShader(GLT_SHADER_FLAT,
discordia@2 306 transformPipeline.GetModelViewProjectionMatrix(),
discordia@2 307 vWhite);
discordia@2 308 }
discordia@2 309 moonBatch.Draw();
discordia@2 310 modelViewMatrix.PopMatrix();
discordia@2 311
discordia@2 312
discordia@2 313 modelViewMatrix.PopMatrix();
discordia@2 314 // End Earth/Moon
discordia@2 315 ////////////////////////////////
discordia@2 316
discordia@2 317 }
discordia@2 318
discordia@2 319 ////////////////////////////////////////////////////////////////////////////////
discordia@2 320 void RenderScene(void)
discordia@2 321 {
discordia@2 322 static CStopWatch rotTimer;
discordia@2 323 float yRot = - rotTimer.GetElapsedSeconds() * 60.0f;
discordia@2 324
discordia@2 325 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
discordia@2 326
discordia@2 327 // Begin Render
discordia@2 328 modelViewMatrix.PushMatrix();
discordia@2 329
discordia@2 330 // Begin Camera position
discordia@2 331 static M3DMatrix44f mCamera;
discordia@2 332 cameraFrame.GetCameraMatrix(mCamera);
discordia@2 333 modelViewMatrix.MultMatrix(mCamera);
discordia@2 334 // End Camera position
discordia@2 335
discordia@2 336 DrawSolarSystem(yRot);
discordia@2 337
discordia@2 338 // End Render
discordia@2 339 modelViewMatrix.PopMatrix();
discordia@2 340
discordia@2 341 glutSwapBuffers();
discordia@2 342 glutPostRedisplay();
discordia@2 343 }
discordia@2 344
discordia@2 345 ////////////////////////////////////////////////////////////////////////////////
discordia@2 346 void SetupRC()
discordia@2 347 {
discordia@2 348 shaderManager.InitializeStockShaders();
discordia@2 349 glEnable(GL_DEPTH_TEST);
discordia@2 350 glEnable(GL_CULL_FACE);
discordia@2 351 glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
discordia@2 352
discordia@2 353 gltMakeSphere(jupiterBatch, 0.5f, 128, 128 );
discordia@2 354 gltMakeSphere(earthBatch, 0.2f, 26, 26);
discordia@2 355 gltMakeSphere(moonBatch, 0.1f, 26, 26);
discordia@2 356 gltMakeSphere(sunBatch, 1.0f, 26, 26);
discordia@2 357
discordia@2 358 glGenTextures(NUM_TEXTURES, uiTextures);
discordia@2 359
discordia@4 360 std::string f;
discordia@4 361
discordia@4 362 f.assign(Data_Dir).append("earth.tga");
discordia@2 363 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_EARTH]);
discordia@4 364 LoadTGATexture(f.c_str(), GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
discordia@2 365
discordia@4 366 f.assign(Data_Dir).append("moon.tga");
discordia@2 367 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_MOON]);
discordia@4 368 LoadTGATexture(f.c_str(), GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
discordia@2 369
discordia@4 370 f.assign(Data_Dir).append("jupiter.tga");
discordia@2 371 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_JUPITER]);
discordia@4 372 LoadTGATexture(f.c_str(), GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
discordia@2 373
discordia@4 374 f.assign(Data_Dir).append("sun.tga");
discordia@2 375 glBindTexture(GL_TEXTURE_2D, uiTextures[TEX_SUN]);
discordia@4 376 LoadTGATexture(f.c_str(), GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR, GL_CLAMP_TO_EDGE);
discordia@2 377
discordia@2 378 static M3DMatrix44f mCamera;
discordia@2 379 cameraFrame.GetCameraMatrix(mCamera);
discordia@2 380 cameraFrame.MoveForward(-10.0);
discordia@2 381 // cameraFrame.RotateWorld(15.0, 0.0f, 1.0f, 0.0f);
discordia@2 382 }
discordia@2 383
discordia@2 384 ////////////////////////////////////////////////////////////////////////////////
discordia@2 385 void ShutDownRC(void)
discordia@2 386 {
discordia@2 387 glDeleteTextures(NUM_TEXTURES, uiTextures);
discordia@2 388 }
discordia@2 389
discordia@2 390 ////////////////////////////////////////////////////////////////////////////////
discordia@2 391 void ChangeSize(int nWidth, int nHeight)
discordia@2 392 {
discordia@2 393 if (nHeight == 0)
discordia@2 394 {
discordia@2 395 nHeight = 1;
discordia@2 396 }
discordia@2 397 glViewport(0,0,nWidth, nHeight);
discordia@2 398 viewFrustum.SetPerspective(35.0f, float(nWidth)/float(nHeight), 1.0f, 100.0f);
discordia@2 399 projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
discordia@2 400 transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
discordia@2 401 }
discordia@2 402
discordia@2 403 ////////////////////////////////////////////////////////////////////////////////
discordia@2 404 void SpecialKeys(int key, int x, int y)
discordia@2 405 {
discordia@2 406 }
discordia@2 407
discordia@2 408 ////////////////////////////////////////////////////////////////////////////////
discordia@2 409 void KeyboardFunc(unsigned char key, int x, int y)
discordia@2 410 {
discordia@2 411 static int changed;
discordia@2 412 static float linear = 0.1f;
discordia@2 413
discordia@2 414 changed = 0;
discordia@2 415
discordia@2 416 if ('w' == key)
discordia@2 417 {
discordia@2 418 cameraFrame.MoveForward(linear);
discordia@2 419 changed = 1;
discordia@2 420 }
discordia@2 421 else if ('W' == key)
discordia@2 422 {
discordia@2 423 cameraFrame.MoveForward(10*linear);
discordia@2 424 changed = 1;
discordia@2 425 }
discordia@2 426 else if ('s' == key)
discordia@2 427 {
discordia@2 428 cameraFrame.MoveForward(-linear);
discordia@2 429 changed = 1;
discordia@2 430 }
discordia@2 431 else if ('S' == key)
discordia@2 432 {
discordia@2 433 cameraFrame.MoveForward(-10*linear);
discordia@2 434 changed = 1;
discordia@2 435 }
discordia@2 436 else if ('a' == key)
discordia@2 437 {
discordia@2 438 cameraFrame.MoveRight(linear);
discordia@2 439 changed = 1;
discordia@2 440 }
discordia@2 441 else if ('A' == key)
discordia@2 442 {
discordia@2 443 cameraFrame.MoveRight(10*linear);
discordia@2 444 changed = 1;
discordia@2 445 }
discordia@2 446 else if ('d' == key)
discordia@2 447 {
discordia@2 448 cameraFrame.MoveRight(-linear);
discordia@2 449 changed = 1;
discordia@2 450 }
discordia@2 451 else if ('D' == key)
discordia@2 452 {
discordia@2 453 cameraFrame.MoveRight(-10*linear);
discordia@2 454 changed = 1;
discordia@2 455 }
discordia@2 456
discordia@2 457 else if ('q' == key)
discordia@2 458 {
discordia@2 459 exit(0);
discordia@2 460 }
discordia@2 461 else if ('f' == key)
discordia@2 462 {
discordia@2 463 if (fullscreen)
discordia@2 464 {
discordia@2 465 glutReshapeWindow(width, height);
discordia@2 466 fullscreen = 0;
discordia@2 467 }
discordia@2 468 else
discordia@2 469 {
discordia@2 470 width = glutGet(GLUT_WINDOW_WIDTH);
discordia@2 471 height = glutGet(GLUT_WINDOW_HEIGHT);
discordia@2 472 glutFullScreen();
discordia@2 473 fullscreen = 1;
discordia@2 474 }
discordia@2 475 }
discordia@2 476 else if ('o' == key)
discordia@2 477 {
discordia@2 478 // 'o' for 'outline' - toggle wireframe rendering
discordia@2 479 polymode = (polymode == GL_FILL) ? GL_LINE : GL_FILL;
discordia@2 480 glPolygonMode(GL_FRONT_AND_BACK, polymode);
discordia@2 481 }
discordia@2 482 else if ('p' == key)
discordia@2 483 {
discordia@2 484 // 'p' for 'print screen' - save a screenshot
discordia@2 485 char filename[20];
discordia@2 486 get_next_file_name(filename);
discordia@2 487
discordia@2 488 gltGrabScreenTGA(filename);
discordia@2 489 }
discordia@2 490
discordia@2 491 if (changed)
discordia@2 492 {
discordia@2 493 glutPostRedisplay();
discordia@2 494 }
discordia@2 495 }
discordia@2 496
discordia@2 497 ////////////////////////////////////////////////////////////////////////////////
discordia@2 498 void MouseMotionFunc (int x, int y)
discordia@2 499 {
discordia@2 500 static float angular = (float) m3dDegToRad(0.5f);
discordia@2 501 static int xx = -1;
discordia@2 502 static int yy = -1;
discordia@2 503
discordia@2 504 if (-1 == xx)
discordia@2 505 {
discordia@2 506 xx = x;
discordia@2 507 yy = y;
discordia@2 508 }
discordia@2 509
discordia@2 510 if ((0 == x) || (x < xx))
discordia@2 511 {
discordia@2 512 cameraFrame.RotateWorld(angular, 0.0f, 1.0f, 0.0f);
discordia@2 513 glutPostRedisplay();
discordia@2 514 }
discordia@2 515 else if ((x == glutGet(GLUT_WINDOW_WIDTH) -1) || (x > xx))
discordia@2 516 {
discordia@2 517 cameraFrame.RotateWorld(-angular, 0.0f, 1.0f, 0.0f);
discordia@2 518 glutPostRedisplay();
discordia@2 519 }
discordia@2 520 // Hmm. Need to transform normal vector, don't I?
discordia@2 521 // if ((0 == y) || (y < yy))
discordia@2 522 // {
discordia@2 523 // cameraFrame.RotateWorld(angular, 1.0f, 0.0f, 0.0f);
discordia@2 524 // }
discordia@2 525 // else if ((y == glutGet(GLUT_WINDOW_HEIGHT) -1) || (y > yy))
discordia@2 526 // {
discordia@2 527 // cameraFrame.RotateWorld(-angular, 1.0f, 0.0f, 0.0f);
discordia@2 528 // }
discordia@2 529
discordia@2 530 xx = x;
discordia@2 531 yy = y;
discordia@2 532 }
discordia@2 533
discordia@2 534 ////////////////////////////////////////////////////////////////////////////////
discordia@2 535 int main (int argc, char * argv[])
discordia@2 536 {
discordia@2 537 gltSetWorkingDirectory(argv[0]);
discordia@2 538 glutInit(&argc, argv);
discordia@2 539 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
discordia@2 540 glutInitWindowSize(800, 600);
discordia@4 541 glutCreateWindow("OpenGL Solar System");
discordia@2 542
discordia@2 543 glutReshapeFunc(ChangeSize);
discordia@2 544 glutDisplayFunc(RenderScene);
discordia@2 545 glutSpecialFunc(SpecialKeys);
discordia@2 546 glutKeyboardFunc(KeyboardFunc);
discordia@2 547 glutMotionFunc(MouseMotionFunc);
discordia@2 548 glutPassiveMotionFunc(MouseMotionFunc);
discordia@2 549 glutSetCursor(GLUT_CURSOR_NONE);
discordia@2 550
discordia@2 551 GLenum err = glewInit();
discordia@2 552 if (GLEW_OK != err)
discordia@2 553 {
discordia@2 554 fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
discordia@2 555 return 1;
discordia@2 556 }
discordia@2 557
discordia@2 558 // This enabled vertical sync on Linux
discordia@2 559 // For full generality I should use Glew and check what OS I'm on.
discordia@2 560 // Note that the ATI Catalyst driver exports the WGL_EXT_swap_control
discordia@2 561 // extension name instead of SGI_swap_control as it should.
discordia@2 562 // but nonetheless the actual function provided is glXSwapIntervalSGI
discordia@2 563
discordia@2 564 PFNGLXSWAPINTERVALSGIPROC SwapInterval;
discordia@2 565 SwapInterval = (PFNGLXSWAPINTERVALSGIPROC)glXGetProcAddress((const GLubyte*)"glXSwapIntervalSGI");
discordia@2 566
discordia@2 567 if (SwapInterval)
discordia@2 568 SwapInterval(1);
discordia@2 569
discordia@2 570 SetupRC();
discordia@4 571
discordia@4 572 glutFullScreen();
discordia@4 573 fullscreen = 1;
discordia@4 574
discordia@2 575 glutMainLoop();
discordia@2 576 ShutDownRC();
discordia@2 577
discordia@2 578 return 0;
discordia@2 579 }
discordia@2 580
discordia@2 581
discordia@2 582
discordia@2 583
discordia@2 584