Some work on zooming. Hedgewars are now unplayable.
authorunc0rr
Sat, 13 Jun 2009 15:30:40 +0000
changeset 2161 0c8634241fa4
parent 2160 c83e8608dfd7
child 2162 2bce91404d49
Some work on zooming. Hedgewars are now unplayable.
hedgewars/hwengine.dpr
hedgewars/uChat.pas
hedgewars/uStore.pas
hedgewars/uWorld.pas
--- a/hedgewars/hwengine.dpr	Sat Jun 13 11:32:23 2009 +0000
+++ b/hedgewars/hwengine.dpr	Sat Jun 13 15:30:40 2009 +0000
@@ -97,6 +97,7 @@
 				end;
 			FinishProgress;
 			PlayMusic;
+			SetScale(1.5);
 			GameState:= gsGame
 			end;
 	gsConfirm,
--- a/hedgewars/uChat.pas	Sat Jun 13 11:32:23 2009 +0000
+++ b/hedgewars/uChat.pas	Sat Jun 13 15:30:40 2009 +0000
@@ -93,7 +93,7 @@
 t:= 0;
 i:= lastStr;
 
-r.x:= 6;
+r.x:= 6 - cScreenWidth div 2;
 r.y:= (visibleCount - t) * 16 + 10;
 r.h:= 16;
 
@@ -102,7 +102,7 @@
 	begin
 	r.w:= InputStr.Width;
 	DrawFillRect(r);
-	DrawTexture(8, visibleCount * 16 + 10, InputStr.Tex);
+	DrawTexture(8 - cScreenWidth div 2, visibleCount * 16 + 10, InputStr.Tex);
 	end;
 
 dec(r.y, 16);
@@ -118,7 +118,7 @@
 	begin
 	r.w:= Strs[i].Width;
 	DrawFillRect(r);
-	DrawTexture(8, (visibleCount - t) * 16 - 6, Strs[i].Tex);
+	DrawTexture(8 - cScreenWidth div 2, (visibleCount - t) * 16 - 6, Strs[i].Tex);
 	dec(r.y, 16);
 	
 	if i = 0 then i:= MaxStrIndex else dec(i);
--- a/hedgewars/uStore.pas	Sat Jun 13 11:32:23 2009 +0000
+++ b/hedgewars/uStore.pas	Sat Jun 13 15:30:40 2009 +0000
@@ -55,14 +55,17 @@
 procedure FinishProgress;
 function  LoadImage(const filename: string; hasAlpha, critical, setTransparent: boolean): PSDL_Surface;
 procedure SetupOpenGL;
+procedure SetScale(f: GLfloat);
+
 
 var PixelFormat: PSDL_PixelFormat = nil;
  SDLPrimSurface: PSDL_Surface = nil;
    PauseTexture,
    ConfirmTexture: PTexture;
+   cScaleFactor: GLfloat = 2.0;
 
 implementation
-uses uMisc, uConsole, uLand, uLocale;
+uses uMisc, uConsole, uLand, uLocale, uWorld;
 
 var
     HHTexture: PTexture;
@@ -910,10 +913,7 @@
 
 procedure SetupOpenGL;
 begin
-glLoadIdentity;
-glViewport(0, 0, cScreenWidth, cScreenHeight);
-glScalef(2.0 / cScreenWidth, -2.0 / cScreenHeight, 1.0);
-glTranslatef(-cScreenWidth / 2, -cScreenHeight / 2, 0);
+SetScale(2.0);
 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 glMatrixMode(GL_MODELVIEW);
 
@@ -923,6 +923,18 @@
 {$ENDIF}
 end;
 
+procedure SetScale(f: GLfloat);
+begin
+cScaleFactor:= f;
+cWaterSprCount:= 1 + round(cScreenWidth * 2 / cScaleFactor / SpritesData[sprWater].Width);
+
+glLoadIdentity;
+glViewport(0, 0, cScreenWidth, cScreenHeight);
+glScalef(f / cScreenWidth, -f / cScreenHeight, 1.0);
+//glTranslatef(-cScreenWidth / 2, -cScreenHeight / 2, 0);
+glTranslatef(0, -cScreenHeight / 2, 0);
+end;
+
 ////////////////////////////////////////////////////////////////////////////////
 var ProgrTex: PTexture = nil;
     Step: integer = 0;
