123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- #!/bin/bash
- # This script generates normalmaps using The GIMP to do the heavy lifting.
- # give any unrecognized switch (say, -h) for usage info.
- rm /tmp/normals_filelist.txt
- numprocs=6
- skiptools=false
- skipinventory=false
- invresolution=64
- dryrun=false
- pattern="*.png *.jpg"
- filter=0
- scale=8
- wrap=0
- heightsource=0
- conversion=0
- invertx=0
- inverty=0
- while test -n "$1"; do
- case "$1" in
- --scale|-s)
- if [ -z "$2" ] ; then echo "Missing scale parameter"; exit 1; fi
- scale=$2
- shift
- shift
- ;;
- --pattern|-p)
- if [ -z "$2" ] ; then echo "Missing pattern parameter"; exit 1; fi
- pattern=$2
- shift
- shift
- ;;
- --skiptools|-t)
- skiptools=true
- shift
- ;;
- --skipinventory|-i)
- if [[ $2 =~ ^[0-9]+$ ]]; then
- invresolution=$2
- shift
- fi
- skipinventory=true
- shift
- ;;
- --filter|-f)
- if [ -z "$2" ] ; then echo "Missing filter parameter"; exit 1; fi
- case "$2" in
- sobel3|1)
- filter=1
- ;;
- sobel5|2)
- filter=2
- ;;
- prewitt3|3)
- filter=3
- ;;
- prewitt5|4)
- filter=4
- ;;
- 3x3|5)
- filter=5
- ;;
- 5x5|6)
- filter=6
- ;;
- 7x7|7)
- filter=7
- ;;
- 9x9|8)
- filter=8
- ;;
- *)
- filter=0
- ;;
- esac
- shift
- shift
- ;;
- --heightalpha|-a)
- heightsource=1
- shift
- ;;
- --conversion|-c)
- if [ -z "$2" ] ; then echo "Missing conversion parameter"; exit 1; fi
- case "$2" in
- biased|1)
- conversion=1
- ;;
- red|2)
- conversion=2
- ;;
- green|3)
- conversion=3
- ;;
- blue|4)
- conversion=4
- ;;
- maxrgb|5)
- conversion=5
- ;;
- minrgb|6)
- conversion=6
- ;;
- colorspace|7)
- conversion=7
- ;;
- normalize-only|8)
- conversion=8
- ;;
- heightmap|9)
- conversion=9
- ;;
- *)
- conversion=0
- ;;
- esac
- shift
- shift
- ;;
- --wrap|-w)
- wrap=1
- shift
- ;;
- --invertx|-x)
- invertx=1
- shift
- ;;
- --inverty|-y)
- inverty=1
- shift
- ;;
- --dryrun|-d)
- dryrun=true
- shift
- ;;
- *)
- echo -e "\nUsage:\n"
- echo "`basename $0` [--scale|-s <value>] [--filter|-f <string>]"
- echo " [--wrap|-w] [--heightalpha|-a] [--invertx|-x] [--inverty|-y]"
- echo " [--conversion|-c <string>] [--skiptools|-t] [--skipinventory|-i [<value>]]"
- echo " [--dryrun|-d] [--pattern|-p <pattern>]"
- echo -e "\nDefaults to a scale of 8, checking all files in the current directory, and not"
- echo "skipping apparent tools or inventory images. Filter, if specified, may be one"
- echo "of: sobel3, sobel5, prewitt3, prewitt5, 3x3, 5x5, 7x7, or 9x9, or a value 1"
- echo "through 8 (1=sobel3, 2=sobel5, etc.). Defaults to 0 (four-sample). The height"
- echo "source is taken from the image's alpha channel if heightalpha is specified.\n"
- echo ""
- echo "If inventory skip is specified, an optional resolution may also be included"
- echo "(default is 64). Conversion can be one of: biased, red, green, blue, maxrgb,"
- echo "minrgb, colorspace, normalize-only, heightmap or a value from 1 to 9"
- echo "corresponding respectively to those keywords. Defaults to 0 (simple"
- echo "normalize) if not specified. Wrap, if specified, enables wrapping of the"
- echo "normalmap around the edges of the texture (defaults to no). Invert X/Y"
- echo "reverses the calculated gradients for the X and/or Y dimensions represented"
- echo "by the normalmap (both default to non-inverted)."
- echo ""
- echo "The pattern, can be an escaped pattern string such as \*apple\* or"
- echo "default_\*.png or similar (defaults to all PNG and JPG images in the current"
- echo "directory that do not contain \"_normal\" or \"_specular\" in their filenames)."
- echo ""
- echo "If set for dry-run, the actions this script will take will be printed, but no"
- echo "images will be generated. Passing an invalid value to a switch will generally"
- echo "cause that switch to revert to its default value."
- echo ""
- exit 1
- ;;
- esac
- done
- echo -e "\nProcessing files based on pattern \"$pattern\" ..."
- normalMap()
- {
- out=`echo "$1" | sed 's/.png/_normal.png/' | sed 's/.jpg/_normal.png/'`
- echo "Launched process to generate normalmap: \"$1\" --> \"$out\"" >&2
- gimp -i -b "
- (define
- (normalMap-fbx-conversion fileName newFileName filter nscale wrap heightsource conversion invertx inverty)
- (let*
- (
- (image (car (gimp-file-load RUN-NONINTERACTIVE fileName fileName)))
- (drawable (car (gimp-image-get-active-layer image)))
- (drawable (car (gimp-image-flatten image)))
- )
- (if (> (car (gimp-drawable-type drawable)) 1)
- (gimp-convert-rgb image) ()
- )
- (plug-in-normalmap
- RUN-NONINTERACTIVE
- image
- drawable
- filter
- 0.0
- nscale
- wrap
- heightsource
- 0
- conversion
- 0
- invertx
- inverty
- 0
- 0.0
- drawable)
- (gimp-file-save RUN-NONINTERACTIVE image drawable newFileName newFileName)
- (gimp-image-delete image)
- )
- )
- (normalMap-fbx-conversion \"$1\" \"$out\" $2 $3 $4 $5 $6 $7 $8)" -b '(gimp-quit 0)'
- }
- export -f normalMap
- for file in `ls $pattern |grep -v "_normal.png"|grep -v "_specular"` ; do
- invtest=`file "$file" |grep "$invresolution x $invresolution"`
- if $skipinventory && [ -n "$invtest" ] ; then
- echo "Skipped presumed "$invresolution"px inventory image: $file" >&2
- continue
- fi
- tooltest=`echo "$file" \
- | grep -v "_tool" \
- | grep -v "_shovel" \
- | grep -v "_pick" \
- | grep -v "_axe" \
- | grep -v "_sword" \
- | grep -v "_hoe" \
- | grep -v "bucket_"`
- if $skiptools && [ -z "$tooltest" ] ; then
- echo "Skipped presumed tool image: $file" >&2
- continue
- fi
- if $dryrun ; then
- echo "Would have generated a normalmap for $file" >&2
- continue
- else
- echo \"$file\" $filter $scale $wrap $heightsource $conversion $invertx $inverty
- fi
- done | xargs -P $numprocs -n 8 -I{} bash -c normalMap\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}
|