Dear David,
sorry there were some problems in converting and sending the script via
email. It is running on my notebook and I m happy with the performance.
Please do not reactivate your toasted hard drive for me.

Here is another try to send the code without formatting errors:

#!/usr/bin/perl -w

use strict;
use OpenGL qw(:all);

use PDL;
use PDL::Constants qw(PI);
    $PDL::BIGPDL = 1;

my $pending = 0;

#--- init demo data
my $tsl      = 60000; # time slices;
my $channels =  10; # channels to plot

my $time_points  = pdl( sequence( $tsl ) /1000 )->float();
my $f0   = 2; # Hz
my $data = pdl( zeroes($channels,$time_points->dim(-1) ) )->float();

   print"---> START init demo data\n";
   print"     Channels: $channels\n";
   print"     TSLs    : $tsl\n";

my $t00 = time;

my $f    = pdl( sequence($channels) ) +1 * $f0;
 # $data.= (sin( $time_points * $f->transpose *2* PI) )->transpose;
   $data.= (sin( $time_points * $f->transpose * PI) + cos( $time_points
*  $f->transpose * rand(100) * PI ) )->transpose;

   $t00 = time() - $t00;
   print"---> DONE init demo data: $t00\n";


#---------------------------------------------------------#
#---- update_plot_pdl_to_vbo     -------------------------#
#---  copy pdl data to opengl vertex buffer
#---  generates a sub plot for each channel
#---------------------------------------------------------#
sub update_plot_pdl_to_vbo{
my ($x,$y) = @_;

   return if ( $pending );
   $pending = 1;
my $t00 = time;

#--- init data for vertex buffer obj
my $data_4_vbo             = pdl( zeroes(2,$data->dim(-1) ) )->float();
my $data_4_vbo_timepoints  = $data_4_vbo->slice("(0),:");
my $data_4_vbo_signal      = $data_4_vbo->slice("(1),:");
   $data_4_vbo_timepoints .= $time_points;
my $data_vbo               = $data_4_vbo->flat;

my $float_size = 4;

   glClear(GL_COLOR_BUFFER_BIT);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glColor3f(0.0,0.0,1.0);

#--- create OGL verts buffer
   glDisableClientState(GL_VERTEX_ARRAY);

my $VertexObjID = glGenBuffersARB_p(1);
   glBindBufferARB(GL_ARRAY_BUFFER_ARB,$VertexObjID);

my $ogl_array = OpenGL::Array->new_scalar(GL_FLOAT,
$data_vbo->get_dataref,$data_vbo->dim(0)*$float_size);
   glBufferDataARB_p(GL_ARRAY_BUFFER_ARB,$ogl_array,GL_DYNAMIC_DRAW_ARB);
   $ogl_array->bind($VertexObjID);
   glVertexPointer_p(2,$ogl_array);
   glEnableClientState(GL_VERTEX_ARRAY);

#---start sub plots
my $w = glutGet( GLUT_WINDOW_WIDTH );
my $h = glutGet( GLUT_WINDOW_HEIGHT );

my $w0 = 10;
my $w1 = $w-10;

my $h0 = 0;
my $dh = int( $h / $data->dim(0) );
my $h1 = $dh;

my $xmin = $time_points->min;
my $xmax = $time_points->max;
my $ymin = $data->min * 1.2;
my $ymax = $data->max * 1.2;


#--- copy data to VBO
   for ( my $i=0; $i < $data->dim(0); $i++ )
    {

#--- sub plot window
      setViewport($w0,$w1,$h0,$h1);
      setWindow($xmin,$xmax,$ymin,$ymax );

#--- draw zero line
      glLineWidth(1);
      glColor3f(1,1,1);

      glBegin(GL_LINES);
        glVertex2f($xmin,0.0);
        glVertex2f($xmax,0.0);
      glEnd();

#--- start drawing signal
      glLineWidth(2);
      glColor3f(rand(1), rand(1),1.0);# mix color for each signal

#--- copy pdl data to VBO thank's vividsnow !!!
      $data_4_vbo_signal .= $data->slice("($i),:");
      $ogl_array =
OpenGL::Array->new_scalar(GL_FLOAT,$data_vbo->get_dataref,$data_vbo->dim(0)*$float_size);

      glBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB,0,$ogl_array);

      glDrawArrays(GL_LINE_STRIP,0,$data_4_vbo_timepoints->dim(-1)-1 );

      $h0 += $dh;
      $h1 += $dh + 1;

     } # for

  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  glDisableClientState(GL_VERTEX_ARRAY);

  glFlush();
  glutSwapBuffers();

  $pending = undef;

  $t00 = time() - $t00;

  print" done  <update_plot_pdl_to_vbo> Time to update: $t00\n";

} # end of update_plot_pdl_to_vbo


