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
|