--- MITgcm_contrib/darwinview/src/darwin.c 2007/07/12 18:30:19 1.2 +++ MITgcm_contrib/darwinview/src/darwin.c 2007/07/16 19:16:26 1.5 @@ -8,17 +8,19 @@ #define DOWN 103 #define RIGHT 102 #define LEFT 100 -#define MAX 200 +#define MAX 700 -int NX, NY, MAXNZ, setsx, setsy; +int NX, NY, NZ; void do_byteswap_f32( float arr[], int nel ), global(), local( int, int, int ); -void readnames( char[] ), readarray( float[], char[], int ), readjet(); +void readnames( char[] ), readarray( float[], char[], int ), readjet(), readxz( float[], char[] ); +void readyz( float[], char[] ); void TimerFunction( int ), bitmap( char[], int, int ); -float data[MAX][MAX*MAX], mxval, mnval, jet[MAX][MAX]; +float data[MAX][MAX*MAX], mxval, mnval, jet[64][3]; float globalmx=0, globalmn=100; -int win[MAX], ilev=1, howmany, count=0, glo=0, usr=0, anim=0, logscale=0; +int win[MAX], ilev=1, howmany, sets, count=0, glo=0, usr=0, anim=0, logscale=0, xz=0, nonegs=1, endian=0; +int xmax, ymax, yoffset=0, xoffset=0, yz=0; char initfns[MAX][MAX], fns[MAX][MAX][MAX]; void menu(int value){ // called when menu is opened on right click @@ -42,20 +44,39 @@ case 4: logscale=(logscale+1)%2; // switch log scale on/off glutPostRedisplay(); break; + case 5: nonegs=(nonegs+1)%2; // switch allowance of negatives on/off + glutPostRedisplay(); + break; + case 6: endian=(endian+1)%2; // switch between big/little endian + glutPostRedisplay(); + break; } } - -void display(void){ // called on glutPostRedisplay +void display(){ // called on glutPostRedisplay int i, j, ioff, q; float r, g, b, k, y; double num, logmx, logmn; char str[MAX]; - for( q=0; qlogmx ) num=63; - else - num=63*( num-logmn )/( logmx-logmn ); + else{ + if( num>logmx ) num=63; + else + num=63*( num-logmn )/( logmx-logmn ); + } } else{ if( data[q][ioff]mxval ) num=63; // if data is more than max, =max else num=63*( data[q][ioff]-mnval )/( mxval-mnval ); // scale num from 0-63 (not defined for 64) + } } r=jet[(int)num][0]; // set red val g=jet[(int)num][1]; // set green val @@ -102,33 +126,40 @@ } } glColor3f( 1, 1, 1 ); // set color to white - glRectf( NX, 0, NX+1, NY+1 ); // draws a border - glRectf( 0, NY, NX, NY+1 ); // draws a border + glRectf( xmax, 0, xmax+1, ymax+1 ); // draws a border + glRectf( 0, ymax, xmax, ymax+1 ); // draws a border for( i=0; i<64; i++ ){ // draws color bar glColor3f( jet[i][0], jet[i][1], jet[i][2]); // sets color k=(float)i; // turns i into a float - y=(float)NY/64; // sets height of rectangles - glRectf( NX+10, y*k, NX+20, (k+1)*y ); // draws rectangle + y=(float)ymax/64; // sets height of rectangles + glRectf( xmax+10, y*k, xmax+20, (k+1)*y ); // draws rectangle } glColor3f( 1, 1, 1 ); // color to white if( logscale ) sprintf( str, "%.2f", logmx ); else - sprintf( str, "%.2e", mxval ); // labels color bar with max val - bitmap( str, NX+2, NY-1 ); + sprintf( str, "%.1e", mxval ); // labels color bar with max val + bitmap( str, xmax+2, ymax-1 ); if( logscale ) sprintf( str, "%.2f", logmn ); else - sprintf( str, "%.2e", mnval ); // labels color bar with min val - bitmap( str, NX+2, 1 ); + sprintf( str, "%.1e", mnval ); // labels color bar with min val + bitmap( str, xmax+2, 1 ); - sprintf( str, "Level %d", ilev ); // labels current level - bitmap( str, 1, NY+3 ); + if( xz ) + sprintf( str, "Y-coordinate=%d", yoffset+1); + else{ + if( yz ) + sprintf( str, "X-coordinate=%d", xoffset+1); + else + sprintf( str, "Level %d", ilev ); // labels current level + } + bitmap( str, 1, ymax+3 ); sprintf( str, "Time %d", count+1 ); // labels current time - bitmap( str, 50, NY+3 ); + bitmap( str, 80, ymax+3 ); if( glo ) // labels how max/min have been set sprintf( str, "Global" ); // if glo is set, display Global @@ -136,19 +167,19 @@ sprintf( str, "User-set" ); // if usr is set, display User-set if( !usr && !glo ) sprintf( str, "Local" ); // else display Local - bitmap( str, NX+12, NY+3 ); + bitmap( str, xmax+12, ymax+3 ); if( anim ){ // tell user if autoplay is on sprintf( str, "Autoplay" ); - bitmap( str, NX-25, NY+3 ); + bitmap( str, xmax-25, ymax+3 ); } if( logscale ){ sprintf( str, "Log Scale" ); // tell user if log scale is on - bitmap( str, NX-25, NY+10 ); + bitmap( str, xmax-25, ymax+10 ); } - bitmap( fns[q][count], 1, NY+10 ); // labels current file + bitmap( fns[q][count], 1, ymax+10 ); // labels current file glutSwapBuffers(); // double buffering set to animate smoothly glFlush(); @@ -164,7 +195,7 @@ } void key( unsigned char key, int x, int y ){ // called on key press - int i; + int i, tmp; switch(key){ case 'q': exit(0); // quits on 'q' @@ -176,6 +207,13 @@ case 'a': anim=(anim+1)%2; // turns anim on/off glutPostRedisplay(); break; + case 'x': xz=(xz+1)%2; + yz=0; + glutPostRedisplay(); + break; + case 'y': yz=(yz+1)%2; + xz=0; + glutPostRedisplay(); } } @@ -183,11 +221,25 @@ int i; switch(value){ // increments in the correct direction - case DOWN : if( ilev0 ) + yoffset--; + else{ + if( yz && xoffset1 ) - ilev--; // if up arrow is pressed, move up a level + case UP : if( xz && yoffset0 ) + xoffset--; + else + if( ilev>1 && !xz && !yz ) + ilev--; // if up arrow is pressed, move up a level + } break; case LEFT : if( count>0 ) count--; // if left arrow is pressed, move back one time step @@ -199,12 +251,28 @@ glutPostRedisplay(); - if (anim ) + if ( anim ) switch( value ){ - case DOWN : if( ilev==MAXNZ ) ilev=1; // if end reached, restart + case DOWN : if( xz && yoffset==0 ) + yoffset=NY-1; + else{ + if( yz && xoffset==NX-1 ) + xoffset=0; + else + if( ilev==NZ && !xz && !yz ) + ilev=1; // if end reached, restart + } glutTimerFunc( 100, TimerFunction, value ); // recalls itself break; - case UP : if( ilev==1 ) ilev=MAXNZ; // if end reached, restart + case UP : if( xz && yoffset==NY-1 ) + yoffset=0; + else{ + if( yz && xoffset==0 ) + xoffset=NX-1; + else + if( ilev==1 ) + ilev=NZ; // if end reached, restart + } glutTimerFunc( 100, TimerFunction, value ); // recalls itself break; case LEFT : if( count==0 ) count=howmany-1; // if end reached, restart @@ -223,11 +291,25 @@ glutTimerFunc( 100, TimerFunction, key); // to scroll automatically switch(key){ - case DOWN : if( ilev0 ) + yoffset--; + else{ + if( yz && xoffset1 ) // if you haven't reached the top - ilev--; // keep going up + case UP : if( xz && yoffset0 ) + xoffset--; + else + if( ilev>1 ) // if you haven't reached the top + ilev--; // keep going up + } break; case RIGHT : if( count globalmx ) globalmx = mxval; // sets highest value to globalmx if( mnval < globalmn ) globalmn = mnval; // sets lowest value to globalmn @@ -256,11 +338,18 @@ mxval=0; mnval=100; - readarray( data[i], fns[i][time], lev ); // read new array of data - for( j=0; j mxval ) mxval=data[i][j]; // set largest val to mxval - if( data[i][j] < mnval && data[i][j] > 0 ) + if( data[i][j] < mnval && data[i][j]!=0 ) mnval=data[i][j]; // set smallest positive val to mnval } } @@ -275,9 +364,9 @@ i++; // counts how many filenames there are } fclose( fp ); // close file - howmany=i-1; // saves number of initial filenames + sets=i-1; // saves number of initial filenames - for(i=0; i= sets ) // + glutDisplayFunc( black ); + else + glutDisplayFunc( display ); // sets display func for subwindow + - glutCreateMenu( menu ); // adds a menu - glutAddMenuEntry( "Local Color Scale", 1 ); // adds a menu entry - glutAddMenuEntry( "Global Color Scale", 2 ); // adds a menu entry - glutAddMenuEntry( "User-Set Color Scale", 3 ); // adds a menu entry - glutAddMenuEntry( "Log Scale (on/off)", 4 ); // adds a menu entry - glutAttachMenu( GLUT_RIGHT_BUTTON ); // menu called on right click + glutCreateMenu( menu ); // adds a menu + glutAddMenuEntry( "Local Color Scale", 1 ); // adds a menu entry + glutAddMenuEntry( "Global Color Scale", 2 ); // adds a menu entry + glutAddMenuEntry( "User-Set Color Scale", 3 ); // adds a menu entry + glutAddMenuEntry( "Log Scale (on/off)", 4 ); // adds a menu entry + glutAddMenuEntry( "Allow Negatives (on/off)", 5 ); // adds a menu entry + glutAddMenuEntry( "Switch Endian (big/little) ", 6); // adds a menu entry + glutAttachMenu( GLUT_RIGHT_BUTTON ); // menu called on right click } glutMainLoop(); // begin processing events