[gnome-chess] Remove 3D mode



commit c4d9ba7c53643463dfa022ae07fc786642ac4942
Author: Michael Catanzaro <mcatanzaro gnome org>
Date:   Sun Jul 6 11:43:47 2014 -0500

    Remove 3D mode
    
    https://mail.gnome.org/archives/games-list/2014-June/msg00006.html
    
    https://bugzilla.gnome.org/show_bug.cgi?id=720284

 configure.ac           |    3 -
 data/preferences.ui    |   55 --
 src/3ds.vala           |  284 ----------
 src/Makefile.am        |    9 +-
 src/chess-view-2d.vala |  284 ----------
 src/chess-view-3d.vala |  709 ------------------------
 src/chess-view.vala    |  273 ++++++++++-
 src/egl.vapi           |    4 -
 src/gl.vapi            | 1402 ------------------------------------------------
 src/glu.vapi           |  301 -----------
 src/glx.vapi           |  202 -------
 src/gnome-chess.vala   |   51 +--
 12 files changed, 280 insertions(+), 3297 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 00c2ace..0b9c8e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -32,9 +32,6 @@ PKG_CHECK_MODULES(GNOME_CHESS, [
   gmodule-2.0
   gtk+-3.0 >= $GTK_REQUIRED
   librsvg-2.0 >= $RSVG_REQUIRED
-  gl
-  glu
-  x11
 ])
 
 PKG_CHECK_MODULES(LIBCHESS, [
diff --git a/data/preferences.ui b/data/preferences.ui
index b6192e6..1ae9227 100644
--- a/data/preferences.ui
+++ b/data/preferences.ui
@@ -537,61 +537,6 @@
                     <property name="can_focus">False</property>
                     <property name="orientation">vertical</property>
                     <child>
-                      <object class="GtkCheckButton" id="show_3d_check">
-                        <property name="label" translatable="yes" comments="Preferences Dialog: Check box 
for selecting if 3D view is available">3_D chess view</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">False</property>
-                        <property name="use_underline">True</property>
-                        <property name="draw_indicator">True</property>
-                        <signal name="toggled" handler="show_3d_toggle_cb" swapped="no"/>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkBox" id="hbox1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <child>
-                          <object class="GtkLabel" id="label6">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label">    </property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkCheckButton" id="show_3d_smooth_check">
-                            <property name="label" translatable="yes" comments="Preferences Dialog: Check 
box for selecting if the 3D view is smoothed (anti-aliased)">_Smooth display</property>
-                            <property name="visible">True</property>
-                            <property name="sensitive">False</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="use_underline">True</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
-                    <child>
                       <object class="GtkCheckButton" id="show_numbering_check">
                         <property name="label" translatable="yes" comments="Preferences Dialog: Check box 
for selecting if board numbering is visible">_Board numbering</property>
                         <property name="visible">True</property>
diff --git a/src/Makefile.am b/src/Makefile.am
index c587586..19b025e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,22 +2,16 @@ bin_PROGRAMS = gnome-chess
 
 gnome_chess_SOURCES = \
        config.vapi \
-       gl.vapi \
-       glu.vapi \
-       glx.vapi \
        portability.vapi \
        portability.c \
        portability.h \
-       3ds.vala \
        gnome-chess.vala \
        ai-profile.vala \
        chess-engine.vala \
        chess-engine-cecp.vala \
        chess-engine-uci.vala \
        chess-scene.vala \
-       chess-view.vala \
-       chess-view-2d.vala \
-       chess-view-3d.vala
+       chess-view.vala
 
 gnome_chess_CFLAGS = \
        -w
@@ -36,7 +30,6 @@ gnome_chess_LDADD = \
        $(top_builddir)/lib/libchess.la
 
 gnome_chess_VALAFLAGS = \
-       --pkg gdk-x11-3.0 \
        --pkg glib-2.0 \
        --pkg gmodule-2.0 \
        --pkg gtk+-3.0 \
diff --git a/src/chess-view.vala b/src/chess-view.vala
index 13cca22..1410a9b 100644
--- a/src/chess-view.vala
+++ b/src/chess-view.vala
@@ -9,8 +9,15 @@
  * license.
  */
 
-public abstract class ChessView : Gtk.DrawingArea
+public class ChessView : Gtk.DrawingArea
 {
+    private int border = 6;
+    private int square_size;
+    private int selected_square_size;
+    private Cairo.ImageSurface? model_surface;
+    private Cairo.Surface? selected_model_surface;
+    private string loaded_theme_name = "";
+
     private ChessScene _scene;
     public ChessScene scene
     {
@@ -23,6 +30,270 @@ public abstract class ChessView : Gtk.DrawingArea
         }
     }
 
+    private double border_size
+    {
+        get { return square_size / 2; }
+    }
+
+    public ChessView ()
+    {
+        add_events (Gdk.EventMask.BUTTON_PRESS_MASK);
+    }
+
+    public override bool configure_event (Gdk.EventConfigure event)
+    {
+        int short_edge = int.min (get_allocated_width (), get_allocated_height ());
+
+        square_size = (int) Math.floor ((short_edge - 2 * border) / 9.0);
+        var extra = square_size * 0.1;
+        if (extra < 3)
+            extra = 3;
+        selected_square_size = square_size + 2 * (int) (extra + 0.5);
+
+        return true;
+    }
+
+    private void render_piece (Cairo.Context c1, Cairo.Context c2, string name, int offset)
+    {
+        Rsvg.Handle handle;
+        try
+        {
+            handle = new Rsvg.Handle.from_file (Path.build_filename (PKGDATADIR, "pieces", scene.theme_name, 
name + ".svg", null));
+        }
+        catch (Error e)
+        {
+            stderr.printf ("Failed to load piece svg: %s", e.message);
+            return;
+        }
+
+        c1.save ();
+        c1.translate (square_size * offset, 0);
+        c1.scale ((double) square_size / handle.width, (double) square_size / handle.height);
+        handle.render_cairo (c1);
+        c1.restore ();
+
+        c2.save ();
+        c2.translate (selected_square_size * offset, 0);
+        c2.scale ((double) selected_square_size / handle.width, (double) selected_square_size / 
handle.height);
+        handle.render_cairo (c2);
+        c2.restore ();
+    }
+
+    private void load_theme (Cairo.Context c)
+    {
+        /* Skip if already loaded */
+        if (scene.theme_name == loaded_theme_name && model_surface != null && square_size == 
model_surface.get_height ())
+            return;
+
+        model_surface = new Cairo.ImageSurface (Cairo.Format.ARGB32, 12 * square_size, square_size);
+        selected_model_surface = new Cairo.Surface.similar (c.get_target (), Cairo.Content.COLOR_ALPHA, 12 * 
selected_square_size, selected_square_size);
+
+        var c1 = new Cairo.Context (model_surface);
+        var c2 = new Cairo.Context (selected_model_surface);
+        render_piece (c1, c2, "whitePawn", 0);
+        render_piece (c1, c2, "whiteRook", 1);
+        render_piece (c1, c2, "whiteKnight", 2);
+        render_piece (c1, c2, "whiteBishop", 3);
+        render_piece (c1, c2, "whiteQueen", 4);
+        render_piece (c1, c2, "whiteKing", 5);
+        render_piece (c1, c2, "blackPawn", 6);
+        render_piece (c1, c2, "blackRook", 7);
+        render_piece (c1, c2, "blackKnight", 8);
+        render_piece (c1, c2, "blackBishop", 9);
+        render_piece (c1, c2, "blackQueen", 10);
+        render_piece (c1, c2, "blackKing", 11);
+
+        loaded_theme_name = scene.theme_name;
+    }
+
+    public override bool draw (Cairo.Context c)
+    {
+        load_theme (c);
+
+        c.translate (get_allocated_width () / 2, get_allocated_height () / 2);
+        //c.scale (s, s);
+        c.rotate (Math.PI * scene.board_angle / 180.0);
+
+        int board_size = (int) Math.ceil (square_size * 4 + border_size);
+        c.set_source_rgb (0x2e/255.0, 0x34/255.0, 0x36/255.0);
+        c.rectangle (-board_size, -board_size, board_size * 2, board_size * 2);
+        c.fill ();
+
+        for (int file = 0; file < 8; file++)
+        {
+            for (int rank = 0; rank < 8; rank++)
+            {
+                int x = (int) ((file - 4) * square_size);
+                int y = (int) ((3 - rank) * square_size);
+
+                c.rectangle (x, y, square_size, square_size);
+                if ((file + rank) % 2 == 0)
+                    c.set_source_rgb (0xba/255.0, 0xbd/255.0, 0xb6/255.0);
+                else
+                    c.set_source_rgb (0xee/255.0, 0xee/255.0, 0xec/255.0);
+                c.fill ();
+            }
+        }
+
+        if (scene.show_numbering)
+        {
+            /* Files are centered individiual glyph width and combined glyph height,
+             * ranks are centered on individual glyph widths and heights */
+
+            c.set_source_rgb (0x88/255.0, 0x8a/255.0, 0x85/255.0);
+            c.set_font_size (border_size * 0.6);
+            c.select_font_face ("sans-serif", Cairo.FontSlant.NORMAL, Cairo.FontWeight.BOLD);
+
+            Cairo.TextExtents extents;
+            c.text_extents ("abcdefgh", out extents);
+            double y_offset = (square_size / 2 - extents.height) / 2 + extents.height + extents.y_bearing;
+            double top = -(square_size * 4 + y_offset);
+            double bottom = square_size * 4 + border_size - y_offset;
+
+            double file_offset = -(square_size * 3.5);
+            double rank_offset = -(square_size * 3.5);
+
+            string[] files;
+            string[] ranks;
+
+            Cairo.Matrix matrix = c.get_matrix ();
+
+            if (scene.board_angle == 180.0)
+            {
+                files = { "h", "g", "f", "e", "d", "c", "b", "a" };
+                ranks = { "1", "2", "3", "4", "5", "6", "7", "8" };
+
+                matrix.scale (-1, -1);
+            }
+            else
+            {
+                files = { "a", "b", "c", "d", "e", "f", "g", "h" };
+                ranks = { "8", "7", "6", "5", "4", "3", "2", "1" };
+            }
+
+            c.save ();
+            c.set_matrix (matrix);
+
+            for (int i = 0; i < 8; i++)
+            {
+                c.text_extents (ranks[i], out extents);
+
+                /* Black file */
+                c.save ();
+                c.move_to (file_offset - extents.width / 2, top);
+                c.show_text (files[i]);
+                c.restore ();
+
+                /* White file */
+                c.save ();
+                c.move_to (file_offset - extents.width / 2, bottom);
+                c.show_text (files[i]);
+                c.restore ();
+
+                c.text_extents (ranks[i], out extents);
+                y_offset = -(extents.y_bearing + extents.height / 2);
+
+                /* Left rank */
+                c.save ();
+                c.move_to (-((double) square_size * 4 + border_size - (border_size - extents.width) / 2), 
rank_offset + y_offset);
+                c.show_text (ranks[i]);
+                c.restore ();
+
+                /* Right rank */
+                c.save ();
+                c.move_to ((double) square_size * 4 + (border_size - extents.width) / 2, rank_offset + 
y_offset);
+                c.show_text (ranks[i]);
+                c.restore ();
+
+                file_offset += square_size;
+                rank_offset += square_size;
+            }
+
+            c.restore ();
+        }
+
+        /* Draw pause overlay */
+        if (scene.game.is_paused)
+        {
+            c.rotate (Math.PI * scene.board_angle / 180.0);
+            draw_paused_overlay (c);
+            return true;
+        }
+
+        /* Draw the pieces */
+        foreach (var model in scene.pieces)
+        {
+            c.save ();
+            c.translate ((model.x - 4) * square_size, (3 - model.y) * square_size);
+            c.translate (square_size / 2, square_size / 2);
+            c.rotate (-Math.PI * scene.board_angle / 180.0);
+
+            draw_piece (c,
+                        model.is_selected ? selected_model_surface : model_surface,
+                                               model.is_selected ? selected_square_size : square_size,
+                        model.piece, model.under_threat && scene.show_move_hints ? 0.8 : 1.0);
+
+            c.restore ();
+        }
+
+        /* Draw shadow piece on squares that can be moved to */
+        for (int rank = 0; rank < 8; rank++)
+        {
+            for (int file = 0; file < 8; file++)
+            {
+                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, square_size, scene.get_selected_piece (), 0.1);
+
+                    c.restore ();
+                }
+            }
+        }
+
+        return true;
+    }
+
+    private void draw_piece (Cairo.Context c, Cairo.Surface surface, int size, ChessPiece piece, double 
alpha)
+    {
+        c.translate (-size / 2, -size / 2);
+
+        int offset = piece.type;
+        if (piece.color == Color.BLACK)
+            offset += 6;
+        c.set_source_surface (surface, -offset * size, 0);
+        c.rectangle (0, 0, size, size);
+        c.clip ();
+        c.paint_with_alpha (alpha);
+    }
+
+    public override bool button_press_event (Gdk.EventButton event)
+    {
+        if (scene.game == null || event.button != 1 || scene.game.is_paused)
+            return false;
+
+        int file = (int) Math.floor((event.x - 0.5 * get_allocated_width () + square_size * 4) / 
square_size);
+        int rank = 7 - (int) Math.floor((event.y - 0.5 * get_allocated_height () + square_size * 4) / 
square_size);
+
+        // FIXME: Use proper Cairo rotation matrix
+        if (scene.board_angle == 180.0)
+        {
+            rank = 7 - rank;
+            file = 7 - file;
+        }
+
+        if (file < 0 || file >= 8 || rank < 0 || rank >= 8)
+            return false;
+
+        scene.select_square (file, rank);
+
+        return true;
+    }
+
     private void scene_changed_cb (ChessScene scene)
     {
         queue_draw ();
diff --git a/src/gnome-chess.vala b/src/gnome-chess.vala
index b1a39cd..7c9e215 100644
--- a/src/gnome-chess.vala
+++ b/src/gnome-chess.vala
@@ -199,15 +199,18 @@ public class ChessApplication : Gtk.Application
         scene.is_human.connect ((p) => { return p == human_player; } );
         scene.changed.connect (scene_changed_cb);
         scene.choose_promotion_type.connect (show_promotion_type_selector);
+
         settings.bind ("show-move-hints", scene, "show-move-hints", SettingsBindFlags.GET);
         settings.bind ("show-numbering", scene, "show-numbering", SettingsBindFlags.GET);
         settings.bind ("piece-theme", scene, "theme-name", SettingsBindFlags.GET);
-        settings.bind ("show-3d-smooth", scene, "show-3d-smooth", SettingsBindFlags.GET);
         settings.bind ("move-format", scene, "move-format", SettingsBindFlags.GET);
         settings.bind ("board-side", scene, "board-side", SettingsBindFlags.GET);
 
-        settings.changed.connect (settings_changed_cb);
-        settings_changed_cb (settings, "show-3d");
+        view = new ChessView ();
+        view.set_size_request (300, 300);
+        view.scene = scene;
+        view_container.add (view);
+        view.show ();
 
         var system_engine_cfg = Path.build_filename (SYSCONFDIR, "gnome-chess", "engines.conf", null);
         var user_engine_cfg = Path.build_filename (Environment.get_user_config_dir (), "gnome-chess", 
"engines.conf", null);
@@ -386,26 +389,6 @@ public class ChessApplication : Gtk.Application
         }
     }
 
