/*
     * generate json object of lab instacne
     */
    public string GenerateJSON()
    {
        // create instances of objecct models
        LaserModel lm = new LaserModel(laser.transform.position, laser.transform.rotation);

        RefractableMaterialModel worldRM = new RefractableMaterialModel(rm.GetPresetIndex(), rm.GetN(), rm.transform.position, rm.transform.rotation);

        RefractableMaterials serializeRMs = new RefractableMaterials();

        foreach (RefractableMaterial rm in rms)
        {
            serializeRMs.materials.Add(new RefractableMaterialModel(rm.GetPresetIndex(), rm.GetN(), rm.transform.position, rm.transform.rotation));
        }

        LabInstance li = new LabInstance();

        li.lm      = lm;
        li.worldRM = worldRM;
        li.refractableMaterials = serializeRMs;

        // convert lab instance model object to json string
        return(JsonUtility.ToJson(li));
    }
    /*
     * 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;
        }
    }