/********************************************************************** FILE: IMtlRender_Compatibility.h DESCRIPTION: Public interface for determining compatibility between a material/texmap and a renderer. The interface also allows 3rd party material/map plugins to use custom icons in the material/map browser. CREATED BY: Daniel Levesque, Discreet HISTORY: Created 14 April 2003 *> Copyright (c) 2003, All Rights Reserved. **********************************************************************/ #ifndef _IMTLRENDER_COMPATIBILITY_H_ #define _IMTLRENDER_COMPATIBILITY_H_ #include #include #include class Renderer; class MtlBase; #define IMTLRENDER_COMPATIBILITY_MTLBASE_INTERFACEID Interface_ID(0x5537445b, 0x70a97e02) #define IMTLRENDER_COMPATIBILITY_RENDERER_INTERFACEID Interface_ID(0x25d24114, 0xdbe505f) //============================================================================== // class IMtlRender_Compability_MtlBase // // Implementation instructions: // To be subclassed by a ClassDesc or ClassDesc2 of a Texmap or Mtl plugin. // The subclass needs to call Init(*this) in its constructor. // // Description: // This interface is used to determine whether a material/map flags itself as // being compatible with a specific renderer plugin. If the material/map flags // itself as being compatible with a renderer, then it is deemed compatible with // that renderer regardless of what class IMtlRender_Compatibility_Renderer // might say. // // Default compatibility: If neither the renderer nor the material/map implements // the compatibility interface, they are considered compatible by default. // // Material/map browser icon: This interface may also be used to provide custom // icons for the material/map browser. // //============================================================================== class IMtlRender_Compatibility_MtlBase : public FPStaticInterface { public: // Initialization method. MUST be called from the constructor of the subclass. i.e. "Init(*this);". void Init( ClassDesc& classDesc // Reference to sub-class instance ); // Returns wethere this material/map is compatible with the given renderer. // (Use the class ID of the renderer to determine compatibility). virtual bool IsCompatibleWithRenderer( ClassDesc& rendererClassDesc // Class descriptor of a Renderer plugin ) = 0; // Provides custom icons for the material/map browser. Returns true if custom // icons are provided. // ImageList owner: The derived class has complete ownership over the image list. // The derived class handles both creation and deletion of the image list. virtual bool GetCustomMtlBrowserIcon( HIMAGELIST& hImageList, // The image list from which the icons are extracted. The images should have a mask. int& inactiveIndex, // Index (into image list) of icon to be displayed when the material/map has the "Show Maps in Viewport" flag turned OFF. int& activeIndex, // Index (into image list) of icon to be displayed when the material/map has the "Show Maps in Viewport" flag turned ON. int& disabledIndex // Index (into image list) of icon to be displayed when the material/map is NOT COMPATIBLE with the current renderer. ) { return false; } }; // Given the class descriptor of a Mtl/Texmap plugin, this returns its compatibility interface (if it exists). inline IMtlRender_Compatibility_MtlBase* Get_IMtlRender_Compability_MtlBase(ClassDesc& mtlBaseClassDesc) { return static_cast(mtlBaseClassDesc.GetInterface(IMTLRENDER_COMPATIBILITY_MTLBASE_INTERFACEID)); } //============================================================================== // class IMtlRender_Compatibility_Renderer // // Implementation instructions: // To be subclassed by a ClassDesc or ClassDesc2 of a Renderer plugin. // The subclass needs to call Init(*this) in its constructor. // // Description: // This interface is used to determine whether a Renderer flags itself as // being compatible with a specific material/map plugin. If the Renderer flags // itself as being compatible with a material/map, then it is deemed compatible with // that material/map regardless of what class IMtlRender_Compatibility_MtlBase // might say. // // Default compatibility: If neither the renderer nor the material/map implements // the compatibility interface, they are considered compatible by default. // //============================================================================== class IMtlRender_Compatibility_Renderer : public FPStaticInterface { public: // Initialization method. MUST be called from the constructor of the subclass. i.e. "Init(*this);". void Init( ClassDesc& classDesc // Reference to sub-class instance ); // Returns wethere this material/map is compatible with the given renderer. // (Use the class ID of the renderer to determine compatibility). virtual bool IsCompatibleWithMtlBase( ClassDesc& mtlBaseClassDesc // Class descriptor of Mtl or Texmap plugin ) = 0; }; // Given the class descriptor of a Renderer plugin, this returns its compatibility interface (if it exists). inline IMtlRender_Compatibility_Renderer* Get_IMtlRender_Compatibility_Renderer(ClassDesc& rendererClassDesc) { return static_cast(rendererClassDesc.GetInterface(IMTLRENDER_COMPATIBILITY_RENDERER_INTERFACEID)); } //////////////////////////////////////////////////////////////////////////////// // bool AreMtlAndRendererCompatible(ClassDesc&, ClassDesc&) // // Returns whether the given Mtl/Texmap plugin is compatible with the given // Renderer plugin. Always use this function to determine compatiblity. // inline bool AreMtlAndRendererCompatible(ClassDesc& mtlBaseClassDesc, ClassDesc& rendererClassDesc) { IMtlRender_Compatibility_MtlBase* mtlBaseCompatibility = Get_IMtlRender_Compability_MtlBase(mtlBaseClassDesc); IMtlRender_Compatibility_Renderer* rendererCompatibility = Get_IMtlRender_Compatibility_Renderer(rendererClassDesc); if((mtlBaseCompatibility == NULL) && (rendererCompatibility == NULL)) { // No compatibility info: compatible by default return true; } else if((mtlBaseCompatibility != NULL) && mtlBaseCompatibility->IsCompatibleWithRenderer(rendererClassDesc)) { // Material says it's compatible with the renderer: compatible return true; } else if((rendererCompatibility != NULL) && rendererCompatibility->IsCompatibleWithMtlBase(mtlBaseClassDesc)) { // Renderer says it's compatible with the material: compatible return true; } else { // Neither material nor renderer says it's compatible: incompatible return false; } } //============================================================================== // class IMtlRender_Compability_MtlBase inlined methods //============================================================================== inline void IMtlRender_Compatibility_MtlBase::Init(ClassDesc& classDesc) { LoadDescriptor(IMTLRENDER_COMPATIBILITY_MTLBASE_INTERFACEID, _T("IMtlRender_Compability_MtlBase"), 0, &classDesc, 0, end); } //============================================================================== // class IMtlRender_Compatibility_Renderer inlined methods //============================================================================== inline void IMtlRender_Compatibility_Renderer::Init(ClassDesc& classDesc) { LoadDescriptor(IMTLRENDER_COMPATIBILITY_RENDERER_INTERFACEID, _T("IMtlRender_Compability_Renderer"), 0, &classDesc, 0, end); } #endif