rnd-20100623-1-src
authorHolger Schemel <info@artsoft.org>
Wed, 23 Jun 2010 00:15:37 +0000 (02:15 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:59:32 +0000 (10:59 +0200)
* added graphics performance optimization to native Supaplex game engine

ChangeLog
src/conftime.h
src/game_sp/DDScrollBuffer.c
src/game_sp/DDSpriteBuffer.c
src/game_sp/main.c
src/init.c
src/libgame/system.c
src/main.h
src/tools.c

index 6acb9f335cfddc4458635df4b524f9ded6fd64bc..98b0c92b9e6870022b1a1f3e90c9cd7e71269203 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2010-06-23
+       * added graphics performance optimization to native Supaplex game engine
+
 2010-06-18
        * added separately configurable game panel background to graphics config
        * fixed displaying Supaplex time (now based on 35 fps instead of 50 fps)
index c2d1ae25c149e5a1f6f7af5862d541e788b76269..689186808ffdb4e920369bfd0600f2545572b6ea 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "2010-06-19 00:55"
+#define COMPILE_DATE_STRING "2010-06-23 02:10"
index e8bd2fbce26221c29eb956408a597d7c962dd3d4..263f31f646d21c1be986b016f77fa2f3981f785b 100644 (file)
@@ -59,9 +59,15 @@ static void ScrollPlayfield(int dx, int dy)
              TILEY * (dy == 1));
 
   /* when scrolling the whole playfield, do not redraw single tiles */
+#if 1
+  for (x = 0; x < 2 + MAX_PLAYFIELD_WIDTH + 2; x++)
+    for (y = 0; y < 2 + MAX_PLAYFIELD_HEIGHT + 2; y++)
+      redraw[x][y] = FALSE;
+#else
   for (x = 0; x < MAX_BUF_XSIZE; x++)
     for (y = 0; y < MAX_BUF_YSIZE; y++)
       redraw[x][y] = FALSE;
+#endif
   redraw_tiles = 0;
 
   DrawFrameIfNeeded();
@@ -145,10 +151,13 @@ void InitScrollPlayfield()
   ScrollPlayfieldIfNeededExt(TRUE);
 }
 
+#define DEBUG_REDRAW   0
+
 void UpdatePlayfield(boolean force_redraw)
 {
   int x, y;
-#if 1
+
+#if DEBUG_REDRAW
   int num_redrawn = 0;
 #endif
 
@@ -161,8 +170,10 @@ void UpdatePlayfield(boolean force_redraw)
       int sync_frame = GfxFrame[x][y];
       boolean redraw = force_redraw;
 
+#if DEBUG_REDRAW
 #if 0
       redraw = TRUE;   // !!! TEST ONLY -- ALWAYS REDRAW !!!
+#endif
 #endif
 
       if (graphic < 0)
@@ -201,20 +212,22 @@ void UpdatePlayfield(boolean force_redraw)
        int sx = x * StretchWidth;
        int sy = y * StretchWidth;
 
+#if DEBUG_REDRAW
 #if 0
        printf("::: REDRAW (%d, %d): %d, %d\n", x, y, graphic, sync_frame);
+#endif
 #endif
 
        DDSpriteBuffer_BltImg(sx, sy, graphic, sync_frame);
 
-#if 1
+#if DEBUG_REDRAW
        num_redrawn++;
 #endif
       }
     }
   }
 
-#if 0
+#if DEBUG_REDRAW
   printf("::: FRAME %d: %d redrawn\n", FrameCounter, num_redrawn);
 #endif
 }
