From 8d1c2e96f3a50a3fd5c940083fbe6d488f399da6 Mon Sep 17 00:00:00 2001 From: OverloadedOrama Date: Thu, 20 Aug 2020 00:12:07 +0300 Subject: [PATCH] Finished implementing the isometric grid - Closes #305 Added the ability to change grid type in Preferences, and made an isometric cell size value which affects just the size of the cells of the isometric grid. Also updated translations. --- Translations/Translations.pot | 21 ++++++++++++++ src/Autoload/Global.gd | 1 + src/Preferences/PreferencesDialog.gd | 7 ++++- src/Preferences/PreferencesDialog.tscn | 39 ++++++++++++++++++++++++++ src/UI/Canvas/Grid.gd | 16 +++++------ 5 files changed, 74 insertions(+), 10 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 3c00dc637..18442e871 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -741,6 +741,21 @@ msgstr "" msgid "Grid" msgstr "" +msgid "Grid type:" +msgstr "" + +msgid "Sets the type of the grid between rectangular, isometric or both" +msgstr "" + +msgid "Rectangular" +msgstr "" + +msgid "Isometric" +msgstr "" + +msgid "All" +msgstr "" + msgid "Grid width:" msgstr "" @@ -753,6 +768,12 @@ msgstr "" msgid "Sets how far apart are horizontal lines of the grid" msgstr "" +msgid "Isometric cell size:" +msgstr "" + +msgid "Sets the size of the cells in an isometric grid" +msgstr "" + msgid "Grid color:" msgstr "" diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index aa7579147..f9cf2d005 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -51,6 +51,7 @@ var default_fill_color := Color(0, 0, 0, 0) var grid_type = Grid_Types.CARTESIAN var grid_width := 1 var grid_height := 1 +var grid_isometric_cell_size := 2 var grid_color := Color.black var guide_color := Color.purple var checker_size := 10 diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd index 1203d0742..ef8367bc2 100644 --- a/src/Preferences/PreferencesDialog.gd +++ b/src/Preferences/PreferencesDialog.gd @@ -16,8 +16,10 @@ var preferences = [ ["default_image_height", "Image/ImageOptions/ImageDefaultHeight", "value", Global.default_image_height], ["default_fill_color", "Image/ImageOptions/DefaultFillColor", "color", Global.default_fill_color], + ["grid_type", "Canvas/GridOptions/GridType", "selected", Global.grid_type], ["grid_width", "Canvas/GridOptions/GridWidthValue", "value", Global.grid_width], ["grid_height", "Canvas/GridOptions/GridHeightValue", "value", Global.grid_height], + ["grid_isometric_cell_size", "Canvas/GridOptions/IsometricCellSizeValue", "value", Global.grid_isometric_cell_size], ["grid_color", "Canvas/GridOptions/GridColor", "color", Global.grid_color], ["guide_color", "Canvas/GuideOptions/GuideColor", "color", Global.guide_color], ["checker_size", "Canvas/CheckerOptions/CheckerSizeValue", "value", Global.checker_size], @@ -76,6 +78,9 @@ func _ready() -> void: if pref[2] == "color": preference_update(pref[0]) disable_restore_default_button(restore_default_button, Global.get(pref[0]).is_equal_approx(pref[3])) + elif pref[2] == "selected": + preference_update(pref[0]) + disable_restore_default_button(restore_default_button, Global.get(pref[0]) == pref[3]) func _on_Preference_toggled(button_pressed : bool, prop : String, default_value, restore_default_button : BaseButton) -> void: @@ -115,7 +120,7 @@ func preference_update(prop : String) -> void: else: autosave_interval.mouse_default_cursor_shape = Control.CURSOR_FORBIDDEN - if prop in ["grid_width", "grid_height", "grid_color"]: + if prop in ["grid_type", "grid_width", "grid_height", "grid_isometric_cell_size", "grid_color"]: Global.canvas.grid.isometric_polylines.clear() Global.canvas.grid.update() diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn index 068217be4..013098d9a 100644 --- a/src/Preferences/PreferencesDialog.tscn +++ b/src/Preferences/PreferencesDialog.tscn @@ -216,6 +216,25 @@ custom_constants/vseparation = 4 custom_constants/hseparation = 4 columns = 3 +[node name="TypeLabel" type="Label" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/GridOptions"] +margin_right = 40.0 +margin_bottom = 14.0 +hint_tooltip = "Sets the type of the grid between rectangular, isometric or both" +mouse_filter = 0 +text = "Grid type:" +__meta__ = { +"_editor_description_": "" +} + +[node name="GridType" type="OptionButton" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/GridOptions"] +margin_right = 29.0 +margin_bottom = 20.0 +hint_tooltip = "Sets the type of the grid between rectangular, isometric or both" +mouse_default_cursor_shape = 2 +text = "Rectangular" +items = [ "Rectangular", null, false, 0, null, "Isometric", null, false, 1, null, "All", null, false, 2, null ] +selected = 0 + [node name="WidthLabel" type="Label" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/GridOptions"] margin_top = 5.0 margin_right = 110.0 @@ -260,6 +279,26 @@ rounded = true align = 2 suffix = "px" +[node name="IsometricCellSizeLabel" type="Label" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/GridOptions"] +margin_right = 40.0 +margin_bottom = 14.0 +hint_tooltip = "Sets the size of the cells in an isometric grid" +mouse_filter = 0 +text = "Isometric cell size:" + +[node name="IsometricCellSizeValue" type="SpinBox" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/GridOptions"] +margin_top = 28.0 +margin_right = 110.0 +margin_bottom = 52.0 +hint_tooltip = "Sets the size of the cells in an isometric grid" +mouse_default_cursor_shape = 2 +min_value = 2.0 +max_value = 16384.0 +value = 2.0 +rounded = true +align = 2 +suffix = "px" + [node name="GridColorLabel" type="Label" parent="HSplitContainer/ScrollContainer/VBoxContainer/Canvas/GridOptions"] margin_left = 114.0 margin_top = 33.0 diff --git a/src/UI/Canvas/Grid.gd b/src/UI/Canvas/Grid.gd index 682dfca98..9c6c51e29 100644 --- a/src/UI/Canvas/Grid.gd +++ b/src/UI/Canvas/Grid.gd @@ -19,17 +19,15 @@ func draw_grid(grid_type : int) -> void: for y in range(Global.grid_height, size.y, Global.grid_height): draw_line(Vector2(location.x, y), Vector2(size.x, y), Global.grid_color, true) - # Doesn't work properly yet - # Has problems when the canvas isn't a square, and with some grid sizes if grid_type == Global.Grid_Types.ISOMETRIC || grid_type == Global.Grid_Types.ALL: var i := 0 - for x in range(Global.grid_width, size.x + 2, Global.grid_width * 2): - for y in range(0, size.y + 1, Global.grid_width): + for x in range(Global.grid_isometric_cell_size, size.x + 2, Global.grid_isometric_cell_size * 2): + for y in range(0, size.y + 1, Global.grid_isometric_cell_size): draw_isometric_tile(i, Vector2(x, y)) i += 1 -func draw_isometric_tile(i : int, origin := Vector2.RIGHT) -> void: +func draw_isometric_tile(i : int, origin := Vector2.RIGHT, cell_size : int = Global.grid_isometric_cell_size) -> void: # A random value I found by trial and error, I have no idea why it "works" var diff = 1.11754 var approx_30_degrees = deg2rad(26.565) @@ -38,10 +36,10 @@ func draw_isometric_tile(i : int, origin := Vector2.RIGHT) -> void: if i < isometric_polylines.size(): pool = isometric_polylines[i] else: - var a = origin - var b = a + Vector2(cos(approx_30_degrees), sin(approx_30_degrees)) * Global.grid_width * diff - var c = a + Vector2.DOWN * Global.grid_width - var d = c - Vector2(cos(approx_30_degrees), sin(approx_30_degrees)) * Global.grid_width * diff + var a = origin - Vector2(0, 0.5) + var b = a + Vector2(cos(approx_30_degrees), sin(approx_30_degrees)) * cell_size * diff + var c = a + Vector2.DOWN * cell_size + var d = c - Vector2(cos(approx_30_degrees), sin(approx_30_degrees)) * cell_size * diff pool.append(a) pool.append(b) pool.append(c)