Acme-MITHALDU-BleedingOpenGL
view release on metacpan or search on metacpan
glDrawPixels_c( $Inset_Width, $Inset_Height, $fmt, $size, $frame->Ptr() );
}
# Fastest approach
else
{
my $len = $Inset_Width * $Inset_Height * 4;
my $oga = new OpenGL::Array($len,GL_UNSIGNED_BYTE);
glReadPixels_c( $Capture_X, $Capture_Y, $Inset_Width, $Inset_Height,
GL_RGBA, GL_UNSIGNED_BYTE, $oga->ptr() );
glRasterPos2f( $Inset_X, $Inset_Y );
glDrawPixels_c( $Inset_Width, $Inset_Height, GL_RGBA, GL_UNSIGNED_BYTE, $oga->ptr() );
}
}
# Capture/save window
sub Save
{
my($w,$h,$file) = @_;
if ($hasImage)
{
my $frame = new OpenGL::Image(width=>$w, height=>$h);
my($fmt,$size) = $frame->Get('gl_format','gl_type');
glReadPixels_c( 0, 0, $w, $h, $fmt, $size, $frame->Ptr() );
$frame->Save($file);
}
else
{
print "Need OpenGL::Image and ImageMagick 6.3.5 or newer for file capture!\n";
}
}
# Cleanup routine
sub ourCleanup
{
print "Starting cleanup ...\n";
# Disable app
glutHideWindow();
glutKeyboardUpFunc();
glutKeyboardFunc();
glutSpecialUpFunc();
glutSpecialFunc();
glutIdleFunc();
glutReshapeFunc();
ReleaseResources();
# Now you can destroy window
if (defined($gameMode))
{
print "Leaving game mode.\n";
glutLeaveGameMode();
}
else
{
print "Destroying window.\n";
glutDestroyWindow($Window_ID);
}
undef($Window_ID);
print "Cleanup completed.\n";
}
sub ReleaseResources
{
return if (!defined($Window_ID));
if ($hasFBO)
{
# Release resources
glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 );
glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
glDeleteRenderbuffersEXT_p( $RenderBufferID ) if ($RenderBufferID);
glDeleteFramebuffersEXT_p( $FrameBufferID ) if ($FrameBufferID);
}
if ($Shader)
{
undef($Shader);
}
elsif ($hasFragProg)
{
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0);
glDeleteProgramsARB_p( $VertexProgID ) if ($VertexProgID);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
glDeleteProgramsARB_p( $FragProgID ) if ($FragProgID);
}
if ($hasVBO)
{
glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
glDeleteBuffersARB_p($VertexObjID) if ($VertexObjID);
glDeleteBuffersARB_p($NormalObjID) if ($NormalObjID);
glDeleteBuffersARB_p($ColorObjID) if ($ColorObjID);
glDeleteBuffersARB_p($TexCoordObjID) if ($TexCoordObjID);
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
glDeleteBuffersARB_p($IndexObjID) if ($IndexObjID);
}
glDeleteTextures_p($TextureID_image,$TextureID_FBO);
}
# ------
# Callback function called when a normal $key is pressed.
sub cbKeyPressed
{
my $key = shift;
my $c = uc chr $key;
if ($key == 27 or $c eq 'Q')
{
ourCleanup();
return quit("key press callback");
}
elsif ($c eq 'B')
{
$Blend_On = !$Blend_On;
if (!$Blend_On)
{
glDisable(GL_BLEND);
}
else {
glEnable(GL_BLEND);
}
}
elsif ($c eq 'K')
{
# ignore keypress if not FreeGLUT
glutLeaveMainLoop() if Acme::MITHALDU::BleedingOpenGL::_have_freeglut();
}
elsif ($c eq 'L')
{
$Light_On = !$Light_On;
}
elsif ($c eq 'M')
{
if ( ++ $Curr_TexMode > 3 )
( run in 1.212 second using v1.01-cache-2.11-cpan-d80b1682f3f )