home *** CD-ROM | disk | FTP | other *** search
/ 3D Madness! Companion CD / 3DMADNESS.iso / dosshow / zero / view3d / view3d.c < prev    next >
C/C++ Source or Header  |  1993-03-04  |  18KB  |  561 lines

  1. /*-------------------------------------------------------------------------*
  2.  * VIEW3D.C : general viewer for zero objects
  3.  *
  4.  * (c) 1993 ZeRO Computing, all rights reserved
  5.  *
  6.  *-------------------------------------------------------------------------*/
  7.  
  8.  
  9. #define  RHO_MIN_LIM    1
  10. #define  RHO_MAX_LIM    179
  11.  
  12. /*--- Include files ---*/
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <math.h>
  16. #include <time.h>
  17. #include <string.h>
  18. #include <conio.h>
  19.  
  20. /*--- ZeRO 3DLIB include file ---*/
  21. #include "zbnt.h"
  22. #include "ms_key.h"
  23.  
  24. extern   int   trg2scheda;
  25.  
  26. /*-------------------------------------------------------------------------*
  27.  * main : view code
  28.  *-------------------------------------------------------------------------*/
  29. void     main( int argc, char *argv[] )
  30. {
  31. MODEL3D_LIST   *list;
  32. H_VPORT        vp3d, vp2d1, vp2d2;
  33. H_OBJ3D        *hObj3D;
  34. H_OBJ2D        hHelp;
  35. H_MDL2D        hModelFrame,hMHelp;
  36. OBJ_INFO       obj;
  37. H_FONT         hFont;
  38. GRAPHADAPTER   graph;
  39. KBDCODE        keyboard;
  40.  
  41. float    px, py, pz, sq;
  42. float    theta, rho, radius, min_radius, step;
  43. float    max_x, min_x, max_y, min_y, max_z, min_z, centre_x, centre_y, centre_z;
  44. float    par_red = 0.5, par_green = 0.5, par_blue=0.5, ambient = 0.2;
  45. double   seconds, tri_per_second, frames_per_second, drawn_per_second;
  46. char     light, rotatex, rotatey, rotatez, first, info;
  47. char     str[80], end;
  48. short    dx, dy, x, y, s1, mouse;
  49. int      models, j, num_triangles = 0, frames = 0, tot_drawn = 0, tot_tri = 0, off = 5;
  50. int      bit = 4;
  51. int      help , help_x = 0, help_y = 0;
  52. clock_t  start, elapsed_time;
  53.  
  54.  
  55. mouse = InitMouse();
  56. DisableMouseCursor();
  57. DefineMouseSensitivity( 8, 16 );
  58.  
  59. if ( argc == 1 )
  60.    {
  61.    printf("usage: view3D object_filename [ palette_filename ] \n");
  62.    exit(-1);
  63.    }
  64.  
  65.  
  66. /**********************************************/
  67. /* Load 3D & 2D WORLD FILES and PALETTE FILES */
  68. /**********************************************/
  69.  
  70. printf("Loading Palette...\n");
  71.  
  72. if ( argc == 3 )
  73.    LoadPalette( argv[ 2 ] );
  74. else
  75.    LoadPalette( "vga.pal" );
  76.  
  77. printf("Loading Objects...\n");
  78.  
  79. if ( ! ( LoadWorld( argv[ 1 ] ) ) )
  80.    exit ( -1 );
  81.  
  82. if ( ! ( LoadWorld( "data2d.wrd") ) )
  83.    exit ( -1 );
  84.  
  85. printf("Loading Font...\n");
  86. if ( ( hFont = LoadFont( "font.fnt") ) == NULL )
  87.    exit( -1 );
  88.  
  89.  
  90.  
  91. /***************************************************/
  92. /* Get List of 3D Models Loaded                    */
  93. /* Creates array of Handle for Initialized Objects.*/
  94. /* Get Handle for 2D Objects                       */
  95. /***************************************************/
  96.  
  97. models = Get3DModelList( &list );
  98.  
  99. if ( ( hObj3D = ( H_OBJ3D *) malloc( models * sizeof( H_OBJ3D ) ) ) == NULL )
  100.    {
  101.    printf("Not enough memory for Model List.\n");
  102.    exit(-1);
  103.    }
  104.  
  105. if ( ( hModelFrame = GetModel2DHandle("frame") ) == NULL )
  106.    {
  107.    printf("Error: 2D Model not present\n");
  108.    exit( -1 );
  109.    }
  110.  
  111. if ( ( hMHelp   = GetModel2DHandle("help") ) == NULL )
  112.    {
  113.    printf("Error: 2D Model not present\n");
  114.    exit( -1 );
  115.    }
  116.  
  117.  
  118. /*****************************************/
  119. /* Init Graphics Adapter and Set Palette */
  120. /*****************************************/
  121. InitGraphics( &graph );
  122. SetPalette();
  123.  
  124. /******************************/
  125. /* Sets Frame Rate to Maximum */
  126. /******************************/
  127. SetMaxFrameRate( 0 );
  128.  
  129.  
  130. /****************************************/
  131. /* Creates Viewport:                    */
  132. /* DIRECT_2D  : Title Bar               */
  133. /* MAIN_3D    : Main3D Viewport         */
  134. /* OVERLAY_3D : Overlay for Help Screen */
  135. /****************************************/
  136. vp2d1    = CreateViewport( DIRECT_2D, 0 , 0, 320, 200, 0 );
  137. vp3d     = CreateViewport( MAIN_3D ,  0, 30, 320, 170, 0 );
  138. vp2d2    = CreateViewport( OVERLAY_3D , vp3d );
  139.  
  140. /******************************************************/
  141. /* Draws Frame box in DIRECT_2D Viewport              */
  142. /******************************************************/
  143. DrawObj2D( vp2d1 , hModelFrame, 0.0 , 0.0 );
  144.  
  145.  
  146. /***************************************************************************/
  147. /* Initializes Help Object in OVERLAY_3D Viewport and hides it immediately */
  148. /***************************************************************************/
  149. if ( ( hHelp   = InitObj2D( vp2d2 , hMHelp , help_x , help_y ) ) == NULL  )
  150.    {
  151.    printf("Error InitObj2D\n");
  152.    exit( -1 );
  153.    }
  154.  
  155. HideObj2D( hHelp );
  156.  
  157.  
  158. /********************************************************/
  159. /* Sets Ambient and Parallel Light for MAIN_3D Viewport */
  160. /********************************************************/
  161. SetAmbientLight( vp3d, ambient, ambient, ambient );
  162. SetParallelSource( vp3d, 0.5, 0.5, 0.5, -1.0, -2.0, -3.0 );
  163.  
  164. min_x = min_y = min_z = 1e06;
  165. max_x = max_y = max_z = -1e06;
  166.  
  167. /************************************************************/
  168. /* Initializes all models into MAIN_3D Viewport.            */
  169. /* Sets Object Shading type to FLAT                         */
  170. /* Calcs max dimension and centers the object on the screen */
  171. /************************************************************/
  172. for ( j = 0 ; j < models ; j++ )
  173.    {
  174.  
  175.    if ( ( hObj3D[j] = InitObj3D( vp3d, list[j].h_mdl3d, 0.0, 0.0, 0.0 ) ) == NULL )
  176.       {
  177.       printf("Mode name not correct.");
  178.       exit(-1);
  179.       }
  180.  
  181.    SetObj3DShadingType( hObj3D[j], FLAT );
  182.  
  183.    GetObj3DInfo( hObj3D[j] , &obj );
  184.    num_triangles += obj.n_triangles;
  185.  
  186.    if ( ( obj.alfa_x + obj.centre_x ) > max_x )
  187.       max_x = ( obj.alfa_x + obj.centre_x );
  188.    if ( ( obj.beta_y + obj.centre_y ) > max_y )
  189.       max_y = ( obj.beta_y + obj.centre_y );
  190.    if ( ( obj.gamma_z + obj.centre_z ) > max_z )
  191.       max_z = ( obj.gamma_z + obj.centre_z );
  192.    if ( ( -obj.alfa_x + obj.centre_x ) < min_x )
  193.       min_x = ( -obj.alfa_x + obj.centre_x );
  194.    if ( ( -obj.beta_y + obj.centre_y ) < min_y )
  195.       min_y = ( -obj.beta_y + obj.centre_y );
  196.    if ( ( -obj.gamma_z + obj.centre_z ) < min_z )
  197.       min_z = ( -obj.gamma_z + obj.centre_z );
  198.  
  199.    }
  200.  
  201. centre_x = ( max_x + min_x ) / 2;
  202. centre_y = ( max_y + min_y ) / 2;
  203. centre_z = ( max_z + min_z ) / 2;
  204.  
  205. for ( j=0 ; j<models; j++)
  206.     TranslateObj3D( hObj3D[j] , -centre_x , -centre_y, -centre_z );
  207.  
  208. min_radius = 3 * max3( ( max_x - min_x ) / 2, ( max_y - min_y ) / 2, ( max_z - min_z ) / 2 );
  209.  
  210. radius = 4 * min_radius;
  211.  
  212. /************************/
  213. /* Sets Viewing Optics  */
  214. /************************/
  215. SetOptics( vp3d , 1.0, 3.0, radius * 300 );
  216.  
  217. /******************/
  218. /* Init Variables */
  219. /******************/
  220. step = radius / 100;
  221. theta = rho = 0.0;
  222. light = first = TRUE;
  223. info = rotatex = rotatey = rotatez = FALSE;
  224.  
  225. start = clock();
  226.  
  227. end = FALSE;
  228. help = FALSE;
  229.  
  230. while ( ! end )
  231.       {
  232.       /***********************************/
  233.       /* Checks MOUSE and KEYBOARD Input */
  234.       /***********************************/
  235.       if ( mouse )
  236.          {
  237.          ReadMouseMotionNumber( &dx, &dy );
  238.          ReadMouseCursorPos( &x, &y, &s1 );
  239.  
  240.          if ( s1 == 0 )
  241.             {
  242.             theta += (float) dx * 0.2;
  243.             rho += (float) dy * 0.2;
  244.             }
  245.          else
  246.             if ( s1 == 2 )
  247.                {
  248.                theta += (float) dx * 0.04;
  249.                rho += (float) dy * 0.04;
  250.                }
  251.             else
  252.                if ( s1 == 1 )
  253.                   {
  254.                   radius += (float) ( dy * ( step / 2.0 ) );
  255.  
  256.                   if ( radius < min_radius )
  257.                      radius = min_radius;
  258.                   }
  259.          }
  260.  
  261.       while ( KeyBoardReady() )
  262.             {
  263.             ReadKeyBoard( &keyboard );
  264.  
  265.             switch ( keyboard.ascii )
  266.                    {
  267.                    case 0:
  268.                    switch ( keyboard.scan )
  269.                         {
  270.                         case 45:
  271.                            end = TRUE;
  272.                            break;
  273.  
  274.                         case 72:  /* up arrow */
  275.                            rho -= 0.5;
  276.                            break;
  277.  
  278.                         case 80:  /* down arrow */
  279.                            rho += 0.5;
  280.                            break;
  281.  
  282.                         case 75:  /* left arrow */
  283.                            theta -= 0.5;
  284.                            break;
  285.  
  286.                         case 77:  /* right arrow */
  287.                            theta += 0.5;
  288.                            break;
  289.  
  290.                         case 141:
  291.                            rho  -= 3.0;
  292.                            break;
  293.  
  294.                         case 145:
  295.                            rho  += 3.0;
  296.                            break;
  297.  
  298.                         case 116:
  299.                            theta += 3.0;
  300.                            break;
  301.  
  302.                         case 115:
  303.                            theta -= 3.0;
  304.                            break;
  305.  
  306.                         case 144:
  307.                            radius -= ( 10 * step);
  308.                            if ( radius < min_radius )
  309.                               radius = min_radius;
  310.                            break;
  311.  
  312.                         case 142:
  313.                            radius += ( 10 * step );
  314.                            break;
  315.  
  316.                         case  59:
  317.                            par_green -= 0.05;
  318.                            if ( par_green < 0.0 )
  319.                               par_green = 0.0;
  320.                            break;
  321.  
  322.                         case  60:
  323.                            par_green += 0.05;
  324.                            if ( par_green > 1.0 )
  325.                               par_green = 1.0;
  326.                            break;
  327.  
  328.                         case 61:
  329.                            ambient -=0.05;
  330.                            if ( ambient< 0.0 )
  331.                               ambient = 0.0;
  332.                            SetAmbientLight( vp3d, ambient, ambient, ambient );
  333.                            break;
  334.  
  335.                         case 62:
  336.                            ambient +=0.05;
  337.                            if ( ambient > 1.0 )
  338.                               ambient = 1.0;
  339.                            SetAmbientLight( vp3d, ambient, ambient, ambient );
  340.                            break;
  341.  
  342.                         case 152:
  343.                            if ( help )
  344.                               {
  345.                               help_y -= 5;
  346.                               if ( help_y < 0 )
  347.                                  help_y = 0;
  348.                               PositionObj2D( hHelp, help_x , help_y  );
  349.                               }
  350.                            break;
  351.  
  352.                         case 160:
  353.                            if ( help )
  354.                               {
  355.                               help_y += 5;
  356.                               if ( help_y > 320 )
  357.                                  help_y = 320;
  358.                               PositionObj2D( hHelp, help_x , help_y  );
  359.                               }
  360.                            break;
  361.  
  362.                         case 155:
  363.                            if ( help )
  364.                               {
  365.                               help_x -= 5;
  366.                               if ( help_x < 0 )
  367.                                  help_x = 0;
  368.                               PositionObj2D( hHelp, help_x , help_y  );
  369.                               }
  370.                            break;
  371.  
  372.                         case 157:
  373.                            if ( help )
  374.                               {
  375.                               help_x += 5;
  376.                               if ( help_x > 320 )
  377.                                  help_x = 320;
  378.                               PositionObj2D( hHelp, help_x , help_y  );
  379.                               }
  380.                            break;
  381.  
  382.                         }
  383.                         break;
  384.  
  385.                    case '+':
  386.                         radius -= step;
  387.                         if ( radius < min_radius )
  388.                            radius = min_radius;
  389.                         break;
  390.  
  391.                    case '-':
  392.                         radius += step;
  393.                         break;
  394.  
  395.                    case '8':
  396.                         rho -= 0.5;
  397.                         break;
  398.  
  399.                    case '2':
  400.                         rho += 0.5;
  401.                         break;
  402.  
  403.                    case '4':
  404.                         theta -= 0.5;
  405.                         break;
  406.  
  407.                    case '6':
  408.                         theta += 0.5;
  409.                         break;
  410.  
  411.                    case 'l':
  412.                    case 'L':
  413.                         light = !light;
  414.                         break;
  415.  
  416.                    case 'h':
  417.                    case 'H':
  418.                         help = !help;
  419.                         if ( help )
  420.                            UnHideObj2D( hHelp );
  421.                         else
  422.                            HideObj2D( hHelp );
  423.                         break;
  424.  
  425.            /**************************************************************/
  426.            /* The red & blue light components work only with 24bit color */
  427.            /**************************************************************/
  428.                    case 'q':
  429.                    case 'Q':
  430.                         par_red -= 0.05;
  431.                         if ( par_red < 0.0 )
  432.                            par_red = 0.0;
  433.                         break;
  434.  
  435.                    case 'w':
  436.                    case 'W':
  437.                         par_red += 0.05;
  438.                         if ( par_red > 1.0 )
  439.                            par_red = 1.0;
  440.                         break;
  441.  
  442.                    case 'z':
  443.                    case 'Z':
  444.                         par_blue -= 0.05;
  445.                         if ( par_blue < 0.0 )
  446.                            par_blue = 0.0;
  447.                         break;
  448.  
  449.                    case 'x':
  450.                    case 'X':
  451.                         par_blue += 0.05;
  452.                         if ( par_blue > 1.0 )
  453.                            par_blue = 1.0;
  454.                         break;
  455.  
  456.                    }
  457.             }
  458.  
  459.       /****************************/
  460.       /* avoids flipping over top */
  461.       /****************************/
  462.       if ( rho < RHO_MIN_LIM )
  463.          rho = RHO_MIN_LIM;
  464.       else
  465.          if (  rho  > RHO_MAX_LIM )
  466.             rho = RHO_MAX_LIM;
  467.  
  468.  
  469.       /*****************************************/
  470.       /* Calculates new Point of View Position */
  471.       /*****************************************/
  472.       pz =  radius * cos ( DEGtoRAD(rho) );
  473.       py =  radius * sin ( DEGtoRAD(rho) ) * cos( DEGtoRAD(theta) );
  474.       px =  radius * sin ( DEGtoRAD(rho) ) * sin( DEGtoRAD(theta) );
  475.  
  476.       sq = sqrt( px * px + py * py + pz * pz );
  477.  
  478.       MovePw( vp3d , px, py, pz, - px / sq , -py / sq , - pz / sq, 0.0 );
  479.  
  480.       /*******************************************/
  481.       /* If Parallel Light is enabled, update it */
  482.       /*******************************************/
  483.       if ( light )
  484.          SetParallelSource( vp3d , par_red,par_green,par_blue, -px, -py, -pz );
  485.  
  486.  
  487.       /*******************/
  488.       /* Draws New Frame */
  489.       /*******************/
  490.       DrawFrame( TRUE );
  491.  
  492.       frames++;
  493.       tot_tri += num_triangles;
  494.       tot_drawn += trg2scheda;
  495.       elapsed_time = clock();
  496.  
  497.       /********************************************/
  498.       /* Draw Information onto DIRECT_2D Viewport */
  499.       /********************************************/
  500.       if ( ( ! ( frames % bit ) ) || ( first ) )
  501.          {
  502.          seconds = ( ( double ) ( elapsed_time - start ) / ( double ) CLK_TCK );
  503.  
  504.          tri_per_second = tot_tri / seconds;
  505.          frames_per_second = frames / seconds;
  506.          drawn_per_second = tot_drawn / seconds;
  507.  
  508.          DrawObj2D( vp2d1 , hModelFrame, 0.0 , 0.0 );
  509.  
  510.          sprintf(str , " *** ZeRO 3D VIEWER v1.2 ***" );
  511.          DrawText( vp2d1 , hFont , str , 10 + off , 2 , 255 , 255, 255 );
  512.  
  513.          sprintf(str , "(c)  1993  ZeRO  Computing  S.a.s.");
  514.          DrawText( vp2d1 , hFont , str , 150 + off, 2 , 255 , 255 , 255 );
  515.  
  516.          sprintf(str , " Trg/sec: %6d", (int) tri_per_second );
  517.          DrawText( vp2d1 , hFont , str , 0 + off, 14 , 255 , 255 , 255 );
  518.  
  519.          sprintf(str , " Frames/sec: %5.2f", frames_per_second );
  520.          DrawText( vp2d1 , hFont , str , 100 + off, 14 , 255 , 255 , 255 );
  521.  
  522.          sprintf(str , " Drawn/sec: %5d", (int) drawn_per_second  );
  523.          DrawText( vp2d1 , hFont , str , 200 + off, 14 , 255 , 255 , 255 );
  524.  
  525.          if ( light )
  526.             DrawText( vp2d1, hFont , "*", 303 + off, 2 , 255 , 255 , 255 );
  527.  
  528.          bit = (int) frames_per_second;
  529.          if ( bit == 0 )
  530.             bit = 1;
  531.  
  532.          tot_tri = 0;
  533.          tot_drawn = 0;
  534.          frames = 0;
  535.  
  536.          start = clock();
  537.          first = FALSE;
  538.          }
  539.       }
  540.  
  541. MyExit(1);
  542.  
  543.  
  544. puts("╔═════════════════════════════════════════════════════════════════════════════╗");
  545. puts("║ For more information about the ZeRO Computing 3D real-time libraries        ║");
  546. puts("║ please contact :                                                            ║");
  547. puts("║                  ZeRO Computing S.a.s.                                      ║");
  548. puts("║                  via T. Cremona, 29                                         ║");
  549. puts("║                  20145 Milano - ITALY                                       ║");
  550. puts("║                  Phone: +39.2.48017946                                      ║");
  551. puts("║                  FAX:   +39.2.58114647                                      ║");
  552. puts("║                  Internet : zero@bench.sublink.ORG                          ║");
  553. puts("║                  BIX      : ppennisi                                        ║");
  554. puts("║                  CIS      : 100022,411                                      ║");
  555. puts("║                  DELPHI   : MSANTOLI                                        ║");
  556. puts("╚═════════════════════════════════════════════════════════════════════════════╝");
  557.  
  558. printf("\n\n");
  559.  
  560. } /*--- end of main ---*/
  561.