def init_cv(self):
     self.capture    = cvCaptureFromCAM(0)
     self.frame      = cvQueryFrame(self.capture)
     size            = cvSize(self.frame.width, self.frame.height)
     self.copy       = cvCreateImage(size, 8, 3)
     self.identifier = DecalIdentifier()
class AugmentedReality:
    def __init__(self):
        self.init_glut()
        self.init_cv()
        self.init_models()
        self.decals = []

    def init_glut(self):
        glutInit(sys.argv)
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
        glutInitWindowSize(640, 480)
        glutCreateWindow('Augmented Reality')

        glClearColor(0.0, 0.0, 0.0, 1.0)
        glShadeModel(GL_SMOOTH)
        glEnable(GL_DEPTH_TEST)
        glEnable(GL_TEXTURE_2D)
        glEnable(GL_COLOR_MATERIAL)
        glutReshapeFunc(self.on_reshape)
        glutDisplayFunc(self.on_display)
        glutKeyboardFunc(self.on_key)
        glutIdleFunc(self.on_idle)

        glLightfv(GL_LIGHT1, GL_AMBIENT,  [0.5, 0.5, 0.5, 1.0])
        glLightfv(GL_LIGHT1, GL_DIFFUSE,  [1.0, 1.0, 1.0, 1.0])
        glLightfv(GL_LIGHT1, GL_POSITION, [5.0, 3.0, -5.0, 1.0])
        glEnable(GL_LIGHT1)
        glEnable(GL_LIGHTING)

        self.frame_texture = glGenTextures(1)
        glBindTexture(GL_TEXTURE_2D, self.frame_texture);
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)

    def init_cv(self):
        self.capture    = cvCaptureFromCAM(0)
        self.frame      = cvQueryFrame(self.capture)
        size            = cvSize(self.frame.width, self.frame.height)
        self.copy       = cvCreateImage(size, 8, 3)
        self.identifier = DecalIdentifier()

    def init_models(self):
        self.base, self.lid = glGenLists(1), glGenLists(1)

        glNewList(self.base, GL_COMPILE)
        draw_body()
        glEndList()

        glNewList(self.lid, GL_COMPILE)
        draw_lid()
        glEndList()

    def on_reshape(self, w, h):
        w, h = 640, 480

        glViewport(0, 0, w, h)
        self.width  = w
        self.height = h

        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(0, self.width, self.height, 0, -1, 1)

        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()

    def on_display(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glBindTexture(GL_TEXTURE_2D, self.frame_texture)
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 640, 480, 0, GL_BGR, GL_UNSIGNED_BYTE, self.copy.data_as_string());
        glBegin(GL_POLYGON);
        glTexCoord2f(0.0, 0.0); glVertex2f(       0.0,         0.0)
        glTexCoord2f(1.0, 0.0); glVertex2f(self.width,         0.0)
        glTexCoord2f(1.0, 1.0); glVertex2f(self.width, self.height)
        glTexCoord2f(0.0, 1.0); glVertex2f(       0.0, self.height)
        glEnd();
        glBindTexture(GL_TEXTURE_2D, 0)

        for modelview, value in self.decals:
            glClear(GL_DEPTH_BUFFER_BIT)

            glMatrixMode(GL_PROJECTION)
            glPushMatrix()
            glLoadIdentity()
            gluPerspective(45.0, self.width/float(self.height), 0.1, 100.0)

            glMatrixMode(GL_MODELVIEW)
            glPushMatrix()
            glLoadIdentity()
            glScalef(1.0, -1.0, -1.0)
            glMultMatrixf(modelview)
            glTranslatef(0.5, 0.5, 0.0)

            if value == 0:   # [W,W,W]
                lid_angle = -abs(110 - ((time.time() * 100) % 220))
                glColor3f(0.1, 0.1, 0.1)
                glScalef(0.2, 0.2, 0.2)
                glTranslatef(0.0, 4.25, 0.0)
                glCallList(self.base)
                glRotatef(lid_angle, 1, 0, 0)
                glCallList(self.lid)
            elif value == 4: # [W,B,W]
                glColor3f(0.1, 1.0, 0.1)
                glTranslatef(0.0, 0.0, 0.5)
                glutSolidCube(1.0)
            elif value == 21: # [B,B,B]
                glColor3f(0.1, 0.1, 1.0)
                glTranslatef(0.0, 0.0, 0.1)
                glutSolidTorus(0.2, 0.5, 20, 100)
            elif value == 63: # [R,R,R]
                glColor3f(0.8, 0.8, 0.1)
                glTranslatef(0.0, 0.0, 0.25)
                glRotatef(90, 1.0, 0.0, 0.0)
                glutSolidTeapot(0.5)
            elif value == 53: # [R,B,B]
                glColor3f(0.1, 0.8, 0.8)
                glTranslatef(0.0, 0.0, 0.5)
                glutSolidSphere(0.5, 50, 50)
            else:
                print "UNKNOWN DECAL:", value

            glMatrixMode(GL_PROJECTION)
            glPopMatrix()

            glMatrixMode(GL_MODELVIEW)
            glPopMatrix()

        glutSwapBuffers()

    def on_key(self, k, *args):
        if k in ['q', chr(27)]:
            sys.exit(0)

    def on_idle(self):
        self.frame = cvQueryFrame(self.capture)
        cvFlip(self.frame, self.copy, 1)

        self.decals = list(self.identifier.get_decals(self.copy))

        glutPostRedisplay()

    def main(self):
        glutMainLoop()