zoomCameraCmd.cpp

//-
// ==========================================================================
// 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.
// ==========================================================================
//+

//
//  Description:
//      - doubles the focal length for the camera of the
//        current 3d view
//

#include <maya/MIOStream.h>

#include <maya/MPxCommand.h>
#include <maya/MFnPlugin.h>
#include <maya/MString.h>
#include <maya/MArgList.h>

#include <maya/MFnCamera.h>
#include <maya/MGlobal.h>
#include <maya/M3dView.h>
#include <maya/MDagPath.h>


class zoomCamera : public MPxCommand
{
public:
                    zoomCamera() {};
    virtual         ~zoomCamera(); 

    MStatus         doIt( const MArgList& args );
    MStatus         redoIt( );
    MStatus         undoIt( );
    bool            isUndoable( ) const;
    
    static void*    creator();

private:
    // This is data that is necessary to redo/undo the command.
    //
    MDagPath        camera;
};

zoomCamera::~zoomCamera() {}

void* zoomCamera::creator()
{
    return new zoomCamera();
}

MStatus zoomCamera::doIt( const MArgList& )
//
// Description
//     Gets the zoomCamera for the current 3d view and calls
//     the redoIt command to set the focal length.
//
// Note
//     The doit method should collect whatever information is
//     required to do the task, and store it in local class data.
//     It should finally call redoIt to make the command happen.
//
{

    // Get the current zoomCamera
    //
    MStatus stat = M3dView::active3dView().getCamera( camera ); 
    
    if ( MS::kSuccess == stat ) {
        redoIt();
    }
    else {
        cerr << "Error getting camera" << endl;
    }
    return stat;
}

MStatus zoomCamera::redoIt()
//
// Description
//     Doubles the focal length of current camera
//
// Note
//     The redoIt method should do the actual work, based on the
//     internal data only.
//
{
    MFnCamera fnCamera( camera );
    double fl = fnCamera.focalLength();
    fnCamera.setFocalLength( fl * 2.0 );
    return MS::kSuccess;
}

MStatus zoomCamera::undoIt()
//
// Description
//     the undo routine
//
// Note
//     The undoIt method should undo the actual work, based on the
//     internal data only.
//
{
    MFnCamera fnCamera( camera );
    double fl = fnCamera.focalLength();
    fnCamera.setFocalLength( fl / 2.0 );
    return MS::kSuccess;
}

bool zoomCamera::isUndoable() const
//
// Description
//     Make the command eligable for undo.
//
{ 
    return true;
}


//
// The following routines are used to register/unregister
// the command we are creating within Maya
//
MStatus initializePlugin( MObject obj )
{
    MStatus   status;
    MFnPlugin plugin( obj, PLUGIN_COMPANY, "3.0", "Any");

    status = plugin.registerCommand( "zoomCamera", zoomCamera::creator );
    if (!status) {
        status.perror("registerCommand");
        return status;
    }

    return status;
}

MStatus uninitializePlugin( MObject obj)
{
    MStatus   status;
    MFnPlugin plugin( obj );

    status = plugin.deregisterCommand( "zoomCamera" );
    if (!status) {
        status.perror("deregisterCommand");
        return status;
    }

    return status;
}