-    private void settings_changed_cb (Settings settings, string key)
-    {
-        if (key == "show-3d")
-        {
-            if (view != null)
-            {
-                view_container.remove (view);
-                view.destroy ();
-            }
-            if (settings.get_boolean ("show-3d"))
-                view = new ChessView3D ();
-            else
-                view = new ChessView2D ();
-            view.set_size_request (300, 300);
-            view.scene = scene;
-            view_container.add (view);
-            view.show ();
-        }
-    }
-
     private void update_history_panel ()
     {
         if (game == null)
@@ -1703,10 +1686,6 @@ public class ChessApplication : Gtk.Application
                        "active", SettingsBindFlags.DEFAULT);
         settings.bind ("show-move-hints", preferences_builder.get_object ("show_move_hints_check"),
                        "active", SettingsBindFlags.DEFAULT);
-        settings.bind ("show-3d", preferences_builder.get_object ("show_3d_check"),
-                       "active", SettingsBindFlags.DEFAULT);
-        settings.bind ("show-3d-smooth", preferences_builder.get_object ("show_3d_smooth_check"),
-                       "active", SettingsBindFlags.DEFAULT);
 
         side_combo = (Gtk.ComboBox) preferences_builder.get_object ("side_combo");
         side_combo.set_active (settings.get_boolean ("play-as-white") ? 0 : 1);
