Public Member Functions | Public Attributes | Protected Member Functions

MSMtlXtnd Class Reference

Search for all occurrences

#include <mxsPlugin.h>

Inheritance diagram for MSMtlXtnd:
Inheritance graph
[legend]

List of all members.

Public Member Functions

  MSMtlXtnd (MSPluginClass *pc, BOOL loading)
  ~MSMtlXtnd ()
void  DeleteThis ()
ReferenceTarget get_delegate ()
void  GetClassName (MSTR &s)
  Retrieves the name of the plugin class.
Class_ID  ClassID ()
  Retrieves a constant that uniquely identifies the plugin class.
void  FreeCaches ()
int  NumSubs ()
Animatable SubAnim (int i)
MSTR  SubAnimName (int i)
int  NumParamBlocks ()
IParamBlock2 GetParamBlock (int i)
IParamBlock2 GetParamBlockByID (BlockID id)
void *  GetInterface (ULONG id)
  Inherited from Animatable.
BaseInterface GetInterface (Interface_ID id)
  Inherited from Animatable.
int  NumRefs ()
  Returns the total number of references this ReferenceMaker can hold.
RefTargetHandle  GetReference (int i)
  Returns the 'i-th' reference.
RefTargetHandle  Clone (RemapDir &remap)
  This method is used by 3ds Max to clone an object.
int  BuildMaps (TimeValue t, RenderMapsContext &rmc)
ULONG  Requirements (int subMtlNum)
ULONG  LocalRequirements (int subMtlNum)
void  MappingsRequired (int subMtlNum, BitArray &mapreq, BitArray &bumpreq)
void  LocalMappingsRequired (int subMtlNum, BitArray &mapreq, BitArray &bumpreq)
BOOL  IsMultiMtl ()
int  NumSubTexmaps ()
Texmap GetSubTexmap (int i)
void  SetSubTexmap (int i, Texmap *m)
MSTR  GetSubTexmapSlotName (int i)
void  Update (TimeValue t, Interval &valid)
void  Reset ()
Interval  Validity (TimeValue t)
ParamDlg CreateParamDlg (HWND hwMtlEdit, IMtlParams *imp)
IOResult  Save (ISave *isave)
IOResult  Load (ILoad *iload)
ULONG  GetGBufID ()
void  SetGBufID (ULONG id)
void  EnumAuxFiles (AssetEnumCallback &assetEnum, DWORD flags)
PStamp GetPStamp (int sz)
PStamp CreatePStamp (int sz)
void  DiscardPStamp (int sz)
BOOL  SupportTexDisplay ()
DWORD_PTR  GetActiveTexHandle (TimeValue t, TexHandleMaker &thmaker)
void  ActivateTexDisplay (BOOL onoff)
BOOL  SupportsMultiMapsInViewport ()
void  SetupGfxMultiMaps (TimeValue t, Material *mtl, MtlMakerCallback &cb)
ReferenceTarget GetRefTarget ()
BOOL  DontKeepOldMtl ()
MtlBase GetActiveTexmap ()
void  SetActiveTexmap (MtlBase *txm)
Color  GetAmbient (int mtlNum=0, BOOL backFace=FALSE)
Color  GetDiffuse (int mtlNum=0, BOOL backFace=FALSE)
Color  GetSpecular (int mtlNum=0, BOOL backFace=FALSE)
float  GetShininess (int mtlNum=0, BOOL backFace=FALSE)
float  GetShinStr (int mtlNum=0, BOOL backFace=FALSE)
float  GetXParency (int mtlNum=0, BOOL backFace=FALSE)
BOOL  GetSelfIllumColorOn (int mtlNum=0, BOOL backFace=FALSE)
float  GetSelfIllum (int mtlNum=0, BOOL backFace=FALSE)
Color  GetSelfIllumColor (int mtlNum=0, BOOL backFace=FALSE)
Sampler GetPixelSampler (int mtlNum=0, BOOL backFace=FALSE)
float  WireSize (int mtlNum=0, BOOL backFace=FALSE)
void  SetAmbient (Color c, TimeValue t)
void  SetDiffuse (Color c, TimeValue t)
void  SetSpecular (Color c, TimeValue t)
void  SetShininess (float v, TimeValue t)
BOOL  SupportsShaders ()
BOOL  SupportsRenderElements ()
void  Shade (ShadeContext &sc)
int  NumSubMtls ()
Mtl GetSubMtl (int i)
void  SetSubMtl (int i, Mtl *m)
MSTR  GetSubMtlSlotName (int i)
MSTR  GetSubMtlTVName (int i)
float  GetDynamicsProperty (TimeValue t, int mtlNum, int propID)
void  SetDynamicsProperty (TimeValue t, int mtlNum, int propID, float value)
float  EvalDisplacement (ShadeContext &sc)
Interval  DisplacementValidity (TimeValue t)
bool  IsOutputConst (ShadeContext &sc, int stdID)
bool  EvalColorStdChannel (ShadeContext &sc, int stdID, Color &outClr)
bool  EvalMonoStdChannel (ShadeContext &sc, int stdID, float &outVal)
int  SetProperty (ULONG id, void *data)
void *  GetProperty (ULONG id)

Public Attributes

Mtl delegate

Protected Member Functions

