diff -r 939f53515489 -r dbf43c07a507 hedgewars/uRender.pas --- a/hedgewars/uRender.pas Mon May 14 22:47:56 2012 +0400 +++ b/hedgewars/uRender.pas Mon May 14 19:26:50 2012 +0200 @@ -22,7 +22,7 @@ interface -uses SDLh, uTypes, GLunit, uConsts; +uses SDLh, uTypes, GLunit, uConsts, uTextures; procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); procedure DrawSprite (Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); @@ -71,8 +71,7 @@ procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); var rr: TSDL_Rect; - _l, _r, _t, _b: real; - VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; + VertexBuffer, TextureBuffer: TVertexRect; begin if (SourceTexture^.h = 0) or (SourceTexture^.w = 0) then exit; @@ -88,12 +87,9 @@ rr.w:= W; rr.h:= H; -_l:= r^.x / SourceTexture^.w * SourceTexture^.rx; -_r:= (r^.x + r^.w) / SourceTexture^.w * SourceTexture^.rx; -_t:= r^.y / SourceTexture^.h * SourceTexture^.ry; -_b:= (r^.y + r^.h) / SourceTexture^.h * SourceTexture^.ry; +glBindTexture(GL_TEXTURE_2D, SourceTexture^.atlas^.id); -glBindTexture(GL_TEXTURE_2D, SourceTexture^.id); +ComputeTexcoords(SourceTexture, r, @TextureBuffer); VertexBuffer[0].X:= X; VertexBuffer[0].Y:= Y; @@ -104,15 +100,6 @@ VertexBuffer[3].X:= X; VertexBuffer[3].Y:= rr.h + Y; -TextureBuffer[0].X:= _l; -TextureBuffer[0].Y:= _t; -TextureBuffer[1].X:= _r; -TextureBuffer[1].Y:= _t; -TextureBuffer[2].X:= _r; -TextureBuffer[2].Y:= _b; -TextureBuffer[3].X:= _l; -TextureBuffer[3].Y:= _b; - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); @@ -130,7 +117,7 @@ glTranslatef(X, Y, 0); glScalef(Scale, Scale, 1); -glBindTexture(GL_TEXTURE_2D, Texture^.id); +glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb); glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); @@ -145,8 +132,8 @@ end; procedure DrawTextureRotatedF(Texture: PTexture; Scale, OffsetX, OffsetY: GLfloat; X, Y, Frame, Dir, w, h: LongInt; Angle: real); -var ft, fb, fl, fr: GLfloat; - hw, nx, ny: LongInt; +var hw, nx, ny: LongInt; + r: TSDL_Rect; VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; begin // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) @@ -172,12 +159,13 @@ nx:= round(Texture^.w / w); // number of horizontal frames ny:= round(Texture^.h / h); // number of vertical frames -ft:= (Frame mod ny) * Texture^.ry / ny; -fb:= ((Frame mod ny) + 1) * Texture^.ry / ny; -fl:= (Frame div ny) * Texture^.rx / nx; -fr:= ((Frame div ny) + 1) * Texture^.rx / nx; +r.y:=(Frame mod ny) * h; +r.x:=(Frame div ny) * w; +r.w:=w; +r.h:=h; +ComputeTexcoords(Texture, @r, @TextureBuffer); -glBindTexture(GL_TEXTURE_2D, Texture^.id); +glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); VertexBuffer[0].X:= -hw; VertexBuffer[0].Y:= w / -2; @@ -188,15 +176,6 @@ VertexBuffer[3].X:= -hw; VertexBuffer[3].Y:= w / 2; -TextureBuffer[0].X:= fl; -TextureBuffer[0].Y:= ft; -TextureBuffer[1].X:= fr; -TextureBuffer[1].Y:= ft; -TextureBuffer[2].X:= fr; -TextureBuffer[2].Y:= fb; -TextureBuffer[3].X:= fl; -TextureBuffer[3].Y:= fb; - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); @@ -250,7 +229,7 @@ glRotatef(Angle, 0, 0, 1); -glBindTexture(GL_TEXTURE_2D, Texture^.id); +glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id); VertexBuffer[0].X:= -hw; VertexBuffer[0].Y:= -hh; @@ -407,12 +386,16 @@ procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); -const VertexBuffer: array [0..3] of TVertex2f = ( - (X: -16; Y: -16), - (X: 16; Y: -16), - (X: 16; Y: 16), - (X: -16; Y: 16)); -var l, r, t, b: real; +const VertexBuffers: array[0..1] of TVertexRect = ( + ((x: -16; y: -16), + (x: 16; y: -16), + (x: 16; y: 16), + (x: -16; y: 16)), + ((x: 16; y: -16), + (x: -16; y: -16), + (x: -16; y: 16), + (x: 16; y: 16))); +var r: TSDL_Rect; TextureBuffer: array [0..3] of TVertex2f; begin // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) @@ -421,39 +404,23 @@ if (abs(Y) > 32) and ((abs(Y - 0.5 * cScreenHeight) - 16) * cScaleFactor > cScreenHeight) then exit; - t:= Pos * 32 / HHTexture^.h; - b:= (Pos + 1) * 32 / HHTexture^.h; - - if Dir = -1 then - begin - l:= (Step + 1) * 32 / HHTexture^.w; - r:= Step * 32 / HHTexture^.w - end - else - begin - l:= Step * 32 / HHTexture^.w; - r:= (Step + 1) * 32 / HHTexture^.w - end; - + r.x:=Step * 32; + r.y:=Pos * 32; + r.w:=32; + r.h:=32; + ComputeTexcoords(HHTexture, @r, @TextureBuffer); glPushMatrix(); glTranslatef(X, Y, 0); glRotatef(Angle, 0, 0, 1); - glBindTexture(GL_TEXTURE_2D, HHTexture^.id); - - TextureBuffer[0].X:= l; - TextureBuffer[0].Y:= t; - TextureBuffer[1].X:= r; - TextureBuffer[1].Y:= t; - TextureBuffer[2].X:= r; - TextureBuffer[2].Y:= b; - TextureBuffer[3].X:= l; - TextureBuffer[3].Y:= b; - - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); + glBindTexture(GL_TEXTURE_2D, HHTexture^.atlas^.id); + if Dir = -1 then + glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[1][0]) + else + glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[0][0]); glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]); - glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glPopMatrix end;