from ursina import *
from ursina.models.procedural.plane import Plane


def Cube(bevel=0, subdivisions=(1,1,1), mode='triangle', **kwargs):

    if subdivisions == (1,1,1):
        verts = (
            Vec3(-.5,-.5,-.5), Vec3(.5,-.5,-.5), Vec3(.5,.5,-.5), Vec3(-.5,.5,-.5),
            Vec3(-.5,-.5,.5),  Vec3(.5,-.5,.5),  Vec3(.5,.5,.5), Vec3(-.5,.5,.5)
            )

        tris = (
            (0,1,2,3), (5,4,7,6),   # forward, back
            (3,2,6,7), (4,5,1,0),   # up, down
            (1,5,6,2), (4,0,3,7)    # right, left
            )
        uvs = ((0,0), (1,0), (1,1), (0,1), (0,0), (1,0), (1,1), (0,1))
        cube = Mesh(verts, tris, uvs=uvs, mode=mode, **kwargs)

    else:
        w,h,d = subdivisions
        e = Entity()

        front =  Entity(parent=e, model=Plane((w,h)), z=-.5, rotation_x=-90)
        back =   Entity(parent=e, model=Plane((w,h)), z=.5, rotation_x=90)
        top =    Entity(parent=e, model=Plane((w,d)), y=.5)
        bottom = Entity(parent=e, model=Plane((w,d)), y=-.5, rotation_x=-180)
        right =  Entity(parent=e, model=Plane((d,h)), x=.5, rotation_z=90)
        left =   Entity(parent=e, model=Plane((d,h)), x=-.5, rotation_z=-90)

        cube = e.combine()
        cube.mode = mode
        cube.generate()
        destroy(e)

    return cube


if __name__ == '__main__':
    app = Ursina()

    e = Entity(model=Cube(subdivisions=(3,3,3), mode='line'), color=color.red)
    e = Entity(model=Cube(subdivisions=(1,1,1), mode='line'), color=color.green, x=2)

    _ed = EditorCamera(rotation_speed = 200, panning_speed=200)
    app.run()