virtual void  SetReference (int i, RefTargetHandle rtarg)
  Stores a ReferenceTarget as its 'i-th' reference`.

Constructor & Destructor Documentation

MSMtlXtnd ( MSPluginClass *  pc,
BOOL  loading 
)
~MSMtlXtnd ( ) [inline]

Member Function Documentation

void DeleteThis ( )
ReferenceTarget* get_delegate ( ) [inline, virtual]

Reimplemented from MSPluginMtl.

{ return delegate; } 
void GetClassName ( MSTR s ) [inline, virtual]

Retrieves the name of the plugin class.

This name is usually used internally for debugging purposes. For Material plug-ins this method is used to put up the material "type" name in the Material Editor.

Parameters:
s Reference to a string filled in with the name of the plugin class

Reimplemented from MSPluginMtl.

{ s = MSTR(pc->class_name->to_string()); }  
Class_ID ClassID ( ) [inline, virtual]

Retrieves a constant that uniquely identifies the plugin class.

This method must return the unique ID for the plugin class. If two ClassIDs conflict, the system will only load the first conflicting one it finds. A program (gencid.exe) is provided to generate unique class id values.

Returns:
A class id that uniquely identifies a plugin class
See also:
Class ClassID, List of Class IDs.

Reimplemented from MSPluginMtl.

{ return pc->class_id; }
void FreeCaches ( ) [inline, virtual]
Remarks:
This is called to delete any item that can be rebuilt. For example, the procedural sphere object has a mesh that it caches. It could call Mesh::FreeAll() on the mesh from this method. This will free the vertex/face/uv arrays. If the sphere is ever evaluated again it can just rebuild the mesh. If an object (like a sphere) has modifiers applied to it, and those modifiers are not animated, then the result of the pipeline is cached in the node. So there is no reason for the sphere to also have a cache of its representation. Therefore when this method is called, the sphere can free the data of the mesh.
Default Implementation:
{}

Reimplemented from MSPluginMtl.

int NumSubs ( ) [virtual]
Remarks:
The system uses a virtual array mechanism to access the sub-anims of a plug-in. This method returns the total number of sub-anims maintained by the plug-in. If a plug-in is using a parameter block to manage its parameters it should just return 1 for all the parameters directed by the parameter block.
Returns:
The number of sub-anims used by the plug-in.
Default Implementation:
{ return 0; }

Reimplemented from MSPluginMtl.

Animatable* SubAnim ( int  i ) [virtual]
Remarks:
This method returns a pointer to the 'i-th' sub-anim. If a plug-in is using a parameter block to manage all its parameters it should just return a pointer to the parameter block itself from this method. This method may return NULL so developers need to check the return value before calling other sub anim methods (such as SubAnimName()).
Parameters:
i This is the index of the sub-anim to return.
Default Implementation:
{ return NULL };

Reimplemented from MSPluginMtl.

MSTR SubAnimName ( int  i ) [virtual]
Remarks:
This method returns the name of the 'i-th' sub-anim to appear in track view. The system has no idea what name to assign to the sub-anim (it only knows it by the virtual array index), so this method is called to retrieve the name to display. Developer need to make sure the 'i-th' SubAnim() is non-NULL or this method will fail.
Parameters:
i The index of the parameter name to return
Returns:
The name of the 'i-th' parameter.

Reimplemented from MSPluginMtl.

int NumParamBlocks ( ) [inline, virtual]
Remarks:
This method is available in release 3.0 and later only.

This method returns the number of ParamBlock2s in this instance.
Default Implementation:
{ return 0; }

Reimplemented from MSPluginMtl.

{ return pblocks.Count(); }
IParamBlock2* GetParamBlock ( int  i ) [inline, virtual]
Remarks:
This method return 'i-th' ParamBlock2 in this instance (or NULL if not available).
Parameters:
i The zero based index of the ParamBlock2 to return.
Default Implementation:
{ return NULL; }

Reimplemented from MSPluginMtl.

{ return pblocks[i]; }
IParamBlock2* GetParamBlockByID ( BlockID  id ) [inline]
void* GetInterface ( ULONG  id ) [inline, virtual]

Inherited from Animatable.

Returns a pointer to the interface.

Parameters:
id - The id of the interface.
Returns:
A Pointer to the Interface

Reimplemented from MSPluginMtl.

                    { 
                        if (id == I_MAXSCRIPTPLUGIN) return (MSPlugin*)this; 
                        else if (id == IID_IReshading) return delegate->GetInterface(id); 
                        else return MSPluginMtl::GetInterface(id); 
                    }
BaseInterface* GetInterface ( Interface_ID  id ) [inline, virtual]

Inherited from Animatable.

Returns a pointer to the Base Interface for the interface ID passed.

Parameters:
id - The unique ID of the interface to get
Returns:
A Pointer to the Interface

Reimplemented from MtlBase.

    {
        return delegate ? delegate->GetInterface(id) : NULL;
    }
int NumRefs ( ) [virtual]

Returns the total number of references this ReferenceMaker can hold.

The plugin implements this method to indicate the total number of of references it can make. This includes all references whether they are NULL (inactive) or non-NULL (active) at the time when this method is called. A plugin can hold a variable number of references, thus the return value of this method is not to be cached and reused by client code.

Returns:
The total number of references this plugin can hold. The default implementation is return 0.

Reimplemented from MSPluginMtl.

RefTargetHandle GetReference ( int  i ) [virtual]

Returns the 'i-th' reference.

The plugin implements this method to return its 'i-th' reference. The plug-in simply keeps track of its references using an integer index for each one. This method is normally called by the system.

Parameters:
i - The index of the reference to retrieve. Valid values are from 0 to NumRefs()-1.
Returns:
The reference handle of the 'i-th' reference. Note that different calls to this method with the same 'i' value can result in different reference handles being retrieved, as the plugin changes the scene objects it references as its 'i-th' reference.

Reimplemented from MSPluginMtl.

virtual void SetReference ( int  i,
RefTargetHandle  rtarg 
) [protected, virtual]

Stores a ReferenceTarget as its 'i-th' reference`.

The plugin implements this method to store the reference handle passed to it as its 'i-th' reference. In its implementation of this method, the plugin should simply assign the reference handle passed in as a parameter to the member variable that holds the 'i-th' reference. Other reference handling methods such as ReferenceMaker::DeleteReference(), or ReferenceMaker::ReplaceReference() should not be called from within this method. The plugin itself or other plugins should not call this method directly. The system will call this method when a new reference is created or an existing one is replaced by calling ReferenceMaker::ReplaceReference().

Parameters:
i - The index of the reference to store. Valid values are from 0 to NumRefs()-1.
rtarg - The reference handle to store.

Reimplemented from MSPluginMtl.

RefTargetHandle Clone ( RemapDir remap ) [virtual]

This method is used by 3ds Max to clone an object.

