godot-planet/assets/maujoe.camera_control/scripts/camera_control_gui.gd

297 lines
8.0 KiB
GDScript

# Licensed under the MIT License.
# Copyright (c) 2018 Jaccomo Lorenz (Maujoe)
extends Control
# Constant Gui Settings
#*******************************************************************************
const GUI_POS = Vector2(10, 10)
const GUI_SIZE = Vector2(200, 0)
const DRAGGABLE = true
const CUSTOM_BACKGROUND = false
const BACKGROUND_COLOR = Color(0.15, 0.17, 0.23, 0.75)
const MAX_SPEED = 50
#*******************************************************************************
var camera
var shortcut
var node_list
var privot
var panel
var mouse_over = false
var mouse_pressed = false
func _init(camera, shortcut):
self.camera = camera
self.shortcut = shortcut
func _ready():
if camera.enabled:
set_process_input(true)
# Create Gui
panel = PanelContainer.new()
panel.set_begin(GUI_POS)
panel.set_custom_minimum_size(GUI_SIZE)
if CUSTOM_BACKGROUND:
var style = StyleBoxFlat.new()
style.set_bg_color(BACKGROUND_COLOR)
style.set_expand_margin_all(5)
panel.add_stylebox_override("panel", style)
var container = VBoxContainer.new()
var lbl_mouse = Label.new()
lbl_mouse.set_text("Mousemode")
var mouse = OptionButton.new()
mouse.add_item("Visible")
mouse.add_item("Hidden")
mouse.add_item("Captured")
mouse.add_item("Confined")
mouse.select(camera.mouse_mode)
mouse.connect("item_selected",self,"_on_opt_mouse_item_selected")
# Mouselook
var mouselook = CheckButton.new()
mouselook.set_text("Mouselook")
mouselook.set_toggle_mode(true)
mouselook.set_pressed(camera.mouselook)
mouselook.connect("toggled",self,"_on_btn_mouselook_toggled")
var lbl_sensitivity = Label.new()
lbl_sensitivity.set_text("Sensitivity")
var sensitivity = HScrollBar.new()
sensitivity.set_max(1)
sensitivity.set_value(camera.sensitivity)
sensitivity.connect("value_changed",self,"_on_hsb_sensitivity_value_changed")
var lbl_smoothless = Label.new()
lbl_smoothless.set_text("Smoothness")
var smoothness = HScrollBar.new()
smoothness.set_max(0.999)
smoothness.set_min(0.5)
smoothness.set_value(camera.smoothness)
smoothness.connect("value_changed",self,"_on_hsb_smoothness_value_changed")
var lbl_privot = Label.new()
lbl_privot.set_text("Privot")
privot = OptionButton.new()
privot.set_text("Privot")
_update_privots(privot)
privot.connect("item_selected",self,"_on_opt_privot_item_selected")
privot.connect("pressed",self,"_on_opt_privot_pressed")
var btn_rot_privot = CheckButton.new()
btn_rot_privot.set_text("Rotate Privot")
btn_rot_privot.set_toggle_mode(true)
btn_rot_privot.set_pressed(camera.rotate_privot)
btn_rot_privot.connect("toggled",self,"_on_btn_rot_privot_toggled")
var lbl_distance = Label.new()
lbl_distance.set_text("Distance")
var distance = SpinBox.new()
distance.set_value(camera.distance)
distance.connect("value_changed",self,"_on_box_distance_value_changed")
var lbl_yaw = Label.new()
lbl_yaw.set_text("Yaw Limit")
var yaw = SpinBox.new()
yaw.set_max(360)
yaw.set_value(camera.yaw_limit)
yaw.connect("value_changed",self,"_on_box_yaw_value_changed")
var lbl_pitch = Label.new()
lbl_pitch.set_text("Pitch Limit")
var pitch = SpinBox.new()
pitch.set_max(360)
pitch.set_value(camera.pitch_limit)
pitch.connect("value_changed",self,"_on_box_pitch_value_changed")
var collisions = CheckButton.new()
collisions.set_text("Collisions")
collisions.set_toggle_mode(true)
collisions.set_pressed(camera.collisions)
collisions.connect("toggled",self,"_on_btn_collisions_toggled")
# Movement
var lbl_movement = Label.new()
lbl_movement.set_text("Movement")
var movement = CheckButton.new()
movement.set_pressed(camera.movement)
movement.connect("toggled",self,"_on_btn_movement_toggled")
var lbl_speed = Label.new()
lbl_speed.set_text("Max Speed")
var speed = HScrollBar.new()
speed.set_max(MAX_SPEED)
speed.set_value(camera.max_speed.x)
speed.connect("value_changed",self,"_on_hsb_speed_value_changed")
var lbl_acceleration = Label.new()
lbl_acceleration.set_text("Acceleration")
var acceleration = HScrollBar.new()
acceleration.set_max(1.0)
acceleration.set_value(camera.acceleration)
acceleration.connect("value_changed", self, "_in_hsb_acceleration_value_changed")
var lbl_deceleration = Label.new()
lbl_deceleration.set_text("Deceleration")
var deceleration = HScrollBar.new()
deceleration.set_max(1.0)
deceleration.set_value(camera.deceleration)
deceleration.connect("value_changed", self, "_in_hsb_deceleration_value_changed")
add_child(panel)
panel.add_child(container)
container.add_child(lbl_mouse)
container.add_child(mouse)
container.add_child(mouselook)
container.add_child(lbl_sensitivity)
container.add_child(sensitivity)
container.add_child(lbl_smoothless)
container.add_child(smoothness)
container.add_child(lbl_privot)
container.add_child(privot)
container.add_child(btn_rot_privot)
container.add_child(lbl_distance)
container.add_child(distance)
container.add_child(lbl_yaw)
container.add_child(yaw)
container.add_child(lbl_pitch)
container.add_child(pitch)
container.add_child(collisions)
container.add_child(lbl_movement)
container.add_child(movement)
container.add_child(lbl_speed)
container.add_child(speed)
container.add_child(lbl_acceleration)
container.add_child(acceleration)
container.add_child(lbl_deceleration)
container.add_child(deceleration)
if DRAGGABLE:
panel.connect("mouse_entered", self, "_panel_entered")
panel.connect("mouse_exited", self, "_panel_exited")
container.connect("mouse_entered", self, "_panel_entered")
container.connect("mouse_exited", self, "_panel_exited")
self.hide()
else:
set_process_input(false)
func _input(event):
if event.is_action_pressed(shortcut):
if camera.enabled:
camera.enabled = false
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
self.show()
else:
camera.enabled = true
self.hide()
if DRAGGABLE:
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
mouse_pressed = event.pressed
elif event is InputEventMouseMotion and mouse_over and mouse_pressed:
panel.set_begin(panel.get_begin() + event.relative)
func _update_privots(privot):
privot.clear()
privot.add_item("None")
node_list = _get_spatials_recusiv(get_tree().get_root(), [get_name(), camera.get_name()])
var size = node_list.size()
for i in range(0, size):
var node = node_list[i]
privot.add_item(node.get_name())
if node == camera.privot:
privot.select(i+1)
if not camera.privot:
privot.select(0)
func _get_spatials_recusiv(node, exceptions=[]):
var list = []
for child in node.get_children():
if not child.get_name() in exceptions:
if child is Spatial:
list.append(child)
if not child.get_children().empty():
for subchild in _get_spatials_recusiv(child, exceptions):
list.append(subchild)
return list
func _panel_entered():
mouse_over = true
func _panel_exited():
mouse_over = false
func _on_opt_mouse_item_selected(id):
camera.mouse_mode = id
func _on_btn_mouselook_toggled(pressed):
camera.mouselook = pressed
func _on_hsb_sensitivity_value_changed(value):
camera.sensitivity = value
func _on_hsb_smoothness_value_changed(value):
camera.smoothness = value
func _on_opt_privot_pressed():
_update_privots(privot)
func _on_opt_privot_item_selected(id):
if id > 0:
camera.privot = node_list[id-1]
else:
camera.privot = null
privot.select(id)
func _on_btn_rot_privot_toggled(pressed):
camera.rotate_privot = pressed
func _on_box_distance_value_changed(value):
camera.distance = value
func _on_box_yaw_value_changed(value):
camera.yaw_limit = value
func _on_box_pitch_value_changed(value):
camera.pitch_limit = value
func _on_btn_collisions_toggled(pressed):
camera.collisions = pressed
func _on_btn_movement_toggled(pressed):
camera.movement = pressed
func _on_hsb_speed_value_changed(value):
camera.max_speed.x = value
camera.max_speed.y = value
camera.max_speed.z = value
func _in_hsb_acceleration_value_changed(value):
camera.acceleration = value
func _in_hsb_deceleration_value_changed(value):
camera.deceleration = value