ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/UI/Canvas.pm
Revision: 1.6
Committed: Sat Apr 3 02:58:25 2010 UTC (14 years, 2 months ago) by root
Branch: MAIN
CVS Tags: rel-2_11, HEAD
Changes since 1.5: +1 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.4 package DC::UI::Canvas;
2 root 1.1
3 root 1.6 use common::sense;
4 root 1.1
5     use List::Util qw(max min);
6    
7 root 1.4 use DC::OpenGL;
8 root 1.1
9 root 1.4 our @ISA = DC::UI::Fixed::;
10 root 1.1
11     sub new {
12     my ($class, %arg) = @_;
13    
14     my $items = delete $arg{items};
15    
16     my $self = $class->SUPER::new (
17 root 1.2 items => [],
18 root 1.1 @_,
19     );
20    
21     $self->add (@$items)
22     if $items && @$items;
23    
24     $self
25     }
26    
27     sub add_items {
28     my ($self, @items) = @_;
29    
30     push @{$self->{items}}, @items;
31    
32     my @coords =
33     map @{ $_->{coord} },
34     grep $_->{coord_mode} ne "rel",
35     @{ $self->{items} };
36    
37     $self->{item_max_w} = max map $_->[0], @coords;
38     $self->{item_max_h} = max map $_->[1], @coords;
39    
40     $self->realloc;
41    
42     map $_+0, @items
43     }
44    
45     sub size_request {
46     my ($self) = @_;
47    
48     my ($w, $h) = $self->SUPER::size_request;
49    
50 root 1.2 (
51     (max $w, $self->{item_max_w}),
52     (max $h, $self->{item_max_h}),
53     )
54 root 1.1 }
55    
56     my %GLTYPE = (
57     lines => GL_LINES,
58     line_strip => GL_LINE_STRIP,
59     line_loop => GL_LINE_LOOP,
60     quads => GL_QUADS,
61     quad_strip => GL_QUAD_STRIP,
62     triangles => GL_TRIANGLES,
63     triangle_strip => GL_TRIANGLE_STRIP,
64     triangle_fan => GL_TRIANGLE_FAN,
65     polygon => GL_POLYGON,
66     );
67    
68     sub _draw {
69     my ($self) = @_;
70    
71     $self->SUPER::_draw;
72    
73     for my $item (@{ $self->{items} }) {
74     glPushMatrix;
75     glScale $self->{w}, $self->{h} if $item->{coord_mode} eq "rel";
76    
77     glColor @{ $item->{color} };
78     glLineWidth $item->{width} || 1.;
79     glPointSize $item->{size} || 1.;
80    
81     if (my $gltype = $GLTYPE{$item->{type}}) {
82     glBegin $gltype;
83     glVertex @$_ for @{$item->{coord}};
84     glEnd;
85     }
86    
87     glPopMatrix;
88     }
89 root 1.5
90     glLineWidth 1;
91     glPointSize 1;
92 root 1.1 }
93    
94     1
95