def main(name, args):
    ''' Creates the main window, initializes the OpenGL
        environment, and draws the triangles
    '''
    win = window.Window(WINDOW_WIDTH, WINDOW_HEIGHT)
    win._keys = set([])

    triangles = load_triangle_file(name, args)
    win._triangles = triangles

    @win.event
    def on_key_press(key, modifier):
        win._keys.add(key)

    @win.event
    def on_key_release(key, modifier):
        if key in win._keys:
            win._keys.remove(key)

    @win.event
    def on_draw():
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        # Sort the triangles first by the furthest Z value
        def sort_by_z(tri1, tri2):
            min_tri1 = min(tri1.v0.z, tri1.v1.z, tri1.v2.z)
            min_tri2 = min(tri2.v0.z, tri2.v1.z, tri2.v2.z)
            return [1, -1][min_tri1 < min_tri2]
        for tri in sorted(win._triangles, sort_by_z):
            draw_triangle(win, tri)

    def execute_transforms(dt):
        transforms = [lambda t: t]
        if key.LEFT in win._keys:
            transforms.append(lambda t: t.rotate_y(-3))
        elif key.RIGHT in win._keys:
            transforms.append(lambda t: t.rotate_y(3))

        if key.UP in win._keys:
            transforms.append(lambda t: t.rotate_x(-3))
        elif key.DOWN in win._keys:
            transforms.append(lambda t: t.rotate_x(3))

        if key.PLUS in win._keys:
            transforms.append(lambda t: t.scale(1.1))
        elif key.MINUS in win._keys:
            transforms.append(lambda t: t.scale(0.9))

        transform = reduce(lambda f, g: lambda t: g(f(t)), transforms)
        win._triangles = map(transform, win._triangles)

    pyglet.clock.schedule(execute_transforms)
    pyglet.app.run()
def main(name, args):
    ''' Creates the main window, initializes the OpenGL
        environment, and draws the triangles
    '''
    win = window.Window(WINDOW_WIDTH, WINDOW_HEIGHT)
    win._keys = set([])

    triangles = load_triangle_file(name, args)
    win._triangles = triangles

    # Set up wireframe mode
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

    @win.event
    def on_key_press(key, modifier):
        win._keys.add(key)

    @win.event
    def on_key_release(key, modifier):
        if key in win._keys:
            win._keys.remove(key)

    @win.event
    def on_draw():
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        for tri in win._triangles:
            draw_triangle(win, tri)

    def execute_transforms(dt):
        transforms = [lambda t: t]
        if key.LEFT in win._keys:
            transforms.append(lambda t: t.rotate_y(-3))
        elif key.RIGHT in win._keys:
            transforms.append(lambda t: t.rotate_y(3))

        if key.UP in win._keys:
            transforms.append(lambda t: t.rotate_x(-3))
        elif key.DOWN in win._keys:
            transforms.append(lambda t: t.rotate_x(3))

        if key.PLUS in win._keys:
            transforms.append(lambda t: t.scale(1.1))
        elif key.MINUS in win._keys:
            transforms.append(lambda t: t.scale(0.9))

        transform = reduce(lambda f, g: lambda t: g(f(t)), transforms)
        win._triangles = map(transform, win._triangles)

    pyglet.clock.schedule(execute_transforms)
    pyglet.app.run()
def main(name, args):
    ''' Creates the main window, initializes the OpenGL
        environment, and draws the triangles
    '''
    win = window.Window(WINDOW_WIDTH, WINDOW_HEIGHT)
    # Initialize the opengl camera
    glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(WINDOW_WIDTH / -2, WINDOW_WIDTH / 2,
            WINDOW_HEIGHT / -2, WINDOW_HEIGHT / 2,
            WINDOW_WIDTH / -2, WINDOW_HEIGHT / 2)
    glMatrixMode(GL_MODELVIEW)
    glClear(GL_COLOR_BUFFER_BIT)
    glLoadIdentity()

    triangles = load_triangle_file(name, args)
    valid_triangles = [tri for tri in triangles if tri.is_ccw]

    for tri in valid_triangles:
        draw_triangle(tri)

    pyglet.app.run()