use SDL::Event;
use Math::CatmullRom;
use Algorithm::Line::Bresenham qw(line);
+use Math::Bezier;
use Carp qw(cluck);
use Data::Dump qw(dump);
our @path;
sub reset_path { @path = () }
-sub curve {
-
- push @path, lading_points( $path[-2], $path[-1] ) if $#path > 1;
+sub curve_catmull_rom {
if ( $#path < ( 4 * 2 - 1 ) ) { # less than 4 points
warn "path too short ", dump @path;
my $curve = Math::CatmullRom->new( @path );
my $points = $#path + 1 - 4; # remove start/end points
- my @curve = $curve->curve( $points );
+ return $curve->curve( $points );
+}
+
+sub curve_bezier {
+ my $curve = Math::Bezier->new( @path );
+ return $curve->curve( $#path + 1 );
+}
+
+our $curve_type = 0;
+
+sub curve {
+ # add landing path points
+ push @path, lading_points( $path[-2], $path[-1] ) if $#path > 1;
+
+ my $type = 1;
+
+ my @curve = $curve_type ? curve_catmull_rom : curve_bezier;
debug 'curve' => @curve;
my $i = 0;
sub { $app->pixel( @_, $path_color ) }
);
}
+ $app->sync;
+
push @airplanes, Airplane->new( $app );
$airplanes[-1]->set_path( @path );
- $app->sync;
reset_path;
}
} elsif ( $type == SDL_MOUSEBUTTONUP() ) {
debug 'mouse up', $event->button_x, $event->button_y;
$mouse_down = 0;
-
curve;
} elsif ( $type == SDL_QUIT() ) {
exit;
$current_mask++;
$current_mask = 0 if $current_mask > $#masks;
clear_screen $current_mask;
+ } elsif ( $key eq 't' ) { # XXX curve type
+ $curve_type = ! $curve_type;
} else {
warn "unknown key $key";
}