# HG changeset patch # User unC0Rr # Date 1290084335 -10800 # Node ID 91655618a510160e113b156e77b438de19353eb6 # Parent 43945842da0c3c790603a126664c16bb4bf34a72 Introduce uRender diff -r 43945842da0c -r 91655618a510 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/CMakeLists.txt Thu Nov 18 15:45:35 2010 +0300 @@ -62,8 +62,8 @@ uMisc.pas uMobile.pas uRandom.pas + uRender.pas uScript.pas - adler32.pas uSound.pas uStats.pas uStore.pas @@ -81,6 +81,7 @@ SinTable.inc ArgParsers.inc options.inc + adler32.pas ${CMAKE_CURRENT_BINARY_DIR}/config.inc ) diff -r 43945842da0c -r 91655618a510 hedgewars/uChat.pas --- a/hedgewars/uChat.pas Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/uChat.pas Thu Nov 18 15:45:35 2010 +0300 @@ -34,7 +34,7 @@ showAll: boolean; implementation -uses uStore, SDLh, uKeys, uTypes, uVariables, uCommands, uUtils, uTextures; +uses uStore, SDLh, uKeys, uTypes, uVariables, uCommands, uUtils, uTextures, uRender; const MaxStrIndex = 27; diff -r 43945842da0c -r 91655618a510 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/uGears.pas Thu Nov 18 15:45:35 2010 +0300 @@ -47,7 +47,7 @@ implementation uses uWorld, uStore, uSound, uTeams, uRandom, uCollisions, uIO, uLandGraphics, uAIMisc, uLocale, uAI, uAmmos, uStats, uVisualGears, uScript, GLunit, uMobile, uVariables, - uCommands, uUtils, uTextures; + uCommands, uUtils, uTextures, uRender; const MAXROPEPOINTS = 384; var RopePoints: record diff -r 43945842da0c -r 91655618a510 hedgewars/uLandTexture.pas --- a/hedgewars/uLandTexture.pas Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/uLandTexture.pas Thu Nov 18 15:45:35 2010 +0300 @@ -28,7 +28,7 @@ procedure DrawLand(dX, dY: LongInt); implementation -uses uMisc, uStore, uConsts, GLunit, uTypes, uVariables, uTextures, uIO; +uses uMisc, uStore, uConsts, GLunit, uTypes, uVariables, uTextures, uIO, uRender; const TEXSIZE = 256; diff -r 43945842da0c -r 91655618a510 hedgewars/uRender.pas --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hedgewars/uRender.pas Thu Nov 18 15:45:35 2010 +0300 @@ -0,0 +1,388 @@ +{$INCLUDE "options.inc"} +unit uRender; + +interface + +uses SDLh, uTypes, GLunit; + +procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); +procedure DrawFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); +procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); +procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); +procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); +procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); +procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat = 1.0); +procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); +procedure DrawRotatedTextureF(Texture: PTexture; Scale, OffsetX, OffsetY: GLfloat; X, Y, Frame, Dir, w, h: LongInt; Angle: real); +procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); +procedure DrawRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); +procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); +procedure DrawCentered(X, Top: LongInt; Source: PTexture); +procedure DrawLine(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); +procedure DrawFillRect(r: TSDL_Rect); +procedure DrawCircle(X, Y, Radius: LongInt; Width: Single; r, g, b, a: Byte); +procedure Tint(r, g, b, a: Byte); inline; +procedure Tint(c: Longword); inline; + +implementation +uses uVariables; +var + lastTint: Longword; + +procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); +begin +r.y:= r.y + Height * Position; +r.h:= Height; +DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture) +end; + +procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); +begin +DrawFromRect(X, Y, r^.w, r^.h, r, SourceTexture) +end; + +procedure DrawFromRect(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; +begin +if (SourceTexture^.h = 0) or (SourceTexture^.w = 0) then exit; + +// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) +if (abs(X) > W) and ((abs(X + W / 2) - W / 2) > cScreenWidth / cScaleFactor) then + exit; +if (abs(Y) > H) and ((abs(Y + H / 2 - (0.5 * cScreenHeight)) - H / 2) > cScreenHeight / cScaleFactor) then + exit; + +rr.x:= X; +rr.y:= Y; +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^.id); + +VertexBuffer[0].X:= X; +VertexBuffer[0].Y:= Y; +VertexBuffer[1].X:= rr.w + X; +VertexBuffer[1].Y:= Y; +VertexBuffer[2].X:= rr.w + X; +VertexBuffer[2].Y:= rr.h + Y; +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)); +end; + + +procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat); +begin + +glPushMatrix; +glTranslatef(X, Y, 0); +glScalef(Scale, Scale, 1); + +glBindTexture(GL_TEXTURE_2D, Texture^.id); + +glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb); +glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); +glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); + +glPopMatrix +end; + +procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); +begin + DrawRotatedTextureF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) +end; + +procedure DrawRotatedTextureF(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; + VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; +begin +// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) +if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then + exit; +if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then + exit; + +glPushMatrix; +glTranslatef(X, Y, 0); + +if Dir < 0 then + glRotatef(Angle, 0, 0, -1) +else + glRotatef(Angle, 0, 0, 1); + +glTranslatef(Dir*OffsetX, OffsetY, 0); +glScalef(Scale, Scale, 1); + +// Any reason for this call? And why only in t direction, not s? +//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + +if Dir < 0 then + hw:= w div -2 +else + hw:= w div 2; + +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; + +glBindTexture(GL_TEXTURE_2D, Texture^.id); + +VertexBuffer[0].X:= -hw; +VertexBuffer[0].Y:= w / -2; +VertexBuffer[1].X:= hw; +VertexBuffer[1].Y:= w / -2; +VertexBuffer[2].X:= hw; +VertexBuffer[2].Y:= w / 2; +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)); + +glPopMatrix +end; + +procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); +begin + DrawRotatedTex(SpritesData[Sprite].Texture, + SpritesData[Sprite].Width, + SpritesData[Sprite].Height, + X, Y, Dir, Angle) +end; + +procedure DrawRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); +begin +glPushMatrix; +glTranslatef(X, Y, 0); + +if Dir < 0 then + glRotatef(Angle, 0, 0, -1) +else + glRotatef(Angle, 0, 0, 1); +if Dir < 0 then glScalef(-1.0, 1.0, 1.0); + +DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); + +glPopMatrix +end; + +procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); +var VertexBuffer: array [0..3] of TVertex2f; +begin +// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) +if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then + exit; +if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then + exit; + +glPushMatrix; +glTranslatef(X, Y, 0); + +if Dir < 0 then + begin + hw:= - hw; + glRotatef(Angle, 0, 0, -1); + end else + glRotatef(Angle, 0, 0, 1); + + +glBindTexture(GL_TEXTURE_2D, Tex^.id); + +VertexBuffer[0].X:= -hw; +VertexBuffer[0].Y:= -hh; +VertexBuffer[1].X:= hw; +VertexBuffer[1].Y:= -hh; +VertexBuffer[2].X:= hw; +VertexBuffer[2].Y:= hh; +VertexBuffer[3].X:= -hw; +VertexBuffer[3].Y:= hh; + +glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); +glTexCoordPointer(2, GL_FLOAT, 0, @Tex^.tb); +glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); + +glPopMatrix +end; + +procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); +var row, col, numFramesFirstCol: LongInt; +begin +numFramesFirstCol:= SpritesData[Sprite].imageHeight div SpritesData[Sprite].Height; +row:= Frame mod numFramesFirstCol; +col:= Frame div numFramesFirstCol; +DrawSprite2 (Sprite, X, Y, col, row); +end; + +procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); +var r: TSDL_Rect; +begin +r.x:= 0; +r.y:= 0; +r.w:= SpritesData[Sprite].Width; +r.h:= SpritesData[Sprite].Height; + +if (X < LeftX) then + r.x:= LeftX - X; +if (Y < TopY) then + r.y:= TopY - Y; + +if (Y + SpritesData[Sprite].Height > BottomY) then + r.h:= BottomY - Y + 1; +if (X + SpritesData[Sprite].Width > RightX) then + r.w:= RightX - X + 1; + +dec(r.h, r.y); +dec(r.w, r.x); + +DrawFromRect(X + r.x, Y + r.y, @r, SpritesData[Sprite].Texture) +end; + +procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); +var r: TSDL_Rect; +begin + r.x:= FrameX * SpritesData[Sprite].Width; + r.w:= SpritesData[Sprite].Width; + r.y:= FrameY * SpritesData[Sprite].Height; + r.h:= SpritesData[Sprite].Height; + DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture) +end; + +procedure DrawCentered(X, Top: LongInt; Source: PTexture); +var scale: GLfloat; +begin + if (Source^.w + 20) > cScreenWidth then + scale:= cScreenWidth / (Source^.w + 20) + else + scale:= 1.0; + DrawTexture(X - round(Source^.w * scale) div 2, Top, Source, scale) +end; + +procedure DrawLine(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); +var VertexBuffer: array [0..3] of TVertex2f; +begin + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + + glPushMatrix; + glTranslatef(WorldDx, WorldDy, 0); + glLineWidth(Width); + + Tint(r, g, b, a); + VertexBuffer[0].X:= X0; + VertexBuffer[0].Y:= Y0; + VertexBuffer[1].X:= X1; + VertexBuffer[1].Y:= Y1; + + glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); + glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); + Tint($FF, $FF, $FF, $FF); + + glPopMatrix; + + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); +end; + +procedure DrawFillRect(r: TSDL_Rect); +var VertexBuffer: array [0..3] of TVertex2f; +begin +// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) +if (abs(r.x) > r.w) and ((abs(r.x + r.w / 2) - r.w / 2) * cScaleFactor > cScreenWidth) then + exit; +if (abs(r.y) > r.h) and ((abs(r.y + r.h / 2 - (0.5 * cScreenHeight)) - r.h / 2) * cScaleFactor > cScreenHeight) then + exit; + +glDisable(GL_TEXTURE_2D); + +Tint($00, $00, $00, $80); + +VertexBuffer[0].X:= r.x; +VertexBuffer[0].Y:= r.y; +VertexBuffer[1].X:= r.x + r.w; +VertexBuffer[1].Y:= r.y; +VertexBuffer[2].X:= r.x + r.w; +VertexBuffer[2].Y:= r.y + r.h; +VertexBuffer[3].X:= r.x; +VertexBuffer[3].Y:= r.y + r.h; + +glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); +glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); + +Tint($FF, $FF, $FF, $FF); +glEnable(GL_TEXTURE_2D) +end; + +procedure DrawCircle(X, Y, Radius: LongInt; Width: Single; r, g, b, a: Byte); +var + i: LongInt; + CircleVertex: array [0..359] of TVertex2f; +begin + for i := 0 to 359 do begin + CircleVertex[i].X := X + Radius*cos(i*pi/180); + CircleVertex[i].Y := Y + Radius*sin(i*pi/180); + end; + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glPushMatrix; + glLineWidth(Width); + Tint(r, g, b, a); + glVertexPointer(2, GL_FLOAT, 0, @CircleVertex[0]); + glDrawArrays(GL_LINE_LOOP, 0, 360); + Tint($FF, $FF, $FF, $FF); + glPopMatrix; + glEnable(GL_TEXTURE_2D); + glDisable(GL_LINE_SMOOTH); +end; + + +procedure Tint(r, g, b, a: Byte); inline; +var nc: Longword; +begin +nc:= (a shl 24) or (b shl 16) or (g shl 8) or r; +if nc = lastTint then + exit; +glColor4ub(r, g, b, a); +lastTint:= nc; +end; + +procedure Tint(c: Longword); inline; +begin +Tint(((c shr 16) and $FF), ((c shr 8) and $FF), (c and $FF), $FF); +end; + +end. diff -r 43945842da0c -r 91655618a510 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/uStore.pas Thu Nov 18 15:45:35 2010 +0300 @@ -27,24 +27,8 @@ procedure StoreLoad; procedure StoreRelease; -procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); -procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); -procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); -procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); -procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat = 1.0); -procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); -procedure DrawRotatedTextureF(Texture: PTexture; Scale, OffsetX, OffsetY: GLfloat; X, Y, Frame, Dir, w, h: LongInt; Angle: real); -procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); -procedure DrawRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); -procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); -procedure DrawCentered(X, Top: LongInt; Source: PTexture); -procedure DrawFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture); -procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); +procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); -procedure DrawLine(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); -procedure DrawFillRect(r: TSDL_Rect); -procedure DrawCircle(X, Y, Radius: LongInt; Width: Single; r, g, b, a: Byte); -procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); function CheckCJKFont(s: ansistring; font: THWFont): THWFont; function RenderStringTex(s: ansistring; Color: Longword; font: THWFont): PTexture; function RenderSpeechBubbleTex(s: ansistring; SpeechType: Longword; font: THWFont): PTexture; @@ -62,33 +46,15 @@ procedure RenderWeaponTooltip(atype: TAmmoType); procedure ShowWeaponTooltip(x, y: LongInt); procedure FreeWeaponTooltip; -procedure Tint(r, g, b, a: Byte); inline; -procedure Tint(c: Longword); inline; implementation -uses uMisc, uConsole, uLocale, uMobile, uVariables, uUtils, uTextures, uIO; +uses uMisc, uConsole, uLocale, uMobile, uVariables, uUtils, uTextures, uIO, uRender; type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple); var HHTexture: PTexture; MaxTextureSize: LongInt; cGPUVendor: TGPUVendor; - lastTint: Longword; - -procedure Tint(r, g, b, a: Byte); inline; -var nc: Longword; -begin -nc:= (a shl 24) or (b shl 16) or (g shl 8) or r; -if nc = lastTint then - exit; -glColor4ub(r, g, b, a); -lastTint:= nc; -end; - -procedure Tint(c: Longword); inline; -begin -Tint(((c shr 16) and $FF), ((c shr 8) and $FF), (c and $FF), $FF); -end; procedure DrawRoundRect(rect: PSDL_Rect; BorderColor, FillColor: Longword; Surface: PSDL_Surface; Clear: boolean); var r: TSDL_Rect; @@ -463,268 +429,6 @@ {$ENDIF} end; -procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture); -begin -DrawFromRect(X, Y, r^.w, r^.h, r, SourceTexture) -end; - -procedure DrawFromRect(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; -begin -if (SourceTexture^.h = 0) or (SourceTexture^.w = 0) then exit; - -// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) -if (abs(X) > W) and ((abs(X + W / 2) - W / 2) > cScreenWidth / cScaleFactor) then - exit; -if (abs(Y) > H) and ((abs(Y + H / 2 - (0.5 * cScreenHeight)) - H / 2) > cScreenHeight / cScaleFactor) then - exit; - -rr.x:= X; -rr.y:= Y; -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^.id); - -VertexBuffer[0].X:= X; -VertexBuffer[0].Y:= Y; -VertexBuffer[1].X:= rr.w + X; -VertexBuffer[1].Y:= Y; -VertexBuffer[2].X:= rr.w + X; -VertexBuffer[2].Y:= rr.h + Y; -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)); -end; - -procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat); -begin - -glPushMatrix; -glTranslatef(X, Y, 0); -glScalef(Scale, Scale, 1); - -glBindTexture(GL_TEXTURE_2D, Texture^.id); - -glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb); -glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb); -glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb)); - -glPopMatrix -end; - -procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); -begin - DrawRotatedTextureF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) -end; - -procedure DrawRotatedTextureF(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; - VertexBuffer, TextureBuffer: array [0..3] of TVertex2f; -begin -// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) -if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then - exit; -if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then - exit; - -glPushMatrix; -glTranslatef(X, Y, 0); - -if Dir < 0 then - glRotatef(Angle, 0, 0, -1) -else - glRotatef(Angle, 0, 0, 1); - -glTranslatef(Dir*OffsetX, OffsetY, 0); -glScalef(Scale, Scale, 1); - -// Any reason for this call? And why only in t direction, not s? -//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - -if Dir < 0 then - hw:= w div -2 -else - hw:= w div 2; - -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; - -glBindTexture(GL_TEXTURE_2D, Texture^.id); - -VertexBuffer[0].X:= -hw; -VertexBuffer[0].Y:= w / -2; -VertexBuffer[1].X:= hw; -VertexBuffer[1].Y:= w / -2; -VertexBuffer[2].X:= hw; -VertexBuffer[2].Y:= w / 2; -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)); - -glPopMatrix -end; - -procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real); -begin - DrawRotatedTex(SpritesData[Sprite].Texture, - SpritesData[Sprite].Width, - SpritesData[Sprite].Height, - X, Y, Dir, Angle) -end; - -procedure DrawRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real); -begin -glPushMatrix; -glTranslatef(X, Y, 0); - -if Dir < 0 then - glRotatef(Angle, 0, 0, -1) -else - glRotatef(Angle, 0, 0, 1); -if Dir < 0 then glScalef(-1.0, 1.0, 1.0); - -DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); - -glPopMatrix -end; - -procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real); -var VertexBuffer: array [0..3] of TVertex2f; -begin -// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) -if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then - exit; -if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then - exit; - -glPushMatrix; -glTranslatef(X, Y, 0); - -if Dir < 0 then - begin - hw:= - hw; - glRotatef(Angle, 0, 0, -1); - end else - glRotatef(Angle, 0, 0, 1); - - -glBindTexture(GL_TEXTURE_2D, Tex^.id); - -VertexBuffer[0].X:= -hw; -VertexBuffer[0].Y:= -hh; -VertexBuffer[1].X:= hw; -VertexBuffer[1].Y:= -hh; -VertexBuffer[2].X:= hw; -VertexBuffer[2].Y:= hh; -VertexBuffer[3].X:= -hw; -VertexBuffer[3].Y:= hh; - -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); -glTexCoordPointer(2, GL_FLOAT, 0, @Tex^.tb); -glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); - -glPopMatrix -end; - -procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); -begin -r.y:= r.y + Height * Position; -r.h:= Height; -DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture) -end; - -procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt); -var row, col, numFramesFirstCol: LongInt; -begin -numFramesFirstCol:= SpritesData[Sprite].imageHeight div SpritesData[Sprite].Height; -row:= Frame mod numFramesFirstCol; -col:= Frame div numFramesFirstCol; -DrawSprite2 (Sprite, X, Y, col, row); -end; - -procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt); -var r: TSDL_Rect; -begin -r.x:= 0; -r.y:= 0; -r.w:= SpritesData[Sprite].Width; -r.h:= SpritesData[Sprite].Height; - -if (X < LeftX) then - r.x:= LeftX - X; -if (Y < TopY) then - r.y:= TopY - Y; - -if (Y + SpritesData[Sprite].Height > BottomY) then - r.h:= BottomY - Y + 1; -if (X + SpritesData[Sprite].Width > RightX) then - r.w:= RightX - X + 1; - -dec(r.h, r.y); -dec(r.w, r.x); - -DrawFromRect(X + r.x, Y + r.y, @r, SpritesData[Sprite].Texture) -end; - -procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt); -var r: TSDL_Rect; -begin - r.x:= FrameX * SpritesData[Sprite].Width; - r.w:= SpritesData[Sprite].Width; - r.y:= FrameY * SpritesData[Sprite].Height; - r.h:= SpritesData[Sprite].Height; - DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture) -end; - -procedure DrawCentered(X, Top: LongInt; Source: PTexture); -var scale: GLfloat; -begin - if (Source^.w + 20) > cScreenWidth then - scale:= cScreenWidth / (Source^.w + 20) - else - scale:= 1.0; - DrawTexture(X - round(Source^.w * scale) div 2, Top, Source, scale) -end; - procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real); const VertexBuffer: array [0..3] of TVertex2f = ( (x: -16; y: -16), @@ -776,83 +480,6 @@ glPopMatrix end; -procedure DrawLine(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); -var VertexBuffer: array [0..3] of TVertex2f; -begin - glDisable(GL_TEXTURE_2D); - glEnable(GL_LINE_SMOOTH); - - glPushMatrix; - glTranslatef(WorldDx, WorldDy, 0); - glLineWidth(Width); - - Tint(r, g, b, a); - VertexBuffer[0].X:= X0; - VertexBuffer[0].Y:= Y0; - VertexBuffer[1].X:= X1; - VertexBuffer[1].Y:= Y1; - - glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); - glDrawArrays(GL_LINES, 0, Length(VertexBuffer)); - Tint($FF, $FF, $FF, $FF); - - glPopMatrix; - - glEnable(GL_TEXTURE_2D); - glDisable(GL_LINE_SMOOTH); -end; - -procedure DrawFillRect(r: TSDL_Rect); -var VertexBuffer: array [0..3] of TVertex2f; -begin -// don't draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs) -if (abs(r.x) > r.w) and ((abs(r.x + r.w / 2) - r.w / 2) * cScaleFactor > cScreenWidth) then - exit; -if (abs(r.y) > r.h) and ((abs(r.y + r.h / 2 - (0.5 * cScreenHeight)) - r.h / 2) * cScaleFactor > cScreenHeight) then - exit; - -glDisable(GL_TEXTURE_2D); - -Tint($00, $00, $00, $80); - -VertexBuffer[0].X:= r.x; -VertexBuffer[0].Y:= r.y; -VertexBuffer[1].X:= r.x + r.w; -VertexBuffer[1].Y:= r.y; -VertexBuffer[2].X:= r.x + r.w; -VertexBuffer[2].Y:= r.y + r.h; -VertexBuffer[3].X:= r.x; -VertexBuffer[3].Y:= r.y + r.h; - -glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]); -glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer)); - -Tint($FF, $FF, $FF, $FF); -glEnable(GL_TEXTURE_2D) -end; - -procedure DrawCircle(X, Y, Radius: LongInt; Width: Single; r, g, b, a: Byte); -var - i: LongInt; - CircleVertex: array [0..359] of TVertex2f; -begin - for i := 0 to 359 do begin - CircleVertex[i].X := X + Radius*cos(i*pi/180); - CircleVertex[i].Y := Y + Radius*sin(i*pi/180); - end; - glDisable(GL_TEXTURE_2D); - glEnable(GL_LINE_SMOOTH); - glPushMatrix; - glLineWidth(Width); - Tint(r, g, b, a); - glVertexPointer(2, GL_FLOAT, 0, @CircleVertex[0]); - glDrawArrays(GL_LINE_LOOP, 0, 360); - Tint($FF, $FF, $FF, $FF); - glPopMatrix; - glEnable(GL_TEXTURE_2D); - glDisable(GL_LINE_SMOOTH); -end; - procedure StoreRelease; var ii: TSprite; begin diff -r 43945842da0c -r 91655618a510 hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/uVisualGears.pas Thu Nov 18 15:45:35 2010 +0300 @@ -34,7 +34,7 @@ procedure AddDamageTag(X, Y, Damage, Color: LongWord); implementation -uses uMisc, uStore, uSound, uMobile, uVariables, uTextures; +uses uMisc, uStore, uSound, uMobile, uVariables, uTextures, uRender; const cExplFrameTicks = 110; diff -r 43945842da0c -r 91655618a510 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Thu Nov 18 12:12:51 2010 +0300 +++ b/hedgewars/uWorld.pas Thu Nov 18 15:45:35 2010 +0300 @@ -47,7 +47,8 @@ GLunit, uVariables, uUtils, - uTextures + uTextures, + uRender ; type TCaptionStr = record