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;
}