mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 01:39:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
BEGIN {use File::Basename; push @INC, dirname($0); }
|
||||
require "valve_perl_helpers.pl";
|
||||
use Cwd;
|
||||
use String::CRC32;
|
||||
|
||||
sub ReadInputFileWithIncludes
|
||||
{
|
||||
local( $filename ) = shift;
|
||||
|
||||
local( *INPUT );
|
||||
local( $output );
|
||||
|
||||
open INPUT, "<$filename" || die;
|
||||
|
||||
local( $line );
|
||||
local( $linenum ) = 1;
|
||||
while( $line = <INPUT> )
|
||||
{
|
||||
if( $line =~ m/\#include\s+\"(.*)\"/i )
|
||||
{
|
||||
$output.= ReadInputFileWithIncludes( $1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= $line;
|
||||
}
|
||||
}
|
||||
|
||||
close INPUT;
|
||||
return $output;
|
||||
}
|
||||
|
||||
sub PatchCRC
|
||||
{
|
||||
my $filename = shift;
|
||||
my $crc = shift;
|
||||
# print STDERR "PatchCRC( $filename, $crc )\n";
|
||||
local( *FP );
|
||||
open FP, "+<$filename" || die;
|
||||
binmode( FP );
|
||||
seek FP, 6 * 4, 0;
|
||||
my $uInt = "I";
|
||||
if( $filename =~ m/360/ )
|
||||
{
|
||||
$uInt = "N";
|
||||
}
|
||||
print FP pack $uInt, $crc;
|
||||
close FP;
|
||||
}
|
||||
|
||||
my $txtfilename = shift;
|
||||
my $arg = shift;
|
||||
|
||||
my $is360 = 0;
|
||||
my $platformextension = "";
|
||||
if( $arg =~ m/-x360/i )
|
||||
{
|
||||
$is360 = 1;
|
||||
$platformextension = ".360";
|
||||
}
|
||||
|
||||
# Get the changelist number for the Shader Auto Checkout changelist. Will create the changelist if it doesn't exist.
|
||||
my $changelistnumber = `valve_p4_create_changelist.cmd ..\\..\\..\\game\\hl2\\shaders \"Shader Auto Checkout VCS\"`;
|
||||
# Get rid of the newline
|
||||
$changelistnumber =~ s/\n//g;
|
||||
|
||||
my $changelistarg = "";
|
||||
if( $changelistnumber != 0 )
|
||||
{
|
||||
$changelistarg = "-c $changelistnumber"
|
||||
}
|
||||
|
||||
open TXTFILE, "<$txtfilename";
|
||||
|
||||
my $src;
|
||||
my $dst;
|
||||
while( $src = <TXTFILE> )
|
||||
{
|
||||
# get rid of comments
|
||||
$src =~ s,//.*,,g;
|
||||
|
||||
# skip blank lines
|
||||
if( $src =~ m/^\s*$/ )
|
||||
{
|
||||
next;
|
||||
}
|
||||
|
||||
# Get rid of newlines.
|
||||
$src =~ s/\n//g;
|
||||
|
||||
# Save off the shader source filename.
|
||||
my $shadersrcfilename = $src;
|
||||
$shadersrcfilename =~ s/-----.*$//;
|
||||
# use only target basename.
|
||||
$src =~ s/^.*-----//;
|
||||
|
||||
# where the binary vcs file is
|
||||
my $spath = "";
|
||||
|
||||
if ( $shadersrcfilename =~ m@\.fxc@i )
|
||||
{
|
||||
$spath = "shaders\\fxc\\";
|
||||
}
|
||||
if ( $shadersrcfilename =~ m@\.vsh@i )
|
||||
{
|
||||
$spath = "shaders\\vsh\\";
|
||||
}
|
||||
if ( $shadersrcfilename =~ m@\.psh@i )
|
||||
{
|
||||
$spath = "shaders\\psh\\";
|
||||
}
|
||||
|
||||
# make the source have path and extension
|
||||
$src = $spath . $src . $platformextension . ".vcs";
|
||||
|
||||
# build the dest filename.
|
||||
$dst = $src;
|
||||
|
||||
$dst =~ s/shaders\\/..\\..\\..\\game\\hl2\\shaders\\/i;
|
||||
|
||||
# Does the dst exist?
|
||||
my $dstexists = -e $dst;
|
||||
my $srcexists = -e $src;
|
||||
# What are the time stamps for the src and dst?
|
||||
my $srcmodtime = ( stat $src )[9];
|
||||
my $dstmodtime = ( stat $dst )[9];
|
||||
|
||||
# Write $dst to a file so that we can do perforce stuff to it later.
|
||||
local( *VCSLIST );
|
||||
open VCSLIST, ">>vcslist.txt" || die;
|
||||
print VCSLIST $dst . "\n";
|
||||
close VCSLIST;
|
||||
|
||||
# Open for edit or add if different than what is in perforce already.
|
||||
if( !$dstexists || ( $srcmodtime != $dstmodtime ) )
|
||||
{
|
||||
if ( $srcexists && $shadersrcfilename =~ m@\.fxc@i )
|
||||
{
|
||||
# Get the CRC for the source file.
|
||||
my $srccode = ReadInputFileWithIncludes( $shadersrcfilename );
|
||||
my $crc = crc32( $srccode );
|
||||
|
||||
# Patch the source VCS file with the CRC32 of the source code used to build that file.
|
||||
PatchCRC( $src, $crc );
|
||||
}
|
||||
|
||||
# Make the target vcs writable if it exists
|
||||
if( $dstexists )
|
||||
{
|
||||
MakeFileWritable( $dst );
|
||||
}
|
||||
|
||||
my $dir = $dst;
|
||||
$dir =~ s,([^/\\]*$),,; # rip the filename off the end
|
||||
my $filename = $1;
|
||||
|
||||
# create the target directory if it doesn't exist
|
||||
if( !$dstexists )
|
||||
{
|
||||
&MakeDirHier( $dir, 0777 );
|
||||
}
|
||||
|
||||
# copy the file to its targets. . . we want to see STDERR here if there is an error.
|
||||
my $cmd = "copy $src $dst > nul";
|
||||
# print STDERR "$cmd\n";
|
||||
system $cmd;
|
||||
|
||||
MakeFileReadOnly( $dst );
|
||||
}
|
||||
}
|
||||
|
||||
close TXTFILE;
|
||||
Reference in New Issue
Block a user