Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
821c161
Removed subviewport.
Armored-Dragon Jun 29, 2026
61db027
New blur shader for canvas element.
Armored-Dragon Jun 30, 2026
b38523b
Removed gizmo selection groups.
Armored-Dragon Jun 30, 2026
c21ea33
Dashboard uses new blur effect.
Armored-Dragon Jun 30, 2026
431ea00
Fixed focus issue with the node search in the inspector.
Armored-Dragon Jun 30, 2026
67d88c2
Adjustable inspector width.
Armored-Dragon Jun 30, 2026
b0622eb
Remove focus from search area when clicking out of search area.
Armored-Dragon Jun 30, 2026
a6c5586
Change mouse escape keybind to tab.
Armored-Dragon Jun 30, 2026
d6a8e55
Capture or uncapture mouse when swapping edit mode.
Armored-Dragon Jun 30, 2026
e4929ee
CEM Toolbar.
Armored-Dragon Jun 30, 2026
25fdc00
Toggle translation space between local and global.
Armored-Dragon Jun 30, 2026
b4948dc
List spawnable count in the toolbar.
Armored-Dragon Jun 30, 2026
7703cc6
Refactor Inspector.gd work.
Armored-Dragon Jul 1, 2026
6da6d1e
Basic Gizmo interaction.
Armored-Dragon Jul 1, 2026
b2b1d63
Select node by selecting it in the inspector tree.
Armored-Dragon Jul 1, 2026
9e8dfef
Gizmos respect settings again.
Armored-Dragon Jul 1, 2026
8dd0f7f
When renaming a node, start editing immedately.
Armored-Dragon Jul 1, 2026
8b9cb9e
Custom Add Node window.
Armored-Dragon Jul 2, 2026
ba4625c
Spawnable count updating.
Armored-Dragon Jul 2, 2026
7ad3636
Fixed var name.
Armored-Dragon Jul 2, 2026
533bde6
Removed and replace original inspector.gd.
Armored-Dragon Jul 2, 2026
a178275
Toggle gizmo visibility when toggling CEM.
Armored-Dragon Jul 2, 2026
677aa28
Updated icon getter.
Armored-Dragon Jul 2, 2026
f43930e
Hide nodes not intended to be spawned directly.
Armored-Dragon Jul 2, 2026
eaac978
Node reparenting.
Armored-Dragon Jul 2, 2026
e2c0e0e
Deletion queue: Fix crashes with Gizmo and deleted nodes.
Armored-Dragon Jul 2, 2026
abf2926
Better metadata handling.
Armored-Dragon Jul 2, 2026
a5275ce
Windows can not be dragged out of bounds.
Armored-Dragon Jul 2, 2026
32e3838
Only deselect if we have a gizmo.
Armored-Dragon Jul 2, 2026
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
2 changes: 1 addition & 1 deletion src/scenes/managers/app/scene.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ var active_session: String = ""

# Game managers
@onready var network_m: Node = get_tree().current_scene.get_node("NetworkManager")
@onready var scene_container: Node3D = get_tree().current_scene.get_node("HBoxContainer/VBoxContainer/SubViewportContainer/SubViewport/Scenes")
@onready var scene_container: Node3D = get_tree().current_scene.get_node("Scenes")


func _ready():
Expand Down
38 changes: 33 additions & 5 deletions src/scenes/managers/scene/spawnable_manager.gd
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,10 @@ func destroy(node_id: int) -> Variant:
var caller_id: int = multiplayer.get_remote_sender_id()

if my_id == 1:
delete_spawnable(str(node_id))
delete_spawnable.rpc(str(node_id))
var _queue = _get_deletion_queue(str(node_id))
for node in _queue:
delete_spawnable(node.name)
delete_spawnable.rpc(node.name)

if caller_id != 0 && caller_id != my_id:
# This is a client request to delete
Expand Down Expand Up @@ -126,16 +128,35 @@ func delete_spawnable(node_name: String) -> void:
var _entry_index = _database.find_custom(func(item): return item.id == int(node_name))
if _entry_index == -1:
# This should never happen! The node can never be removed from the scene tree then.
GlobalLogger.log("'%s' could not be located in the scene tree.", Enum.LogLevel.ERROR)
GlobalLogger.log("'%s' could not be located in the scene tree." % node_name, Enum.LogLevel.ERROR)
return

var _entry = _database[_entry_index]
# TODO: Remove all Gizmos relating to the node first

session_signalbus.node_destroyed.emit(node_name)
session_signalbus.node_destroyed.emit(_entry)
_entry.node.queue_free()
_database.remove_at(_entry_index)
return

func _get_deletion_queue(node_name: String) -> Array:
var _entry_index = _database.find_custom(func(item): return item.id == int(node_name))
var _node = _database[_entry_index].node

var _queue = _add_to_deletion_queue(_node)
_queue.reverse()
return _queue

