]> icculus.org git repositories - divverent/nexuiz.git/blob - misc/tools/shader-checksums.pl
shader checksum script improved
[divverent/nexuiz.git] / misc / tools / shader-checksums.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Digest::MD5;
6
7 sub normalize_path($)
8 {
9         my ($p) = @_;
10         $p =~ s/\\/\//g;
11         $p =~ s/(?:\.jpg|\.png|\.tga)$//gi;
12         $p = lc $p;
13         return $p;
14 }
15
16 my $find_texture_names;
17 $find_texture_names = grep { /^-t$/ } @ARGV;
18
19 my $shadertext = "";
20 my $level = 0;
21 my $curshader;
22 while(<STDIN>)
23 {
24         s/\r//gs;
25         chomp;
26
27         s/\/\/.*//s;
28         s/^\s+//;
29         s/\s+$//;
30         next if /^$/;
31
32         my @line = map { s/"//g; $_; } split /\s+/, $_;
33
34         $shadertext .= "@line\n";
35
36         if($line[0] eq '{')
37         {
38                 die "{ line contains other stuff"
39                         unless @line == 1;
40                 die "{ line without shader name"
41                         unless defined $curshader;
42                 die "{ line in level $level"
43                         if $level >= 2;
44                 ++$level;
45         }
46         elsif($line[0] eq '}')
47         {
48                 die "} line contains other stuff"
49                         unless @line == 1;
50                 die "} line without shader name"
51                         unless defined $curshader;
52                 die "{ line in level $level"
53                         if $level <= 0;
54                 --$level;
55                 if($level <= 0)
56                 {
57                         $level = 0;
58                         printf "%s  %s\n", Digest::MD5::md5_hex($shadertext), $curshader;
59
60                         if($find_texture_names)
61                         {
62                                 # find out possibly loaded textures
63                                 my @maps = ($shadertext =~ /^map ([^\$].*)$/gim);
64                                 for($shadertext =~ /^animmap \S+ (.*)$/gim)
65                                 {
66                                         push @maps, split / /, $_;
67                                 }
68                                 for($shadertext =~ /^skyparms (.*)$/gim)
69                                 {
70                                         for(split / /, $_)
71                                         {
72                                                 next if $_ eq "-";
73                                                 push @maps, "$_"."_lf";
74                                                 push @maps, "$_"."_ft";
75                                                 push @maps, "$_"."_rt";
76                                                 push @maps, "$_"."_bk";
77                                                 push @maps, "$_"."_up";
78                                                 push @maps, "$_"."_dn";
79                                         }
80                                 }
81                                 @maps = ($curshader)
82                                         if @maps == 0;
83                                 printf "* %s  %s\n", $_, $curshader
84                                         for map { normalize_path $_ } @maps;
85                         }
86
87                         $curshader = undef;
88                 }
89         }
90         elsif($level == 0)
91         {
92                 die "shader name already set"
93                         if defined $curshader;
94                 $curshader = normalize_path $line[0];
95                 $shadertext = "";
96         }
97 }
98
99 if($level != 0)
100 {
101         die "missing } line";
102 }