#!/usr/bin/perl
use warnings;
use strict;
use SDL;
use SDLx::App;
use SDL::Surface;
use SDL::Event;
use SDL::Image;
use SDL::Color;
use Data::Dumper;
use OpenGL qw(:all);
my $app; #sdl window
my $sdl_timer;
my $event;
package main;
init_SDL();
while (1) {
pump_sdl();
}
###################################################
sub init_SDL {
$app = SDLx::App->new( w => 1024, h => 768, d => 16, gl => 1 );
print "Initializing OpenGL settings\n";
printf "%-24s%s\n", "GL_RED_SIZE ", $app->attribute( SDL_GL_RED_SIZE() );
printf "%-24s%s\n", "GL_GREEN_SIZE ", $app->attribute( SDL_GL_GREEN_SIZE() );
printf "%-24s%s\n", "GL_BLUE_SIZE ", $app->attribute( SDL_GL_BLUE_SIZE() );
printf "%-24s%s\n", "GL_DEPTH_SIZE ", $app->attribute( SDL_GL_DEPTH_SIZE() );
printf "%-24s%s\n", "GL_DOUBLEBUFFER ", $app->attribute( SDL_GL_DOUBLEBUFFER() );
#glEnable(GL_CULL_FACE);
#glFrontFace(GL_CCW);
#glCullFace(GL_BACK);
InitView();
DrawScene();
$app->sync();
$event = new SDL::Event;
}
#######################################################
sub pump_sdl {
SDL::Events::pump_events();
while ( SDL::Events::poll_event($event) ) {
my $type = $event->type(); # get event type
exit if $type == SDL_QUIT;
}
DrawScene();
return 1;
}
#######################################################
sub DrawScene {
glClear( GL_DEPTH_BUFFER_BIT() | GL_COLOR_BUFFER_BIT() );
glLoadIdentity();
glTranslatef( 0, 0, -6.0 );
glColor3d( 1, 1, 1 );
glBegin(GL_QUADS);
glTexCoord2f( 0.0, 0.0 );
glVertex3f( -1.0, 1.0, 0 );
glTexCoord2f( 1.0, 0.0 );
glVertex3f( 1.0, 1.0, 0 );
glTexCoord2f( 1.0, 1.0 );
glVertex3f( 1.0, -1.0, 0 );
glTexCoord2f( 0.0, 1.0 );
glVertex3f( -1.0, -1.0, 0 );
glEnd();
$app->sync();
}
sub InitView {
my $width = 1024;
my $height = 800;
glClearColor( 0.0, 0.0, 0.0, 0.0 );
glShadeModel(GL_SMOOTH);
glClearDepth(1.0);
glDisable(GL_DEPTH_TEST);
glBlendFunc( GL_SRC_ALPHA, GL_ONE );
glEnable(GL_BLEND);
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
glEnable(GL_TEXTURE_2D);
LoadTexture();
glViewport( 0, 0, 1024, 768 );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 45.0, $width / $height, 1.0, 100.0 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
sub LoadTexture {
my $surface;
my $nOfColors;
my $texture_format;
my $texture = 0;
my $img = $ARGV[0] || 'test/data/picture.bmp';
$surface = SDL::Image::load( $img );
die "Couldn't load image: ".SDL::get_error() unless $surface;
SDL::Video::lock_surface($surface);
#get the number of channels in the SDL surface
$nOfColors = $surface->format->BytesPerPixel;
if ( $nOfColors == 4 ) # contains an alpha channel
{
if ( $surface->format->Rmask == 0x000000ff ) {
$texture_format = GL_RGBA;
} else {
$texture_format = GL_BGRA;
}
} elsif ( $nOfColors == 3 ) # no alpha channel
{
if ( $surface->format->Rmask == 0x000000ff ) {
$texture_format = GL_RGB;
} else {
$texture_format = GL_BGR;
}
} else {
print "warning: the image is not truecolor.. this will
probably break\n";
}
# Have OpenGL generate a texture object handle for us
glGenTextures_p(1);
# Bind the texture object
glBindTexture( GL_TEXTURE_2D, 1 );
#Set the texture's stretching properties
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
# Edit the texture object's image data using the information SDL_Surface gives us
gluBuild2DMipmaps_s( GL_TEXTURE_2D, $surface->format->BytesPerPixel,
$surface->w, $surface->h, $texture_format, GL_UNSIGNED_BYTE,
${ $surface->get_pixels_ptr }
);
}