#pragma once //- // =========================================================================== // Copyright 2018 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. // =========================================================================== //+ // // CLASS: MPxIkSolverNode // // **************************************************************************** #include #include #include #include OPENMAYA_MAJOR_NAMESPACE_OPEN // **************************************************************************** // CLASS DECLARATION (MPxIkSolverNode) //! \ingroup OpenMayaAnim MPx //! \brief Base class for user defined IK solvers /*! This is the base class for writing user-defined IK solvers. Users must at least override the following methods in order to write a solver: \li doSolve \li solverTypeName Users can optionally override the following methods if they want to perform work before or after doSolve is called: \li preSolve \li postSolve Since Maya 2018, users no longer need to call the base class version of these functions if overriding them. Note that the following virtual methods (declared in MPxNode) are irrelevant for the MPxIkSolverNode. If these methods are overridden in a class derived from MPxIkSolverNode, they will be ignored. \li compute \li getInternalValue \li setInternalValue \li legalConnection \li legalDisconnection \li connectionMade \li connectionBroken A creator method is necessary to return an instance of the user solver: \code userSolver::creator() { return new userSolver; } \endcode In order to create and register the solver, execute the mel command: \code createNode userSolver; \endcode Once the solver is registered it can be assigned to IK handles and its solve methods will be called in the same manner as the solvers within Maya. */ class OPENMAYAANIM_EXPORT MPxIkSolverNode : public MPxNode { public: ~MPxIkSolverNode() override; MPxNode::Type type() const override; virtual MStatus preSolve(); virtual MStatus doSolve(); virtual MStatus postSolve( MStatus ); virtual MString solverTypeName() const; bool rotatePlane(MStatus *ReturnStatus = NULL) const; MStatus setRotatePlane(bool rotatePlane); bool singleChainOnly(MStatus *ReturnStatus = NULL) const; MStatus setSingleChainOnly(bool singleChainOnly); bool positionOnly(MStatus *ReturnStatus = NULL) const; MStatus setPositionOnly(bool positionOnly); bool supportJointLimits(MStatus *ReturnStatus = NULL) const; MStatus setSupportJointLimits(bool supportJointLimits); bool uniqueSolution(MStatus *ReturnStatus = NULL) const; MStatus setUniqueSolution(bool uniqueSolution); OPENMAYA_DEPRECATED(<2016, "") virtual bool isSingleChainOnly() const; OPENMAYA_DEPRECATED(<2016, "Defaults to a false return.") virtual bool isPositionOnly() const; OPENMAYA_DEPRECATED(<2016, "Defaults to a false return.") virtual bool hasJointLimitSupport() const; OPENMAYA_DEPRECATED(<2016, "Defaults to a false return.") virtual bool hasUniqueSolution() const; OPENMAYA_DEPRECATED(<2016, "Defaults to a false return.") virtual bool groupHandlesByTopology() const; virtual MStatus setFuncValueTolerance( double tolerance ); virtual MStatus setMaxIterations( int value ); MIkHandleGroup * handleGroup() const; virtual void setHandleGroup( MIkHandleGroup* ); const MMatrix * toWorldSpace() const; const MMatrix * toSolverSpace() const; double funcValueTolerance() const; int maxIterations() const; virtual void snapHandle( MObject& handle ); OPENMAYA_AVAILABLE(2019) virtual bool isAttributeCreatedBySolver(MObject& attr) const; void create(); // SCRIPT USE ONLY MStatus _getJointAngles( MDoubleArray& da ) const {return getJointAngles(da);} MStatus _setJointAngles( const MDoubleArray& da ) {return setJointAngles(da);} void _setToRestAngles() { setToRestAngles(); } // static const char* className(); MObject thisMObject() const override; protected: // USE _getJointAngles() IN SCRIPT MStatus getJointAngles( MDoubleArray& ) const; // USE _setJointAngles() IN SCRIPT MStatus setJointAngles( const MDoubleArray& ); // USE _setToRestAngles() IN SCRIPT void setToRestAngles(); MPxIkSolverNode(); OPENMAYA_PRIVATE: }; OPENMAYA_NAMESPACE_CLOSE