Minggu, 21 Juni 2009

Jam-jam-an

Iseng-iseng ngoprek-ngoprek coding Open GL dari pak Joko yang didownload dan dimodif dari NeHe, tentang buat jam dan juga ditambah sama hari dan bulan. Penunjuk hari sama bulan juga pakai jarum. He..he..he.. Sebenarnya ini tugas mata kuliah komputer grafik. Klo ada mahasiswanya pa Joko yang nemu yah tinggal dimodif doang kan.
Nih screenshotnya.



Merah ==> Detik
Hijau ==> Menit
Biru ==> Jam
Kuning ==> Hari
Ungu ==> Bulan

Ini kodenya
//
// This code was created by Jeff Molofee '99 (ported to Linux/GLUT by Richard Campbell '99)
//
// If you've found this code useful, please let me know.
//
// Visit me at www.demonews.com/hosted/nehe
// (email Richard Campbell at ulmont@bellsouth.net)
//
#include // Header File For The GLUT Library
#include // Header File For The OpenGL32 Library
#include // Header File For The GLu32 Library
#include // Header File For sleeping.
#include

/* ASCII code for the escape key. */
#define ESCAPE 27
int sh, mh, hh;
float s, m, h, d, mo;
time_t rt;
struct tm * ti;

/* The number of our GLUT window */
int window;

/* rotation angle for the hands. */
float rts = 0.0f;
float rtm = 0.0f;
float rth = 0.0f;
float rtd = 0.0f;
float rtmo = 0.0f;




/* A general OpenGL initialization function. Sets all of the initial parameters. */
void InitGL(int Width, int Height) // We call this right after our OpenGL window is created.
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // This Will Clear The Background Color To Black
glClearDepth(1.0); // Enables Clearing Of The Depth Buffer
glDepthFunc(GL_LESS); // The Type Of Depth Test To Do
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading

glMatrixMode(GL_PROJECTION);
glLoadIdentity(); // Reset The Projection Matrix

gluPerspective(0.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window

glMatrixMode(GL_MODELVIEW);
}

/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */
void ReSizeGLScene(int Width, int Height)
{
if (Height==0) // Prevent A Divide By Zero If The Window Is Too Small
Height=1;

glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
}

/* The main drawing function. */
void DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();
glTranslatef(-40.0f,0.0f,-90.0f);
glRotatef(rts,0.0f,0.0f,1.0f);
glBegin(GL_POLYGON);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f, 15.0f, 2.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,0.5f, 2.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(1.0f,0.5f, 2.0f);
glEnd();

glLoadIdentity();
glTranslatef(-20.0f,0.0f,-90.0f);
glRotatef(rtm,0.0f,0.0f,1.0f);
glBegin(GL_POLYGON);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 0.0f, 10.0f, 1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 2.0f,-2.0f, 1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-2.0f,-2.0f, 1.0f);
glEnd();

glLoadIdentity();
glTranslatef(0.0f,0.0f,-90.0f);
glRotatef(rth,0.0f,0.0f,1.0f);
glBegin(GL_POLYGON);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 0.0f, 5.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 2.0f,-2.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-3.0f,-3.0f, 0.0f);
glEnd();

glLoadIdentity();
glTranslatef(20.0f,0.0f,-90.0f);
glRotatef(rtd,0.0f,0.0f,1.0f);
glBegin(GL_POLYGON);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(0.0f, 15.0f, 2.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(-1.0f,0.5f, 2.0f);
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(1.0f,0.5f, 2.0f);
glEnd();

glLoadIdentity();
glTranslatef(40.0f,0.0f,-90.0f);
glRotatef(rtmo,0.0f,0.0f,1.0f);
glBegin(GL_POLYGON);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(0.0f, 15.0f, 2.0f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(-1.0f,0.5f, 2.0f);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(1.0f,0.5f, 2.0f);
glEnd();

time(&rt);
ti = localtime(&rt);
if (sh != ti->tm_sec)
{
s = ti->tm_sec;
rts = -6.0f*s;
m = ti->tm_min;
rtm = -6.0f*m;
h = ti->tm_hour;
rth = -30.0f*h+-30*m/60;
d = ti->tm_mday;
rtd = -(360.0f/7.0f)*d;
mo = ti->tm_mon;
rtmo = -30.0f*mo;
}
sh = ti->tm_sec;





// swap the buffers to display, since double buffering is used.
glutSwapBuffers();
}

/* The function called whenever a key is pressed. */
void keyPressed(unsigned char key, int x, int y)
{
/* sleep to avoid thrashing this procedure */
usleep(100);

/* If escape is pressed, kill everything. */
if (key == ESCAPE)
{
/* shut down our window */
glutDestroyWindow(window);

/* exit the program...normal termination. */
return 0;
}
}

int main(int argc, char **argv)
{
/* Initialize GLUT state - glut will take any command line arguments that pertain to it or
X Windows - look at its documentation at http://reality.sgi.com/mjk/spec3/spec3.html */
glutInit(&argc, argv);

/* Select type of Display mode:
Double buffer
RGBA color
Alpha components supported
Depth buffer */
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH);

/* get a 640 x 480 window */
glutInitWindowSize(1024, 748);

/* the window starts at the upper left corner of the screen */
glutInitWindowPosition(0, 0);

/* Open a window */
window = glutCreateWindow("Hasil Modifikasi Jam");

/* Register the function to do all our OpenGL drawing. */
glutDisplayFunc(&DrawGLScene);

/* Go fullscreen. This is as soon as possible. */
glutFullScreen();

/* Even if there are no events, redraw our gl scene. */
glutIdleFunc(&DrawGLScene);

/* Register the function called when our window is resized. */
glutReshapeFunc(&ReSizeGLScene);

/* Register the function called when the keyboard is pressed. */
glutKeyboardFunc(&keyPressed);

/* Initialize our window. */
InitGL(1024, 748);

/* Start Event Processing Engine */
glutMainLoop();

return 1;
}

Tidak ada komentar: