10 # int ident = "IDSP"
\r
12 # int type = {projection type enum}
\r
13 # float boundingradius
\r
14 # int width = width of largest frame
\r
15 # int height = height of largest frame
\r
18 # int synctype = {ST_SYNC=0, ST_RAND=1}
\r
22 # int type = {SPR_SINGLE=0, SPR_GROUP=1}
\r
23 # if type == SPR_GROUP:
\r
24 # int numframes_thisgroup
\r
25 # for 1..numframes_thisgroup:
\r
27 # for 1..numframes_thisgroup:
\r
33 # width*height*4 bytes of image data, RGBA
\r
35 my $magick = Image::Magick->new();
\r
46 my ($spritestruct, $filename) = @_;
\r
47 open my $fh, '>', $filename;
\r
49 syswrite $fh, "IDSP";
\r
50 syswrite $fh, pack 'V', 32;
\r
51 syswrite $fh, pack 'V', $spritestruct->{type};
\r
53 my $radius_x = abs(abs($spritestruct->{x0}) > abs($spritestruct->{x1}) ? $spritestruct->{x0} : $spritestruct->{x1});
\r
54 my $radius_y = abs(abs($spritestruct->{y0}) > abs($spritestruct->{y1}) ? $spritestruct->{y0} : $spritestruct->{y1});
\r
56 syswrite $fh, pack 'f', sqrt($radius_x * $radius_x + $radius_y * $radius_y);
\r
57 syswrite $fh, pack 'V', $spritestruct->{x1} - $spritestruct->{x0};
\r
58 syswrite $fh, pack 'V', $spritestruct->{y1} - $spritestruct->{y0};
\r
59 syswrite $fh, pack 'V', scalar @{$spritestruct->{groups}};
\r
60 syswrite $fh, pack 'f', $spritestruct->{beamlength};
\r
61 syswrite $fh, pack 'V', $spritestruct->{synctype};
\r
63 for my $g(@{$spritestruct->{groups}})
\r
65 my $f = $g->{frames};
\r
69 syswrite $fh, pack 'V', 0;
\r
74 syswrite $fh, pack 'V', 1;
\r
75 syswrite $fh, pack 'V', scalar @$f;
\r
76 syswrite $fh, pack 'f', $_->{interval} for @$f;
\r
80 syswrite $fh, pack 'V', $_->{orgx} - $_->{width};
\r
81 syswrite $fh, pack 'V', $_->{orgy};
\r
82 syswrite $fh, pack 'V', $_->{width};
\r
83 syswrite $fh, pack 'V', $_->{height};
\r
84 syswrite $fh, $_->{data};
\r
89 sub spritestruct($$$)
\r
91 my ($type, $beamlength, $synctype) = @_;
\r
94 beamlength => $beamlength,
\r
95 synctype => $synctype,
\r
117 sub spriteframe($$$$$)
\r
119 my ($spritestruct, $imagefile, $orgx, $orgy, $interval) = @_;
\r
120 checkmagick $magick->Read($imagefile);
\r
121 my ($width, $height) = $magick->Get('columns', 'rows');
\r
122 my $data = $magick->ImageToBlob(depth => 8, magick => 'RGBA');
\r
124 die "Size mismatch for $imagefile: @{[length $data]} is not @{[4 * $width * $height]}"
\r
125 if length $data != 4 * $width * $height;
\r
126 my $g = ($spritestruct->{groups}->[-1]);
\r
127 push @{$g->{frames}}, my $s = {};
\r
128 $s->{width} = $width;
\r
129 $s->{orgx} = $orgx;
\r
130 $s->{orgy} = $orgy;
\r
131 $s->{width} = $width;
\r
132 $s->{height} = $height;
\r
133 $s->{data} = $data;
\r
134 $s->{interval} = $interval;
\r
136 my $x0 = 0 - $orgx;
\r
137 my $y0 = 0 - $orgy;
\r
138 my $x1 = $width - $orgx;
\r
139 my $y1 = $height - $orgy;
\r
141 $spritestruct->{x0} = $x0 if $width > $spritestruct->{x0};
\r
142 $spritestruct->{y0} = $y0 if $width > $spritestruct->{y0};
\r
143 $spritestruct->{x1} = $x1 if $width > $spritestruct->{x1};
\r
144 $spritestruct->{y1} = $y1 if $width > $spritestruct->{y1};
\r
149 my ($spritestruct) = @_;
\r
150 push @{$spritestruct->{groups}}, my $g = {};
\r
158 [-proj projectiontype]
\r
162 -sprite filename.tga orgx orgy interval
\r
163 [-sprite filename.tga orgx orgy interval [...]]
\r
165 -sprite filename.tga orgx orgy interval
\r
166 [-sprite filename.tga orgx orgy interval [...]] [...]]
\r
170 my $proj = 2; # SPR_VP_PARALLEL
\r
173 my $outfile = undef;
\r
179 my $s = shift @ARGV;
\r
182 $proj = shift @ARGV;
\r
184 elsif($s eq '-beam')
\r
186 $beam = shift @ARGV;
\r
188 elsif($s eq '-rand')
\r
194 $outfile = shift @ARGV;
\r
196 elsif($s eq '-group')
\r
200 elsif($s eq '-sprite')
\r
208 unshift @ARGV, '-sprite';
\r
213 usage() unless defined $outfile;
\r
215 my $spritestruct = spritestruct($proj, $beam, $synctype);
\r
216 print "created sprite with projection $proj, beam length $beam, sync type $synctype\n";
\r
218 spritegroup($spritestruct);
\r
219 print " created sprite group\n";
\r
225 my $s = shift @ARGV;
\r
226 if($s eq '-sprite')
\r
228 my ($filename, $orgx, $orgy, $interval) = splice @ARGV, 0, 4;
\r
229 usage() if not defined $interval;
\r
230 spriteframe($spritestruct, $filename, $orgx, $orgy, $interval);
\r
231 print " created sprite frame $filename, origin at $orgx|$orgy, interval $interval\n";
\r
233 elsif($s eq '-group')
\r
235 spritegroup($spritestruct);
\r
236 print " created sprite group\n";
\r
240 my ($orgx, $orgy, $interval) = splice @ARGV, 0, 3;
\r
241 usage() if not defined $interval;
\r
242 spriteframe($spritestruct, $s, $orgx, $orgy, $interval);
\r
243 print " created sprite frame $s, origin at $orgx|$orgy, interval $interval\n";
\r
247 writesprite($spritestruct, $outfile);
\r
248 print "written to $outfile\n";
\r