@@ -263,44 +276,79 @@ void BlitScreenToBitmap_SP(Bitmap *target_bitmap)
 
 void BackToFront_SP(void)
 {
+  static int scroll_x_last = -1, scroll_y_last = -1;
   static boolean scrolling_last = FALSE;
-  int left = mScrollX / TILEX;
-  int top  = mScrollY / TILEY;
+  static boolean ExplosionShakeMurphy_last = -1;
+#if 1
+  boolean scrolling = (mScrollX != scroll_x_last || mScrollY != scroll_y_last);
+  // boolean scrolling = (mScrollX != mScrollX_last || mScrollY != mScrollY_last);
+#else
   boolean scrolling = (mScrollX % TILEX != 0 || mScrollY % TILEY != 0);
+#endif
   int x, y;
 
+#if 0
+  printf("::: %d, %d / %d, %d [%d, %d]\n",
+         mScrollX, mScrollY,
+         mScrollX_last, mScrollY_last,
+        game_sp.scroll_xoffset, game_sp.scroll_yoffset);
+#endif
+
   SyncDisplay();
 
-  if (1 ||
-      redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last)
+  if (redraw_tiles > REDRAWTILES_THRESHOLD || scrolling || scrolling_last ||
+      ExplosionShakeMurphy != 0 || ExplosionShakeMurphy_last != 0)
   {
     BlitScreenToBitmap_SP(window);
   }
   else
   {
-    for (x = 0; x < SCR_FIELDX; x++)
+    int scroll_xoffset = mScrollX - mScrollX_last + game_sp.scroll_xoffset;
+    int scroll_yoffset = mScrollY - mScrollY_last + game_sp.scroll_yoffset;
+    int x1 = 0, x2 = SCR_FIELDX - (scroll_xoffset != 0 ? 0 : 1);
+    int y1 = 0, y2 = SCR_FIELDY - (scroll_yoffset != 0 ? 0 : 1);
+    int full_xsize = (FieldWidth  - (menBorder ? 0 : 1)) * TILEX;
+    int full_ysize = (FieldHeight - (menBorder ? 0 : 1)) * TILEY;
+    int sx = SX + (full_xsize < SXSIZE ? (SXSIZE - full_xsize) / 2 : 0);
+    int sy = SY + (full_ysize < SYSIZE ? (SYSIZE - full_ysize) / 2 : 0);
+
+    InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE);
+
+    for (x = x1; x <= x2; x++)
     {
-      for (y = 0; y < SCR_FIELDY; y++)
+      for (y = y1; y <= y2; y++)
       {
-       int xx = (left + x) % MAX_BUF_XSIZE;
-       int yy = (top  + y) % MAX_BUF_YSIZE;
+       int xx = 2 + x;
+       int yy = 2 + y;
 
        if (redraw[xx][yy])
          BlitBitmap(bitmap_db_field_sp, window,
                     xx * TILEX, yy * TILEY, TILEX, TILEY,
-                    SX + x * TILEX, SY + y * TILEY);
+                    sx + x * TILEX - scroll_xoffset,
+                    sy + y * TILEY - scroll_yoffset);
       }
     }
+
+    InitGfxClipRegion(FALSE, -1, -1, -1, -1);
   }
 
   FlushDisplay();
 
+#if 1
+  for (x = 0; x < 2 + MAX_PLAYFIELD_WIDTH + 2; x++)
+    for (y = 0; y < 2 + MAX_PLAYFIELD_HEIGHT + 2; y++)
+      redraw[x][y] = FALSE;
+#else
   for (x = 0; x < MAX_BUF_XSIZE; x++)
     for (y = 0; y < MAX_BUF_YSIZE; y++)
       redraw[x][y] = FALSE;
+#endif
   redraw_tiles = 0;
 
+  scroll_x_last = mScrollX;
+  scroll_y_last = mScrollY;
   scrolling_last = scrolling;
+  ExplosionShakeMurphy_last = ExplosionShakeMurphy;
 }
 
 void DDScrollBuffer_ScrollTo(int X, int Y)
index 4683d319d1829b2c4d646f2985e8362705ed2858..9377eac3f2d7679cffea8567f5624c0f748d91ac 100644 (file)
@@ -13,9 +13,12 @@ static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY)
   int sy1 = scy - 2 * TILEY;
   int sx2 = scx + SXSIZE + 1 * TILEX;
   int sy2 = scy + SYSIZE + 1 * TILEY;
-
   int sx = pX - sx1;
   int sy = pY - sy1;
+  int tile_x = sx / TILESIZE;
+  int tile_y = sy / TILESIZE;
+  int move_x = (sx + TILESIZE - 1) / TILESIZE;
+  int move_y = (sy + TILESIZE - 1) / TILESIZE;
 
   if (NoDisplayFlag)
     return;
@@ -26,6 +29,20 @@ static void Blt(int pX, int pY, Bitmap *bitmap, int SpriteX, int SpriteY)
 
   BlitBitmap(bitmap, bitmap_db_field_sp, SpriteX, SpriteY,
             TILEX, TILEY, sx, sy);
