⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psh_prep.pl

📁 hl2 source code. Do not use it illegal.
💻 PL
字号:
sub BuildDefineOptions
{
	local( $output );
	local( $combo ) = shift;
	local( $i );
	for( $i = 0; $i < scalar( @defineNames ); $i++ )
	{
		local( $val ) = ( $combo % ( $defineMax[$i] - $defineMin[$i] + 1 ) ) + $defineMin[$i];
		$output .= "/D$defineNames[$i]=$val ";
		$combo = $combo / ( $defineMax[$i] - $defineMin[$i] + 1 );
	}
	return $output;
}

sub CalcNumCombos
{
	local( $i, $numCombos );
	$numCombos = 1;
	for( $i = 0; $i < scalar( @defineNames ); $i++ )
	{
		$numCombos *= $defineMax[$i] - $defineMin[$i] + 1;
	}
	return $numCombos;
}

print "--------\n";

$psh_filename = shift;
if( $psh_filename =~ m/-dx9/i )
{
	$g_dx9 = 1;
	$psh_filename = shift;
}

local( @defineNames );
local( @defineMin );
local( @defineMax );

open PSH, "<$psh_filename";
while( <PSH> )
{
	last if( !m,^;, );
	s,^;\s*,,;
	if( m/\"(.*)\"\s+\"(\d+)\.\.(\d+)\"/ )
	{
		local( $name, $min, $max );
		$name = $1;
		$min = $2;
		$max = $3;
		print "\"$name\" \"$min..$max\"\n";
		push @defineNames, $name;
		push @defineMin, $min;
		push @defineMax, $max;
	}
}
close PSH;

$numCombos = &CalcNumCombos();
print "$numCombos combos\n";

if( $g_dx9 )
{
	$pshtmp = "pshtmp9";
}
else
{
	$pshtmp = "pshtmp8";
}
$basename = $psh_filename;
$basename =~ s/\.psh$//i;

for( $shaderCombo = 0; $shaderCombo < $numCombos; $shaderCombo++ )
{
	if( $g_dx9 )
	{
		$pshtmp = "pshtmp9";
		$cmd = "..\\..\\devtools\\bin\\psa9 /Zi /Fh /nologo " . &BuildDefineOptions( $shaderCombo ) . "$psh_filename";
	}
	else
	{
		$pshtmp = "pshtmp8";
		$cmd = "..\\..\\devtools\\bin\\psa8_1 -h -p " . &BuildDefineOptions( $shaderCombo ) . "$psh_filename";
	}
	if( !stat $pshtmp )
	{
		mkdir $pshtmp, 0777 || die $!;
	}
	print $cmd . "\n";
	system $cmd || die $!;

	$hdrname = $psh_filename;

	$hdrname =~ s/\.psh$/\.h/i;
	#print $hdrname . "\n";

	if( !open FILE, "<$hdrname" )
	{
		die "can't open $hdrname: $!\n";
	}
	@hdr = <FILE>;
	close FILE;
	unlink $hdrname;

	for( $i = 0; $i < scalar( @hdr ); $i++ )
	{
		if( $g_dx9 )
		{
			$hdr[$i] =~ s/const DWORD/static unsigned int/i;
			$replace = "pixelShader_" . $basename . "_" . $shaderCombo;
			$hdr[$i] =~ s/g_\S+_main/$replace/i;
		}
		else
		{
			$replace = "pixelShader_" . $basename . "_" . $shaderCombo;
			$hdr[$i] =~ s/DWORD dwPixelShader/static unsigned int $replace/i;
		}
	}
	push @outputHeader, @hdr;
}

$basename =~ s/\.fxc//gi;
push @outputHeader, "static PrecompiledShaderByteCode_t " . $basename . "_pixel_shaders[" . $numCombos . "] = \n";
push @outputHeader, "{\n";
local( $j );
for( $j = 0; $j < $numCombos; $j++ )
{
	local( $thing ) = "pixelShader_" . $basename . "_" . $j;
	push @outputHeader, "\t{ " . "$thing, sizeof( $thing ) },\n";
}
push @outputHeader, "};\n";

push @outputHeader, "struct $basename" . "PixelShader_t : public PrecompiledShader_t\n";
push @outputHeader, "{\n";
push @outputHeader, "\t$basename" . "PixelShader_t()\n";
push @outputHeader, "\t{\n";
push @outputHeader, "\t\tm_nFlags = SHADER_CUSTOM_ENUMERATION;\n";
push @outputHeader, "\t\tm_pByteCode = " . $basename . "_pixel_shaders;\n";
push @outputHeader, "\t\tm_nShaderCount = $numCombos;\n";
push @outputHeader, "\t\tm_pName = \"$basename\";\n";
if( $basename =~ /vs\d\d/ ) # hack
{
	push @outputHeader, "\t\tGetShaderDLL()->InsertPrecompiledShader( PRECOMPILED_VERTEX_SHADER, this );\n";
}
else
{
	push @outputHeader, "\t\tGetShaderDLL()->InsertPrecompiledShader( PRECOMPILED_PIXEL_SHADER, this );\n";
}
push @outputHeader, "\t}\n";
push @outputHeader, "};\n";

push @outputHeader, "static $basename" . "PixelShader_t $basename" . "_PixelShaderInstance;\n";


$incname = "$pshtmp/$basename.inc";
print "writing to $incname\n";
open OUTPUT, ">$incname" || die $!;
print OUTPUT @outputHeader;
close OUTPUT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -