11 $p =~ s/(?:\.jpg|\.png|\.tga)$//gi;
16 my $find_texture_names = grep { /^-t$/ } @ARGV;
17 my $dump_shaders = grep { /^-d$/ } @ARGV;
18 my @match = grep { !/^-/ } @ARGV;
33 my @line = map { s/"//g; $_; } split /\s+/, $_;
37 # allow trailing } token
38 my $brace_index = [grep { $line[$_] eq "}" } 0..@line-1]->[0];
39 if(defined $brace_index)
41 unshift @nextline, splice @line, $brace_index || 1;
44 # allow initial { token
45 if(@line >= 2 && $line[0] eq '{')
47 unshift @nextline, splice @line, 1;
50 # in level 0, make the map name a separate token
51 if($level == 0 && @line >= 2)
53 unshift @nextline, splice @line, 1;
56 $shadertext .= "@line\n";
60 die "{ line without shader name"
61 unless defined $curshader;
62 die "{ line in level $level"
66 elsif($line[0] eq '}')
68 die "} line contains other stuff"
70 die "} line without shader name"
71 unless defined $curshader;
72 die "{ line in level $level"
79 if(!@match || grep { $_ eq $curshader } @match)
81 printf "%s %s\n", Digest::MD5::md5_hex($shadertext), $curshader;
83 if($find_texture_names)
85 # find out possibly loaded textures
86 my @maps = ($shadertext =~ /^(?:clampmap|map|q3r_lightimage|q3r_editorimage) ([^\$].*)$/gim);
87 for($shadertext =~ /^animmap \S+ (.*)$/gim)
89 push @maps, split / /, $_;
91 for($shadertext =~ /^skyparms (.*)$/gim)
96 push @maps, "$_"."_lf";
97 push @maps, "$_"."_ft";
98 push @maps, "$_"."_rt";
99 push @maps, "$_"."_bk";
100 push @maps, "$_"."_up";
101 push @maps, "$_"."_dn";
106 printf "* %s %s\n", $_, $curshader
107 for map { normalize_path $_ } @maps;
112 print "| $_\n" for split /\n/, $shadertext;
121 warn "shader name already set"
122 if defined $curshader;
123 $curshader = normalize_path $line[0];
137 die "missing } line";