from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
import os
import threading
import math
 
ESCAPE = '\033'
 
window = 0

rotacija = 0.0
 
DIRECTION = 1
 
 
def InitGL(Width, Height): 
        glClearColor(0.0, 0.0, 0.0, 0.0)
        glClearDepth(1.0) 
        glDepthFunc(GL_LESS)
        glEnable(GL_DEPTH_TEST)
        glShadeModel(GL_SMOOTH)  
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
        glMatrixMode(GL_MODELVIEW)

        glLight(GL_LIGHT0, GL_POSITION,  (5, 5, 5, 1)) # point light from the left, top, front
        glLightfv(GL_LIGHT0, GL_AMBIENT, (0, 0, 0, 1))
        glLightfv(GL_LIGHT0, GL_DIFFUSE, (1, 1, 1, 1))
 
def keyPressed(*args):
        if args[0] == ESCAPE:
                sys.exit()
 
def valjak():
        inc = math.pi / 50
        v_rad = 0.5
        v_h = 0.5

        glBegin(GL_TRIANGLE_FAN)
        glColor3f(0.0,0.3,0.5)

        glNormal3f(0,0,1)
        glVertex3f( 0.0, 0.0,v_h)
        for i in range (0,102):
                fi = i * inc
                glNormal3f(0,0,1)
                glVertex3f(v_rad*math.cos(fi), v_rad*math.sin(fi), v_h)
        glEnd()

        glBegin(GL_TRIANGLE_FAN)
        glColor3f(0.0,0.3,0.5)

        glNormal3f(0,0,-1)
        glVertex3f( 0.0, 0.0,-v_h)
        for i in range (0,102):
                fi = i * inc
                glNormal3f(0,0,-1)
                glVertex3f(v_rad*math.cos(fi), v_rad*math.sin(fi), -v_h)
        glEnd()

        glBegin(GL_TRIANGLE_STRIP)
        glColor3f(0.0,0.3,0.5)
        for i in range (-2,100):
                fi = i * inc
                glNormal3f(math.cos(fi), math.sin(fi), 0)
                glVertex3f(v_rad*math.cos(fi), v_rad*math.sin(fi), -v_h)
                glNormal3f(math.cos(fi), math.sin(fi), 0)
                glVertex3f(v_rad*math.cos(fi), v_rad*math.sin(fi), v_h)
        glEnd()

def stozac():
        inc = math.pi / 50
        s_rad = 0.8
        s_h = 1.5

        glBegin(GL_TRIANGLE_FAN)
        glColor3f(0.0,0.6,1.0)

        glNormal3f(0,0,1)
        glVertex3f( 0.0, 0.0,s_h)
        for i in range (0,102):
                fi = i * inc
                glNormal3f(math.cos(fi), math.sin(fi),0)
                glVertex3f(s_rad*math.cos(fi), s_rad*math.sin(fi), 0)
        glEnd()

        glBegin(GL_TRIANGLE_FAN)
        glColor3f(0.0,0.6,1.0)

        glNormal3f(0,0,-1)
        glVertex3f( 0.0, 0.0, 0.0)
        for i in range (0,102):
                fi = i * inc
                glNormal3f(math.cos(fi), math.sin(fi),0)
                glVertex3f(s_rad*math.cos(fi), s_rad*math.sin(fi), 0)
        glEnd()

def kuglaV():
        inc = math.pi / 50
        k_rad = 0.2

        glBegin(GL_TRIANGLES)
        glColor3f(0.0,0.6,1.0)

        for i in range (0,50):
                for j in range (0,50):
                        fi = i * inc
                        theta = j * inc

                        x = math.cos(fi) * math.sin(theta)
                        y = math.sin(fi) * math.sin(theta)
                        z = math.cos(theta)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi + inc) * math.sin(theta + inc)
                        y = math.sin(fi + inc) * math.sin(theta + inc)
                        z = math.cos(theta + inc)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi + inc) * math.sin(theta)
                        y = math.sin(fi + inc) * math.sin(theta)
                        z = math.cos(theta)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi + inc) * math.sin(theta + inc)
                        y = math.sin(fi + inc) * math.sin(theta + inc)
                        z = math.cos(theta + inc)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi) * math.sin(theta)
                        y = math.sin(fi) * math.sin(theta)
                        z = math.cos(theta)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi) * math.sin(theta + inc)
                        y = math.sin(fi) * math.sin(theta + inc)
                        z = math.cos(theta + inc)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)
        glEnd()

