Added SDL_Pallete Capability
[sdlgit/SDL_perl.git] / test / OpenGL / test2.pl
1 #!/usr/bin/env perl
2
3 use SDL;
4 use SDL::App;
5 use SDL::Surface;
6 use SDL::Event;
7 use SDL::OpenGL;
8
9 package SDL::OpenGL::Cube;
10 use SDL;
11 use SDL::OpenGL;
12
13 my $vertex_array = pack "d24", 
14         -0.5,-0.5,-0.5, 0.5,-0.5,-0.5, 0.5,0.5,-0.5, -0.5,0.5,-0.5, # back
15         -0.5,-0.5,0.5,  0.5,-0.5,0.5,  0.5,0.5,0.5,  -0.5,0.5,0.5 ;  # front
16
17 my $indicies = pack "C24",      
18                         4,5,6,7,        # front
19                         1,2,6,5,        # right
20                         0,1,5,4,        # bottom
21                         0,3,2,1,        # back
22                         0,4,7,3,        # left
23                         2,3,7,6;        # top
24
25 sub new {
26         my $proto = shift;
27         my $class = ref($proto) || $proto;
28         my $self = {};
29         bless $self,$class;
30         $self;
31 }
32
33 sub draw {
34         my ($self) = @_;
35         $self->color();
36         glEnableClientState(GL_VERTEX_ARRAY());
37         glVertexPointer(3,GL_DOUBLE(),0,$vertex_array);
38         glDrawElements(GL_QUADS(), 24, GL_UNSIGNED_BYTE(), $indicies);
39 }
40
41 sub color {
42         my ($self,@colors) = @_;
43
44         if (@colors) {
45                 $$self{colored} = 1;
46                 die "SDL::OpenGL::Cube::color requires 24 floating point color values\n"
47                         unless (scalar(@colors) == 24);
48                 $$self{-colors} = pack "f24",@colors;
49         }
50
51         if ($$self{colored}) {
52                 glEnableClientState(GL_COLOR_ARRAY);
53                 glColorPointer(3,GL_FLOAT,0,$$self{-colors});
54         } else {
55                 glDisableClientState(GL_COLOR_ARRAY);
56         }
57 }
58
59
60 1;
61
62
63 die "Usage: $0 delay\n Hold the space key for a white cube\n" unless (defined $ARGV[0]);
64 $delay = $ARGV[0];
65
66 print "Starting $0\n";
67
68 my $app = new SDL::App  -w => 800, -h => 600, -d => 16, -gl =>1;
69
70 print "Initializing OpenGL settings\n";
71 printf "%-24s%s\n", "GL_RED_SIZE ", $app->attribute( SDL_GL_RED_SIZE() );
72 printf "%-24s%s\n", "GL_GREEN_SIZE ", $app->attribute( SDL_GL_GREEN_SIZE());
73 printf "%-24s%s\n", "GL_BLUE_SIZE ", $app->attribute( SDL_GL_BLUE_SIZE() );
74 printf "%-24s%s\n", "GL_DEPTH_SIZE ", $app->attribute( SDL_GL_DEPTH_SIZE() );
75 printf "%-24s%s\n", "GL_DOUBLEBUFFER ", $app->attribute( SDL_GL_DOUBLEBUFFER() );
76
77 $angle = 0;     
78 $other = 0;
79         
80 my @colors =  (
81         1.0,1.0,0.0,    1.0,0.0,0.0,    0.0,1.0,0.0, 0.0,0.0,1.0,       #back
82         0.4,0.4,0.4,    0.3,0.3,0.3,    0.2,0.2,0.2, 0.1,0.1,0.1 );     #front
83         
84
85 $cube = new SDL::OpenGL::Cube;
86 $cube->color(@colors);
87
88 $white = new SDL::OpenGL::Cube;
89
90 $toggle = 1;
91
92 glEnable(GL_CULL_FACE);
93 glFrontFace(GL_CCW);
94 glCullFace(GL_BACK);
95
96 sub DrawScene {
97
98         glClear( GL_DEPTH_BUFFER_BIT() 
99                 | GL_COLOR_BUFFER_BIT());
100
101         glLoadIdentity();
102
103         glTranslate(0,0,-6.0);
104         glRotate($angle % 360,1,1,0);
105         glRotate($other % 360,0,1,1);
106
107         $angle += 6;
108         $other += $angle % 5;
109
110         glColor(1,1,1);
111         $toggle ? $cube->draw() : $white->draw();
112
113         $app->sync();
114
115 }
116
117 sub InitView {
118         glViewport(0,0,800,600);
119
120         glMatrixMode(GL_PROJECTION());
121         glLoadIdentity();
122
123         if ( @_ ) {
124                 gluPerspective(45.0,4/3,0.1,100.0);
125         } else {
126                 glFrustum(-0.1,0.1,-0.075,0.075,0.3,100.0);
127         }
128
129         glMatrixMode(GL_MODELVIEW());
130         glLoadIdentity();
131 }
132
133 InitView();
134
135 DrawScene();
136 $app->sync();
137
138 my $event = new SDL::Event;
139
140 for (;;) {
141         for (0 .. 5) {
142                         $event->pump(); 
143                         $event->poll();
144                         exit(0) if ($event->type() == SDL_QUIT());      
145                         if (SDL::GetKeyState(SDLK_SPACE()) == SDL_PRESSED()) {
146                                 $toggle = 0;
147                         } else {
148                                 $toggle = 1;
149                         }
150                         $app->delay($delay);
151                 }
152         DrawScene();
153 }
154