func _add_to_deletion_queue(node: Node, list: Array[Node] = []) -> Array[Node]:
list.append(node)

if node.get_meta("deep_delete", true) == false:
return list

for child in node.get_children():
_add_to_deletion_queue(child, list)

return list


@rpc("authority", "reliable")
func receive_database(database: Array, id: int) -> void:
Expand All @@ -159,8 +180,14 @@ func position_spawnable(id: int, p_position: Vector3, p_rotation: Vector3, p_sca

func set_node_visible_to_inspector(node: Node) -> void:
var nodes = get_all_node_children(node)

# Check if we had already declared this node to be hidden.
if node.get_meta("scene_node", true) == false:
return

for target in nodes:
target.set_meta("scene_node", true)

return


Expand Down Expand Up @@ -210,6 +237,7 @@ func _spawn_node(node_type: int, node_owner: int, parent: Node = instance_root,
_node.name = str(_db_id)
_node.set_meta("pretty_name", _pretty_name)
_node.set_meta("spawnable_type", node_type)
_node.set_meta("icon", _node_schema.icon)
_node.position = Vector3(0, 0, 0)

# Add to scene tree
Expand Down
58 changes: 6 additions & 52 deletions src/scenes/master.tscn
Original file line number Diff line number Diff line change
@@ -1,58 +1,19 @@
[gd_scene format=3 uid="uid://cxk6c0uipjjpo"]

[ext_resource type="Script" uid="uid://b4mien0qqtx01" path="res://userinterface/client_edit_mode/desktop/cem_container.gd" id="1_2o3k7"]
[ext_resource type="PackedScene" uid="uid://5v8rbnp716b0" path="res://scenes/managers/app/network.tscn" id="1_jooxx"]
[ext_resource type="PackedScene" uid="uid://cmknpdx5ba15o" path="res://scenes/managers/app/scene.tscn" id="2_h2qy3"]
[ext_resource type="Theme" uid="uid://ckqsvvccivw0x" path="res://resources/themes/default.tres" id="2_q3f5g"]
[ext_resource type="PackedScene" uid="uid://c4y1sb6lmdr0q" path="res://userinterface/dash/dashboard.tscn" id="4_h2qy3"]
[ext_resource type="PackedScene" uid="uid://bqtqfooa7qncp" path="res://userinterface/client_edit_mode/desktop/inspector.tscn" id="5_q3f5g"]
[ext_resource type="Script" uid="uid://be2ckahbhewms" path="res://scripts/spawnable_file_handling.gd" id="6_kjytq"]

[sub_resource type="GDScript" id="GDScript_q3f5g"]
script/source = "extends SubViewportContainer

func _input(event):
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
$SubViewport.push_input(event)
"

[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q3f5g"]
bg_color = Color(0.078431375, 0.078431375, 0.078431375, 0.78431374)

[node name="Master" type="Node3D" unique_id=420526444]

[node name="HBoxContainer" type="HBoxContainer" parent="." unique_id=2132575488]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_2o3k7")

[node name="Inspector" parent="HBoxContainer" unique_id=879206536 instance=ExtResource("5_q3f5g")]
[node name="Inspector" parent="." unique_id=879206536 instance=ExtResource("5_q3f5g")]
visible = false
custom_minimum_size = Vector2(400, 0)
layout_mode = 2
mouse_filter = 1

[node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer" unique_id=409425987]
layout_mode = 2
size_flags_horizontal = 3
mouse_filter = 2

[node name="SubViewportContainer" type="SubViewportContainer" parent="HBoxContainer/VBoxContainer" unique_id=1046710585]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
stretch = true
script = SubResource("GDScript_q3f5g")

[node name="SubViewport" type="SubViewport" parent="HBoxContainer/VBoxContainer/SubViewportContainer" unique_id=417886479]
handle_input_locally = false
size = Vector2i(1920, 1080)
render_target_update_mode = 4

[node name="Crosshair" type="Control" parent="HBoxContainer/VBoxContainer/SubViewportContainer/SubViewport" unique_id=472699475]
[node name="Crosshair" type="Control" parent="." unique_id=472699475]
layout_mode = 3
anchors_preset = 8
anchor_left = 0.5
Expand All @@ -65,7 +26,7 @@ size_flags_horizontal = 4
size_flags_vertical = 4
mouse_filter = 1

[node name="CenterContainer" type="CenterContainer" parent="HBoxContainer/VBoxContainer/SubViewportContainer/SubViewport/Crosshair" unique_id=2141251222]
[node name="CenterContainer" type="CenterContainer" parent="Crosshair" unique_id=2141251222]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
Expand All @@ -75,26 +36,19 @@ anchor_bottom = 0.5
grow_horizontal = 2
grow_vertical = 2

[node name="Line2D" type="Line2D" parent="HBoxContainer/VBoxContainer/SubViewportContainer/SubViewport/Crosshair/CenterContainer" unique_id=880619905]
[node name="Line2D" type="Line2D" parent="Crosshair/CenterContainer" unique_id=880619905]
points = PackedVector2Array(5, 0, -5, 0)
closed = true
width = 2.0

[node name="Line2D2" type="Line2D" parent="HBoxContainer/VBoxContainer/SubViewportContainer/SubViewport/Crosshair/CenterContainer" unique_id=696942631]
[node name="Line2D2" type="Line2D" parent="Crosshair/CenterContainer" unique_id=696942631]
points = PackedVector2Array(0, 5, 0, -5)
closed = true
width = 2.0

[node name="Scenes" type="Node3D" parent="HBoxContainer/VBoxContainer/SubViewportContainer/SubViewport" unique_id=308239834]
[node name="Scenes" type="Node3D" parent="." unique_id=308239834]
top_level = true

[node name="Panel" type="Panel" parent="HBoxContainer/VBoxContainer" unique_id=91302866]
visible = false
custom_minimum_size = Vector2(0, 200)
layout_mode = 2
theme = ExtResource("2_q3f5g")
theme_override_styles/panel = SubResource("StyleBoxFlat_q3f5g")

[node name="NetworkManager" parent="." unique_id=1960146969 instance=ExtResource("1_jooxx")]

[node name="SceneManager" parent="." unique_id=5477810 instance=ExtResource("2_h2qy3")]
Expand Down
3 changes: 2 additions & 1 deletion src/scenes/players/player.gd
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ func _unhandled_input(event):

get_viewport().set_input_as_handled()

if "keycode" in event && event.keycode == 4194333 && event.pressed == true:
if "keycode" in event && event.keycode == 4194306 && event.pressed == true:
capture_mouse(!mouse_captured)
get_viewport().set_input_as_handled()
return
Expand Down Expand Up @@ -153,6 +153,7 @@ func capture_mouse(to_capture: bool):

func _toggle_client_edit_mode() -> void:
Events.emit_signal("cem_set_state", !cem_state)
capture_mouse(cem_state)
cem_state = !cem_state
return

Expand Down
20 changes: 20 additions & 0 deletions src/scripts/utils/node_schema_builder.gd
Original file line number Diff line number Diff line change
Expand Up @@ -16,48 +16,64 @@ static var schema = {
"pretty_name": "Gizmo",
"node": null,
"icon": load("res://resources/icons/Gizmo.svg"),
"hidden": true,
"deep_delete": false,
},
"Model": {
"requires_setup": true,
"pretty_name": "Imported Model",
"node": null,
"icon": load("res://resources/icons/godot/MeshInstance3D.svg"),
"hidden": true,
"deep_delete": true,
},
"Node3D": {
"requires_setup": false,
"pretty_name": "Node3D",
"node": "Node3D",
"icon": load("res://resources/icons/godot/Node3D.svg"),
"hidden": false,
"deep_delete": true,
},
"Box": {
"requires_setup": true,
"pretty_name": "Box",
"node": null,
"icon": load("res://resources/icons/godot/MeshInstance3D.svg"),
"hidden": false,
"deep_delete": true,
},
"Capsule": {
"requires_setup": true,
"pretty_name": "Capsule",
"node": null,
"icon": load("res://resources/icons/godot/MeshInstance3D.svg"),
"hidden": false,
"deep_delete": true,
},
"RigidBody3D": {
"requires_setup": true,
"pretty_name": "RigidBody3D",
"node": RigidBody3D,
"icon": load("res://resources/icons/godot/RigidBody3D.svg"),
"hidden": false,
"deep_delete": true,
},
"MeshInstance3D": {
"requires_setup": false,
"pretty_name": "MeshInstance3D",
"node": "MeshInstance3D",
"icon": load("res://resources/icons/godot/MeshInstance3D.svg"),
"hidden": false,
"deep_delete": true,
},
"Skeleton3D": {
"requires_setup": false,
"pretty_name": "Skeleton3D",
"node": "Skeleton3D",
"icon": load("res://resources/icons/godot/Skeleton3D.svg"),
"hidden": false,
"deep_delete": true,
},
}

Expand Down Expand Up @@ -108,9 +124,13 @@ static func _build_node(node_name: String, model_path: String = "") -> Node:
if node_name == "Gizmo":
var _work_node = Gizmo3D.new()
_work_node.top_level = true
_work_node.set_meta("scene_node", false)
_work_node.set_meta("deep_delete", false)
return _work_node

if node_name == "Model":
# TODO: Generating the scene does not seem to properly set up the MeshInstance3D, causing deletion errors.
# That also means that this probably will not work for sending meshes over the network.
var doc = GLTFDocument.new()
var state = GLTFState.new()
doc.append_from_file(model_path, state)
Expand Down
Loading