#include "lineManip.h"
#include <maya/MHardwareRenderer.h>
#include <maya/MIOStream.h>
#include <maya/MMatrix.h>
#include <maya/MPoint.h>
#include <maya/MVector.h>
#include <maya/MSelectionList.h>
#include <maya/MItSelectionList.h>
#include <maya/MFnTransform.h>
#include <maya/MGlobal.h>
#include <maya/MFnCamera.h>
#include <maya/MTemplateCommand.h>
class lineGeometry
{
public:
        return MPoint( 1.0f, 1.0f, 0.0f );
 
    }
        return MPoint( 1.0f, -1.0f, 0.0f );
 
    }
        return MPoint( 2.0f, -1.0f, 0.0f );
 
    }
};
lineManip::lineManip()
{
    
    
    MPoint pointOnPlane(lineGeometry::topPoint());
 
    
                    (
MVector(lineGeometry::otherPoint()) - 
MVector(lineGeometry::bottomPoint()));
    
    
    plane.setPlane( pointOnPlane, normalToPlane );
}
lineManip::~lineManip()
{
    
}
void lineManip::postConstructor()
{
    
    glFirstHandle( lineName );
}
{
    
    if ( 0 == gGLFT )
    
    const char *nameBuffer = viewCamera.name().asChar();
    if ( 0 == nameBuffer )
        return;
    if ( ( 0 == strstr(nameBuffer,"persp") ) && ( 0 == strstr(nameBuffer,"front") ) )
        return;
    
    float top[4],bottom[4];
    lineGeometry::topPoint().get(top);
    lineGeometry::bottomPoint().get(bottom);
    
    
    
    MGLuint active = 0;
    if ( glActiveName( active ) )
    {
        float *a = 0,*b = 0;
        if ( active == lineName )
        {
            a = &top[0]; b = &bottom[0];
        }
        if ( active != 0 )
        {
            a[0] += (float) mousePointGlName.x; a[1] += (float) mousePointGlName.y; a[2] += (float) mousePointGlName.z;
            b[0] += (float) mousePointGlName.x; b[1] += (float) mousePointGlName.y; b[2] += (float) mousePointGlName.z;
        }
    }
    
    
    
    
    colorAndName( view, lineName, true, mainColor() );
    gGLFT->
glBegin( MGL_LINES );
        gGLFT->
glVertex3fv( top );
        gGLFT->glVertex3fv( bottom );
    
}
void    lineManip::preDrawUI( 
const M3dView &view )
 
{
    
    fDrawManip = true;
    
    const char *nameBuffer = viewCamera.name().asChar();
    if ( 0 == nameBuffer )
        fDrawManip = false;
    if ( ( 0 == strstr(nameBuffer,"persp") ) && ( 0 == strstr(nameBuffer,"front") ) )
        fDrawManip = false;
    if ( !fDrawManip )
        return;
    fLineColorIndex = mainColor();
    fSelectedLineColorIndex = selectedColor();
    fLineStart = lineGeometry::topPoint() + 
MVector( mousePointGlName );
    fLineEnd   = lineGeometry::bottomPoint()   + 
MVector( mousePointGlName );
}
void    lineManip::drawUI(
{
    if ( !fDrawManip )
        return;
    setHandleColor(drawManager, lineName, fLineColorIndex);
    drawManager.
line( fLineStart, fLineEnd );
    setHandleColor(drawManager, lineName, fLineColorIndex);
}
{
    
    
    updateDragInformation();
}
{
    updateDragInformation();
}
{
    
    
    
    {
            iter.getDependNode( node );
        {
            double newScale[3];
            newScale[0] = mousePointGlName.x + 1;
            newScale[1] = mousePointGlName.y + 1;
            newScale[2] = mousePointGlName.z + 1;
            xform.setScale( newScale );
        }
    }
}
MStatus lineManip::updateDragInformation()
 
{
    
    if ( 
MS::kFailure == mouseRay( localMousePoint, localMouseDirection) )
 
    
    
    MPoint mouseIntersectionWithManipPlane;
 
    if ( ! plane.intersect( localMousePoint, localMouseDirection,   mouseIntersectionWithManipPlane ) )
    mousePointGlName = mouseIntersectionWithManipPlane;
    MGLuint active = 0;
    if ( glActiveName( active ) )
    {
        float start[4],end[4];
        if ( active == lineName )
        {
            lineGeometry::topPoint().
get(start);
            lineGeometry::bottomPoint().get(end);
        }
        if ( active != 0 )
        {
            lineMath line;
            
            MPoint a( start[0], start[1], start[2] );
 
            MPoint b( end[0], end[1], end[2] );
 
            
            line.setLine( start, vab );
            
            
            if ( line.closestPoint( mousePointGlName, cpt ) )
            {
                mousePointGlName.
x -= cpt.
x;
                mousePointGlName.y -= cpt.
y;
                mousePointGlName.z -= cpt.
z;
            }
        }
    }
}
class lineManipCmd;
char cmdName[] = "lineManipCmd";
char nodeName[] = "simpleLineManip"; 
{
public:
    
    lineManipCmd()
    {}
};
static lineManipCmd _lineManipCmd;
void* lineManip::creator()
{
    return new lineManip();
}
{
}
{ 
    MFnPlugin plugin( obj, PLUGIN_COMPANY, 
"2009", 
"Any");
 
    status = plugin.registerNode( nodeName, lineManip::id, lineManip::creator,
    if (!status) 
    {
        status.
perror(
"registerNode");
        return status;
    }
    status = _lineManipCmd.registerCommand( obj );
    if (!status) 
    {
        status.
perror(
"registerCommand");
        return status;
    }
    return status;
}
{
    status = plugin.deregisterNode( lineManip::id );
    if (!status) 
    {
        status.
perror(
"deregisterNode");
        return status;
    }
    status = _lineManipCmd.deregisterCommand( obj );
    if (!status) 
    {
        status.
perror(
"deregisterCommand");
        return status;
    }
    return status;
}