297 lines
8.0 KiB
GDScript3
297 lines
8.0 KiB
GDScript3
|
# 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
|