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

MSPluginTexmap Class Reference

Search for all occurrences

#include <mxsPlugin.h>

Inheritance diagram for MSPluginTexmap:
Inheritance graph
[legend]

List of all members.

Public Member Functions

  MSPluginTexmap ()
  MSPluginTexmap (MSPluginClass *pc, BOOL loading)
  ~MSPluginTexmap ()
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.
void  RefDeleted ()
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 ()
AColor  EvalColor (ShadeContext &sc)
float  EvalMono (ShadeContext &sc)
Point3  EvalNormalPerturb (ShadeContext &sc)
BOOL  HandleOwnViewPerturb ()
void  GetUVTransform (Matrix3 &uvtrans)
int  GetTextureTiling ()
void  InitSlotType (int sType)
int  GetUVWSource ()
int  GetMapChannel ()
UVGen GetTheUVGen ()
XYZGen GetTheXYZGen ()
void  SetOutputLevel (TimeValue t, float v)
int  LoadMapFiles (TimeValue t)
void  RenderBitmap (TimeValue t, Bitmap *bm, float scale3D=1.0f, BOOL filter=FALSE)
void  RefAdded (RefMakerHandle rm)
  Called after a reference is made to a target.
bool  IsLocalOutputMeaningful (ShadeContext &sc)
bool  IsOutputMeaningful (ShadeContext &sc)

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

