mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 01:05:48 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			256 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/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\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}\ \{\}
 | 
						|
 |