]> icculus.org git repositories - divverent/nexuiz.git/blob - misc/tools/shader-checksums.pl
new race record marker (for extracting the records from demos)
[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 = grep { /^-t$/ } @ARGV;
17 my $dump_shaders = grep { /^-d$/ } @ARGV;
18 my @match = grep { !/^-/ } @ARGV;
19
20 my $shadertext = "";
21 my $level = 0;
22 my $curshader;
23 while(<STDIN>)
24 {
25         s/\r//gs;
26         chomp;
27
28         s/\/\/.*//s;
29         s/^\s+//;
30         s/\s+$//;
31         next if /^$/;
32
33         my @line = map { s/"//g; $_; } split /\s+/, $_;
34
35         $shadertext .= "@line\n";
36
37         if($line[0] eq '{')
38         {
39                 die "{ line contains other stuff"
40                         unless @line == 1;
41                 die "{ line without shader name"
42                         unless defined $curshader;
43                 die "{ line in level $level"
44                         if $level >= 2;
45                 ++$level;
46         }
47         elsif($line[0] eq '}')
48         {
49                 die "} line contains other stuff"
50                         unless @line == 1;
51                 die "} line without shader name"
52                         unless defined $curshader;
53                 die "{ line in level $level"
54                         if $level <= 0;
55                 --$level;
56                 if($level <= 0)
57                 {
58                         $level = 0;
59
60                         if(!@match || grep { $_ eq $curshader } @match)
61                         {
62                                 printf "%s  %s\n", Digest::MD5::md5_hex($shadertext), $curshader;
63
64                                 if($find_texture_names)
65                                 {
66                                         # find out possibly loaded textures
67                                         my @maps = ($shadertext =~ /^(?:clampmap|map|q3r_lightimage|q3r_editorimage) ([^\$].*)$/gim);
68                                         for($shadertext =~ /^animmap \S+ (.*)$/gim)
69                                         {
70                                                 push @maps, split / /, $_;
71                                         }
72                                         for($shadertext =~ /^skyparms (.*)$/gim)
73                                         {
74                                                 for(split / /, $_)
75                                                 {
76                                                         next if $_ eq "-";
77                                                         push @maps, "$_"."_lf";
78                                                         push @maps, "$_"."_ft";
79                                                         push @maps, "$_"."_rt";
80                                                         push @maps, "$_"."_bk";
81                                                         push @maps, "$_"."_up";
82                                                         push @maps, "$_"."_dn";
83                                                 }
84                                         }
85                                         @maps = ($curshader)
86                                                 if @maps == 0;
87                                         printf "* %s  %s\n", $_, $curshader
88                                                 for map { normalize_path $_ } @maps;
89                                 }
90
91                                 if($dump_shaders)
92                                 {
93                                         print "| $_\n" for split /\n/, $shadertext;
94                                 }
95                         }
96
97                         $curshader = undef;
98                 }
99         }
100         elsif($level == 0)
101         {
102                 die "shader name already set"
103                         if defined $curshader;
104                 $curshader = normalize_path $line[0];
105                 $shadertext = "";
106         }
107 }
108
109 if($level != 0)
110 {
111         die "missing } line";
112 }