See also:
CloneRefHierarchy(), class RemapDir This method is called by 3ds Max to have the plugin clone itself. The plug-in's implementation of this method should copy both the data structure and all the data residing in the data structure of this reference target. The plugin should clone all its references as well. Also, the plug-in's implementation of this method must call BaseClone(). In order for classes derived from this class to clone cleanly, the Clone method should just create the new instance, and then call an implementation of BaseClone that clones the references and copies any other necessary data. For example:
            class MyDerivedPlugin
                : public MyBasePlugin
            {
                const int MY_REFERENCE = 1;

                ReferenceTarget* Clone(RemapDir& remap)
                {
                    ReferenceTarget* result = new MyDerivedPlugin();
                    BaseClone(this, result, remap);
                    return result;
                }

                void BaseClone(ReferenceTarget* from, ReferenceTarget* to, RemapDir& remap)
                {
                    if (!to || !from || from == to)
                        return;    
                    MyBasePlugin::BaseClone(from, to, remap);
                    to->ReplaceReference(MY_REFERENCE, remap->CloneRef(from->GetReference(MY_REFERENCE)));
                }
            };

This method should not be directly called by plug-ins. Instead, either RemapDir::CloneRef() or CloneRefHierachy() should be used to perform cloning. These methods ensure that the mapping from the original object to the clone is added to the RemapDir used for cloning, which may be used during backpatch operations

Note:
See the remarks in method BaseClone() below.
Parameters:
remap - A RemapDir instance used for remapping references during a Clone.
Returns:
A pointer to the cloned item.

Reimplemented from MSPluginMtl.

int BuildMaps ( TimeValue  t,
RenderMapsContext rmc 
) [inline, virtual]
Remarks:
This method is called for a plug-in to do any work it needs to do prior to rendering. For example this is used by the 3ds Max Mirror and Auto Reflect materials to render their bitmaps.
Parameters:
t The current time.
rmc Provides information about the view being rendered and can provide access to the global rendering environment information via RenderGlobalContext *gc = rmc.GetGlobalContext(). See Class RenderMapsContext and Class RenderGlobalContext.
Returns:
Nonzero on success; zero on failure. In the case of failure the renderer is halted (rendering is cancelled).

Reimplemented from MSPluginMtl.

{ return delegate->BuildMaps(t, rmc); }
ULONG Requirements ( int  subMtlNum ) [inline, virtual]
Remarks:
This method returns the cumulative requirements of the material and its sub-materials and maps. The default implementation just ORs together the local requirements of the material with the requirements of all its children. Most materials will only need to implement LocalRequirements().
Parameters:
subMtlNum Specifies the number of the sub-material whose requirements should be returned. -1 may be used to return a value generated by looping over all the sub-materials and ORing together the requirements.
Returns:
See Material Requirements Flags.
Default Implementation:
The default implementation automatically traverses the sub-material/map tree. On any MtlBase that returns TRUE for IsMultiMtl() it will only recursively call the sub material (or map) for the subMtlNum called. The exception to this is when subMtlNum<0: in this case all sub-mtls and submaps are enumerated. Therefore the LocalRequirements() method below only needs to consider the material or map itself, not the sub-mtls and sub-maps.

Reimplemented from MSPluginMtl.

{ return delegate->Requirements(subMtlNum); }
ULONG LocalRequirements ( int  subMtlNum ) [inline, virtual]
Remarks:
Specifies various requirements for this material. The value returned from this method should not include requirements of its sub-materials and sub-maps.
Parameters:
subMtlNum Specifies the number of the sub-material whose requirements should be returned.
Returns:
See Material Requirements Flags.
Default Implementation:
{ return 0; }

Reimplemented from MSPluginMtl.

{ return delegate->LocalRequirements(subMtlNum); }
void MappingsRequired ( int  subMtlNum,
BitArray mapreq,
BitArray bumpreq 
) [inline, virtual]
Remarks:
This method gives the UVW channel requirements of the material and its tree. The default implementation just OR's together the local mapping requirements of the material with the requirements of all its children. For most materials, all they need to implement is the LocalMappingsRequired() method.
Parameters:
subMtlNum Specifies the number of the sub-material whose mapping information is retrieved.
mapreq This array of bits is initialized to an empty set with MAX_MESHMAPS elements. Each bit corresponds to a mapping channel. Set a bit to one to indicate the material requires the corresponding UVW channel.
bumpreq This array of bits is initialized to an empty set with MAX_MESHMAPS elements. Each bit corresponds to a mapping channel. Set a bit to one to indicate the material requires the corresponding bump mapping channel.

Reimplemented from MSPluginMtl.

{ delegate->MappingsRequired(subMtlNum, mapreq, bumpreq); } 
void LocalMappingsRequired ( int  subMtlNum,
BitArray mapreq,
BitArray bumpreq 
) [inline, virtual]
Remarks:
This method specifies UVW channel requirements for the material: This method should not include UVW channel requirements of any sub-materials and sub-maps.
Parameters:
subMtlNum Specifies the number of the sub-material whose mapping information is retrieved.
mapreq This array of bits is initialized to an empty set with MAX_MESHMAPS elements. Each bit corresponds to a mapping channel. Set a bit to one to indicate the material requires the corresponding UVW channel.
bumpreq This array of bits is initialized to an empty set with MAX_MESHMAPS elements. Each bit corresponds to a mapping channel. Set a bit to one to indicate the material requires the corresponding bump mapping channel.
Default Implementation:
{}
Sample Code:
All 2D textures that use UVGen or otherwise select mapping channels need to implement this method Here's an example:

            void LocalMappingsRequired(int subMtlNum, BitArray & mapreq, BitArray &bumpreq)
            {
                uvGen->MappingsRequired(subMtlNum,mapreq,bumpreq);
            }
All 3D textures that use the XYZGen to put up a coordinates rollup must implement this method. Here's an example:
            void LocalMappingsRequired(int subMtlNum, BitArray & mapreq,BitArray &bumpreq)
            {
                xyzGen->MappingsRequired(subMtlNum,mapreq,bumpreq);
            }

