[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")]