void Start() { List <Atom> atoms; List <List <int> > connections; string model_name; try { model_name = ParseInputModelFile(); PDBParser.ParseAtomsAndConnections(@"Assets/MModels/" + model_name, out atoms, out connections); } catch (System.IO.IOException) { print("Parsing input error"); return; } /* Spawn the objects */ foreach (Atom atom in atoms) { /* Units in Nano meters */ Vector3 atom_position = new Vector3(atom.x_, atom.y_, atom.z_); atoms_bounding_box_.AddPoint(atom_position); /* Instantiate the atom */ GameObject temp = Instantiate(prefab_atom, atom_position, Quaternion.identity); temp.transform.parent = transform; temp.isStatic = this.gameObject.isStatic; /* Find ISphere component, and set the atom information */ ISphere isphere = temp.GetComponent <ISphere>(); isphere.atom_ = atom; ispheres_.Add(isphere); /* Insert to the dictionaries used */ InsertToAtomsDictionary(isphere); InsertToResiudesDictionary(isphere); InsertToChainsDictionary(isphere); } /* Parse connections, currently the application does not do something with these connections */ foreach (List <int> c in connections) { int atom_id = c[0]; for (int i = 1; i < c.Count; i++) { ISphere connection_isphere = ispheres_[c[i]]; ispheres_[atom_id].connections_.Add(connection_isphere); } } /* Spawn bonds */ Transform bonds_transform = transform.GetChild(0); int bonds = 0; /* For all resisudes */ foreach (KeyValuePair <int, List <ISphere> > value in residue_dictionary) { /* Get combinations of two atoms */ List <ISphere> resiude_atoms = value.Value; for (int ia = 0; ia < resiude_atoms.Count; ia++) { ISphere a = resiude_atoms[ia]; Vector3 a_position = a.transform.position; float a_covalent_radius = AtomicRadii.GetCovalentRadius(a.atom_.element_); for (int ib = 0; ib < resiude_atoms.Count; ib++) { if (!(ia > ib)) { continue; } ISphere b = resiude_atoms[ib]; Vector3 b_position = b.transform.position; float b_covalent_radius = AtomicRadii.radii_covalent[b.atom_.element_]; /* If their distance is smaller then the sume of radius + plus a bias, then spawn a bond */ float distance = Vector3.Distance(a_position, b_position); if (distance <= a_covalent_radius + b_covalent_radius + 0.015) { bonds++; GameObject temp = Instantiate(prefab_bond, a_position, Quaternion.identity); temp.transform.parent = bonds_transform; temp.isStatic = this.gameObject.isStatic; /* Rotate it accordingly */ Vector3 direction = b_position - a_position; Quaternion toRotation = Quaternion.FromToRotation(new Vector3(0, 1, 0), direction); temp.transform.rotation = toRotation; /* Set size and radius */ ICylinder icylinder = temp.GetComponent <ICylinder>(); icylinder.radius_ = AtomicRadii.ball_and_stick_bond_radius; icylinder.height_ = distance; } } } } Debug.Log("Spawned: " + bonds + " bonds"); /* Position the model and the camera in the world */ SetCameraAndPanelBoxPosition(atoms_bounding_box_); bonds_selected_[0] = null; bonds_selected_[1] = null; /* Set some default info on the world panel */ SELECTION_MODE_SPHERE_RADIUS = AtomicRadii.ball_and_stick_radius * 5.0f; transform.GetChild(1).GetComponent <ModePanel>().SetRadius(SELECTION_MODE_SPHERE_RADIUS); info_ui_ = Camera.main.transform.Find("AtomInfoBox").GetComponent <AtomInfoBox>(); }
void Start() { /* Set the scale based on the selection radius used */ transform.localScale = 2 * new Vector3(Atoms.SELECTION_MODE_SPHERE_RADIUS, Atoms.SELECTION_MODE_SPHERE_RADIUS, Atoms.SELECTION_MODE_SPHERE_RADIUS); /* Make the selection sphere transparent */ ISphere s = GetComponent <ISphere>(); s.SetTransparent(true); s.SetRadius(Atoms.SELECTION_MODE_SPHERE_RADIUS); s.SetColor(new Color(0.1f, 0.1f, 0.1f, 0)); /* Set color circle parameters */ colors_ = new Color[3, 3]; colors_[0, 0] = color_bottom_left; colors_[0, 1] = color_bottom; colors_[0, 2] = color_bottom_right; colors_[1, 0] = color_left; colors_[1, 2] = color_right; colors_[2, 0] = color_top_left; colors_[2, 1] = color_top; colors_[2, 2] = color_top_right; /* Set arrow parameters */ arrows_ = new GameObject[3, 3]; arrows_[0, 0] = Instantiate(prefab_arrow_bottom_left, new Vector3(0, 0, 0), Quaternion.identity); arrows_[0, 1] = Instantiate(prefab_arrow_bottom, new Vector3(0, 0, 0), Quaternion.identity); arrows_[0, 2] = Instantiate(prefab_arrow_bottom_right, new Vector3(0, 0, 0), Quaternion.identity); arrows_[1, 0] = Instantiate(prefab_arrow_left, new Vector3(0, 0, 0), Quaternion.identity); arrows_[1, 2] = Instantiate(prefab_arrow_right, new Vector3(0, 0, 0), Quaternion.identity); arrows_[2, 0] = Instantiate(prefab_arrow_top_left, new Vector3(0, 0, 0), Quaternion.identity); arrows_[2, 1] = Instantiate(prefab_arrow_top, new Vector3(0, 0, 0), Quaternion.identity); arrows_[2, 2] = Instantiate(prefab_arrow_top_right, new Vector3(0, 0, 0), Quaternion.identity); //arrows_[0, 0].transform.parent = transform; //arrows_[0, 1].transform.parent = transform; //arrows_[0, 2].transform.parent = transform; //arrows_[1, 0].transform.parent = transform; //arrows_[1, 2].transform.parent = transform; //arrows_[2, 0].transform.parent = transform; //arrows_[2, 1].transform.parent = transform; //arrows_[2, 2].transform.parent = transform; arrows_[0, 0].SetActive(false); arrows_[0, 1].SetActive(false); arrows_[0, 2].SetActive(false); arrows_[1, 0].SetActive(false); arrows_[1, 2].SetActive(false); arrows_[2, 0].SetActive(false); arrows_[2, 1].SetActive(false); arrows_[2, 2].SetActive(false); if (visualization == SelectionVisualizationMethod.ARROWS) { transform.GetChild(0).gameObject.SetActive(false); } else { transform.GetChild(0).gameObject.SetActive(true); } /* Get info box object */ info_ui_ = Camera.main.transform.Find("AtomInfoBox").GetComponent <AtomInfoBox>(); /* Get parent atoms object */ atoms_object_ = transform.parent.GetComponent <Atoms>(); }