Reimplemented from MSPluginMtl.

{ delegate->LocalMappingsRequired(subMtlNum, mapreq, bumpreq); }
BOOL IsMultiMtl ( ) [inline, virtual]
Remarks:
This method returns TRUE for materials or textures that select sub-materials based on submaterial number (for example a mesh faceMtlIndex).

The only materials for which this method should return TRUE are those that choose to use one of their sub-maps or sub-mtls based on the submaterial number. For the majority of materials and maps, they should return FALSE, and in that case all of the submaterials and maps are enumerated by MtlBase::Requirements().
Default Implementation:
{ return FALSE; }

Reimplemented from MSPluginMtl.

{ return delegate->IsMultiMtl(); }
int NumSubTexmaps ( ) [virtual]
Remarks:
Returns the number of sub-textures managed by this material or texture.
Default Implementation:
{ return 0; }

Reimplemented from MSPluginMtl.

Texmap* GetSubTexmap ( int  i ) [virtual]
Remarks:
Returns a pointer to the 'i-th' sub-texmap managed by the material or texture.

Note: For the 3ds Max Standard material, the sub-texmap indexes used with this method are listed in Texture Map Indices.
Parameters:
int i

Specifies the texmap to return.
Default Implementation:
{ return NULL; }

Reimplemented from MSPluginMtl.

void SetSubTexmap ( int  i,
Texmap m 
) [virtual]
Remarks:
Stores the 'i-th' sub-texmap managed by the material or texture.

Note: For the 3ds Max Standard material, the sub-texmap indexes used with this method are listed in Texture Map Indices.
Parameters:
int i

The index of the storage for the texmap.

Texmap *m

The texmap to store.
Default Implementation:
{}

Reimplemented from MSPluginMtl.

MSTR GetSubTexmapSlotName ( int  i ) [virtual]
Remarks:
This method returns the slot name of the 'i-th' sub-texmap. This name appears in the materials editor dialog. For instance, if you are in a material and then you go down into a map, this is the name that appears just below the 'Get Material' icon. For example, in the Standard material when you choose one of the maps, the map name appears to let you know which slot you are working on. For the Standard material, this may be "Ambient", "Diffuse", "Specular", etc.
Parameters:
int i

Specifies the slot whose name is returned.
Default Implementation:
The default implementation returns an empty ("") string.

Reimplemented from MSPluginMtl.

void Update ( TimeValue  t,
Interval valid 
) [virtual]
Remarks:
A material has a Shade() method, and a texture map has a EvalColor() method. These are called by the renderer for every pixel. This method is called before rendering begins to allow the plug-in to evaluate anything prior to the render so it can store this information. In this way this information does not need to be calculated over and over for every pixel when Shade() or EvalColor() is called. This allows texture and material evaluation to be more efficient. It is generally called once at the start of each frame, or during interactive playback when the time changes. It is not guaranteed to get called on every frame, because if you returned a validity interval that covers several frames, your parent material won't bother to call you if the current frame is still in that interval.
Parameters:
t The current time.
valid The validity interval to update to reflect the validity interval of the material or texture at the time passed.

Reimplemented from MSPluginMtl.

void Reset ( ) [inline, virtual]
Remarks:
This method is called to reset the material or texmap back to its default values. This should be done by calling the Reset method of the material or texture map plugin's class descriptor (ClassDesc2::Reset). In addition, the plugin can execute any other initialization code it has. Example from maxsdk\samples\materials\dblsided.cpp
            void DoubleSided::Reset() {
                dblsidedCD.Reset(this, TRUE); // Resets all pb2's
                Init();
            } 
Note:
When migrating plugins from ClassDesc to ClassDesc2 and IParamBlock2, do not forget to update this method to call the class descriptor's Reset method. If the plugin's Reset tries to replace parameter block objects based on IParamBlock2 that use the P_AUTO_UI flag, the UI code will continue to hold a pointer to the replaced parameter block, and this will lead to problems.

Reimplemented from MSPluginMtl.

{ delegate->Reset(); pc->cd2->Reset(this, TRUE); }
Interval Validity ( TimeValue  t ) [virtual]
Remarks:
This method is called to determine the validity interval of the material or texture.
Parameters:
t Specifies the time about which to compute the validity interval.
Returns:
The validity interval of the item at the specified time.

Reimplemented from MSPluginMtl.

ParamDlg* CreateParamDlg ( HWND  hwMtlEdit,
IMtlParams imp 
) [virtual]
Remarks:
This method gets called when the material or texture is to be displayed in the material editor parameters area. The plug-in should allocate a new instance of a class derived from ParamDlg to manage the user interface.

Note: The following is a discussion of this CreateParamDlg() method, and the SetDlgThing() method, and the way they relate to the ParamMap2 system. A good example for this discussion is a texture map which typically has several rollouts, say its texmap parameters, a UVW coordinates rollout, and an Output rollout.

The normal way for a texmap to implement these other (common) rollouts is for the it to create a UVGen instance and a TextureOutput instance as 'sub-objects' in the map and then ask them to put up their rollouts when it is asked to do so by the Materials Editor (in CreateParamDlg()). The Materials Editor requires a ParamDlg pointer back from the CreateParamDlg() on which it calls methods to control the UI, such as time change updates or loading up a new texmap of the same class into the UI when the user switches them, so that the whole UI doesn't need to be rebuilt.

Prior to the ParamMap2 system, a texmap would implement its own ParamDlg subclass and would keep track of the UVGen and TextureOutput ParamDialogs and pass on any time change or SetThing() calls to them. ParamMap2 introduced its own ParamDlg subclass (Class IAutoMParamDlg) that you can ask it to build for you and have manage all interaction with the Materials Editor automatically. As before, this still needs to know about the other (sub-object) ParamDlgs, and so it has the ability to keep a list of 'secondary' ParamDlgs to which it passes on the SetTime()s and SetThing()s.

