--- deliantra/Deliantra-Client/DC/Texture.pm 2007/07/19 13:45:18 1.16 +++ deliantra/Deliantra-Client/DC/Texture.pm 2007/07/24 01:24:27 1.23 @@ -116,7 +116,6 @@ } my ($tw, $th) = ($dw, $dh); - my ($rw, $rh) = ($dw, $dh); defined $data or $self->{render_cb} or die; # some sanity check @@ -141,16 +140,23 @@ $th >>= 1; } + # decide the amount of space used in the texture + my ($rw, $rh); + my ($ox, $oy); # area shift to lessen effetc of buggy opengl implementations (nvida, ati) + my $render; + if ($self->{render_cb}) { # use only part of the texture #$rw >>= 1 while $rw > $tw; #$rh >>= 1 while $rh > $th; - $rw = min $rw, $tw; - $rh = min $rh, $th; + $rw = min $dw, $tw; + $rh = min $dh, $th; + ++$render; } else { if ($self->{wrap} || $tw < $dw || $th < $dh) { # scale to the full texture size ($rw, $rh) = ($tw, $th); + ++$render; } else { # pad pad $data, $dw, $dh, $tw, $th; @@ -159,12 +165,13 @@ } } - # rendering means we need to scale in some way - my $render = $self->{render_cb} || $rw != $dw || $th != $dh; - if ($render) { - #d#glClear 0,0,0,0; - glViewport 0, 0, $tw, $th; + $ox = int .5 * ($::WIDTH - $rw); + $oy = int .5 * ($::HEIGHT - $rh); + + glViewport $ox, $oy, $tw, $th; + #glScissor 0, 0, $tw, $th; + #glEnable GL_SCISSOR_TEST; glMatrixMode GL_PROJECTION; glLoadIdentity; glOrtho 0, $tw, 0, $th, -10000, 10000; @@ -175,7 +182,10 @@ glScale $rw / $dw, $rh / $dh; $self->{render_cb}->($self, $rw, $rh); } else { + glClearColor 0, 0, 0, 0; + glClear GL_COLOR_BUFFER_BIT; glPixelZoom $tw / $dw, $th / $dh; + glRasterPos 0, 0; glDrawPixels $dw, $dh, $self->{format}, $self->{type}, @@ -212,11 +222,13 @@ if ($render) { glCopyTexImage2D GL_TEXTURE_2D, 0, $self->{internalformat}, - 0, 0, + $ox, $oy, $tw, $th, 0; gl_check "copying to texture %dx%d if=%x", $tw, $th, $self->{internalformat}; + + #glDisable GL_SCISSOR_TEST; } else { glTexImage2D GL_TEXTURE_2D, 0, $self->{internalformat},