MSPluginTexmap ( ) [inline]
{ }
MSPluginTexmap ( MSPluginClass *  pc,
BOOL  loading 
)
~MSPluginTexmap ( ) [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 MSTexmapXtnd.

{ return NULL; } 
void DeleteThis ( )

Reimplemented from MSPlugin.

Reimplemented in MSTexmapXtnd.

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

Reimplemented in MSTexmapXtnd.

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

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

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

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

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

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

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

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

Reimplemented from MSPlugin.

Reimplemented in MSTexmapXtnd.

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

{ if (id == I_MAXSCRIPTPLUGIN) return (MSPlugin*)this; else return Texmap::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 MSTexmapXtnd.

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

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

void RefDeleted ( ) [inline]
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 MSTexmapXtnd.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

IOResult Save ( ISave isave ) [inline, virtual]

Reimplemented from MSPlugin.

Reimplemented in MSTexmapXtnd.

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

Reimplemented from MSPlugin.

Reimplemented in MSTexmapXtnd.

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

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

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

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

{ return MtlBase::GetPStamp(sz); }
PStamp* CreatePStamp ( int  sz ) [inline]
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 MSTexmapXtnd.

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

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

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

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

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

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

{ return MtlBase::GetRefTarget(); }
AColor EvalColor ( ShadeContext sc ) [inline, virtual]
Remarks:
This method is called to evaluate the color of the texture map for the context. This is for channels that have a color such as diffuse, specular, ambient, etc. This method is called for every pixel of the texture.
Parameters:
ShadeContext& sc

Describes the properties of the pixel to evaluate.
Returns:
An AColor object which stores the r, g, b, a values. Note: The alpha is premultiplied, and the alpha value goes into AColor::a.

Implements Texmap.

Reimplemented in MSTexmapXtnd.

{ return AColor (0,0,0); }
float EvalMono ( ShadeContext sc ) [inline, virtual]
Remarks:
Evaluate the map for a "mono" channel. Mono channels are those that don't have a color, but rather a single value. This is for things like shininess, transparency, etc. This just permits a bit of optimization.
Parameters:
ShadeContext& sc

Describes the properties of the pixel to evaluate.
Returns:
A floating point value for the mono channel.
Default Implementation:
{return Intens(EvalColor(sc));}

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::EvalMono(sc); }
Point3 EvalNormalPerturb ( ShadeContext sc ) [inline, virtual]
Remarks:
This method is used for bump mapping to retrieve a perturbation to apply to a normal.
Parameters:
ShadeContext& sc

Describes the properties of the pixel to evaluate.
Returns:
A deflection vector for perturbing the normal.

Implements Texmap.

Reimplemented in MSTexmapXtnd.

{ return Point3(0,0,0); }
BOOL HandleOwnViewPerturb ( ) [inline, virtual]
Remarks:
This query is made of maps plugged into the Reflection or Refraction slots: Normally the view vector is replaced with a reflected or refracted one before calling the map: if the plugged in map doesn't need this, it should return TRUE.
Default Implementation:
{ return FALSE; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

void GetUVTransform ( Matrix3 uvtrans ) [inline, virtual]
Remarks:
This method is called to retrieve the UV transformation matrix for use in the viewports. If a developer is using an instance of UVGen, a method of that class may be called to retrieve the value:

(i.e. { uvGen->GetUVTransform(uvtrans); } ).
Parameters:
Matrix3 &uvtrans

The transformation matrix is returned here.
Default Implementation:
{}

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{Texmap::GetUVTransform(uvtrans); }
int GetTextureTiling ( ) [inline, virtual]
Remarks:
This method is called to get the tiling state of the texture for use in the viewports. This is described by a set of symmetry flags that may be ORed together. If you are using an instance of UVGen to handle the UV user interface you may simply call a method of UVGen to handle this.

For example: { return uvGen->GetTextureTiling(); }
Returns:
See Texture Symmetry Flags.
Default Implementation:
{ return U_WRAP|V_WRAP; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::GetTextureTiling(); }
void InitSlotType ( int  sType ) [inline, virtual]
Remarks:
This method is called to initialize the slot type. This sets the proper button in the coordinate user interface rollup page. If you are using an instance of UVGen to handle the UV user interface you may simply call a method of UVGen to handle this. For example: { if (uvGen) uvGen->InitSlotType(sType); }
Parameters:
int sType

See Map Slot Types.
Default Implementation:
{}

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ Texmap::InitSlotType(sType); }               
int GetUVWSource ( ) [inline, virtual]
Remarks:
Returns a value indicating where to get the texture vertices for the Texmap.
Returns:
One of the following values:

UVWSRC_EXPLICIT

Use explicit mesh texture vertices from one of the mapping channels (see GetMapChannel() below to determine which one). This uses the UVW coordinates assigned to the object, either through the Generate Mapping Coordinates option in the object's creation parameters, or through mapping modifiers, such as UVW Map.

UVWSRC_EXPLICIT2

Use explicit mesh texture vertices from the Vertex Color Channel.

UVWSRC_OBJXYZ

Generate planar UVW mapping coordinates from the object local XYZ on-the-fly. This corresponds to the "Planar from Object XYZ" option.

UVWSRC_WORLDXYZ

This value is available in release 3.0 and later only.

Generate planar UVW mapping coordinates from the world XYZ on-the-fly. This corresponds to the "Planar From World XYZ" option. Note: this value used for the UVW is the world XYZ, taken directly, with out normalization to the objects bounding box. This differs from "Planar from Object XYZ", where the values are normalized to the object's bounding box.
Default Implementation:
{ return UVWSRC_EXPLICIT; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::GetUVWSource(); }
int GetMapChannel ( ) [inline, virtual]
Remarks:
Returns the map channel being used by the texmap if GetUVWSource() returns UVWSRC_EXPLICIT. The return value should be at least 1. A value of 0 is not acceptable.
Default Implementation:
{ return 1; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::GetMapChannel (); }    // only relevant if above returns UVWSRC_EXPLICIT
UVGen* GetTheUVGen ( ) [inline, virtual]
Remarks:
Texture maps that use a UVGen should implement this method to return a pointer to it.
Default Implementation:
{ return NULL; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::GetTheUVGen(); }  // maps with a UVGen should implement this
XYZGen* GetTheXYZGen ( ) [inline, virtual]
Remarks:
Texture maps that use a XYZGen should implement this method to return a pointer to it.
Default Implementation:
{ return NULL; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::GetTheXYZGen(); } // maps with a XYZGen should implement this
void SetOutputLevel ( TimeValue  t,
float  v 
) [inline, virtual]
Remarks:
Sets the output level at the specified time. It is used to set the output level of the embedded Texout object, principally by importing plug-ins. It is implemented in all Texmaps.
Parameters:
TimeValue t

The time to set the output level.

float v

The value to set.
Default Implementation:
{}

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

int LoadMapFiles ( TimeValue  t ) [inline, virtual]
Remarks:
This method is called prior to rendering to allow the plug-in to load any bitmap files it requires.

Note that LoadMapFiles() is called to load map files only, not to list the missing files. The missing files are listed using the EnumAuxFiles() method, which allows enumerating them without loading them.

Also Note: There is currently not an UnloadMapFiles() method. There are a couple of ways to do this however. One is to call Interface::FreeAllBitmaps(). That method traverses the scene reference hierarchy and calls Animatable::FreeAllBitmaps() on each item. Another approach is to evaluate the Material / TextureMap hierarchy on each material. Then call Animatable::FreeAllBitmaps() yourself in the MtlEnum::proc() shown below.

            class MtlEnum   
            {
                virtual void proc(MtlBase *m) = 0;
            };
            
            void EnumMtlTree(MtlBase *mb, MtlEnum &tenum)
            {
                tenum.proc(mb);
                for (int i=0; i<mb->NumSubTexmaps(); i++) {
                    Texmap *st = mb->GetSubTexmap(i);
                    if (st)
                        EnumMtlTree(st,tenum);
                }
                if (IsMtl(mb)) {
                    Mtl *m = (Mtl *)mb;
                    for (i=0; i<m->NumSubMtls(); i++) {
                        Mtl *sm = m->GetSubMtl(i);
                        if (sm)
                            EnumMtlTree(sm,tenum);
                    }
                }
            }
Now just define a subclass of MtlEnum that does what you want, and call EnumMtlTree. In this particular case it is more efficient than enumerating the entire reference hierarchy. If you do want to enumerate the entire reference hierarchy, here's how:

            class RefEnumProc
            {
                virtual void proc(ReferenceMaker *rm)=0;
            };
            
            void EnumRefs(ReferenceMaker *rm, RefEnumProc &proc)
            {
                proc.proc(rm);
                for (int i=0; i<rm->NumRefs(); i++) {
                    ReferenceMaker *srm = rm->GetReference(i);
                    if (srm) EnumRefs(srm,proc);
                }
            }
Just define a subclass of RefEnumProc that does what you want, and call EnumRefs on the part of the reference hierarchy you want to enumerate. For example:

            class MyEnum: public RefEnumProc
            {
                void proc(ReferenceMaker *rm) {
                    // do something ...
                }
            }
            
            void afunction(Mtl* m)
            {
                MyEnum enumer;
                EnumRefs(m,&enumer);
            }
Parameters:
TimeValue t

The time the maps are being loaded.
Returns:
Always return nonzero from this method.
Default Implementation:
{ return 1; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::LoadMapFiles(t); } 
void RenderBitmap ( TimeValue  t,
Bitmap bm,
float  scale3D = 1.0f,
BOOL  filter = FALSE 
) [inline, virtual]
Remarks:
This method is used to render a 2D bitmap version of this texmap.
Parameters:
TimeValue t

The time at which to render the texmap to the bitmap.

Bitmap *bm

A pointer to a bitmap to render to. This bitmap must be created at the resolution you wish to render to.

float scale3D=1.0f

This is a scale factor applied to 3D Texmaps. This is the scale of the surface in 3d space that is mapped to UV. This controls how much of the texture appears in the bitmap representation.

BOOL filter = FALSE

If TRUE the bitmap is filtered. It is quite a bit slower to rescale bitmaps with filtering on.
Remarks:
Renders the texmap to the specified bitmap.
Parameters:
TimeValue t

The time at which to render the bitmap.

Bitmap *bm

The result is stored in this bitmap. The properties of this bitmap define the resolution, color depth, etc.

float scale3D=1.0f

This is the scale of the surface in 3d space that is mapped to UV.

BOOL filter = FALSE

If TRUE the bitmap is filtered. It is quite a bit slower to rescale bitmaps with filtering on.
Default Implementation:
The default implementation calls Interface::RenderTexmap().

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ Texmap::RenderBitmap(t, bm, scale3D, filter); }
void RefAdded ( RefMakerHandle  rm ) [inline, 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 Texmap.

bool IsLocalOutputMeaningful ( ShadeContext sc ) [inline, virtual]
Remarks:
Returns TRUE if the output of this texmap is meaningful for the given context; it should not take into account subtexmaps. This method is called by IsOutputMeaningful().
Parameters:
ShadeContext& sc

This describes the context of the question.
Default Implementation:
{ return false; }

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

bool IsOutputMeaningful ( ShadeContext sc ) [inline, virtual]
Remarks:
Implemented by the system.

Returns true only if all submaps and itself have a meaningful output.

Returns false if at least one sub-texmap or itself does not have a meaningful output

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. This method can be called before EvalColor() or EvalMono() on a texmap in order to decide whether to call these methods at all or if their return values should be used in further calculations.
Parameters:
ShadeContext& sc

This describes the context of the question.

Reimplemented from Texmap.

Reimplemented in MSTexmapXtnd.

{ return Texmap::IsOutputMeaningful( sc ); }

Member Data Documentation

IMtlParams* ip [static]

MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap
MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap MSPluginTexmap