104 lines
3.4 KiB
Perl
Executable File
104 lines
3.4 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
# triangu.pl
|
|
#
|
|
# Copyright (c) Fabian Frederick 2001
|
|
#
|
|
# 20/06 : Polygonal linking.Rendering is better
|
|
# Using I(y)
|
|
#
|
|
# 19/06/2001 : Passing gamma reference to alpha in linear scan
|
|
# First workable version
|
|
#
|
|
|
|
use Gimp::Feature 'pdl';
|
|
use Gimp qw(:auto __ N_);
|
|
use Gimp::Fu;
|
|
use PDL::LiteF;
|
|
use PDL::Slices;
|
|
use POSIX;
|
|
|
|
sub triangle {
|
|
my ($image, $drawable, $bckcolor, $xscale, $yscale, $thickness, $ground, $elevation) = @_;
|
|
$oldforeground=gimp_palette_get_foreground();
|
|
$oldbackground=gimp_palette_get_background();
|
|
gimp_palette_set_background($bckcolor);
|
|
Gimp->progress_init("Rendering...");
|
|
gimp_selection_clear($image);
|
|
$width=gimp_image_width($image);$height=gimp_image_height($image);
|
|
my $src=new PixelRgn($drawable,0,0,$width,$height, 0, 0);
|
|
for ($y=0;$y<$src->h;$y+=$yscale){
|
|
$row=$src->get_row(0,$y,$src->w);
|
|
for (my $x=0;$x<$src->w;$x+=$xscale){push @acq,[$x,($src->h-$row->slice(1)->at(0,$x)-$ground)/2];}
|
|
}
|
|
Gimp->progress_update(0.8);
|
|
my $newimage=gimp_image_new($src->w, $src->h, 0);
|
|
gimp_layer_new($newimage,$src->w, $src->h, RGB_IMAGE, "L1", 100, NORMAL_MODE)->gimp_image_add_layer(-1);
|
|
$newdrawable=gimp_image_active_drawable($newimage);
|
|
gimp_drawable_fill($newdrawable, 1);
|
|
|
|
my $thickness=sprintf("0%d", $thickness);
|
|
#gimp_brushes_set_brush("Circle (01)");
|
|
gimp_brushes_set_brush("Circle ($thickness)");
|
|
my $indline=1;my $exc=0;
|
|
for(my $ind=0,my $perline=floor($src->w/$xscale)+1;$ind<($src->h/$yscale*$src->w/$xscale)-10;){
|
|
if ($indline<($width/$xscale)){
|
|
$elvlevel=($ind/($src->w/$xscale))*$elevation;
|
|
gimp_palette_set_foreground([$acq[$ind][1],$acq[$ind][1],$acq[$ind][1]]);
|
|
gimp_pencil($newdrawable, 4, [$acq[$ind+$perline][0],$acq[$ind+$perline][1]+$elvlevel,$acq[$exc][0],$acq[$exc][1]+$elvlevel]);
|
|
gimp_pencil($newdrawable, 4, [$acq[$ind][0],$acq[$ind][1]+$elvlevel,$acq[$ind+1][0],$acq[$ind+1][1]+$elvlevel]);
|
|
gimp_pencil($newdrawable, 4, [$acq[$ind][0], $acq[$ind][1]+$elvlevel,$acq[$ind+$perline][0], $acq[$ind+$perline][1]+$elvlevel]);
|
|
gimp_pencil($newdrawable, 4, [$acq[$ind+$perline][0],$acq[$ind+$perline][1]+$elvlevel,$acq[$ind+1][0],$acq[$ind+1][1]+$elvlevel]);
|
|
$exc=$ind+$perline;
|
|
$indline=$indline+1;
|
|
}else{
|
|
$indline=1;
|
|
}
|
|
Gimp->progress_update($ind/($src->h/$yscale*$src->w/$xscale));
|
|
$ind=$ind+1;
|
|
}
|
|
$newdrawable->merge_shadow(1);
|
|
$newdrawable->update(0,0,$width, $height);
|
|
Gimp->display_new($newimage);
|
|
Gimp->progress_update(1);
|
|
gimp_palette_set_foreground($oldforeground);
|
|
gimp_palette_set_foreground($oldbackground);
|
|
|
|
}
|
|
register "triangulandscape",
|
|
"Generate a triangulation landscape",
|
|
"Generate a triangulation landscape",
|
|
"Fabian Frederick",
|
|
"(c) 2001 Fabian Frederick",
|
|
"20010701",
|
|
N_"<Image>/Filters/Render/Triangulation Landscape",
|
|
"RGB",
|
|
[
|
|
[PF_COLOR, "background_color","background color", [100,100,100]],
|
|
[PF_SLIDER, "xscan", "Stat each X coord.", 20, [1, 100]],
|
|
[PF_SLIDER, "yscan", "Stat each Y coord.", 20, [1, 100]],
|
|
[PF_SLIDER, "line_thickness", "Line thickness", 1, [1, 5]],
|
|
[PF_SLIDER, "ground", "Pixels from bottom", 50, [1, 100]],
|
|
[PF_SLIDER, "elevation", "elevation factor in pixels", 10, [1, 100]],
|
|
],
|
|
\▵
|
|
exit main;
|
|
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
Triangulation Landscape
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
Triangulation Landscape
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Triangulation Landscape is a Gimp plugin.
|
|
|
|
|
|
=head1 AUTHOR
|
|
|
|
Written by Fabian Frederick <fabian.frederick@gmx.fr>, (c) 2001
|