From: peter <my....@gm...> - 2009-07-16 13:42:08
|
Hi here is an example using the new Win32-GUI-OpenGLFrame , it is displaying either a rotating triangle or a rotating cube when you click an appropriate button. yes thanks , i am sure this addition will be used heavily when the people know about it. here is the downloadable example: http://rapidshare.com/files/256462790/cube_Triangle.pl #!perl -w use strict; use warnings; use Win32::GUI qw(WS_CLIPCHILDREN); use Win32::GUI::OpenGLFrame qw(w32gSwapBuffers); use OpenGL qw(:all); my $spin = 0.0; my $toggle = 0; my $xrot = 0; my $yrot = 0; my $rtri = 0.0; my $rtcube = 0.0; my $objectXRot = 0.0; my $objectYRot = 0.0; my $objectZRot = 0.0; my $flag = 1; my $mw = Win32::GUI::Window->new( -title => "OpenGL Demonstration", -pos => [0,0], -size => [640,480], -pushstyle => WS_CLIPCHILDREN, # stop flickering on resize -onResize => \&mainWinResize, ); my $glw = $mw->AddOpenGLFrame( -name => 'oglwin', -width => $mw->ScaleWidth(), -height => $mw->ScaleHeight() - 50, -display => \&display, -init => \&Init, -reshape => \&reshape, -doubleBuffer => 1, ); $mw->AddButton( -name => 'button1', -text => 'Triangle', -left => $mw->ScaleWidth()-100, -top => $mw->ScaleHeight()-30, #-onClick => sub{-1}, ); $mw->AddButton( -name => 'button2', -text => 'Cube', -left => $mw->ScaleWidth()-140, -top => $mw->ScaleHeight()-30, #-onClick => sub{-1}, ); $mw->Show(); while(Win32::GUI::DoEvents() != -1) { $mw->oglwin->InvalidateRect(0); } #Win32::GUI::Dialog(); $mw->Hide(); exit(0); sub mainWinResize { my $win = shift; $win->oglwin->Resize($win->ScaleWidth(), $win->ScaleHeight()-50); $win->button1->Move($win->ScaleWidth()-100, $win->ScaleHeight()-30); $win->button2->Move($win->ScaleWidth()-160, $win->ScaleHeight()-30); return 0; } sub reshape { my ($w, $h) = @_; glViewport(0, 0, $w, $h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); # define the projection gluPerspective(45.0, $h ? $w/$h : 0, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); return 0; } sub Init { glShadeModel(GL_SMOOTH); glClearColor(0, 0, 0, 0); glClearDepth(1); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return 1; } sub display { glPushMatrix(); #save current matrix if ($flag == 1){DrawTriangle();} #draw triangle elsif ($flag == 2){DrawCube();}; #draw cube glPopMatrix(); #restore matrix glFlush(); w32gSwapBuffers(); return 1; } sub DrawTriangle { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0, 0.0, -6.0); glRotatef($rtri, 0, 1, 0); my $size = 1; glScalef($size,$size,$size); glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 1.0, 0.0); glColor3f(0.0, 1.0, 0.0); glVertex3f(-1.0, -1.0, 0.0); glColor3f(0.0, 0.0, 1.0); glVertex3f(1.0, -1.0, 0.0); glEnd(); $rtri += 2; } sub DrawCube { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); my $size = 1; glTranslatef(0.0, 0.0, -6.0); glRotatef($objectXRot, 1.0, 0.0, 0.0); glRotatef($objectYRot, 0.0, 1.0, 0.0); glRotatef($objectZRot, 0.0, 0.0, 1.0); glScalef($size,$size,$size); glBegin(GL_QUADS); # bottom face glColor3f(0.0,0.0,0.0); #black glVertex3f(-1.0,-1.0,-1.0); glColor3f(1.0,0.0,0.0); #red glVertex3f(1.0,-1.0,-1.0); glColor3f(1.0,0.0,1.0); #magenta glVertex3f(1.0,-1.0,1.0); glColor3f(0.0,0.0,1.0); #blue glVertex3f(-1.0,-1.0,1.0); # front face glColor3f(0.0,0.0,0.0); #black glVertex3f(-1.0,-1.0,-1.0); glColor3f(0.0,1.0,0.0); #green glVertex3f(-1.0,1.0,-1.0); glColor3f(1.0,1.0,0.0); #yellow glVertex3f(1.0,1.0,-1.0); glColor3f(1.0,0.0,0.0); #red glVertex3f(1.0,-1.0,-1.0); # right face glColor3f(0.0,0.0,0.0); #black glVertex3f(-1.0, -1.0, -1.0); glColor3f(0.0,0.0,1.0); #blue glVertex3f(-1.0,-1.0,1.0); glColor3f(0.0,1.0,1.0); #cyan glVertex3f(-1.0,1.0,1.0); glColor3f(0.0,1.0,0.0); #green glVertex3f(-1.0,1.0,-1.0); # left face glColor3f(1.0,1.0,1.0); #white glVertex3f(1.0,1.0,1.0); glColor3f(1.0,0.0,1.0); #magenta glVertex3f(1.0,-1.0,1.0); glColor3f(1.0,0.0,0.0); #red glVertex3f(1.0,-1.0,-1.0); glColor3f(1.0,1.0,0.0); #yellow glVertex3f(1.0,1.0,-1.0); # top face glColor3f(1.0,1.0,1.0); #white glVertex3f(1.0,1.0,1.0); glColor3f(1.0,1.0,0.0); #yelllow glVertex3f(1.0,1.0,-1.0); glColor3f(0.0,1.0,0.0); #green glVertex3f(-1.0,1.0,-1.0); glColor3f(0.0,1.0,1.0); #cyan glVertex3f(-1.0,1.0,1.0); # back face glColor3f(1.0,1.0,1.0); #white glVertex3f(1.0,1.0,1.0); glColor3f(0.0,1.0,1.0); #cyan glVertex3f(-1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); #blue glVertex3f(-1.0,-1.0,1.0); glColor3f(1.0,0.0,1.0); #magenta glVertex3f(1.0,-1.0,1.0); glEnd(); $objectXRot += 0.5; $objectYRot += 0.5; $objectZRot += 0.5; } sub button1_Click { $flag = 1; } sub button2_Click { $flag = 2; } |