changeset 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
files glxdragon.cpp
diffstat 1 files changed, 36 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/glxdragon.cpp	Mon Oct 28 13:08:26 2019 +0200
+++ b/glxdragon.cpp	Mon Oct 28 15:03:52 2019 +0200
@@ -54,16 +54,16 @@
     std::vector<float>    vertices;
     std::vector<unsigned> faces;
 
-    GLuint id_prog, id_ps, id_vs;
+    GLuint id_prog, id_fs, id_vs;
 };
 
 
-
 /* Options
  */
 bool   optUseShaders = false;
 int    optWidth = SET_DEF_WIDTH,
        optHeight = SET_DEF_HEIGHT;
+std::string optModelPrefix = "dragon";
 
 
 /* Globals
@@ -295,7 +295,7 @@
 void dmLinkMeshShaders(Mesh &mesh)
 {
     mesh.id_prog = glCreateProgram();
-    glAttachShader(mesh.id_prog, mesh.id_ps);
+    glAttachShader(mesh.id_prog, mesh.id_fs);
     glAttachShader(mesh.id_prog, mesh.id_vs);
     glLinkProgram(mesh.id_prog);
 }
@@ -303,8 +303,8 @@
 
 int main(int argc, char *argv[])
 {
-    struct Mesh dragonMesh;
-    std::string dragonVS, dragonFS;
+    std::string modelVertStr, modelFragStr;
+    struct Mesh modelMesh;
     bool exitFlag = false, optShowHelp = false;
     int startTime, nframes = 0;
 
@@ -317,7 +317,7 @@
             char *opt = arg + 1;
 
             if ((opt[0] == '-' && opt[1] == 'h' && opt[2] == 'e') ||
-                opt[0] == '?')
+                opt[0] == '?' || (opt[0] == '-' && opt[1] == '?'))
             {
                 optShowHelp = true;
                 break;
@@ -334,6 +334,17 @@
             else
             if (opt[0] == 'h')
                 optHeight = atoi(opt + 1);
+            else
+            if (opt[0] == 'm')
+            {
+                if (opt[1] == 0)
+                {
+                    printf("Option -m requires an argument.\n");
+                    goto exit;
+                }
+
+                optModelPrefix = std::string(opt + 1);
+            }
         }
     }
 
@@ -341,10 +352,12 @@
     {
         printf(
             "Usage: %s [options]\n"
-            "-?          Show this help\n"
-            "-g          Use GLSL shader instead of basic OpenGL lighting\n"
-            "-w<width>   Window width (default %d)\n"
-            "-h<height>  Window height (default %d)\n"
+            "-?            Show this help\n"
+            "-g            Use GLSL shader instead of basic OpenGL lighting\n"
+            "-w<width>     Window width (default %d)\n"
+            "-h<height>    Window height (default %d)\n"
+            "-m<modelfile> Set model filenames prefix. Using \"-mfoo\" will\n"
+            "              specify \"foo.mesh\", \"foo.frag\", \"foo.vert\".\n"
             "\n",
             argv[0],
             SET_DEF_WIDTH, SET_DEF_HEIGHT
@@ -353,14 +366,20 @@
         goto exit;
     }
 
-    if (!dmLoadMesh("dragon.mesh", dragonMesh, 100139, 200198))
+    if (optModelPrefix.empty())
+    {
+        printf("Model file prefix empty.\n");
+        goto exit;
+    }
+
+    if (!dmLoadMesh(optModelPrefix + ".mesh", modelMesh, 100139, 200198))
         goto exit;
 
     if (optUseShaders)
     {
         // Read shader files
-        if (!dmReadText("dragon.frag", dragonFS) ||
-            !dmReadText("dragon.vert", dragonVS))
+        if (!dmReadText(optModelPrefix + ".frag", modelFragStr) ||
+            !dmReadText(optModelPrefix + ".vert", modelVertStr))
             goto exit;
     }
 
@@ -371,9 +390,9 @@
     // According to our mode ..
     if (optUseShaders)
     {
-        dragonMesh.id_ps = dmCompileShader(GL_FRAGMENT_SHADER, dragonFS);
-        dragonMesh.id_vs = dmCompileShader(GL_VERTEX_SHADER, dragonVS);
-        dmLinkMeshShaders(dragonMesh);
+        modelMesh.id_fs = dmCompileShader(GL_FRAGMENT_SHADER, modelFragStr);
+        modelMesh.id_vs = dmCompileShader(GL_VERTEX_SHADER, modelVertStr);
+        dmLinkMeshShaders(modelMesh);
     }
     else
     {
@@ -431,7 +450,7 @@
         }
 
         // Render the next frame
-        dmPaintGL(dragonMesh);
+        dmPaintGL(modelMesh);
 
         // Draw the current frame
         SDL_GL_SwapWindow(dmWindow);
@@ -454,7 +473,6 @@
             // Print the current frames per second
             printf("%.1lf ms for %d frames = %.1lf FPS\n",
                 time, SET_FRAMES, (SET_FRAMES * 1000.0f) / time);
-
         }
     }