+
+  redraw[tile_x][tile_y] = TRUE;
+  redraw_tiles++;
+
+  if (move_x != tile_x)
+  {
+    redraw[move_x][tile_y] = TRUE;
+    redraw_tiles++;
+  }
+  else if (move_y != tile_y)
+  {
+    redraw[tile_x][move_y] = TRUE;
+    redraw_tiles++;
+  }
 }
 
 void DDSpriteBuffer_BltImg(int pX, int pY, int graphic, int sync_frame)
index 818d4e3677151cc8206a199e6d16beb36800adbc..4fe06feb1a44fa796b6b3dbc1dd21d9b9749db7e 100644 (file)
@@ -67,7 +67,8 @@ void RedrawPlayfield_SP(boolean force_redraw)
 void DrawGameDoorValues_SP()
 {
 #if 1
-  game_sp.time_played = TimerVar / FRAMES_PER_SECOND_SP;
+  // game_sp.time_played = TimerVar / FRAMES_PER_SECOND_SP;
+  game_sp.time_played = TimerVar / FRAMES_PER_SECOND;
 #else
   game_sp.time_played = TimerVar * setup.game_frame_delay / 1000;
 #endif
index 5fe252ff3e624f2741115b6480891ffcd1b1f50f..f074cd944f70cd21405d7b6f003383d564c97bfc 100644 (file)
@@ -5123,6 +5123,8 @@ static void InitGlobal()
   global.fading_status = GAME_MODE_MAIN;
   global.fading_type = TYPE_ENTER_MENU;
 #endif
+
+  global.use_envelope_request = FALSE; /* !!! MOVE TO ARTWORK CONFIG !!! */
 }
 
 void Execute_Command(char *command)
@@ -6304,11 +6306,18 @@ void OpenAll()
 
   InitSetup();
 
+  print_timestamp_time("[init setup/config stuff (1)]");
+
   InitGameInfo();
+  print_timestamp_time("[init setup/config stuff (2)]");
   InitPlayerInfo();
+  print_timestamp_time("[init setup/config stuff (3)]");
   InitArtworkInfo();           /* needed before loading gfx, sound & music */
+  print_timestamp_time("[init setup/config stuff (4)]");
   InitArtworkConfig();         /* needed before forking sound child process */
+  print_timestamp_time("[init setup/config stuff (5)]");
   InitMixer();
+  print_timestamp_time("[init setup/config stuff (6)]");
 
 #if 0
   InitCounter();
index c2e9a3008f982c79a6dafbd5ae62381e2ca51507..dce2b888943693f787fb882b19dd4a20dd9413e3 100644 (file)
@@ -736,6 +736,12 @@ void BlitBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap,
 #endif
 #endif
 
+#if 0
+  if (dst_x < gfx.sx + gfx.sxsize)
+    printf("::: %d: BlitBitmap(%d, %d, %d, %d)\n",
+          FrameCounter, dst_x, dst_y, width, height);
+#endif
+
   sysCopyArea(src_bitmap, dst_bitmap,
              src_x, src_y, width, height, dst_x, dst_y, BLIT_OPAQUE);
 }
index b37e21c50ebf6c13670763a9f23dd9dff66d0b26..e5631b498394ca6a22baa79ed7dd221e07e658a8 100644 (file)
@@ -2466,6 +2466,8 @@ struct GlobalInfo
   int fading_status;
   int fading_type;
 #endif
+
+  boolean use_envelope_request;
 };
 
 struct ElementChangeInfo
index bc9e6df3274a23f5a6b104b6b25f656c0c40dad4..326af5f9d8ea37dd725ecb623cb8f9ff9a44f886 100644 (file)
@@ -251,6 +251,11 @@ void DrawMaskedBorder(int redraw_mask)
       effectiveGameStatus() == GAME_MODE_TITLE)
     return;
 
+  /* never draw masked screen borders when displaying request outside door */
+  if (effectiveGameStatus() == GAME_MODE_PSEUDO_DOOR &&
+      global.use_envelope_request)
+    return;
+
   if (redraw_mask & REDRAW_ALL)
     DrawMaskedBorder_ALL();
   else
@@ -332,7 +337,7 @@ void BackToFront()
 
   SyncDisplay();
 
-  /* prevent drawing masked border to backbuffer when using playfield buffer */
+  /* never draw masked border to backbuffer when using playfield buffer */
   if (game_status != GAME_MODE_PLAYING ||
       redraw_mask & REDRAW_FROM_BACKBUFFER ||
       buffer == backbuffer)
