#! /usr/bin/env python
# -*- Mode: Python -*-
# -*- coding: ascii -*-

"""
This is a LightWave Command Sequence plug-in (Modeler) that creates
a square.
"""

import sys
import lwsdk
import math

__author__     = "Clinton Reese"
__date__       = "March 8 2013"
__copyright__  = "Copyright (C) 2011 Clinton's 3D Creations"
__version__    = "1.0"
__maintainer__ = "Clinton Reese"
__email__      = "reese@clintons3d.com"
__status__     = "Example modified"
__lwver__      = "11.5"

class make_square(lwsdk.ICommandSequence):
    def __init__(self, context):
        super(make_square, self).__init__()

    # LWCommandSequence -----------------------------------
    def process(self, mod_command):
        edit_op_result = lwsdk.EDERR_NONE
        mesh_edit_op = mod_command.editBegin(0, 0, lwsdk.OPSEL_USER)
        if not mesh_edit_op:
            print >>sys.stderr, 'Failed to engage mesh edit operations!'
            return lwsdk.AFUNC_OK
            
        ptID = []
        pt = [ -1.0, 0.0, -1.0 ]
        uv = [ 0.0, 0.0 ]
        rgb = [1.0, 0.0, 0.0]
        ptID.append(mesh_edit_op.addPoint(mesh_edit_op.state, pt))
        # different from c, dimension of vmap is not used?
        #mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[0], lwsdk.LWVMAP_TXUV,"MyUVMap", 2, uv)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[0], lwsdk.LWVMAP_TXUV, "MyUVMap", uv)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[0], lwsdk.LWVMAP_WGHT, "MyWeightMap", 0.0)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[0], lwsdk.LWVMAP_RGB, "MyVertexColorMap", rgb)
        
        pt = [ -1.0, 0.0, 1.0 ]
        uv = [ 0.0, 1.0 ]
        rgb = [0.0, 1.0, 0.0]
        ptID.append(mesh_edit_op.addPoint(mesh_edit_op.state, pt))
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[1], lwsdk.LWVMAP_TXUV, "MyUVMap", uv)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[1], lwsdk.LWVMAP_WGHT, "MyWeightMap", 0.25)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[1], lwsdk.LWVMAP_RGB, "MyVertexColorMap", rgb)
        
        pt = [ 1.0, 0.0, 1.0 ]
        uv = [ 1.0, 1.0 ]
        rgb = [0.0, 0.0, 1.0]
        ptID.append(mesh_edit_op.addPoint(mesh_edit_op.state, pt))
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[2], lwsdk.LWVMAP_TXUV, "MyUVMap", uv)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[2], lwsdk.LWVMAP_WGHT, "MyWeightMap", 0.75)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[2], lwsdk.LWVMAP_RGB, "MyVertexColorMap", rgb)
        
        pt = [ 1.0, 0.0, -1.0 ]
        uv = [ 1.0, 0.0 ]
        rgb = [1.0, 1.0, 1.0]
        ptID.append(mesh_edit_op.addPoint(mesh_edit_op.state, pt))
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[3], lwsdk.LWVMAP_TXUV, "MyUVMap", uv)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[3], lwsdk.LWVMAP_WGHT, "MyWeightMap", 1.0)
        mesh_edit_op.pntVMap(mesh_edit_op.state, ptID[3], lwsdk.LWVMAP_RGB, "MyVertexColorMap", rgb)
        
        polygon = mesh_edit_op.addPoly(mesh_edit_op.state, lwsdk.LWPOLTYPE_FACE, None, "MySurface", ptID)
        
        #mesh_edit_op.pntVPMap would be used at this point to create discontinuous uv values for the polygons
        
        mesh_edit_op.done(mesh_edit_op.state, edit_op_result, 0)
        
        ninetyDegrees = math.pi/2.0
        #new_color = lwsdk.Color(0.0, 1.0, 1.0)
        new_color = [0.0, 1.0, 1.0]
        surface_funcs = lwsdk.LWSurfaceFuncs()
        surface = surface_funcs.first()
        while surface:
            if surface_funcs.name(surface) == "MySurface":
                #try float for lw11.5 - worked
                #surface_funcs.setFlt(surface, lwsdk.SURF_COLR, new_color)
                surface_funcs.set_float(surface, lwsdk.SURF_COLR, new_color)
                surface_funcs.set_float(surface, lwsdk.SURF_SMAN, ninetyDegrees)
                break
            surface = surface_funcs.next()
        
        thecommand = mod_command.lookup(mod_command.data, "SETLAYER")
        i="1"
        cs_options = lwsdk.marshall_dynavalues(i)
        result = mod_command.execute(mod_command.data, thecommand, cs_options, lwsdk.OPSEL_USER)
        #remove to avoid confusion
        #i="2"
        #cs_options = lwsdk.marshall_dynavalues(i)
        #result = mod_command.execute(mod_command.data, thecommand, cs_options, lwsdk.OPSEL_USER)
        #i="3"
        #cs_options = lwsdk.marshall_dynavalues(i)
        #result = mod_command.execute(mod_command.data, thecommand, cs_options, lwsdk.OPSEL_USER)
        #i="9"
        #cs_options = lwsdk.marshall_dynavalues(i)
        #result = mod_command.execute(mod_command.data, thecommand, cs_options, lwsdk.OPSEL_USER)

        return lwsdk.AFUNC_OK


ServerTagInfo = [
                    ( "Python Basic Square", lwsdk.SRVTAG_USERNAME | lwsdk.LANGID_USENGLISH ),
                    ( "Make Square", lwsdk.SRVTAG_BUTTONNAME | lwsdk.LANGID_USENGLISH ),
                    ( "Utilities/Python", lwsdk.SRVTAG_MENU | lwsdk.LANGID_USENGLISH )
                ]

ServerRecord = { lwsdk.CommandSequenceFactory("LW_PyMakeSquare", make_square) : ServerTagInfo }