15 chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
22 chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
24 if(/^"(.*?)" "(.*)"$/)
32 push @brushes, $brush;
36 chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
45 chomp; s/\r//g; s/\0//g; s/\/\/.*$//; s/^\s+//; s/\s+$//; next if /^$/;
72 return \%ent, \@brushes;
78 die "Unexpected line in top level: >>$_<<";
87 my ($ent, $brushes) = @_;
94 $s .= "\"$_\" \"$ent{$_}\"\n";
102 $s .= "$_\n" for @$_;
111 my @axialbrushpattern = (
112 [ "+++", "+-+", "-++", " - ", "- " ],
113 [ "+++", "-++", "++-", "+ ", " +" ],
114 [ "+++", "++-", "+-+", " - ", " +" ],
115 [ "---", "+--", "-+-", " - ", "+ " ],
116 [ "---", "--+", "+--", "- ", " +" ],
117 [ "---", "-+-", "--+", " + ", " +" ]
119 sub axialbrushpattern($$$)
121 my ($plane, $vertex, $coord) = @_;
122 my $ch = substr $axialbrushpattern[$plane][$vertex], $coord, 1;
123 return $ch eq '+' ? +1 : $ch eq '-' ? -1 : 0;
130 sub ConvertOriginBrush($$$$)
132 my ($brushPrimit, $x, $y, $z) = @_;
136 push @data, "brushDef";
141 "( %s %s %s ) ( %s %s %s ) ( %s %s %s ) ( ( %s %s %s ) ( %s %s %s ) ) common/origin 0 0 0",
142 $x + 8 * axialbrushpattern($_, 0, 0), $y + 8 * axialbrushpattern($_, 0, 1), $z + 8 * axialbrushpattern($_, 0, 2),
143 $x + 8 * axialbrushpattern($_, 1, 0), $y + 8 * axialbrushpattern($_, 1, 1), $z + 8 * axialbrushpattern($_, 1, 2),
144 $x + 8 * axialbrushpattern($_, 2, 0), $y + 8 * axialbrushpattern($_, 2, 1), $z + 8 * axialbrushpattern($_, 2, 2),
145 1/16.0, 0, frac((axialbrushpattern($_, 3, 0) * $x + axialbrushpattern($_, 3, 1) * $y + axialbrushpattern($_, 3, 2) * $z) / 16.0 + 0.5),
146 0, 1/16.0, frac((axialbrushpattern($_, 4, 0) * $x + axialbrushpattern($_, 4, 1) * $y + axialbrushpattern($_, 4, 2) * $z) / 16.0 + 0.5);
152 my $data = "// origin brush\n{\n";
156 "( %s %s %s ) ( %s %s %s ) ( %s %s %s ) common/origin %s %s 0 %s %s 0 0 0",
157 $x + 8 * axialbrushpattern($_, 0, 0), $y + 8 * axialbrushpattern($_, 0, 1), $z + 8 * axialbrushpattern($_, 0, 2),
158 $x + 8 * axialbrushpattern($_, 1, 0), $y + 8 * axialbrushpattern($_, 1, 1), $z + 8 * axialbrushpattern($_, 1, 2),
159 $x + 8 * axialbrushpattern($_, 2, 0), $y + 8 * axialbrushpattern($_, 2, 1), $z + 8 * axialbrushpattern($_, 2, 2),
160 frac((axialbrushpattern($_, 3, 0) * $x + axialbrushpattern($_, 3, 1) * $y + axialbrushpattern($_, 3, 2) * $z) / 16.0 + 0.5) * 64.0,
161 frac((axialbrushpattern($_, 4, 0) * $x + axialbrushpattern($_, 4, 1) * $y + axialbrushpattern($_, 4, 2) * $z) / 16.0 + 0.5) * 64.0,
168 my ($infile, $outfile) = @ARGV;
169 open my $infh, '<', $infile
170 or die "<$infile: $!";
176 my ($ent, $brushes) = ParseEntity $infh;
182 if grep { m!\s+brushDef\s+!; } @$brushes;
183 if(grep { m!\s+common/origin\s+!; } @$brushes)
185 # we have origin brushes - good
189 if(defined $ent->{origin})
191 my $origin = [ split /\s+/, ($ent->{origin} || "0 0 0") ];
192 delete $ent->{origin};
193 push @$brushes, ConvertOriginBrush $brushPrimit, $origin->[0], $origin->[1], $origin->[2];
197 $outbuf .= UnparseEntity $ent, $brushes;
202 open my $outfh, '>', $outfile
203 or die ">$outfile: $!";
204 print $outfh $outbuf;