small racing game im working on
Diffstat (limited to 'ui/editor/cam.gd')
-rw-r--r--ui/editor/cam.gd48
1 files changed, 48 insertions, 0 deletions
diff --git a/ui/editor/cam.gd b/ui/editor/cam.gd
new file mode 100644
index 0000000..88c9ba8
--- /dev/null
+++ b/ui/editor/cam.gd
@@ -0,0 +1,48 @@
+extends Camera3D
+
+var freelook := false;
+var panning := false;
+var mp_before_freelook := Vector2.ZERO;
+const MOUSE_SENSITIVTY = 0.02;
+const PAN_SENSITIVITY = 0.5;
+const SCROLL_SENS = 2;
+const CAMERA_MAX_ROTATION_ANGLE = deg_to_rad(70);
+
+var m_vel := Vector2.ZERO
+@onready var last_m_pos := get_viewport().get_mouse_position()
+
+func _process(_delta):
+ m_vel = get_viewport().get_mouse_position() - last_m_pos
+ last_m_pos = get_viewport().get_mouse_position()
+ if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
+ if Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED:
+ mp_before_freelook = get_viewport().get_mouse_position()
+ Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED);
+ freelook = true;
+ elif Input.is_action_pressed("ui_pan"):
+ var vel := m_vel * PAN_SENSITIVITY
+ position -= (transform.basis.x * vel.x)
+ position += (transform.basis.y * vel.y)
+ panning = true
+ else:
+ if Input.get_mouse_mode() != Input.MOUSE_MODE_VISIBLE:
+ Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE);
+ freelook = false;
+ get_viewport().warp_mouse(mp_before_freelook)
+ panning = false
+
+func _input(event: InputEvent):
+ if freelook and event is InputEventMouseMotion:
+ rotation.x = clamp(rotation.x + (-event.relative.y * MOUSE_SENSITIVTY), -CAMERA_MAX_ROTATION_ANGLE, CAMERA_MAX_ROTATION_ANGLE);
+ rotation.y += -event.relative.x * MOUSE_SENSITIVTY;
+ elif event is InputEventMouseButton:
+ match event.button_index:
+ # camera zoom
+ MOUSE_BUTTON_WHEEL_UP: global_position -= global_transform.basis.z * SCROLL_SENS
+ MOUSE_BUTTON_WHEEL_DOWN: global_position += global_transform.basis.z * SCROLL_SENS
+ elif event is InputEventMouseMotion and panning:
+ var v := get_viewport()
+ var mp := v.get_mouse_position()
+ if not Rect2(Vector2(), v.size).grow(-15).has_point(mp):
+ v.warp_mouse(mp.posmodv(v.size))
+ last_m_pos = mp.posmodv(v.size)