public static bool GetVisiblePointUnderCursor(
Vector3[] vertices,
Transform meshTransform,
UnityEngine.Camera camera,
Vector3 mousePos,
float accuracy,
out Vector2 screenVertex,
out Vector3 worldVertex)
{
CustomSampler s = CustomSampler.Create("point-search");
CustomSampler s2 = CustomSampler.Create("point-raycast");
s.Begin();
float minDist = float.MaxValue;
Vector3 closetsPoint = Vector3.zero;
var worldMatrix = meshTransform.localToWorldMatrix;
var screenMatrix = camera.projectionMatrix * camera.worldToCameraMatrix;
var mousePosViewSpace = camera.ScreenToViewportPoint(mousePos);
var accuracyViewSpace = camera.ScreenToViewportPoint(new Vector3(accuracy, 0, 0)).x;
for (int n = 0; n < vertices.Length; n++)
{
var worldPoint = worldMatrix.MultiplyPoint(vertices[n]);
var screenPoint = camera.WorldToScreenPoint(worldPoint);
//var screenPoint = screenMatrix.MultiplyPoint(worldPoint);
//var distVect = screenPoint - mousePos;
var distVect = screenPoint - mousePos;
distVect.z = 0;
if (distVect.magnitude <= accuracy)
{
var dist = (worldPoint - camera.transform.position).magnitude;
if (dist < minDist)
{
minDist = dist;
closetsPoint = worldPoint;
}
}
}
s.End();
s2.Begin();
if (CheckVertexVisibility(closetsPoint, camera, mousePos))
{
var screenPoint = camera.WorldToScreenPoint(closetsPoint);
screenVertex = new Vector2(screenPoint.x, screenPoint.y);
worldVertex = closetsPoint;
return(true);
}
s2.End();
screenVertex = Vector2.zero;
worldVertex = Vector3.zero;
return(false);
}