113 lines
3.5 KiB
Text
113 lines
3.5 KiB
Text
[gd_scene load_steps=7 format=3 uid="uid://wlhsarkeqe8r"]
|
|
|
|
[ext_resource type="PackedScene" uid="uid://tasbgr10p84c" path="res://menus/menu.tscn" id="1_3roig"]
|
|
|
|
[sub_resource type="GDScript" id="GDScript_gfsnp"]
|
|
script/source = "# this whole code is from \"GUI in 3D\"
|
|
# which is something I downloaded a long time ago so no link
|
|
|
|
extends Node3D
|
|
|
|
var is_mouse_inside := false
|
|
var last_event_pos2D := Vector2()
|
|
var last_event_time := -1.0
|
|
|
|
@onready var node_viewport: SubViewport = $SubViewport
|
|
@onready var node_quad: MeshInstance3D = $MeshInstance3D
|
|
@onready var node_area: Area3D = $MeshInstance3D/Area3D
|
|
|
|
func _ready() -> void:
|
|
node_area.mouse_entered.connect(_mouse_entered_area)
|
|
node_area.mouse_exited.connect(_mouse_exited_area)
|
|
node_area.input_event.connect(_mouse_input_event)
|
|
|
|
func _mouse_entered_area() -> void:
|
|
is_mouse_inside = true
|
|
|
|
func _mouse_exited_area() -> void:
|
|
is_mouse_inside = false
|
|
|
|
func _unhandled_input(event: InputEvent) -> void:
|
|
for mouse_event in [InputEventMouseButton, InputEventMouseMotion, InputEventScreenDrag, InputEventScreenTouch]:
|
|
if is_instance_of(event, mouse_event):
|
|
return
|
|
node_viewport.push_input(event)
|
|
|
|
func _mouse_input_event(_camera: Camera3D, event: InputEvent, event_position: Vector3, _normal: Vector3, _shape_idx: int) -> void:
|
|
var quad_mesh_size: Vector2 = node_quad.mesh.size
|
|
var now := Time.get_ticks_msec() / 1000.0
|
|
|
|
var event_pos3D := event_position
|
|
event_pos3D = node_quad.global_transform.affine_inverse() * event_pos3D
|
|
|
|
var event_pos2D := Vector2()
|
|
if is_mouse_inside:
|
|
event_pos2D = Vector2(event_pos3D.x, -event_pos3D.y)
|
|
|
|
event_pos2D.x = event_pos2D.x / quad_mesh_size.x
|
|
event_pos2D.y = event_pos2D.y / quad_mesh_size.y
|
|
|
|
event_pos2D.x += 0.5
|
|
event_pos2D.y += 0.5
|
|
|
|
event_pos2D.x *= node_viewport.size.x
|
|
event_pos2D.y *= node_viewport.size.y
|
|
|
|
elif last_event_pos2D != null:
|
|
event_pos2D = last_event_pos2D
|
|
|
|
event.position = event_pos2D
|
|
if event is InputEventMouse:
|
|
event.global_position = event_pos2D
|
|
|
|
if event is InputEventMouseMotion or event is InputEventScreenDrag:
|
|
if last_event_pos2D == null:
|
|
event.relative = Vector2(0, 0)
|
|
else:
|
|
event.relative = event_pos2D - last_event_pos2D
|
|
event.velocity = event.relative / (now - last_event_time)
|
|
|
|
last_event_pos2D = event_pos2D
|
|
last_event_time = now
|
|
node_viewport.push_input(event)
|
|
|
|
# original code
|
|
|
|
func change_menu(new_menu: Control):
|
|
$SubViewport/Menu.add(new_menu)
|
|
"
|
|
|
|
[sub_resource type="QuadMesh" id="QuadMesh_gfsnp"]
|
|
|
|
[sub_resource type="ViewportTexture" id="ViewportTexture_gfsnp"]
|
|
viewport_path = NodePath("SubViewport")
|
|
|
|
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_a5lkq"]
|
|
resource_local_to_scene = true
|
|
transparency = 1
|
|
shading_mode = 0
|
|
albedo_texture = SubResource("ViewportTexture_gfsnp")
|
|
|
|
[sub_resource type="BoxShape3D" id="BoxShape3D_gfsnp"]
|
|
size = Vector3(1, 1, 0.01)
|
|
|
|
[node name="Panel" type="Node3D"]
|
|
process_mode = 3
|
|
script = SubResource("GDScript_gfsnp")
|
|
|
|
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
|
mesh = SubResource("QuadMesh_gfsnp")
|
|
surface_material_override/0 = SubResource("StandardMaterial3D_a5lkq")
|
|
|
|
[node name="Area3D" type="Area3D" parent="MeshInstance3D"]
|
|
collision_layer = 2
|
|
input_capture_on_drag = true
|
|
|
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/Area3D"]
|
|
shape = SubResource("BoxShape3D_gfsnp")
|
|
|
|
[node name="SubViewport" type="SubViewport" parent="."]
|
|
gui_embed_subwindows = true
|
|
render_target_update_mode = 4
|
|
|
|
[node name="Menu" parent="SubViewport" instance=ExtResource("1_3roig")]
|