#!/usr/bin/perl -w use strict; # Sample/Test app for OpenGL::Array functions # by Bob "grafman" Free # http://graphcomp.com/opengl use OpenGL qw/ :all /; #use OpenGL::Image; #use OpenGL::Shader; use Time::HiRes qw( gettimeofday ); use constant PROGRAM_TITLE => "OpenGL::ARRAY Test App"; # Window vars my $Window_ID; # Vertex Buffer Object data my($VertexObjID); my @verts = ( -1.0, -1.3, -1.0, 1.0, -1.3, -1.0, 1.0, -1.3, 1.0, -1.0, -1.3, 1.0, -1.0, 1.3, -1.0, -1.0, 1.3, 1.0, 1.0, 1.3, 1.0, 1.0, 1.3, -1.0, -1.0, -1.0, -1.3, -1.0, 1.0, -1.3, 1.0, 1.0, -1.3, 1.0, -1.0, -1.3, 1.3, -1.0, -1.0, 1.3, 1.0, -1.0, 1.3, 1.0, 1.0, 1.3, -1.0, 1.0, -1.0, -1.0, 1.3, 1.0, -1.0, 1.3, 1.0, 1.0, 1.3, -1.0, 1.0, 1.3, -1.3, -1.0, -1.0, -1.3, -1.0, 1.0, -1.3, 1.0, 1.0, -1.3, 1.0, -1.0 ); @verts = ( 0.0, 0.1, 0.2, 1.0, 1.1, 1.2, 2.0, 2.1, 2.2, 3.0, 3.1, 3.2, 10.0, 10.1, 10.2, 11.0, 11.1, 11.2, 12.0, 12.1, 12.2, 13.0, 13.1, 13.2, 20.0, 20.1, 20.2, 21.0, 21.1, 21.2, 22.0, 22.1, 22.2, 13.0, 23.1, 23.2, 30.0, 30.1, 30.2, 31.0, 31.1, 31.2, 32.0, 32.1, 32.2, 33.0, 33.1, 33.2, 40.0, 40.1, 40.2, 41.0, 41.1, 41.2, 42.0, 42.1, 42.2, 43.0, 43.1, 43.2, 50.0, 50.1, 50.2, 51.0, 51.1, 51.2, 52.0, 52.1, 52.2, 53.0, 53.1, 53.2 ); my @xform = ( 1.0, 0.0, 0.0, 1.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 1.0 ); my $xform = OpenGL::Array->new_list(GL_FLOAT,@xform); # ------ # The main() function. Inits OpenGL. Calls our own init function, # then passes control onto OpenGL. glutInit(); # To see OpenGL drawing, take out the GLUT_DOUBLE request. glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); glutInitWindowSize(1,1); # Open a window $Window_ID = glutCreateWindow( PROGRAM_TITLE ); glutHideWindow(); # Test for GPGPU support print "Has GPGPU Support: ".OpenGL::glpHasGPGPU()."\n"; # Tests my $loops = 2; my $vertices = 4; my $print_verts = $vertices < 5; my($i,$start,$secs); print "Initial data:\n"; print "Loops: $loops, Vertices: $vertices\n"; my $verts = init_verts($vertices); print_verts($verts,$vertices) if ($print_verts); $start = gettimeofday(); for ($i=0;$i<$loops;$i++) { $verts->calc('1,+','3,*','2,*,1,+'); } $secs = (gettimeofday()-$start)/$loops; my $vps_calc = int($vertices/$secs); print "Calc VPS: $vps_calc\n"; print_verts($verts,$vertices) if ($print_verts); $verts = init_verts($vertices); $start = gettimeofday(); for ($i=0;$i<$loops;$i++) { $verts->affine($xform); } $secs = (gettimeofday()-$start)/$loops; my $vps_gpu = int($vertices/$secs); print "Affine VPS: $vps_gpu\n"; print_verts($verts,$vertices) if ($print_verts); # Destroy window glutDestroyWindow($Window_ID); exit 0; sub init_verts { my($count) = @_; my @verts = (); for (my $i=0;$i<$count;$i++) { push(@verts,"$i.0","$i.1","$i.2"); } my $verts = OpenGL::Array->new_list(GL_FLOAT,@verts); die "new_list failed to return an OGA\n" if (!$verts); return $verts; } sub print_verts { my($verts,$vertices) = @_; my $len = $vertices * 3; for(my $i=0;$i<$len;$i+=3) { my($x,$y,$z) = $verts->retrieve($i,3); printf("%8.3f,%8.3f,%8.3f\n",$x,$y,$z); } print "\n"; } __END__