static public bool RayVsSceneMaterial(Ray r, out APARaycastHit hit, out MaterialStruct material) { hit = null; material = null; if (APARaycast.Raycast(r, out hit)) { Debug.Log("Hit " + hit.transform.gameObject.name); // Find The Material var go = hit.transform.gameObject; var goMat = go.GetComponent <Renderer>().material; var matMainTex = goMat.mainTexture as Texture2D; Vector2 pixelUv = hit.textureCoord; pixelUv.x *= matMainTex.width; pixelUv.y *= matMainTex.height; var pixelColour = matMainTex.GetPixel((int)pixelUv.x, (int)pixelUv.y); material = FindMaterialStructFromColour(pixelColour); return(true); } else { // Debug.Log("Miss! " + APARaycast.intersectionErrorType); return(false); } }
static APARaycastHit BuildRaycastHit(Triangle hitTriangle, float distance, Vector2 barycentricCoordinate) { APARaycastHit returnedHit = new APARaycastHit(hitTriangle.trans, distance, barycentricCoordinate); returnedHit.textureCoord = hitTriangle.uv_pt0 + ((hitTriangle.uv_pt1 - hitTriangle.uv_pt0) * barycentricCoordinate.x) + ((hitTriangle.uv_pt2 - hitTriangle.uv_pt0) * barycentricCoordinate.y); returnedHit.point = hitTriangle.pt0 + ((hitTriangle.pt1 - hitTriangle.pt0) * barycentricCoordinate.x) + ((hitTriangle.pt2 - hitTriangle.pt0) * barycentricCoordinate.y); returnedHit.normal = hitTriangle.nrm_pt0 + ((hitTriangle.nrm_pt1 - hitTriangle.nrm_pt0) * barycentricCoordinate.x) + ((hitTriangle.nrm_pt2 - hitTriangle.nrm_pt0) * barycentricCoordinate.y); returnedHit.triangle = hitTriangle; return(returnedHit); }
public static bool Raycast(Ray ray, out APARaycastHit hit) { hit = new APARaycastHit(); List <APARaycastHit> hits = new List <APARaycastHit>(); hits = INTERNAL_RaycastAll(ray); if (hits.Count > 0) { hit = hits[0]; return(true); } return(false); }
static bool INTERNAL_Raycast(Ray ray, out APARaycastHit hit) { hit = new APARaycastHit(); List <APARaycastHit> hits = new List <APARaycastHit>(); APAOctree octree = APAObjectDictionary.GetOctree(); if (octree.bounds.IntersectRay(ray)) { hits = RecurseOctreeBounds(octree, ray); } hits = SortResults(hits); if (hits.Count > 0) { hit = hits[0]; } return(hits.Count > 0); }
static List <APARaycastHit> SortResults(List <APARaycastHit> input) { APARaycastHit a = new APARaycastHit(); APARaycastHit b = new APARaycastHit(); bool swapped = true; while (swapped) { swapped = false; for (int i = 1; i < input.Count; i++) { if (input[i - 1].distance > input[i].distance) { a = input[i - 1]; b = input[i]; input[i - 1] = b; input[i] = a; swapped = true; } } } return(input); }