diff --git a/spincube/Makefile b/spincube/Makefile new file mode 100644 index 0000000..a2f2c6a --- /dev/null +++ b/spincube/Makefile @@ -0,0 +1,16 @@ + +CFLAGS := -Wall +LDFLAGS := -lglut -lGL -lGLU -lXmu -lXext -lXi -lX11 -lm +TARGET := cube +OBJS := cube.o + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +%.o: %.c + $(CC) -c -o $@ $< $(CFLAGS) + +clean: + -rm -f *.o *~ $(TARGET) diff --git a/spincube/cube.c b/spincube/cube.c new file mode 100644 index 0000000..eaa280f --- /dev/null +++ b/spincube/cube.c @@ -0,0 +1,76 @@ +#include +#include +#include + +float r = 0.0; + +void init(void) +{ + glClearColor (0.0, 0.0, 0.0, 0.0); + glShadeModel (GL_FLAT); +} + +void idle(void) +{ + r += 0.2; + glutPostRedisplay(); +} + +void drawcubes(int level, double size) +{ + glutWireCube(size); + if (!level) + return; + double a = 0.0; + int i; + for (i = 0; i < 4; i++) + { + glPushMatrix(); + glRotatef(a, 0.0, 1.0, 0.0); + glTranslatef(size * 0.375, size * 0.625, size * 0.375); + glRotatef(r, 0.0, 1.0, 0.0); + drawcubes(level - 1, size * 0.25); + glPopMatrix(); + a += 90.0; + } +} + +void display(void) +{ + glClear (GL_COLOR_BUFFER_BIT); + glColor3f (1.0, 1.0, 1.0); + glLoadIdentity (); /* clear the matrix */ + /* viewing transformation */ + glTranslatef(0.0, -1.0, -5.0); + glRotatef(40.0, 1.0, 0.0, 0.0); + glRotatef(r, 0.0, 1.0, 0.0); + + drawcubes(4, 2.0); + + glFlush (); + glutSwapBuffers(); +} + +void reshape (int w, int h) +{ + glViewport (0, 0, (GLsizei) w, (GLsizei) h); + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + gluPerspective(60.0, 4.0/3.0, 1.5, 20.0); + glMatrixMode (GL_MODELVIEW); +} + +int main(int argc, char** argv) +{ + glutInit(&argc, argv); + glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); + glutInitWindowSize (800, 600); + glutInitWindowPosition (-1, -1); + glutCreateWindow (argv[0]); + init (); + glutDisplayFunc(display); + glutReshapeFunc(reshape); + glutIdleFunc(idle); + glutMainLoop(); + return 0; +}