r3981 - trunk/misc
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Wed Jul 30 11:23:11 EDT 2008
Author: div0
Date: 2008-07-30 11:23:10 -0400 (Wed, 30 Jul 2008)
New Revision: 3981
Added:
trunk/misc/autoshader.sh
Log:
script to automatically create shaders for textures with alpha channel, and sky
Added: trunk/misc/autoshader.sh
===================================================================
--- trunk/misc/autoshader.sh (rev 0)
+++ trunk/misc/autoshader.sh 2008-07-30 15:23:10 UTC (rev 3981)
@@ -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 <<EOF >>"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 <<EOF >>"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 <<EOF
+The following shader files have been automatically created or appended to:
+
+$aashaders
+
+Please edit them to your needs, and possibly rename them.
+EOF
+fi
More information about the nexuiz-commits
mailing list