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);
}
/**********************************************************/