X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=scripts%2Fshader-audit.sh;h=46dcb86575400ff0c5e645905fa76ee6149ce505;hb=HEAD;hp=54018b95e4df17d650f1fff2e9e15e170bac2d70;hpb=b090ebf14d4645fec0a8f8bfafc94c9764a62a19;p=xonotic%2Fxonotic-maps.pk3dir.git diff --git a/scripts/shader-audit.sh b/scripts/shader-audit.sh index 54018b95..46dcb865 100755 --- a/scripts/shader-audit.sh +++ b/scripts/shader-audit.sh @@ -6,6 +6,8 @@ case "$0" in ;; esac +. ./shader-parser.subr + pid=$$ status=true trap 'status=false' USR1 @@ -28,11 +30,6 @@ warn() LF=" " -normalize() -{ - echo "$1" | sed 's/\.\(tga\|jpg\|png\)$//' -} - allowed_prefixes= forbidden_prefixes= @@ -236,8 +233,8 @@ use_texture() ;; esac ;; - ## RULE: textures/FOO/* must use textures/FOO/*, for FOO in decals, liquids_water, liquids_slime, liquids_lava, alphamod - textures/decals/*|textures/liquids_*/*|textures/effects_*/*|textures/screens/*|textures/logos/*|textures/alphamod/*) + ## RULE: textures/FOO/* must use textures/FOO/*, for FOO in decals, liquids_water, liquids_slime, liquids_lava, alphamod, solarpanel + textures/decals/*|textures/liquids_*/*|textures/effects_*/*|textures/screens/*|textures/logos/*|textures/alphamod/*|textures/solarpanel/*) pre=`echo "$1" | cut -d / -f 1-2` case "$2" in "$pre"/*) @@ -281,54 +278,62 @@ use_texture() } parsing_shader= -parse_shaderstage() +parse_shaderstage_pre() { ss_blendfunc=none ss_alphafunc=none ss_alphagen=none ss_map= - while read L A1 Aother; do - case "`echo "$L" | tr A-Z a-z`" in - blendfunc) - ss_blendfunc=`echo $A1 $Aother | tr A-Z a-z` - ;; - alphafunc) - ss_alphafunc=`echo $A1 | tr A-Z a-z` - ;; - alphagen) - ss_alphagen=`echo $A1 | tr A-Z a-z` - ;; - map|clampmap) - case "$A1" in - '$lightmap') - ;; - *) - use_texture "$parsing_shader" "`normalize "$A1"`" map - ss_map="`normalize "$A1"`" - offsetmapping_match8=firststagedone - ;; - esac - ;; - animmap) - for X in $Aother; do - use_texture "$parsing_shader" "`normalize "$X"`" animmap - done - for X in $Aother; do - ss_map="`normalize "$X"`" - break - done - ;; - '{') - err "brace nesting error in $parsing_shader" - ;; - '}') +} + +parse_shaderstage_line() +{ + L=$1 + A1=$2 + Aother=$3 + case "`echo "$L" | tr A-Z a-z`" in + blendfunc) + ss_blendfunc=`echo $A1 $Aother | tr A-Z a-z` + ;; + alphafunc) + ss_alphafunc=`echo $A1 | tr A-Z a-z` + ;; + alphagen) + ss_alphagen=`echo $A1 | tr A-Z a-z` + ;; + map|clampmap) + case "$A1" in + '$lightmap') + ;; + *) + use_texture "$parsing_shader" "`shader_normalize "$A1"`" map + ss_map="`shader_normalize "$A1"`" + offsetmapping_match8=firststagedone + ;; + esac + ;; + animmap) + for X in $Aother; do + use_texture "$parsing_shader" "`shader_normalize "$X"`" animmap + done + for X in $Aother; do + ss_map="`shader_normalize "$X"`" break - ;; - *) - ;; - esac - done + done + ;; + '{') + err "brace nesting error in $parsing_shader" + ;; + '}') + break + ;; + *) + ;; + esac +} +parse_shaderstage_post() +{ if [ -n "$ss_map" ]; then if [ -z "$maintexture" ]; then maintexture=$ss_map @@ -337,74 +342,82 @@ parse_shaderstage() mainalphagen=$ss_alphagen elif [ x"$ss_alphagen" = x"vertex" ] && ! $textureblending; then case "$mainblendfunc:$mainalphafunc:$ss_blendfunc:$ss_alphafunc" in + # none, blend + none:none:blend:none) textureblending=true ;; none:none:"gl_src_alpha gl_one_minus_src_alpha":none) textureblending=true ;; - none:none:filter:none) textureblending=true ;; + "gl_one gl_zero":none:blend:none) textureblending=true ;; + "gl_one zl_zero":none:"gl_src_alpha gl_one_minus_src_alpha":none) textureblending=true ;; + # none, alphafunc none:none:none:g*) textureblending=true ;; - "gl_one gl_zero":none:filter:none) textureblending=true ;; + none:none:"gl_one gl_zero":g*) textureblending=true ;; "gl_one gl_zero":none:none:g*) textureblending=true ;; + "gl_one gl_zero":none:"gl_one gl_zero":g*) textureblending=true ;; *) - err "texture blending requires first stage to have no blendfunc/alphatest, and requires second stage to be blendfunc filter" + err "$parsing_shader uses texture blending, but that requires first stage to have no blendfunc/alphatest, and requires second stage to be blendfunc filter" ;; esac else - err "multistage shader without alphagen vertex, or using more than 2 stages, is not supported by DarkPlaces" + err "$parsing_shader, a multistage shader without alphagen vertex, or using more than 2 stages, is not supported by DarkPlaces" fi fi } -parse_shader() +parse_shader_pre() { use_texture "$parsing_shader" "$parsing_shader" shader offsetmapping_match8= textureblending=false maintexture= nowarn=false - while read L A1 Aother; do - case "`echo "$L" | tr A-Z a-z`" in - xon_nowarn) - nowarn=true - ;; - dpoffsetmapping) - set -- $Aother - if [ x"$A1" = x"none" ]; then - offsetmapping_match8=none - elif [ x"$A1" = x"off" ]; then - offsetmapping_match8=none - elif [ x"$A1" = x"disabled" ]; then - offsetmapping_match8=none - elif [ x"$2" = x"match8" ]; then - offsetmapping_match8=`echo "($3 + 0.5) / 1" | bc` - elif [ x"$2" = x"match16" ]; then - offsetmapping_match8=`echo "($3 / 257 + 0.5) / 1" | bc` - elif [ x"$2" = x"match" ]; then - offsetmapping_match8=`echo "($3 * 255 + 0.5) / 1" | bc` - elif [ x"$2" = x"bias" ]; then - offsetmapping_match8=`echo "((1 - $3) * 255 + 0.5) / 1" | bc` - else - offsetmapping_match8=default - fi - ;; - qer_editorimage) - use_texture "$parsing_shader" "`normalize "$A1"`" editorimage - ;; - skyparms) - use_texture "$parsing_shader" "${A1}_lf" sky - use_texture "$parsing_shader" "${A1}_rt" sky - use_texture "$parsing_shader" "${A1}_up" sky - use_texture "$parsing_shader" "${A1}_dn" sky - use_texture "$parsing_shader" "${A1}_ft" sky - use_texture "$parsing_shader" "${A1}_bk" sky - ;; - '{') - parse_shaderstage - ;; - '}') - break - ;; - *) - ;; - esac - done +} + +parse_shader_line() +{ + L=$1 + A1=$2 + Aother=$3 + case "`echo "$L" | tr A-Z a-z`" in + xon_nowarn) + nowarn=true + ;; + dpoffsetmapping) + set -- $Aother + if [ x"$A1" = x"none" ]; then + offsetmapping_match8=none + elif [ x"$A1" = x"off" ]; then + offsetmapping_match8=none + elif [ x"$A1" = x"disabled" ]; then + offsetmapping_match8=none + elif [ x"$2" = x"match8" ]; then + offsetmapping_match8=`echo "($3 + 0.5) / 1" | bc` + elif [ x"$2" = x"match16" ]; then + offsetmapping_match8=`echo "($3 / 257 + 0.5) / 1" | bc` + elif [ x"$2" = x"match" ]; then + offsetmapping_match8=`echo "($3 * 255 + 0.5) / 1" | bc` + elif [ x"$2" = x"bias" ]; then + offsetmapping_match8=`echo "((1 - $3) * 255 + 0.5) / 1" | bc` + else + offsetmapping_match8=default + fi + ;; + qer_editorimage) + use_texture "$parsing_shader" "`shader_normalize "$A1"`" editorimage + ;; + skyparms) + use_texture "$parsing_shader" "${A1}_lf" sky + use_texture "$parsing_shader" "${A1}_rt" sky + use_texture "$parsing_shader" "${A1}_up" sky + use_texture "$parsing_shader" "${A1}_dn" sky + use_texture "$parsing_shader" "${A1}_ft" sky + use_texture "$parsing_shader" "${A1}_bk" sky + ;; + *) + ;; + esac +} + +parse_shader_post() +{ if [ -n "$AUDIT_ALPHACHANNELS" ] && [ -n "$maintexture" ] && ! $textureblending; then getstats "../$maintexture.tga" || getstats "../$maintexture.png" || getstats "../$maintexture.jpg" case "$mainblendfunc" in @@ -448,17 +461,18 @@ parse_shader() fi } -parse_shaderfile() +parse_shaderfile_pre() { - case "$1" in + s="${parsing_shaderfile%.shader}" + case "$s" in ## RULE: map_FOO.shader may define tetxures/map_FOO_* and textures/map_FOO/* map_*) - allowed_prefixes="textures/map_`echo "$1" | cut -d _ -f 2`_ textures/map_`echo "$1" | cut -d _ -f 2`/ models/map_`echo "$1" | cut -d _ -f 2`_ models/map_`echo "$1" | cut -d _ -f 2`/" + allowed_prefixes="textures/map_`echo "$s" | cut -d _ -f 2`_ textures/map_`echo "$s" | cut -d _ -f 2`/ models/map_`echo "$s" | cut -d _ -f 2`_ models/map_`echo "$s" | cut -d _ -f 2`/" forbidden_prefixes= ;; ## RULE: skies_FOO.shader may define tetxures/skies/FOO and textures/skies/FOO_* skies_*) - allowed_prefixes="textures/skies/`echo "$1" | cut -d _ -f 2`: textures/skies/`echo "$1" | cut -d _ -f 2`_" + allowed_prefixes="textures/skies/`echo "$s" | cut -d _ -f 2`: textures/skies/`echo "$s" | cut -d _ -f 2`_" forbidden_prefixes= ;; ## RULE: model_*.shader may define models/* @@ -468,40 +482,15 @@ parse_shaderfile() ;; ## RULE: any other FOO.shader may define textures/FOO/* *) - allowed_prefixes="textures/$1/" + allowed_prefixes="textures/$s/" forbidden_prefixes="textures/skies/ textures/map_ models/" ;; esac - while read L; do - case "$L" in - */*) - parsing_shader="`normalize "$L"`" - if [ x"$L" != x"$parsing_shader" ]; then - warn "normalized shader name $L to $parsing_shader" - fi - ;; - '{') - parse_shader - ;; - *) - ;; - esac - done } -strip_comments() -{ - sed 's,//.*,,g; s,\r, ,g; s,\t, ,g; s, *, ,g; s, $,,; s,^ ,,; /^$/ d' -} - -t=`mktemp || echo ".temp"` -for X in *.shader; do - strip_comments < "$X" > "$t" - parse_shaderfile "${X%.shader}" < "$t" -done -rm -f "$t" +parse_shaders *.shader -textures_avail=`( cd ..; find textures/ -type f -not -name '*.sh' -not -name '*_norm.*' -not -name '*_glow.*' -not -name '*_gloss.*' -not -name '*_reflect.*' -not -name '*.xcf' -not -name '*.txt' ) | while IFS= read -r T; do normalize "$T"; done | sort -u` +textures_avail=`( cd ..; find textures/ -type f -not -name '*.sh' -not -name '*_norm.*' -not -name '*_glow.*' -not -name '*_gloss.*' -not -name '*_reflect.*' -not -name '*.xcf' -not -name '*.txt' ) | while IFS= read -r T; do shader_normalize "$T"; done | sort -u` textures_used=`echo "${textures_used#$LF}" | sort -u` echo "$textures_used$LF$textures_used$LF$textures_avail" | sort | uniq -u | while IFS= read -r L; do