When the Materials Editor asks the texmap to CreateParamDlg(), the texmap asks its ClassDesc2 to build one of these (ClassDesc2::CreateParamDlgs()). If the texmap itself has multiple ParamBlock2s, CreateParamDlgs() builds one ParamDlg per pblock/rollout, makes the first of them a 'master' and adds the rest as secondary ParamDlgs. The texmap then asks the UVGen and TextureOutput objects to CreateParamDlg() for their rollouts and adds them to the master IAutoMParamDlg also.

Now consider the need for the SetDlgThing() method below. It is related to the SetThing() method that the Materials Editor calls on the 'master' ParamDlg to switch into the UI a texmap of the same class as that currently in the UI. Normally, the master IAutoParamDlg would propagate the SetThing() to its registered secondary ParamDlgs. In the case of multiple paramblock2s in the texmap, this would be correct, since the 'thing' in this case is the incoming texmap. But this doesn't work for the secondary UVGen and TextureOutput ParamDlgs; their 'things' are the UVGen and TextureOutput subobjects of the incoming map. So, IAutoParamDlg first calls SetDlgThing() on the incoming texmap so that it gets a chance to call the correct SetThing()s on the sub-object ParamDlgs with the appropriate incoming sub-objects. A clear example of this is in Gradient::SetDlgThing() in /MAXSDK/SAMPLES/MATERIALS/GRADIENT.CPP. It is called once for each secondary ParamDlg. For those ParamDlgs that have special SetThing() requirements, it does the appropriate sub-object SetThing() and returns TRUE. If it does no special handling for a particular ParamDlg, it returns FALSE, signaling to the IAutoMParamDlg that it should do the standard SetThing() propagation for that dialog.

The Render Effects dialog has a similar arrangement to the Materials Editor for controlling Effect UI and so there is an IAutoEParamDlg that works exactly the same way as the IAuotMParamDlg.
Parameters:
hwMtlEdit The window handle of the materials editor.
imp The interface pointer for calling methods in 3ds Max.
Returns:
A pointer to the created instance of a class derived from ParamDlg.

Reimplemented from MSPluginMtl.

IOResult Save ( ISave isave ) [inline, virtual]

Reimplemented from MSPluginMtl.

{ return MSPluginMtl::Save(isave); } // return delegate->Save(isave); }
IOResult Load ( ILoad iload ) [inline]

Reimplemented from MSPluginMtl.

{ return MSPluginMtl::Load(iload); } // return delegate->Load(iload); }
ULONG GetGBufID ( ) [inline]
Remarks:
Implemented by the System.

Returns the G-buffer ID of this material.

Reimplemented from MSPluginMtl.

{ return delegate->GetGBufID(); }
void SetGBufID ( ULONG  id ) [inline]
Remarks:
Implemented by the System.

Sets the G-buffer ID of this material.

Reimplemented from MSPluginMtl.

{ delegate->SetGBufID(id); }
void EnumAuxFiles ( AssetEnumCallback nameEnum,
DWORD  flags 
) [inline, virtual]
Remarks:
This is an implementation of the Animatable method. This default implementation simply recurses, skipping inactive subTexmaps if appropriate.

Reimplemented from MSPluginMtl.

    {
        if ((flags&FILE_ENUM_CHECK_AWORK1)&&TestAFlag(A_WORK1)) return; // LAM - 4/21/03
        ReferenceTarget::EnumAuxFiles(assetEnum, flags);
    }
PStamp* GetPStamp ( int  sz ) [inline, virtual]
Remarks:
Implemented by the System.

Returns a pointer to the postage stamp image for the file.
Parameters:
sz One of the following values:

PS_SMALL for small (32x32) images.
PS_LARGE for large (88x88) images.
PS_TINY for tiny (24x24) images.

Reimplemented from MSPluginMtl.

{ return delegate->GetPStamp(sz); }
PStamp* CreatePStamp ( int  sz ) [inline]

Reimplemented from MSPluginMtl.

{ return delegate->CreatePStamp(sz); }          
void DiscardPStamp ( int  sz ) [inline, virtual]
Remarks:
Implemented by the System.

Discards the postage stamp image.
Parameters:
sz One of the following values:

PS_SMALL for small (32x32) images.
PS_LARGE for large (88x88) images.
PS_TINY for tiny (24x24) images.

Reimplemented from MSPluginMtl.

BOOL SupportTexDisplay ( ) [inline, virtual]
Remarks:
Returns TRUE if this texture supports being used in the interactive renderer; otherwise FALSE. If the texture does return TRUE it is expected to implement the methods ActivateTexDisplay() and GetActiveTexHandle().
Default Implementation:
{ return FALSE; }

Reimplemented from MSPluginMtl.

{ return delegate->SupportTexDisplay(); }
DWORD_PTR GetActiveTexHandle ( TimeValue  t,
TexHandleMaker thmaker 
) [inline, virtual]
Remarks:
This method is called to retrieve a texture handle to this texture map.
Parameters:
t The time to return the texture handle.
thmaker This class provides methods for creating a texture handle from a 3ds Max bitmap and a Windows DIB. It also has a method to retrieve the required size of the texture map. See Class TexHandleMaker.
Returns:
The texture handle.
Default Implementation:
{return 0;}

Reimplemented from MSPluginMtl.

{ return delegate->GetActiveTexHandle(t, thmaker); }
void ActivateTexDisplay ( BOOL  onoff ) [inline, virtual]
Remarks:
This method is called when the usage of the texture the interactive renderer changes. This method must only be implemented if SupportTexDisplay() returns TRUE. This method does not cause the texture map to be drawn in the viewport but should be called with TRUE as the argument before this can occur. For viewport drawing of textures refer to Interface::ActivateTexture() and Interface::DeActivateTexture() instead.
Parameters:
onoff TRUE if the texture is being used; FALSE if it is no longer being used.
Default Implementation:
{}

Reimplemented from MSPluginMtl.

BOOL SupportsMultiMapsInViewport ( ) [inline, virtual]
Remarks:
Returns TRUE if this material supports the display of multi-maps in the viewports (interactive renderer); FALSE if it doesn't.
Default Implementation:
{ return FALSE; }

Reimplemented from MSPluginMtl.

