[gnome-chess] Remove 3D mode
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-chess] Remove 3D mode
- Date: Sun, 6 Jul 2014 16:49:02 +0000 (UTC)
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]