def kuglaU():
        inc = math.pi / 50
        k_rad = 0.199

        glBegin(GL_TRIANGLES)
        glColor3f(0.3,1.0, 0.2)

        for i in range (0,50):
                for j in range (0,50):
                        fi = i * inc
                        theta = j * inc

                        x = math.cos(fi + inc) * math.sin(theta + inc)
                        y = math.sin(fi + inc) * math.sin(theta + inc)
                        z = math.cos(theta + inc)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi) * math.sin(theta)
                        y = math.sin(fi) * math.sin(theta)
                        z = math.cos(theta)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi + inc) * math.sin(theta)
                        y = math.sin(fi + inc) * math.sin(theta)
                        z = math.cos(theta)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi) * math.sin(theta)
                        y = math.sin(fi) * math.sin(theta)
                        z = math.cos(theta)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi + inc) * math.sin(theta + inc)
                        y = math.sin(fi + inc) * math.sin(theta + inc)
                        z = math.cos(theta + inc)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)

                        x = math.cos(fi) * math.sin(theta + inc)
                        y = math.sin(fi) * math.sin(theta + inc)
                        z = math.cos(theta + inc)
                        glNormal3f(x, y, z)
                        glVertex3f(k_rad * x, k_rad * y, k_rad * z)
        glEnd()

def plane():
        size = 2

        glBegin(GL_TRIANGLES)
        glColor3f(0.5,0.5,0.5)

        glNormal3f(0, 0, 1)
        glVertex3f(-size, size, 0)
        glNormal3f(0, 0, 1)
        glVertex3f(-size, -size, 0)
        glNormal3f(0, 0, 1)
        glVertex3f(size, size, 0)

        glNormal3f(0, 0, 1)
        glVertex3f(size, size, 0)
        glNormal3f(0, 0, 1)
        glVertex3f(-size, -size, 0)
        glNormal3f(0, 0, 1)
        glVertex3f(size, -size, 0)
        glEnd()

def kugla():
        kuglaV()
        kuglaU()

def reset():
        glLoadIdentity()
        glTranslatef(0.0,-1.0,-6.0)
        glRotatef(-85,1.0,0.0,0.0)
        glRotatef(30,0.0,0.0,1.0)

def DrawGLScene():
        global rotacija
        global DIRECTION

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glEnable(GL_LIGHTING)
        glEnable(GL_LIGHT0)
        glEnable(GL_COLOR_MATERIAL)
        glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE )
 
        reset()

        plane()
        stozac()
        glScalef(0.5,0.5,0.55)
        glTranslatef(0.0,0.0,2.0)
        valjak()

        reset()
        glRotatef(0 + rotacija,0.0,0.0,1.0)
        glTranslatef(0.0,-0.9,1.2)
        glRotatef(90,1.0,0.0,0.0)
        glScalef(0.15,0.15,1.5)
        valjak()

        reset()
        glRotatef(-120 + rotacija,0.0,0.0,1.0)
        glTranslatef(0.0,-0.9,1.2)
        glRotatef(90,1.0,0.0,0.0)
        glScalef(0.15,0.15,1.5)
        valjak()

        reset()
        glRotatef(-240 + rotacija,0.0,0.0,1.0)
        glTranslatef(0.0,-0.9,1.2)
        glRotatef(90,1.0,0.0,0.0)
        glScalef(0.15,0.15,1.5)
        valjak()

        reset()
        glRotatef(0 + rotacija,0.0,0.0,1.0)
        glTranslatef(-0.05,-1.92,1.2)
        glRotatef(90,0.0,0.0,-1.0)
        glScalef(1.5,1.5,1.5)
        kugla()

        reset()
        glRotatef(-120 + rotacija,0.0,0.0,1.0)
        glTranslatef(-0.05,-1.92,1.2)
        glRotatef(90,0.0,0.0,-1.0)
        glScalef(1.5,1.5,1.5)
        kugla()

        reset()
        glRotatef(-240 + rotacija,0.0,0.0,1.0)
        glTranslatef(-0.05,-1.92,1.2)
        glRotatef(90,0.0,0.0,-1.0)
        glScalef(1.5,1.5,1.5)
        kugla()
 
        rotacija = rotacija - 5

        glDisable(GL_LIGHT0)
        glDisable(GL_LIGHTING)
        glDisable(GL_COLOR_MATERIAL)
 
        glutSwapBuffers()
 
def main():
 
        global window
 
        glutInit(sys.argv)
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
        glutInitWindowSize(1200,800)
        glutInitWindowPosition(200,200)
        window = glutCreateWindow('Vjetromjer')
 
        glutDisplayFunc(DrawGLScene)
        glutIdleFunc(DrawGLScene)
        glutKeyboardFunc(keyPressed)
        InitGL(640, 480)
        glutMainLoop()
 
if __name__ == "__main__":
        main() 