small racing game im working on
Diffstat (limited to 'ui/editor/hatch.gd')
| -rw-r--r-- | ui/editor/hatch.gd | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/ui/editor/hatch.gd b/ui/editor/hatch.gd new file mode 100644 index 0000000..28bafeb --- /dev/null +++ b/ui/editor/hatch.gd @@ -0,0 +1,54 @@ +extends SubViewportContainer + +@onready var history: UndoRedo = owner.history + +signal created(object: TrackObject) +signal remove_tobj(tobj: TrackObject) + +func _can_drop_data(_at_position: Vector2, data) -> bool: + return ( + data is Array + and data.size() == 2 + and data[0] is Array[TrackObject] + and data[1] is PackedVector3Array + and data[0].size() == data[1].size() + ) or data is Array[TrackObject] + + +func _drop_data(at_position: Vector2, data) -> void: + var objs: Array[TrackObject] + var offsets: PackedVector3Array = [] + var offsets_unset := false + if ( + data is Array + and data.size() == 2 + and data[0] is Array[TrackObject] + and data[1] is PackedVector3Array + and data[0].size() == data[1].size() + ): + objs = data[0] + offsets = data[1] + elif data is Array[TrackObject]: + objs = data + offsets_unset = true + history.create_action("add blocks"); + for i in len(objs): + var obj := objs[i] + var node: Block = obj.create(true) + var projected: Vector3 = %cam.project_position(at_position, 50) + var pos := (projected + offsets[i] if not offsets_unset else projected).snapped(Globals.SNAP) + obj.set_live(node) + history.add_do_method(add_obj.bind(obj, pos)) + history.add_undo_method(remove_obj.bind(obj)) + history.add_do_reference(node) + history.commit_action() + +func add_obj(o: TrackObject, pos = null): + %port.add_child(o.live_node) + if pos is Vector3: + o.live_node.global_position = pos + created.emit(o) + +func remove_obj(o: TrackObject): + remove_tobj.emit(o) + %port.remove_child(o.live_node) |