r5117 - trunk/misc
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Nov 27 05:58:22 EST 2008
Author: div0
Date: 2008-11-27 05:58:21 -0500 (Thu, 27 Nov 2008)
New Revision: 5117
Added:
trunk/misc/bsptool.pl
Log:
bsp tool
Added: trunk/misc/bsptool.pl
===================================================================
--- trunk/misc/bsptool.pl (rev 0)
+++ trunk/misc/bsptool.pl 2008-11-27 10:58:21 UTC (rev 5117)
@@ -0,0 +1,86 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+my $msg = "";
+
+my $fn = shift @ARGV;
+open my $fh, "<", $fn
+ or die "$fn: $!";
+
+read $fh, my $header, 8;
+
+die "Invalid BSP format"
+ if $header ne "IBSP\x2e\x00\x00\x00";
+
+my @lumpname = qw/entities textures planes nodes leafs leaffaces leafbrushes models brushes brushsides vertices triangles effects faces lightmaps lightgrid pvs advertisements/;
+my %lumpid = map { $lumpname[$_] => $_ } 0.. at lumpname-1;
+
+my @bsp;
+
+for(0..16)
+{
+ read $fh, my $lump, 8;
+ my ($offset, $length) = unpack "VV", $lump;
+
+ print "BSP lump $_ ($lumpname[$_]): offset $offset length $length\n";
+ push @bsp, [$offset, $length, undef];
+}
+
+for(@bsp)
+{
+ my ($offset, $length, $data) = @$_;
+ seek $fh, $offset, 0;
+ read $fh, $data, $length;
+ length $data == $length
+ or die "Incomplete BSP lump at $offset\n";
+ $_->[2] = $data;
+}
+
+for(@ARGV)
+{
+ if(/^-x(.*)$/)
+ {
+ my $id = $lumpid{$1};
+ die "invalid lump $1 to remove"
+ unless defined $id;
+ $bsp[$id]->[2] = "";
+ }
+ elsif(/^-m(.*)$/)
+ {
+ $msg = $1;
+ }
+ elsif(/^-e(.*)$/) # extract lump
+ {
+ my $id = $lumpid{$1};
+ die "invalid lump $1 to extract"
+ unless defined $id;
+ print $bsp[$id]->[2];
+ }
+ elsif(/^-o(.*)$/)
+ {
+ open my $fh, ">", $1
+ or die "$1: $!";
+ print $fh $header;
+ my $pos = 17 * 8 + tell($fh) + length $msg;
+ for(@bsp)
+ {
+ $_->[0] = $pos;
+ $_->[1] = length $_->[2];
+ $pos += $_->[1];
+ print $fh pack "VV", $_->[0], $_->[1];
+ }
+ print $fh $msg;
+ for(@bsp)
+ {
+ print $fh $_->[2];
+ }
+ }
+}
+
+# TODO:
+# features like:
+# externalize lightmaps
+# decimate light grid
+# edit lightmaps/grid
More information about the nexuiz-commits
mailing list