--- deliantra/Deliantra-Client/DC/OpenGL.pm 2006/04/19 23:37:49 1.1 +++ deliantra/Deliantra-Client/DC/OpenGL.pm 2006/05/26 18:28:23 1.2 @@ -2,7 +2,16 @@ use strict; -#use CFClient; +use Carp (); +use CFClient; + +our %GL_EXT; +our $GL_VERSION; + +our $GL_NPOT; + +our $DEBUG = 1; +our %INIT_HOOK; sub import { my $caller = caller; @@ -12,9 +21,36 @@ my $symtab = *{"main::CFClient::OpenGL::"}{HASH}; for (keys %$symtab) { - *{"$caller\::$_"} = \&$_ - if /^(?:gl|GL_)/; + *{"$caller\::$_"} = *$_ + if /^(?:gl[A-Z_]|GL_)/; } } -1 +sub init { + $GL_VERSION = gl_version * 1; + %GL_EXT = map +($_ => 1), split /\s+/, gl_extensions; + + $GL_NPOT = $GL_EXT{GL_ARB_texture_non_power_of_two} || $GL_VERSION >= 2; + $GL_NPOT = 0 if gl_vendor =~ /ATI Technologies/; # ATI doesn't get it right... + + glDisable GL_COLOR_MATERIAL; + glShadeModel GL_FLAT; + glDisable GL_DITHER; + glDisable GL_DEPTH_TEST; + glDepthMask 0; + glHint GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST; + + $_->() for values %INIT_HOOK; +} + +sub gl_check { + return unless $DEBUG; + + if (my $error = glGetError) { + my ($format, @args) = @_; + Carp::cluck sprintf "opengl error %x while $format", $error, @args; + } +} + +1; +