www.pudn.com > 3dgprsrc.rar > GROUP.C


/** 3DGPL *************************************************\ 
 * Sample application:                                    * 
 *  Draws a group of polygonal and/or bicubic models.     * 
 *                                                        * 
 * (c) 1995-98 Sergei Savchenko, (savs@cs.mcgill.ca)      * 
\**********************************************************/ 
 
#include <stdio.h> 
#include <string.h> 
#include "../hardware/hardware.h" 
#include "../colour/colour.h" 
#include "../engine/engine.h" 
#include "../graphics/graphics.h" 
#include "../trans/trans.h" 
#include "../data/data.h" 
 
#if defined(_RGB_)                          /* paths to data sets */ 
 #if defined(_32BPP_) 
char path[128]="data/rgb32/"; 
 #endif 
 #if defined(_16BPP_) 
char path[128]="data/rgb16/"; 
 #endif 
 #if defined(_8BPP_) 
char path[128]="data/rgb8/"; 
 #endif 
#endif 
#if defined(_CI_) 
 #if defined(_8BPP_) 
char path[128]="data/ci8/"; 
 #endif 
#endif 
 
unsigned char alp=0,bet=0,gam=0;            /* camera parameters */ 
int x=0,y=0,z=0; 
 
struct application                          /* scene */ 
{ 
 struct M_group *group; 
#if defined(_CI_) 
 struct CL_palette *palette;  
#endif 
#if defined(_RGB_) 
 int *reserved;                             /* NULL for RGB */ 
#endif 
} *app; 
 
/**********************************************************/ 
 
void app_handler(int kk)                    /* event handler */ 
{ 
 switch(kk) 
 { 
  case HW_KEY_ENTER:       HW_close_event_loop(); break; 
  case HW_KEY_ARROW_RIGHT: gam+=2; break; 
  case HW_KEY_ARROW_LEFT:  gam-=2; break; 
  case HW_KEY_ARROW_UP:    bet+=2; break; 
  case HW_KEY_ARROW_DOWN:  bet-=2; break; 
  case 'X': case 'x':      alp+=2; break; 
  case 'S': case 's':      alp-=2; break; 
  case 'A': case 'a':      z-=10;   break; 
  case 'Z': case 'z':      z+=10;   break; 
  case 'W': case 'w':      M_init_rendering(M_WIRE); break; 
  case 'F': case 'f':      M_init_rendering(M_FLAT); break; 
  case 'G': case 'g':      M_init_rendering(M_SHADED); break; 
  case 'T': case 't':      M_init_rendering(M_TEXTURED); break; 
 } 
} 
 
/**********************************************************/ 
 
void app_main(void)                         /* rendering loop */ 
{ 
 int i; 
 
#if defined(_CI_) 
 G_clear(0,0); 
#endif 
#if defined(_RGB_) 
 G_clear(0,0,0,0); 
#endif 
 
 M_set_camera(0,0,0,x,y,z,8); 
 for(i=0;i<app->group->m_no_objects;i++) 
 { 
  app->group->m_orientations[i*4]=alp;      /* rotate the objects */ 
  app->group->m_orientations[i*4+1]=bet;      
  app->group->m_orientations[i*4+2]=gam;      
 } 
 M_shade_group(app->group); 
 M_render_group(app->group,0,0,0); 
 
#if defined(_RGB_) 
 G_text(0,0,"<a><z><s><x><t><f><g><enter-exit>", 
        CL_colour(CL_COLOUR_LEVELS-1,CL_COLOUR_LEVELS-1,CL_COLOUR_LEVELS-1), 
        CL_LIGHT_LEVELS-1,CL_LIGHT_LEVELS-1,CL_LIGHT_LEVELS-1); 
#endif 
#if defined(_CI_) 
 G_text(0,0,"<a><z><s><x><t><f><g><enter-exit>", 
        1,CL_LIGHT_LEVELS-1); 
#endif 
 
 HW_blit(); 
} 
 
/**********************************************************/ 
 
int main(int no, char **o)                  /* initialize, launch the loop */ 
{ 
 char *display; 
 if(no==2) display=o[1]; else display=NULL; 
 
 strcat(path,"group.dat"); 
 app=D_data(path); 
#if defined(_CI_) 
 CL_init_colour(app->palette); 
#endif 
#if defined(_RGB_) 
 CL_init_colour(); 
#endif 
 T_init_math(); 
 M_init_rendering(M_TEXTURED); 
 M_init_group(app->group); 
 G_init_graphics();  
 
 HW_init_screen(display,"3Dgpl"); 
 HW_init_event_loop(app_main,app_handler); 
 HW_close_screen(); 
 
 return(1); 
} 
 
/**********************************************************/