void SetupGfxMultiMaps ( TimeValue  t,
Material mtl,
MtlMakerCallback cb 
) [inline, virtual]
Remarks:
This method is called to initialize the interactive renderer Material passed with the properties of this MtlBase.

If a MtlBase (material or texmap) wants to display multiple textures in the viewports, it implements

SupportsMultiMapsInViewport() to return TRUE, and implements SetupGfxMultiMaps to store the necessary information in the Material passed in, including the TextureInfo's for each texture.

The MtlMakerCallback passed in to SetupGfxMultiMaps provides functions to help in setting up the "Material" data structure. The function NumberTexturesSupported() lets you know the capabilities of the current hardware, so you can adapt accordingly. The function GetGfxTexInfoFromTexmap fills in the fields of a TextureInfo except the texHandle and texture ops.

The implementation of SetupGfxMultiMaps must create the "texHandle" for each of the textures described in its TextureInfo array. It typically does this by calling the submap's GetVPDisplayDIB() method, and then creates the texHandle by calling the callBack function MakeHandle(bmi). To avoid doing this calculation when not necessary it is best to save the texHandles along with their validity intervals. Then when SetupGfxMultiMaps is called, if valid texHandles are already in hand they can just be used without recomputing.
Parameters:
t The time at which to evaluate the material.
mtl Points to the interactive renderer material to update.
cb This callback object is provided as a helper to fill in the Material properties above. See Class MtlMakerCallback.
Default Implementation:
{}

Reimplemented from MSPluginMtl.

{ delegate->SetupGfxMultiMaps(t, mtl, cb); }
ReferenceTarget* GetRefTarget ( ) [inline, virtual]
Remarks:
Implemented by the System.

The implementation of this method is provided by MtlBase. It returns its this pointer.

Reimplemented from MSPluginMtl.

{ return delegate->GetRefTarget(); }
BOOL DontKeepOldMtl ( ) [inline, virtual]
Remarks:
Return TRUE to prevent the Replace Material (Discard old material? / Keep old material as sub-material?) dialog from being presented to the user; FALSE to allow it to be presented. This allows a plug-in to control the display of this dialog when being created in a Material Editor slot.
Default Implementation:
{ return FALSE; }

Reimplemented from Mtl.

{ return TRUE; }
MtlBase* GetActiveTexmap ( ) [inline]
Remarks:
Implemented by the System.

Returns a pointer to the active texture map used in the interactive renderer.

Reimplemented from MSPluginMtl.

{ return delegate->GetActiveTexmap(); } 
void SetActiveTexmap ( MtlBase txm ) [inline]
Remarks:
Implemented by the System.

Stores the pointer to the active texture map used in the interactive renderer. Note that this method does not do everything required to update the viewports with the new texmap. To accomplish that call Interface::ActivateTexture().

Reimplemented from MSPluginMtl.

Color GetAmbient ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the ambient color of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.

Reimplemented from MSPluginMtl.

{ return delegate->GetAmbient(mtlNum, backFace); }
Color GetDiffuse ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the diffuse color of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.

Reimplemented from MSPluginMtl.

{ return delegate->GetDiffuse(mtlNum, backFace); }      
Color GetSpecular ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the specular color of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.

Reimplemented from MSPluginMtl.

{ return delegate->GetSpecular(mtlNum, backFace); }
float GetShininess ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the shininess value of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.

Reimplemented from MSPluginMtl.

{ return delegate->GetShininess(mtlNum=0, backFace); }
float GetShinStr ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the shininess strength value of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.

Reimplemented from MSPluginMtl.

{ return delegate->GetShinStr(mtlNum=0, backFace); }        
float GetXParency ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the transparency value of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.

Reimplemented from MSPluginMtl.

{ return delegate->GetXParency(mtlNum=0, backFace); }
BOOL GetSelfIllumColorOn ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns TRUE if the Self Illumination Color is on (checked) for the specified material; otherwise FALSE.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.
Default Implementation:
{ return TRUE; }

Reimplemented from MSPluginMtl.

{ return delegate->GetSelfIllumColorOn(mtlNum, backFace); } 
float GetSelfIllum ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the self illumination value of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.
Default Implementation:
{ return 0.0f; }

Reimplemented from MSPluginMtl.

{ return delegate->GetSelfIllum(mtlNum, backFace); } 
Color GetSelfIllumColor ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the Self Illumination Color of the specified material for use in the interactive renderer.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.
Default Implementation:
{ Color c( .0f,.0f,.0f); return c; }

Reimplemented from MSPluginMtl.

{ return delegate->GetSelfIllumColor(mtlNum, backFace); } 
Sampler* GetPixelSampler ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns a pointer to the Sampler used for the specified sub-material.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.
Default Implementation:
{ return NULL; }

Reimplemented from Mtl.

{ return delegate->GetPixelSampler(mtlNum, backFace); } 
float WireSize ( int  mtlNum = 0,
BOOL  backFace = FALSE 
) [inline, virtual]
Remarks:
Returns the wire size of the material.
Parameters:
mtlNum This is the material index for mult-materials.
backFace If the surface normal of the face is pointing away from the viewer this will be TRUE; otherwise FALSE.
Default Implementation:
{ return 1.0f; }

Reimplemented from MSPluginMtl.

{ return delegate->WireSize(mtlNum, backFace); } 
void SetAmbient ( Color  c,
TimeValue  t 
) [inline, virtual]
Remarks:
This method saves the specified color at the specified time.
Parameters:
c The color to store.
t The time to set this color.

Reimplemented from MSPluginMtl.

{ delegate->SetAmbient(c, t); }     
void SetDiffuse ( Color  c,
TimeValue  t 
) [inline, virtual]
Remarks:
This method saves the specified color at the specified time.
Parameters:
c The color to store.
t The time to set this color.

Reimplemented from MSPluginMtl.

{ delegate->SetDiffuse(c, t); }     
void SetSpecular ( Color  c,
TimeValue  t 
) [inline, virtual]
Remarks:
This method saves the specified color at the specified time.
Parameters:
c The color to store.
t The time to set this color.

