70 lines
2.6 KiB
GDScript
70 lines
2.6 KiB
GDScript
tool
|
|
extends Spatial
|
|
|
|
export var material : Material setget set_material
|
|
export(int, "Full", "ArrowOnly", "TorusOnly", "Nothing") var mode = 0 setget set_mode
|
|
|
|
|
|
signal move(v)
|
|
signal rotate(v, a)
|
|
|
|
|
|
func _ready():
|
|
set_material(material)
|
|
|
|
func set_mode(m):
|
|
mode = m
|
|
match m:
|
|
0:
|
|
$Arrow.visible = true
|
|
$TranslateArea.visible = true
|
|
$Torus.visible = true
|
|
$RotateArea.visible = true
|
|
1:
|
|
$Arrow.visible = true
|
|
$TranslateArea.visible = true
|
|
$Torus.visible = false
|
|
$RotateArea.visible = false
|
|
2:
|
|
$Arrow.visible = false
|
|
$TranslateArea.visible = false
|
|
$Torus.visible = true
|
|
$RotateArea.visible = true
|
|
_:
|
|
$Arrow.visible = false
|
|
$TranslateArea.visible = false
|
|
$Torus.visible = false
|
|
$RotateArea.visible = false
|
|
|
|
func set_material(m):
|
|
material = m
|
|
if is_inside_tree():
|
|
$Arrow.set_surface_material(0, material)
|
|
$Torus.set_surface_material(0, material)
|
|
|
|
func _on_TranslateArea_input_event(camera, event, _position, _normal, _shape_idx):
|
|
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
|
|
$Arrow.get_surface_material(0).set_shader_param("highlight", 0.1 if event.pressed else 0.0)
|
|
elif event is InputEventMouseMotion and event.button_mask == BUTTON_MASK_LEFT:
|
|
var origin : Vector3 = global_transform.xform(Vector3(0, 0, 0))
|
|
var end : Vector3 = global_transform.xform(Vector3(1, 0, 0))
|
|
var direction_2d : Vector2 = camera.unproject_position(end) - camera.unproject_position(origin)
|
|
var direction_2d_length2 : float = direction_2d.length_squared()
|
|
if direction_2d_length2 != 0:
|
|
var amount : float = event.relative.dot(direction_2d)/direction_2d_length2
|
|
emit_signal("move", amount*global_transform.basis.xform(Vector3(1, 0, 0)))
|
|
|
|
var rotate_direction_2d : Vector2
|
|
func _on_RotateArea_input_event(camera, event, position, _normal, _shape_idx):
|
|
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
|
|
$Torus.get_surface_material(0).set_shader_param("highlight", 0.1 if event.pressed else 0.0)
|
|
if event.pressed:
|
|
var tangent = (position-global_transform.origin).cross(global_transform.basis.xform(Vector3(1.0, 0.0, 0.0)))
|
|
var end : Vector3 = position+tangent
|
|
rotate_direction_2d = camera.unproject_position(end) - camera.unproject_position(position)
|
|
elif event is InputEventMouseMotion and event.button_mask == BUTTON_MASK_LEFT:
|
|
var rotate_direction_2d_length2 : float = rotate_direction_2d.length_squared()
|
|
if rotate_direction_2d_length2 != 0:
|
|
var amount : float = -event.relative.dot(rotate_direction_2d)/rotate_direction_2d_length2
|
|
emit_signal("rotate", global_transform.basis.xform(Vector3(1, 0, 0)), amount)
|