# HG changeset patch # User unc0rr # Date 1201304015 0 # Node ID edf26e9554acf678f27520c207514ec549713344 # Parent 94ac148290857485f0aeb2847852aea9389b3600 Now show sprites too diff -r 94ac14829085 -r edf26e9554ac hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uConsts.pas Fri Jan 25 23:33:35 2008 +0000 @@ -18,7 +18,7 @@ unit uConsts; interface -uses SDLh, uLocale; +uses SDLh, GL, uLocale; {$INCLUDE options.inc} {$INCLUDE proto.inc} type @@ -83,6 +83,11 @@ Pos: LongWord; AmmoType: TAmmoType; end; + TTexture = record + id: GLuint; + w, h: LongInt; + end; + PTexture = ^TTexture; const @@ -233,101 +238,101 @@ SpritesData: array[TSprite] of record FileName: String[31]; Path, AltPath: TPathType; - Surface : PSDL_Surface; + Texture: PTexture; Width, Height: LongInt; hasAlpha: boolean; end = ( - (FileName: 'BlueWater'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'BlueWater'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 256; Height: 48; hasAlpha: false),// sprWater - (FileName: 'Clouds'; Path: ptCurrTheme; AltPath: ptGraphics; Surface: nil; + (FileName: 'Clouds'; Path: ptCurrTheme;AltPath: ptGraphics; Texture: nil; Width: 256; Height:128; hasAlpha: false),// sprCloud - (FileName: 'Bomb'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Bomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprBomb - (FileName: 'BigDigits'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'BigDigits'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: true),// sprBigDigit - (FileName: 'Frame'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Frame'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 4; Height: 32; hasAlpha: true),// sprFrame - (FileName: 'Lag'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Lag'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 65; Height: 65; hasAlpha: true),// sprLag - (FileName: 'Arrow'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Arrow'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprCursor - (FileName: 'Grenade'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Grenade'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprGrenade - (FileName: 'Targetp'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Targetp'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprTargetP - (FileName: 'UFO'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'UFO'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprUFO - (FileName: 'SmokeTrace'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'SmokeTrace'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: true),// sprSmokeTrace - (FileName: 'RopeHook'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'RopeHook'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprRopeHook - (FileName: 'Expl50'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Expl50'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 64; Height: 64; hasAlpha: false),// sprExplosion50 - (FileName: 'MineOff'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'MineOff'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprMineOff - (FileName: 'MineOn'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'MineOn'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprMineOn - (FileName: 'Case'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Case'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprCase - (FileName: 'FirstAid'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'FirstAid'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 48; Height: 48; hasAlpha: false),// sprFAid - (FileName: 'dynamite'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'dynamite'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprDynamite - (FileName: 'Power'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Power'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: true),// sprPower - (FileName: 'ClBomb'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'ClBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprClusterBomb - (FileName: 'ClParticle'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'ClParticle'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprClusterParticle - (FileName: 'Flame'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Flame'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 16; Height: 16; hasAlpha: false),// sprFlame - (FileName: 'horizont'; Path: ptCurrTheme; AltPath: ptNone; Surface: nil; + (FileName: 'horizont'; Path: ptCurrTheme; AltPath: ptNone; Texture: nil; Width: 0; Height: 0; hasAlpha: false),// sprHorizont - (FileName: 'Sky'; Path: ptCurrTheme; AltPath: ptNone; Surface: nil; + (FileName: 'Sky'; Path: ptCurrTheme; AltPath: ptNone; Texture: nil; Width: 0; Height: 0; hasAlpha: false),// sprSky - (FileName: 'BrdrLines'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + (FileName: 'BrdrLines'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Width: 202; Height: 1; hasAlpha: false),// sprAMBorders - (FileName: 'Slot'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + (FileName: 'Slot'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Width: 202; Height: 33; hasAlpha: false),// sprAMSlot - (FileName: 'AmmoName'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + (FileName: 'AmmoName'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Width: 202; Height: 33; hasAlpha: false),// sprAMSlotName - (FileName: 'Ammos'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + (FileName: 'Ammos'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprAMAmmos - (FileName: 'SlotKeys'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + (FileName: 'SlotKeys'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprAMSlotKeys - (FileName: 'Selection'; Path: ptAmmoMenu; AltPath: ptNone; Surface: nil; + (FileName: 'Selection'; Path: ptAmmoMenu; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprAMSelection - (FileName: 'Finger'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Finger'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 48; hasAlpha: false),// sprFinger - (FileName: 'AirBomb'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'AirBomb'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprAirBomb - (FileName: 'Airplane'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Airplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 125; Height: 42; hasAlpha: false),// sprAirplane - (FileName: 'amAirplane'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'amAirplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 64; Height: 32; hasAlpha: true),// sprAirplane - (FileName: 'amGirder'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'amGirder'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 160; Height:160; hasAlpha: false),// sprAmGirder - (FileName: 'hhMask'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'hhMask'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprHHTelepMask - (FileName: 'Switch'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Switch'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: true),// sprSwitch - (FileName: 'Parachute'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Parachute'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 48; Height: 48; hasAlpha: true),// sprParachute - (FileName: 'Target'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Target'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprTarget - (FileName: 'RopeNode'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'RopeNode'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 6; Height: 6; hasAlpha: false),// sprRopeNode - (FileName: 'Console'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'Console'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 256; Height:256; hasAlpha: false),// sprConsoleBG - (FileName: 'thinking'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'thinking'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 32; Height: 32; hasAlpha: false),// sprQuestion - (FileName: 'PowerBar'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'PowerBar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 256; Height: 32; hasAlpha: false),// sprPowerBar - (FileName: 'WindBar'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'WindBar'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 151; Height: 17; hasAlpha: false),// sprWindBar - (FileName: 'WindL'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'WindL'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 80; Height: 13; hasAlpha: false),// sprWindL - (FileName: 'WindR'; Path: ptGraphics; AltPath: ptNone; Surface: nil; + (FileName: 'WindR'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Width: 80; Height: 13; hasAlpha: false) // sprWindR ); diff -r 94ac14829085 -r edf26e9554ac hedgewars/uGears.pas --- a/hedgewars/uGears.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uGears.pas Fri Jan 25 23:33:35 2008 +0000 @@ -493,10 +493,10 @@ DrawSprite(sprQuestion, hwRound(Gear^.X) - 10 + WorldDx, hwRound(Gear^.Y) - cHHRadius - 34 + WorldDy, 0, Surface) else if ShowCrosshair and ((Gear^.State and gstAttacked) = 0) then - DrawSurfSprite(Round(hwRound(Gear^.X) + hwSign(Gear^.dX) * Sin(Gear^.Angle*pi/cMaxAngle)*60) + WorldDx - 11, +(* DrawSurfSprite(Round(hwRound(Gear^.X) + hwSign(Gear^.dX) * Sin(Gear^.Angle*pi/cMaxAngle)*60) + WorldDx - 11, Round(hwRound(Gear^.Y) - Cos(Gear^.Angle*pi/cMaxAngle)*60) + WorldDy - 12, 24, (18 + hwSign(Gear^.dX) * LongInt(((Gear^.Angle * 72 div cMaxAngle) + 1) div 2) mod 18) mod 18, - Team^.CrosshairSurf, Surface); + Team^.CrosshairSurf, Surface);*) end; end; @@ -578,7 +578,7 @@ gtAmmo_Grenade: DrawSprite(sprGrenade , hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, DxDy2Angle32(Gear^.dY, Gear^.dX), Surface); gtHealthTag, gtSmallDamage: if Gear^.Surf <> nil then DrawCentered(hwRound(Gear^.X) + WorldDx, hwRound(Gear^.Y) + WorldDy, Gear^.Surf, Surface); - gtGrave: DrawSurfSprite(hwRound(Gear^.X) + WorldDx - 16, hwRound(Gear^.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, PHedgehog(Gear^.Hedgehog)^.Team^.GraveSurf, Surface); + gtGrave: ;//DrawSurfSprite(hwRound(Gear^.X) + WorldDx - 16, hwRound(Gear^.Y) + WorldDy - 16, 32, (GameTicks shr 7) and 7, PHedgehog(Gear^.Hedgehog)^.Team^.GraveSurf, Surface); gtUFO: DrawSprite(sprUFO, hwRound(Gear^.X) - 16 + WorldDx, hwRound(Gear^.Y) - 16 + WorldDy, (GameTicks shr 7) mod 4, Surface); gtRope: begin roplen:= 0; diff -r 94ac14829085 -r edf26e9554ac hedgewars/uLand.pas --- a/hedgewars/uLand.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uLand.pas Fri Jan 25 23:33:35 2008 +0000 @@ -18,21 +18,21 @@ unit uLand; interface -uses SDLh, uLandTemplates, uFloat, GL; +uses SDLh, uLandTemplates, uFloat, GL, uConsts; {$include options.inc} type TLandArray = packed array[0..1023, 0..2047] of LongWord; TPreview = packed array[0..127, 0..31] of byte; var Land: TLandArray; LandSurface: PSDL_Surface; - LandTexture: GLuint; + LandTexture: PTexture; procedure GenMap; function GenPreview: TPreview; procedure CheckLandDigest(s: shortstring); implementation -uses uConsole, uStore, uMisc, uConsts, uRandom, uTeams, uLandObjects, uSHA, uIO; +uses uConsole, uStore, uMisc, uRandom, uTeams, uLandObjects, uSHA, uIO; type TPixAr = record Count: Longword; diff -r 94ac14829085 -r edf26e9554ac hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uLandGraphics.pas Fri Jan 25 23:33:35 2008 +0000 @@ -321,12 +321,12 @@ end; function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean): boolean; -var X, Y, bpp, h, w: LongInt; +(*var X, Y, bpp, h, w: LongInt; p: PByteArray; r, rr: TSDL_Rect; - Image: PSDL_Surface; + Image: PSDL_Surface;*) begin -Image:= SpritesData[Obj].Surface; +(*Image:= SpritesData[Obj].Surface; w:= SpritesData[Obj].Width; h:= SpritesData[Obj].Height; @@ -421,7 +421,7 @@ r.h:= SpritesData[Obj].Height; rr.x:= cpX; rr.y:= cpY; -SDL_UpperBlit(Image, @r, LandSurface, @rr) +SDL_UpperBlit(Image, @r, LandSurface, @rr)*) end; diff -r 94ac14829085 -r edf26e9554ac hedgewars/uMisc.pas --- a/hedgewars/uMisc.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uMisc.pas Fri Jan 25 23:33:35 2008 +0000 @@ -116,7 +116,7 @@ procedure SetLittle(var r: hwFloat); procedure SendStat(sit: TStatInfoType; s: shortstring); function Str2PChar(const s: shortstring): PChar; -function Surface2Tex(surf: PSDL_Surface): GLuint; +function Surface2Tex(surf: PSDL_Surface): PTexture; var CursorPoint: TPoint; TargetPoint: TPoint = (X: NoPointX; Y: 0); @@ -254,24 +254,28 @@ RectToStr:= '(x: ' + inttostr(rect.x) + '; y: ' + inttostr(rect.y) + '; w: ' + inttostr(rect.w) + '; h: ' + inttostr(rect.h) + ')' end; -function Surface2Tex(surf: PSDL_Surface): GLuint; +function Surface2Tex(surf: PSDL_Surface): PTexture; var mode: LongInt; texId: GLuint; begin if SDL_MustLock(surf) then SDLTry(SDL_LockSurface(surf) >= 0, true); +new(Surface2Tex); +Surface2Tex^.w:= surf^.w; +Surface2Tex^.h:= surf^.h; + if (surf^.format^.BytesPerPixel = 3) then mode:= GL_RGB else if (surf^.format^.BytesPerPixel = 4) then mode:= GL_RGBA else begin - TryDo(false, 'Surface2Tex: BytePerPixel not in [3, 4]', true); - Surface2Tex:= 0; + TryDo(false, 'Surface2Tex: BytePerPixel not in [3, 4]', false); + Surface2Tex^.id:= 0; exit end; -glGenTextures(1, @texId); +glGenTextures(1, @Surface2Tex^.id); -glBindTexture(GL_TEXTURE_2D, texId); +glBindTexture(GL_TEXTURE_2D, Surface2Tex^.id); glTexImage2D(GL_TEXTURE_2D, 0, mode, surf^.w, surf^.h, 0, mode, GL_UNSIGNED_BYTE, surf^.pixels); @@ -279,9 +283,7 @@ SDL_UnlockSurface(surf); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); -glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - -Surface2Tex:= texId +glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) end; diff -r 94ac14829085 -r edf26e9554ac hedgewars/uStore.pas --- a/hedgewars/uStore.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uStore.pas Fri Jan 25 23:33:35 2008 +0000 @@ -18,7 +18,7 @@ unit uStore; interface -uses uConsts, uTeams, SDLh, uFloat; +uses uConsts, uTeams, SDLh, uFloat, GL; {$INCLUDE options.inc} procedure StoreInit; @@ -27,11 +27,11 @@ procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt; Surface: PSDL_Surface); procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt; Surface: PSDL_Surface); procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt; Surface: PSDL_Surface); -procedure DrawSurfSprite(X, Y, Height, Frame: LongInt; Source, Surface: PSDL_Surface); +procedure DrawSurfSprite(X, Y, Height, Frame: LongInt; Source: GLuint; Surface: PSDL_Surface); procedure DrawLand (X, Y: LongInt; Surface: PSDL_Surface); procedure DXOutText(X, Y: LongInt; Font: THWFont; s: string; Surface: PSDL_Surface); procedure DrawCentered(X, Top: LongInt; Source, Surface: PSDL_Surface); -procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceSurface, DestSurface: PSDL_Surface); +procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture; DestSurface: PSDL_Surface); procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Surface: PSDL_Surface); function RenderString(s: string; Color: Longword; font: THWFont): PSDL_Surface; procedure RenderHealth(var Hedgehog: THedgehog); @@ -45,7 +45,7 @@ PauseSurface: PSDL_Surface; implementation -uses uMisc, uConsole, uLand, uLocale, GL, GLU; +uses uMisc, uConsole, uLand, uLocale, GLU; var HHSurface: PSDL_Surface; @@ -196,9 +196,9 @@ end; procedure GetSkyColor; - var p: PByteArray; +// var p: PByteArray; begin - if SDL_MustLock(SpritesData[sprSky].Surface) then +(* if SDL_MustLock(SpritesData[sprSky].Surface) then SDLTry(SDL_LockSurface(SpritesData[sprSky].Surface) >= 0, true); p:= SpritesData[sprSky].Surface^.pixels; case SpritesData[sprSky].Surface^.format^.BytesPerPixel of @@ -206,11 +206,12 @@ 2: cSkyColor:= PWord(p)^; 3: cSkyColor:= (p^[0]) or (p^[1] shl 8) or (p^[2] shl 16); 4: cSkyColor:= PLongword(p)^; - end; + end;*) + cSkyColor:= $3030A0; glClearColor((cSkyColor shr 16) / 255, ((cSkyColor shr 8) and $FF) / 255, (cSkyColor and $FF) / 255, 0); - if SDL_MustLock(SpritesData[sprSky].Surface) then - SDL_UnlockSurface(SpritesData[sprSky].Surface) +// if SDL_MustLock(SpritesData[sprSky].Surface) then +// SDL_UnlockSurface(SpritesData[sprSky].Surface) end; procedure GetExplosionBorderColor; @@ -268,14 +269,15 @@ with SpritesData[ii] do begin if AltPath = ptNone then - Surface:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, true, true) + tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, true, true) else begin - Surface:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, false, true); - if Surface = nil then - Surface:= LoadImage(Pathz[AltPath] + '/' + FileName, hasAlpha, true, true) + tmpsurf:= LoadImage(Pathz[Path] + '/' + FileName, hasAlpha, false, true); + if tmpsurf = nil then + tmpsurf:= LoadImage(Pathz[AltPath] + '/' + FileName, hasAlpha, true, true) end; - if Width = 0 then Width:= Surface^.w; - if Height = 0 then Height:= Surface^.h + if Width = 0 then Width:= tmpsurf^.w; + if Height = 0 then Height:= tmpsurf^.h; + Texture:= Surface2Tex(tmpsurf) end; GetSkyColor; @@ -294,30 +296,53 @@ {$ENDIF} end; -procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceSurface, DestSurface: PSDL_Surface); +procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture; DestSurface: PSDL_Surface); var rr: TSDL_Rect; + t, b: real; begin rr.x:= X; rr.y:= Y; rr.w:= r^.w; rr.h:= r^.h; -if SDL_UpperBlit(SourceSurface, r, DestSurface, @rr) < 0 then - begin - OutError('Blit: ' + SDL_GetError, true); - exit - end; + +t:= r^.y / SourceTexture^.h; +b:= (r^.y + r^.h) / SourceTexture^.h; + +glBindTexture(GL_TEXTURE_2D, SourceTexture^.id); +glEnable(GL_TEXTURE_2D); + +glBegin(GL_QUADS); + +glTexCoord2f(0, t); +glVertex2i(X, Y); + +glTexCoord2f(1, t); +glVertex2i(rr.w + X, Y); + +glTexCoord2f(1, b); +glVertex2i(rr.w + X, rr.h + Y); + +glTexCoord2f(0, b); +glVertex2i(X, rr.h + Y); + +glEnd(); end; procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt; Surface: PSDL_Surface); begin r.y:= r.y + Height * Position; r.h:= Height; -DrawFromRect(X, Y, @r, SpritesData[Sprite].Surface, Surface) +DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture, Surface) end; procedure DrawSprite (Sprite: TSprite; X, Y, Frame: LongInt; Surface: PSDL_Surface); +var r: TSDL_Rect; begin -DrawSurfSprite(X, Y, SpritesData[Sprite].Height, Frame, SpritesData[Sprite].Surface, Surface) +r.x:= 0; +r.w:= SpritesData[Sprite].Width; +r.y:= Frame * SpritesData[Sprite].Height; +r.h:= SpritesData[Sprite].Height; +DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture, Surface) end; procedure DrawSprite2(Sprite: TSprite; X, Y, FrameX, FrameY: LongInt; Surface: PSDL_Surface); @@ -327,17 +352,17 @@ r.w:= SpritesData[Sprite].Width; r.y:= FrameY * SpritesData[Sprite].Height; r.h:= SpritesData[Sprite].Height; -DrawFromRect(X, Y, @r, SpritesData[Sprite].Surface, Surface) +DrawFromRect(X, Y, @r, SpritesData[Sprite].Texture, Surface) end; -procedure DrawSurfSprite(X, Y, Height, Frame: LongInt; Source, Surface: PSDL_Surface); -var r: TSDL_Rect; +procedure DrawSurfSprite(X, Y, Height, Frame: LongInt; Source: GLuint; Surface: PSDL_Surface); +//var r: TSDL_Rect; begin -r.x:= 0; -r.w:= Source^.w; -r.y:= Frame * Height; -r.h:= Height; -DrawFromRect(X, Y, @r, Source, Surface) +//r.x:= 0; +//r.w:= Source^.w; +//r.y:= Frame * Height; +//r.h:= Height; +//DrawFromRect(X, Y, @r, Source, Surface) end; procedure DXOutText(X, Y: LongInt; Font: THWFont; s: string; Surface: PSDL_Surface); @@ -361,30 +386,26 @@ end; procedure DrawLand(X, Y: LongInt; Surface: PSDL_Surface); -const r: TSDL_Rect = (x: 0; y: 0; w: 2048; h: 1024); +//const r: TSDL_Rect = (x: 0; y: 0; w: 2048; h: 1024); begin -glBindTexture(GL_TEXTURE_2D, LandTexture); +glBindTexture(GL_TEXTURE_2D, LandTexture^.id); glEnable(GL_TEXTURE_2D); - glBegin(GL_QUADS); +glBegin(GL_QUADS); - // top left - glTexCoord2i(0, 0); - glVertex2i(X, Y); +glTexCoord2i(0, 0); +glVertex2i(X, Y); - // top right - glTexCoord2i(1, 0); - glVertex2i(2048 + X, Y); +glTexCoord2i(1, 0); +glVertex2i(2048 + X, Y); - // bottom right - glTexCoord2i(1, 1); - glVertex2i(2048 + X, 1024 + Y); +glTexCoord2i(1, 1); +glVertex2i(2048 + X, 1024 + Y); - // bottom left - glTexCoord2i(0, 1); - glVertex2i(X, 1024 + Y); +glTexCoord2i(0, 1); +glVertex2i(X, 1024 + Y); - glEnd(); +glEnd(); //DrawFromRect(X, Y, @r, LandSurface, Surface) end; @@ -406,14 +427,14 @@ if Dir = -1 then r.x:= HHSurface^.w - 32 - r.x; r.w:= 32; r.h:= 32; -DrawFromRect(X, Y, @r, HHSurface, Surface) +//DrawFromRect(X, Y, @r, HHSurface, Surface) end; procedure StoreRelease; var ii: TSprite; begin for ii:= Low(TSprite) to High(TSprite) do - SDL_FreeSurface(SpritesData[ii].Surface); + glDeleteTextures(1, @SpritesData[ii].Texture); SDL_FreeSurface( HHSurface ); SDL_FreeSurface(LandSurface ) end; @@ -502,8 +523,8 @@ r.w:= ProgrSurf^.w; r.h:= ProgrSurf^.w; r.y:= (Step mod (ProgrSurf^.h div ProgrSurf^.w)) * ProgrSurf^.w; -DrawFromRect((cScreenWidth - ProgrSurf^.w) div 2, - (cScreenHeight - ProgrSurf^.w) div 2, @r, ProgrSurf, SDLPrimSurface); +//DrawFromRect((cScreenWidth - ProgrSurf^.w) div 2, +// (cScreenHeight - ProgrSurf^.w) div 2, @r, ProgrSurf, SDLPrimSurface); SDL_Flip(SDLPrimSurface); inc(Step); end; diff -r 94ac14829085 -r edf26e9554ac hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Fri Jan 25 21:55:48 2008 +0000 +++ b/hedgewars/uWorld.pas Fri Jan 25 23:33:35 2008 +0000 @@ -182,8 +182,8 @@ // SDL_FillRect(Surface, @r, cSkyColor) end; // background -//DrawRepeated(sprSky, WorldDx * 3 div 8); -//DrawRepeated(sprHorizont, WorldDx * 3 div 5); +DrawRepeated(sprSky, WorldDx * 3 div 8); +DrawRepeated(sprHorizont, WorldDx * 3 div 5); // Waves {$WARNINGS OFF} @@ -203,7 +203,7 @@ // SDL_FillRect(Surface, @r, cWaterColor) end; -//DrawGears(Surface); +DrawGears(Surface); // Waves {$WARNINGS OFF}