Hi Paul,
I am the current maintainer for SDL Perl. I noticed you module on
CPAN. I have attached the test scripts updated to the current API of
SDL Perl.
You can get the new Code here:
http://github.com/kthakore/SDL_perl/tree/redesign
This tar-ball is the code that works with you module:
http://github.com/kthakore/SDL_perl/tarball/7801b0fef3cd030246aef98ad894f1af95a8f6e7
We have also improved the documentation here:
http://sdl.perl.org/documentation.html
Please consider joining us on #sdl irc.perl.org or this mailing list.
Kartik Thakore
#!/usr/bin/perl
use strict;
use warnings;
use SDL;
use SDL::OpenGL;
use SDL::Video;
use SDL::OpenGL::Cg qw/:all/;
# Initialise everything.
$|++;
print "A shader will be run which will set the colour of all OpenGL graphics\n";
print "The shader will simply be controlled to change the colour of shapes\n";
print " and then the demonstration will terminate\n";
init_sdl();
open_screen();
init_gl();
init_cg();
# Now keep redrawing the screen.
for (my $scale = 0.0; $scale<1.5; $scale +=0.005) {
draw_scene($scale);
swap_buffers();
SDL::delay(20);
}
# Tidy up after ourselves.
tidy_cg();
print "Shutting down\n";
sub init_sdl {
# Initialise the video part of SDL
if (SDL::init(SDL_INIT_VIDEO())) {
die ("Error: ".SDL::get_error());
}
}
sub open_screen {
# Create a window.
my $depth = 32;
unless (SDL::Video::set_video_mode(800, 600, $depth, SDL_OPENGL)) {
die ("Error: ".SDL::get_error());
}
}
sub init_gl {
# Set up an OpenGL context for us.
SDL::Video::GL_set_attribute (SDL_GL_DOUBLEBUFFER, 1);
SDL::Video::GL_set_attribute (SDL_GL_RED_SIZE, 6);
SDL::Video::GL_set_attribute (SDL_GL_GREEN_SIZE, 6);
SDL::Video::GL_set_attribute(SDL_GL_BLUE_SIZE, 6);
glClearColor (0,0,0,0);
glViewport(0,0,800,600);
glMatrixMode(GL_PROJECTION);
glFrustum(-0.1,0.1,-0.075,0.075,0.175,100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
# Swap buffers so we have a clear screen.
swap_buffers();
}
{
my $context;
my $vertex_program;
my $profile;
my $color_param;
my $modelview_param;
sub init_cg {
# Since this is being developed partly on Radeon9000 the
# ARBVP1 profile is the only one supported. Use it for
# this demo.
$profile = CG_PROFILE_ARBVP1();
unless (cgIsProfileSupported($profile)) {
die ("ARBVP1 is not available");
}
unless (cgEnableProfile($profile)) {
die ("Cannot enable ARBVP1: ".SDL::OpenGL::GetErrorString());
}
# Create the CG Context object we'll be attaching programs
# to.
$context = cgCreateContext();
# Compile the vertex shader program from a file.
my $file = '../shaders/vertex/anycolor.cg';
$vertex_program = cgCreateProgramFromFile(
$context,CG_SOURCE(),$file,CG_PROFILE_ARBVP1,'main',undef);
unless ($vertex_program) {
die ("Error: ".cgGetErrorString());
}
# Now load the program onto the GPU, and make it the active
# shader.
unless (cgLoadProgram($vertex_program)) {
die ("Error: ".cgGetErrorString());
}
unless (cgBindProgram($vertex_program)) {
die ("Error: ".cgGetErrorString());
}
# The shader has a parameter, 'constantColor' which is a
# float4 which indicates which colour to shade everything.
$color_param = cgGetNamedParameter($vertex_program,'constantColor');
unless ($color_param) {
die ("Error: ".cgGetErrorString());
}
# The shader has a parameter 'modelViewProj' which is a float4x4
# indicating the current modelview.
$modelview_param = cgGetNamedParameter($vertex_program, 'modelViewProj');
unless ($modelview_param) {
die ("Error: ".cgGetErrorString());
}
}
sub set_color {
my ($r,$g,$b,$a) = @_;
cgSetParameter($color_param,$r,$g,$b,$a);
}
sub update_modelview {
cgSetStateMatrixParameter($modelview_param,
CG_MODELVIEW_PROJECTION_MATRIX(),
CG_MATRIX_IDENTITY()) or die ("Error: ",cgGetErrorString(),"\n");
}
sub tidy_cg {
cgDestroyContext($context);
cgDisableProfile($profile);
}
}
sub draw_scene {
my $scale = shift || 1.0;
set_color($scale,1-$scale,($scale*2)%1,1);
glLoadIdentity();
glTranslate(-1.5,0,-6);
update_modelview();
glBegin(GL_TRIANGLES());
glVertex(0,1,0);
glVertex(-1,-1,0);
glVertex(1,-1,0);
glEnd();
glTranslate(3,0,0);
update_modelview();
glBegin(GL_QUADS());
glVertex(-1,1,0);
glVertex(1,1,0);
glVertex(1,-1,0);
glVertex(-1,-1,0);
glEnd();
glFlush();
}
sub swap_buffers {
SDL::Video::GL_swap_buffers();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
#!/usr/bin/perl
use strict;
use warnings;
use SDL::OpenGL::Cg qw/:all/;
use SDL::OpenGL;
use SDL;
use SDL::Events;
use SDL::Event;
use SDL::OpenGL;
use SDL::App;
# mydump();
my $app = new SDL::App ( -w => 800, -h => 600, -d => 16, -gl => 1 );
# Init SDL
SDL::init (SDL_INIT_VIDEO())==0 or die "Cannot init SDL";
$app->sync();
glViewport(0,0,800,600);
glMatrixMode(GL_PROJECTION());
glLoadIdentity();
glFrustum(-0.1, 0.1, -0.075, 0.075, 0.175, 100.0);
glShadeModel(GL_SMOOTH());
glClearDepth(1);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glClear(GL_COLOR_BUFFER_BIT() | GL_DEPTH_BUFFER_BIT());
glMatrixMode(GL_MODELVIEW());
glLoadIdentity();
# Activate the shader.
my $cg = SDL::OpenGL::Cg->new();
list_supported_profiles();
my $vertex_profile = activate_vertex_profile();
my $cg_context = cgCreateContext();
$cg_context or die "Cannot create context\n";
my $file = '../shaders/vertex/xyplot.cg';
my $vertex_program =
cgCreateProgramFromFile($cg_context, CG_SOURCE(),
$file, $vertex_profile, 'main', undef);
$vertex_program or die "Cannot load program from file ".cgGetError()."\n";
cgLoadProgram($vertex_program) or die "Cannot load program onto GPU\n";
cgBindProgram($vertex_program);
# Grab the modelview parameter so the shader can be controlled.
my $modelview_param = cgGetNamedParameter($vertex_program, 'modelViewProj');
$modelview_param or die "Cannot get modelViewProj param\n";
my $event = new SDL::Event;
my $rotx = 0;
my $roty = 0;
redraw($rotx, $roty);
$app->sync();
print "Controls\n";
print " Arrow keys rotate cube\n";
print " Escape quits\n";
$app->loop({
SDL_QUIT() => sub {
cgDestroyContext($cg_context);
cgDisableProfile($vertex_profile);
exit (0)
},
SDL_KEYDOWN() => sub {
my ($event) = @_;
my $keysym = $event->key_sym();
if ($keysym == SDLK_ESCAPE) {
cgDestroyContext($cg_context);
cgDisableProfile($vertex_profile);
exit(0);
} elsif ($keysym == SDLK_UP) {
redraw($rotx-=5,$roty);
$app->sync();
} elsif ($keysym == SDLK_DOWN) {
redraw($rotx+=5,$roty);
$app->sync();
} elsif ($keysym == SDLK_RIGHT) {
redraw($rotx, $roty+=5);
$app->sync();
} elsif ($keysym == SDLK_LEFT) {
redraw($rotx, $roty-=5);
$app->sync();
}
},
});
sub redraw {
my ($rotx,$roty) = @_;
glClear (GL_DEPTH_BUFFER_BIT() | GL_COLOR_BUFFER_BIT());
glLoadIdentity();
glTranslate(0,0,-6);
glRotate($rotx, 1,0,0);
glRotate($roty, 0,1,0);
glColor (1,1,1);
my @verts = (
[ -1,1,1], [1,1,1], [-1,-1,1], [1,-1,1],
[ -1,1,-1], [1,1,-1], [-1,-1,-1], [1,-1,-1],
);
# Update the shader's modelview to the current OpenGL view.
cgSetStateMatrixParameter($modelview_param,
CG_MODELVIEW_PROJECTION_MATRIX(), CG_MATRIX_IDENTITY())
or die "Cannot set modelViewProj parameter to OpenGL's\n";
glBegin (GL_QUADS);
glNormal(0,0,1);
glVertex(@{$verts[0]});
glVertex(@{$verts[1]});
glVertex(@{$verts[3]});
glVertex(@{$verts[2]});
glNormal(1,0,0);
glVertex(@{$verts[3]});
glVertex(@{$verts[1]});
glVertex(@{$verts[5]});
glVertex(@{$verts[7]});
glNormal(0,1,0);
glVertex(@{$verts[0]});
glVertex(@{$verts[1]});
glVertex(@{$verts[5]});
glVertex(@{$verts[4]});
glNormal(-1,0,0);
glVertex(@{$verts[2]});
glVertex(@{$verts[0]});
glVertex(@{$verts[4]});
glVertex(@{$verts[6]});
glNormal(0,-1,0);
glVertex(@{$verts[2]});
glVertex(@{$verts[3]});
glVertex(@{$verts[7]});
glVertex(@{$verts[6]});
glNormal(0,0,-1);
glVertex(@{$verts[4]});
glVertex(@{$verts[5]});
glVertex(@{$verts[7]});
glVertex(@{$verts[6]});
glEnd();
}
sub list_supported_profiles {
print "Fragment profiles\n";
print " ARBFP1 : ",
cgIsProfileSupported(CG_PROFILE_ARBFP1()) ? "Yes\n" : "No\n";
print " FP20 : ",
cgIsProfileSupported(CG_PROFILE_FP20()) ? "Yes\n" : "No\n";
print " FP20 : ",
cgIsProfileSupported(CG_PROFILE_FP30()) ? "Yes\n" : "No\n";
print "Vertex profiles\n";
print " ARBVP1 : ",
cgIsProfileSupported(CG_PROFILE_ARBVP1()) ? "Yes\n" : "No\n";
print " VP20 : ",
cgIsProfileSupported(CG_PROFILE_VP20()) ? "Yes\n" : "No\n";
print " VP30 : ",
cgIsProfileSupported(CG_PROFILE_VP30()) ? "Yes\n" : "No\n";
}
sub activate_vertex_profile {
my @profiles = (CG_PROFILE_ARBVP1(), CG_PROFILE_VP20(), CG_PROFILE_VP30());
foreach my $profile (@profiles) {
if (cgIsProfileSupported($profile)) {
print "Activating ",cgGetProfileString($profile),"\n";
unless (cgEnableProfile($profile)) {
die "Error activating profile ",cgGetError(),"\n";
}
return $profile;
} else {
print cgGetProfileString($profile), " not supported, skipping\n";
}
}
die "No vertex profiles supported\n";
}