#
#
#


import Blender
from Blender import NMesh
from Blender import Material
from Blender import Object
from Blender import Draw
from Blender import BGL
import math

def BuildStage():

    ### Platform object
    stageMesh = NMesh.New()


    smat = Material.New('stagePlatform')
    smat.rgbCol = [1, 0, 1]
    smat.mode = Material.Modes['SHADELESS']

    stageMesh.materials.append(smat)
    

    # center
    stageMesh.verts.append(NMesh.Vert(0,0,0))


    basecorners = []
    basecorners.append(0)
    basecorners.append(math.pi / 3)
    basecorners.append(2 * (math.pi / 3))
    basecorners.append(math.pi)
    basecorners.append(4 * (math.pi / 3))
    basecorners.append(5 * (math.pi / 3))

    # corners
    for i in basecorners:
        stageMesh.verts.append(NMesh.Vert(math.cos(i), math.sin(i), 0))

    # faces and edges
    f = NMesh.Face()
    f.append(stageMesh.verts[1])
    f.append(stageMesh.verts[2])
    f.append(stageMesh.verts[3])
    f.append(stageMesh.verts[4])
    f.mat = 0
    stageMesh.faces.append(f)
    f = NMesh.Face()
    f.append(stageMesh.verts[4])
    f.append(stageMesh.verts[5])
    f.append(stageMesh.verts[6])
    f.append(stageMesh.verts[1])
    f.mat = 0
    stageMesh.faces.append(f)
    platformObject = NMesh.PutRaw(stageMesh, 'stagePlatform', True)


    ### Bounds object
    stageMesh = NMesh.New()
    # center
    stageMesh.verts.append(NMesh.Vert(0,0,3))

    smat = Material.New('stageBounds')
    smat.rgbCol = [1, 0, 1]
    smat.mode = Material.Modes['SHADELESS']

    stageMesh.materials.append(smat)

    for i in basecorners:
        stageMesh.verts.append(NMesh.Vert(math.cos(i), math.sin(i), 3))

    f = NMesh.Face()
    f.append(stageMesh.verts[1])
    f.append(stageMesh.verts[2])
    f.append(stageMesh.verts[3])
    f.append(stageMesh.verts[4])
    f.mat = 0
    stageMesh.faces.append(f)
    f = NMesh.Face()
    f.append(stageMesh.verts[4])
    f.append(stageMesh.verts[5])
    f.append(stageMesh.verts[6])
    f.append(stageMesh.verts[1])
    f.mat = 0
    stageMesh.faces.append(f)

    # parent the bounds object to the platform
    platformObject.makeParent([NMesh.PutRaw(stageMesh, 'stageBounds', True)], True)


class IsoHexStage:
    def __init__(self):
        self.CREATED=False
        self.RENDER=False
        
        self.CREATE_STAGE_EVENT = 10
        self.QUIT_EVENT = 20
        self.RENDER_MODE_EVENT = 30

        Draw.Register(self.draw, self.event, self.bevent)

    def draw(self):
        BGL.glClearColor(0.6,0.6,0.8,0.8)
        BGL.glColor3i(1,1,1)
        BGL.glClear(BGL.GL_COLOR_BUFFER_BIT)
        if not self.CREATED:
            # create the stage...
            Draw.Button("Create Stage", self.CREATE_STAGE_EVENT, 10, 250, 200, 30, "Generate a new stage with lights, a baseplate, a bounding plate, and cameras.")
        else:
            # or toggle it between render and edit mode.
            Draw.Toggle("Render Mode", self.RENDER_MODE_EVENT, 10, 250, 200, 30, False, "Toggle Render Mode to see the stage as if it were being rendered.")

        Draw.Button("Quit", self.QUIT_EVENT, 10, 10, 80, 30, "Exit IsoHexStage. QKEY also exits.")


    def event(self,evt, val):
        if evt == Draw.QKEY and not val:
            Draw.Exit()

    def bevent(self, evt):
        if evt == self.CREATE_STAGE_EVENT and not self.CREATED: 
            BuildStage()
            self.CREATED = True
            Draw.Draw()
        if evt == self.RENDER_MODE_EVENT:
            self.RENDER = not self.RENDER

            if self.RENDER:
                # hide the bounding top plate
                pass
            
        if evt == self.QUIT_EVENT:
            Draw.Exit()

IsoHexStage()

