From 0a4cb2469274b4f88ceaf4494a10dfeec820df2a Mon Sep 17 00:00:00 2001 From: ehofman Date: Fri, 14 Jan 2005 14:29:08 +0000 Subject: [PATCH] First draft of a utility to generate normal maps from a regular texture. --- utils/Modeller/Makefile.am | 5 +- utils/Modeller/normalmap.cxx | 126 +++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 utils/Modeller/normalmap.cxx diff --git a/utils/Modeller/Makefile.am b/utils/Modeller/Makefile.am index 82223ad08..f8cf987f1 100644 --- a/utils/Modeller/Makefile.am +++ b/utils/Modeller/Makefile.am @@ -1,7 +1,10 @@ -noinst_PROGRAMS = threedconvert animassist +noinst_PROGRAMS = threedconvert animassist normalmap threedconvert_SOURCES = 3dconvert.cxx threedconvert_LDADD = -lplibssg -lplibsg -lplibul $(opengl_LIBS) $(audio_LIBS) animassist_SOURCES = animassist.c animassist_LDADD = $(base_LIBS) + +normalmap_SOURCES = normalmap.cxx +normalmap_LDADD = -lsgscreen $(opengl_LIBS) $(base_LIBS) -lz diff --git a/utils/Modeller/normalmap.cxx b/utils/Modeller/normalmap.cxx new file mode 100644 index 000000000..deb341eb6 --- /dev/null +++ b/utils/Modeller/normalmap.cxx @@ -0,0 +1,126 @@ +/* + * Create normal map textures from regular textures. + * Created by: Erik Hofman + * + * This file is in public domain. + */ + +#include +#include +#include + + +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; +} + +GLubyte *make_map( GLubyte *data, int width, int height, int colors ) +{ + GLubyte *map = (GLubyte *)malloc (width * height * 3); + + for (int y=0; y=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_grayscale(); + texture.make_normalmap(); + texture.write_texture(normalmap_file); + + free( normalmap_file ); + free( texture_file ); + + return 0; +}