tge/lib/maxsdk70/include/IMtlRender_Compatibility.h
2017-04-17 06:17:10 -06:00

174 lines
7.6 KiB
C++
Executable File

/**********************************************************************
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 <Windows.h>
#include <max.h>
#include <baseinterface.h>
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<IMtlRender_Compatibility_MtlBase*>(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<IMtlRender_Compatibility_Renderer*>(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