From 7f99bdbef5c6e91daa8a536f3a69be094ae2daac Mon Sep 17 00:00:00 2001 From: William Tilton Date: Thu, 22 Oct 2020 18:21:55 -0700 Subject: [PATCH] End --- Main.tscn | 9 ++++----- Scripts/Main.gd | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/Main.tscn b/Main.tscn index 6329402..22618d6 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1,10 +1,8 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://Scripts/Main.gd" type="Script" id=1] [ext_resource path="res://Scripts/Camera.gd" type="Script" id=2] -[sub_resource type="CubeMesh" id=6] - [sub_resource type="SpatialMaterial" id=4] albedo_color = Color( 0.592157, 0.905882, 0.0862745, 1 ) @@ -14,12 +12,13 @@ material = SubResource( 4 ) [node name="Main" type="Spatial"] transform = Transform( 1, 0, 0, 0, 0.99977, 0.021431, 0, -0.021431, 0.99977, 0, 0, 0 ) script = ExtResource( 1 ) +show_wireframe = false +show_axes = false +show_face_normals = false [node name="Meshes" type="Node" parent="."] [node name="Cube" type="MeshInstance" parent="Meshes"] -mesh = SubResource( 6 ) -material/0 = null [node name="Floor" type="MeshInstance" parent="Meshes"] transform = Transform( 6.88346, 0, 0, 0, 0.0447118, 0, 0, 0, 7.16078, 0, 0, 0 ) diff --git a/Scripts/Main.gd b/Scripts/Main.gd index c7765d0..6f31276 100644 --- a/Scripts/Main.gd +++ b/Scripts/Main.gd @@ -253,3 +253,37 @@ func _on_StaticBody_mouse_exited(): func _on_StaticBody_input_event(camera, event, click_position, click_normal, shape_idx): if event.is_action_pressed("left_mouse"): print("Pos ", click_position) + var face_index = get_hit_mesh_triangle_face_index(click_position) + if face_index > -1: + drawSelectedOutline(face_index) + +func get_hit_mesh_triangle_face_index(hitVector): + var cubeMeshInstance = get_node("Meshes/Cube") + var cubeMesh = cubeMeshInstance.get_mesh() + var vertices = cubeMesh.get_faces() + var arrayMesh = ArrayMesh.new() + var arrays = [] + arrays.resize(ArrayMesh.ARRAY_MAX) + arrays[ArrayMesh.ARRAY_VERTEX] = vertices + arrayMesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays) + var meshDataTool = MeshDataTool.new() + meshDataTool.create_from_surface(arrayMesh, 0) + var camera_origin = camera.get_global_transform().origin + var purple_arrow = hitVector - camera_origin + var i = 0 + while i < vertices.size(): + var face_index = i / 3 + var a = cubeMeshInstance.to_global(vertices[i]) + var b = cubeMeshInstance.to_global(vertices[i + 1]) + var c = cubeMeshInstance.to_global(vertices[i + 2]) + + var intersects_triangle = Geometry.ray_intersects_triangle(camera_origin, purple_arrow, a, b, c) + + if intersects_triangle != null: + var angle = rad2deg(purple_arrow.angle_to(meshDataTool.get_face_normal(face_index))) + if angle > 90 and angle < 180: + return face_index + + i += 3 + + return -1