111 lines
2.9 KiB
Perl
111 lines
2.9 KiB
Perl
package Manticore::Layer;
|
|
|
|
# A layer contains an internal representation of data
|
|
# It renders into a list of objects, which are one of
|
|
# * non-selfoverlapping polygons with abstract color
|
|
# * Named lines
|
|
# * Named points
|
|
# * Named float values
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
# renderMode, each entry:
|
|
# convert -- return the polynomials from the data and sub-layers
|
|
# parse -- what we parse; either everything or blockwise
|
|
# parsemode -- do we parse blockwise (that is: whitespace free sequences thay may contain whitespace in (), but these may only contain matching ()s) or total
|
|
# desc -- description text
|
|
# children -- meant to have child layers
|
|
|
|
my %renderMode = (
|
|
traverse => {
|
|
convert => sub {},
|
|
parse => sub {
|
|
my $block = shift;
|
|
},
|
|
parsemode => "blockwise",
|
|
desc => 'A closed traverse line defining the object. That can be a polygon or contain additional interpolation primitives.',
|
|
children => 0,
|
|
},
|
|
polynom => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'A polynomial whichs positive set defines the object.',
|
|
children => 0,
|
|
},
|
|
union => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'Several layers atop of each other; the higher/earlier layers cover the layers below. It has the color if the color can be seen in the highest layer',
|
|
children => 1,
|
|
},
|
|
intersect => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'Several layers atop of each other; color is only there if it is there in every layer and the same.',
|
|
children => 1,
|
|
},
|
|
difference => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'Several layers atop of each other; color of the first layer unless any of the further layers has this color as well.',
|
|
children => 1,
|
|
},
|
|
hull => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'Convex hull of the object.',
|
|
children => 1,
|
|
},
|
|
sum => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'Minkowsky sum of the sub objects.',
|
|
children => 1,
|
|
},
|
|
recol => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "blockwise",
|
|
desc => 'Recolorize the sub objects.',
|
|
children => 1,
|
|
},
|
|
file => {
|
|
convert => sub {},
|
|
parse => sub {},
|
|
parsemode => "everything",
|
|
desc => 'Load the data from an external file.',
|
|
children => 0,
|
|
},
|
|
);
|
|
|
|
sub fromText {
|
|
my (undef, $head, $cont) = @_;
|
|
if(exists $renderMode{$head}) {
|
|
my $render = $renderMode{$head};
|
|
my @all = ($cont);
|
|
if('blockwise' eq $render->{parsemode}) {
|
|
# split into blocks
|
|
# Note: regexes have sub-patterns
|
|
# "aababb"=~m#^(?<AB>|ab|a(?&AB)ba(?&AB)b|a(?&AB)b)$#
|
|
}
|
|
my $data = $render->{parse}->($cont);
|
|
return undef unless $data;
|
|
return bless {
|
|
data => $data,
|
|
mode => $head,
|
|
};
|
|
} else {
|
|
return undef;
|
|
}
|
|
}
|
|
|
|
|
|
1;
|