3 die "usage: perl assignVertexShaderConstants.pl input_template hlsl.inc dx.inc shaderBuilder.inc\n" if (@ARGV != 4);
7 # define the sizes of some intrinsic types
13 $size{"float4x4"} = 4;
17 open(HLSL
, ">".shift);
27 # begin recording information about a struct
32 elsif ($struct ne "" && /^};/ )
34 # end recording information about a struct
38 elsif (/^\/\
// || /^#pragma/ || /^{/ || /^\s*$/)
40 # copy any comments, pragmas, open curly braces, or blank lines
43 elsif (/^static const int /)
45 # record global integer values for array sizes
47 s/^static const int //;
50 ($variable, $value) = split;
51 $variable{$variable} = $value;
55 # assume this is a global variable or structure member
63 if (defined $variable{$1})
65 $count = $variable{$1};
74 ($type, $variable) = split;
76 die "unknown size for $type\n" if (!defined $size{$type});
81 $size{$struct} += $size{$type} * $count;
84 @array = (0 .. $count-1) if ($array);
85 $variable =~ s/\[.*//;
87 foreach $index (@array)
89 # handle structure members
91 $index = "[$index]" if ($index ne "");
92 if (defined $members{$type})
94 my @members = split (/\s+/, $members{$type});
97 my $member = shift @members;
98 my $size = shift @members;
99 $members{$struct} .= " " if (defined $members{$struct});
100 $members{$struct} .= "$variable$index.$member $size";
105 $members{$struct} .= " " if (defined $members{$struct});
106 $members{$struct} .= "$variable$index $size{$type}";
112 # handle global variables
116 if (defined $members{$type})
118 # emit registers for all the stucture members
120 my @members = split (/\s+/, $members{$type});
123 my $member = shift @members;
124 print SB
"\t\taddConstantRegister(\"$variable.$member\", ", $register + $offset, ");\n";
125 $offset += shift @members;
130 # emit register for the variable
131 print SB
"\t\taddConstantRegister(\"$variable\", $register);\n";
134 print CPP
"\tVSCR_$variable = $register,\n";
135 print HLSL
"$_ : register(c$register);\n";
136 $register += $size{$type} * $count;
141 print CPP
"\tVSCR_MAX", " = $register\n";