/* * Create normal map textures from regular textures. * Created by: Erik Hofman * * This file is in public domain. */ #include <simgear/compiler.h> #include <string.h> #include <stdlib.h> #include SG_GL_H #include <simgear/screen/texture.hxx> static float contrast = 1.0; static float brightness = 1.0; static char *texture_file = NULL, *normalmap_file = NULL; static SGTexture texture; int parse_option(char **args, int n) { char *opt, *arg; int sz, ret=1; opt = args[n]; if (*(opt+1) == '-') opt++; if ((arg = strchr(opt, '=')) != NULL) *arg++ = 0; else { ret++; arg = args[n+1]; } sz = strlen(opt); if (!strncmp(opt, "-help", sz)) { printf("usage:\n normalmap [-c=contrast] [-b=brightness]"); printf(" --t=file [--o=file]\n"); exit(0); } if (!strncmp(opt, "-contrast", sz)) { contrast = atof(arg); return ret; } if (!strncmp(opt, "-brightness", sz)) { brightness = atof(arg); return ret; } if (!strncmp(opt, "-texture", sz) || !strncmp(opt, "-input", sz)) { texture_file = strdup(arg); return ret; } if (!strncmp(opt, "-normalmap", sz) || !strncmp(opt, "-output", sz)) { normalmap_file = strdup(arg); return ret; } return 1; } int main (int argc, char **argv) { int i; for (i=1; i<argc;) i += parse_option(argv, i); if ( !texture_file ) { printf("Error: texture file not specified\n"); return -1; } texture.read_rgb_texture(texture_file); if ( !texture.texture() ) { printf("Error: unable to process input file: %s\n", texture_file); printf(" (%s)\n", texture.err_str()); return -2; } if ( !normalmap_file ) { int i; for (i=strlen(texture_file); i>=0; --i) if (texture_file[i] == '.') break; normalmap_file = (char *)malloc( i+8 ); memcpy(normalmap_file, texture_file, i); memcpy(normalmap_file+i, "_n.rgb\0", 7); } texture.make_normalmap(brightness, contrast); texture.write_texture(normalmap_file); free( normalmap_file ); free( texture_file ); return 0; }