UnityMol  0.9.6-875
UnityMol viewer / In developement
GuidedNavigationManager.cs
Go to the documentation of this file.
1 using UnityEngine;
2 using System.Collections;
3 using System.Collections.Generic;
4 using UI;
5 using GuidedNav;
6 using Molecule.Model;
7 using System;
8 using UnityEngine.EventSystems;
9 
11 
13  private GameObject originPoint;
14  private GameObject symmetryAxis;
15 
16  void OnEnable(){
17  Init();
18 
19  }
20  public void Init(){
21  GNParameters.mainCamera = Camera.main.gameObject;
22  }
23 
25  public void CreateAxeAndOrigin(){
26  originPoint = GameObject.CreatePrimitive (PrimitiveType.Sphere);
27  originPoint.transform.position = new Vector3 (0, 1, 0);
28  originPoint.transform.localScale = new Vector3 (4, 4, 4);
29 
30  symmetryAxis = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
31  symmetryAxis.transform.position = new Vector3 (0, 1, 0);
32  symmetryAxis.transform.localScale = new Vector3 (1, (MoleculeModel.MaxValue.y - MoleculeModel.MinValue.y), 1);
33  symmetryAxis.GetComponent<Renderer>().material.color = Color.red;
34  }
35 
37  public void DestroyAxeAndOrigin(){
38  GameObject.Destroy(originPoint);
39  GameObject.Destroy(symmetryAxis);
40  }
41 
42  public void Clear(){
44  UIData.guided = false;
47  GameObject.Destroy(GNParameters.ghost_target);
48  GameObject.Destroy(GNParameters.ghost_camera);
49  }
50 
51  public void UpdateManager(){
52  if(GNParameters.mainCamera == null)
53  Init();
54  if (UIData.guided) {
55 
56 
57  Debug.DrawRay (GNParameters.mainCamera.transform.position, GNParameters.mainCamera.transform.up * 5, Color.red);
58 
59  //Automatic constrained navigation up
60  if (Input.GetKeyUp (KeyCode.U)) {
63 
64  }
65 
66  //Automatic constrained navigation down
67  if (Input.GetKeyUp (KeyCode.J)) {
68  GNParameters.navigationUp = false;
70  }
71 
72  //Enter panoramic mode
73  if (Input.GetKeyUp (KeyCode.I)) {
75  Debug.Log ("panoramic " + GNParameters.panoramic);
76 
77  if (!GNParameters.panoramic) {
79  maxCamera.weight_cam = 0.0f;
80  }
81  }
82 
83  //Enter jump mode
84  if (Input.GetKeyUp (KeyCode.M)) {
86  Debug.Log ("monomer jump: " + GNParameters.monomer_jump);
87  }
88 
89  if (Input.GetKeyUp (KeyCode.L))
91 
93  NearSpreading ();
94 
95  // If the camera has not been reoriented after the molecule reorientation
96  // Is the molecule even reoriented anytime?
97  if (!GNParameters.reoriented) {
98  GNParameters.mainCamera.transform.eulerAngles = new Vector3 (0, GNParameters.mainCamera.transform.eulerAngles.y, 0);
99  GNParameters.reoriented = true;
100  }
102  }
103 
104  }
106 
107  if(!UIData.guided)
108  return;
109 
110  if (!maxCamera.cameraStop) {
111  keyboard ();
112 
113 
114  if (!GNParameters.mainCamera.GetComponent<Camera>().orthographic) { // only if the camera is in perspective mode
115  if (UIData.newUIActivated && !EventSystem.current.IsPointerOverGameObject ()) {
116  maxCamera.desiredDistance -= Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * maxCamera.zoomRate;// * Mathf.Abs(desiredDistance);
117  }
119  //currentDistance = Vector3.Distance (transform.position, target.position);
120  GNParameters.guidedzoom = true;
121  }
122  }
123  }
124 
125 
127  if(Vector3.Distance(GNParameters.mainCamera.transform.position, new Vector3(0, GNParameters.mainCamera.transform.position.y, 0)) > 4.0)
128  goUpConstrained();
129  }
130 
131 
133  if(Vector3.Distance(GNParameters.mainCamera.transform.position, new Vector3(0, GNParameters.mainCamera.transform.position.y, 0)) > 4.0)
135  }
136 
138  Vector3 v = GNParameters.mainCamera.transform.position;
139  maxCamera.weight_cam += Time.deltaTime ;
140  GNParameters.mainCamera.transform.position = Vector3.Lerp (v, new Vector3(0, v.y, 0), maxCamera.weight_cam);
141  }
142  else if(GNParameters.reset_panoramic){
143  Debug.Log ("Go back from panoramic view to normal view");
144  Vector3 v = GNParameters.mainCamera.transform.position;
145  maxCamera.weight_cam += Time.deltaTime ;
146  GNParameters.mainCamera.transform.position = Vector3.Lerp (v, new Vector3(-GNParameters.mainCamera.transform.forward.x * 100, v.y, -GNParameters.mainCamera.transform.forward.z * 100), maxCamera.weight_cam);
147  if(GNParameters.mainCamera.transform.position.Equals(new Vector3(-GNParameters.mainCamera.transform.forward.x * 100, v.y, -GNParameters.mainCamera.transform.forward.z * 100))){
149  maxCamera.weight_cam = 0.0f;
150  }
151  }
152 
153  if(UIData.optim_view)
154  {
156  GNParameters.ghost_target = GameObject.CreatePrimitive (PrimitiveType.Sphere);
157  GNParameters.ghost_target.name = "Target";
158  GNParameters.ghost_target.GetComponent<Renderer>().material.color = Color.magenta;
159  GNParameters.ghost_target.transform.localScale = new Vector3(4.0f, 4.0f, 4.0f);
160  GNParameters.ghost_target.transform.position = GNParameters.optim_target;
161  GNParameters.ghost_target.SetActive(true);
162  GNParameters.ghost_camera = GameObject.CreatePrimitive (PrimitiveType.Sphere);
163  GNParameters.ghost_camera.name = "CameraPOV";
164  GNParameters.ghost_camera.GetComponent<Renderer>().material.color = Color.cyan;
165  GNParameters.ghost_camera.transform.localScale = new Vector3(3.0f, 3.0f, 3.0f);
167  GNParameters.ghost_camera.SetActive(true);
169  }
170  if(GNParameters.mainCamera.transform.position != GNParameters.optim_user_cam_pos)
171  {
172  GNParameters.mainCamera.transform.position = Vector3.SmoothDamp(GNParameters.mainCamera.transform.position, GNParameters.optim_user_cam_pos, ref GNParameters.velocity, 3.0f);
174  }
175  else{
176  Debug.Log ("LookAt phase");
177  Quaternion lookat = Quaternion.LookRotation(GNParameters.optim_target - GNParameters.mainCamera.transform.position);
178  GNParameters.mainCamera.transform.rotation = Quaternion.Slerp(GNParameters.mainCamera.transform.rotation, lookat, Time.deltaTime);
179  }
180  }
182  GNParameters.mainCamera.transform.RotateAround(Vector3.zero, Vector3.up, - (360/MoleculeModel.existingChain.Count) * Time.deltaTime);
183  GNParameters.rotation_done += (360/MoleculeModel.existingChain.Count) * Time.deltaTime;
184  }
186  GNParameters.mainCamera.transform.RotateAround(Vector3.zero, Vector3.up, (360/MoleculeModel.existingChain.Count) * Time.deltaTime);
187  GNParameters.rotation_done += (360/MoleculeModel.existingChain.Count) * Time.deltaTime;;
188  }
190  GNParameters.next_right = false;
191  GNParameters.next_left = false;
193  }
194 
195  // Temporary
197  //Dive into the channel if zoom above or under the structure
198  if((Vector3.Distance(GNParameters.mainCamera.transform.position , maxCamera.target.position) < 100) && GNParameters.isabove){
199  GNParameters.near_spread = false;
200  if(GNParameters.mainCamera.transform.position.y <= maxCamera.target.position.y+20)
201  maxCamera.target.position = new Vector3(0, maxCamera.target.position.y-1, 0);
202  GNParameters.mainCamera.transform.LookAt(maxCamera.target.position);
203  GNParameters.mainCamera.transform.Translate(new Vector3(0, 0, Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * maxCamera.zoomRate));
204  }
205  else if (Vector3.Distance (GNParameters.mainCamera.transform.position, maxCamera.target.position) < 100 && GNParameters.isunder){
206  GNParameters.near_spread = false;
207  if(GNParameters.mainCamera.transform.position.y >= maxCamera.target.position.y-20)
208  maxCamera.target.position = new Vector3(0, maxCamera.target.position.y+1, 0);
209  GNParameters.mainCamera.transform.LookAt (maxCamera.target.position);
210  GNParameters.mainCamera.transform.Translate (new Vector3(0, 0, Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * maxCamera.zoomRate));
211  }
212  else
213  GNParameters.mainCamera.transform.Translate(new Vector3(0, 0, Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime * maxCamera.zoomRate));
214  GNParameters.guidedzoom = false;
215  }
216 
217  }
218 
219  void keyboard(){
220  /*
221  * X Rotation
222  */
223 
224  if (Input.GetButton ("Guided Navigation Rotate X Right")){
225  GNParameters.nav_speed = (float) Math.Sqrt(Math.Abs (MoleculeModel.MinValue.y) + Math.Abs (MoleculeModel.MaxValue.y)) * (float) Math.Sqrt(Vector3.Distance(GNParameters.mainCamera.transform.position, maxCamera.target.position));
226  GNParameters.nav_speed *= 0.02f;
228  GNParameters.next_right = true;
229  }
230 
231  GNParameters.mainCamera.transform.RotateAround( new Vector3(0, GNParameters.mainCamera.transform.position.y, 0), new Vector3(0, -1, 0), 3.0f* GNParameters.nav_speed);
232  Debug.Log(GNParameters.mainCamera.transform.up);
233 
234  }
235 
236  if (Input.GetButton ("Guided Navigation Rotate X Left")) {
237 
239  GNParameters.next_left = true;
240  } else {
241  GNParameters.mainCamera.transform.RotateAround( new Vector3(0, GNParameters.mainCamera.transform.position.y, 0), new Vector3(0, 1, 0), 3.0f* GNParameters.nav_speed);
242  Debug.Log(GNParameters.mainCamera.transform.up);
243  }
244 
245  }
246 
247 
248 
249  if (Input.GetButton ("Guided Navigation Rotate Y Down")){
250 
252  Vector3 v = GNParameters.mainCamera.transform.position;
253  GNParameters.mainCamera.transform.eulerAngles = new Vector3 (0, GNParameters.mainCamera.transform.eulerAngles.y, 0);
254  v.y -= 1.0f;
255  GNParameters.mainCamera.transform.position = v;
256  }
257  else{
258  if(Vector3.Distance(GNParameters.mainCamera.transform.position, new Vector3(0, GNParameters.mainCamera.transform.position.y, 0)) > 4.0)
260  }
261  }
262 
263  if (Input.GetButton ("Guided Navigation Rotate Y Up")){
264 
266  Vector3 v = GNParameters.mainCamera.transform.position;
267  GNParameters.mainCamera.transform.eulerAngles = new Vector3 (0, GNParameters.mainCamera.transform.eulerAngles.y, 0);
268  v.y += 1.0f;
269  GNParameters.mainCamera.transform.position = v;
270  }
271  else{
272  if(Vector3.Distance(GNParameters.mainCamera.transform.position, new Vector3(0, GNParameters.mainCamera.transform.position.y, 0)) > 4.0)
273  goUpConstrained();
274  }
275 
276  }
277 
279 
280  if (Input.GetKey (KeyCode.KeypadPlus) || Input.GetKey (KeyCode.B))
281  {
282  Debug.Log ("Spreading");
283  Spreading();
284  }
285 
286  if (Input.GetKey (KeyCode.KeypadMinus) || Input.GetKey(KeyCode.V))
287  Narrowing();
288 
289  if (Input.GetKey (KeyCode.KeypadMultiply) || Input.GetKey(KeyCode.T))
290  ResetChainsPos();
291 
292 
294  if(UIData.optim_view){
295  if(Input.GetKey (KeyCode.Keypad1))
297 
298  if(Input.GetKey (KeyCode.Keypad2))
300 
301  if(Input.GetKey (KeyCode.Keypad3))
303 
304  if(Input.GetKey (KeyCode.Keypad4))
306  if(Input.GetKey (KeyCode.O))
307  UIData.optim_view = false;
308  ReorientCamera();
309  }
310 
311  }
312 
316  private void NearSpreading(){
317  UIData.spread_tree = true;
318  if(GNParameters.rep == ""){
320  }
324  GNParameters.distclose = Vector3.Distance (GNParameters.mainCamera.transform.position, GNParameters.poscloseatom); // Distance Camera / Closest atom;
325  if((GNParameters.distclose < 15) && GNParameters.comp_spread < 0.3)
326  Spreading ();
327  else if ((GNParameters.distclose > 15) && GNParameters.comp_spread != 0)
328  ResetChainsPos ();
329  UIData.spread_tree = false;
330  }
331 
333  private void SpreadCAlpha(){
334  GNParameters.hballs = GameObject.FindObjectsOfType(typeof(BallUpdateHB)) as BallUpdateHB[];
336 
337  int hballNumber;
338  string atomChain;
339  BallUpdateHB ball;
340 
341  for (int i=0; i<GNParameters.hballs.Length; i++) {
342  hballNumber = (int)GNParameters.hballs[i].number;
343  atomChain = MoleculeModel.CaSplineChainList[hballNumber];
344  ball = GNParameters.hballs[i];
345 
346  if(atomChain == "A")
347  ball.transform.Translate(GNParameters.spreadA);
348  if(atomChain == "B")
349  ball.transform.Translate(GNParameters.spreadB);
350  if(atomChain == "C")
351  ball.transform.Translate(GNParameters.spreadC);
352  if(atomChain == "D")
353  ball.transform.Translate(GNParameters.spreadD);
354  if(atomChain == "E")
355  ball.transform.Translate(GNParameters.spreadE);
356  }
357 
359 
360  }
361 
363  private void SpreadHyperballs(){
364  GNParameters.hballs = GameObject.FindObjectsOfType(typeof(BallUpdateHB)) as BallUpdateHB[];
366 
367  int hballNumber;
368  string atomChain;
369  BallUpdateHB ball;
370 
371  for (int i=0; i<GNParameters.hballs.Length; i++) {
372  hballNumber = (int)GNParameters.hballs[i].number;
373  atomChain = MoleculeModel.atomsChainList[hballNumber];
374  ball = GNParameters.hballs[i];
375 
376  if(atomChain == "A")
377  ball.transform.Translate(GNParameters.spreadA);
378  if(atomChain == "B")
379  ball.transform.Translate(GNParameters.spreadB);
380  if(atomChain == "C")
381  ball.transform.Translate(GNParameters.spreadC);
382  if(atomChain == "D")
383  ball.transform.Translate(GNParameters.spreadD);
384  if(atomChain == "E")
385  ball.transform.Translate(GNParameters.spreadE);
386  }
387 
389 
390  }
391 
393  private void SpreadSpheres(){
394  GNParameters.sballs = GameObject.FindObjectsOfType(typeof(BallUpdateSphere)) as BallUpdateSphere[];
396 
397  int sballNumber;
398  string atomChain;
399  BallUpdateSphere ball;
400 
402  for (int i=0; i<GNParameters.sballs.Length; i++) {
403  sballNumber = (int)GNParameters.sballs[i].number;
404  atomChain = MoleculeModel.atomsChainList[sballNumber];
405  ball = GNParameters.sballs[i];
406 
407  if(atomChain == "A")
408  ball.transform.Translate(GNParameters.spreadA);
409  if(atomChain == "B")
410  ball.transform.Translate(GNParameters.spreadB);
411  if(atomChain == "C")
412  ball.transform.Translate(GNParameters.spreadC);
413  if(atomChain == "D")
414  ball.transform.Translate(GNParameters.spreadD);
415  if(atomChain == "E")
416  ball.transform.Translate(GNParameters.spreadE);
417  }
418  }else{
419  // Spread the upper subunit up.
420  for (int i=0; i<GNParameters.sballs.Length; i++) {
421  sballNumber = (int)GNParameters.sballs[i].number;
422  atomChain = MoleculeModel.atomsChainList[sballNumber];
423  ball = GNParameters.sballs[i];
424  int residueId = MoleculeModel.residueIds[sballNumber];
425 
426  if(residueId < GNParameters.reslim)
427  {
428  if(atomChain == "A"){
429  ball.transform.Translate(GNParameters.spreadA1);
430  }
431  if(atomChain == "B"){
432  ball.transform.Translate(GNParameters.spreadB1);
433  }
434  if(atomChain == "C"){
435  ball.transform.Translate(GNParameters.spreadC1);
436  }
437  if(atomChain == "D"){
438  ball.transform.Translate(GNParameters.spreadD1);
439  }
440  if(atomChain == "E"){
441  ball.transform.Translate(GNParameters.spreadE1);
442  }
443  }
444  else
445  {
446  if(atomChain == "A"){
447  ball.transform.Translate(GNParameters.spreadA2);
448  }
449  if(atomChain == "B"){
450  ball.transform.Translate(GNParameters.spreadB2);
451  }
452  if(atomChain == "C"){
453  ball.transform.Translate(GNParameters.spreadC2);
454  }
455  if(atomChain == "D"){
456  ball.transform.Translate(GNParameters.spreadD2);
457  }
458  if(atomChain == "E"){
459  ball.transform.Translate(GNParameters.spreadE2);
460  }
461  }
462  }
463  }
464  }
465 
467  private void SpreadSecondaryStructure(){
468  GameObject[] ribA = GameObject.FindGameObjectsWithTag("RibbonObjA");
469  GameObject[] ribB = GameObject.FindGameObjectsWithTag("RibbonObjB");
470  GameObject[] ribC = GameObject.FindGameObjectsWithTag("RibbonObjC");
471  GameObject[] ribD = GameObject.FindGameObjectsWithTag("RibbonObjD");
472  GameObject[] ribE = GameObject.FindGameObjectsWithTag("RibbonObjE");
473 
475  if(UIData.guided){
476  ribA[0].transform.Translate(GNParameters.spreadE1);
477  ribA[1].transform.Translate (GNParameters.spreadE2);
478  ribB[0].transform.Translate(GNParameters.spreadD1);
479  ribB[1].transform.Translate (GNParameters.spreadD2);
480  ribC[0].transform.Translate(GNParameters.spreadC1);
481  ribC[1].transform.Translate (GNParameters.spreadC2);
482  ribD[0].transform.Translate(GNParameters.spreadB1);
483  ribD[1].transform.Translate (GNParameters.spreadB2);
484  ribE[0].transform.Translate(GNParameters.spreadA1);
485  ribE[1].transform.Translate (GNParameters.spreadA2);
486  }else{
487  ribA[0].transform.Translate(GNParameters.spreadA1);
488  ribA[1].transform.Translate (GNParameters.spreadA2);
489  ribB[0].transform.Translate(GNParameters.spreadB1);
490  ribB[1].transform.Translate (GNParameters.spreadB2);
491  ribC[0].transform.Translate(GNParameters.spreadC1);
492  ribC[1].transform.Translate (GNParameters.spreadC2);
493  ribD[0].transform.Translate(GNParameters.spreadD1);
494  ribD[1].transform.Translate (GNParameters.spreadD2);
495  ribE[0].transform.Translate(GNParameters.spreadE1);
496  ribE[1].transform.Translate (GNParameters.spreadE2);
497  }
498  }else{
499 
500  foreach( GameObject rib in ribC)
501  rib.transform.Translate(GNParameters.spreadC);
502 
503  if(UIData.guided)
504  {
505  foreach( GameObject rib in ribA)
506  {
507  rib.transform.Translate(GNParameters.spreadE);
508  }
509  foreach( GameObject rib in ribB)
510  {
511  rib.transform.Translate(GNParameters.spreadD);
512  }
513  foreach( GameObject rib in ribD)
514  {
515  rib.transform.Translate(GNParameters.spreadB);
516  }
517  foreach( GameObject rib in ribE)
518  {
519  rib.transform.Translate(GNParameters.spreadA);
520  }
521  }
522  else
523  {
524  foreach( GameObject rib in ribA)
525  {
526  rib.transform.Translate(GNParameters.spreadA);
527  }
528  foreach( GameObject rib in ribB)
529  {
530  rib.transform.Translate(GNParameters.spreadB);
531  }
532  foreach( GameObject rib in ribD)
533  {
534  rib.transform.Translate(GNParameters.spreadD);
535  }
536  foreach( GameObject rib in ribE)
537  {
538  rib.transform.Translate(GNParameters.spreadE);
539  }
540  }
541  }
542  }
543 
547  private void Spreading(){
551  Debug.Log("comp_spread "+GNParameters.comp_spread );
552  if(UIData.isGLIC){
553  Debug.Log ("isGLIC = true");
554  //Second step spreading
560  }
561 
564  }
565 
566  if(UIData.atomtype == UIData.AtomType.hyperball){
568  SpreadCAlpha();
569  }else{
571  }
572  }
573 
574  if(UIData.atomtype == UIData.AtomType.sphere){
575  SpreadSpheres();
576  } // End if Sphere
577  }// End Spreading
578 
580  private void NarrowCAlpha(){
581  GenericManager atomManager;
582  GenericManager bondManager;
583 
584  int hballNumber;
585  string atomChain;
586  BallUpdateHB ball;
587 
588  atomManager = UnityMolMain.getCurrentAtomManager();
589  bondManager = UnityMolMain.getCurrentBondManager();
590  GNParameters.hballs = GameObject.FindObjectsOfType(typeof(BallUpdateHB)) as BallUpdateHB[];
591 
592  for (int i=0; i<GNParameters.hballs.Length; i++) {
593  hballNumber = (int)GNParameters.hballs[i].number;
594  atomChain = MoleculeModel.CaSplineChainList[hballNumber];
595  ball = GNParameters.hballs[i];
596 
597  if(atomChain == "A")
598  ball.transform.Translate(-GNParameters.spreadA);
599  if(atomChain == "B")
600  ball.transform.Translate(-GNParameters.spreadB);
601  if(atomChain == "C")
602  ball.transform.Translate(-GNParameters.spreadC);
603  if(atomChain == "D")
604  ball.transform.Translate(-GNParameters.spreadD);
605  if(atomChain == "E")
606  ball.transform.Translate(-GNParameters.spreadE);
607  }
608 
609  bondManager.ResetPositions();
610 
612 
613  }
614 
616  private void NarrowHyperballs(){
617  GenericManager atomManager;
618  GenericManager bondManager;
619 
620  int hballNumber;
621  string atomChain;
622  BallUpdateHB ball;
623 
624  atomManager = UnityMolMain.getCurrentAtomManager();
625  bondManager = UnityMolMain.getCurrentBondManager();
626  GNParameters.hballs = GameObject.FindObjectsOfType(typeof(BallUpdateHB)) as BallUpdateHB[];
627 
628  for (int i=0; i<GNParameters.hballs.Length; i++) {
629  hballNumber = (int)GNParameters.hballs[i].number;
630  atomChain = MoleculeModel.atomsChainList[hballNumber];
631  ball = GNParameters.hballs[i];
632 
633  if(atomChain == "A")
634  ball.transform.Translate(-GNParameters.spreadA);
635  if(atomChain == "B")
636  ball.transform.Translate(-GNParameters.spreadB);
637  if(atomChain == "C")
638  ball.transform.Translate(-GNParameters.spreadC);
639  if(atomChain == "D")
640  ball.transform.Translate(-GNParameters.spreadD);
641  if(atomChain == "E")
642  ball.transform.Translate(-GNParameters.spreadE);
643  }
644 
645  bondManager.ResetPositions();
646 
648 
649  }
650 
652  private void NarrowSpheres(){
653  int sballNumber;
654  string atomChain;
655  BallUpdateSphere ball;
656 
657  GNParameters.sballs = GameObject.FindObjectsOfType(typeof(BallUpdateSphere)) as BallUpdateSphere[];
658 
659  for (int i=0; i<GNParameters.sballs.Length; i++) {
660  sballNumber = (int)GNParameters.sballs[i].number;
661  atomChain = MoleculeModel.atomsChainList[sballNumber];
662  ball = GNParameters.sballs[i];
663 
664  if(atomChain == "A")
665  ball.transform.Translate(-GNParameters.spreadA);
666  if(atomChain == "B")
667  ball.transform.Translate(-GNParameters.spreadB);
668  if(atomChain == "C")
669  ball.transform.Translate(-GNParameters.spreadC);
670  if(atomChain == "D")
671  ball.transform.Translate(-GNParameters.spreadD);
672  if(atomChain == "E")
673  ball.transform.Translate(-GNParameters.spreadE);
674  }
675  }
676 
677  private void NarrowSecondaryStructure(){
678  GameObject[] ribA = GameObject.FindGameObjectsWithTag("RibbonObjA");
679  GameObject[] ribB = GameObject.FindGameObjectsWithTag("RibbonObjB");
680  GameObject[] ribC = GameObject.FindGameObjectsWithTag("RibbonObjC");
681  GameObject[] ribD = GameObject.FindGameObjectsWithTag("RibbonObjD");
682  GameObject[] ribE = GameObject.FindGameObjectsWithTag("RibbonObjE");
683 
685 
686  if(UIData.guided){
687  ribA[0].transform.Translate(-GNParameters.spreadE1);
688  ribA[1].transform.Translate (-GNParameters.spreadE2);
689  ribB[0].transform.Translate(-GNParameters.spreadD1);
690  ribB[1].transform.Translate (-GNParameters.spreadD2);
691  ribC[0].transform.Translate(-GNParameters.spreadC1);
692  ribC[1].transform.Translate (-GNParameters.spreadC2);
693  ribD[0].transform.Translate(-GNParameters.spreadB1);
694  ribD[1].transform.Translate (-GNParameters.spreadB2);
695  ribE[0].transform.Translate(-GNParameters.spreadA1);
696  ribE[1].transform.Translate (-GNParameters.spreadA2);
697  }else{
698  ribA[0].transform.Translate(-GNParameters.spreadA1);
699  ribA[1].transform.Translate (-GNParameters.spreadA2);
700  ribB[0].transform.Translate(-GNParameters.spreadB1);
701  ribB[1].transform.Translate (-GNParameters.spreadB2);
702  ribC[0].transform.Translate(-GNParameters.spreadC1);
703  ribC[1].transform.Translate (-GNParameters.spreadC2);
704  ribD[0].transform.Translate(-GNParameters.spreadD1);
705  ribD[1].transform.Translate (-GNParameters.spreadD2);
706  ribE[0].transform.Translate(-GNParameters.spreadE1);
707  ribE[1].transform.Translate (-GNParameters.spreadE2);
708  }
709  }else{
710 
711  foreach( GameObject rib in ribC)
712  rib.transform.Translate(-GNParameters.spreadC);
713 
714  if(UIData.guided)
715  {
716  foreach( GameObject rib in ribA)
717  {
718  rib.transform.Translate(-GNParameters.spreadE);
719  }
720  foreach( GameObject rib in ribB)
721  {
722  rib.transform.Translate(-GNParameters.spreadD);
723  }
724  foreach( GameObject rib in ribD)
725  {
726  rib.transform.Translate(-GNParameters.spreadB);
727  }
728  foreach( GameObject rib in ribE)
729  {
730  rib.transform.Translate(-GNParameters.spreadA);
731  }
732  }
733  else
734  {
735  foreach( GameObject rib in ribA)
736  {
737  rib.transform.Translate(-GNParameters.spreadA);
738  }
739  foreach( GameObject rib in ribB)
740  {
741  rib.transform.Translate(-GNParameters.spreadB);
742  }
743  foreach( GameObject rib in ribD)
744  {
745  rib.transform.Translate(-GNParameters.spreadD);
746  }
747  foreach( GameObject rib in ribE)
748  {
749  rib.transform.Translate(-GNParameters.spreadE);
750  }
751  }
752  }
753  }
754 
758  private void Narrowing(){
761  GNParameters.comp_spread = Math.Round ((double)GNParameters.comp_spread, 1);
762 
763  Debug.Log("comp_spread" + GNParameters.comp_spread);
764 
765  if(GNParameters.comp_spread <= 0){
767  }else{
768 
771  }
772 
773  if(UIData.atomtype == UIData.AtomType.hyperball){
775  NarrowCAlpha();
776  }else{
778  }
779  } // End if Hyperballs
780 
781  if(UIData.atomtype == UIData.AtomType.sphere){
782  NarrowSpheres();
783  } // End if Sphere
784  }
785  } // End Narrowing
786 
789  Vector3 vectemp;
790  int hballNumber;
791 
792  vectemp = new Vector3();
793 
794  GNParameters.hballs = GameObject.FindObjectsOfType(typeof(BallUpdateHB)) as BallUpdateHB[];
795 
796  for (int i=0; i<GNParameters.hballs.Length; i++) {
797  hballNumber = (int)GNParameters.hballs[i].number;
798  vectemp.x = MoleculeModel.CaSplineList[hballNumber][0];
799  vectemp.y = MoleculeModel.CaSplineList[hballNumber][1];
800  vectemp.z = MoleculeModel.CaSplineList[hballNumber][2];
801 
802  GNParameters.hballs[i].transform.position = vectemp;
803  }
804  }
805 
808  Vector3 vectemp;
809  int hballNumber;
810 
811  vectemp = new Vector3();
812 
813  GNParameters.hballs = GameObject.FindObjectsOfType(typeof(BallUpdateHB)) as BallUpdateHB[];
814 
815  for (int i=0; i<GNParameters.hballs.Length; i++) {
816  hballNumber = (int)GNParameters.hballs[i].number;
817  vectemp.x = MoleculeModel.atomsLocationlist[hballNumber][0];
818  vectemp.y = MoleculeModel.atomsLocationlist[hballNumber][1];
819  vectemp.z = MoleculeModel.atomsLocationlist[hballNumber][2];
820 
821  GNParameters.hballs[i].transform.position = vectemp;
822  }
823  }
824 
826  private void ResetChainPosForSpheres(){
827  Vector3 vectemp;
828  int hballNumber;
829 
830  vectemp = new Vector3();
831 
832  GNParameters.sballs = GameObject.FindObjectsOfType(typeof(BallUpdateSphere)) as BallUpdateSphere[];
833  for (int i=0; i<GNParameters.sballs.Length; i++) {
834  hballNumber = (int)GNParameters.sballs[i].number;
835  vectemp.x = MoleculeModel.atomsLocationlist[hballNumber][0];
836  vectemp.y = MoleculeModel.atomsLocationlist[hballNumber][1];
837  vectemp.z = MoleculeModel.atomsLocationlist[hballNumber][2];
838 
839  GNParameters.sballs[i].transform.position = vectemp;
840  }
841  }
842 
846  private void ResetChainsPos(){
848 
849  if(UIData.atomtype == UIData.AtomType.hyperball){
850  // True: we are rendering only C-alpha atoms (C-alpha trace or BFactor representation)
852  {
854  }
855  else
856  {
858  }
859  } //End if hyperballs
860 
861  if(UIData.atomtype == UIData.AtomType.sphere){
863  } //End if Sphere
864 
868 
869  }
870 
872 
873  }// End ResetChainsPos
874 
875 
879  private Vector3 get_com(string chain)
880  {
881  float x = 0, y = 0, z = 0;
882  float nb_atoms = 0;
883  int first_atom = 0;
884 
885  if (GNParameters.onlyTMD)
886  first_atom = GNParameters.reslim;
887 
888  if (UIData.secondarystruct) {
889  for (int i=0; i < MoleculeModel.CaSplineList.Count; i++) {
890  if(MoleculeModel.CaSplineChainList[i]== chain){
891  x += MoleculeModel.CaSplineList[i][0];
892  y += MoleculeModel.CaSplineList[i][1];
893  z += MoleculeModel.CaSplineList[i][2];
894  nb_atoms++;
895  }
896  }
897  return new Vector3(x/nb_atoms, y/nb_atoms, z/nb_atoms);
898  }
899 
900  else{
901  for (int i=first_atom; i < MoleculeModel.atomsLocationlist.Count; i++) {
902  if(MoleculeModel.atomsChainList[i]== chain){
903  x += MoleculeModel.atomsLocationlist[i][0];
904  y += MoleculeModel.atomsLocationlist[i][1];
905  z += MoleculeModel.atomsLocationlist[i][2];
906  nb_atoms++;
907  }
908  }
909  return new Vector3(x/nb_atoms, y/nb_atoms, z/nb_atoms);
910  }
911  } // End get_com
912 
916  private void computeSpreadingVector()
917  {
918  Vector3 sym_center;
919  if(MoleculeModel.MinValue.y < 0)
920  sym_center = new Vector3(0, (MoleculeModel.MaxValue.y + MoleculeModel.MinValue.y), 0);
921  else
922  sym_center = new Vector3(0, (MoleculeModel.MaxValue.y - MoleculeModel.MinValue.y), 0);
923 
924  Vector3 temp = get_com("A");
925  GNParameters.spreadA = temp - sym_center;
926  GNParameters.spreadA.Normalize();
927 
928  temp = get_com("B");
929  GNParameters.spreadB = temp - sym_center;
930  GNParameters.spreadB.Normalize();
931 
932  temp = get_com("C");
933  GNParameters.spreadC = temp - sym_center;
934  GNParameters.spreadC.Normalize();
935 
936  temp = get_com("D");
937  GNParameters.spreadD = temp - sym_center;
938  GNParameters.spreadD.Normalize();
939 
940  temp = get_com("E");
941  GNParameters.spreadE = temp - sym_center;
942  GNParameters.spreadE.Normalize();
943  }
944 
948  private void computeSpreadPart(out Vector3 Spread1, out Vector3 Spread2, string chain){
949 
950  float x1 = 0, y1 = 0, z1 = 0;
951  float x2 = 0, y2 = 0, z2 = 0;
952  float nb_atoms1 = 0;
953  float nb_atoms2 = 0;
954 
955  Vector3 sym_center;
956  if(MoleculeModel.MinValue.y < 0)
957  sym_center = new Vector3(0, (MoleculeModel.MaxValue.y + MoleculeModel.MinValue.y), 0);
958  else
959  sym_center = new Vector3(0, (MoleculeModel.MaxValue.y - MoleculeModel.MinValue.y), 0);
960 
961  for (int i=0; i < MoleculeModel.atomsLocationlist.Count; i++) {
962  if(MoleculeModel.atomsChainList[i]== chain){
964  x1 += MoleculeModel.atomsLocationlist[i][0];
965  y1 += MoleculeModel.atomsLocationlist[i][1];
966  z1 += MoleculeModel.atomsLocationlist[i][2];
967  nb_atoms1++;
968  }else{
969  x2 += MoleculeModel.atomsLocationlist[i][0];
970  y2 += MoleculeModel.atomsLocationlist[i][1];
971  z2 += MoleculeModel.atomsLocationlist[i][2];
972  nb_atoms2++;
973  }
974  }
975  }
976  Vector3 temp1 = new Vector3 (x1 / nb_atoms1, y1 / nb_atoms1, z1 / nb_atoms1);
977  Spread1 = temp1 - sym_center;
978  Spread1.Normalize ();
979 
980  Vector3 temp2 = new Vector3 (x2 / nb_atoms2, y2 / nb_atoms2, z2 / nb_atoms2);
981  Spread2 = temp2 - sym_center;
982  Spread2.Normalize ();
983 
984  } //End ComputeSpreadPart
985 
993  private void computeSpreadHelix(out Vector3 Spreadhelix, int first_atom, int last_atom, string chain){
994  float x = 0, y = 0, z = 0;
995  float nb_atoms = 0;
996 
997  for (int i=first_atom; i < last_atom; i++) {
998  x += MoleculeModel.atomsLocationlist[i][0];
999  y += MoleculeModel.atomsLocationlist[i][1];
1000  z += MoleculeModel.atomsLocationlist[i][2];
1001  nb_atoms++;
1002  }
1003 
1004  Vector3 temp = new Vector3 (x / nb_atoms, y / nb_atoms, z / nb_atoms);
1005  GNParameters.onlyTMD = true;
1006  Vector3 center = get_com (chain);
1007  GNParameters.onlyTMD = false;
1008  Spreadhelix = temp - center;
1009  Spreadhelix.Normalize ();
1010 
1011  }
1012 
1018  {
1019  Vector3 v = GNParameters.mainCamera.transform.position;
1020 
1021  //if (float.Parse(MoleculeModel.FPS) > 30)
1022  GNParameters.nav_speed = (float) Math.Sqrt(Math.Abs (MoleculeModel.MinValue.y) + Math.Abs (MoleculeModel.MaxValue.y)) * (float) Math.Sqrt(Vector3.Distance(GNParameters.mainCamera.transform.position, maxCamera.target.position));
1023  Debug.Log(GNParameters.nav_speed*0.01);
1024  GNParameters.nav_speed *= 0.02f;
1025 
1026  if ((GNParameters.mainCamera.transform.position.y >= MoleculeModel.MaxValue.y)) {
1027  GNParameters.isabove = true;
1028 
1029  GNParameters.mainCamera.transform.RotateAround(maxCamera.target.position,GNParameters.mainCamera.transform.right, 1.0f*GNParameters.nav_speed);
1030  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MaxValue.y, 0));
1031  maxCamera.target.position = new Vector3(0, MoleculeModel.MaxValue.y, 0);
1032  }
1033 
1034  else if ((GNParameters.mainCamera.transform.position.y <= MoleculeModel.MinValue.y)){
1035  GNParameters.isunder = true;
1036 
1037  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MinValue.y, 0));
1038 
1039  GNParameters.mainCamera.transform.RotateAround(maxCamera.target.position, GNParameters.mainCamera.transform.right, 1.0f*GNParameters.nav_speed);
1040  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MinValue.y, 0));
1041 
1042  maxCamera.target.position = new Vector3(0, MoleculeModel.MinValue.y, 0);
1043 
1044  }
1045  else {
1046  v.y += GNParameters.nav_speed;
1047  GNParameters.mainCamera.transform.position = v;
1048  maxCamera.target.position = new Vector3(0, v.y, 0);
1049  }
1050  }
1051 
1057  {
1058 
1059  Vector3 v = GNParameters.mainCamera.transform.position;
1060 
1061  GNParameters.nav_speed = (float) Math.Sqrt(Math.Abs (MoleculeModel.MinValue.y) + Math.Abs (MoleculeModel.MaxValue.y)) * (float) Math.Sqrt(Vector3.Distance(GNParameters.mainCamera.transform.position, maxCamera.target.position));
1062  Debug.Log(GNParameters.nav_speed*0.01);
1063  GNParameters.nav_speed *= 0.02f;
1064 
1065  // We are above the molecule bounding box.
1066  if ((GNParameters.mainCamera.transform.position.y >= MoleculeModel.MaxValue.y)) {
1067  GNParameters.isabove = true;
1068 
1069  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MaxValue.y, 0));
1070 
1071  GNParameters.mainCamera.transform.RotateAround(maxCamera.target.position, GNParameters.mainCamera.transform.right, -1.0f*GNParameters.nav_speed);
1072  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MaxValue.y, 0));
1073 
1074  maxCamera.target.position = new Vector3(0, MoleculeModel.MaxValue.y, 0);
1075  }
1076  // We are below the molecule bounding box.
1077  else if ((GNParameters.mainCamera.transform.position.y <= MoleculeModel.MinValue.y)){
1078  GNParameters.isunder = true;
1079 
1080  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MinValue.y, 0));
1081 
1082  GNParameters.mainCamera.transform.RotateAround(maxCamera.target.position, GNParameters.mainCamera.transform.right, -1.0f*GNParameters.nav_speed);
1083  GNParameters.mainCamera.transform.LookAt(new Vector3(0, MoleculeModel.MinValue.y, 0));
1084  maxCamera.target.position = new Vector3(0, MoleculeModel.MinValue.y, 0);
1085 
1086  } else {
1087  v.y -= GNParameters.nav_speed;
1088  GNParameters.mainCamera.transform.position = v;
1089  maxCamera.target.position = new Vector3(0, v.y, 0);
1090 
1091  }
1092  }
1093 
1094  IEnumerator Transition()
1095  {
1096  float t = 0.0f;
1097  Vector3 startingPos = GNParameters.mainCamera.transform.position;
1098  while (t < 1.0f)
1099  {
1100  t += Time.deltaTime * (Time.timeScale/GNParameters.transitionDuration);
1101 
1102  GNParameters.mainCamera.transform.position = Vector3.Lerp(startingPos, GNParameters.optim_target, t);
1103  yield return 0;
1104  }
1105  }
1106 
1107  private void ReorientCamera()
1108  {
1110  if ((GNParameters.mainCamera.transform.position.y >= MoleculeModel.MaxValue.y))
1111  maxCamera.target.position = new Vector3(0, MoleculeModel.MaxValue.y, 0);
1112  else if((GNParameters.mainCamera.transform.position.y <= MoleculeModel.MinValue.y))
1113  maxCamera.target.position = new Vector3(0, MoleculeModel.MinValue.y, 0);
1114  else
1115  maxCamera.target.position = new Vector3(0, GNParameters.mainCamera.transform.position.y, 0);
1116 
1117  GNParameters.mainCamera.transform.LookAt(maxCamera.target.position);
1118  GNParameters.reoriented = false;
1119  }
1120  }
1121 
1122 
1123 }
1124 
1125 
static bool navigationUp
Are we moving down. Boolean set to true on key press.
static Vector3 poscloseatom
3D coordinates of the closest atom to the camera.
static Vector3 optim_user_cam_pos
3D coordinates of the selected best camera position.
static bool ghost_target_instantiate
Have the game objects for camera target and position been instantiated.
static bool optim_view
Definition: UIData.cs:203
static Vector3 spreadA
Spreading vectors for each chain (up to 5). Computed by GuidedNavigationManager::computeSpreadingVect...
void NarrowSpheres()
Narrow the chains when rendering spheres.
static bool secondarystruct
Switch between all atoms and C-alpha trace or BFactor secondary structure representation.
Definition: UIData.cs:176
void ResetChainPosForSpheres()
Resets the chains positions when rendering spheres.
static Vector3 velocity
Camera 3D speed during its repositioning.
static bool newUIActivated
Definition: UIData.cs:163
void CreateAxeAndOrigin()
Instantiate the origin and symmetry axis game objects.
static bool guidedzoom
Should we zoom? True when the camera is not at the right distance (maxCamera.desiredDistance != maxCa...
static Transform target
Definition: maxCamera.cs:125
static bool navigationDown
Are we moving down? Boolean set to true on key press.
Vector3 get_com(string chain)
Compute center of mass.
static bool isunder
Allows to dive into the channel when zoom in the structure from below.
static bool toggle_SEC_STRUCT
Triggers the switch between atom and secondary structure generation and rendering.
void computeSpreadHelix(out Vector3 Spreadhelix, int first_atom, int last_atom, string chain)
Computes spreading vectors for helices (third step spreading)
void DestroyAxeAndOrigin()
Destroy the axis and origin game objects.
static float weight_cam
Definition: maxCamera.cs:133
void computeSpreadPart(out Vector3 Spread1, out Vector3 Spread2, string chain)
Compute spreading vectors (second step).
static bool guided
Definition: UIData.cs:201
static AtomTree Build()
Definition: AtomTree.cs:231
static List< string > atomsChainList
The chain of each atom.
static float currentDistance
Definition: maxCamera.cs:128
static bool onlyTMD
If true, triggers the computation of the center of mass of only the TransMembrane Domain (TMD)...
static Vector3 optim_target
3D coordinates of the target.
static bool panoramic
Activates/Deactivate the panoramic view (immersive camera positioning).
static List< int > residueIds
The residue identifiers.
void NarrowHyperballs()
Narrow the chains when rendering hyperballs.
void goDownConstrained()
Only available in "guided navigation" and specific to pentameric channels.
static GameObject ghost_target
Reference to the sphere primitive representing the camera target.
static bool next_right
Jump to the next monomer on the right.
GameObject originPoint
GameObjects representing the space origin and molecule symmetry axis.
void NearSpreading()
Slightly spreads the chains when the camera is near the protein structure.
void goUpConstrained()
Only available in "guided navigation" mode and specific to pentameric channels.
abstract void ResetPositions()
string GetClosestAtomType(Vector3 pos)
Definition: AtomTree.cs:151
void ResetChainsPos()
Resets the chains position.
long number
Definition: BallUpdate.cs:84
void SpreadHyperballs()
Spread chains when rendering the atoms as hyperballs.
void NarrowCAlpha()
Narrow the chains of C-alpha traces.
static bool monomer_jump
Enter or exit jump navigation Triggered by key press (see GuidedNavigationManager::UpdateManager) ...
void SpreadSpheres()
Spread chains when rendering the atoms as spheres.
static List< float[]> CaSplineList
The coordinates of each Carbon alpha in the CA-Spline.
static BallUpdateHB[] hballs
List of all hyperballs mono behavior scripts Filled when spreading, narrowing or resetting chains pos...
!WiP Includes FLAGS of GUI.
Definition: UIData.cs:78
static bool next_left
Jump to the next monomer on the left.
static SecondaryStructureManager getSecondaryStructureManager()
Definition: UnityMolMain.cs:34
static GameObject mainCamera
Reference to the scene camera.
The GNParameters class regroups settings used for Guided Navigation and GLIC spreading.
static void ChangeRepresentation(UIData.AtomType newAtomType, UIData.BondType newBondType=UIData.BondType.nobond)
static float desiredDistance
Definition: maxCamera.cs:129
static bool isGLIC
Definition: UIData.cs:189
static bool reset_panoramic
When true, triggers the transition from panoramic view to normal view.
void SpreadSecondaryStructure()
Spread chains when rendering the secondary structure.
static Vector3 MaxValue
The "biggest" corner of the bounding box that encloses the molecule.
static List< string > CaSplineChainList
The chain of each carbon alpha in the CA-Spline.
static BondType bondtype
Definition: UIData.cs:141
void Narrowing()
Narrowing chains.
static Vector3[] optim_cam_position
3D coordinates of the 4 best camera positions.
void SpreadCAlpha()
Spread chains when rendering the C-alpha spline as hyperballs.
static float distclose
Distance between the camera and the closest atom.
static List< string > existingChain
List of the chains existing in the molecule.
static Vector3 MinValue
The "smallest" corner of the bounding box that encloses the molecule.
static int zoomRate
Definition: maxCamera.cs:94
static bool near_spread
Activate/Deactivate the spreading relative the closeness of the camera to the molecule.
static bool reoriented
When true, triggers the camera repositioning inside the molecule bounding box.
static AtomType atomtype
Definition: UIData.cs:139
static GameObject ghost_camera
Reference to the sphere primitive representing the camera ending position.
static double comp_spread
Current distance of spreading.
static GenericManager getCurrentBondManager()
Definition: UnityMolMain.cs:54
void ResetChainPosForHyperballs()
Resets the chains positions when rendering hyperballs.
static bool spread_tree
Definition: UIData.cs:190
static float[] closeatom
3D coordinates of the closest atom to the camera.
static BallUpdateSphere[] sballs
List of all spheres mono behavior scripts.
static bool isabove
Allows to dive into the channel when zoom in the structure from above.
void Spreading()
Spreading chains (limit: 5 chains)
static bool cameraStop
Definition: maxCamera.cs:88
static int reslim
Number of the first residue outside of the GLIC transmembrane domain.
void ResetChainPosForHyperballsAndSecondaryStructure()
Resets the chains positions when rendering the secondary structure.
Definition: GUIDisplay.cs:66
static GenericManager getCurrentAtomManager()
Definition: UnityMolMain.cs:50
static List< float[]> atomsLocationlist
The coordinates of each atom.
void computeSpreadingVector()
Compute spreading vectors (first step).