Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
# ------
# Frames per second (FPS) statistic variables and routine.
use constant CLOCKS_PER_SEC => $hasHires ? 1000 : 1;
use constant FRAME_RATE_SAMPLES => 50;
my $FrameCount = 0;
my $FrameRate = 0;
my $last=0;
sub ourDoFPS
{
if (++$FrameCount >= FRAME_RATE_SAMPLES)
{
my $now = $hasHires ? gettimeofday() : time(); # clock();
my $delta= ($now - $last);
$last = $now;
$FrameRate = FRAME_RATE_SAMPLES / ($delta || 1);
$FrameCount = 0;
}
}
# ------
# String rendering routine; leverages on GLUT routine.
sub ourPrintString
{
my ($font, $str) = @_;
my @c = split '', $str;
for(@c)
{
glutBitmapCharacter($font, ord $_);
}
}
# ------
# Does everything needed before losing control to the main
# OpenGL event loop.
sub ourInitVertexBuffers
{
# Set initial colors for rainbow face
for (my $i=0; $i<16; $i++)
{
$rainbow[$i] = rand(1.0);
$rainbow_inc[$i] = 0.01 - rand(0.02);
}
# Initialize VBOs if supported
if ($hasVBO)
{
printf("Using VBOs\n");
($VertexObjID,$NormalObjID,$ColorObjID,$TexCoordObjID,$IndexObjID) =
glGenBuffersARB_p(5);
#glBindBufferARB(GL_ARRAY_BUFFER_ARB, $VertexObjID);
$verts->bind($VertexObjID);
glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $verts, GL_STATIC_DRAW_ARB);
glVertexPointer_c(3, GL_FLOAT, 0, 0);
if (DO_TESTS)
{
print "\nTests:\n";
my $size = glGetBufferParameterivARB_p(GL_ARRAY_BUFFER_ARB,
GL_BUFFER_SIZE_ARB);
print " Vertex Buffer Size (bytes): $size\n";
my $count = $verts->elements();
print " Vertex Buffer Size (elements): $count\n";
my $test = glGetBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB,12,3,GL_FLOAT);
my @test = $test->retrieve(0,3);
my $ords = join('/',@test);
print " glGetBufferSubDataARB_p: $ords\n";
}
#glBindBufferARB(GL_ARRAY_BUFFER_ARB, $NormalObjID);
$norms->bind($NormalObjID);
glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $norms, GL_STATIC_DRAW_ARB);
glNormalPointer_c(GL_FLOAT, 0, 0);
#glBindBufferARB(GL_ARRAY_BUFFER_ARB, $ColorObjID);
$colors->bind($ColorObjID);
glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $colors, GL_DYNAMIC_DRAW_ARB);
$rainbow->assign(0,@rainbow);
glBufferSubDataARB_p(GL_ARRAY_BUFFER_ARB, $rainbow_offset, $rainbow);
glColorPointer_c(4, GL_FLOAT, 0, 0);
#glBindBufferARB(GL_ARRAY_BUFFER_ARB, $TexCoordObjID);
$texcoords->bind($TexCoordObjID);
glBufferDataARB_p(GL_ARRAY_BUFFER_ARB, $texcoords, GL_STATIC_DRAW_ARB);
glTexCoordPointer_c(2, GL_FLOAT, 0, 0);
#glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, $IndexObjID);
$indices->bind($IndexObjID);
glBufferDataARB_p(GL_ELEMENT_ARRAY_BUFFER_ARB, $indices, GL_STATIC_DRAW_ARB);
}
else
{
print "Using classic Vertex Buffers\n";
glVertexPointer_p(3, $verts);
glNormalPointer_p($norms);
$colors->assign($rainbow_offset,@rainbow);
glColorPointer_p(4, $colors);
glTexCoordPointer_p(2, $texcoords);
}
print "-- done\n";
}
sub ourInit
{
my ($Width, $Height) = @_;
printf("\nUsing POGL v$Acme::MITHALDU::BleedingOpenGL::VERSION\n");
# Build texture.
($TextureID_image,$TextureID_FBO) = glGenTextures_p(2);
ourBuildTextures();
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
# Initialize shaders.
ourInitShaders();
# Initialize vertex buffers
ourInitVertexBuffers();
# Initialize rendering parameters
glEnable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
#glEnable(GL_BLEND);
# Color to clear color buffer to.
glClearColor(0.1, 0.1, 0.1, 0.0);
# Depth to clear depth buffer to; type of test.
glClearDepth(1.0);
glDepthFunc(GL_LESS);
# Enables Smooth Color Shading; try GL_FLAT for (lack of) fun.
glShadeModel(GL_SMOOTH);
# Load up the correct perspective matrix; using a callback directly.
cbResizeScene($Width, $Height);
# Set up a light, turn it on.
glLightfv_p(GL_LIGHT1, GL_POSITION, @Light_Position);
glLightfv_p(GL_LIGHT1, GL_AMBIENT, @Light_Ambient);
glLightfv_p(GL_LIGHT1, GL_DIFFUSE, @Light_Diffuse);
glEnable(GL_LIGHT1);
# A handy trick -- have surface material mirror the color.
glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
( run in 1.161 second using v1.01-cache-2.11-cpan-2398b32b56e )