[gnome-games] chess: Tidy up rendering code



commit 548505e428dbaf8a3f72dc73312675ae3d799298
Author: Robert Ancell <robert ancell canonical com>
Date:   Sat Feb 19 18:21:29 2011 +1100

    chess: Tidy up rendering code

 glchess/src/chess-scene.vala   |   23 +++++++++++++++++++++--
 glchess/src/chess-view-2d.vala |   18 +++---------------
 glchess/src/chess-view-3d.vala |    8 +++-----
 3 files changed, 27 insertions(+), 22 deletions(-)
---
diff --git a/glchess/src/chess-scene.vala b/glchess/src/chess-scene.vala
index 8fd38ff..0005d50 100644
--- a/glchess/src/chess-scene.vala
+++ b/glchess/src/chess-scene.vala
@@ -6,6 +6,7 @@ public class ChessModel
     public double target_x;
     public double target_y;
     public bool under_threat;
+    public bool is_selected;
 
     public bool moving 
     {
@@ -58,6 +59,7 @@ public class ChessModel
 public class ChessScene : Object
 {
     public List<ChessModel> pieces = null;
+    private bool _can_move[64];
 
     public bool animating = false;
     private Timer animation_timer;
@@ -244,10 +246,22 @@ public class ChessScene : Object
                     need_animation = true;
                 }
 
-                model.under_threat = false;
-                if (selected_rank > 0 &&
+                if (selected_rank > 0 && move_number == -1 &&
                     game.current_player.move_with_coords (selected_rank, selected_file, rank, file, false))
+                {
                     model.under_threat = true;
+                    _can_move[rank * 8 + file] = true;
+                }
+                else
+                {
+                    model.under_threat = false;
+                    _can_move[rank * 8 + file] = false;
+                }
+
+                if (move_number == -1 && rank == selected_rank && file == selected_file)
+                    model.is_selected = true;
+                else
+                    model.is_selected = false;
 
                 new_pieces.append (model);
             }
@@ -277,6 +291,11 @@ public class ChessScene : Object
         }
     }
 
+    public bool can_move (int rank, int file)
+    {
+        return _can_move[rank * 8 + file];
+    }
+
     private bool animate_cb ()
     {
         /* Get the duration since the last tick */
diff --git a/glchess/src/chess-view-2d.vala b/glchess/src/chess-view-2d.vala
index 290a2e8..101894b 100644
--- a/glchess/src/chess-view-2d.vala
+++ b/glchess/src/chess-view-2d.vala
@@ -96,17 +96,6 @@ private class ChessView2D : ChessView
         c.rectangle (-bord_size, -bord_size, bord_size * 2, bord_size * 2);
         c.fill ();
 
-        var selected_piece = scene.get_selected_piece ();
-        if (scene.move_number != -1)
-            selected_piece = null;
-        int selected_offset = 0;
-        if (selected_piece != null)
-        {
-            selected_offset = selected_piece.type;
-            if (selected_piece.color == Color.BLACK)
-                selected_offset += 6;
-        }
-
         for (int file = 0; file < 8; file++)
         {
             for (int rank = 0; rank < 8; rank++)
@@ -189,7 +178,7 @@ private class ChessView2D : ChessView
             c.rotate (-Math.PI * scene.board_angle / 180.0);
 
             draw_piece (c,
-                        model.piece == selected_piece ? selected_model_surface : model_surface,
+                        model.is_selected ? selected_model_surface : model_surface,
                         model.piece, model.under_threat && scene.show_move_hints ? 0.8 : 1.0);
 
             c.restore ();
@@ -200,15 +189,14 @@ private class ChessView2D : ChessView
         {
             for (int file = 0; file < 8; file++)
             {
-                if (scene.move_number == -1 && selected_piece != null && scene.show_move_hints &&
-                    selected_piece.player.move_with_coords (scene.selected_rank, scene.selected_file, rank, file, false))
+                if (scene.show_move_hints && scene.can_move (rank, file))
                 {
                     c.save ();
                     c.translate ((file - 4) * square_size, (3 - rank) * square_size);
                     c.translate (square_size / 2, square_size / 2);
                     c.rotate (-Math.PI * scene.board_angle / 180.0);
 
-                    draw_piece (c, model_surface, selected_piece, 0.1);
+                    draw_piece (c, model_surface, scene.get_selected_piece (), 0.1);
 
                     c.restore ();
                 }
diff --git a/glchess/src/chess-view-3d.vala b/glchess/src/chess-view-3d.vala
index 7f902c0..da28041 100644
--- a/glchess/src/chess-view-3d.vala
+++ b/glchess/src/chess-view-3d.vala
@@ -403,8 +403,6 @@ private class ChessView3D : ChessView
         glEnable (GL_TEXTURE_2D);
         glBindTexture (GL_TEXTURE_2D, piece_texture);
 
-        var selected_piece = scene.get_selected_piece ();
-
         /* Draw the pieces */
         foreach (var model in scene.pieces)
         {
@@ -414,7 +412,7 @@ private class ChessView3D : ChessView
                           -(BOARD_BORDER + (GLfloat) model.y * SQUARE_WIDTH + SQUARE_WIDTH / 2));
 
             /* Raise the selected piece up */
-            if (model.piece == selected_piece)
+            if (model.is_selected)
                 glTranslatef (0.0f, SQUARE_WIDTH * 0.4f, 0.0f);
 
             render_piece (model.piece);
@@ -427,7 +425,7 @@ private class ChessView3D : ChessView
         {
             for (int file = 0; file < 8; file++)
             {
-                if (scene.move_number == -1 && scene.show_move_hints && selected_piece != null && selected_piece.player.move_with_coords (scene.selected_rank, scene.selected_file, rank, file, false))
+                if (scene.show_move_hints && scene.can_move (rank, file))
                 {
                     glPushMatrix ();
                     glTranslatef (BOARD_BORDER + file * SQUARE_WIDTH + SQUARE_WIDTH / 2,
@@ -437,7 +435,7 @@ private class ChessView3D : ChessView
                     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                     glEnable (GL_BLEND);
                     glDisable (GL_DEPTH_TEST);
-                    render_piece (selected_piece, 0.1f);
+                    render_piece (scene.get_selected_piece (), 0.1f);
                     glEnable (GL_DEPTH_TEST);
                     glDisable (GL_BLEND);
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]