XForms: Testing OpenGL in Xforms4Perl

Perry ((hutchisp@wsmr.army.mil)")
Wed, 15 Apr 1998 10:04:02 -0600 (MDT)

# To subscribers of the xforms list from "Perry (hutchisp@wsmr.army.mil)" <hutchisp@wsmr.army.mil> :

Dear Martin,

First, yes I will help you by testing OpenGL (and Mesa).

Shall we use the xforms forum to communicate?

The platform for testing is Linux using perl5.00464, xforms 0.88,
Xforms4Perl 0.8.4, and Mesa 3.0 beta 3.

I created a dynamic library of gl.c thusly:

gcc -fPIC -c gl.c -o libformsgl.so.0.88

It worked when I linked it to DEMOS/gl (along with Xforms and MesaGL).

I compiled this library into Xforms4Perl using this Makefile.PL header:

use ExtUtils::MakeMaker;
WriteMakefile(
CONFIG => [qw(osname)],
DEFINE => '-DFXOPENGL',
INC => '-I/usr/include',
LIBS => '-L/usr/X11R6/lib -lforms -lX11 -lXpm -lm -lMesaGL -lformsgl',
NAME => 'X11::Xforms',
PM => {'Xforms.pm' => '$(INST_LIBDIR)/Xforms.pm'},
VERSION_FROM => 'Xforms.pm.skel',
'clean' => { FILES => "*.tc Xforms.pm"}
);

Then, in X11:

make

I got this:

make[1]: Entering directory `/usr/src/Xforms4Perl-0.8.4/X11/XEvent'
cc -c -Dbool=char -DHAS_BOOL -I/usr/local/include -O3 -mno-486 -funroll-loops -ffast-math -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=386 -DVERSION=\"0.7\" -DXS_VERSION=\"0.7\" -fpic -I/usr/lib/perl5/i486-linux/5.00464/CORE XEvent.c
Running Mkbootstrap for X11::XEvent ()
chmod 644 XEvent.bs
LD_RUN_PATH="/usr/X11R6/lib" cc -o ../blib/arch/auto/X11/XEvent/XEvent.so -shared -L/usr/local/lib XEvent.o -L/usr/X11R6/lib -lX11
chmod 755 ../blib/arch/auto/X11/XEvent/XEvent.so
strip ../blib/arch/auto/X11/XEvent/XEvent.so
cp XEvent.bs ../blib/arch/auto/X11/XEvent/XEvent.bs
chmod 644 ../blib/arch/auto/X11/XEvent/XEvent.bs
Manifying ../blib/man3/X11::XEvent.3
make[1]: Leaving directory `/usr/src/Xforms4Perl-0.8.4/X11/XEvent'
make[1]: Entering directory `/usr/src/Xforms4Perl-0.8.4/X11/XFontStruct'
cc -c -Dbool=char -DHAS_BOOL -I/usr/local/include -O3 -mno-486 -funroll-loops -ffast-math -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=386 -DVERSION=\"0.7\" -DXS_VERSION=\"0.7\" -fpic -I/usr/lib/perl5/i486-linux/5.00464/CORE XFontStruct.
c
Running Mkbootstrap for X11::XFontStruct ()
chmod 644 XFontStruct.bs
LD_RUN_PATH="/usr/X11R6/lib" cc -o ../blib/arch/auto/X11/XFontStruct/XFontStruct.so -shared -L/usr/local/lib XFontStruct.o -L/usr/X11R6/lib -lX11
chmod 755 ../blib/arch/auto/X11/XFontStruct/XFontStruct.so
strip ../blib/arch/auto/X11/XFontStruct/XFontStruct.so
cp XFontStruct.bs ../blib/arch/auto/X11/XFontStruct/XFontStruct.bs
chmod 644 ../blib/arch/auto/X11/XFontStruct/XFontStruct.bs
Manifying ../blib/man3/X11::XFontStruct.3
make[1]: Leaving directory `/usr/src/Xforms4Perl-0.8.4/X11/XFontStruct'
make[1]: Entering directory `/usr/src/Xforms4Perl-0.8.4/X11/Xforms'
cc -c -I/usr/include -Dbool=char -DHAS_BOOL -I/usr/local/include -O3 -mno-486 -funroll-loops -ffast-math -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=386 -DVERSION=\"0.8.4\" -DXS_VERSION=\"0.8.4\" -fpic -I/usr/lib/perl5/i486-linux/5.00464/
CORE -DFXOPENGL Xforms.c
Running Mkbootstrap for X11::Xforms ()
chmod 644 Xforms.bs
LD_RUN_PATH="/usr/X11R6/lib:/lib" cc -o ../blib/arch/auto/X11/Xforms/Xforms.so -shared -L/usr/local/lib Xforms.o -L/usr/X11R6/lib -lforms -lX11 -lXpm -lm -lMesaGL -lformsgl
chmod 755 ../blib/arch/auto/X11/Xforms/Xforms.so
strip ../blib/arch/auto/X11/Xforms/Xforms.so
cp Xforms.bs ../blib/arch/auto/X11/Xforms/Xforms.bs
chmod 644 ../blib/arch/auto/X11/Xforms/Xforms.bs
Manifying ../blib/man3/X11::Xforms.3
make[1]: Leaving directory `/usr/src/Xforms4Perl-0.8.4/X11/Xforms'

Then, make install.

Then I ran gl.pl:

#!#/usr/bin/perl
#/*
#* OpenGL/mesa canvas demo
#*
#* On most platforms, the mesa/OpenGL support is not compiled into
#* the shared library (It it in the static library). You can compile
#* ../FORMS/gl.c and put it in the shared library if you have mesa/OpenGL
#*
#* Also you might want to make a link libGL.a to libMesaGL.a
#*
#* T.C. Zhao and M. Overmars
#*
#*/

use X11::Xforms;
use X11::XEvent;

$prim="GL_POLYGON";

sub draw_cube
{
glColor3f( 1.0, 0.0, 0.0 );
glBegin( $prim );
glVertex3f( 1.0, 1.0, 1.0 ); glVertex3f( 1.0, -1.0, 1.0 );
glVertex3f( 1.0, -1.0, -1.0 ); glVertex3f( 1.0, 1.0, -1.0 );
glEnd();

glBegin( $prim );
glVertex3f( -1.0, 1.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );
glVertex3f( -1.0, -1.0, -1.0 ); glVertex3f( -1.0, -1.0, 1.0 );
glEnd();

glColor3f( 0.0, 1.0, 0.0 );
glBegin( $prim );
glVertex3f( 1.0, 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );
glVertex3f( -1.0, 1.0, -1.0 ); glVertex3f( -1.0, 1.0, 1.0 );
glEnd();

glBegin( $prim );
glVertex3f( 1.0, -1.0, 1.0 ); glVertex3f( -1.0, -1.0, 1.0 );
glVertex3f( -1.0, -1.0, -1.0 ); glVertex3f( 1.0, -1.0, -1.0 );
glEnd();

glColor3f( 0.0, 0.0, 1.0 );
glBegin( $prim );
glVertex3f( 1.0, 1.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );
glVertex3f( -1.0, -1.0, 1.0 ); glVertex3f( 1.0, -1.0, 1.0 );
glEnd();
glBegin( $prim );
glVertex3f( 1.0, 1.0, -1.0 ); glVertex3f( 1.0,-1.0, -1.0 );
glVertex3f( -1.0,-1.0, -1.0 ); glVertex3f( -1.0, 1.0, -1.0 );
glEnd();
}

sub idle_cb
{

if($form || ! $canvas)
{ return 0; }

fl_activate_glcanvas($canvas);

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

glRotatef( $xrot, 1.0, 0.0, 0.0 );
glRotatef( $yrot, 0.0, 1.0, 0.0 );
glRotatef( $zrot, 0.0, 0.0, 1.0 );
glTranslatef(-1.0,1.2,-0.5);

draw_cube();

glPopMatrix();

glFinish();

if($ev)
{
$xrot += 10.0;
$yrot += 7.0;
$zrot -= 3.0;
}

glXSwapBuffers(fl_display, fl_get_canvas_id($canvas));

return 0;
}

sub canvas_expose
{
my($ob,$win,$w,$h,$xev,$ud)=@_;

glViewport(0,0, $w, $h);
glClearColor(0.0,0.0,0.0,0.0);

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -1.0, 1.0, -1.0, 1.0, 1.0, 10.0 );
glTranslatef( 0.0, 0.0, -5.0 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glCullFace( GL_BACK );
glEnable( GL_CULL_FACE );

glShadeModel( GL_FLAT );

#/* refresh */
idle_cb(0, 0);
return 0;
}

sub buttonpress_cb
{
my $suspended;

$suspended = ($suspended + 1) %2;
fl_set_idle_callback($suspended ? 0:idle_cb,0);
return 0;
}

sub switch_primitive
{
push(@primative,"GL_POLYGON");
push(@primative,"GL_LINE_LOOP");

$prim = $primitive[++$i%2];
}

#/* switch single/dblbuffer */
$sbuf= "GLX_RGBA,GLX_DEPTH_SIZE,1,
GLX_RED_SIZE,1,GLX_GREEN_SIZE,1,GLX_BLUE_SIZE,1,None";

$dbuf= "GLX_RGBA,GLX_DEPTH_SIZE,1,
GLX_RED_SIZE,1,GLX_GREEN_SIZE,1,GLX_BLUE_SIZE,1,
None";
sub buffer_cb
{
my($ob)=@_;
if($is_double) { $is_double=0; } else { $is_double=1; }
fl_set_object_label($ob,$is_double ? "Single":"Double");
fl_set_glcanvas_attributes($canvas, $is_double ?$dbuf:$sbuf);
}

sub menu_cb
{
}

$dpy=fl_initialize("FormDemo");
create_form_form();

#/* fill-in form initialization code */
fl_set_object_gravity($butgrp, NorthEastGravity,NorthEastGravity);
fl_addto_menu($menu,"Item1|Item2|Item3|Item4");

fl_add_canvas_handler($canvas, 12, "canvas_expose", 0);
fl_add_canvas_handler($canvas, 2, "buttonpress_cb", 0);
fl_set_idle_callback("idle_cb", 0);

#/* geometry stuff */
fl_set_form_minsize($form, 340, 280);

fl_show_form($form,FL_PLACE_CENTER|FL_FREE_SIZE,FL_FULLBORDER,
"OpenGL Canvas");

while(($ob = fl_do_forms()) != $done) {};
fl_finish();
return 0;

sub hide_it
{
my($ob, $all)=@_;
if($all)
{
fl_hide_object($canvas);
fl_set_object_label($ob,"Show");
}
else
{
fl_show_object($canvas);
fl_set_object_label($ob,"Hide");
}
}

sub reshow
{
my($form, $all)=@_;
fl_hide_form($form);
fl_show_form($form,FL_PLACE_CENTER|FL_FREE_SIZE,FL_FULLBORDER,
"OpenGL Canvas");
}

sub create_form_form
{
my $obj;

$form = fl_bgn_form(FL_NO_BOX, 340, 280);
$obj = fl_add_box(FL_UP_BOX,0,0,340,280,"");
$canvas = $obj = fl_add_glcanvas(FL_NORMAL_CANVAS,20,45,225,215,"");
fl_set_object_gravity($obj, FL_NorthWest, FL_SouthEast);
$done = $obj = fl_add_button(FL_NORMAL_BUTTON,255,230,70,30,"Done");
fl_set_button_shortcut($obj,"Dd#d",1);
fl_set_object_gravity($obj, FL_SouthEast, FL_SouthEast);
$menu = $obj = fl_add_menu(FL_PULLDOWN_MENU,20,15,54,20,"Canvas");
fl_set_object_shortcut($obj,"#CcC",1);
fl_set_object_boxtype($obj,FL_FLAT_BOX);
fl_set_object_lstyle($obj,FL_BOLD_STYLE);
fl_set_object_gravity($obj, FL_NorthWest, FL_NorthWest);
fl_set_object_callback($obj,"menu_cb",0);

$butgrp = fl_bgn_group();
$obj = fl_add_button(FL_NORMAL_BUTTON,255,45,70,30,"Poly/Line");
fl_set_object_gravity($obj, FL_NorthEast, FL_NorthEast);
fl_set_object_callback($obj,"switch_primitive",0);
$obj = fl_add_button(FL_NORMAL_BUTTON,255,75,70,30,"Hide");
fl_set_button_shortcut($obj,"#HhH",1);
fl_set_object_callback($obj,"hide_it",0);
$obj = fl_add_button(FL_NORMAL_BUTTON,255,105,70,30,"ReShow");
fl_set_button_shortcut($obj,"#RRr",1);
fl_set_object_callback($obj,reshow,0);
$obj = fl_add_button(FL_NORMAL_BUTTON,255,135,70,30,"Single");
fl_set_object_callback($obj,"buffer_cb",0);
fl_end_group();
fl_end_form();

return $fdui;
}

With the the resultant message:

Xforms4Perl OpenGL functions are not installed. at gl.pl line 202.

Thats all.

_________________________________________________
To unsubscribe, send the message "unsubscribe" to
xforms-request@bob.usuf2.usuhs.mil or see
http://bob.usuf2.usuhs.mil/mailserv/xforms.html
XForms Home Page: http://bragg.phys.uwm.edu/xforms
List Archive: http://bob.usuf2.usuhs.mil/mailserv/list-archives/