#include "meshgen.h"
#include "backdrop.h"
#include "goatvr.h"
-
-static bool parse_args(int argc, char **argv);
+#include "opt.h"
int win_width, win_height;
float win_aspect;
long time_msec;
Mat4 view_matrix;
-static bool use_vr;
static bool should_swap;
static float cam_theta, cam_phi;
bool app_init(int argc, char **argv)
{
- if(!parse_args(argc, argv)) {
+ if(!init_options(argc, argv, 0)) {
return false;
}
if(init_opengl() == -1) {
glEnable(GL_LIGHT0);
if(GLEW_ARB_framebuffer_sRGB) {
+ printf("enabling sRGB framebuffer\n");
glEnable(GL_FRAMEBUFFER_SRGB);
}
- if(use_vr) {
+ if(opt.vr) {
if(goatvr_init() == -1) {
return false;
}
void app_cleanup()
{
- if(use_vr) {
+ if(opt.vr) {
goatvr_shutdown();
}
delete mesh_torus;
void app_draw()
{
- if(use_vr) {
+ if(opt.vr) {
// VR mode
goatvr_draw_start();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
break;
case ' ':
- if(use_vr) {
+ if(opt.vr) {
goatvr_recenter();
}
break;
if(bnstate[0]) {
cam_theta += dx * 0.5;
- if(!use_vr || !goatvr_have_headtracking()) {
+ if(!opt.vr || !goatvr_have_headtracking()) {
cam_phi += dy * 0.5;
if(cam_phi < -90) cam_phi = -90;
}
app_redraw();
}
-
-static bool parse_args(int argc, char **argv)
-{
- for(int i=1; i<argc; i++) {
- if(argv[i][0] == '-') {
- if(strcmp(argv[i], "-vr") == 0) {
- use_vr = true;
-
- } else if(strcmp(argv[i], "-novr") == 0) {
- use_vr = false;
-
- } else if(strcmp(argv[i], "-help") == 0) {
- printf("usage: %s [options]\noptions:\n", argv[0]);
- printf(" -vr/-novr: enable/disable VR\n");
- printf(" -help: print usage information and exit\n");
- exit(0);
- } else {
- fprintf(stderr, "invalid option: %s\n", argv[i]);
- return false;
- }
- } else {
- fprintf(stderr, "unexpected option: %s\n", argv[i]);
- return false;
- }
- }
- return true;
-}
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <optcfg.h>
+#include "opt.h"
+
+Options opt;
+
+enum {
+ OPT_VR,
+ OPT_SRGB,
+ OPT_FULLSCREEN,
+ OPT_WINDOWED,
+ OPT_HELP
+};
+
+static optcfg_option options[] = {
+ // short, long, id, desc
+ {0, "vr", OPT_VR, "enable VR mode"},
+ {0, "srgb", OPT_SRGB, "use linear color space"},
+ {'f', "fullscreen", OPT_FULLSCREEN, "run in fullscreen mode"},
+ {'w', "windowed", OPT_WINDOWED, "run in windowed mode"},
+ {'h', "help", OPT_HELP, "print usage and exit"},
+ OPTCFG_OPTIONS_END
+};
+
+static int opt_handler(optcfg *oc, int opt, void *cls);
+
+bool init_options(int argc, char **argv, const char *cfgfile)
+{
+ // default options
+ memset(&opt, 0, sizeof opt);
+ opt.srgb = true;
+
+ optcfg *oc = optcfg_init(options);
+ optcfg_set_opt_callback(oc, opt_handler, 0);
+
+ if(cfgfile && optcfg_parse_config_file(oc, cfgfile) == -1) {
+ optcfg_destroy(oc);
+ return false;
+ }
+
+ if(argv && optcfg_parse_args(oc, argc, argv) == -1) {
+ fprintf(stderr, "invalid option\n");
+ optcfg_destroy(oc);
+ return false;
+ }
+
+ optcfg_destroy(oc);
+ return true;
+}
+
+static bool is_enabled(optcfg *oc)
+{
+ int res;
+ optcfg_enabled_value(oc, &res);
+ return res != 0;
+}
+
+static int opt_handler(optcfg *oc, int optid, void *cls)
+{
+ switch(optid) {
+ case OPT_VR:
+ opt.vr = is_enabled(oc);
+ break;
+
+ case OPT_SRGB:
+ opt.srgb = is_enabled(oc);
+ break;
+
+ case OPT_FULLSCREEN:
+ opt.fullscreen = is_enabled(oc);
+ break;
+
+ case OPT_WINDOWED:
+ opt.fullscreen = !is_enabled(oc);
+ break;
+
+ case OPT_HELP:
+ printf("Usage: vrfileman [options]\nOptions:\n");
+ optcfg_print_options(oc);
+ exit(0);
+ }
+ return true;
+}