@@ -945,7 +957,7 @@
 r.w:= ProgrTex^.w;
 r.h:= ProgrTex^.w;
 r.y:= (Step mod (ProgrTex^.h div ProgrTex^.w)) * ProgrTex^.w;
-DrawFromRect((cScreenWidth - ProgrTex^.w) div 2,
+DrawFromRect( -ProgrTex^.w div 2,
              (cScreenHeight - ProgrTex^.w) div 2, @r, ProgrTex);
 glDisable(GL_TEXTURE_2D);
 SDL_GL_SwapBuffers();
--- a/hedgewars/uWorld.pas	Sat Jun 13 11:32:23 2009 +0000
+++ b/hedgewars/uWorld.pas	Sat Jun 13 15:30:40 2009 +0000
@@ -37,6 +37,7 @@
 	bShowFinger: boolean = false;
 	Frames: Longword = 0;
 	WaterColor, DeepWaterColor: TSDL_Color;
+	cWaterSprCount: LongInt;
 
 implementation
 uses uStore, uMisc, uTeams, uIO, uConsole, uKeys, uLocale, uSound,
@@ -57,7 +58,7 @@
                    EndTime: LongWord;
                    end;
 
-var cWaterSprCount, cWaveWidth, cWaveHeight: LongInt;
+var cWaveWidth, cWaveHeight: LongInt;
 	Captions: array[TCapGroup] of TCaptionStr;
 	AMxShift, SlotsNum: LongInt;
 	tmpSurface: PSDL_Surface;
@@ -67,7 +68,6 @@
 begin
 cWaveWidth:= SpritesData[sprWater].Width;
 cWaveHeight:= SpritesData[sprWater].Height;
-cWaterSprCount:= 1 + cScreenWidth div cWaveWidth;
 cGearScrEdgesDist:= Min(cScreenWidth div 2 - 100, cScreenHeight div 2 - 50);
 SDL_WarpMouse(cScreenWidth div 2, cScreenHeight div 2);
 prevPoint.X:= cScreenWidth div 2;
@@ -113,7 +113,7 @@
 	begin
 	if Ammo = nil then exit;
 	SlotsNum:= 0;
-	x:= cScreenWidth - 210 + AMxShift;
+	x:= cScreenWidth div 2 - 210 + AMxShift;
 	y:= cScreenHeight - 40;
 	dec(y);
 	DrawSprite(sprAMBorders, x, y, 0);
@@ -157,7 +157,7 @@
 	if (Pos >= 0) then
 		if Ammo^[Slot, Pos].Count > 0 then
 		begin
-		DrawTexture(cScreenWidth - 200 + AMxShift, cScreenHeight - 68, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex);
+		DrawTexture(cScreenWidth div 2 - 200 + AMxShift, cScreenHeight - 68, Ammoz[Ammo^[Slot, Pos].AmmoType].NameTex);
 		
 		if Ammo^[Slot, Pos].Count < AMMO_INFINITE then
 			DrawTexture(cScreenWidth + AMxShift - 35, cScreenHeight - 68, CountTexz[Ammo^[Slot, Pos].Count]);
@@ -181,22 +181,25 @@
 procedure DrawWater;
 var VertexBuffer: array [0..3] of TVertex2f;
     r: TSDL_Rect;
+    lw, lh: GLfloat;
 begin
+lw:= cScreenWidth / cScaleFactor;
+lh:= cScreenHeight * 2 / cScaleFactor;
 // Water
 r.y:= WorldDy + cWaterLine + 32;
-if r.y < cScreenHeight then
+if r.y < cScreenHeight * 2 / cScaleFactor then
 	begin
 	if r.y < 0 then r.y:= 0;
 
 	glDisable(GL_TEXTURE_2D);
-	VertexBuffer[0].X:= 0;
+	VertexBuffer[0].X:= -lw;
 	VertexBuffer[0].Y:= r.y;
-	VertexBuffer[1].X:= cScreenWidth;
+	VertexBuffer[1].X:= lw;
 	VertexBuffer[1].Y:= r.y;
-	VertexBuffer[2].X:= cScreenWidth;
-	VertexBuffer[2].Y:= cScreenHeight;
-	VertexBuffer[3].X:= 0;
-	VertexBuffer[3].Y:= cScreenHeight;
+	VertexBuffer[2].X:= lw;
+	VertexBuffer[2].Y:= lh;
+	VertexBuffer[3].X:= -lw;
+	VertexBuffer[3].Y:= lh;
 
 	glEnableClientState (GL_COLOR_ARRAY);
 	glColorPointer(3, GL_UNSIGNED_BYTE, 0, @WaterColorArray[0]);
@@ -222,15 +225,18 @@
     s: string[15];
 
     procedure DrawRepeated(spr: TSprite; Shift: LongInt);
-    var i, w: LongInt;
+    var i, w, sw: LongInt;
     begin
+    sw:= round(cScreenWidth / cScaleFactor);
     w:= SpritesData[spr].Width;
     i:= Shift mod w;
     if i > 0 then dec(i, w);
+    dec(i, sw);
+    //addfilelog(inttostr(sw));
     repeat
       DrawSprite(spr, i, WorldDy + LAND_HEIGHT - SpritesData[spr].Height, 0);
       inc(i, w)
-    until i > cScreenWidth
+    until i > sw
     end;
 
 begin
@@ -253,8 +259,8 @@
 
     // Waves
     {$WARNINGS OFF}
-    for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx + (RealTicks shr 6)      ) mod cWaveWidth), cWaterLine + WorldDy - (cWaveHeight*2), 0);
-    for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth + ((WorldDx - (RealTicks shr 6) + 100) mod cWaveWidth), cWaterLine + WorldDy - (cWaveHeight + cWaveHeight div 2), 0);
+//    for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx + (RealTicks shr 6)      ) mod cWaveWidth), cWaterLine + WorldDy - (cWaveHeight*2), 0);
+//    for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth + ((WorldDx - (RealTicks shr 6) + 100) mod cWaveWidth), cWaterLine + WorldDy - (cWaveHeight + cWaveHeight div 2), 0);
     {$WARNINGS ON}
     end;
 
