diff options
Diffstat (limited to 'util/generate-texture-normals.sh')
-rwxr-xr-x | util/generate-texture-normals.sh | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/util/generate-texture-normals.sh b/util/generate-texture-normals.sh new file mode 100755 index 000000000..6279dfa69 --- /dev/null +++ b/util/generate-texture-normals.sh @@ -0,0 +1,255 @@ +#!/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\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\} + |