SDL-OpenGL-Cg-0.01 test scripts update to new API

[email protected] (Kartik Thakore)
Newsgroups perl.sdl.devel
Message-ID <[email protected]>
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
nonapp-test.pl (text/plain, 4 KB)
#!/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);
}
app-test.pl (text/plain, 4.7 KB)
#!/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";
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.