// ==========================================================================
// Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
// Use of this software is subject to the terms of the Autodesk
// license agreement provided at the time of installation or download,
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================

#include <maya/MSimple.h>
#include <maya/MLightLinks.h>
#include <maya/M3dView.h>
#include <maya/MDagPathArray.h>
#include <maya/MSelectionList.h>
#include <maya/MDagPath.h>
#include <maya/MGlobal.h>
#include <maya/MStringArray.h>
#include <maya/MItSelectionList.h>
#include <math.h>

DeclareSimpleCommand( listLightLinks, PLUGIN_COMPANY, "4.5");

MStatus listLightLinks::doIt( const MArgList& args )
//  Description:
//      Implements the MEL listLightLinks command.  After parsing the 
//      information stored in Maya's light linker nodes, it examines
//      the first item on the selection list.  If the item is an object,
//      then the command selects all lights that are linked to that object.
//      If the item is a light, then it will select all of the objects 
//      that are linked to that light.
//  Arguments:
//      args - The argument list that was passes to the command from MEL.
//             This command takes no arguments.
//  Return Value:
//      MS::kSuccess - command succeeded
//      MS::kFailure - command failed (returning this value will cause the 
//                     MEL script that is being run to terminate unless the
//                     error is caught using a "catch" statement.
    MStatus stat = MS::kSuccess;

    // Parse the links on the current scene's light linker node(s).
    MLightLinks lightLink;
    bool parseStatus;
    parseStatus = lightLink.parseLinks(MObject::kNullObj);

    if( !parseStatus )
        setResult( "Error parsing light links\n" );
        return MS::kFailure;

    // Get the first object (or component) on the selection list.
    MSelectionList selectList;
    MDagPath dagPath;
    MObject component;
    MGlobal::getActiveSelectionList( selectList );
    selectList.getDagPath( 0, dagPath, component );

    // Selection list to store entities linked to the selected light or
    // object.
    MSelectionList newSelection;

    // Stores the command result.
    char resultString[512];

    // If the object is a surface, we'll select all the lights linked to it.
    // If the object is a light, we'll select all the objects linked to it.
    if( dagPath.hasFn( MFn::kLight ) )
        // Select objects linked to this light.
        MSelectionList objects;
        lightLink.getLinkedObjects( dagPath, objects );

        newSelection.merge( objects );

        sprintf( resultString, "Selecting objects linked to light %s", 
                 dagPath.fullPathName().asChar() );

        // Select lights linked to this object.
        MDagPathArray lights;
        lightLink.getLinkedLights( dagPath, component, lights );

        for( unsigned int j = 0; j < lights.length(); j++ )
            const MDagPath& path = lights[j];
            newSelection.add( path );

        sprintf( resultString, "Selecting lights linked to object %s", 
                 dagPath.fullPathName().asChar() );


    // Select the linked entities.
    MGlobal::setActiveSelectionList( newSelection );

    setResult( resultString );
    return stat;