--- deliantra/Deliantra-Client/DC/OpenGL.pm 2007/08/09 05:38:30 1.7 +++ deliantra/Deliantra-Client/DC/OpenGL.pm 2009/12/21 23:52:34 1.18 @@ -1,14 +1,18 @@ -package CFPlus::OpenGL; +package DC::OpenGL; use strict; use Carp (); -use CFPlus; +use DC; our %GL_EXT; our $GL_VERSION; our $GL_NPOT; +our $GL_COMPRESS; +our $GL_BFSEP; # blendfuncseparate +our $GL_MULTITEX; +our $APPLE_NVIDIA_BUG; our $DEBUG = 1; our %INIT_HOOK; @@ -19,7 +23,7 @@ no strict; - my $symtab = *{"main::CFPlus::OpenGL::"}{HASH}; + my $symtab = *{"main::DC::OpenGL::"}{HASH}; for (keys %$symtab) { *{"$caller\::$_"} = *$_ @@ -31,9 +35,36 @@ $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 = $GL_VERSION >= 2; # some pre-2.0 cards seem to fall back to software rendering - $GL_NPOT = 0 if gl_vendor =~ /ATI Technologies/; # ATI doesn't get it right... + unless (defined $::CFG->{force_opengl11}) { + # try to find a suitable default + if ( + $GL_VERSION >= 2.0 + && (!$GL_EXT{GL_ARB_texture_non_power_of_two} + || !$GL_EXT{GL_EXT_blend_func_separate}) + ) { + $::CFG->{force_opengl11} = 1; + } else { + $::CFG->{force_opengl11} = 0; + } + } + + if ($::CFG->{force_opengl11}) { + $GL_VERSION = 1.1; + %GL_EXT = (); + } + + $GL_BFSEP = $GL_EXT{GL_EXT_blend_func_separate} || $GL_VERSION >= 2.0; + $GL_NPOT = $GL_EXT{GL_ARB_texture_non_power_of_two} || $GL_VERSION >= 2.0; + $GL_COMPRESS = $GL_EXT{GL_ARB_texture_compression} || $GL_VERSION >= 1.3; + $GL_MULTITEX = $GL_VERSION >= 1.3; # ARB not supported, 1.3. implies 2+ units + + $GL_COMPRESS = 0 if DC::OpenGL::gl_vendor eq "Apple Computer, Inc."; # there is no end to their suckage + + $APPLE_NVIDIA_BUG = DC::OpenGL::gl_vendor eq "NVIDIA Corporation" && $^O eq "darwin"; + apple_nvidia_bug $APPLE_NVIDIA_BUG; + + disable_GL_EXT_blend_func_separate + unless $GL_BFSEP; glDisable GL_COLOR_MATERIAL; glShadeModel GL_FLAT; @@ -47,14 +78,23 @@ glHint GL_LINE_SMOOTH_HINT , $hint; glHint GL_POLYGON_SMOOTH_HINT , $hint; glHint GL_GENERATE_MIPMAP_HINT , $hint; + glHint GL_TEXTURE_COMPRESSION_HINT , $hint; #glDrawBuffer GL_BACK; #glReadBuffer GL_BACK; + c_init; $_->() for values %INIT_HOOK; } +sub quit { + undef $GL_VERSION; + undef %GL_EXT; +} + sub shutdown { $_->() for values %SHUTDOWN_HOOK; + + quit; } sub gl_check {