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)