Esempio n. 1
0
    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);
    }
Esempio n. 3
0
    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);
    }