#---------------------------------------------------------#
#---- setWindow                  -------------------------#
#---------------------------------------------------------#
sub setWindow{
my ($l,$r,$b,$t) = @_;
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D($l,$r,$b,$t);
} # end of setWindow

#---------------------------------------------------------#
#---- setViewport                -------------------------#
#---------------------------------------------------------#
sub setViewport{
my ($l,$r,$b,$t) = @_;
 glViewport($l,$b,$r-$l,$t-$b);
}# end of setViewport

#---------------------------------------------------------#
#---- myReshape                  -------------------------#
#---------------------------------------------------------#
sub myReshape{

my($w,$h) = @_;

return if (  $pending );

glViewport(0,0,$w,$h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,$w,0.0,$h);

} # end of reshape


#=== MAIN ===============================================
glClearColor(1.0,1.0,1.0,0.0);
glColor3f(0.0,0.0,1.0);
glLineWidth(2);

glutInit();

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_ALPHA);

glutInitWindowSize(300,400);
glutInitWindowPosition(10,10);

my $IDwindow = glutCreateWindow("PDL OGL TEST");
glutDisplayFunc( sub{ update_plot_pdl_to_vbo(@_) } );

glutReshapeFunc( sub{ myReshape(@_) } );

glutMainLoop();


> Message: 1
> Date: Mon, 21 Jan 2013 21:53:49 -0600
> From: David Mertens<[email protected]>
> To: Frank Boers<[email protected]>
> Cc: Chris Marshall<[email protected]>, perldl
>     <[email protected]>
> Subject: Re: [Perldl] copy piddels to opengl vertex buffer
> Message-ID:
>     <ca+4ieyuby4quf7ga_h3syuu7cdxfmz0icwzmkfnear8cw0m...@mail.gmail.com>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Frank, err... Chris, err... This is going to be a mixed email.
>
> 1) Frank, it sounds like everything works. Is this correct? In that case,
> if I can get away without digging out my code, I'd prefer not to. I
believe
> that the GL program that I wrote only really displayed a 2d raster image,
> so I'm not sure how useful it would be to you. Couple that with the fact
> that said code may not even be on any of my current drives (I
accidentally
> but literally toasted a hard drive shortly after writing my GL program),
> and I think I'd prefer not to root around for it up unless you think you
> really need it.
>
> 2) To any POGL devs reading along, Frank's script segfaults on my
machine.
> I'm pretty sure Perl library's aren't supposed to segfault on user data
> unless the user is using Inline. Shall we start a separate thread and
> chase down this bug?
>
> David
>
>
> On Mon, Jan 21, 2013 at 6:36 AM, Frank Boers<[email protected]>
wrote:
>





------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------
Forschungszentrum Juelich GmbH
52425 Juelich
Sitz der Gesellschaft: Juelich
Eingetragen im Handelsregister des Amtsgerichts Dueren Nr. HR B 3498
Vorsitzender des Aufsichtsrats: MinDir Dr. Karl Eugen Huthmacher
Geschaeftsfuehrung: Prof. Dr. Achim Bachem (Vorsitzender),
Karsten Beneke (stellv. Vorsitzender), Prof. Dr.-Ing. Harald Bolt,
Prof. Dr. Sebastian M. Schmidt
------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------

_______________________________________________
Perldl mailing list
[email protected]
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to