#!/bin/sh # usage: compress-texture tool compression in.png out.dds # example: compress-texture compressonator dxt1 foo.jpg foo.dds echo >&2 "$0 $*" tool=$1; shift format=$1; shift src=$1; shift dst=$1; shift ext=${src##*.} c= f= fourcchack= case "$tool" in compressonator-dxtc|crunch) # We still have to preprocess the image to premultiply alpha, as it seems case "$format" in dxt2) fourcchack=DXT2 format=dxt2 ;; dxt4) fourcchack=DXT4 format=dxt4 ;; esac ;; compressonator-atic|nvcompress|s2tc) # These tools don't support DXT2/4 at all. case "$format" in dxt2) fourcchack=DXT2 format=dxt3 ;; dxt4) fourcchack=DXT4 format=dxt5 ;; esac ;; *) echo >&2 "Please figure out the DXT2/DXT4 story for $tool." ;; esac if [ -n "$fourcchack" ]; then fourcchack_dir=`mktemp -d` convert "$src" -auto-orient -fx "u*u.a" -type TrueColorMatte "$fourcchack_dir/src.$ext" src="$fourcchack_dir/src.$ext" fi case "$tool" in compressonator-dxtc|compressonator-atic) case "$tool" in *-dxtc) c="-codec DXTC.dll" ;; *-atic) c="-codec ATICompressor.dll" ;; esac case "$format" in dxt1) f="+fourCC DXT1" ;; dxt2) f="+fourCC DXT2" ;; dxt3) f="+fourCC DXT3" ;; dxt4) f="+fourCC DXT4" ;; dxt5) f="+fourCC DXT5" ;; esac dir=`mktemp -d "$HOME/.wine/drive_c/compressonator.XXXXXX"` dir_dos="C:/${dir##*/}" cp "$src" "$dir/src.$ext" # compressonator and wine suck, so we sometimes have to retry :( for retry in 1 2 3 4 5; do wine "c:/Program Files/AMD/The Compressonator 1.50/TheCompressonator.exe" -convert -mipmaps "$dir_dos/src.$ext" "$dir_dos/dst.dds" $c $f "$@" -mipper BoxFilter.dll if mv "$dir/dst.dds" "$dst"; then break fi done rm -rf "$dir" [ -f "$dst" ] ;; nvcompress) case "$format" in dxt1) f="-bc1" ;; dxt3) f="-alpha -bc3" ;; dxt5) f="-alpha -bc5" ;; esac nvcompress $f "$@" "$src" "$dst" ;; s2tc) case "$format" in dxt1) f="-t DXT1" ;; dxt3) f="-t DXT3" ;; dxt5) f="-t DXT5" ;; esac s2tc_compress $f "$@" -i "$src" -o "$dst" ;; crunch) case "$format" in dxt1) f="-DXT1" ;; dxt2) f="-DXT2" ;; dxt3) f="-DXT3" ;; dxt4) f="-DXT4" ;; dxt5) f="-DXT5" ;; esac crunch $f "$@" -noprogress -nostats -quality 255 -mipMode Generate -dxtQuality uber $CRUNCH_TEXTYPEFLAGS -file "$src" -out "$dst" ;; esac if [ -n "$fourcchack" ]; then # use dd to hack in the right FOURCC echo -n "$fourcchack" | dd of="$dst" bs=1 count=4 seek=84 conv=notrunc rm -rf "$fourcchack_dir" fi