r5147 - trunk/misc
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Mon Dec 1 09:10:36 EST 2008
Author: div0
Date: 2008-12-01 09:10:35 -0500 (Mon, 01 Dec 2008)
New Revision: 5147
Added:
trunk/misc/dependencies.pl
trunk/misc/jpeg-if-not-alpha.sh
Modified:
trunk/misc/bsptool.pl
Log:
dependencies.pl: lists dependencies of a map pack (helps identifying unused files)
Property changes on: trunk/misc/bsptool.pl
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/misc/dependencies.pl
===================================================================
--- trunk/misc/dependencies.pl (rev 0)
+++ trunk/misc/dependencies.pl 2008-12-01 14:10:35 UTC (rev 5147)
@@ -0,0 +1,293 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my %files = ();
+my %shaders = ();
+
+sub ReadShaders()
+{
+ for my $sf(<scripts/*.shader>)
+ {
+ my $curshader = undef;
+ my @tex = ();
+ my $level = 0;
+ open my $fh, "<", $sf
+ or die "<$sf: $!";
+ while(<$fh>)
+ {
+ s/\r//gs;
+ chomp;
+
+ s/\/\/.*//s;
+ s/^\s+//;
+ s/\s+$//;
+ next if /^$/;
+
+ my @line = map { s/"//g; $_; } split /\s+/, $_;
+
+ if($line[0] eq '{')
+ {
+ ++$level;
+ }
+ elsif($line[0] eq '}')
+ {
+ --$level;
+ if($level <= 0)
+ {
+ $level = 0;
+ if(defined $curshader)
+ {
+ $shaders{lc $curshader} = { shaderfile => $sf, textures => [ @tex ] };
+ }
+ $curshader = undef;
+ }
+ }
+ elsif($level == 0)
+ {
+ $curshader = $line[0];
+ @tex = ();
+ }
+ elsif($level == 1 and lc $line[0] eq 'qer_editorimage')
+ {
+ push @tex, $line[1];
+ }
+ elsif($level == 1 and lc $line[0] eq 'qer_lightimage')
+ {
+ push @tex, $line[1];
+ }
+ elsif($level == 1 and lc $line[0] eq 'skyparms')
+ {
+ for(qw/rt lf ft bk up dn/)
+ {
+ push @tex, "$line[1]_$_";
+ push @tex, "$line[3]_$_";
+ }
+ }
+ elsif($level == 2 and lc $line[0] eq 'map')
+ {
+ push @tex, $line[1];
+ }
+ elsif($level == 2 and lc $line[0] eq 'animmap')
+ {
+ for(2..(@line - 1))
+ {
+ push @tex, $line[$_];
+ }
+ }
+ }
+ }
+}
+
+sub AddFile($)
+{
+ my ($file) = @_;
+ return 0
+ unless -e $file;
+ ++$files{$file};
+ return 1;
+}
+
+sub AddSound($)
+{
+ my ($tex) = @_;
+ $tex =~ s/\.ogg$|\.wav$//i;
+ AddFile "$tex.ogg" or
+ AddFile "$tex.wav" or
+ AddFile "sound/$tex.ogg" or
+ AddFile "sound/$tex.wav";
+}
+
+sub AddTexture($)
+{
+ my ($tex) = @_;
+ $tex =~ s/\.jpg$|\.tga$|\.png$//i;
+ AddFile "$tex.jpg" or
+ AddFile "$tex.tga" or
+ AddFile "$tex.png"
+ or return 0;
+ for('_shirt', '_pants', '_glow', '_norm', '_bump', '_gloss')
+ {
+ AddFile "$tex$_.jpg" or
+ AddFile "$tex$_.tga" or
+ AddFile "$tex$_.png";
+ }
+ return 1;
+}
+
+sub AddShader($)
+{
+ my ($shader) = @_;
+ $shader =~ s/\.jpg$|\.tga$|\.png$//i;
+ my $si = $shaders{lc $shader};
+ if(not defined $si)
+ {
+ AddTexture $shader
+ or warn "Unknown shader used: $shader";
+ }
+ else
+ {
+ AddFile $si->{shaderfile};
+ AddTexture $_
+ for @{$si->{textures}};
+ }
+}
+
+sub AddMapDependencies($)
+{
+ my ($data) = @_;
+ for(/^"noise.*" "(.*)"/gm)
+ {
+ AddSound $1;
+ }
+ for(/^"sound.*" "(.*)"/gm)
+ {
+ AddSound $1;
+ }
+ for(/^"music" "(.*)"/gm)
+ {
+ AddSound $1;
+ }
+ for(/^"model" "(.*)"/gm)
+ {
+ # TODO make this AddModel
+ # TODO and find the shaders the model uses
+ AddFile $1;
+ }
+ for(/^"lodmodel.*" "(.*)"/gm)
+ {
+ AddFile $1;
+ }
+}
+
+sub AddMapinfoDependencies($)
+{
+ my ($data) = @_;
+ for($data =~ /^cdtrack (.*)$/gm)
+ {
+ AddSound "sound/cdtracks/$1";
+ }
+}
+
+sub AddCfgDependencies($)
+{
+ my ($data) = @_;
+ for($data =~ /^cd loop "?(.*?)"?$/gm)
+ {
+ AddSound "sound/cdtracks/$1";
+ }
+}
+
+sub AddShaderDependencies($)
+{
+ my ($data) = @_;
+
+ my $n = length($data) / 72;
+ for(0..($n-1))
+ {
+ my $s = substr $data, $_ * 72, 64;
+ $s =~ s/\0.*$//s;
+ AddShader $s;
+ }
+}
+
+sub AddFaceDependencies($$)
+{
+ my ($base, $data) = @_;
+
+ my $n = length($data) / 104;
+ for(0..($n-1))
+ {
+ my $l = unpack "V", substr $data, $_ * 104 + 28, 4;
+ AddTexture sprintf "maps/%s/lm_%04d", $base, $l;
+ AddTexture sprintf "maps/%s/lm_%04d", $base, $l | 1; # deluxe
+ }
+}
+
+
+ReadShaders();
+
+for(<maps/*.ent>)
+{
+ AddFile $_;
+
+ my $data = do {
+ undef local $/;
+ open my $fh, "<", $_
+ or die "<$_: $!";
+ <$fh>;
+ };
+ AddMapDependencies $data;
+}
+
+for(<maps/*.bsp>)
+{
+ AddFile $_;
+
+ m!^maps/(.*)\.bsp! or die "perl is stupid";
+ my $b = $1;
+ AddFile "maps/$b.mapinfo";
+ AddFile "maps/$b.jpg";
+ AddFile "maps/$b.cfg";
+ AddTexture "gfx/$b\_radar.tga";
+ AddTexture "gfx/$b\_mini.tga";
+
+ my $data = do {
+ undef local $/;
+ open my $fh, "<", "maps/$b.mapinfo"
+ or die "<$_: $!";
+ <$fh>;
+ };
+ AddMapinfoDependencies $data;
+
+ $data = do {
+ undef local $/;
+ open my $fh, "-|", 'bsptool.pl', $_, '-xentities'
+ or die "<$_: $!";
+ <$fh>;
+ };
+ AddMapDependencies $data;
+
+ $data = do {
+ undef local $/;
+ open my $fh, "-|", 'bsptool.pl', $_, '-xfaces'
+ or die "<$_: $!";
+ <$fh>;
+ };
+ AddFaceDependencies $b, $data;
+
+ $data = do {
+ undef local $/;
+ open my $fh, "-|", 'bsptool.pl', $_, '-xtextures'
+ or die "<$_: $!";
+ <$fh>;
+ };
+ AddShaderDependencies $data;
+}
+
+sub RecurseDir($);
+sub RecurseDir($)
+{
+ my ($dir) = @_;
+ if(-d $dir)
+ {
+ for(<$dir/*>)
+ {
+ RecurseDir $_;
+ }
+ }
+ else
+ {
+ warn "Unused file: $dir"
+ unless $files{$dir};
+ }
+}
+
+for(<*>)
+{
+ RecurseDir $_;
+}
+
+print "$_\0"
+ for sort keys %files;
Property changes on: trunk/misc/dependencies.pl
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/misc/jpeg-if-not-alpha.sh
===================================================================
--- trunk/misc/jpeg-if-not-alpha.sh (rev 0)
+++ trunk/misc/jpeg-if-not-alpha.sh 2008-12-01 14:10:35 UTC (rev 5147)
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+set -e
+
+: ${qual:=95}
+
+for X in "$@"; do
+ case "$X" in
+ *.jpg)
+ jpegoptim --strip-all "$X"
+ ;;
+ *.png|*.tga)
+ if convert "$X" -depth 16 RGBA:- | perl -e 'local $/ = \8; while(<>) { substr($_, 6, 2) eq "\xFF\xFF" or exit 1; ++$pix; } END { exit not $pix; }'; then
+ echo "$X has no alpha, converting"
+ convert "$X" -quality $qual "${X%.*}.jpg"
+ jpegoptim --strip-all "${X%.*}.jpg"
+ rm -f "$X"
+ else
+ echo "$X has alpha, not converting"
+ fi
+ ;;
+ esac
+done
More information about the nexuiz-commits
mailing list