@@ -2431,7 +2436,7 @@ void ShowEnvelopeDoor(char *text, int action)
   game.envelope_active = FALSE;
 
 #if 1
-  game_status = last_game_status;      /* restore current game status */
+  // game_status = last_game_status;   /* restore current game status */
 
   if (action == ACTION_CLOSING)
   {
@@ -2459,6 +2464,9 @@ void ShowEnvelopeDoor(char *text, int action)
 
   BackToFront();
 
+  /* (important: after "BackToFront()", but before "SetDrawtoField()") */
+  game_status = last_game_status;      /* restore current game status */
+
   if (game_status == GAME_MODE_PLAYING &&
       level.game_engine_type == GAME_ENGINE_TYPE_RND)
     SetDrawtoField(DRAW_BUFFERED);
@@ -3392,13 +3400,14 @@ boolean Request(char *text, unsigned int req_state)
   int last_game_status = game_status;  /* save current game status */
   int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN;
   int font_nr = FONT_TEXT_2;
-  boolean use_envelope_request = TRUE  * 0;
 #if 0
   int max_word_len = 0;
 #endif
   char *text_ptr;
   int i;
 
+  global.use_envelope_request = TRUE  * 1;
+
 #if 1
   if (maxWordLengthInString(text) > MAX_REQUEST_LINE_FONT1_LEN)
   {
@@ -3454,13 +3463,21 @@ boolean Request(char *text, unsigned int req_state)
 
   UnmapAllGadgets();
 
-#if 1
-  if (old_door_state & DOOR_OPEN_1 && !use_envelope_request)
+  /* draw released gadget before proceeding */
+  // BackToFront();
+
+#if 0
+  if (old_door_state & DOOR_OPEN_1 && !global.use_envelope_request)
 #else
   if (old_door_state & DOOR_OPEN_1)
 #endif
   {
+#if 1
+    if (!global.use_envelope_request)
+      CloseDoor(DOOR_CLOSE_1);
+#else
     CloseDoor(DOOR_CLOSE_1);
+#endif
 
     /* save old door content */
     BlitBitmap(bitmap_db_door, bitmap_db_door,
@@ -3516,7 +3533,7 @@ boolean Request(char *text, unsigned int req_state)
   game_status = last_game_status;      /* restore current game status */
 
 #if 1
-  if (use_envelope_request)
+  if (global.use_envelope_request)
   {
     /* !!! TMP !!! */
     FreeToolButtons();
@@ -3547,7 +3564,7 @@ boolean Request(char *text, unsigned int req_state)
             DOOR_GFX_PAGEX1, DOOR_GFX_PAGEY1);
 
 #if 1
-  if (use_envelope_request)
+  if (global.use_envelope_request)
   {
     ShowEnvelopeDoor(text, ACTION_OPENING);
 
@@ -3571,7 +3588,7 @@ boolean Request(char *text, unsigned int req_state)
 #endif
 
 #if 1
-  if (!use_envelope_request)
+  if (!global.use_envelope_request)
     OpenDoor(DOOR_OPEN_1);
 #else
   OpenDoor(DOOR_OPEN_1);
@@ -3593,7 +3610,7 @@ boolean Request(char *text, unsigned int req_state)
   }
 
 #if 1
-  if (game_status != GAME_MODE_MAIN && !use_envelope_request)
+  if (game_status != GAME_MODE_MAIN && !global.use_envelope_request)
     InitAnimation();
 #else
   if (game_status != GAME_MODE_MAIN)
@@ -3735,8 +3752,16 @@ boolean Request(char *text, unsigned int req_state)
        Delay(10);
     }
 
+#if 1
+    game_status = GAME_MODE_PSEUDO_DOOR;
+#endif
+
     BackToFront();
 
+#if 1
+    game_status = last_game_status;    /* restore current game status */
+#endif
+
 #else
 
     DoAnimation();
@@ -3758,12 +3783,12 @@ boolean Request(char *text, unsigned int req_state)
   UnmapToolButtons();
 
 #if 1
-  if (use_envelope_request)
+  if (global.use_envelope_request)
     ShowEnvelopeDoor(text, ACTION_CLOSING);
 #endif
 
 #if 1
-  if (!(req_state & REQ_STAY_OPEN) && !use_envelope_request)
+  if (!(req_state & REQ_STAY_OPEN) && !global.use_envelope_request)
 #else
   if (!(req_state & REQ_STAY_OPEN))
 #endif