First draft of a utility to generate normal maps from a regular texture.
This commit is contained in:
parent
38d327ba24
commit
0a4cb24692
2 changed files with 130 additions and 1 deletions
|
@ -1,7 +1,10 @@
|
||||||
noinst_PROGRAMS = threedconvert animassist
|
noinst_PROGRAMS = threedconvert animassist normalmap
|
||||||
|
|
||||||
threedconvert_SOURCES = 3dconvert.cxx
|
threedconvert_SOURCES = 3dconvert.cxx
|
||||||
threedconvert_LDADD = -lplibssg -lplibsg -lplibul $(opengl_LIBS) $(audio_LIBS)
|
threedconvert_LDADD = -lplibssg -lplibsg -lplibul $(opengl_LIBS) $(audio_LIBS)
|
||||||
|
|
||||||
animassist_SOURCES = animassist.c
|
animassist_SOURCES = animassist.c
|
||||||
animassist_LDADD = $(base_LIBS)
|
animassist_LDADD = $(base_LIBS)
|
||||||
|
|
||||||
|
normalmap_SOURCES = normalmap.cxx
|
||||||
|
normalmap_LDADD = -lsgscreen $(opengl_LIBS) $(base_LIBS) -lz
|
||||||
|
|
126
utils/Modeller/normalmap.cxx
Normal file
126
utils/Modeller/normalmap.cxx
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* Create normal map textures from regular textures.
|
||||||
|
* Created by: Erik Hofman
|
||||||
|
*
|
||||||
|
* This file is in public domain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <GL/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;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLubyte *make_map( GLubyte *data, int width, int height, int colors )
|
||||||
|
{
|
||||||
|
GLubyte *map = (GLubyte *)malloc (width * height * 3);
|
||||||
|
|
||||||
|
for (int y=0; y<height; y++)
|
||||||
|
for (int x=0; x<width; x++)
|
||||||
|
{
|
||||||
|
int mpos = (x + y*width)*3;
|
||||||
|
int dpos = (x + y*width)*colors;
|
||||||
|
|
||||||
|
int xp1 = (x < (width-1)) ? x+1 : 0;
|
||||||
|
int yp1 = (y < (height-1)) ? y+1 : 0;
|
||||||
|
int posxp1 = (xp1 + y*width)*colors;
|
||||||
|
int posyp1 = (x + yp1*width)*colors;
|
||||||
|
|
||||||
|
map[mpos+0] = (128+(data[posxp1]-data[dpos])/2);
|
||||||
|
map[mpos+1] = (128+(data[posyp1]-data[dpos])/2);
|
||||||
|
map[mpos+2] = 128 + GLubyte(128*brightness);
|
||||||
|
}
|
||||||
|
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
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_grayscale();
|
||||||
|
texture.make_normalmap();
|
||||||
|
texture.write_texture(normalmap_file);
|
||||||
|
|
||||||
|
free( normalmap_file );
|
||||||
|
free( texture_file );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue