예제 #1
0
    /*
     * when a new custom index of refraction is entered
     */
    public string NewIndex(RefractableMaterial rm, string input)
    {
        float newRefraction = CheckFieldInputs(input, 0.0f, 10.0f);

        rm.SetCustomRefraction(newRefraction);

        return("" + rm.GetIndexOfRefraction());
    }
    public void RayOut(Vector3 origin, Vector3 direction, int currentLinePosition)
    {
        RaycastHit hit;
        Ray        ray = new Ray();

        ray.origin    = origin;
        ray.direction = direction;

        lr.SetPosition(currentLinePosition++, ray.origin);

        if (Physics.Raycast(ray, out hit, 100.0f))
        {
            if (hit.transform.gameObject.tag == "Material")
            {
                RefractableMaterial rm = hit.transform.gameObject.GetComponent <RefractableMaterial>();

                lr.positionCount = currentLinePosition + 4;

                degrees1 = 180 - Vector3.SignedAngle(ray.direction, hit.normal, Vector3.up);
                degrees2 = toDegrees(snellCalculator(lm.rm.GetIndexOfRefraction(), rm.GetIndexOfRefraction(), degrees1));

                rm.text.text =
                    "θ1: " + String.Format("{0:0.000}", degrees1) + "\n" +
                    "θ2: " + String.Format("{0:0.000}", degrees2);

                // render line from laser to point of contact with material
                lr.SetPosition(currentLinePosition++, hit.point);

                RaycastHit hitExit;
                Ray        rayExit = new Ray();

                rayExit.origin    = hit.point - ((Quaternion.AngleAxis(degrees2, Vector3.up) * hit.normal).normalized * 1.5f);
                rayExit.direction = (Quaternion.AngleAxis(degrees2, Vector3.up) * hit.normal).normalized;

                if (Physics.Raycast(rayExit, out hitExit, 10.0f))
                {
                    if (hitExit.transform == hit.transform)
                    {
                        degrees1 = 180 - Vector3.SignedAngle(rayExit.direction, hitExit.normal, Vector3.up);
                        degrees2 = toDegrees(snellCalculator(rm.GetIndexOfRefraction(), lm.rm.GetIndexOfRefraction(), degrees1));

                        // render line from contact point to exit point
                        lr.SetPosition(currentLinePosition++, hitExit.point);

                        RayOut(hitExit.point, direction, currentLinePosition);
                    }
                }
            }
        }
        else
        {
            lr.SetPosition(currentLinePosition, origin + (direction * 100.0f));
        }
    }
예제 #3
0
    /*
     * removes object from lab
     */
    public void RemoveObject()
    {
        if (rms.Count > 1)
        {
            RefractableMaterial removeRM = rms[rms.Count - 1];

            if (obj == removeRM.gameObject)
            {
                obj = laser.gameObject;
            }

            rms.Remove(removeRM);
            Destroy(removeRM.gameObject);
        }
    }
예제 #4
0
    /*
     * set up world from json string
     */
    public void SetUpWorld(string json)
    {
        // generate lab instance model object from json string
        LabInstance li = JsonUtility.FromJson <LabInstance>(json);

        // set laser object from json
        laser.transform.position = li.lm.pos;
        laser.transform.rotation = li.lm.rot;

        // set lab manager's refratable material componenet from json
        rm.SetPresetRefraction((RefractableMaterial.IndexesOfRefraction)Enum.ToObject(typeof(RefractableMaterial.IndexesOfRefraction), li.worldRM.presetRefraction));
        rm.SetCustomRefraction(li.worldRM.n);

        int x = 0;

        // set available refratable materials
        foreach (RefractableMaterial rm in rms)
        {
            rm.transform.position = li.refractableMaterials.materials[x].pos;
            rm.transform.rotation = li.refractableMaterials.materials[x].rot;
            rm.SetPresetRefraction((RefractableMaterial.IndexesOfRefraction)Enum.ToObject(typeof(RefractableMaterial.IndexesOfRefraction), li.refractableMaterials.materials[x].presetRefraction));
            rm.SetCustomRefraction(li.refractableMaterials.materials[x].n);

            x++;
        }

        // if there are more materials to generate, create new ones
        while (rms.Count < li.refractableMaterials.materials.Count)
        {
            RefractableMaterial temp = AddObject();

            temp.transform.position = li.refractableMaterials.materials[x].pos;
            temp.transform.rotation = li.refractableMaterials.materials[x].rot;
            temp.SetPresetRefraction((RefractableMaterial.IndexesOfRefraction)Enum.ToObject(typeof(RefractableMaterial.IndexesOfRefraction), li.refractableMaterials.materials[x].presetRefraction));

            Debug.Log(li.refractableMaterials.materials[x].presetRefraction);
            Debug.Log("PR: " + temp.GetPresetIndex());

            temp.SetCustomRefraction(li.refractableMaterials.materials[x].n);

            x++;
        }
    }
예제 #5
0
    /*
     * enable UI components for refractable material objects
     */
    public void RunRMUIComponents()
    {
        ShowToggle(false);
        ShowIndexComponents(true);

        objText.text = "Refractable Material";

        RefractableMaterial rm = lm.obj.GetComponent <RefractableMaterial>();

        indexesMenu.value = rm.GetPresetIndex();

        if (indexesMenu.value != (int)RefractableMaterial.IndexesOfRefraction.CUSTOM)
        {
            refractionField.text    = "" + rm.GetIndexOfRefraction();
            refractionField.enabled = false;
        }
        else
        {
            refractionField.enabled = true;
        }
    }
예제 #6
0
    public string defaultInstance;              // json string of default instance

    // Start is called before the first frame update
    void Start()
    {
        rm    = GetComponent <RefractableMaterial>();
        laser = FindObjectOfType <LaserController>();

        rm.SetPresetRefraction(RefractableMaterial.IndexesOfRefraction.AIR);

        rms = new List <RefractableMaterial>();

        foreach (RefractableMaterial rm in FindObjectsOfType <RefractableMaterial>())
        {
            rms.Add(rm);
        }

        rms.Remove(rm);

        drag = false;

        defaultInstance = GenerateJSON();

        Load();
    }
예제 #7
0
    /*
     * when a new preset index of refraction is set for a selected object
     */
    public void OnIndexChange()
    {
        RefractableMaterial rm = lm.obj.GetComponent <RefractableMaterial>();

        rm.SetPresetRefraction((RefractableMaterial.IndexesOfRefraction)Enum.ToObject(typeof(RefractableMaterial.IndexesOfRefraction), indexesMenu.value));
    }