//-
// ==========================================================================
// 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.
// ==========================================================================
//+

///////////////////////////////////////////////////////////////////////////////
//
// apiSimpleShape.cpp
//
////////////////////////////////////////////////////////////////////////////////

#include <math.h>           
#include <maya/MIOStream.h>

#include <maya/MFnPlugin.h>

#include <apiSimpleShape.h>           
#include <apiSimpleShapeUI.h>           
#include <apiSimpleShapeIterator.h>


////////////////////////////////////////////////////////////////////////////////
//
// Shape implementation
//
////////////////////////////////////////////////////////////////////////////////

MTypeId apiSimpleShape::id( 0x8009a );

apiSimpleShape::apiSimpleShape() {}

apiSimpleShape::~apiSimpleShape() {}

void* apiSimpleShape::creator()
//
// Description
//
//    Called internally to create a new instance of the users MPx node.
//
{
	return new apiSimpleShape();
}

MStatus apiSimpleShape::initialize()
//
// Description
//
//    Attribute (static) initialization.
//
{ 
	return MS::kSuccess;
}


MPxGeometryIterator* apiSimpleShape::geometryIteratorSetup(MObjectArray& componentList,
													MObject& components,
													bool forReadOnly )
//
// Description
//
//    Creates a geometry iterator compatible with his shape.
//
// Arguments
//
//    componentList - list of components to be iterated
//    components    - component to be iterator
//    forReadOnly   -
//
// Returns
//
//    An iterator for the components
//
{
	apiSimpleShapeIterator * result = NULL;
	if ( components.isNull() ) 
	{
		result = new apiSimpleShapeIterator( getControlPoints(), componentList );
	}
	else 
	{
		result = new apiSimpleShapeIterator( getControlPoints(), components );
	}
	return result;
}

bool apiSimpleShape::acceptsGeometryIterator( bool writeable )
//
// Description
//
//    Specifies that this shape can provide an iterator for getting/setting
//    control point values.
//
// Arguments
//
//    writable - maya asks for an iterator that can set points if this is true
//
{
	return true;
}

bool apiSimpleShape::acceptsGeometryIterator( MObject&, bool writeable, bool forReadOnly )
//
// Description
//
//    Specifies that this shape can provide an iterator for getting/setting
//    control point values.
//
// Arguments
//
//    writable   - maya asks for an iterator that can set points if this is true
//    forReadOnly - maya asking for an iterator for querying only
//
{
	return true;
}

////////////////////////////////////////////////////////////////////////////////
//
// Node registry
//
// Registers/Deregisters apiSimpleShape user defined shape.
//
////////////////////////////////////////////////////////////////////////////////

MStatus initializePlugin( MObject obj )
{ 
	MFnPlugin plugin( obj, PLUGIN_COMPANY, "5.0", "Any");
	MStatus stat = plugin.registerShape( "apiSimpleShape", apiSimpleShape::id,
								   &apiSimpleShape::creator,
								   &apiSimpleShape::initialize,
								   &apiSimpleShapeUI::creator  );
	if ( ! stat ) {
		cerr << "Failed to register shape\n";
	}

	return stat;
}

MStatus uninitializePlugin( MObject obj)
{
	MFnPlugin plugin( obj );
	MStatus stat;

	stat = plugin.deregisterNode( apiSimpleShape::id );
	if ( ! stat ) {
		cerr << "Failed to deregister shape : apiSimpleShape \n";
	}

	return stat;
}
