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;