small godot addon for gizmo creation
Diffstat (limited to 'test.gd')
-rw-r--r--test.gd67
1 files changed, 67 insertions, 0 deletions
diff --git a/test.gd b/test.gd
new file mode 100644
index 0000000..17cf142
--- /dev/null
+++ b/test.gd
@@ -0,0 +1,67 @@
+extends Node3D
+
+var current: Gizmo
+var gizmo_holder := Node3D.new()
+
+var original_gh_p: Vector3
+var original_positions: PackedVector3Array = []
+var original_rotations: PackedVector3Array = []
+var original_scales: PackedVector3Array = []
+
+@export var target: Node3D
+@export var gizmo: PackedScene
+@onready var targets: Array[Node3D] = [target]
+
+func _ready() -> void:
+ add_child(gizmo_holder)
+ current = gizmo.instantiate()
+ _position_gizmo_holder()
+ gizmo_holder.add_child(current)
+ _setup_originals()
+ current.finalize.connect(_gizmo_finalize)
+ current.displaced.connect(_gizmo_displace)
+ current.scaled.connect(_gizmo_scale)
+ current.rotated.connect(_gizmo_rotate)
+
+func _position_gizmo_holder() -> void:
+ var sum := Vector3.ZERO
+ for node in targets:
+ sum += node.global_position
+ gizmo_holder.global_position = sum / len(targets)
+
+func _setup_originals() -> void:
+ original_positions.resize(len(targets))
+ original_rotations.resize(len(targets))
+ original_scales.resize(len(targets))
+ for i in len(targets):
+ var n := targets[i]
+ original_positions[i] = n.global_position
+ original_rotations[i] = n.global_rotation
+ original_scales[i] = n.scale
+ original_gh_p = gizmo_holder.global_position
+
+func _gizmo_displace(offset: Vector3):
+ for i in len(targets):
+ targets[i].global_position = original_positions[i] + offset
+ gizmo_holder.global_position = original_gh_p + offset
+
+func _gizmo_scale(change: Vector3):
+ for i in len(targets):
+ var n := targets[i]
+ var scl := original_scales[i] + change
+ if scl.x <= 0 || scl.y <= 0: # no flipping allowed
+ scl = Vector3.ONE
+ n.scale = scl
+
+func _gizmo_rotate(change: Vector3):
+ for i in len(targets):
+ var n := targets[i]
+ n.global_rotation = original_rotations[i] + change
+
+func _gizmo_finalize():
+ for i in len(targets):
+ var n := targets[i]
+ original_positions[i] = n.global_position
+ original_scales[i] = n.scale
+ original_rotations[i] = n.global_rotation
+ original_gh_p = gizmo_holder.global_position