Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions

MSPluginMtl Class Reference

Search for all occurrences

#include <mxsPlugin.h>

Inheritance diagram for MSPluginMtl:
Inheritance graph
[legend]

List of all members.

Public Member Functions

  MSPluginMtl ()
  MSPluginMtl (MSPluginClass *pc, BOOL loading)
  ~MSPluginMtl ()
HWND  AddRollupPage (HINSTANCE hInst, MCHAR *dlgTemplate, DLGPROC dlgProc, MCHAR *title, LPARAM param=0, DWORD flags=0, int category=ROLLUP_CAT_STANDARD)
void  DeleteRollupPage (HWND hRollup)
IRollupWindow GetRollupWindow ()
ReferenceTarget get_delegate ()
void  DeleteThis ()
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.
RefResult  NotifyRefChanged (Interval changeInt, RefTargetHandle hTarget, PartID &partID, RefMessage message)
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.
MSTR  GetFullName ()
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)
MSTR  GetSubTexmapTVName (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 ()
MtlBase GetActiveTexmap ()
void  SetActiveTexmap (MtlBase *txm)
void  RefDeleted ()
  Called after a references to this is deleted.
void  RefAdded (RefMakerHandle rm)
  Called after a reference is made to a target.
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)
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)
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)

Static Public Member Functions

static RefTargetHandle  create (MSPluginClass *pc, BOOL loading)

Static Public Attributes

static MSAutoMParamDlg masterMDlg
static IMtlParams ip

Protected Member Functions

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

Constructor & Destructor Documentation

MSPluginMtl ( ) [inline]
{ }
MSPluginMtl ( MSPluginClass *  pc,
BOOL  loading 
)
~MSPluginMtl ( ) [inline]

Member Function Documentation

static RefTargetHandle create ( MSPluginClass *  pc,
BOOL  loading 
) [static]
HWND AddRollupPage ( HINSTANCE  hInst,
MCHAR *  dlgTemplate,
DLGPROC  dlgProc,
MCHAR *  title,
LPARAM  param = 0,
DWORD  flags = 0,
int  category = ROLLUP_CAT_STANDARD 
) [virtual]
void DeleteRollupPage ( HWND  hRollup ) [virtual]
IRollupWindow* GetRollupWindow ( ) [virtual]
ReferenceTarget* get_delegate ( ) [inline, virtual]

Implements MSPlugin.

Reimplemented in MSMtlXtnd.

{ return NULL; } 
void DeleteThis ( )

Reimplemented from MSPlugin.

Reimplemented in MSMtlXtnd.

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 Mtl.

Reimplemented in MSMtlXtnd.