Reimplemented from MSPluginMtl.

{ delegate->SetSpecular(c, t); }
void SetShininess ( float  v,
TimeValue  t 
) [inline, virtual]
Remarks:
This method saves the specified shininess at the specified time.
Parameters:
v The shininess value to store.
t The time to set this color.

Reimplemented from MSPluginMtl.

{ delegate->SetShininess(v, t); }
BOOL SupportsShaders ( ) [inline, virtual]
Remarks:
This method returns TRUE if the material supports shaders, otherwise FALSE.
Default Implementation:
{ return FALSE; }

Reimplemented from Mtl.

{ return delegate->SupportsShaders(); }
BOOL SupportsRenderElements ( ) [inline, virtual]

Reimplemented from Mtl.

void Shade ( ShadeContext sc ) [inline, virtual]
Remarks:
This is the main method of the material. This is called by the renderer to compute the color and transparency output returned in sc.out.
Parameters:
sc Describes properties of the pixel to be shaded. The result of this method is returned in the ShadeOutput data member of sc.

Reimplemented from MSPluginMtl.

{ delegate->Shade(sc); }
int NumSubMtls ( ) [virtual]
Remarks:
Returns the number of sub-materials managed by this material.
Default Implementation:
{ return 0; }

Reimplemented from MSPluginMtl.

Mtl* GetSubMtl ( int  i ) [virtual]
Remarks:
Returns a pointer to the 'i-th' sub-material of this material.
Parameters:
i The index of the material to return.
Default Implementation:
{ return NULL; }

Reimplemented from MSPluginMtl.

void SetSubMtl ( int  i,
Mtl m 
) [virtual]
Remarks:
Stores the 'i-th' sub-material of this material.
Parameters:
i The index of the material to store.
m The material pointer to store.
Default Implementation:
{}

Reimplemented from MSPluginMtl.

MSTR GetSubMtlSlotName ( int  i ) [virtual]
Remarks:
This method returns the slot name of the 'i-th' sub-material. This name appears in the materials editor dialog. For instance, if you are in a material and then you go down into a sub-material, this is the name that appears just below the 'Get Material' icon. For example, in the Multi/Sub-Object material when you choose one of the sub-materials, the map name appears to let you know which slot you are working on. For the Multi/Sub-Object material, this is the number of the slot, i.e."#1:", "#2:", "#3:", etc.
Parameters:
i The index of the sub-materials whose slot name should be returned.

Reimplemented from MSPluginMtl.

MSTR GetSubMtlTVName ( int  i ) [inline]
Remarks:
Returns the name of the 'i-th' sub-material that should appear in track view.
Parameters:
i The index of the sub-materials whose track view name should be returned.

Reimplemented from MSPluginMtl.

{ return GetSubMtlSlotName(i); }                      
float GetDynamicsProperty ( TimeValue  t,
int  mtlNum,
int  propID 
) [inline, virtual]
Remarks:
This method returns the specified dynamics property of the material at the specified time.
Parameters:
t The time to return the dynamics property.
mtlNum The index of the sub-material or zero if this is a base material.
propID Specifies the type of property. One of the following values:

DYN_BOUNCE
The bounce coefficient. Values in the range 0.0 to 1.0.

DYN_STATIC_FRICTION
The static friction property. Values in the range 0.0 to 1.0.

DYN_SLIDING_FRICTION
The sliding friction property. Values in the range 0.0 to 1.0.
Default Implementation:
The default implementation for Mtl will handle all multi-materials. All root level materials (for instance Standard) need to implement this method.

Reimplemented from MSPluginMtl.

{ return delegate->GetDynamicsProperty(t, mtlNum, propID); } 
void SetDynamicsProperty ( TimeValue  t,
int  mtlNum,
int  propID,
float  value 
) [inline, virtual]
Remarks:
This method sets the specified dynamics property of the material at the specified time.
Parameters:
t The time at which to set the value.
mtlNum The sub-material number for a multi-material.
propID Specifies the type of property. One of the following values:

DYN_BOUNCE
The bounce coefficient. Values in the range 0.0 to 1.0.

DYN_STATIC_FRICTION
The static friction property. Values in the range 0.0 to 1.0.

DYN_SLIDING_FRICTION
The sliding friction property. Values in the range 0.0 to 1.0.
value The value to set.
Default Implementation:
The default implementation for Mtl will handle all multi-materials. All root level materials (for instance Standard) need to implement this method.

Reimplemented from MSPluginMtl.

{ delegate->SetDynamicsProperty(t, mtlNum, propID, value); } 
float EvalDisplacement ( ShadeContext sc ) [inline, virtual]
Remarks:
Returns the amount of displacement along the normal of the surface at the point as specified by the ShadeContext.
Parameters:
sc This contains the details of the point being displaced.
Default Implementation:
{ return 0.0f; }

Reimplemented from MSPluginMtl.

{ return delegate->EvalDisplacement(sc); } 
Interval DisplacementValidity ( TimeValue  t ) [inline, virtual]
Remarks:
Returns the validity interval of the displacement mapping around the specified time.
Parameters:
t The Interval returned reflects the validity around this time.
Default Implementation:
{ return FOREVER; }

Reimplemented from MSPluginMtl.

{ return delegate->DisplacementValidity(t); } 
bool IsOutputConst ( ShadeContext sc,
int  stdID 
) [inline, virtual]
Remarks:
This method returns TRUE if the evaluated color/value (output) is constant over all possible inputs described by the shade context. If it cannot determine the correct answer, it returns FALSE.
Parameters:
sc This describes the context of the question.
stdID The ID of the channel in question. See Texture Map Indices.
Default Implementation:
{ return FALSE; }

Reimplemented from MSPluginMtl.

{ return delegate->IsOutputConst( sc, stdID ); }
bool EvalColorStdChannel ( ShadeContext sc,
int  stdID,
Color outClr 
) [inline, virtual]
Remarks:
This method evaluates the material on a single standard texmap channel over an area described in the ShadeContext. A return value of FALSE indicates that the color could not be evaluated.

