diff -r e70b81854fb9 -r af64b509725c hedgewars/uTextures.pas --- a/hedgewars/uTextures.pas Mon Jun 25 12:02:54 2012 +0200 +++ b/hedgewars/uTextures.pas Mon Jun 25 15:46:08 2012 +0200 @@ -49,12 +49,13 @@ end; procedure ComputeTexcoords(texture: PTexture; r: PSDL_Rect; tb: PVertexRect); -var x0, y0, x1, y1: Real; +var x0, y0, x1, y1, tmp: Real; w, h, aw, ah: LongInt; const texelOffset = 0.0; begin aw:=texture^.atlas^.w; ah:=texture^.atlas^.h; + if texture^.isRotated then begin w:=r^.h; @@ -66,19 +67,32 @@ h:=r^.h; end; -x0:= (r^.x + texelOffset)/aw; -x1:= (r^.x + w - texelOffset)/aw; -y0:= (r^.y + texelOffset)/ah; -y1:= (r^.y + h - texelOffset)/ah; +x0:= (texture^.x + r^.x + texelOffset)/aw; +x1:= (texture^.x + r^.x + w - texelOffset)/aw; +y0:= (texture^.y + r^.y + texelOffset)/ah; +y1:= (texture^.y + r^.y + h - texelOffset)/ah; -tb^[0].X:= x0; -tb^[0].Y:= y0; -tb^[1].X:= x1; -tb^[1].Y:= y0; -tb^[2].X:= x1; -tb^[2].Y:= y1; -tb^[3].X:= x0; -tb^[3].Y:= y1 +if (texture^.isRotated) then +begin + tb^[0].X:= x0; + tb^[0].Y:= y0; + tb^[3].X:= x1; + tb^[3].Y:= y0; + tb^[2].X:= x1; + tb^[2].Y:= y1; + tb^[1].X:= x0; + tb^[1].Y:= y1 +end else +begin + tb^[0].X:= x0; + tb^[0].Y:= y0; + tb^[1].X:= x1; + tb^[1].Y:= y0; + tb^[2].X:= x1; + tb^[2].Y:= y1; + tb^[3].X:= x0; + tb^[3].Y:= y1; +end; end; procedure ResetVertexArrays(texture: PTexture); @@ -126,6 +140,8 @@ NewTexture^.w:=width; NewTexture^.h:=height; NewTexture^.isRotated:=false; +NewTexture^.shared:=false; +NewTexture^.surface:=nil; ResetVertexArrays(NewTexture); @@ -164,8 +180,12 @@ tmpp: pointer; fromP4, toP4: PLongWordArray; begin - if (surf^.w <= 128) and (surf^.h <= 128) then - Surface2Tex_(surf, enableClamp); // run the atlas side by side for debugging + if (surf^.w <= 256) and (surf^.h <= 256) then + begin + Surface2Atlas:= Surface2Tex_(surf, enableClamp); // run the atlas side by side for debugging + ResetVertexArrays(Surface2Atlas); + exit; + end; new(Surface2Atlas); Surface2Atlas^.PrevTexture:= nil; Surface2Atlas^.NextTexture:= nil; @@ -185,6 +205,7 @@ Surface2Atlas^.y:=0; Surface2Atlas^.isRotated:=false; Surface2Atlas^.surface:= surf; +Surface2Atlas^.shared:= false; if (surf^.format^.BytesPerPixel <> 4) then @@ -260,9 +281,15 @@ // if nil is passed nothing is done procedure FreeTexture(tex: PTexture); begin - FreeTexture_(tex); // run atlas side by side for debugging if tex <> nil then begin + if tex^.shared then + begin + FreeTexture_(tex); // run atlas side by side for debugging + SDL_FreeSurface(tex^.surface); + exit; + end; + // Atlas cleanup happens here later on. For now we just free as each sprite has one atlas Dispose(tex^.atlas); @@ -274,7 +301,8 @@ TextureList:= tex^.NextTexture; glDeleteTextures(1, @tex^.atlas^.id); - SDL_FreeSurface(tex^.surface); + if (tex^.surface <> nil) then + SDL_FreeSurface(tex^.surface); Dispose(tex); end end;