home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Educational / RasMol / Source / rasnext.m < prev    next >
Encoding:
Text File  |  1995-10-31  |  9.0 KB  |  363 lines

  1. /*
  2.  *    NEXTSTEP specific routines for RasMol
  3.  *        (c) 1995 Andreas Windemuth 
  4.  */
  5.  
  6. #import "objc/NXBundle.h"
  7.  
  8. #define GRAPHICS
  9. #include "rasnext/RasView.h"
  10.  
  11. //    Link back to RasView object
  12. RasView *rasView=NULL;
  13.  
  14. //    direct character output to text port
  15. void NXWriteChar(char ch)
  16. {
  17.     [rasView putChar:ch];
  18. }
  19.  
  20. void NXWriteString(char *ptr)
  21. {
  22.     [rasView show:ptr];
  23. }
  24.  
  25. //    Timing function
  26. Real realtime(void)
  27. {
  28.     struct timeval tv;
  29.     struct timezone tzv;
  30.  
  31.     gettimeofday(&tv, &tzv);
  32. /*    debug("Time: %d seconds, %d microseconds, % 15.3f\n",
  33.     tv.tv_sec, tv.tv_usec, (double)tv.tv_sec + 1e-6*(double)tv.tv_usec);  */
  34.     return (Real)tv.tv_sec + 1e-6*(Real)tv.tv_usec;
  35. }
  36.  
  37. //    Find bundeled files such as rasmol.hlp
  38. FILE *openResourceFile(const char *fn, char *path, int len)
  39. {
  40.     char buf[MAXPATHLEN+1];
  41.     
  42.     if (![[NXBundle mainBundle] getPath:buf forResource:fn ofType:NULL]) return NULL;
  43.     if (path) {
  44.     if (strlen(buf)>len) {
  45.         if( CommandActive ) WriteChar('\n');
  46.         CommandActive = False;
  47.         WriteString("Unable to find RasMol help file!\n");
  48.     }
  49.     strcpy(path, buf);
  50.     }
  51.     return fopen(buf, "r");
  52. }
  53.  
  54. // no color maps
  55. void AllocateColourMap()
  56. {
  57. }
  58.  
  59. //    This should be in rasmol core, I guess
  60. int CreateImage()
  61. {
  62.     register Long size, temp;
  63.  
  64.     if( FBuffer ) free(FBuffer);
  65.     size = (Long)XRange*YRange*sizeof(Pixel);
  66.     FBuffer = (Pixel*)malloc( size+32 );
  67.     [rasView initBitmap];
  68.     return( (int)FBuffer );
  69. }
  70.  
  71.  
  72. //    Flush to screen
  73. void TransferImage()
  74. {
  75.     Real t = realtime();
  76. #ifdef TWOBIT
  77.     { int i, j; Byte *p, *q;
  78.     q = FBuffer;
  79.     for (i=0; i<YRange; i++) {
  80.         p = tbuf + i*((XRange>>2)+1);
  81.         for (j=0; j<(XRange>>2); j++) {
  82.         *p = *(q++)&192;
  83.         *p |= (*(q++)&192)>>2;
  84.         *p |= (*(q++)&192)>>4;
  85.         *(p++) |= (*(q++)&192)>>6;
  86.         }
  87.         *p = 0;
  88.         for (j=0; j<(XRange%4); j++) *p |= (*(q++)&192)>>(j<<1);
  89.     }
  90.     }
  91. //    printf("Buffer transferred: %g\n", realtime()-t);
  92. #endif
  93.     [rasView display];
  94.     NXPing();
  95.     [rasView setMeter:2 value:realtime()-t];
  96. }
  97.  
  98.  
  99. void ClearImage()
  100. {
  101. }
  102.  
  103.  
  104. //    Replaced by NEXTSTEP print mechanism
  105. int PrintImage()
  106. {
  107.     return( True );
  108. }
  109.  
  110.  
  111. int ClipboardImage()
  112. {
  113. }
  114.  
  115.  
  116. void UpdateScrollBars()
  117. {
  118. }
  119.  
  120.  
  121. void SetMouseMode( mode )
  122.     int mode;
  123. {
  124. }
  125.  
  126.  
  127. int LookUpColour( name, r, g, b )
  128.     char *name; int *r, *g, *b;
  129. {
  130.     return( False );
  131. }    
  132.  
  133.  
  134. void EnableMenus( flag )
  135.     int flag;
  136. {
  137. }
  138.  
  139.  
  140. int OpenDisplay( x, y )
  141.     int x, y;
  142. {
  143.     int i;
  144.     
  145.     UseHourGlass = True;
  146.     DisableMenu = False;
  147.     MouseMode = MMRasMol;
  148.  
  149.     for( i=0; i<8; i++ )
  150.      DialValue[i] = 0.0;
  151.  
  152.     ULut[0] = True;
  153.     RLut[0] = GLut[0] = BLut[0] = 0;
  154.     XRange = x;   WRange = XRange>>1;
  155.     YRange = y;   HRange = YRange>>1;
  156.     Range = MinFun(XRange,YRange);
  157.         
  158.     /* Initialise Palette! */
  159.     for( i=1; i<256; i++ )
  160.     ULut[i] = False;
  161.     AllocateColourMap();
  162.     UpdateScrollBars();
  163.     
  164.     if (!rasView) return False;
  165.     return(True);                       
  166. }
  167.  
  168.     
  169. void BeginWait()
  170. {
  171. }
  172.  
  173.  
  174. void EndWait()
  175. {
  176. }
  177.  
  178.  
  179. void CloseDisplay()
  180. {
  181. }
  182.  
  183. int FetchEvent( wait )
  184.     int wait;
  185. {
  186. }
  187.  
  188. void ClampDial( dial, value )
  189.     int dial;  Real value;
  190. {
  191.     register Real temp;
  192.  
  193.     temp = DialValue[dial] + value;
  194.  
  195.     if( temp > 1.0 )
  196.     {   DialValue[dial] = 1.0;
  197.     } else if( temp < -1.0 )
  198.     {   DialValue[dial] = -1.0;
  199.     } else DialValue[dial] = temp;
  200. }
  201.  
  202. void WrapDial( dial, value )
  203.     int dial;  Real value;
  204. {
  205.     register Real temp;
  206.  
  207.     temp = DialValue[dial] + value;
  208.     while( temp < -1.0 )  temp += 2.0;
  209.     while( temp > 1.0 )   temp -= 2.0;
  210.     DialValue[dial] = temp;
  211. }
  212.  
  213. //    MouseMove lifted almost unmodified from X-windows version:
  214. #define ShiftMask NX_SHIFTMASK
  215. #define ControlMask NX_CONTROLMASK
  216. #define Button1Mask 1
  217. #define Button2Mask 2
  218. #define Button3Mask 4
  219.  
  220. void MouseMove( int status, int dx, int dy )
  221. {
  222.     register int index;
  223.  
  224. /* printf("MouseMove %x %d %d\n", status, dx, dy);
  225. printf("  RasMol: %d, Shift: %d, But1: %d, But2: %d, Ctrl: %d\n",
  226.     MouseMode == MMRasMol, status & ShiftMask, status & Button1Mask,
  227.     status & Button2Mask, status & ControlMask);
  228. */
  229.     if( MouseMode == MMRasMol )
  230.     {   if( status & ShiftMask )
  231.         {   if( status & Button1Mask ) 
  232.             {   if( dy ) /* Zoom Vertical */
  233.                 {   ClampDial( 3, (Real)dy/HRange );
  234.                     ReDrawFlag |= RFZoom;
  235.                 }
  236.             } else if( status & (Button2Mask|Button3Mask) )
  237.                 if( dx ) /* Z Rotation Horizontal */
  238.                 {   WrapDial( 2, (Real)dx/WRange );
  239.                     ReDrawFlag |= RFRotateZ;
  240.                 }
  241.         } else if( status & ControlMask )
  242.         {   if( status & Button1Mask )
  243.             {   if( dy ) /* Slab Vertical */
  244.                 {   ClampDial( 7, (Real)dy/YRange );
  245.                     ReDrawFlag |= RFSlab;
  246.                 }
  247.             }
  248.  
  249.         } else /* Unmodified! */
  250.             if( status & Button1Mask )
  251.             {   if( dx ) /* Rotate Y Horizontal */
  252.                 {   WrapDial( 1, (Real)dx/WRange );
  253.                     index = (DialValue[1]+1.0)*(XRange-48);
  254. /*                    NewScrlX = (index>>1)+16;   */
  255.                     ReDrawFlag |= RFRotateY;
  256.                 }
  257.  
  258.                 if( dy ) /* Rotate X Vertical */
  259.                 {   WrapDial( 0, (Real)dy/HRange );
  260.                     index = (DialValue[0]+1.0)*(YRange-48);
  261. /*                    NewScrlY = (index>>1)+16;  */
  262.                     ReDrawFlag |= RFRotateX;
  263.                 }
  264.             } else if( status & (Button2Mask|Button3Mask) )
  265.             {   if( dx ) /* Translate X Horizontal */
  266.                 {   ClampDial( 4, (Real)dx/XRange );
  267.                     ReDrawFlag |= RFTransX;
  268.                 }
  269.  
  270.                 if( dy ) /* Translate Y Vertical */
  271.                 {   ClampDial( 5, (Real)dy/YRange );
  272.                     ReDrawFlag |= RFTransY;
  273.                 }
  274.             }
  275.     } else if( MouseMode==MMQuanta )
  276.     {   if( status & ShiftMask )
  277.         {   if( status & Button1Mask )
  278.             {   if( dy ) /* Slab Vertical */
  279.                 {   ClampDial( 7, (Real)dy/YRange );
  280.                     ReDrawFlag |= RFSlab;
  281.                 }
  282.             } else if( status & Button2Mask )
  283.             {   if( dx ) /* Translate X Horizontal */
  284.                 {   ClampDial( 4, (Real)dx/XRange );
  285.                     ReDrawFlag |= RFTransX;
  286.                 }
  287.  
  288.                 if( dy ) /* Translate Y Vertical */
  289.                 {   ClampDial( 5, (Real)dy/YRange );
  290.                     ReDrawFlag |= RFTransY;
  291.                 }
  292.             } else if( !(status & Button3Mask) )
  293.                 if( dy ) /* Zoom Vertical */
  294.                 {   ClampDial( 3, (Real)dy/HRange );
  295.                     ReDrawFlag |= RFZoom;
  296.                 }
  297.         } else if( status & Button2Mask )
  298.         {   if( dx ) /* Rotate Y Horizontal */
  299.             {   WrapDial( 1, (Real)dx/WRange );
  300.                 index = (DialValue[1]+1.0)*(XRange-48);
  301. /*                NewScrlX = (index>>1)+16;  */
  302.                 ReDrawFlag |= RFRotateY;
  303.             }
  304.  
  305.             if( dy ) /* Rotate X Vertical */
  306.             {   WrapDial( 0, (Real)dy/HRange );
  307.                 index = (DialValue[0]+1.0)*(YRange-48);
  308. /*                NewScrlY = (index>>1)+16;  */
  309.                 ReDrawFlag |= RFRotateX;
  310.             }
  311.         } else if( status & Button3Mask )
  312.             if( dx ) /* Z Rotation Horizontal */
  313.             {   WrapDial( 2, (Real)dx/WRange );
  314.                 ReDrawFlag |= RFRotateZ;
  315.             }
  316.     } else /* MMInsight */
  317.         switch( status & (Button1Mask|Button2Mask|Button3Mask) )
  318.         {   case( Button1Mask ):
  319.                     if( dx ) /* Rotate Y Horizontal */
  320.                     {   WrapDial( 1, (Real)dx/WRange );
  321.                         index = (DialValue[1]+1.0)*(XRange-48);
  322. /*                        NewScrlX = (index>>1)+16;  */
  323.                         ReDrawFlag |= RFRotateY;
  324.                     }
  325.  
  326.                     if( dy ) /* Rotate X Vertical */
  327.                     {   WrapDial( 0, (Real)dy/HRange );
  328.                         index = (DialValue[0]+1.0)*(YRange-48);
  329. /*                        NewScrlY = (index>>1)+16;  */
  330.                         ReDrawFlag |= RFRotateX;
  331.                     }
  332.                     break;
  333.  
  334.             case( Button2Mask ):
  335.                     if( dx ) /* Translate X Horizontal */
  336.                     {   ClampDial( 4, (Real)dx/XRange );
  337.                         ReDrawFlag |= RFTransX;
  338.                     }
  339.  
  340.                     if( dy ) /* Translate Y Vertical */
  341.                     {   ClampDial( 5, (Real)dy/YRange );
  342.                         ReDrawFlag |= RFTransY;
  343.                     }
  344.                     break;
  345.  
  346.             case( Button1Mask|Button2Mask ):
  347.                     ClampDial( 3, (Real)dx/WRange - (Real)dy/HRange );
  348.                     ReDrawFlag |= RFZoom;
  349.                     break;
  350.  
  351.             case( Button1Mask|Button3Mask ):
  352.                     WrapDial( 2, (Real)dx/WRange - (Real)dy/HRange );
  353.                     ReDrawFlag |= RFRotateZ;
  354.                     break;
  355.  
  356.             case( Button1Mask|Button2Mask|Button3Mask ):
  357.                     ClampDial( 7, (Real)dx/XRange - (Real)dy/YRange );
  358.                     ReDrawFlag |= RFSlab;
  359.                     break;
  360.         }
  361. }
  362.  
  363.