In this example, we draw a face using spheres. We use matrices to scale and translate the (same) sphere to different locations.
/********************* Example G3 **********************************************/
#include "EZ.h"
static void event_handle(EZ_Widget *, void *,int,XEvent *); /* event handle */
static void draw(EZ_Widget *canvas); /* repaint func */
static float light_position[] = {0.5, 0.5, 0.0, 1.0}; /* light position */
static float white[] = {1.0,1.0,1.0,1.0};
static float shininess[] = {8.0};
main(int argc, char **argv)
{
EZ_Widget *frame, *canvas;
EZ_Initialize(argc, argv, 1);
frame = EZ_CreateWidget(EZ_WIDGET_FRAME, NULL,
EZ_FILL_MODE, EZ_FILL_BOTH,
0);
canvas = EZ_CreateWidget(EZ_WIDGET_3D_CANVAS, frame,
EZ_WIDTH_HINT, 320,
EZ_HEIGHT_HINT, 320,
EZ_EVENT_HANDLER, event_handle, NULL,
0);
EZ_DisplayWidget(canvas);
/* setup GL modes */
EZ_AutoSelectBackBuffer(); /* select a back buffer */
EZ_RGBMode(); /* select color mode */
EZ_ShadeModel(EZ_SMOOTH); /* select shading model */
EZ_DrawBuffer(EZ_BACK); /* draw into the backbuf*/
EZ_Enable(EZ_CULL_FACE); /* enable backface cull */
EZ_Enable(EZ_DEPTH_TEST); /* enable zbuffer */
EZ_Enable(EZ_LIGHTING); /* enable lighting */
EZ_Enable(EZ_LIGHT0); /* enable one light src */
EZ_Lightfv(EZ_LIGHT0, EZ_POSITION, light_position);
EZ_Materialfv(EZ_FRONT,EZ_SPECULAR,white); /* set material for front face */
EZ_Materialfv(EZ_FRONT,EZ_SHININESS,shininess);
EZ_MatrixMode(EZ_PROJECTION); /* setup a fixed projection matrix */
EZ_LoadIdentity();
EZ_Perspective(45.0, 1.0, 2.0, 30.0); /* a perspective view, ... */
EZ_MatrixMode(EZ_MODELVIEW); /* set matrix mode to model view */
EZ_LoadIdentity();
EZ_LookAt(0.3,0.1,15.0, 0.0,0.0,0.0, /* and set up a look at view */
0.0,1.0, 0.0); /* view up vector */
EZ_EventMainLoop(); /* turn control to EZWGL */
}
static float rotX = 0.0, rotY = 0.0, rotZ = 0.0; /* rotation angles */
static float yellow[] = {0.8, 0.8, 0.0, 0.0}; /* material color */
static float red[] = {0.8, 0.4, 0.3, 0.0}; /* material color */
static void draw(EZ_Widget *canvas)
{
EZ_Clear(EZ_COLOR_BUFFER_BIT | EZ_DEPTH_BUFFER_BIT);
EZ_PushMatrix();
EZ_Rotate(rotX, 1.0, 0.0, 0.0 );
EZ_Rotate(rotY, 0.0, 1.0, 0.0 );
EZ_Rotate(rotZ, 0.0, 0.0, 1.0 );
/* draw a red sphere */
EZ_Materialfv(EZ_FRONT,EZ_DIFFUSE, red);
EZ_Sphere(EZ_SPHERE_TRIANGLE, 4, 0.0,0.0,0.0,3.0);
/* translate to (-1.0, 0.8, 0.8), scale down unformly by 0.2
* and draw a yellow sphere. */
EZ_PushMatrix();
EZ_Materialfv(EZ_FRONT,EZ_DIFFUSE, yellow);
EZ_Translate(-1.0,0.8,2.2);
EZ_Scale(0.2,0.2,0.2);
EZ_Sphere(EZ_SPHERE_TRIANGLE, 4, 0.0,0.0,0.0,3.0);
EZ_PopMatrix();
/* translate to (1.0, 0.8, 0.8), scale down unformly by 0.2
* and draw a yellow sphere */
EZ_PushMatrix();
EZ_Materialfv(EZ_FRONT,EZ_DIFFUSE, yellow);
EZ_Translate(1.0,0.8,2.2);
EZ_Scale(0.2,0.2,0.2);
EZ_Sphere(EZ_SPHERE_TRIANGLE, 4, 0.0,0.0,0.0,3.0);
EZ_PopMatrix();
/* and so on */
EZ_PushMatrix();
EZ_Materialfv(EZ_FRONT,EZ_DIFFUSE, yellow);
EZ_Translate(0.0,-0.1,2.65);
EZ_Scale(0.15,0.35,0.15);
EZ_Sphere(EZ_SPHERE_TRIANGLE, 4, 0.0,0.0,0.0,3.0);
EZ_PopMatrix();
EZ_PushMatrix();
EZ_Materialfv(EZ_FRONT,EZ_DIFFUSE, yellow);
EZ_Translate(0.0,-1.6,2.6);
EZ_Scale(0.4,0.1,0.1);
EZ_Sphere(EZ_SPHERE_TRIANGLE, 4, 0.0,0.0,0.0,3.0);
EZ_PopMatrix();
EZ_PopMatrix();
EZ_SwapBuffers(); /* copy backbuf to front */
}
static void event_handle(EZ_Widget *canvas, void *data, int eventType, XEvent *xev)
{
switch(eventType) {
case EZ_REDRAW:
case EZ_RESIZE:
draw(canvas);
break;
case EZ_KEY_PRESS:
switch(EZ_PressedKey) {
case EZ_DOWN_KEY: rotX += 5.0; draw(canvas); break;
case EZ_UP_KEY: rotX -= 5.0; draw(canvas); break;
case EZ_RIGHT_KEY: rotY += 5.0; draw(canvas); break;
case EZ_LEFT_KEY: rotY -= 5.0; draw(canvas); break;
case EZ_ESCAPE_KEY: EZ_Shutdown(); exit(0); break;
default: break;
}
EZ_GLResetEvents(NULL); /* clear the event queue, too many keypresses */
break;
default:
break;
}
}
/********************* Example G3 **********************************************/