To anyone that finds this:
Use this function to get the face index of a mesh from a RayCast hit position (or any vector) and the current camera.
#Gets the face index player is activating
func get_hit_mesh_triangle_face_index(hitVector, currentCamera):
var cubeMeshInstance = get_child(0)
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 = currentCamera.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