{ 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 MtlBase.

Reimplemented in MSMtlXtnd.

{ 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 Animatable.

Reimplemented in MSMtlXtnd.

{ }         
int NumSubs ( ) [inline, 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 Animatable.

Reimplemented in MSMtlXtnd.

{ return pblocks.Count(); }  
Animatable* SubAnim ( int  i ) [inline, 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 Animatable.

Reimplemented in MSMtlXtnd.

{ return pblocks[i]; }
MSTR SubAnimName ( int  i ) [inline, 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 Animatable.

Reimplemented in MSMtlXtnd.

{ return pblocks[i]->GetLocalName(); }
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 Animatable.

Reimplemented in MSMtlXtnd.

{ 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 Animatable.

Reimplemented in MSMtlXtnd.

{ return pblocks[i]; }
IParamBlock2* GetParamBlockByID ( BlockID  id ) [inline]

Reimplemented from MSPlugin.

Reimplemented in MSMtlXtnd.

{ return MSPlugin::GetParamBlockByID(id); }
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 MtlBase.

Reimplemented in MSMtlXtnd.

{ if (id == I_MAXSCRIPTPLUGIN) return (MSPlugin*)this; else return Mtl::GetInterface(id); }
RefResult NotifyRefChanged ( Interval  changeInt,
RefTargetHandle  hTarget,
PartID partID,
RefMessage  message 
) [inline]

Reimplemented from MSPlugin.

                    { 
                        return ((MSPlugin*)this)->NotifyRefChanged(changeInt, hTarget, partID, message); 
                    }
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 ReferenceMaker.

Reimplemented in MSMtlXtnd.

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 ReferenceMaker.

Reimplemented in MSMtlXtnd.

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 ReferenceMaker.

Reimplemented in MSMtlXtnd.

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 ReferenceTarget.

Reimplemented in MSMtlXtnd.

MSTR GetFullName ( ) [inline, virtual]
Remarks:
Implemented by the System.

This method returns the name that appears in the track view. It returns the "Instance Name(class Name)". For example "Green Glass (Standard)". The default implementation should be used.

Reimplemented from MtlBase.

{ return MtlBase::GetFullName(); }
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 MtlBase.

Reimplemented in MSMtlXtnd.

{ return MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

{ return MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

{ return MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

{ MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

{ MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

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

Reimplemented from ISubMap.

Reimplemented in MSMtlXtnd.

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 ISubMap.

Reimplemented in MSMtlXtnd.

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 ISubMap.

Reimplemented in MSMtlXtnd.

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 ISubMap.

Reimplemented in MSMtlXtnd.

MSTR GetSubTexmapTVName ( int  i ) [inline]
Remarks:
Returns the name to appear in Track View of the 'i-th' sub-texmap.
Parameters:
int i

Specifies the sub-texmap whose name is returned.

Reimplemented from ISubMap.

{ return GetSubTexmapSlotName(i); }
void Update ( TimeValue  t,
Interval valid 
) [inline, 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.

Implements MtlBase.

Reimplemented in MSMtlXtnd.

{ }
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.

Implements MtlBase.

Reimplemented in MSMtlXtnd.

{ 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.

Implements MtlBase.

Reimplemented in MSMtlXtnd.

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.

Implements MtlBase.

Reimplemented in MSMtlXtnd.

IOResult Save ( ISave isave ) [inline, virtual]

Reimplemented from MSPlugin.

Reimplemented in MSMtlXtnd.

{ MSPlugin::Save(isave); return MtlBase::Save(isave); }
IOResult Load ( ILoad iload ) [inline]

Reimplemented from MSPlugin.

Reimplemented in MSMtlXtnd.

{ MSPlugin::Load(iload); return MtlBase::Load(iload); }
ULONG GetGBufID ( ) [inline]
Remarks:
Implemented by the System.

Returns the G-buffer ID of this material.

Reimplemented from MtlBase.

Reimplemented in MSMtlXtnd.

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

Sets the G-buffer ID of this material.

Reimplemented from MtlBase.

Reimplemented in MSMtlXtnd.

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 MtlBase.

Reimplemented in MSMtlXtnd.

    {   
        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 MtlBase.

Reimplemented in MSMtlXtnd.

{ return MtlBase::GetPStamp(sz); }
PStamp* CreatePStamp ( int  sz ) [inline]

Reimplemented in MSMtlXtnd.

{ return MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

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 MtlBase.

Reimplemented in MSMtlXtnd.

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 MtlBase.

Reimplemented in MSMtlXtnd.

{ return MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

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 MtlBase.

Reimplemented in MSMtlXtnd.

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 MtlBase.

Reimplemented in MSMtlXtnd.

{ MtlBase::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 MtlBase.

Reimplemented in MSMtlXtnd.

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

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

Reimplemented from Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

void RefDeleted ( ) [inline, virtual]

Called after a references to this is deleted.

This is called after deleting a reference to a reference target, in the case that the target was not deleted. When the last strong reference to a ReferenceTarget is removed, the ReferenceTarget is deleted, the destructor is called, and the memory cleared.

Reimplemented from Mtl.

void RefAdded ( RefMakerHandle  rm ) [virtual]

Called after a reference is made to a target.

This is called after a reference is made to this. If the target (this) needs to know that a reference to made to it, the target (this) can override this function.

Parameters:
rm - The ReferenceMaker creating the reference.

Reimplemented from Mtl.

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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ return Color(0,0,0); }
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ return Color(0,0,0); }        
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ return Color(0,0,0); }
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ return 0.0f; }
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ return 0.0f; }        
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ return 0.0f; }
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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::GetSelfIllumColor(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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ }     
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ }     
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ }
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

{ } 
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.

Implements Mtl.

Reimplemented in MSMtlXtnd.

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

Reimplemented from Mtl.

Reimplemented in MSMtlXtnd.

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 Mtl.

Reimplemented in MSMtlXtnd.

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 Mtl.

Reimplemented in MSMtlXtnd.

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 Mtl.

Reimplemented in MSMtlXtnd.

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 Mtl.

Reimplemented in MSMtlXtnd.

{ 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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

{ Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::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 Mtl.

Reimplemented in MSMtlXtnd.

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

Reimplemented from Mtl.

Reimplemented in MSMtlXtnd.

{ return Mtl::EvalMonoStdChannel( sc, stdID, outVal ); }

Member Data Documentation

IMtlParams* ip [static]

MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl
MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl MSPluginMtl