Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members  

prj.c

Go to the documentation of this file.
00001 /*
00002 ** ---------------------------------------------------------------
00003 ** prj.c - Project manager module.
00004 **
00005 ** ---------------------------------------------------------------
00006 */
00007 #define _PRJ_C
00008 
00043 /*
00044 ** ---------------------------------------------------------------
00045 ** Global variables and symbols
00046 */
00047 #ifdef _WIN32
00048 #include <windows.h>
00049 #endif
00050 #include <stdio.h>
00051 #include <stdlib.h>
00052 #include <string.h>
00053 #include <GL/gl.h>
00054 #include <GL/glu.h>
00055 
00056 #include "iup.h"
00057 #include "cd.h"
00058 #include "cdiup.h"
00059 #include "prj.h"
00060 #include "prm.h"
00061 #include "prmio.h"
00062 #include "dsp.h"
00063 #include "zbf.h"
00064 
00065 /*
00066 ** ---------------------------------------------------------------
00067 ** Local variables and symbols:
00068 */
00069 
00070 #ifndef MAX
00071 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
00072 #endif
00073 
00076 static char *trab_info =
00077    {
00078     "\n"
00079     "\n"
00080     "                   CIV-2801  -- 2005.2               \n"
00081     "\n"
00082     "      Fundamentos de Computacao Grafica Aplicada     \n"
00083     "\n"
00084     "           Departamento de Engenharia Civil          \n"
00085     "                        PUC-Rio                      \n"
00086     "\n"
00087     "            Trabalho No.: 3                          \n"
00088     "            Aluno:       \n"
00089     "            Data:        \n"
00090     "\n"
00091    };
00092 
00095 static double max_height = 50.0;
00096 
00100 static Prm *sel_prm = NULL;
00101 
00104 static int list_updated = 0;
00105 
00108 static Ihandle  *Ozbufferdialog = NULL;
00109 
00112 static cdCanvas *Gzbuffercanvas = NULL;
00113 
00114 
00115 /*
00116 ** ---------------------------------------------------------------
00117 ** Local functions: 
00118 */
00119 
00120 /*======================  prjResetLocalParams  ====================*/
00125 static void prjResetLocalParams( void )
00126 {
00127  max_height = 50.0;
00128  sel_prm = NULL;
00129  list_updated = 0;
00130 }
00131 
00132 /*======================  prjBuildDisplayList  ====================*/
00136 static void prjBuildDisplayList( void )
00137 {
00138  glNewList( 1, GL_COMPILE );
00139  if( prmFirst( ) )
00140  {
00141   dspModel( );
00142   list_updated = 1;
00143  }
00144  glEndList( );
00145 }
00146 
00147 /*=========================  prjPckPrm  ==========================*/
00153 static Prm *prjPckPrm( double x, double y )
00154 {
00155  Prm *prm;
00156 
00157  for( prm = prmFirst( ); prm != NULL; prm = prmNext( prm ) )
00158  {
00159   if( prmPickArea( prm, x, y ) )
00160   {
00161    return( prm );
00162   }
00163  }
00164  return( NULL );
00165 }
00166 
00167 /*====================  prjDspZbufferCanvas  =====================*/
00172 static int prjDspZbufferCanvas( Ihandle *cv )
00173 {
00174  if( Gzbuffercanvas )
00175   dspZbfModel( Gzbuffercanvas );
00176  return( IUP_DEFAULT );
00177 }
00178 
00179 
00180 /*
00181 ** ---------------------------------------------------------------
00182 ** Public functions:
00183 */
00184 
00185 /*===========================  prjInit  ===========================*/
00186 
00187 void prjInit( void )
00188 {
00189 }
00190 
00191 /*===========================  prjQuit  ===========================*/
00192 
00193 void prjQuit( void )
00194 {
00195  prmDeleteList( );
00196 
00197  if( Gzbuffercanvas )
00198   cdKillCanvas( Gzbuffercanvas );
00199 
00200  if( Ozbufferdialog )
00201   IupDestroy( Ozbufferdialog );
00202 }
00203 
00204 /*==========================  prjResize  ==========================*/
00205 
00206 void prjResize( int width, int height )
00207 {
00208  dspInit( );
00209 }
00210 
00211 /*========================  prjRedisplay  =========================*/
00212 
00213 void prjRedisplay( void )
00214 {
00215  glClearColor( 0.75, 0.75, 0.75, 1.0 ); /* gray background color */
00216  glEnable( GL_LIGHTING );
00217  glEnable( GL_LIGHT0 );
00218  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
00219  if( ! list_updated )
00220  {
00221   prjBuildDisplayList( );
00222  }
00223  glCallList( 1 );
00224  IupGLSwapBuffers( Odatascreen ); 
00225 }
00226 
00227 /*===========================  prjInfo  ===========================*/
00228 
00229 void prjInfo( void )
00230 {
00231  IupMessage( "  Informacoes do Projeto  ", trab_info );
00232 }
00233 
00234 /*===========================  prjHelp  ===========================*/
00235 
00236 void prjHelp( void )
00237 {
00238  dspHelp( );
00239 }
00240 
00241 /*=========================  prjOpenModel  ========================*/
00242 
00243 int prjOpenModel( FILE *fd )
00244 {
00245  double xmin;
00246  double xmax;
00247  double ymin;
00248  double ymax;
00249  double zmin;
00250  double zmax;
00251  int    status;
00252 
00253 /* Delete current model (if there is one).
00254  */
00255  prmDeleteList( );
00256  prjResetLocalParams( );
00257 
00258 /* Read new data file
00259  */
00260  status = prmioInterpret( fd );
00261 
00262  if( status )
00263  {
00264 /* Compute new model bounding box and adjust visualization volume
00265  * to fit new bounding box.
00266  * Set maximum primitive height equal to maximum size in XY plane.
00267  */
00268   if( prmGetGlobalBox( &xmin, &xmax, &ymin, &ymax ) )
00269   {
00270    max_height = MAX( xmax-xmin, ymax-ymin );
00271    zmin = 0.0;
00272    zmax = max_height;
00273    vglSetBox( vglcanvas, (float)xmin, (float)xmax, (float)ymin, 
00274                          (float)ymax, (float)zmin, (float)zmax );
00275    prjPersp( );
00276   }
00277  }
00278 
00279  return( status );
00280 }
00281 
00282 /*======================  prjZbufferSnapShot  =====================*/
00283 
00284 void prjZbufferSnapShot( void )
00285 {   
00286  Ihandle  *Ozbuffercanvas;   /* IUP handle of zbuffer canvas */
00287  int      viewport[4];       /* OpenGL canvas viewport */
00288  int      width, height;     /* main data screen sizes */
00289  static char size_string[32];
00290 
00291  if( prmFirst( ) == NULL )
00292   return;
00293 
00294  if( Gzbuffercanvas )
00295   cdKillCanvas( Gzbuffercanvas );
00296 
00297  if( Ozbufferdialog )
00298   IupDestroy( Ozbufferdialog );
00299 
00300 /* Get main data screen (canvas) sizes.
00301  */
00302  glGetIntegerv( GL_VIEWPORT, viewport );
00303  width  = viewport[2] - viewport[0];
00304  height = viewport[3] - viewport[1];
00305 
00306 /* Initialize zbuffer for the given canvas sizes.
00307  */
00308  if( ! zbfInit( width, height ) )
00309   return;
00310 
00311 /* Create a CD canvas with the same sizes.
00312  * Specifies function "prjDspZbufferCanvas" as the redisplay callback.
00313  */
00314  IupSetFunction( "prjDspZbufferCanvas", (Icallback)prjDspZbufferCanvas );
00315  Ozbuffercanvas = IupCanvas( "prjDspZbufferCanvas" );
00316  sprintf( size_string, "%dx%d", width, height );
00317  IupSetAttribute( Ozbuffercanvas, IUP_RASTERSIZE, size_string );
00318  IupSetAttribute( Ozbuffercanvas, IUP_SCROLLBAR, IUP_NO );
00319 
00320 /* Create a dialog for the canvas with no resize option.
00321  * Specifies function "prjCloseZbufferDialog" as the close dialog callback.
00322  */
00323  Ozbufferdialog = IupDialog( Ozbuffercanvas );
00324  IupSetAttribute( Ozbufferdialog, IUP_MAXBOX, IUP_NO );
00325  IupSetAttribute( Ozbufferdialog, IUP_MINBOX, IUP_NO );
00326  IupSetAttribute( Ozbufferdialog, IUP_RESIZE, IUP_NO );
00327  IupSetAttribute( Ozbufferdialog, IUP_TITLE,  "Zbuffer Snap Shot" );
00328 
00329  IupMap( Ozbufferdialog );
00330  Gzbuffercanvas = cdCreateCanvas( CD_IUP, Ozbuffercanvas );
00331  IupShow( Ozbufferdialog );
00332 }
00333 
00334 /*======================  prjRaster2WorldXY  ======================*/
00335 
00336 int prjRaster2WorldXY( int x, int y, double *xw, double *yw )
00337 {
00338  double frontx, fronty, frontz;    /* pick point at front view volume plane */
00339  double backx,  backy,  backz;     /* pick point at back view volume plane */
00340  double t;
00341 
00342  dspGetPickRay( x, y, &frontx, &fronty, &frontz, &backx, &backy, &backz );
00343 
00344  if( frontz == backz )
00345   return( 0 );
00346 
00347 /* Get intersection of pick ray line with XY plane.
00348  */
00349  t = frontz / (frontz - backz );
00350 
00351  if( (t < 0.0) && (t > 1.0) )
00352   return( 0 );
00353 
00354  *xw = (1.0-t) * frontx + t * backx;
00355  *yw = (1.0-t) * fronty + t * backy;
00356 
00357  return( 1 );
00358 }
00359 
00360 /*=========================  prjSelectPrm  ========================*/
00361 
00362 int prjSelectPrm( double x, double y )
00363 {
00364  Prm *prm;
00365  int status = 0;
00366 
00367 /* Try to select a primitive based on the given point.
00368  */
00369  prmUnselectAll( );
00370  sel_prm = NULL;
00371 
00372  if( (prm = prjPckPrm( x, y )) != NULL )
00373  {
00374   sel_prm = prm;
00375   prmSelect( sel_prm );
00376   status = 1;
00377  }
00378 
00379 /* Rebuild display list.
00380  */
00381  prjBuildDisplayList( );
00382 
00383  return( status );
00384 }
00385 
00386 /*=======================  prjSetHeightFac  =======================*/
00387 
00388 void prjSetHeightFac( double fac )
00389 {
00390  if( (prmFirst( ) == NULL) || (sel_prm == NULL) )
00391   return;
00392 
00393 /* Does not allow height factors outside the range 0 to 1.
00394  */
00395  if( fac < 0.01 )
00396   fac = 0.0;
00397 
00398  if( fac > 0.99 )
00399   fac = 1.0;
00400 
00401 /* Set the height of currently selected primitive
00402  * according to given factor.
00403  */
00404  prmSetHeight( sel_prm, max_height * fac );
00405 
00406 /* Rebuild display list and redisplay the model.
00407  */
00408  prjBuildDisplayList( );
00409  vglRedraw(vglcanvas);
00410 }
00411 
00412 /*=======================  prjGetHeightFac  =======================*/
00413 
00414 double prjGetHeightFac( void )
00415 {
00416  double fac;
00417 
00418  if( (prmFirst( ) == NULL) || (sel_prm == NULL) )
00419   return( 0.0 );
00420 
00421  fac = prmGetHeight( sel_prm ) / max_height;
00422 
00423  return( fac );
00424 }
00425 
00426 /*=========================  prjResetView  ========================*/
00427 
00428 void prjResetView( void )
00429 {
00430  vglReset( vglcanvas );
00431  vglRedraw( vglcanvas );
00432 }
00433 
00434 /*===========================  prjFit  ============================*/
00435 
00436 void prjFit( void )
00437 {
00438  vglReset( vglcanvas );
00439  vglRedraw( vglcanvas );
00440 }
00441 
00442 /*==========================  prjPersp  ===========================*/
00443 
00444 void prjPersp( void )
00445 {
00446  vglReset( vglcanvas );
00447  vglSetOrtho( vglcanvas, 0 );
00448  vglSetAngle( vglcanvas, 10 );
00449  vglSetItrMode( vglcanvas, VGL_MANIP );
00450  vglEnableAutoFit( vglcanvas, 0, 0, -1, 1.3f );
00451  vglSetUp( vglcanvas, 0, 1, 0 );
00452  vglPostRedraw( vglcanvas );  
00453 }
00454 
00455 /*==========================  prjOrtho  ===========================*/
00456 
00457 void prjOrtho( void )
00458 {
00459  vglReset( vglcanvas );
00460  vglSetOrtho( vglcanvas, 1 );
00461  vglRedraw( vglcanvas );
00462 }
00463 
00464 /*==========================  prjProjX  ===========================*/
00465 
00466 void prjProjX( void )
00467 {
00468  vglReset( vglcanvas);
00469  vglSetOrtho( vglcanvas, 1 );
00470  vglSetDOP( vglcanvas, -1.0f, 0.0f, 0.0f );
00471  vglSetUp( vglcanvas, 0.0, 0.0, 1.0 );
00472  vglRedraw( vglcanvas );
00473 }
00474 
00475 /*==========================  prjProjY  ===========================*/
00476 
00477 void prjProjY( void )
00478 {
00479  vglReset( vglcanvas );
00480  vglSetOrtho( vglcanvas, 1 );
00481  vglSetDOP( vglcanvas, 0.0f, -1.0f, 0.0f );
00482  vglSetUp( vglcanvas, 0.0, 0.0, 1.0 );
00483  vglRedraw( vglcanvas );
00484 }
00485 
00486 /*==========================  prjProjZ  ===========================*/
00487 
00488 void prjProjZ( void )
00489 {
00490  vglReset( vglcanvas );
00491  vglSetOrtho( vglcanvas, 1 );
00492  vglSetDOP( vglcanvas, 0.0f, 0.0f, -1.0f );
00493  vglSetUp( vglcanvas, 0.0, 1.0, 0.0 );
00494  vglRedraw( vglcanvas );
00495 }
00496 
00497 /*========================  prjManipMode  =========================*/
00498 
00499 void prjManipMode( void )
00500 {
00501  vglSetItrMode( vglcanvas, VGL_MANIP );
00502 }
00503 
00504 /*========================  prjNavigMode  =========================*/
00505 
00506 void prjNavigMode( void )
00507 {
00508  vglSetItrMode( vglcanvas, VGL_NAVIG );
00509 }
00510 
00511 /*========================  prjZoomMode  ==========================*/
00512 
00513 void prjZoomMode( void )
00514 {
00515  vglSetItrMode( vglcanvas, VGL_SINGLE_ZOOM );
00516 }
00517 
00519 lcanvas, 0.0, 1.0, 0.0 );
00520  vglRedraw( vglcanvas );
00521 }
00522 
00523 /*========================  prjManipMode  =========================*/
00524 
00525 void prjManipMode( void )
00526 {
00527  vglSetItrMode( vglcanvas, VGL_MANIP );
00528 }
00529 
00530 /*========================  prjNavigMode  =========================*/
00531 
00532 void prjNavigMode( void )
00533 {
00534  vglSetItrMode( vglcanvas, VGL_NAVIG );
00535 }
00536 
00537 /*========================  prjZoomMode  ==========================*/
00538 
00539 void prjZoomMode( void )
00540 {
00541  vglSetItrMode( vglcanvas, VGL_SINGLE_ZOOM );
00542 }
00543 

Generated on Tue Nov 8 10:57:59 2005 for Trab3 by doxygen1.2.18