Hi
here is another fun example on using the Win32-GUI-OpenGLFrame-0.02
attached a file demostrate the new package capabilities, it is drawing a
moving spider, a sea monster, a cube and a triangle, every one entity
appears upon clicking it's own button, there is a slider to speed the
movement of the spider. here is a picture showing the program:
http://img34.imageshack.us/img34/3226/win32guiopengl.jpg
you can download the program perl script from here:
http://rapidshare.com/files/278504269/Win32-GUI-OpenGLFrame.pl
you can install opengl for windows for active state perl 5.10 from here:
http://www.bribes.org/perl/ppmdir.html
and for installation:
ppm install http://www.bribes.org/perl/ppm/OpenGL.ppd
the opengl code in the example in not the optimal one , you can recode it
in a thousand way, and it needs many corrections, but it is usefull and fun
, i hope the math and science teachers to see that the design can have many
3D figures for the benefits of the students, also the biology teachers can
design all sorts of moving insects , creatures ... .
i hope if rob may can provide a ppm for the Win32-GUI-OpenGLFrame-0.02 ,
since it is until now not available on activestate or the other ppm
providers sites ,and this is much more convenient to install for the most
windows users.
regards
peter
#!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 $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 = 3;
our $rot=0;
our $speed = 0.1;
our $spinSpeed = 0.1;
my $mw = Win32::GUI::Window->new(
-title => "Win32-GUI-OpenGLFrame-0.02 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,
);
my $s1 = $mw->AddSlider (
-width => 300,
-height => 40,
-top => $mw->ScaleHeight()-30,
-left => 10,
-onScroll => \&slider,
);
$s1->Pos(10);
$mw->AddLabel(
-text => "monster speed",
-name => "Label_1",
-left => 75,
-top => $mw->ScaleHeight()-45,
-width => 79,
-height => 19,
-foreground => 0,
);
$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,
);
$mw->AddButton(
-name => 'button3',
-text => 'Spider',
-left => $mw->ScaleWidth()-300,
-top => $mw->ScaleHeight()-30,
);
$mw->AddButton(
-name => 'button4',
-text => 'sea monster',
-left => $mw->ScaleWidth()-245,
-top => $mw->ScaleHeight()-30,
);
$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);
glEnable(GL_DEPTH_TEST);
#glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);
return 1;
}
sub display {
glPushMatrix(); #save current matrix
if ($flag == 1){
glDisable(GL_LIGHTING );DrawTriangle();} #draw triangle
elsif ($flag == 2){
glDisable(GL_LIGHTING );DrawCube();}; #draw cube
if ($flag == 3)
{
glEnable(GL_LIGHTING);
spider();
} #draw spider
elsif ($flag == 4){ glEnable(GL_LIGHTING);
Sea_Monster();
}
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 spider {
my $i=0;
my @light0_position = (2.0, -5.0, 4.0, 0.0);
my @mat_specular = (1.0, 1.0, 1.0, 1.0);
my @mat_shininess = (50.0);
my @mat_amb_diff_color = (1.0, 0.5, 0.0, 0.5);
my @mat_amb_diff_color2 = (1.0, 1.0, 0.0, 0.5);
my @light_diffuse = (1.0, 1.0, 1.0, 1.0);
my @light_ambient = (0.15, 0.15, 0.15, 0.15);
my @light_specular = (1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv_p(GL_LIGHT0, GL_POSITION, @light0_position);
glLightfv_p(GL_LIGHT0, GL_DIFFUSE, @light_diffuse);
glLightfv_p(GL_LIGHT0, GL_AMBIENT, @light_ambient);
glLightfv_p(GL_LIGHT0, GL_SPECULAR, @light_specular);
glLoadIdentity();
gluLookAt(0.0, 3.0, -10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
$spin += $spinSpeed;
$spin = $spin - 360.0 if ($spin >360.0);
glRotatef($spin, 0.0, 1.0, 0.0);
$rot=$rot+$speed; # the frequency of the legs movement
my $quad = OpenGL::gluNewQuadric();
glMaterialfv_p(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
@mat_amb_diff_color2);
gluQuadricDrawStyle($quad, GLU_FILL);
glPushMatrix();
glTranslatef(-0.5, 1.5, -4.0);#to rotate the spider around a circle
glRotatef( $spin, 0.0, 1.0, 0.0 );#........................
glPushMatrix();
glTranslatef(0.0, 0.5, 0.0);
gluSphere( $quad , 0.8 , 20 , 20 );
glPopMatrix();
glMaterialfv_p(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @mat_amb_diff_color);
#drawing 8 Legs, every Leg has 3 parts:
for ($i = 0; $i<=359; $i=$i+45)
{
#drawing Leg's part 1:
glPushMatrix();
glRotatef( $i, 0.0, 1.0, 0.0 );
glRotatef( 0+sin($rot+$i)*20, 0.0, 1.0, 0.0 );
glPushMatrix();
glRotatef(-90, 0.0, 1.0, 0.0);
gluQuadricDrawStyle($quad, GLU_FILL);
gluQuadricOrientation($quad, GLU_INSIDE);
#Other draw steel choises below:
#gluQuadricDrawStyle($quad, GLU_POINT);
#gluQuadricDrawStyle($quad, GLU_SILHOUETTE);
#gluQuadricDrawStyle($quad, GLU_FILL);
#gluQuadricDrawStyle($quad, GLU_LINE);
gluCylinder($quad, 0.2, 0.15, 2, 16, 10);
glPopMatrix();
#drawing a smaller Leg's part 2:
glTranslatef(-2.0, 0.0, 0.0);
glRotatef(30, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(-90, 0.0, 1.0, 0.0);
gluCylinder($quad, 0.15, 0.1, 1.5, 16, 10);
glPopMatrix();
#drawing the smallest Leg's part 3:
glTranslatef(-1.5, 0.0, 0.0);
glRotatef(30, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(-90, 0.0, 1.0, 0.0);
gluCylinder($quad, 0.1, 0.05, 1.0, 16, 10);
glPopMatrix();
glPopMatrix();
}
glPopMatrix();
}
sub Sea_Monster {
my $i=0;
my @light0_position = (2.0, -5.0, 4.0, 0.0);
my @mat_specular = (1.0, 1.0, 1.0, 1.0);
my @mat_shininess = (50.0);
my @mat_amb_diff_color = (1.0, 0.5, 0.0, 0.5);
my @mat_amb_diff_color2 = (1.0, 1.0, 0.0, 0.5);
my @light_diffuse = (1.0, 1.0, 1.0, 1.0);
my @light_ambient = (0.15, 0.15, 0.15, 0.15);
my @light_specular = (1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLightfv_p(GL_LIGHT0, GL_POSITION, @light0_position);
glLightfv_p(GL_LIGHT0, GL_DIFFUSE, @light_diffuse);
glLightfv_p(GL_LIGHT0, GL_AMBIENT, @light_ambient);
glLightfv_p(GL_LIGHT0, GL_SPECULAR, @light_specular);
glLoadIdentity();
gluLookAt(0.0, 3.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
$spin += $spinSpeed;
$spin = $spin - 360.0 if ($spin >360.0);
glRotatef($spin, 0.0, 1.0, 0.0);
$rot=$rot+$speed; # the frequency of the legs movement
my $quad = OpenGL::gluNewQuadric();
glMaterialfv_p(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
@mat_amb_diff_color2);
gluQuadricDrawStyle($quad, GLU_FILL);
glPushMatrix();
glTranslatef(0.0, 0.6, 0.0);
gluSphere( $quad , 0.8 , 20 , 20 );
glPopMatrix();
glMaterialfv_p(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @mat_amb_diff_color);
#drawing 8 Legs, every Leg has 3 parts:
for ($i = 0; $i<=359; $i=$i+45)
{
#drawing Leg's part 1:
glPushMatrix();
glRotatef( $i, 0.0, 1.0, 0.0 );
glPushMatrix();
glRotatef(-90, 0.0, 1.0, 0.0);
gluQuadricDrawStyle($quad, GLU_FILL);
gluQuadricOrientation($quad, GLU_INSIDE);
#Other draw steel choises below:
#gluQuadricDrawStyle($quad, GLU_POINT);
#gluQuadricDrawStyle($quad, GLU_SILHOUETTE);
#gluQuadricDrawStyle($quad, GLU_FILL);
#gluQuadricDrawStyle($quad, GLU_LINE);
gluCylinder($quad, 0.2, 0.15, 2, 16, 10);
glPopMatrix();
glRotatef( 70+sin($rot+$i)*20, 1.0, 0.0, 0.0 );
#drawing a smaller Leg's part 2:
glTranslatef(-2.0, 0.0, 0.0);
glRotatef(30, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(-90, 0.0, 1.0, 0.0);
gluCylinder($quad, 0.15, 0.1, 1.5, 16, 10);
glPopMatrix();
#drawing the smallest Leg's part 3:
glTranslatef(-1.5, 0.0, 0.0);
glRotatef(30, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(-90, 0.0, 1.0, 0.0);
gluCylinder($quad, 0.1, 0.05, 1.0, 16, 10);
glPopMatrix();
glPopMatrix();
}
#glRotatef(90, 1.0, 0.0, 0.0);
#glutSwapBuffers();
}
sub button1_Click {
#to call the DrawTriangle() sub
$flag = 1;
}
sub button2_Click {
#to call the DrawCube() sub
$flag = 2;
}
sub button3_Click {
#to call the DrawMonster() sub
$flag = 3;
}
sub button4_Click {
#to call the DrawMonster() sub
$flag = 4;
}
sub slider() {
my $sliderval = $s1->GetPos();
# to determine the vibrational speed of the Legs:
$speed = $sliderval /100;
$spinSpeed = $speed; #rotational speed of the monster
}
------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
trial. Simplify your report design, integration and deployment - and focus on
what you do best, core application coding. Discover what's new with
Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Perl-Win32-GUI-Users mailing list
Perl-Win32-GUI-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
http://perl-win32-gui.sourceforge.net/