source-engine/devtools/bin/playback_getstate.pl
2020-10-22 13:51:27 +03:00

170 lines
3.3 KiB
Perl
Executable File

# getfinalstate.pl blah.txt line
# note: the state is *before* the line that you specify
die "Usage: playback_getstate.pl blah.txt cmd\n" if scalar( @ARGV ) != 2;
open INPUT, shift || die;
$desiredcmd = shift;
$line = 0;
sub PadNumber
{
local( $str ) = shift;
local( $desiredLen ) = shift;
local( $len ) = length $str;
while( $len < $desiredLen )
{
$str = "0" . $str;
$len++;
}
return $str;
}
while( <INPUT> )
{
m/^cmd: (\d+) /;
$cmdnum = $1;
# print "$cmdnum\n";
if( $cmdnum == $desiredcmd )
{
print "$_";
last;
}
if( /Dx8SetTextureStageState:\s*stage:\s*(\d+)\s*state:\s*(\S+)\s*,\s*value:\s*(\S+)/ )
{
$texturestate{"$2 $1"} = $3;
# print "$1 $2 $3\n";
}
# elsif( /Dx8SetTextureStageState/i )
# {
# die "$_";
# }
if( /Dx8SetRenderState:\s*(\S+)\s+(\S+.*)*$/ )
{
$renderstate{$1} = $2;
}
# elsif( /Dx8SetRenderState/i )
# {
# die "$_";
# }
if( /Dx8SetVertexShaderConstant:\s*reg:\s*(\d+)\s*numvecs:\s*(\d+)\s*val:\s*(.*)$/ )
{
local( $reg ) = $1;
local( $count ) = $2;
local( $val ) = $3;
local( $i );
for( $i = 0; $i < $count; $i++, $reg++ )
{
$val =~ s/^\s*(\[\s*\S+\s+\S+\s+\S+\s+\S+\s*\])(.*$)/$2/;
$vertconst{ "vshconst " . &PadNumber( $reg, 2 ) } = $1;
}
}
# elsif( /Dx8SetVertexShaderConstant/i )
# {
# die "$_";
# }
if( /Dx8SetPixelShaderConstant:\s*reg:\s*(\d+)\s*numvecs:\s*(\d+)\s*val:\s*(.*)$/ )
{
local( $reg ) = $1;
local( $count ) = $2;
local( $val ) = $3;
local( $i );
for( $i = 0; $i < $count; $i++, $reg++ )
{
$val =~ s/^\s*(\[\s*\S+\s+\S+\s+\S+\s+\S+\s*\])(.*$)/$2/;
$pixelconst{ "pshconst " . &PadNumber( $reg, 2 ) } = $1;
}
}
# elsif( /Dx8SetPixelShaderConstant/i )
# {
# die "$_";
# }
if( /Dx8SetStreamSource:\s*vertexBufferID:\s*(\d+)\s*streamID:\s*(\d+)\s*vertexSize:\s*(\d+)\s*$/ )
{
$streamsrc{$2} = "vertexBufferID: $1 vertexSize: $3";
}
# elsif( /Dx8SetStreamSource/i )
# {
# die "$_";
# }
if( /Dx8CreateVertexShader:\s*id:\s*(\d+)\s+dwDecl:\s*(.*)$/ )
{
$vshdecl{$1} = $2;
}
elsif( /Dx8CreateVertexShader/i )
{
die "$_";
}
if( /Dx8SetVertexShader:\s*vertexShader:\s*(\d+)\s*$/ )
{
$currentVertexShader = $1;
}
elsif( /Dx8SetVertexShader:/i )
{
die "$_";
}
if( /Dx8SetPixelShader:\s*pixelShader:\s*(\d+)\s*$/ )
{
$currentPixelShader = $1;
}
elsif( /Dx8SetPixelShader:/i )
{
die "$_";
}
if( /Dx8SetVertexBufferFormat:\s*id:\s*(\d+)\s*vertexFormat:\s*(.*)$/ )
{
$vbformat{$1} = $2;
}
elsif( /Dx8SetVertexBufferFormat/i )
{
die "$_";
}
}
close INPUT;
foreach $state ( sort( keys( %texturestate ) ) )
{
print "$state = $texturestate{$state}\n";
}
foreach $state ( sort( keys( %renderstate ) ) )
{
print "$state = $renderstate{$state}\n";
}
foreach $state ( sort( keys( %vertconst ) ) )
{
print "$state = $vertconst{$state}\n";
}
foreach $state ( sort( keys( %pixelconst ) ) )
{
print "$state = $pixelconst{$state}\n";
}
foreach $state ( sort( keys( %streamsrc ) ) )
{
$streamsrc{$state} =~ m/vertexBufferID:\s*(\d+)\s+/;
local( $vertbufid ) = $1;
print "stream $state = $streamsrc{$state} vbformat: $vbformat{$vertbufid}\n";
}
#foreach $state ( sort( keys( %vbformat ) ) )
#{
# print "vbformat $state = $vbformat{$state}\n";
#}
print "current vsh: $currentVertexShader vshdecl: $vshdecl{$currentVertexShader}\n";
print "current psh: $currentPixelShader\n";