@@ -1745,14 +1724,8 @@ public class ChessApplication : Gtk.Application
         var move_combo = (Gtk.ComboBox) preferences_builder.get_object ("move_format_combo");
         set_combo (move_combo, 1, settings.get_string ("move-format"));
 
-        var show_3d_check = (Gtk.CheckButton) preferences_builder.get_object ("show_3d_check");
-
         var theme_combo = (Gtk.ComboBox) preferences_builder.get_object ("piece_style_combo");
         set_combo (theme_combo, 1, settings.get_string ("piece-theme"));
-        theme_combo.sensitive = !show_3d_check.active;
-
-        var show_3d_smooth_check = (Gtk.CheckButton) preferences_builder.get_object ("show_3d_smooth_check");
-        show_3d_smooth_check.sensitive = show_3d_check.active;
 
         preferences_builder.connect_signals (this);
 
@@ -1990,16 +1963,6 @@ public class ChessApplication : Gtk.Application
         settings.set_string ("piece-theme", get_combo (combo, 1));
     }
 
-    [CCode (cname = "G_MODULE_EXPORT show_3d_toggle_cb", instance_pos = -1)]
-    public void show_3d_toggle_cb (Gtk.ToggleButton widget)
-    {
-        var w = (Gtk.Widget) preferences_builder.get_object ("show_3d_smooth_check");
-        w.sensitive = widget.active;
-
-        w = (Gtk.Widget) preferences_builder.get_object ("piece_style_combo");
-        w.sensitive = !widget.active;
-    }
-
     [CCode (cname = "G_MODULE_EXPORT move_format_combo_changed_cb", instance_pos = -1)]
     public void move_format_combo_changed_cb (Gtk.ComboBox combo)
     {
@@ -2025,7 +1988,7 @@ public class ChessApplication : Gtk.Application
     }
 
     private const string[] authors = { "Robert Ancell <robert ancell gmail com>", null };
-    private const string[] artists = { "John-Paul Gignac (3D Models)", "Max Froumentin (2D Models)", "Jakub 
Steiner (icon)", null };
+    private const string[] artists = { "Max Froumentin (pieces)", "Jakub Steiner (icon)", null };
 
     public void about_cb ()
     {


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