Skip to content
This repository was archived by the owner on May 13, 2025. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
130fa7e
Keybinds for cancelling/finishing placement
jaschutte Jun 2, 2024
1d64c84
Groundwork for detecting new vertex insertions
jaschutte Jun 2, 2024
ed6d344
Start interaction on press
jaschutte Jun 2, 2024
f3b88f8
Fixed system not crashing if there's no add vertex button
jaschutte Jun 2, 2024
4dd857d
Added new vertex support
jaschutte Jun 2, 2024
a0a50be
Reworked reparent_buttons
jaschutte Jun 2, 2024
fc8c335
Saving & discarding changes
jaschutte Jun 2, 2024
70102cc
Safe zone for corner buttons
jaschutte Jun 2, 2024
fb3f0a5
Fixed unable to drag index 0
jaschutte Jun 2, 2024
c9931f8
Save Polygon Editor in its own scene
Koopa1018 Jul 11, 2024
45112c6
Move vertex icons into poly-edit folder
Koopa1018 Jul 11, 2024
5c0dc06
Rename should_have_buttons to show_verts
Koopa1018 Jul 11, 2024
9e10d58
Heckithit shorten the other "should"s too
Koopa1018 Jul 11, 2024
db10c12
Move vertex buttons into node tree
Koopa1018 Jul 13, 2024
31816d7
Rename AddVert for consistency with scripts
Koopa1018 Jul 13, 2024
07cc913
Reconnect add-terrain button to poly-editor
Koopa1018 Jul 13, 2024
575c22d
Use prefab placed verts
Koopa1018 Jul 13, 2024
979c1e3
Use prefab add vert
Koopa1018 Jul 14, 2024
7cb4288
Comment reparent_buttons()
Koopa1018 Jul 14, 2024
07da8b2
Comment & cleanup edge drawing routine
Koopa1018 Jul 14, 2024
36582da
Comment and cleanup add-vert placement
Koopa1018 Jul 17, 2024
1450c5d
Script for buttons with separate lmb+rmb signals
Koopa1018 Jul 18, 2024
2e78131
Connect move-button signal only to left click
Koopa1018 Jul 18, 2024
8c77acc
Ignore LMB/RMB events if mouse has moved
Koopa1018 Jul 18, 2024
060486a
Properly detect RMB-button mouse-off state
Koopa1018 Jul 18, 2024
735be20
Refactor add/move signal & callback naming
Koopa1018 Jul 18, 2024
8879265
Add delete-vertex signal, integrate with RMB
Koopa1018 Jul 18, 2024
99dc254
Call PolygonEditor fns directly from PolygonDraw
Koopa1018 Jul 18, 2024
4ef9e40
Misc refactoring to the polygon editor`
Koopa1018 Jul 18, 2024
c04f60a
Reorder functions in polygon_editor
Koopa1018 Jul 18, 2024
cfa0d4b
Finally get vertex removal implemented
Koopa1018 Jul 18, 2024
16e059b
Delete terrain when too few verts remain
Koopa1018 Jul 18, 2024
72195a2
Underscore private fns in selection_handler
Koopa1018 Jul 18, 2024
8c63c12
Formal API for de/selecting things
Koopa1018 Jul 18, 2024
6ca7da5
Heckithit this fn can be static
Koopa1018 Jul 18, 2024
a5aa0da
Connect polygon deletion to selection
Koopa1018 Jul 18, 2024
33669b4
Create new-vert button before placed verts
Koopa1018 Jul 18, 2024
852486e
Revert vertex widgets to default size
Koopa1018 Jul 18, 2024
c88b58f
Different cursor shape for placed verts
Koopa1018 Jul 18, 2024
8a5470d
Reformat _unhandled_input as a match statement
Koopa1018 Jul 18, 2024
8c7d98f
Refactor polyedit _process to use refresh
Koopa1018 Jul 18, 2024
870b814
Finish commenting polygon editor/draw
Koopa1018 Jul 18, 2024
14b3792
Comment out adding extra close-gap vertex
Koopa1018 Jul 18, 2024
0227714
Make in_level a formal EDITOR_STATE
Koopa1018 Jul 20, 2024
714a195
Formalize signature of editor_state_changed
Koopa1018 Jul 20, 2024
d31e0f1
Revert "Make in_level a formal EDITOR_STATE"
Koopa1018 Jul 20, 2024
757490f
Add playtest start/end signals to main
Koopa1018 Jul 20, 2024
8930278
Finalize polygon edits when playtest starts
Koopa1018 Jul 20, 2024
cbd2301
Emit playtest_ended fully after end-playtest
Koopa1018 Jul 20, 2024
8efe751
Relocate deselect-on-delete logic
Koopa1018 Jul 20, 2024
13f45a1
De-static is_a_polygon_item() so it doesn't warn
Koopa1018 Jul 20, 2024
f6cb113
Move placed verts via drag, not click
Koopa1018 Jul 26, 2024
e85cd63
Use pointing-hand cursor during vertex delete
Koopa1018 Jul 26, 2024
2be84b1
Put cursor in dragging state while dragging verts
Koopa1018 Jul 27, 2024
e95dbf9
Hide add-vert button when mouse is near drag range
Koopa1018 Jul 27, 2024
f5b97c8
Show the edited polygon in realtime
Koopa1018 Jul 27, 2024
bbe60bb
Update polygon display after each vertex added
cruglet Aug 20, 2024
b63905d
Fix add-vertex button not appearing on last edge
cruglet Aug 20, 2024
bcc61bf
Comment and cleanup last-edge fixes
Koopa1018 Aug 20, 2024
356eb1c
Show polygon validity
cruglet Aug 21, 2024
87544b6
Terrain selection handler fix
cruglet Aug 21, 2024
4d88ead
Reset valid state after terrain freed
cruglet Aug 21, 2024
4476756
Update validity when removing vertex
cruglet Aug 21, 2024
06f984c
Refactor to standard, and for clarity
Koopa1018 Aug 21, 2024
1cc1ff9
Update invalidity marking during poly creation
Koopa1018 Aug 21, 2024
9fe1655
Merge adjacent verts that share a position
Koopa1018 Aug 21, 2024
3dd4e64
My bad, invalid 3-point shapes can exist
Koopa1018 Aug 21, 2024
376146d
Refactor self-intersect detection to return edges
Koopa1018 Aug 21, 2024
c82118b
Re-enable property menu crash for terrain
Koopa1018 Aug 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions gui/custom_nodes/polygon_container.gd
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ func append(pos):
button.set_position(pos)
button.set_size(Vector2(12, 12))
button.action_mode = BaseButton.ACTION_MODE_BUTTON_PRESS
button.texture_normal = preload("res://scenes/menus/level_designer/ldui/drag_circle.png")
button.texture_hover = preload("res://scenes/menus/level_designer/ldui/drag_circle_hover.png")
button.texture_pressed = preload("res://scenes/menus/level_designer/ldui/drag_circle_selected.png")
button.texture_normal = preload("res://scenes/menus/level_designer/poly_edit/vertex.png")
button.texture_hover = preload("res://scenes/menus/level_designer/poly_edit/vertex_hover.png")
button.texture_pressed = preload("res://scenes/menus/level_designer/poly_edit/vertex_selected.png")
add_child(button)
queue_sort()
return button
Expand Down
40 changes: 40 additions & 0 deletions gui/custom_nodes/texture_button_rmb.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
class_name RMBTextureButton
extends TextureButton
## Texture button which can respond separately to each mouse button.
##
## The normal [signal pressed] signal is still emitted on click

# Thanks Dave and myyk for the initial implementation!
# https://stackoverflow.com/questions/66090893/how-can-i-extend-godots-button-to-distinguish-left-click-vs-right-click-events

## Signal emitted only when the button is left-clicked.
signal pressed_left
## Signal emitted only when the button is middle-clicked.
signal pressed_middle
## Signal emitted only when the button is right-clicked.
signal pressed_right

func _gui_input(event: InputEvent):
if event is InputEventMouseButton:
# Abort if the click event is not the one this button responds to.
var action_occurred: bool
match action_mode:
ACTION_MODE_BUTTON_PRESS:
action_occurred = event.pressed
ACTION_MODE_BUTTON_RELEASE:
action_occurred = !event.pressed
if !action_occurred:
return

# Abort if the click event has moved off the button.
if !is_hovered():
return

# We didn't abort. Emit the appropriate event for the button.
match event.button_index:
MOUSE_BUTTON_LEFT:
pressed_left.emit()
MOUSE_BUTTON_MIDDLE:
pressed_middle.emit()
MOUSE_BUTTON_RIGHT:
pressed_right.emit()
12 changes: 12 additions & 0 deletions project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ config_version=5
config/name="Super Mario 63 Redux"
run/main_scene="res://scenes/menus/title/title.tscn"
config/features=PackedStringArray("4.2")
run/max_fps=60
boot_splash/image="res://splash.png"
boot_splash/use_filter=false
config/icon="res://icon.png"
Expand All @@ -29,6 +30,7 @@ TouchControls="*res://classes/global/touch_control/touch_controls.tscn"

window/size/viewport_width=640
window/size/viewport_height=360
window/vsync/vsync_mode=0
mouse_cursor/custom_image="res://gui/cursor.png"
mouse_cursor/custom_image_hotspot=Vector2(1, 1)

Expand Down Expand Up @@ -409,6 +411,16 @@ altdebug={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":47,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
ld_poly_finish={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194309,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}
ld_poly_cancel={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null)
]
}

[input_devices]

Expand Down
24 changes: 21 additions & 3 deletions scenes/menus/level_designer/ld_main.gd
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,27 @@ extends Node2D
## and snap vectors (and the mouse cursor) to the grid.

## Emitted when [member editor_state] is changed.
signal editor_state_changed
signal editor_state_changed(old: EDITOR_STATE, new: EDITOR_STATE)

## Emitted just before playtesting begins, while the editor is still in a fully
## valid state.
signal playtest_started
## Emitted just after playtesting ends, once the editor is back to a fully valid
## state.
signal playtest_ended

const TERRAIN_PREFAB = preload("res://classes/solid/terrain/terrain_polygon.tscn")
const ITEM_PREFAB = preload("res://scenes/menus/level_designer/ld_item/ld_item.tscn")

enum EDITOR_STATE { IDLE, PLACING, SELECTING, DRAGGING, POLYGON_CREATE, POLYGON_EDIT }
enum EDITOR_STATE {
IDLE,
PLACING,
SELECTING,
DRAGGING,
POLYGON_CREATE,
POLYGON_EDIT,
POLYGON_DRAG_VERTEX
}

## Definitions for base classes that items can implement.
var item_classes = {}
Expand All @@ -33,6 +48,8 @@ var item_textures: Array[Dictionary] = []
## The scenes corresponding to each item. These can be used to create
## a playable node tree based on the [LDPlacedItem]s in the level.
var item_scenes = []
## The current polygon node which is being edited
var polygon_edit_node: Polygon2D

## Set to [code]true[/code] to enable returning to the level designer
## when [kbd]ld_exit[/kbd] is pressed.
Expand Down Expand Up @@ -68,13 +85,14 @@ func _process(_dt):
if in_level:
in_level = false
get_tree().change_scene_to_file("res://scenes/menus/level_designer/level_designer.tscn")
playtest_ended.emit()


# Sets the state of the editor.
func _set_editor_state(new: EDITOR_STATE):
var old = editor_state
editor_state = new
emit_signal("editor_state_changed", old, editor_state)
editor_state_changed.emit(old, editor_state)


## Gets the currently edited level node tree.
Expand Down
25 changes: 6 additions & 19 deletions scenes/menus/level_designer/level_designer.tscn
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[gd_scene load_steps=64 format=3 uid="uid://dj1885yxyxc7y"]
[gd_scene load_steps=63 format=3 uid="uid://dj1885yxyxc7y"]

[ext_resource type="Script" path="res://scenes/menus/level_designer/menu_control.gd" id="1"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/ld_main.gd" id="2"]
Expand All @@ -14,6 +14,7 @@
[ext_resource type="PackedScene" uid="uid://cf61txa666j8m" path="res://scenes/menus/level_designer/ldui/hermes.tscn" id="12"]
[ext_resource type="Texture2D" uid="uid://cb231utoaa0wy" path="res://scenes/menus/level_designer/ldui/scroll_block_v.png" id="13"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/item_pane.gd" id="14"]
[ext_resource type="PackedScene" uid="uid://cc8sxs7wl5feb" path="res://scenes/menus/level_designer/poly_edit/polygon_editor.tscn" id="14_vnnf2"]
[ext_resource type="PackedScene" uid="uid://dm0n1yq3d10ir" path="res://scenes/levels/tutorial_1/bg/bg_t1.tscn" id="15"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/start.gd" id="16"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/save.gd" id="17"]
Expand All @@ -36,8 +37,6 @@
[ext_resource type="StyleBox" uid="uid://bxk000r2o0auh" path="res://scenes/menus/level_designer/ldui/list_item_box_hover.tres" id="38"]
[ext_resource type="Texture2D" uid="uid://cpokwabiivjyv" path="res://scenes/menus/level_designer/ldui/hermes.png" id="38_bx2fd"]
[ext_resource type="StyleBox" uid="uid://27dvir8jkf4y" path="res://scenes/menus/level_designer/ldui/list_item_box_press.tres" id="39"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/polygon_draw.gd" id="40"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/polygon_editor.gd" id="41"]

[sub_resource type="AtlasTexture" id="10"]
atlas = ExtResource("22")
Expand Down Expand Up @@ -254,33 +253,20 @@ texture_normal = SubResource("16")
texture_pressed = SubResource("17")
texture_hover = SubResource("18")

[node name="PolygonEditor" type="Control" parent="UIFollow"]
layout_mode = 3
anchors_preset = 0
mouse_filter = 2
script = ExtResource("41")

[node name="Polygon" type="Control" parent="UIFollow/PolygonEditor"]
anchors_preset = 0
offset_left = 150.0
offset_top = 100.0
offset_right = 190.0
offset_bottom = 140.0
mouse_filter = 2
script = ExtResource("40")
[node name="PolygonEditor" parent="UIFollow" instance=ExtResource("14_vnnf2")]

[node name="UILayer" type="CanvasLayer" parent="."]

[node name="SaveDialog" type="FileDialog" parent="UILayer"]
size = Vector2i(390, 137)
size = Vector2i(390, 154)
mode_overrides_title = false
access = 2
filters = PackedStringArray("*.63r ; SM63 Redux Level")
script = ExtResource("6")

[node name="OpenDialog" type="FileDialog" parent="UILayer"]
title = "Open a File"
size = Vector2i(390, 137)
size = Vector2i(390, 154)
ok_button_text = "Open"
mode_overrides_title = false
file_mode = 0
Expand Down Expand Up @@ -536,6 +522,7 @@ text = "Placeholder Loading Text"
[connection signal="pressed" from="UIFollow/Selection/Buttons/Dragger" to="UIFollow/Selection/Buttons" method="_on_dragger_pressed"]
[connection signal="pressed" from="UIFollow/Selection/Buttons/Duplicator" to="UIFollow/Selection/Buttons" method="_on_duplicator_pressed"]
[connection signal="pressed" from="UIFollow/Selection/Buttons/Polygon" to="UIFollow/Selection/Buttons" method="_on_polygon_pressed"]
[connection signal="polygon_deleted" from="UIFollow/PolygonEditor" to="UIFollow/Selection" method="_on_polygon_deleted"]
[connection signal="file_selected" from="UILayer/SaveDialog" to="UILayer/SaveDialog" method="_on_SaveDialog_file_selected"]
[connection signal="file_selected" from="UILayer/OpenDialog" to="UILayer/OpenDialog" method="_on_OpenDialog_file_selected"]
[connection signal="pressed" from="UILayer/LDUI/TopBar/File" to="UILayer/LDUI/TopBar/File" method="_on_File_pressed"]
Expand Down
34 changes: 34 additions & 0 deletions scenes/menus/level_designer/poly_edit/placed_vert.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
class_name PlacedVertex
extends TextureButton
## Widget for editing a placed polygon-editor vertex.

# Thanks Dave and myyk for the initial implementation!
# https://stackoverflow.com/questions/66090893/how-can-i-extend-godots-button-to-distinguish-left-click-vs-right-click-events

## Signal emitted only when the button is left-clicked.
signal pressed_left
## Signal emitted only when the button is right-clicked.
signal pressed_right

func _gui_input(event: InputEvent):
if event is InputEventMouseButton:
# Set mouse-over cursor shape to click indicator on RMB-down events;
# otherwise, set to move indicator.
if event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
else:
mouse_default_cursor_shape = Control.CURSOR_MOVE

# Emit click events if the mouse is on the button.
if is_hovered():
match event.button_index:
MOUSE_BUTTON_LEFT:
# Respond to left clicks on press, for a drag-and-drop-like
# user experience.
if event.pressed:
pressed_left.emit()
MOUSE_BUTTON_RIGHT:
# Respond to right clicks only on release, to allow the user a
# moment to change their mind before vertex deletion.
if !event.pressed:
pressed_right.emit()
44 changes: 44 additions & 0 deletions scenes/menus/level_designer/poly_edit/polygon_editor.tscn
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
[gd_scene load_steps=7 format=3 uid="uid://cc8sxs7wl5feb"]

[ext_resource type="Script" path="res://scenes/menus/level_designer/polygon_editor.gd" id="1_qu7dx"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/polygon_draw.gd" id="2_0n75t"]
[ext_resource type="Texture2D" uid="uid://rr2wt15543er" path="res://scenes/menus/level_designer/poly_edit/vertex.png" id="3_5w5y3"]
[ext_resource type="Texture2D" uid="uid://b7x3r25ki34uj" path="res://scenes/menus/level_designer/poly_edit/vertex_selected.png" id="4_1lddh"]
[ext_resource type="Texture2D" uid="uid://cicskwmcgq06f" path="res://scenes/menus/level_designer/poly_edit/vertex_hover.png" id="5_icii8"]
[ext_resource type="Script" path="res://scenes/menus/level_designer/poly_edit/placed_vert.gd" id="6_c87d5"]

[node name="PolygonEditor" type="Control"]
layout_mode = 3
anchors_preset = 0
mouse_filter = 2
script = ExtResource("1_qu7dx")

[node name="Polygon" type="Control" parent="."]
anchors_preset = 0
offset_left = 150.0
offset_top = 100.0
offset_right = 190.0
offset_bottom = 140.0
mouse_filter = 2
script = ExtResource("2_0n75t")

[node name="NewVert" type="TextureButton" parent="Polygon"]
layout_mode = 0
offset_right = 12.0
offset_bottom = 12.0
texture_normal = ExtResource("3_5w5y3")
texture_pressed = ExtResource("4_1lddh")
texture_hover = ExtResource("5_icii8")

[node name="PlacedVert" type="TextureButton" parent="Polygon"]
layout_mode = 0
offset_right = 12.0
offset_bottom = 12.0
mouse_default_cursor_shape = 13
button_mask = 3
texture_normal = ExtResource("3_5w5y3")
texture_pressed = ExtResource("4_1lddh")
texture_hover = ExtResource("5_icii8")
script = ExtResource("6_c87d5")

[connection signal="pressed" from="Polygon/NewVert" to="Polygon" method="_on_new_vert_pressed"]
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://rr2wt15543er"
path="res://.godot/imported/drag_circle.png-fee40679159382a5708d415846ed0bdd.ctex"
path="res://.godot/imported/vertex.png-035dd769a3dd191bb30deb39c7a00f96.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://scenes/menus/level_designer/ldui/drag_circle.png"
dest_files=["res://.godot/imported/drag_circle.png-fee40679159382a5708d415846ed0bdd.ctex"]
source_file="res://scenes/menus/level_designer/poly_edit/vertex.png"
dest_files=["res://.godot/imported/vertex.png-035dd769a3dd191bb30deb39c7a00f96.ctex"]

[params]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cicskwmcgq06f"
path="res://.godot/imported/drag_circle_hover.png-4007a836e654d05cd8aefdc642cb1f95.ctex"
path="res://.godot/imported/vertex_hover.png-8cce285c4c3953e966eb6a299ac6a3da.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://scenes/menus/level_designer/ldui/drag_circle_hover.png"
dest_files=["res://.godot/imported/drag_circle_hover.png-4007a836e654d05cd8aefdc642cb1f95.ctex"]
source_file="res://scenes/menus/level_designer/poly_edit/vertex_hover.png"
dest_files=["res://.godot/imported/vertex_hover.png-8cce285c4c3953e966eb6a299ac6a3da.ctex"]

[params]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b7x3r25ki34uj"
path="res://.godot/imported/drag_circle_selected.png-01262582988f04a7495e9413c55d6647.ctex"
path="res://.godot/imported/vertex_selected.png-d20c60c602c30dfe2b6bb3eb193e410d.ctex"
metadata={
"vram_texture": false
}

[deps]

source_file="res://scenes/menus/level_designer/ldui/drag_circle_selected.png"
dest_files=["res://.godot/imported/drag_circle_selected.png-01262582988f04a7495e9413c55d6647.ctex"]
source_file="res://scenes/menus/level_designer/poly_edit/vertex_selected.png"
dest_files=["res://.godot/imported/vertex_selected.png-d20c60c602c30dfe2b6bb3eb193e410d.ctex"]

[params]

Expand Down
Loading