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