@@ -291,10 +297,17 @@
 
 // Waves
 {$WARNINGS OFF}
-for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx + (RealTicks shr 6) +  25) mod cWaveWidth), cWaterLine + WorldDy - cWaveHeight, 0);
-for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx - (RealTicks shr 6) +  50) mod cWaveWidth), cWaterLine + WorldDy - (cWaveHeight div 2), 0);
-for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx + (RealTicks shr 6) +  75) mod cWaveWidth), cWaterLine + WorldDy     , 0);
+//for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx + (RealTicks shr 6) +  25) mod cWaveWidth), cWaterLine + WorldDy - cWaveHeight, 0);
+//for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx - (RealTicks shr 6) +  50) mod cWaveWidth), cWaterLine + WorldDy - (cWaveHeight div 2), 0);
+//for i:= -1 to cWaterSprCount do DrawSprite(sprWater,  i * cWaveWidth  + ((WorldDx + (RealTicks shr 6) +  75) mod cWaveWidth), cWaterLine + WorldDy     , 0);
+
+
+// Target
+if TargetPoint.X <> NoPointX then DrawSprite(sprTargetP, TargetPoint.X + WorldDx - 16, TargetPoint.Y + WorldDy - 16, 0);
+
 {$WARNINGS ON}
+SetScale(2.0);
+
 // Turn time
 if TurnTimeLeft <> 0 then
    begin
@@ -302,28 +315,23 @@
    if i>99 then t:= 112
       else if i>9 then t:= 96
                   else t:= 80;
