]> icculus.org git repositories - divverent/nexuiz.git/blob - misc/autoshader.sh
script to automatically create shaders for textures with alpha channel, and sky
[divverent/nexuiz.git] / misc / autoshader.sh
1 #!/bin/sh
2
3 if ! [ -d "textures" ] && ! [ -d "env" ]; then
4         echo "Sorry, must be run from a directory with a textures subfolder. Giving up."
5         exit 1
6 fi
7
8 makeshader()
9 {
10         s=`texnormalize "$1"`
11         dir=${s#textures/}
12         dir=${dir%%/*}
13         echo scripts/$dir.shader
14         mkdir -p scripts
15         cat <<EOF >>"scripts/$dir.shader"
16 $s
17 {
18         qer_editorimage $1
19         qer_trans 0.5
20         // maybe: surfaceparm nonsolid
21         surfaceparm trans
22         surfaceparm alphashadow
23         surfaceparm nomarks
24         cull disable
25         {
26                 map $s
27                 blendfunc blend
28                 // or: alphafunc GE128
29         }
30         {
31                 map $lightmap
32                 blendfunc filter
33                 rgbGen identity
34         }
35 }
36 EOF
37 }
38
39 makeskyshader()
40 {
41         s=`texnormalize "$1"`
42         s=${s%_up}
43         s=${s#env/}
44         dir=${s%%/*}
45         echo >&2 "appending to scripts/$dir.shader"
46         echo scripts/$dir.shader
47         mkdir -p scripts
48         cat <<EOF >>"scripts/$dir.shader"
49 textures/$s
50 {
51         qer_editorimage $1
52         surfaceparm noimpact
53         surfaceparm nolightmap
54         surfaceparm sky
55         surfaceparm nomarks
56         q3map_sunExt .5 .5 .7 42 90 2 16 // red green blue intensity degrees elevation deviance samples
57         q3map_surfacelight 150 // intensity
58         skyparms env/$s - -
59 }
60 EOF
61 }
62
63 texnormalize()
64 {
65         echo "$1" | sed 's/\.[Jj][Pp][Gg]$\|\.[Tt][Gg][Aa]$\|\.[Pp][Nn][Gg]$//;'
66 }
67
68 allshadernames() # prints all shader names or texture names
69 {
70         cat scripts/*.shader 2>/dev/null | tr '\r' '\n' | {
71                 mode=root
72                 while IFS= read -r LINE; do
73                         LINE=`echo "$LINE" | sed 's,//.*,,; s/\s\+/ /g; s/^ //; s/ $//; s/"//g;'`
74                         [ -n "$LINE" ] || continue
75                         set -- $LINE
76                         case "$mode:$1" in
77                                 root:'{')
78                                         mode=shader
79                                         ;;
80                                 root:*)
81                                         texnormalize "$1"
82                                         ;;
83
84                                 shader:'{')
85                                         mode=stage
86                                         ;;
87                                 shader:'}')
88                                         mode=root
89                                         ;;
90                                 shader:skyparms)
91                                         echo "`texnormalize "$1"`_up"
92                                         ;;
93
94                                 stage:'}')
95                                         mode=shader
96                                         ;;
97                                 stage:map)
98                                         texnormalize "$2"
99                                         ;;
100                                 stage:clampmap)
101                                         texnormalize "$2"
102                                         ;;
103                                 stage:animmap)
104                                         shift
105                                         shift
106                                         for X in "$@"; do
107                                                 texnormalize "$X"
108                                         done
109                                         ;;
110                         esac
111                 done
112         }
113 }
114
115 allshaders=`allshadernames`
116 lf="
117 "
118
119 has_shader()
120 {
121         sh=`texnormalize "$1"`
122         case "$lf$allshaders$lf" in
123                 *"$lf$sh$lf"*)
124                         return 0
125                         ;;
126         esac
127         return 1
128 }
129
130 has_alpha()
131 {
132         convert "$1" -depth 8 RGBA:- | xxd -c 4 -g 1 | grep -v " ff  " >/dev/null
133 }
134
135 autoshaders()
136 {
137         {
138                 [ -d "textures" ] && find textures -type f \( -iname \*.tga -o -iname \*.png \) -print | while IFS= read -r TEX; do
139                         case `texnormalize "$TEX"` in
140                                 *_norm|*_shirt|*_pants|*_glow|*_gloss|*_bump)
141                                         # ignore these (they are used implicitly)
142                                         continue
143                                         ;;
144                         esac
145                         if has_shader "$TEX"; then
146                                 echo>&2 "    $TEX has an associated shader, ignoring."
147                         else
148                                 if has_alpha "$TEX"; then
149                                         echo>&2 "*** $TEX has alpha but no shader, creating default alpha shader."
150                                         makeshader "$TEX"
151                                 else
152                                         echo>&2 "    $TEX has no shader and no alpha, fine."
153                                 fi
154                         fi
155                 done
156                 [ -d "env" ] && find env -type f \( -iname \*_up.tga -o -iname \*_up.png -o -iname \*_up.jpg \) -print | while IFS= read -r TEX; do
157                         if has_shader "$TEX"; then
158                                 echo>&2 "    $TEX has an associated shader, ignoring."
159                         else
160                                 echo>&2 "*** $TEX is sky but has no shader, creating default sky shader."
161                                 makeskyshader "$TEX"
162                         fi
163                 done
164         } | sort -u
165 }
166
167 aashaders=`autoshaders`
168
169 if [ -n "$aashaders" ]; then
170         cat <<EOF
171 The following shader files have been automatically created or appended to:
172
173 $aashaders
174
175 Please edit them to your needs, and possibly rename them.
176 EOF
177 fi