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

Reply via email to