-   DrawSprite(sprFrame, t, cScreenHeight - 48, 1);
+   DrawSprite(sprFrame, -cScreenWidth div 2 + t, cScreenHeight - 48, 1);
    while i > 0 do
          begin
          dec(t, 32);
-         DrawSprite(sprBigDigit, t, cScreenHeight - 48, i mod 10);
+         DrawSprite(sprBigDigit, -cScreenWidth div 2 + t, cScreenHeight - 48, i mod 10);
          i:= i div 10
          end;
-   DrawSprite(sprFrame, t - 4, cScreenHeight - 48, 0);
+   DrawSprite(sprFrame, -cScreenWidth div 2 + t - 4, cScreenHeight - 48, 0);
    end;
 
-// Target
-if TargetPoint.X <> NoPointX then DrawSprite(sprTargetP, TargetPoint.X + WorldDx - 16, TargetPoint.Y + WorldDy - 16, 0);
-
-//glPopMatrix;
-
 // Captions
 i:= 8;
 for grp:= Low(TCapGroup) to High(TCapGroup) do
     with Captions[grp] do
          if Tex <> nil then
             begin
-            DrawCentered(cScreenWidth div 2, i, Tex);
+            DrawCentered(0, i, Tex);
             inc(i, Tex^.h + 2);
             if EndTime <= RealTicks then
                begin
@@ -337,30 +345,30 @@
 for t:= 0 to Pred(TeamsCount) do
    with TeamsArray[t]^ do
       begin
-      DrawTexture(cScreenWidth div 2 - NameTagTex^.w - 3, cScreenHeight + DrawHealthY, NameTagTex);
+      DrawTexture(- NameTagTex^.w - 3, cScreenHeight + DrawHealthY, NameTagTex);
 
       r.x:= 0;
       r.y:= 0;
       r.w:= 2 + TeamHealthBarWidth;
       r.h:= HealthTex^.h;
 
