###START PLUG
import sys
import maya.OpenMaya       as OpenMaya
import maya.OpenMayaMPx    as OpenMayaMPx
import maya.OpenMayaRender as OpenMayaRender
import maya.OpenMayaUI     as OpenMayaUI

nodeTypeName = "atomSphereLocator"
nodeTypeId = OpenMaya.MTypeId(0x87079)

glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
glFT = glRenderer.glFunctionTable()

class AtomSphereLocator(OpenMayaMPx.MPxLocatorNode):
       rInput = OpenMaya.MObject()
       gInput = OpenMaya.MObject()
       bInput = OpenMaya.MObject()
       aInput = OpenMaya.MObject()

       def __init__(self, scale):
               OpenMayaMPx.MPxLocatorNode.__init__(self)
               self.mf  = scale
               self.red   = 0
               self.green = 0
               self.blue  = 0
               self.alpha = 1

       def draw(self, view, path, style, status):                              #procedure appele au momment du "dessin" du locator

               thisNode = self.thisMObject()
               rPlug    = OpenMaya.MPlug(thisNode, AtomSphereLocator.rInput)
               gPlug    = OpenMaya.MPlug(thisNode, AtomSphereLocator.gInput)
               bPlug    = OpenMaya.MPlug(thisNode, AtomSphereLocator.bInput)
               aPlug    = OpenMaya.MPlug(thisNode, AtomSphereLocator.aInput)

               view.beginGL()                                                  #fonctionne bien sans mais il semble que ce soit necessaire pour eviter les plantages...
               #store the current user setup colors
               glFT.glPushAttrib(OpenMayaRender.MGL_CURRENT_BIT)

               #enable the transparency
               glFT.glEnable(OpenMayaRender.MGL_BLEND) #on active l'extension

               #set the color and alpha, rgba
               glFT.glColor4f(rPlug.asFloat(), gPlug.asFloat(), bPlug.asFloat(), aPlug.asFloat())        #Change color and add alpha

               #top section
               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, 1.0   * self.mf, 0.0   *self.mf )
               glFT.glVertex3f( 0.25 * self.mf, 0.866 * self.mf, 0.433 * self.mf )
               glFT.glVertex3f( 0.5  * self.mf, 0.866 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, 1.0   * self.mf,   0.0 *self.mf )
               glFT.glVertex3f( 0.5  * self.mf, 0.866 * self.mf,   0.0 * self.mf )
               glFT.glVertex3f( 0.25 * self.mf, 0.866 * self.mf, -.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0   * self.mf, 1.0   * self.mf, 0.0   *self.mf )
               glFT.glVertex3f( 0.25  * self.mf, 0.866 * self.mf, -.433 * self.mf )
               glFT.glVertex3f(-0.25  * self.mf, 0.866 * self.mf, -.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, 1.0   * self.mf, 0.0   *self.mf )
               glFT.glVertex3f(-0.25 * self.mf, 0.866 * self.mf, -.433 * self.mf )
               glFT.glVertex3f(-0.5  * self.mf, 0.866 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, 1.0   * self.mf, 0.0   *self.mf )
               glFT.glVertex3f(-0.5  * self.mf, 0.866 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.25 * self.mf, 0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, 1.0   * self.mf, 0.0   *self.mf )
               glFT.glVertex3f(-0.25 * self.mf, 0.866 * self.mf, 0.433 * self.mf )
               glFT.glVertex3f( 0.25 * self.mf, 0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               #Top Mid
               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.25  * self.mf, 0.866 * self.mf, 0.433 *self.mf )
               glFT.glVertex3f(-0.433 * self.mf, 0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, 0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.25  * self.mf, 0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.25  * self.mf, 0.866 * self.mf, 0.433 *self.mf )
               glFT.glVertex3f( 0.433 * self.mf, 0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.866 * self.mf, 0.5   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.866 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.5   * self.mf, 0.866 * self.mf, 0.0    *self.mf )
               glFT.glVertex3f( 0.866 * self.mf, 0.5   * self.mf, 0.0    *self.mf )
               glFT.glVertex3f( 0.433 * self.mf, 0.5   * self.mf, -0.75  *self.mf )
               glFT.glVertex3f( 0.25  * self.mf, 0.866 * self.mf, -0.433 *self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.25   * self.mf, 0.866 * self.mf, -0.433 *self.mf )
               glFT.glVertex3f( 0.433  * self.mf, 0.5   * self.mf, -0.75  *self.mf )
               glFT.glVertex3f( -0.433 * self.mf, 0.5   * self.mf, -0.75  *self.mf )
               glFT.glVertex3f( -0.25  * self.mf, 0.866 * self.mf, -0.433 *self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.25  * self.mf, 0.866 * self.mf, -0.433 *self.mf )
               glFT.glVertex3f(-0.433 * self.mf, 0.5   * self.mf, -0.75  *self.mf )
               glFT.glVertex3f(-0.866 * self.mf, 0.5   * self.mf,  0.0   *self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.866 * self.mf,  0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.5   * self.mf, 0.866 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.866 * self.mf, 0.5   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, 0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f(-0.25  * self.mf, 0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               #top lower
               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.433 * self.mf, 0.5 * self.mf, -0.75  * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0 * self.mf, -0.866 * self.mf )
               glFT.glVertex3f(-1.0   * self.mf, 0.0 * self.mf, 0.0    * self.mf )
               glFT.glVertex3f(-0.866 * self.mf, 0.5 * self.mf, 0.0    * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.866 * self.mf, 0.5 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-1.0   * self.mf, 0.0 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0 * self.mf, 0.866 * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, 0.5 * self.mf, 0.75  * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.433 * self.mf, 0.5 * self.mf, 0.75  * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0 * self.mf, 0.866 * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.0 * self.mf, 0.866 * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, 0.5 * self.mf, 0.75  * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.433 * self.mf, 0.5 * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.0 * self.mf, 0.866 * self.mf )
               glFT.glVertex3f( 1.0   * self.mf, 0.0 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.866 * self.mf, 0.5 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.866 * self.mf, 0.5 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 1.0   * self.mf, 0.0 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.0 * self.mf, -.866 * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, 0.5 * self.mf, -0.75 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.433 * self.mf, 0.5 * self.mf, -0.75  * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.0 * self.mf, -0.866 * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0 * self.mf, -0.866 * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, 0.5 * self.mf, -0.75  * self.mf )
               glFT.glEnd()

               #Bottom Section
               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, -1.0   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.25 * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glVertex3f( 0.5  * self.mf, -0.866 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, -1.0   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.5  * self.mf, -0.866 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.25 * self.mf, -0.866 * self.mf, -.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, -1.0   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.25 * self.mf, -0.866 * self.mf, -.433 * self.mf )
               glFT.glVertex3f(-0.25 * self.mf, -0.866 * self.mf, -.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, -1.0   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.25 * self.mf, -0.866 * self.mf, -.433 * self.mf )
               glFT.glVertex3f(-0.5  * self.mf, -0.866 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, -1.0   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.5  * self.mf, -0.866 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.25 * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_TRIANGLES)
               glFT.glVertex3f( 0.0  * self.mf, -1.0   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.25 * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glVertex3f( 0.25 * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               #Bottom Mid
               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.25  * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, -0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, -0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.25  * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.25  * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, -0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.866 * self.mf, -0.5   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, -0.866 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.5   * self.mf, -0.866 * self.mf, 0.0    * self.mf )
               glFT.glVertex3f( 0.866 * self.mf, -0.5   * self.mf, 0.0    * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, -0.5   * self.mf, -0.75  * self.mf )
               glFT.glVertex3f( 0.25  * self.mf, -0.866 * self.mf, -0.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.25  * self.mf, -0.866 * self.mf, -0.433 * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, -0.5   * self.mf, -0.75  * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, -0.5   * self.mf, -0.75  * self.mf )
               glFT.glVertex3f(-0.25  * self.mf, -0.866 * self.mf, -0.433 * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.25  * self.mf, -0.866 * self.mf, -0.433 * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, -0.5   * self.mf, -0.75  * self.mf )
               glFT.glVertex3f(-0.866 * self.mf, -0.5   * self.mf,  0.0   * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, -0.866 * self.mf,  0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.5   * self.mf, -0.866 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.866 * self.mf, -0.5   * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, -0.5   * self.mf, 0.75  * self.mf )
               glFT.glVertex3f(-0.25  * self.mf, -0.866 * self.mf, 0.433 * self.mf )
               glFT.glEnd()

               #top lower
               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.433 * self.mf, -0.5 * self.mf, -0.75  * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0  * self.mf, -0.866 * self.mf )
               glFT.glVertex3f(-1.0   * self.mf, 0.0  * self.mf, 0.0    * self.mf )
               glFT.glVertex3f(-0.866 * self.mf, -0.5 * self.mf, 0.0    * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.866 * self.mf, -0.5 * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-1.0   * self.mf, 0.0  * self.mf, 0.0   * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0  * self.mf, 0.866 * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, -0.5 * self.mf, 0.75  * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f(-0.433 * self.mf, -0.5 * self.mf, 0.75  * self.mf )
               glFT.glVertex3f(-0.5   * self.mf, 0.0  * self.mf, 0.866 * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.0  * self.mf, 0.866 * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, -0.5 * self.mf, 0.75  * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.433 * self.mf, -0.5 * self.mf, 0.75  * self.mf )
               glFT.glVertex3f( 0.5   * self.mf, 0.0  * self.mf, 0.866 * self.mf )
               glFT.glVertex3f( 1.0   * self.mf, 0.0  * self.mf, 0.0   * self.mf )
               glFT.glVertex3f( 0.866 * self.mf, -0.5 * self.mf, 0.0   * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.866 * self.mf, -0.5 * self.mf, 0.0    * self.mf )
               glFT.glVertex3f( 1.0   * self.mf,  0.0 * self.mf, 0.0    * self.mf )
               glFT.glVertex3f( 0.5   * self.mf,  0.0 * self.mf, -0.866 * self.mf )
               glFT.glVertex3f( 0.433 * self.mf, -0.5 * self.mf, -0.75  * self.mf )
               glFT.glEnd()

               glFT.glBegin(OpenMayaRender.MGL_QUADS)
               glFT.glVertex3f( 0.433 * self.mf, -0.5 * self.mf, -0.75  * self.mf )
               glFT.glVertex3f( 0.5   * self.mf,  0.0 * self.mf, -0.866 * self.mf )
               glFT.glVertex3f(-0.5   * self.mf,  0.0 * self.mf, -0.866 * self.mf )
               glFT.glVertex3f(-0.433 * self.mf, -0.5 * self.mf, -0.75  * self.mf )
               glFT.glEnd()

               glFT.glDisable(OpenMayaRender.MGL_BLEND)
               glFT.glPopAttrib()
               view.endGL()


def nodeCreator():
       return OpenMayaMPx.asMPxPtr(AtomSphereLocator(1))

def nodeInitializer():
       nAttr = OpenMaya.MFnNumericAttribute()

       AtomSphereLocator.rInput = nAttr.create('rInput', 'rIn', OpenMaya.MFnNumericData.kFloat, 1.0)
       nAttr.setStorable(1)
       nAttr.setWritable(1)
       nAttr.setKeyable(1)
       nAttr.setMin(0)
       nAttr.setMax(1)

       AtomSphereLocator.gInput = nAttr.create('gInput', 'gIn', OpenMaya.MFnNumericData.kFloat, 1.0)
       nAttr.setStorable(1)
       nAttr.setWritable(1)
       nAttr.setKeyable(1)
       nAttr.setMin(0)
       nAttr.setMax(1)

       AtomSphereLocator.bInput = nAttr.create('bInput', 'bIn', OpenMaya.MFnNumericData.kFloat, 1.0)
       nAttr.setStorable(1)
       nAttr.setWritable(1)
       nAttr.setKeyable(1)
       nAttr.setMin(0)
       nAttr.setMax(1)

       AtomSphereLocator.aInput = nAttr.create('aInput', 'aIn', OpenMaya.MFnNumericData.kFloat, 1.0)
       nAttr.setStorable(1)
       nAttr.setWritable(1)
       nAttr.setKeyable(1)
       nAttr.setMin(0)
       nAttr.setMax(1)

       AtomSphereLocator.addAttribute(AtomSphereLocator.rInput)
       AtomSphereLocator.addAttribute(AtomSphereLocator.gInput)
       AtomSphereLocator.addAttribute(AtomSphereLocator.bInput)
       AtomSphereLocator.addAttribute(AtomSphereLocator.aInput)

       return OpenMaya.MStatus.kSuccess

def initializePlugin(obj):                                              #procedure lance au moment de l'initialisation du plugin
       plugin = OpenMayaMPx.MFnPlugin(obj)
       try:
               plugin.registerNode(nodeTypeName, nodeTypeId, nodeCreator, nodeInitializer, OpenMayaMPx.MPxNode.kLocatorNode)
       except:
               sys.stderr.write( "Failed to register node: %s" % nodeTypeName)

def uninitializePlugin(obj):                                    #procedure lance au moment de la desactivation du plugin
       plugin = OpenMayaMPx.MFnPlugin(obj)
       try:
               plugin.deregisterNode(nodeTypeId)
       except:
               sys.stderr.write( "Failed to deregister node: %s" % nodeTypeName)

####END PLUG
