00001
00002
00003
00004
00005
00006
00007 #define _PRJ_C
00008
00043
00044
00045
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
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
00118
00119
00120
00125 static void prjResetLocalParams( void )
00126 {
00127 max_height = 50.0;
00128 sel_prm = NULL;
00129 list_updated = 0;
00130 }
00131
00132
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
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
00172 static int prjDspZbufferCanvas( Ihandle *cv )
00173 {
00174 if( Gzbuffercanvas )
00175 dspZbfModel( Gzbuffercanvas );
00176 return( IUP_DEFAULT );
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 void prjInit( void )
00188 {
00189 }
00190
00191
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
00205
00206 void prjResize( int width, int height )
00207 {
00208 dspInit( );
00209 }
00210
00211
00212
00213 void prjRedisplay( void )
00214 {
00215 glClearColor( 0.75, 0.75, 0.75, 1.0 );
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
00228
00229 void prjInfo( void )
00230 {
00231 IupMessage( " Informacoes do Projeto ", trab_info );
00232 }
00233
00234
00235
00236 void prjHelp( void )
00237 {
00238 dspHelp( );
00239 }
00240
00241
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
00254
00255 prmDeleteList( );
00256 prjResetLocalParams( );
00257
00258
00259
00260 status = prmioInterpret( fd );
00261
00262 if( status )
00263 {
00264
00265
00266
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
00283
00284 void prjZbufferSnapShot( void )
00285 {
00286 Ihandle *Ozbuffercanvas;
00287 int viewport[4];
00288 int width, height;
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
00301
00302 glGetIntegerv( GL_VIEWPORT, viewport );
00303 width = viewport[2] - viewport[0];
00304 height = viewport[3] - viewport[1];
00305
00306
00307
00308 if( ! zbfInit( width, height ) )
00309 return;
00310
00311
00312
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
00321
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
00335
00336 int prjRaster2WorldXY( int x, int y, double *xw, double *yw )
00337 {
00338 double frontx, fronty, frontz;
00339 double backx, backy, backz;
00340 double t;
00341
00342 dspGetPickRay( x, y, &frontx, &fronty, &frontz, &backx, &backy, &backz );
00343
00344 if( frontz == backz )
00345 return( 0 );
00346
00347
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
00361
00362 int prjSelectPrm( double x, double y )
00363 {
00364 Prm *prm;
00365 int status = 0;
00366
00367
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
00380
00381 prjBuildDisplayList( );
00382
00383 return( status );
00384 }
00385
00386
00387
00388 void prjSetHeightFac( double fac )
00389 {
00390 if( (prmFirst( ) == NULL) || (sel_prm == NULL) )
00391 return;
00392
00393
00394
00395 if( fac < 0.01 )
00396 fac = 0.0;
00397
00398 if( fac > 0.99 )
00399 fac = 1.0;
00400
00401
00402
00403
00404 prmSetHeight( sel_prm, max_height * fac );
00405
00406
00407
00408 prjBuildDisplayList( );
00409 vglRedraw(vglcanvas);
00410 }
00411
00412
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
00427
00428 void prjResetView( void )
00429 {
00430 vglReset( vglcanvas );
00431 vglRedraw( vglcanvas );
00432 }
00433
00434
00435
00436 void prjFit( void )
00437 {
00438 vglReset( vglcanvas );
00439 vglRedraw( vglcanvas );
00440 }
00441
00442
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
00456
00457 void prjOrtho( void )
00458 {
00459 vglReset( vglcanvas );
00460 vglSetOrtho( vglcanvas, 1 );
00461 vglRedraw( vglcanvas );
00462 }
00463
00464
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
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
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
00498
00499 void prjManipMode( void )
00500 {
00501 vglSetItrMode( vglcanvas, VGL_MANIP );
00502 }
00503
00504
00505
00506 void prjNavigMode( void )
00507 {
00508 vglSetItrMode( vglcanvas, VGL_NAVIG );
00509 }
00510
00511
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
00524
00525 void prjManipMode( void )
00526 {
00527 vglSetItrMode( vglcanvas, VGL_MANIP );
00528 }
00529
00530
00531
00532 void prjNavigMode( void )
00533 {
00534 vglSetItrMode( vglcanvas, VGL_NAVIG );
00535 }
00536
00537
00538
00539 void prjZoomMode( void )
00540 {
00541 vglSetItrMode( vglcanvas, VGL_SINGLE_ZOOM );
00542 }
00543