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


/** 3DGPL *************************************************\ 
 * Sample application:                                    * 
 *  Draws a landscape.                                    * 
 *                                                        * 
 * (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=90; 
int zz=11,xx=11; 
 
struct application                          /* scene */ 
{ 
 struct M_surface_object *obj; 
 int no; 
 struct M_light **lights; 
#if defined(_CI_) 
 struct CL_palette *p; 
#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+=5; break; 
  case HW_KEY_ARROW_LEFT:  gam-=5; break; 
  case HW_KEY_ARROW_UP:    bet+=5; break; 
  case HW_KEY_ARROW_DOWN:  bet-=5; break; 
  case 'X': case 'x':      zz++; break; 
  case 'S': case 's':      zz--; break; 
  case 'D': case 'd':      xx++; break; 
  case 'C': case 'c':      xx--; 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()                             /* rendering loop */ 
{ 
#if defined(_CI_) 
 G_clear(0,0); 
#endif 
#if defined(_RGB_) 
 G_clear(0,0,0,0); 
#endif 
 
 M_set_camera(alp,bet,gam,0,z,0,8); 
 M_shade_surface_object(app->obj,app->no,app->lights); 
 M_render_surface_object(app->obj,xx,zz); 
#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,"surface.dat"); 
 app=D_data(path); 
#if defined(_CI_) 
 CL_init_colour(app->p); 
#endif 
#if defined(_RGB_) 
 CL_init_colour(); 
#endif 
 T_init_math(); 
 M_init_rendering(M_TEXTURED); 
 M_init_surface_object(app->obj); 
 G_init_graphics(); 
 
 HW_init_screen(display,"3Dgpl"); 
 HW_init_event_loop(app_main,app_handler); 
 HW_close_screen(); 
 
 return(1); 
} 
 
/**********************************************************/