Hi Chris,
thank`s for your help.
I followed the link and downloaded the examples, very use full.
I followed vividsnow's suggestion to update and plot the data with OpenGL and PDL and here is a working example.
Please have look into the script comments are welcome.

best regards, happy for now
Frank

#!/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      = 10000; # time slices;
my $channels =     5; # 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();





On 20.01.2013 00:14, Chris Marshall wrote:
Hi Frank-

Without code I have to guess but my suspicion
is that the difficulty lies in the OpenGL API and
not the perl/PDL.  Here is a link that I found that
seems useful:

   http://www.songho.ca/opengl/gl_vbo.html

Sorry I don't have specific code but most of my
OpenGL has been the 1.x fixed function pipeline
stuff and haven't done much with 2.x and higher.

--Chris

On Sat, Jan 19, 2013 at 4:36 PM, Frank Boers<[email protected]>  wrote:
Dear PDL`s,
thank for your help.
Vividsnow`s code is working perfect. So first step is done.

Now I`m trying to generate a subplot with a few more  sine wave signals to
display.
Unfortunately I could not find out how to update the data in the opengl
vertex buffer to display different signals for each plot window.

I did something like
   $ogl_data->assign_data(0,$vert);
  or
   $ogl_data->assign_data(0,$vert->get_dataref);

but the plots showed only the first signal

So how can I update the opengl vertex buffer with new data?



On 19.01.2013 17:04, David Mertens wrote:

Frank -

Did these posts answer your questions? I did something like this, I think, a
number of years ago and I can look through my old code to find it if you
would like more help.

David


@David: Yes, please  other code and examples will help. It may end up in
some PP code like Craig suggested.

My question is related to visualize time series data from MEG and EEG
recordings with PDL in a very fast way.
(~ 300 channels , ~20 minutes, 1kHz samplingrate, float )

best regards
Frank




On Thu, Jan 17, 2013 at 8:46 AM, Craig DeForest<[email protected]>
wrote:
vividsnow's answer is concise and great, but I'll expand a little bit. You
can access the PDL data
via "get_dataref", which returns a scalar ref whose scalar contains the
data itself.  The data are in
whatever order they happen to be in, which may (or may not) be the usual
first-dimensions-fastest order.
(freshly copy()'ed PDLs are guaranteed to be in that order).  If you want
more control than that I suggest
dropping down to PP or C with PDL::Inline or with XS -- then you can
access the PDL data directly from compiled C.



On Jan 17, 2013, at 3:58 AM, Frank Boers<[email protected]>  wrote:

Dear PDLs,

how can I copy piddels direct to an opengl vertex buffer without
converting the piddel to a perl array?
Please have a look to the example, line 97- 98

best regards
Frank

#!/usr/bin/perl -w

use strict;
use OpenGL qw(:all);

use PDL;

my $pending = 0;
my $t       = pdl(sequence(1000) );
my $data    = pdl( 10 * sin( $t * 10 * 6.28) )->float;

#---------------------------------------------------------#
#---- 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

#---------------------------------------------------------#
#---- update_plot        -------------------------#
#---------------------------------------------------------#
sub update_plot{
my ($x,$y) = @_;

   return if ( $pending );
   $pending = 1;

#---
my $v = pdl( zeroes(2,$data->dim(0) ) )->float();
my $v0 = $v->slice("(0),:");
my $v1 = $v->slice("(1),:");
   $v0.= $t;
my $size= $v->nelem * 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 $verts = OpenGL::Array->new_list(GL_FLOAT,$v->list() );
   $verts->bind($VertexObjID);
   glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $verts, GL_DYNAMIC_DRAW_ARB);

   glVertexPointer_p(2,$verts);

   glEnableClientState(GL_VERTEX_ARRAY);

#--- plot
my $w = glutGet( GLUT_WINDOW_WIDTH );
my $h = glutGet( GLUT_WINDOW_HEIGHT );

my $w0 = 0;
my $w1 = $w-1;

my $h0 = 0;

   setViewport($w0,$w1,$h0,$h);
   setWindow($t->min,$t->max,$data->min,$data->max );

   $v1.= $data;

### !!!! this is slow  for large data
   $verts->assign( 0,$v->list() );

   glBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB,0,$verts);

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

   glDisableClientState(GL_VERTEX_ARRAY);

   glFlush();
   glutSwapBuffers();

  $pending = undef;

} # end of update_plot


#=== 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(@_) } );
glutReshapeFunc( sub{ myReshape(@_) } );

glutMainLoop();














--
Frank Boers
Institute of Neuroscience and Medicine - 4
Medical Imaging Physics
Forschungszentrum Juelich GmbH
52425 Juelich
phone: +49 - (0)2461-61-6005
fax  : +49 - (0)2461-61-2820
email: [email protected]
http://www.fz-juelich.de/inm/inm-4/DE/Forschung/MEG-Physik/_node.html





------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------
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


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



--
  "Debugging is twice as hard as writing the code in the first place.
   Therefore, if you write the code as cleverly as possible, you are,
   by definition, not smart enough to debug it." -- Brian Kernighan


--
Frank Boers
Institute of Neuroscience and Medicine - 4
Medical Imaging Physics
Forschungszentrum Juelich GmbH
52425 Juelich
phone: +49 - (0)2461-61-6005
fax  : +49 - (0)2461-61-2820
email: [email protected]
http://www.fz-juelich.de/inm/inm-4/DE/Forschung/MEG-Physik/_node.html


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


--
Frank Boers
Institute of Neuroscience and Medicine - 4
Medical Imaging Physics
Forschungszentrum Juelich GmbH
52425 Juelich
phone: +49 - (0)2461-61-6005
fax  : +49 - (0)2461-61-2820
email: [email protected]
http://www.fz-juelich.de/inm/inm-4/DE/Forschung/MEG-Physik/_node.html



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

Reply via email to