//======= Copyright © 1996-2006, Valve Corporation, All rights reserved. ====== // // Purpose: Utility classes for creating, registering & deregistering // Maya MPx* derived classes // //============================================================================= #ifndef VSMAYAMPXFACTORY_H #define VSMAYAMPXFACTORY_H #if defined(_WIN32) #pragma once #endif #include #include #include #include #include #include #include #include #include #include #include #include #if MAYA_API_VERSION >= 200800 #include #endif // MAYA_API_VERSION >= 200800 //----------------------------------------------------------------------------- // // Forward declarations // //----------------------------------------------------------------------------- class MFnPlugin; namespace ValveMaya { class CMSyntaxHelp; } //============================================================================= // // Base class for Maya MPx factories // //============================================================================= class CVsMayaMPxFactoryBase { public: // Registers all MPx derived things that have been allocated static MStatus RegisterEverything(MFnPlugin &pluginFn); // Deregisters all MPx derived things that have been allocated static MStatus DeregisterEverything(MFnPlugin &pluginFn); // Displays a list of stuff in the plugin static void DisplaySummary(const MString &pluginName); // Types of things the MPxFactory can create enum Type { // NOTE: Ensure this list of enums stays in sync with GetTypeName() // array kCommand, kFileTranslator, kDependencyNode, kShaderNode, kTransform, kLocatorNode, kImageFile, // Insert new ones above here kUnknown }; void Enable(bool bEnabled) { m_bEnabled = bEnabled; } bool IsEnabled() const { return m_bEnabled; } protected: // Constructor CVsMayaMPxFactoryBase(); private: // The next factory CVsMayaMPxFactoryBase *m_pNextFactory; // The starting factory static CVsMayaMPxFactoryBase *s_pFirstFactory; // Register the thing associated with this factory virtual MStatus Register(MFnPlugin &pluginFn) const = 0; // Deregister the thing associated with this factory virtual MStatus Deregister(MFnPlugin &pluginFn) const = 0; // Everything has a name virtual const MString &GetName() const = 0; // Everything has a description virtual const MString &GetDesc() const = 0; // Everything has a type virtual Type GetType() const = 0; // Everything has a type (map types to names) MString GetTypeName() const; // Whether this factory is enabled or not bool m_bEnabled; }; //----------------------------------------------------------------------------- // // Templatized helpers for creating MPx derived classes // //----------------------------------------------------------------------------- template class CVsMayaMPxFactory : public CVsMayaMPxFactoryBase { private: // Register the thing associated with this factory virtual MStatus Register(MFnPlugin &pluginFn) const { return T::Register(pluginFn); } // Deregister the thing associated with this factory virtual MStatus Deregister(MFnPlugin &pluginFn) const { return T::Deregister(pluginFn); } virtual const MString &GetName() const { return T::s_name; } virtual const MString &GetDesc() const { return T::s_desc; } virtual Type GetType() const { return T::GetType(); } }; //============================================================================ // // Base class for Valve Maya commands ( CVsMayaMPxCommand ) // //============================================================================ class CVsMayaMPxCommand : public MPxCommand { public: virtual const MString &GetName() const { return m_nullStr; } virtual const MString &GetDesc() const { return m_nullStr; } protected: // Derived classes must specify this to override syntax virtual void SpecifySyntax(MSyntax &mSyntax, ValveMaya::CMSyntaxHelp &help); ValveMaya::CMSyntaxHelp *GetSyntaxHelp() { return m_pSyntaxHelp; } private: ValveMaya::CMSyntaxHelp *m_pSyntaxHelp; static MStatus Register(MFnPlugin &pluginFn, const MString &name, MCreatorFunction creatorFunction, MCreateSyntaxFunction createSyntaxFunction = NULL); static MStatus Deregister(MFnPlugin &pluginFn, const MString &name); template friend class CVsMayaMPxCommandDecorator; MString m_nullStr; }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya commands ( CVsMayaMPxCommandDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxCommandDecorator : public T { public: static const MString &Name() { return s_name; }; static const MString &Desc() { return s_desc; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return Desc(); }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kCommand; } private: friend class CVsMayaMPxFactoryBase; template friend class CVsMayaMPxFactory; // These should be const but it's not because the CVsMayaMPxFactoryCommand // class only knows its name and therefore it's description at runtime static MString s_name; static MString s_desc; static ValveMaya::CMSyntaxHelp s_mSyntaxHelp; // Keeps track of command line flags static void *Create() { CVsMayaMPxCommandDecorator *pDecorator = new CVsMayaMPxCommandDecorator; pDecorator->m_pSyntaxHelp = &s_mSyntaxHelp; return pDecorator; } static MSyntax CreateSyntax() { // Maya will simply never call this unless the 'hasSyntax()' virtual // returns true doesn't matter if a syntaxCreator is registered or not, // and an empty MSyntax is fine too. Also note the return is by value // and not reference. Also... even when Maya does call this, it is only // ever called once, the first time Maya needs to know what the syntax // is (when the command is invoked or when help cmd is done MSyntax mSyntax; T().SpecifySyntax(mSyntax, s_mSyntaxHelp); return mSyntax; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, Create, T().hasSyntax() ? CreateSyntax : NULL); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_name); } }; //============================================================================ // // Base class for Valve Maya commands ( CVsMayaMPxToolCommand ) // //============================================================================ class CVsMayaMPxToolCommand : public MPxToolCommand { public: virtual const MString &GetName() const { return m_nullStr; } virtual const MString &GetDesc() const { return m_nullStr; } protected: // Derived classes must specify this to override syntax virtual void SpecifySyntax(MSyntax &mSyntax, ValveMaya::CMSyntaxHelp &help); ValveMaya::CMSyntaxHelp *GetSyntaxHelp() { return m_pSyntaxHelp; } private: ValveMaya::CMSyntaxHelp *m_pSyntaxHelp; static MStatus Register(MFnPlugin &pluginFn, const MString &name, MCreatorFunction creatorFunction, MCreateSyntaxFunction createSyntaxFunction = NULL); static MStatus Deregister(MFnPlugin &pluginFn, const MString &name); template friend class CVsMayaMPxToolCommandDecorator; MString m_nullStr; }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya commands ( CVsMayaMPxToolCommandDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxToolCommandDecorator : public T { public: static const MString &Name() { return s_name; }; static const MString &Desc() { return s_desc; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return Desc(); }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kCommand; } private: friend class CVsMayaMPxFactoryBase; template friend class CVsMayaMPxFactory; // These should be const but it's not because the CVsMayaMPxFactoryCommand // class only knows its name and therefore it's description at runtime static MString s_name; static MString s_desc; static ValveMaya::CMSyntaxHelp s_mSyntaxHelp; // Keeps track of command line flags static void *Create() { CVsMayaMPxToolCommandDecorator *pDecorator = new CVsMayaMPxToolCommandDecorator; pDecorator->m_pSyntaxHelp = &s_mSyntaxHelp; return pDecorator; } static MSyntax CreateSyntax() { // Maya will simply never call this unless the 'hasSyntax()' virtual // returns true doesn't matter if a syntaxCreator is registered or not, // and an empty MSyntax is fine too. Also note the return is by value // and not reference. Also... even when Maya does call this, it is only // ever called once, the first time Maya needs to know what the syntax // is (when the command is invoked or when help cmd is done MSyntax mSyntax; T().SpecifySyntax(mSyntax, s_mSyntaxHelp); return mSyntax; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, Create, T().hasSyntax() ? CreateSyntax : NULL); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_name); } }; //============================================================================= // // Base class for Valve Maya file translators ( CVsMayaMPxFileTranslator ) // //============================================================================= class CVsMayaMPxFileTranslator : public MPxFileTranslator { public: virtual const MString &GetName() const = 0; virtual const MString &GetGUIName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, const MString &guiName, MCreatorFunction creatorFunction); static MStatus Deregister(MFnPlugin &pluginFn, const MString &name); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya file translators ( // CVsMayaMPxFileTranslatorDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxFileTranslatorDecorator : public T { public: virtual const MString &GetName() const { return s_name; }; virtual const MString &GetGUIName() const { return s_guiName; }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kFileTranslator; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MString s_guiName; static void *Create() { return new CVsMayaMPxFileTranslatorDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, s_guiName, Create); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_guiName); } }; //============================================================================= // // Base class for Valve Maya Dependency Nodes ( CVsMayaMPxNode ) // //============================================================================ class CVsMayaMPxNode : public MPxNode { public: virtual const MString &GetName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, const MTypeId &mTypeId, MCreatorFunction creatorFunction, MInitializeFunction initFunction, const MString &classification); static MStatus Deregister(MFnPlugin &pluginFn, const MTypeId &mTypeId); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya nodes ( CVsMayaMPxNodeDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxNodeDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return s_classification.length() ? CVsMayaMPxFactoryBase::kShaderNode : CVsMayaMPxFactoryBase::kDependencyNode; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MTypeId s_mTypeId; static const MInitializeFunction s_mInitializeFunction; static const MString s_classification; static void *Create() { return new CVsMayaMPxNodeDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, s_mTypeId, Create, s_mInitializeFunction, s_classification); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_mTypeId); } }; //============================================================================= // // Base class for Valve Maya Transform Nodes ( CVsMayaMPxTransform ) // //============================================================================ class CVsMayaMPxTransform : public MPxTransform { public: virtual const MString &GetName() const = 0; protected: #if MAYA_API_VERSION >= 200900 static MStatus Register( MFnPlugin &pluginFn, const MString &name, const MTypeId &mTypeId, MCreatorFunction creatorFunction, MInitializeFunction initFunction, MCreateXformMatrixFunction xformCreatorFunction = MPxTransformationMatrix::creator, const MTypeId &xformMTypeId = MPxTransformationMatrix::baseTransformationMatrixId, const MString *classification = NULL); #else // #if MAYA_API_VERSION >= 200900 static MStatus Register( MFnPlugin &pluginFn, const MString &name, const MTypeId &mTypeId, MCreatorFunction creatorFunction, MInitializeFunction initFunction, MCreatorFunction xformCreatorFunction = MPxTransformationMatrix::creator, const MTypeId &xformMTypeId = MPxTransformationMatrix::baseTransformationMatrixId, const MString *classification = NULL); #endif // #if MAYA_API_VERSION >= 200900 static MStatus Deregister(MFnPlugin &pluginFn, const MTypeId &mTypeId); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya commands ( CVsMayaMPxCommandDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxTransformDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kTransform; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MTypeId s_mTypeId; static const MInitializeFunction s_mInitializeFunction; #if MAYA_API_VERSION >= 200900 static const MCreateXformMatrixFunction s_xformMCreatorFunction; #else // #if MAYA_API_VERSION >= 200900 static const MCreatorFunction s_xformMCreatorFunction; #endif // #if MAYA_API_VERSION >= 200900 static const MTypeId s_xformMTypeId; static void *Create() { return new CVsMayaMPxTransformDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, s_mTypeId, Create, s_mInitializeFunction, s_xformMCreatorFunction, s_xformMTypeId); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_mTypeId); } }; //============================================================================= // // Base class for Valve Maya Locator Nodes ( CVsMayaMPxLocatorNode ) // //============================================================================ class CVsMayaMPxLocatorNode : public MPxLocatorNode { public: virtual const MString &GetName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, const MTypeId &mTypeId, MCreatorFunction creatorFunction, MInitializeFunction initFunction); static MStatus Deregister(MFnPlugin &pluginFn, const MTypeId &mTypeId); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya nodes ( CVsMayaMPxLocatorNodeDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxLocatorNodeDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kLocatorNode; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MTypeId s_mTypeId; static const MInitializeFunction s_mInitializeFunction; static void *Create() { return new CVsMayaMPxLocatorNodeDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, s_mTypeId, Create, s_mInitializeFunction); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_mTypeId); } }; //============================================================================= // // Base class for Valve Maya Drag And Drop Behaviors ( // CVsMayaMPxDragAndDropBehavior ) // //============================================================================ class CVsMayaMPxDragAndDropBehavior : public MPxDragAndDropBehavior { public: virtual const MString &GetName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, MCreatorFunction creatorFunction); static MStatus Deregister(MFnPlugin &pluginFn, const MString &name); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya drag and drop behaviors ( // CVsMayaMPxDragAndDropBehavior ) // //----------------------------------------------------------------------------- template class CVsMayaMPxDragAndDropBehaviorDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kLocatorNode; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MInitializeFunction s_mInitializeFunction; static void *Create() { return new CVsMayaMPxDragAndDropBehaviorDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, Create); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_name); } }; //============================================================================= // // Base class for Valve Maya Shape Nodes ( CVsMayaMPxShapeNode ) // //============================================================================ class CVsMayaMPxShapeNode : public MPxSurfaceShape { public: virtual const MString &GetName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, const MTypeId &mTypeId, MCreatorFunction creatorFunction, MInitializeFunction initFunction, MCreatorFunction uiCreatorFunction); static MStatus Deregister(MFnPlugin &pluginFn, const MTypeId &mTypeId); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya shape nodes ( CVsMayaMPxShapeNodeDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxShapeNodeDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kLocatorNode; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MTypeId s_mTypeId; static const MInitializeFunction s_mInitializeFunction; static const MCreatorFunction s_uiCreatorFunction; static void *Create() { return new CVsMayaMPxShapeNodeDecorator; } static void *CreateUI() { return new U; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, s_mTypeId, Create, s_mInitializeFunction, CreateUI); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_mTypeId); } }; #if MAYA_API_VERSION >= 200800 //============================================================================= // // Base class for Valve Maya Image File Types ( CVsMayaMPxImageFile ) // //============================================================================ class CVsMayaMPxImageFile : public MPxImageFile { public: virtual const MString &GetName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, MCreatorFunction creatorFunction, const MStringArray &extensions); static MStatus Deregister(MFnPlugin &pluginFn, const MString &name); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya Image Files ( CVsMayaMPxImageFileDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxImageFileDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return CVsMayaMPxFactoryBase::kImageFile; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MStringArray s_extensions; static const MCreatorFunction s_creatorFunction; static void *Create() { return new CVsMayaMPxImageFileDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, Create, s_extensions); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_name); } }; //----------------------------------------------------------------------------- // Helper macro to instantiate an image file //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXIMAGEFILE(_class, _name, _extensions, _desc) \ const MString CVsMayaMPxImageFileDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxImageFileDecorator<_class>::s_desc(_desc); \ const MStringArray CVsMayaMPxImageFileDecorator<_class>::s_extensions( \ _extensions); \ static CVsMayaMPxFactory > \ s_##_name##_Factory #endif // MAYA_API_VERSION >= 200800 //============================================================================= // // Base class for Valve Maya Dependency Nodes ( CVsMayaMPxNode ) // //============================================================================ class CVsMayaMPxDeformerNode : public MPxDeformerNode { public: virtual const MString &GetName() const = 0; protected: static MStatus Register(MFnPlugin &pluginFn, const MString &name, const MTypeId &mTypeId, MCreatorFunction creatorFunction, MInitializeFunction initFunction, const MString &classification); static MStatus Deregister(MFnPlugin &pluginFn, const MTypeId &mTypeId); }; //----------------------------------------------------------------------------- // // Decorator class for Valve Maya nodes ( CVsMayaMPxDeformerNodeDecorator ) // //----------------------------------------------------------------------------- template class CVsMayaMPxDeformerNodeDecorator : public T { public: static const MString &Name() { return s_name; }; virtual const MString &GetName() const { return Name(); }; virtual const MString &GetDesc() const { return s_desc; }; static CVsMayaMPxFactoryBase::Type GetType() { return s_classification.length() ? CVsMayaMPxFactoryBase::kShaderNode : CVsMayaMPxFactoryBase::kDependencyNode; } private: template friend class CVsMayaMPxFactory; static const MString s_name; static const MString s_desc; static const MTypeId s_mTypeId; static const MInitializeFunction s_mInitializeFunction; static const MString s_classification; static void *Create() { return new CVsMayaMPxDeformerNodeDecorator; } static MStatus Register(MFnPlugin &pluginFn) { return T::Register(pluginFn, s_name, s_mTypeId, Create, s_mInitializeFunction, s_classification); } static MStatus Deregister(MFnPlugin &pluginFn) { return T::Deregister(pluginFn, s_mTypeId); } }; //============================================================================= // // Helper Macros // //============================================================================= //----------------------------------------------------------------------------- // Helper macro to instantiate a command //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXCOMMAND(_class, _name, _desc) \ MString CVsMayaMPxCommandDecorator<_class>::s_name(#_name); \ MString CVsMayaMPxCommandDecorator<_class>::s_desc(_desc); \ ValveMaya::CMSyntaxHelp CVsMayaMPxCommandDecorator<_class>::s_mSyntaxHelp; \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a command //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXTOOLCOMMAND(_class, _name, _desc) \ MString CVsMayaMPxToolCommandDecorator<_class>::s_name(#_name); \ MString CVsMayaMPxToolCommandDecorator<_class>::s_desc(_desc); \ ValveMaya::CMSyntaxHelp \ CVsMayaMPxToolCommandDecorator<_class>::s_mSyntaxHelp; \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a translator //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXFILETRANSLATOR(_class, _name, _guiName, _desc) \ const MString CVsMayaMPxFileTranslatorDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxFileTranslatorDecorator<_class>::s_desc(_desc); \ const MString CVsMayaMPxFileTranslatorDecorator<_class>::s_guiName( \ _guiName); \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a regular dependency node //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXNODE(_class, _name, _typeId, _initializeFunction, \ _desc) \ const MString CVsMayaMPxNodeDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxNodeDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxNodeDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxNodeDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MString CVsMayaMPxNodeDecorator<_class>::s_classification(""); \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a shader dependency node //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXSHADERNODE( \ _class, _name, _typeId, _initializeFunction, _classification, _desc) \ const MString CVsMayaMPxNodeDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxNodeDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxNodeDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxNodeDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MString CVsMayaMPxNodeDecorator<_class>::s_classification( \ _classification); \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a transform node //----------------------------------------------------------------------------- #if MAYA_API_VERSION >= 200900 #define INSTALL_MAYA_MPXTRANSFORM(_class, _name, _typeId, _initializeFunction, \ _desc) \ const MString CVsMayaMPxTransformDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxTransformDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxTransformDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MCreateXformMatrixFunction \ CVsMayaMPxTransformDecorator<_class>::s_xformMCreatorFunction( \ MPxTransformationMatrix::creator); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_xformMTypeId( \ MPxTransformationMatrix::baseTransformationMatrixId); \ static CVsMayaMPxFactory > \ s_##_name##_Factory #else // #if MAYA_API_VERSION >= 200900 #define INSTALL_MAYA_MPXTRANSFORM(_class, _name, _typeId, _initializeFunction, \ _desc) \ const MString CVsMayaMPxTransformDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxTransformDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxTransformDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MCreatorFunction \ CVsMayaMPxTransformDecorator<_class>::s_xformMCreatorFunction( \ MPxTransformationMatrix::creator); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_xformMTypeId( \ MPxTransformationMatrix::baseTransformationMatrixId); \ static CVsMayaMPxFactory > \ s_##_name##_Factory #endif // #if MAYA_API_VERSION >= 200900 //----------------------------------------------------------------------------- // Helper macro to instantiate a transform node with a custom transformation // matrix // TODO: Make CVsMayaMPxTransformationMatrix and create the MCreatorFunction for // the user //----------------------------------------------------------------------------- #if MAYA_API_VERSION >= 200900 #define INSTALL_MAYA_MPXTRANSFORM_WITHMATRIX( \ _class, _name, _typeId, _initializeFunction, _xformCreatorFunction, \ _xformTypeId, _desc) \ const MString CVsMayaMPxTransformDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxTransformDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxTransformDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MCreateXformMatrixFunction \ CVsMayaMPxTransformDecorator<_class>::s_xformMCreatorFunction( \ _xformCreatorFunction); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_xformMTypeId( \ _xformTypeId); \ static CVsMayaMPxFactory > \ s_##_name##_Factory #else // #if MAYA_API_VERSION >= 200900 #define INSTALL_MAYA_MPXTRANSFORM_WITHMATRIX( \ _class, _name, _typeId, _initializeFunction, _xformCreatorFunction, \ _xformTypeId, _desc) \ const MString CVsMayaMPxTransformDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxTransformDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxTransformDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MCreatorFunction \ CVsMayaMPxTransformDecorator<_class>::s_xformMCreatorFunction( \ _xformCreatorFunction); \ const MTypeId CVsMayaMPxTransformDecorator<_class>::s_xformMTypeId( \ _xformTypeId); \ static CVsMayaMPxFactory > \ s_##_name##_Factory #endif // #if MAYA_API_VERSION >= 200900 //----------------------------------------------------------------------------- // Helper macro to instantiate a locator node //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXLOCATORNODE(_class, _name, _typeId, \ _initializeFunction, _desc) \ const MString CVsMayaMPxLocatorNodeDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxLocatorNodeDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxLocatorNodeDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxLocatorNodeDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a drag and drop behavior //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXDRAGANDDROPBEHAVIOR(_class, _name, _desc) \ const MString CVsMayaMPxDragAndDropBehaviorDecorator<_class>::s_name( \ #_name); \ const MString CVsMayaMPxDragAndDropBehaviorDecorator<_class>::s_desc( \ _desc); \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a shape node //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXSHAPENODE(_class, _name, _typeId, _initializeFunction, \ _uiClass, _desc) \ const MString CVsMayaMPxShapeNodeDecorator<_class, _uiClass>::s_name( \ #_name); \ const MString CVsMayaMPxShapeNodeDecorator<_class, _uiClass>::s_desc( \ _desc); \ const MTypeId CVsMayaMPxShapeNodeDecorator<_class, _uiClass>::s_mTypeId( \ _typeId); \ const MInitializeFunction \ CVsMayaMPxShapeNodeDecorator<_class, _uiClass>::s_mInitializeFunction( \ _initializeFunction); \ static CVsMayaMPxFactory > \ s_##_name##_Factory //----------------------------------------------------------------------------- // Helper macro to instantiate a deformer dependency node //----------------------------------------------------------------------------- #define INSTALL_MAYA_MPXDEFORMERNODE(_class, _name, _typeId, \ _initializeFunction, _desc) \ const MString CVsMayaMPxDeformerNodeDecorator<_class>::s_name(#_name); \ const MString CVsMayaMPxDeformerNodeDecorator<_class>::s_desc(_desc); \ const MTypeId CVsMayaMPxDeformerNodeDecorator<_class>::s_mTypeId(_typeId); \ const MInitializeFunction \ CVsMayaMPxDeformerNodeDecorator<_class>::s_mInitializeFunction( \ _initializeFunction); \ const MString CVsMayaMPxDeformerNodeDecorator<_class>::s_classification( \ ""); \ static CVsMayaMPxFactory > \ s_##_name##_Factory #endif // VSMAYAMPXFACTORY_H