ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/UI/Canvas.pm
Revision: 1.4
Committed: Wed Dec 26 21:03:21 2007 UTC (16 years, 5 months ago) by root
Branch: MAIN
Changes since 1.3: +3 -3 lines
Log Message:
initial module hiding

File Contents

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