If there's no texmap defined for a channel or the output of the texmap is not "meaningful", the raw color stored by the material or shader is returned. (The output of a texmap is meaningful in a given ShadeContext if it is the same as when the scene is rendered. If the map cannot determine whether the output value is the same as when rendered, it should not be meaningful.)

Note that the output color is not clamped. If the method is called with a monochrome channel ID, the result value is copied in the R, G and B components of the Color structure.

As a default implementation, this method sets the output color to black and returns FALSE.
Parameters:
sc This describes the context in which the material should be evaluated.
stdID The ID of the channel to perform evaluation on. See Texture Map Indices.
outClr The result of the evaluation.
Default Implementation:
{ return FALSE; }

Reimplemented from MSPluginMtl.

{ return delegate->EvalColorStdChannel( sc, stdID, outClr ); }
bool EvalMonoStdChannel ( ShadeContext sc,
int  stdID,
float &  outVal 
) [inline, virtual]

Reimplemented from MSPluginMtl.

{ return delegate->EvalMonoStdChannel( sc, stdID, outVal ); }
int SetProperty ( ULONG  id,
void *  data 
) [inline, virtual]
Remarks:
This is a general method for adding properties, when defining a new Interface would be too cumbersome. This method provides another way to extend the class without actually adding any methods. Sample code that implements this method to add properties to the property list is in /MAXSDK/SAMPLES/CONTROLLERS/PATHCTRL.CPP. See below.
Parameters:
id The id for the property.
data A pointer to the data to store.
Returns:
Nonzero if the property was set; otherwise zero.
Default Implementation:
{ return 0; }
Sample Code:
This code is from /MAXSDK/SAMPLES/CONTROLLERS/PATHCTRL.CPP. It is used to save the inverse kinematics user interface parameters of the path controller. It saves the property data on the aprops property list. See the Data Members at the beginning of Animatable for details on aprops.

        int PathPosition::SetProperty(ULONG id, void *data)
        {
            if (id==PROPID_JOINTPARAMS) {
                if (!data) {
                    int index = aprops.FindProperty(id);
                    if (index>=0) {
                        aprops.Delete(index,1);
                    }
                }
                else {
                    JointParamsPath *jp = (JointParamsPath*)GetProperty(id);
                    if (jp) {
                        *jp = *((JointParamsPath*)data);
                        delete (JointParamsPath*)data;
                    }
                    else {
                        aprops.Append(1,(AnimProperty**)&data);
                    }
                }
                return 1;
            } else
            if (id==PROPID_INTERPUI) {
                if (!data) {
                    int index = aprops.FindProperty(id);
                    if (index>=0) {
                        aprops.Delete(index,1);
                    }
                }
                else {
                    InterpCtrlUI *ui = (InterpCtrlUI*)GetProperty(id);
                    if (ui) {
                        *ui = *((InterpCtrlUI*)data);
                    }
                    else {
                        aprops.Append(1,(AnimProperty**)&data);
                    }
                }
                return 1;
            }
            else {
                return Animatable::SetProperty(id,data);
            }
        }

Reimplemented from MtlBase.

{ return delegate->SetProperty( id, data ); }
void* GetProperty ( ULONG  id ) [inline, virtual]
Remarks:
This method is used to retrieve a property specified by the id passed (as stored by SetProperty()).

Note for 3ds Max version 1.1:

Two new property IDs have been added:

PROPID_CLEARCACHES: When passed to a texture map or material, the material should dump any of its caches. For example, the bitmap texture responds to this by freeing the bitmap from memory. For sample code see /MAXSDK/SAMPLES/MATERIALS/BMTEX.CPP.

PROPID_HAS_WSM: When passed to an INode, will return TRUE if the node has World Space Modifiers applied to it or FALSE if it does not. For sample code see /MAXSDK/SAMPLES/IMPEXP/3DSEXP.CPP.

Note for 3ds Max version 1.2:

A new id has been created and assigned the constant:

#define PROPID_EVAL_STEPSIZE_BUG_FIXED 0x1000.

This only effects the evaluation of objects when rendering them using motion blur. Motion blur works by evaluating the object numerous times (at fractions of a frame apart) and combining these images by blending them together.

Originally, 3ds Max would make these evaluations in reverse order within a sub-frame -- from the last one, to the second to the last one, back to the first one. There is a problem with this for certain plug-ins that need to compute their state from time 0 forward. For these objects, the backwards approach may be too computationally intensive.

Both the forward and backward approaches exist in 3ds Max and the developer may choose which method to use. 3ds Max interrogates the object to see how it should handle the evaluation process -- either going backwards or forwards. It calls this method with id set to the constant PROPID_EVAL_STEPSIZE_BUG_FIXED. If a plug-in implements this method to return nonzero, it means the plug-in works correctly using forward stepping, and 3ds Max will use that approach. If a plug-in does not implement this method and handle the id of PROPID_EVAL_STEPSIZE_BUG_FIXED it will return the default value of zero. This means the older method of backwards evaluation will be used.

Therefore, a plug-in object that wants to handle motion blur using forward stepping should implement this method, and if passed an id of PROPID_EVAL_STEPSIZE_BUG_FIXED, should return nonzero.
Parameters:
id The id of the property to retrieve.
Default Implementation:
{ return NULL; }
Sample Code:
This code is from /MAXSDK/SAMPLES/CONTROLLERS/PATHCTRL.CPP. It is used to restore the inverse kinematics user interface parameters of the path controller. It retrieves the property data on the aprops property list. See the Data Members at the beginning of Animatable for details on aprops.

        void* PathPosition::GetProperty(ULONG id)
        {
            if (id==PROPID_INTERPUI || id==PROPID_JOINTPARAMS) {
                int index = aprops.FindProperty(id);
                if (index>=0) {
                    return aprops[index];
                }
                else {
                    return NULL;
                }
            }
            else {
                return Animatable::GetProperty(id);
            }
        }

Reimplemented from MtlBase.

{ return delegate->GetProperty( id ); }

Member Data Documentation


MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd
MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd MSMtlXtnd