-      DrawFromRect(cScreenWidth div 2,
+      DrawFromRect(0,
                         cScreenHeight + DrawHealthY,
                         @r, HealthTex);
 
       inc(r.x, cTeamHealthWidth + 2);
       r.w:= 3;
 
-      DrawFromRect(cScreenWidth div 2 + TeamHealthBarWidth + 2,
+      DrawFromRect(TeamHealthBarWidth + 2,
                         cScreenHeight + DrawHealthY,
                         @r, HealthTex);
       end;
 
 // Lag alert
-if isInLag then DrawSprite(sprLag, 32, 32, (RealTicks shr 7) mod 12);
+if isInLag then DrawSprite(sprLag, 32 - cScreenWidth div 2, 32, (RealTicks shr 7) mod 12);
 
 // Wind bar
-DrawSprite(sprWindBar, cScreenWidth - 180, cScreenHeight - 30, 0);
+DrawSprite(sprWindBar, cScreenWidth div 2 - 180, cScreenHeight - 30, 0);
 if WindBarWidth > 0 then
    begin
    {$WARNINGS OFF}
@@ -369,7 +377,7 @@
    r.y:= 0;
    r.w:= WindBarWidth;
    r.h:= 13;
-   DrawSpriteFromRect(sprWindR, r, cScreenWidth - 103, cScreenHeight - 28, 13, 0);
+   DrawSpriteFromRect(sprWindR, r, cScreenWidth div 2 - 103, cScreenHeight - 28, 13, 0);
    end else
  if WindBarWidth < 0 then
    begin
@@ -379,7 +387,7 @@
    r.y:= 0;
    r.w:= - WindBarWidth;
    r.h:= 13;
-   DrawSpriteFromRect(sprWindL, r, cScreenWidth - 106 + WindBarWidth, cScreenHeight - 28, 13, 0);
+   DrawSpriteFromRect(sprWindL, r, cScreenWidth div 2 - 106 + WindBarWidth, cScreenHeight - 28, 13, 0);
    end;
 
 // AmmoMenu
@@ -424,7 +432,7 @@
       SDL_FreeSurface(tmpSurface)
       end;
    if fpsTexture <> nil then
-      DrawTexture(cScreenWidth - 50, 10, fpsTexture);
+      DrawTexture(cScreenWidth div 2 - 50, 10, fpsTexture);
    end;
 
 inc(SoundTimerTicks, Lag);
@@ -438,7 +446,9 @@
       end
    end;
 
-if GameState = gsConfirm then DrawCentered(cScreenWidth div 2, cScreenHeight div 2, ConfirmTexture);
+if GameState = gsConfirm then DrawCentered(0, cScreenHeight div 2, ConfirmTexture);
+
+SetScale(1.5);
 
 glDisable(GL_TEXTURE_2D);
 glDisable(GL_BLEND)
@@ -460,10 +470,18 @@
 
 procedure MoveCamera;
 const PrevSentPointTime: LongWord = 0;
-var EdgesDist: LongInt;
+var EdgesDist, cw: LongInt;
 begin
+cw:= round(cScreenWidth / cScaleFactor);
+
+
 if (not (CurrentTeam^.ExtDriven and isCursorVisible))
-	and cHasFocus then SDL_GetMouseState(@CursorPoint.X, @CursorPoint.Y);
+	and cHasFocus then
+	begin
+	SDL_GetMouseState(@CursorPoint.X, @CursorPoint.Y);
+//	CursorPoint.X:= round((CursorPoint.X - cScreenWidth / 2) * 2 / cScaleFactor);
+//	CursorPoint.Y:= round(CursorPoint.Y * 2 / cScaleFactor);
+	end;
 
 if (FollowGear <> nil) and (not isCursorVisible) then
 	if abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y) > 4 then
@@ -504,14 +522,14 @@
    begin
    if isCursorVisible then EdgesDist:= cCursorEdgesDist
                       else EdgesDist:= cGearScrEdgesDist;
-   if CursorPoint.X < EdgesDist then
+   if CursorPoint.X < - cw + EdgesDist then
          begin
-         WorldDx:= WorldDx - CursorPoint.X + EdgesDist;
+         WorldDx:= WorldDx - CursorPoint.X - cw + EdgesDist;
          CursorPoint.X:= EdgesDist
          end else
-      if CursorPoint.X > cScreenWidth - EdgesDist then
+      if CursorPoint.X > cw - EdgesDist then
          begin
-         WorldDx:= WorldDx - CursorPoint.X + cScreenWidth - EdgesDist;
+         WorldDx:= WorldDx - CursorPoint.X + cw - EdgesDist;
          CursorPoint.X:= cScreenWidth - EdgesDist
          end;
       if CursorPoint.Y < EdgesDist then
@@ -521,7 +539,7 @@
          end else
       if CursorPoint.Y > cScreenHeight - EdgesDist then
          begin
-         WorldDy:= WorldDy - CursorPoint.Y + cScreenHeight - EdgesDist;
+         WorldDy:= WorldDy - CursorPoint.Y + round(cScreenHeight * 2 / cScaleFactor) - EdgesDist;
          CursorPoint.Y:= cScreenHeight - EdgesDist
          end;
    end else
@@ -537,8 +555,8 @@
 prevPoint:= CursorPoint;
 if WorldDy < cScreenHeight - cWaterLine - cVisibleWater then WorldDy:= cScreenHeight - cWaterLine - cVisibleWater;
 if WorldDy > LAND_HEIGHT + 1024 then WorldDy:= LAND_HEIGHT + 1024;
-if WorldDx < -LAND_WIDTH then WorldDx:= -LAND_WIDTH;
-if WorldDx > cScreenWidth then WorldDx:= cScreenWidth;
+if WorldDx < -round(LAND_WIDTH * 2 / cScaleFactor) then WorldDx:= -round(LAND_WIDTH * 2 / cScaleFactor);
+if WorldDx > cw then WorldDx:= cw;
 end;
 
 initialization