From 6aaff9d976c0cfea5fa17bfe542a41c42f4077bb Mon Sep 17 00:00:00 2001 From: div0 Date: Wed, 30 Jul 2008 15:23:10 +0000 Subject: [PATCH] script to automatically create shaders for textures with alpha channel, and sky git-svn-id: svn://svn.icculus.org/nexuiz/trunk@3981 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- misc/autoshader.sh | 177 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 misc/autoshader.sh diff --git a/misc/autoshader.sh b/misc/autoshader.sh new file mode 100644 index 000000000..a63abdb45 --- /dev/null +++ b/misc/autoshader.sh @@ -0,0 +1,177 @@ +#!/bin/sh + +if ! [ -d "textures" ] && ! [ -d "env" ]; then + echo "Sorry, must be run from a directory with a textures subfolder. Giving up." + exit 1 +fi + +makeshader() +{ + s=`texnormalize "$1"` + dir=${s#textures/} + dir=${dir%%/*} + echo scripts/$dir.shader + mkdir -p scripts + cat <>"scripts/$dir.shader" +$s +{ + qer_editorimage $1 + qer_trans 0.5 + // maybe: surfaceparm nonsolid + surfaceparm trans + surfaceparm alphashadow + surfaceparm nomarks + cull disable + { + map $s + blendfunc blend + // or: alphafunc GE128 + } + { + map $lightmap + blendfunc filter + rgbGen identity + } +} +EOF +} + +makeskyshader() +{ + s=`texnormalize "$1"` + s=${s%_up} + s=${s#env/} + dir=${s%%/*} + echo >&2 "appending to scripts/$dir.shader" + echo scripts/$dir.shader + mkdir -p scripts + cat <>"scripts/$dir.shader" +textures/$s +{ + qer_editorimage $1 + surfaceparm noimpact + surfaceparm nolightmap + surfaceparm sky + surfaceparm nomarks + q3map_sunExt .5 .5 .7 42 90 2 16 // red green blue intensity degrees elevation deviance samples + q3map_surfacelight 150 // intensity + skyparms env/$s - - +} +EOF +} + +texnormalize() +{ + echo "$1" | sed 's/\.[Jj][Pp][Gg]$\|\.[Tt][Gg][Aa]$\|\.[Pp][Nn][Gg]$//;' +} + +allshadernames() # prints all shader names or texture names +{ + cat scripts/*.shader 2>/dev/null | tr '\r' '\n' | { + mode=root + while IFS= read -r LINE; do + LINE=`echo "$LINE" | sed 's,//.*,,; s/\s\+/ /g; s/^ //; s/ $//; s/"//g;'` + [ -n "$LINE" ] || continue + set -- $LINE + case "$mode:$1" in + root:'{') + mode=shader + ;; + root:*) + texnormalize "$1" + ;; + + shader:'{') + mode=stage + ;; + shader:'}') + mode=root + ;; + shader:skyparms) + echo "`texnormalize "$1"`_up" + ;; + + stage:'}') + mode=shader + ;; + stage:map) + texnormalize "$2" + ;; + stage:clampmap) + texnormalize "$2" + ;; + stage:animmap) + shift + shift + for X in "$@"; do + texnormalize "$X" + done + ;; + esac + done + } +} + +allshaders=`allshadernames` +lf=" +" + +has_shader() +{ + sh=`texnormalize "$1"` + case "$lf$allshaders$lf" in + *"$lf$sh$lf"*) + return 0 + ;; + esac + return 1 +} + +has_alpha() +{ + convert "$1" -depth 8 RGBA:- | xxd -c 4 -g 1 | grep -v " ff " >/dev/null +} + +autoshaders() +{ + { + [ -d "textures" ] && find textures -type f \( -iname \*.tga -o -iname \*.png \) -print | while IFS= read -r TEX; do + case `texnormalize "$TEX"` in + *_norm|*_shirt|*_pants|*_glow|*_gloss|*_bump) + # ignore these (they are used implicitly) + continue + ;; + esac + if has_shader "$TEX"; then + echo>&2 " $TEX has an associated shader, ignoring." + else + if has_alpha "$TEX"; then + echo>&2 "*** $TEX has alpha but no shader, creating default alpha shader." + makeshader "$TEX" + else + echo>&2 " $TEX has no shader and no alpha, fine." + fi + fi + done + [ -d "env" ] && find env -type f \( -iname \*_up.tga -o -iname \*_up.png -o -iname \*_up.jpg \) -print | while IFS= read -r TEX; do + if has_shader "$TEX"; then + echo>&2 " $TEX has an associated shader, ignoring." + else + echo>&2 "*** $TEX is sky but has no shader, creating default sky shader." + makeskyshader "$TEX" + fi + done + } | sort -u +} + +aashaders=`autoshaders` + +if [ -n "$aashaders" ]; then + cat <