/* * 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)); } }
/* * 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); } }
/* * 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++; } }
/* * 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; } }
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(); }
/* * 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)); }