Mercurial > hg > forks > gldragon
comparison glxdragon.cpp @ 12:52a586c344f4
Add option -m<filename prefix> to specify mesh/shader filename prefix.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 28 Oct 2019 15:03:52 +0200 |
parents | 89dc8caeff41 |
children | c1e8057cc4d0 |
comparison
equal
deleted
inserted
replaced
11:89dc8caeff41 | 12:52a586c344f4 |
---|---|
52 { | 52 { |
53 int nvertices, nfaces; | 53 int nvertices, nfaces; |
54 std::vector<float> vertices; | 54 std::vector<float> vertices; |
55 std::vector<unsigned> faces; | 55 std::vector<unsigned> faces; |
56 | 56 |
57 GLuint id_prog, id_ps, id_vs; | 57 GLuint id_prog, id_fs, id_vs; |
58 }; | 58 }; |
59 | |
60 | 59 |
61 | 60 |
62 /* Options | 61 /* Options |
63 */ | 62 */ |
64 bool optUseShaders = false; | 63 bool optUseShaders = false; |
65 int optWidth = SET_DEF_WIDTH, | 64 int optWidth = SET_DEF_WIDTH, |
66 optHeight = SET_DEF_HEIGHT; | 65 optHeight = SET_DEF_HEIGHT; |
66 std::string optModelPrefix = "dragon"; | |
67 | 67 |
68 | 68 |
69 /* Globals | 69 /* Globals |
70 */ | 70 */ |
71 SDL_Window *dmWindow = NULL; | 71 SDL_Window *dmWindow = NULL; |
293 | 293 |
294 | 294 |
295 void dmLinkMeshShaders(Mesh &mesh) | 295 void dmLinkMeshShaders(Mesh &mesh) |
296 { | 296 { |
297 mesh.id_prog = glCreateProgram(); | 297 mesh.id_prog = glCreateProgram(); |
298 glAttachShader(mesh.id_prog, mesh.id_ps); | 298 glAttachShader(mesh.id_prog, mesh.id_fs); |
299 glAttachShader(mesh.id_prog, mesh.id_vs); | 299 glAttachShader(mesh.id_prog, mesh.id_vs); |
300 glLinkProgram(mesh.id_prog); | 300 glLinkProgram(mesh.id_prog); |
301 } | 301 } |
302 | 302 |
303 | 303 |
304 int main(int argc, char *argv[]) | 304 int main(int argc, char *argv[]) |
305 { | 305 { |
306 struct Mesh dragonMesh; | 306 std::string modelVertStr, modelFragStr; |
307 std::string dragonVS, dragonFS; | 307 struct Mesh modelMesh; |
308 bool exitFlag = false, optShowHelp = false; | 308 bool exitFlag = false, optShowHelp = false; |
309 int startTime, nframes = 0; | 309 int startTime, nframes = 0; |
310 | 310 |
311 // Check commandline argument for enabling shaders | 311 // Check commandline argument for enabling shaders |
312 for (int narg = 1; narg < argc; narg++) | 312 for (int narg = 1; narg < argc; narg++) |
315 if (arg[0] == '-') | 315 if (arg[0] == '-') |
316 { | 316 { |
317 char *opt = arg + 1; | 317 char *opt = arg + 1; |
318 | 318 |
319 if ((opt[0] == '-' && opt[1] == 'h' && opt[2] == 'e') || | 319 if ((opt[0] == '-' && opt[1] == 'h' && opt[2] == 'e') || |
320 opt[0] == '?') | 320 opt[0] == '?' || (opt[0] == '-' && opt[1] == '?')) |
321 { | 321 { |
322 optShowHelp = true; | 322 optShowHelp = true; |
323 break; | 323 break; |
324 } | 324 } |
325 else | 325 else |
332 if (opt[0] == 'w') | 332 if (opt[0] == 'w') |
333 optWidth = atoi(opt + 1); | 333 optWidth = atoi(opt + 1); |
334 else | 334 else |
335 if (opt[0] == 'h') | 335 if (opt[0] == 'h') |
336 optHeight = atoi(opt + 1); | 336 optHeight = atoi(opt + 1); |
337 else | |
338 if (opt[0] == 'm') | |
339 { | |
340 if (opt[1] == 0) | |
341 { | |
342 printf("Option -m requires an argument.\n"); | |
343 goto exit; | |
344 } | |
345 | |
346 optModelPrefix = std::string(opt + 1); | |
347 } | |
337 } | 348 } |
338 } | 349 } |
339 | 350 |
340 if (optShowHelp) | 351 if (optShowHelp) |
341 { | 352 { |
342 printf( | 353 printf( |
343 "Usage: %s [options]\n" | 354 "Usage: %s [options]\n" |
344 "-? Show this help\n" | 355 "-? Show this help\n" |
345 "-g Use GLSL shader instead of basic OpenGL lighting\n" | 356 "-g Use GLSL shader instead of basic OpenGL lighting\n" |
346 "-w<width> Window width (default %d)\n" | 357 "-w<width> Window width (default %d)\n" |
347 "-h<height> Window height (default %d)\n" | 358 "-h<height> Window height (default %d)\n" |
359 "-m<modelfile> Set model filenames prefix. Using \"-mfoo\" will\n" | |
360 " specify \"foo.mesh\", \"foo.frag\", \"foo.vert\".\n" | |
348 "\n", | 361 "\n", |
349 argv[0], | 362 argv[0], |
350 SET_DEF_WIDTH, SET_DEF_HEIGHT | 363 SET_DEF_WIDTH, SET_DEF_HEIGHT |
351 ); | 364 ); |
352 | 365 |
353 goto exit; | 366 goto exit; |
354 } | 367 } |
355 | 368 |
356 if (!dmLoadMesh("dragon.mesh", dragonMesh, 100139, 200198)) | 369 if (optModelPrefix.empty()) |
370 { | |
371 printf("Model file prefix empty.\n"); | |
357 goto exit; | 372 goto exit; |
373 } | |
374 | |
375 if (!dmLoadMesh(optModelPrefix + ".mesh", modelMesh, 100139, 200198)) | |
376 goto exit; | |
358 | 377 |
359 if (optUseShaders) | 378 if (optUseShaders) |
360 { | 379 { |
361 // Read shader files | 380 // Read shader files |
362 if (!dmReadText("dragon.frag", dragonFS) || | 381 if (!dmReadText(optModelPrefix + ".frag", modelFragStr) || |
363 !dmReadText("dragon.vert", dragonVS)) | 382 !dmReadText(optModelPrefix + ".vert", modelVertStr)) |
364 goto exit; | 383 goto exit; |
365 } | 384 } |
366 | 385 |
367 // Initialize SDL + OpenGL | 386 // Initialize SDL + OpenGL |
368 if (!dmInitSDLGL(optWidth, optHeight, "GLXDragon2")) | 387 if (!dmInitSDLGL(optWidth, optHeight, "GLXDragon2")) |
369 goto exit; | 388 goto exit; |
370 | 389 |
371 // According to our mode .. | 390 // According to our mode .. |
372 if (optUseShaders) | 391 if (optUseShaders) |
373 { | 392 { |
374 dragonMesh.id_ps = dmCompileShader(GL_FRAGMENT_SHADER, dragonFS); | 393 modelMesh.id_fs = dmCompileShader(GL_FRAGMENT_SHADER, modelFragStr); |
375 dragonMesh.id_vs = dmCompileShader(GL_VERTEX_SHADER, dragonVS); | 394 modelMesh.id_vs = dmCompileShader(GL_VERTEX_SHADER, modelVertStr); |
376 dmLinkMeshShaders(dragonMesh); | 395 dmLinkMeshShaders(modelMesh); |
377 } | 396 } |
378 else | 397 else |
379 { | 398 { |
380 float specReflection[] = { 0.8f, 0.8f, 0.8f, 1.0f }; | 399 float specReflection[] = { 0.8f, 0.8f, 0.8f, 1.0f }; |
381 | 400 |
429 break; | 448 break; |
430 } | 449 } |
431 } | 450 } |
432 | 451 |
433 // Render the next frame | 452 // Render the next frame |
434 dmPaintGL(dragonMesh); | 453 dmPaintGL(modelMesh); |
435 | 454 |
436 // Draw the current frame | 455 // Draw the current frame |
437 SDL_GL_SwapWindow(dmWindow); | 456 SDL_GL_SwapWindow(dmWindow); |
438 | 457 |
439 // Rotate for 2 degrees | 458 // Rotate for 2 degrees |
452 startTime = SDL_GetTicks(); | 471 startTime = SDL_GetTicks(); |
453 | 472 |
454 // Print the current frames per second | 473 // Print the current frames per second |
455 printf("%.1lf ms for %d frames = %.1lf FPS\n", | 474 printf("%.1lf ms for %d frames = %.1lf FPS\n", |
456 time, SET_FRAMES, (SET_FRAMES * 1000.0f) / time); | 475 time, SET_FRAMES, (SET_FRAMES * 1000.0f) / time); |
457 | |
458 } | 476 } |
459 } | 477 } |
460 | 478 |
461 exit: | 479 exit: |
462 if (dmGLContext != NULL) | 480 if (dmGLContext != NULL) |