MSShapeXtnd Class Reference
 
 
 
MSShapeXtnd Class Reference

#include <mxsPlugin.h>

Inheritance diagram for MSShapeXtnd:
MSObjectXtnd< ShapeObject, MSPluginShape > MSPluginShape MSPluginObject< ShapeObject > MSPlugin ShapeObject Value GeomObject Collectable Object BaseObject ReferenceTarget ReferenceMaker Animatable InterfaceServer Noncopyable MaxHeapOperators MaxHeapOperators

Public Member Functions

  MSShapeXtnd (MSPluginClass *pc, BOOL loading)
  ~MSShapeXtnd ()
RefTargetHandle  Clone (RemapDir &remap)
  This method is used by 3ds Max to clone an object.
int  IsRenderable ()
  Indicates whether the object may be rendered.
Mesh GetRenderMesh (TimeValue t, INode *inode, View &view, BOOL &needDelete)
  This method should be implemented by all renderable GeomObjects.
void  InitNodeName (MSTR &s)
  This is the default name of the node when it is created.
SClass_ID  SuperClassID ()
  Retrieves a constant representing the type of the plugin.
int  IntersectRay (TimeValue t, Ray &ray, float &at, Point3 &norm)
  Computes the intersection point of the ray passed and the shape.
int  NumberOfVertices (TimeValue t, int curve=-1)
  This method is used by the Summary Info and Object Properties dialogs to inform the user how many vertices or CVs are in the object.
int  NumberOfCurves ()
  Returns the number of polygons in the shape.
BOOL  CurveClosed (TimeValue t, int curve)
  This method is called to determine if the specified curve of the shape is closed at the time passed.
Point3  InterpCurve3D (TimeValue t, int curve, float param, int ptype=PARAM_SIMPLE)
  This method returns a point interpolated on the entire curve.
Point3  TangentCurve3D (TimeValue t, int curve, float param, int ptype=PARAM_SIMPLE)
  This method returns a tangent vector interpolated on the entire curve.
float  LengthOfCurve (TimeValue t, int curve)
  Returns the length of the specified curve.
int  NumberOfPieces (TimeValue t, int curve)
  Returns the number of sub-curves in a curve.
Point3  InterpPiece3D (TimeValue t, int curve, int piece, float param, int ptype=PARAM_SIMPLE)
  This method returns the interpolated point along the specified sub-curve (segment).
Point3  TangentPiece3D (TimeValue t, int curve, int piece, float param, int ptype=PARAM_SIMPLE)
  Returns the tangent vector on a sub-curve at the specified 'distance' along the curve.
BOOL  CanMakeBezier ()
  This method is called to determine if the shape can be converted to a bezier representation.
void  MakeBezier (TimeValue t, BezierShape &shape)
  Creates the bezier representation of the shape.
ShapeHierarchy OrganizeCurves (TimeValue t, ShapeHierarchy *hier=NULL)
  This method is called to prepare the shape for lofting, extrusion, etc.
void  MakePolyShape (TimeValue t, PolyShape &shape, int steps=PSHAPE_BUILTIN_STEPS, BOOL optimize=FALSE)
  Create a PolyShape representation with optional fixed steps.
int  MakeCap (TimeValue t, MeshCapInfo &capInfo, int capType)
  This method generates a mesh capping info for the shape.
int  MakeCap (TimeValue t, PatchCapInfo &capInfo)
  This method creates a patch cap info out of the shape.
void  CloneSelSubComponents (TimeValue t)
  This method is called to make a copy of the selected sub-object components of the item.
void  AcceptCloneSelSubComponents (TimeValue t)
  This method is called when the user mouses up after shift-cloning a sub-object selection.
void  SelectSubComponent (HitRecord *hitRec, BOOL selected, BOOL all, BOOL invert=FALSE)
  This method is called to change the selection state of the component identified by hitRec.
void  ClearSelection (int selLevel)
  This method is called to clear the selection for the given sub-object level.
void  SelectAll (int selLevel)
  This method is called to select every element of the given sub-object level.
void  InvertSelection (int selLevel)
  This method is called to invert the specified sub-object level.
int  SubObjectIndex (HitRecord *hitRec)
  Returns the index of the sub-object element identified by the HitRecord hitRec.
int  HitTest (TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt, ModContext *mc)
  This method is used in modifier gizmo hit testing.
int  HitTest (TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt)
  This method is called to determine if the specified screen point intersects the item.
void  ActivateSubobjSel (int level, XFormModes &modes)
  When the user changes the selection of the sub-object drop down, this method is called to notify the plug-in.
BOOL  SupportsNamedSubSels ()
  An object that supports sub-object selection can choose to support named sub object selection sets.
void  ActivateSubSelSet (MSTR &setName)
  When the user chooses a name from the drop down list this method is called.
void  NewSetFromCurSel (MSTR &setName)
  If the user types a new name into the named selection set drop down then this method is called.
void  RemoveSubSelSet (MSTR &setName)
  If the user selects a set from the drop down and then chooses Remove Named Selections from the Edit menu this method is called.
void  SetupNamedSelDropDown ()
  To support the Edit Named Selections dialog, plug-ins must implement this method.
int  NumNamedSelSets ()
  To support the Edit Named Selections dialog, plug-ins must implement this method.
MSTR  GetNamedSelSetName (int i)
  To support the Edit Named Selections dialog, plug-ins must implement this method.
void  SetNamedSelSetName (int i, MSTR &newName)
  To support the Edit Named Selections dialog, plug-ins must implement this method.
void  NewSetByOperator (MSTR &newName, Tab< int > &sets, int op)
  To support the Edit Named Selections dialog, plug-ins must implement this method.
void  GetSubObjectCenters (SubObjAxisCallback *cb, TimeValue t, INode *node, ModContext *mc)
  When the user is in a sub-object selection level, the system needs to get the reference coordinate system definition from the current modifier being edited so that it can display the axis.
void  GetSubObjectTMs (SubObjAxisCallback *cb, TimeValue t, INode *node, ModContext *mc)
  When the user is in a sub-object selection level, the system needs to get the reference coordinate system definition from the current modifier being edited so that it can display the axis.
void  Move (TimeValue t, Matrix3 &partm, Matrix3 &tmAxis, Point3 &val, BOOL localOrigin=FALSE)
  When this method is called the plug-in should respond by moving its selected sub-object components.
void  Rotate (TimeValue t, Matrix3 &partm, Matrix3 &tmAxis, Quat &val, BOOL localOrigin=FALSE)
  When this method is called the plug-in should respond by rotating its selected sub-object components.
void  Scale (TimeValue t, Matrix3 &partm, Matrix3 &tmAxis, Point3 &val, BOOL localOrigin=FALSE)
  When this method is called the plug-in should respond by scaling its selected sub-object components.
void  TransformStart (TimeValue t)
  This method is called before the first Move(), Rotate() or Scale() call and before a hold is in effect.
void  TransformHoldingStart (TimeValue t)
  This method is called before the first Move(), Rotate() or Scale() call and after a hold is in effect.
void  TransformHoldingFinish (TimeValue t)
  This method is called after the user has completed the Move(), Rotate() or Scale() operation and before the undo object has been accepted.
void  TransformFinish (TimeValue t)
  This method is called after the user has completed the Move(), Rotate() or Scale() operation and the undo object has been accepted.
void  TransformCancel (TimeValue t)
  This method is called when the transform operation is canceled by a right-click and the undo has been canceled.
MtlID  GetMatID (TimeValue t, int curve, int piece)
  This method provides access to the material IDs of the shape.
BOOL  AttachShape (TimeValue t, INode *thisNode, INode *attachNode)
BOOL  HasUVW ()
  It is called to find out if the object is has UVW coordinates.
void  SetGenUVW (BOOL sw)
  This method is called to change the state of its Generate UVW boolean.
IOResult  Save (ISave *isave)
IOResult  Load (ILoad *iload)
Class_ID  PreferredCollapseType ()
  Implemented by the System.
BOOL  GetExtendedProperties (TimeValue t, MSTR &prop1Label, MSTR &prop1Data, MSTR &prop2Label, MSTR &prop2Data)
  Implemented by the System.
void  RescaleWorldUnits (float f)
  Implemented by the System.
Object MakeShallowCopy (ChannelMask channels)
  This method must make a copy of its "shell" and then shallow copy (see below) only the specified channels.
void  ShallowCopy (Object *fromOb, ChannelMask channels)
  This method copies the specified channels from the fromOb to this and copies the validity intervals.
ObjectState  Eval (TimeValue time)
  This method is called to evaluate the object and return the result as an ObjectState.

Constructor & Destructor Documentation

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

Member Function Documentation

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

int IsRenderable ( ) [inline, virtual]

Indicates whether the object may be rendered.

Some objects such as construction grids and helpers should not be rendered and can return zero.

Returns:
Nonzero if the object may be rendered; otherwise 0.

Reimplemented from MSPluginShape.

{ return delegate->IsRenderable(); }            
Mesh* GetRenderMesh ( TimeValue  t,
INode inode,
View view,
BOOL &  needDelete 
) [inline, virtual]

This method should be implemented by all renderable GeomObjects.

It provides a mesh representation of the object for use by the renderer. Primitives that already have a mesh cached can just return a pointer to it (and set needDelete to FALSE). Implementations of this method which take a long time should periodically call View::CheckForRenderAbort() to see if the user has canceled the render. If canceled, the function can either return NULL, or return a non null pointer with the appropriate value for needDelete. (If needDelete is TRUE a non-null mesh will be deleted.)

Parameters:
t The time to get the mesh.
inode The node in the scene.
view If the renderer calls this method it will pass the view information here. See Class View.
needDelete Set to TRUE if the renderer should delete the mesh, FALSE otherwise.
Returns:
A pointer to the mesh object.

Reimplemented from MSPluginShape.

{ return delegate->GetRenderMesh(t, inode, view, needDelete); }
void InitNodeName ( MSTR s ) [inline, virtual]

This is the default name of the node when it is created.

Parameters:
s The default name of the node is stored here.

Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.

SClass_ID SuperClassID ( ) [inline, virtual]

Retrieves a constant representing the type of the plugin.

Returns:
A super class id that uniquely identifies the type (category) of the plugin. Note that several plugin classes can be of the same type, thus return the same super class id. Plugins are uniquely identified by their class ids. List of Super Class IDs.
See also:
SClass_ID

Reimplemented from MSPluginShape.

int IntersectRay ( TimeValue  t,
Ray ray,
float &  at,
Point3 norm 
) [inline, virtual]

Computes the intersection point of the ray passed and the shape.

Note:
This method has a default implementation and it is not necessary to define this method in classes derived from ShapeObject.
Parameters:
t The time to compute the intersection.
ray Ray to intersect.
at The point of intersection.
norm The surface normal at the point of intersection.
Returns:
Nonzero if a point of intersection was found; otherwise 0.

Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.

{ return delegate->IntersectRay(t, ray, at, norm); }
int NumberOfVertices ( TimeValue  t,
int  curve = -1 
) [inline, virtual]

This method is used by the Summary Info and Object Properties dialogs to inform the user how many vertices or CVs are in the object.

The method is passed a TimeValue and a curve index; if the curve index is <0, the function should return the number of vertices/CVs in the entire shape. Otherwise, it should return the number of vertices/CVs in the specified curve.

Parameters:
t The time at which the number of vertices is to be computed.
curve The curve index. See note above.

Reimplemented from MSPluginShape.

{ return delegate->NumberOfVertices(t, curve); }        
int NumberOfCurves ( ) [inline, virtual]

Returns the number of polygons in the shape.

Reimplemented from MSPluginShape.

{ return delegate->NumberOfCurves(); }                 
BOOL CurveClosed ( TimeValue  t,
int  curve 
) [inline, virtual]

This method is called to determine if the specified curve of the shape is closed at the time passed.

Parameters:
t The time to check.
curve The index of the curve to check.
Returns:
TRUE if the curve is closed; otherwise FALSE.

Reimplemented from MSPluginShape.

{ return delegate->CurveClosed(t, curve); }     
Point3 InterpCurve3D ( TimeValue  t,
int  curve,
float  param,
int  ptype = PARAM_SIMPLE 
) [inline, virtual]

This method returns a point interpolated on the entire curve.

This method returns the point but you don't know which segment the point falls on. See method InterpPiece3D().

Parameters:
t The time to evaluate.
curve The index of the curve to evaluate.
param The 'distance' along the curve where 0 is the start and 1 is the end.
ptype The parameter type for spline interpolation. See List of Parameter Types for Shape Interpolation.
Returns:
The interpolated point on the curve.

Reimplemented from MSPluginShape.

{ return delegate->InterpCurve3D(t, curve, param, ptype); }    
Point3 TangentCurve3D ( TimeValue  t,
int  curve,
float  param,
int  ptype = PARAM_SIMPLE 
) [inline, virtual]

This method returns a tangent vector interpolated on the entire curve.

Also see method TangentPiece3D().

Parameters:
t The time at which to evaluate the curve.
curve The index of the curve to evaluate.
param The 'distance' along the curve where 0.0 is the start and 1.0 is the end. int ptype=PARAM_SIMPLE

The parameter type for spline interpolation. See List of Parameter Types for Shape Interpolation.
Returns:
The tangent vector

Reimplemented from MSPluginShape.

{ return delegate->TangentCurve3D(t, curve, param, ptype); }    
float LengthOfCurve ( TimeValue  t,
int  curve 
) [inline, virtual]

Returns the length of the specified curve.

Note: This method makes no allowance for non-uniform scaling in the object transform. To do that, see the following code fragment (os is the ObjectState with the shape object and xfm is the NodeTM of the shape object node).

        if (os.obj->SuperClassID() == SHAPE_CLASS_ID)
        {
                ShapeObject *sobj;
                sobj = (ShapeObject *) os.obj;
                int cct = sobj->NumberOfCurves();
                PolyShape workShape;
                sobj->MakePolyShape(ip->GetTime(), workShape);
                workShape.Transform(xfm);
                float len = 0.0f;
                for (int i=0; i<cct; i++)
                        len += workShape.lines[i].CurveLength();
        }
Parameters:
t The time at which to compute the length.
curve The index of the curve.

Reimplemented from MSPluginShape.

{ return delegate->LengthOfCurve(t, curve); }  
int NumberOfPieces ( TimeValue  t,
int  curve 
) [inline, virtual]

Returns the number of sub-curves in a curve.

Parameters:
t The time at which to check.
curve The index of the curve.

Reimplemented from MSPluginShape.

{ return delegate->NumberOfPieces(t, curve); }   
Point3 InterpPiece3D ( TimeValue  t,
int  curve,
int  piece,
float  param,
int  ptype = PARAM_SIMPLE 
) [inline, virtual]

This method returns the interpolated point along the specified sub-curve (segment).

For example consider a shape that is a single circle with four knots. If you called this method with curve=0 and piece=0 and param=0.0 you'd get back the point at knot 0. If you passed the same parameters except param=1.0 you'd get back the point at knot 1.

Parameters:
t The time to evaluate the sub-curve.
curve The curve to evaluate.
piece The segment to evaluate.
param The position along the curve to return where 0.0 is the start and 1.0 is the end.
ptype The parameter type for spline interpolation. See List of Parameter Types for Shape Interpolation.
Returns:
The point in world space.

Reimplemented from MSPluginShape.

{ return delegate->InterpPiece3D(t, curve, piece, param, ptype); }  
Point3 TangentPiece3D ( TimeValue  t,
int  curve,
int  piece,
float  param,
int  ptype = PARAM_SIMPLE 
) [inline, virtual]

Returns the tangent vector on a sub-curve at the specified 'distance' along the curve.

Parameters:
t The time to evaluate the sub-curve.
curve The curve to evaluate.
piece The sub-curve (segment) to evaluate.
param The position along the curve to return where 0 is the start and 1 is the end.
ptype The parameter type for spline interpolation. See List of Parameter Types for Shape Interpolation.
Returns:
The tangent vector.

Reimplemented from MSPluginShape.

{ return delegate->TangentPiece3D(t, curve, piece, param, ptype); }         
BOOL CanMakeBezier ( ) [inline, virtual]

This method is called to determine if the shape can be converted to a bezier representation.

Returns:
TRUE if the shape can turn into a bezier representation; otherwise FALSE.

Reimplemented from MSPluginShape.

{ return delegate->CanMakeBezier(); }                  
void MakeBezier ( TimeValue  t,
BezierShape shape 
) [inline, virtual]

Creates the bezier representation of the shape.

Parameters:
t The time to convert.
shape The bezier representation is stored here.

Reimplemented from MSPluginShape.

{ delegate->MakeBezier(t, shape); }     
ShapeHierarchy& OrganizeCurves ( TimeValue  t,
ShapeHierarchy hier = NULL 
) [inline, virtual]

This method is called to prepare the shape for lofting, extrusion, etc.

This methods looks at the shape organization, and puts together a shape hierarchy. This provides information on how the shapes are nested.

Parameters:
t The time to organize the curves.
hier This class provides information about the hierarchy. See Class ShapeHierarchy.

Reimplemented from MSPluginShape.

{ return delegate->OrganizeCurves(t, hier); }       
void MakePolyShape ( TimeValue  t,
PolyShape shape,
int  steps = PSHAPE_BUILTIN_STEPS,
BOOL  optimize = FALSE 
) [inline, virtual]

Create a PolyShape representation with optional fixed steps.

Parameters:
t The time to make the PolyShape.
shape The PolyShape representation is stored here.
steps The number of steps between knots. Values >=0 indicates the use of fixed steps:

PSHAPE_BUILTIN_STEPS
Use the shape's built-in steps/adaptive settings (default).

PSHAPE_ADAPTIVE_STEPS
Force adaptive steps.
optimize If TRUE intermediate steps are removed from linear segments.

Reimplemented from MSPluginShape.

{ delegate->MakePolyShape(t, shape, steps, optimize); } 
int MakeCap ( TimeValue  t,
MeshCapInfo capInfo,
int  capType 
) [inline, virtual]

This method generates a mesh capping info for the shape.

Parameters:
t The time to create the cap info.
capInfo The cap info to update.
capType See Shape Capping Types.
Returns:
Nonzero if the cap info was generated; otherwise zero.

Reimplemented from MSPluginShape.

{ return delegate->MakeCap(t, capInfo, capType); }  
int MakeCap ( TimeValue  t,
PatchCapInfo capInfo 
) [inline, virtual]

This method creates a patch cap info out of the shape.

Only implement this method if CanMakeBezier() returns TRUE.

Parameters:
t The time to create the cap info.
capInfo The cap info to update.
Returns:
Nonzero if the cap info was generated; otherwise zero.

Reimplemented from MSPluginShape.

{ return delegate->MakeCap(t, capInfo); }       
void CloneSelSubComponents ( TimeValue  t ) [inline, virtual]

This method is called to make a copy of the selected sub-object components of the item.

If this is called on an object, the selection level of the object is used to determine which type of sub-objects are cloned. For instance in a Mesh, the selection level determines if selected verticies, edges or faces are cloned. If this is called on a Modifier then the selection level of the modifier is used. Modifiers call Interface::GetModContexts() to get a list of ModContexts, one for each object the modifier is applied to. Then the selected sub-objects are cloned for each object in the list.

Parameters:
t The time at which to clone the selected sub-object components.

Reimplemented from BaseObject.

void AcceptCloneSelSubComponents ( TimeValue  t ) [inline, virtual]

This method is called when the user mouses up after shift-cloning a sub-object selection.

Parameters:
t The time at which the clone of the selected components is being done.

Reimplemented from BaseObject.

void SelectSubComponent ( HitRecord hitRec,
BOOL  selected,
BOOL  all,
BOOL  invert = FALSE 
) [inline, virtual]

This method is called to change the selection state of the component identified by hitRec.

Parameters:
hitRec Identifies the component whose selected state should be set. See Class HitRecord .
selected TRUE if the item should be selected; FALSE if the item should be de-selected.
all TRUE if all components in the HitRecord chain should be selected; FALSE if only the top-level HitRecord should be selected. (A HitRecord contains a Next() pointer; typically you want to do whatever you're doing to all the Next()'s until Next() returns NULL).
invert This is set to TRUE when all is also set to TRUE and the user is holding down the Shift key while region selecting in select mode. This indicates the items hit in the region should have their selection state inverted

Reimplemented from BaseObject.

                                                                               { delegate->SelectSubComponent(hitRec, selected, all, invert); }
void ClearSelection ( int  selLevel ) [inline, virtual]

This method is called to clear the selection for the given sub-object level.

All sub-object elements of this type should be deselected. This will be called when the user chooses Select None from the 3ds Max Edit menu.

Parameters:
selLevel Specifies the selection level to clear.

Reimplemented from BaseObject.

{ delegate->ClearSelection( selLevel); }
void SelectAll ( int  selLevel ) [inline, virtual]

This method is called to select every element of the given sub-object level.

This will be called when the user chooses Select All from the 3ds Max Edit menu.

Parameters:
selLevel Specifies the selection level to select.

Reimplemented from BaseObject.

{ delegate->SelectAll( selLevel); }
void InvertSelection ( int  selLevel ) [inline, virtual]

This method is called to invert the specified sub-object level.

If the element is selected it should be deselected. If it's deselected it should be selected. This will be called when the user chooses Select Invert from the 3ds Max Edit menu.

Parameters:
selLevel Specifies the selection level to invert.

Reimplemented from BaseObject.

{ delegate->InvertSelection( selLevel); }
int SubObjectIndex ( HitRecord hitRec ) [inline, virtual]

Returns the index of the sub-object element identified by the HitRecord hitRec.

See Class HitRecord. The sub-object index identifies a sub-object component. The relationship between the index and the component is established by the modifier. For example an edit modifier may allow the user to select a group of faces and these groups of faces may be identified as group 0, group 1, group 2, etc. Given a hit record that identifies a face, the edit modifier's implementation of this method would return the group index that the face belonged to.

Reimplemented from BaseObject.

{return  delegate->SubObjectIndex(hitRec);}
int HitTest ( TimeValue  t,
INode inode,
int  type,
int  crossing,
int  flags,
IPoint2 p,
ViewExp vpt,
ModContext mc 
) [inline, virtual]

This method is used in modifier gizmo hit testing.

It is called to determine if the specified screen point intersects the gizmo. The method returns nonzero if the item was hit; otherwise 0.

Parameters:
t The time to perform the hit test.
inode A pointer to the node to test.
type The type of hit testing to perform. See Scene and Node Hit Test Types. for details.
crossing The state of the crossing setting. If TRUE crossing selection is on.
flags The hit test flags. See Scene and Node Hit Testing Flags for details.
p The screen point to test.
vpt An interface pointer that may be used to call methods associated with the viewports.
mc A pointer to the modifiers ModContext.
Returns:
Nonzero if the item was hit; otherwise 0.

Reimplemented from BaseObject.

        { return delegate->HitTest(t, inode, type, crossing, flags, p, vpt, mc); }
int HitTest ( TimeValue  t,
INode inode,
int  type,
int  crossing,
int  flags,
IPoint2 p,
ViewExp vpt 
) [inline, virtual]

This method is called to determine if the specified screen point intersects the item.

The method returns nonzero if the item was hit; otherwise 0.

Parameters:
t The time to perform the hit test.
inode A pointer to the node to test.
type The type of hit testing to perform. See Scene and Node Hit Test Types. for details.
crossing The state of the crossing setting. If TRUE crossing selection is on.
flags The hit test flags. See Scene and Node Hit Testing Flags for details.
p The screen point to test.
vpt An interface pointer that may be used to call methods associated with the viewports.
Returns:
Nonzero if the item was hit; otherwise 0.

Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.

        { return delegate->HitTest(t, inode, type, crossing, flags, p, vpt); }
void ActivateSubobjSel ( int  level,
XFormModes modes 
) [inline, virtual]

When the user changes the selection of the sub-object drop down, this method is called to notify the plug-in.

This method should provide instances of a class derived from CommandMode to support move, rotate, non-uniform scale, uniform scale, and squash modes. These modes replace their object mode counterparts however the user still uses the move/rotate/scale tool buttons in the toolbar to activate them. If a certain level of sub-object selection does not support one or more of the modes NULL may be passed. If NULL is specified the corresponding toolbar button will be grayed out.

Parameters:
level The sub-object selection level the command modes should be set to support. A level of 0 indicates object level selection. If level is greater than or equal to 1 the index refers to the types registered by the object in the order they appeared in the list when registered by Interface::RegisterSubObjectTypes(). See Class Interface.
modes The command modes to support
Sample Code:
        void SimpleMod::ActivateSubobjSel(int level, XFormModes& modes)
        {
                switch ( level ) {
                        case 1:                                                                   // Modifier box
                                modes = XFormModes(moveMode,rotMode,nuscaleMode,uscaleMode,squashMode,NULL);
                                break;
                        case 2:                                                                   // Modifier Center
                                modes = XFormModes(moveMode,NULL,NULL,NULL,NULL,NULL);
                                break;
                }
                NotifyDependents(FOREVER,PART_DISPLAY,REFMSG_CHANGE);
        }
See also:
Class XFormModes.

Reimplemented from BaseObject.

{ delegate->ActivateSubobjSel( level, modes ); }
BOOL SupportsNamedSubSels ( ) [inline, virtual]

An object that supports sub-object selection can choose to support named sub object selection sets.

Methods in the the interface passed to objects allow them to add items to the sub-object selection set drop down. The following methods are called when the user picks items from the list.

Returns:
true if the plug-in supports named sub-object selection sets, false otherwise.

Reimplemented from BaseObject.

void ActivateSubSelSet ( MSTR setName ) [inline, virtual]

When the user chooses a name from the drop down list this method is called.

The plug-in should respond by selecting the set identified by the name passed.

Parameters:
setName The name of the set to select.

Reimplemented from BaseObject.

{ delegate->ActivateSubSelSet(setName); }
void NewSetFromCurSel ( MSTR setName ) [inline, virtual]

If the user types a new name into the named selection set drop down then this method is called.

The plug-in should respond by creating a new set and give it the specified name.

Parameters:
setName The name for the selection set.

Reimplemented from BaseObject.

{ delegate->NewSetFromCurSel(setName); }
void RemoveSubSelSet ( MSTR setName ) [inline, virtual]

If the user selects a set from the drop down and then chooses Remove Named Selections from the Edit menu this method is called.

The plug-in should respond by removing the specified selection set.

Parameters:
setName The selection set to remove.

Reimplemented from BaseObject.

{ delegate->RemoveSubSelSet(setName); }
void SetupNamedSelDropDown ( ) [inline, virtual]

To support the Edit Named Selections dialog, plug-ins must implement this method.

It is called to rebuild the named selection set drop down list. This is usually done by calling Interface::ClearSubObjectNamedSelSets() followed by calls to Interface:: AppendSubObjectNamedSelSet().

Reimplemented from BaseObject.

int NumNamedSelSets ( ) [inline, virtual]

To support the Edit Named Selections dialog, plug-ins must implement this method.

Returns:
the number of named selection sets.

Reimplemented from BaseObject.

{return  delegate->NumNamedSelSets();}
MSTR GetNamedSelSetName ( int  i ) [inline, virtual]

To support the Edit Named Selections dialog, plug-ins must implement this method.

Parameters:
i The index of the selection set whose name is returned.
Returns:
the name of the 'i-th' named selection set.

Reimplemented from BaseObject.

{return  delegate->GetNamedSelSetName( i);}
void SetNamedSelSetName ( int  i,
MSTR newName 
) [inline, virtual]

To support the Edit Named Selections dialog, plug-ins must implement this method.

It sets the name of the selection set whose index is passed to the name passed. Note: Developers need to implement Undo / Redo for modifications to their named selection sets.

Parameters:
i The index of the selection set whose name is to be set.
newName The new name for the selection set the plug-in should store.

Reimplemented from BaseObject.

{ delegate->SetNamedSelSetName( i, newName); }
void NewSetByOperator ( MSTR newName,
Tab< int > &  sets,
int  op 
) [inline, virtual]

To support the Edit Named Selections dialog, plug-ins must implement this method.

The user may bring up the Edit Named Selections dialog via the Edit / Edit Named Selection ... command. This dialog allows the user to create new selection sets using 'boolean' operations to the sets including 'Combine', 'Subtract (A-B)', 'Subtract (B-A)' and 'Intersection'. This method is called on the plug-in to generate a new selection set via one of these operations. This method assumes the developer will append a new seleciton set with the name passed. This will result in two sets with identical names. Then the system will call RemoveSubSelSet() afterwards, so that the first one that is found (the old one, since the new one was appended) will be deleted. Note: Developers need to implement Undo / Redo for modifications to their named selection sets. See /MAXSDK/SAMPLES/MODIFIERS/MESHSEL.CPP for an example.

Parameters:
newName The new name for the selection set is passed here.
sets A table of the selection sets to operate on. There are sets.Count() sets in the table.
op One of the following values defined in Arguments for BaseObject::NewSetByOperator()

Reimplemented from BaseObject.

{ delegate->NewSetByOperator(newName, sets, op); }
void GetSubObjectCenters ( SubObjAxisCallback cb,
TimeValue  t,
INode node,
ModContext mc 
) [inline, virtual]

When the user is in a sub-object selection level, the system needs to get the reference coordinate system definition from the current modifier being edited so that it can display the axis.

This method specifies the position of the center. The plug-in enumerates its centers and calls the callback cb once for each.

Parameters:
cb The callback object whose methods may be called. See Class SubObjAxisCallback.
t The time to enumerate the centers.
node A pointer to the node.
mc A pointer to the ModContext.

Reimplemented from BaseObject.

{ delegate->GetSubObjectCenters(cb, t, node, mc); }
void GetSubObjectTMs ( SubObjAxisCallback cb,
TimeValue  t,
INode node,
ModContext mc 
) [inline, virtual]

When the user is in a sub-object selection level, the system needs to get the reference coordinate system definition from the current modifier being edited so that it can display the axis.

This method returns the axis system of the reference coordinate system. The plug-in enumerates its TMs and calls the callback cb once for each. See Sub-Object Coordinate Systems.

Parameters:
cb The callback object whose methods may be called.
t The time to enumerate the TMs.
node A pointer to the node.
mc A pointer to the ModContext.

Reimplemented from BaseObject.

{ delegate->GetSubObjectTMs( cb, t, node, mc); }                          
void Move ( TimeValue  t,
Matrix3 partm,
Matrix3 tmAxis,
Point3 val,
BOOL  localOrigin = FALSE 
) [inline, virtual]

When this method is called the plug-in should respond by moving its selected sub-object components.

Parameters:
t The time of the transformation.
partm The 'parent' transformation matrix. This matrix represents a transformation that would take points in the modifier's space and convert them into world space points. This is constructed as the node's transformation matrix times the inverse of the ModContext's transformation matrix. The node whose transformation is used is the node the user clicked on in the scene - modifiers can be instanced so there could be more than one node.
tmAxis The matrix that represents the axis system. This is the space in which the transformation is taking place.
val This value is a vector with X, Y, and Z representing the movement along each axis.
localOrigin When TRUE the transformation is occurring about the sub-object's local origin.

Reimplemented from BaseObject.

{ delegate->Move( t, partm, tmAxis, val, localOrigin ); }
void Rotate ( TimeValue  t,
Matrix3 partm,
Matrix3 tmAxis,
Quat val,
BOOL  localOrigin = FALSE 
) [inline, virtual]

When this method is called the plug-in should respond by rotating its selected sub-object components.

Parameters:
t The time of the transformation.
partm The 'parent' transformation matrix. This matrix represents a transformation that would take points in the modifier's space and convert them into world space points. This is constructed as the node's transformation matrix times the inverse of the ModContext's transformation matrix. The node whose transformation is used is the node the user clicked on in the scene - modifiers can be instanced so there could be more than one node.
tmAxis The matrix that represents the axis system. This is the space in which the transformation is taking place.
val The amount to rotate the selected components.
localOrigin When TRUE the transformation is occurring about the sub-object's local origin. Note: This information may be passed onto a transform controller (if there is one) so they may avoid generating 0 valued position keys for rotation and scales. For example if the user is rotating an item about anything other than its local origin then it will have to translate in addition to rotating to achieve the result. If a user creates an object, turns on the animate button, and rotates the object about the world origin, and then plays back the animation, the object does not do what the was done interactively. The object ends up in the same position, but it does so by both moving and rotating. Therefore both a position and a rotation key are created. If the user performs a rotation about the local origin however there is no need to create a position key since the object didn't move (it only rotated). So a transform controller can use this information to avoid generating 0 valued position keys for rotation and scales.

Reimplemented from BaseObject.

{ delegate->Rotate( t, partm, tmAxis, val, localOrigin ); }
void Scale ( TimeValue  t,
Matrix3 partm,
Matrix3 tmAxis,
Point3 val,
BOOL  localOrigin = FALSE 
) [inline, virtual]

When this method is called the plug-in should respond by scaling its selected sub-object components.

Parameters:
t The time of the transformation.
partm The 'parent' transformation matrix. This matrix represents a transformation that would take points in the modifier's space and convert them into world space points. This is constructed as the node's transformation matrix times the inverse of the ModContext's transformation matrix. The node whose transformation is used is the node the user clicked on in the scene - modifiers can be instanced so there could be more than one node.
tmAxis The matrix that represents the axis system. This is the space in which the transformation is taking place.
val This value is a vector with X, Y, and Z representing the scale along X, Y, and Z respectively.
localOrigin When TRUE the transformation is occurring about the sub-object's local origin. See the note above in the Rotate method. The following methods may be used to receive notification about the starting and ending phases of transforming the item when in sub-object selection.

Reimplemented from BaseObject.

{ delegate->Scale( t, partm, tmAxis, val, localOrigin ); }
void TransformStart ( TimeValue  t ) [inline, virtual]

This method is called before the first Move(), Rotate() or Scale() call and before a hold is in effect.

Parameters:
t The current time when this method is called.

Reimplemented from BaseObject.

void TransformHoldingStart ( TimeValue  t ) [inline, virtual]

This method is called before the first Move(), Rotate() or Scale() call and after a hold is in effect.

Parameters:
t The current time when this method is called.

Reimplemented from BaseObject.

void TransformHoldingFinish ( TimeValue  t ) [inline, virtual]

This method is called after the user has completed the Move(), Rotate() or Scale() operation and before the undo object has been accepted.

Parameters:
t The current time when this method is called.

Reimplemented from BaseObject.

void TransformFinish ( TimeValue  t ) [inline, virtual]

This method is called after the user has completed the Move(), Rotate() or Scale() operation and the undo object has been accepted.

Parameters:
t The current time when this method is called.

Reimplemented from BaseObject.

void TransformCancel ( TimeValue  t ) [inline, virtual]

This method is called when the transform operation is canceled by a right-click and the undo has been canceled.

Parameters:
t The current time when this method is called.

Reimplemented from BaseObject.

MtlID GetMatID ( TimeValue  t,
int  curve,
int  piece 
) [inline, virtual]

This method provides access to the material IDs of the shape.

It returns the material ID of the specified segment of the specified curve of this shape at the time passed. There is a default implementation so there is no need to implement this method if the shape does not support material IDs. Note: typedef unsigned short MtlID;

Parameters:
t The time to evaluate the sub-curve.
curve The zero based index of the curve to evaluate.
piece The sub-curve (segment) to evaluate.

Reimplemented from MSPluginShape.

{ return delegate->GetMatID(t, curve, piece); }
BOOL AttachShape ( TimeValue  t,
INode thisNode,
INode attachNode 
) [inline]

Reimplemented from MSPluginShape.

{ return delegate->AttachShape(t, thisNode, attachNode); }      // Return TRUE if attached
BOOL HasUVW ( ) [inline, virtual]

It is called to find out if the object is has UVW coordinates.

This method returns TRUE if the object has UVW coordinates; otherwise FALSE. In 3ds Max 2.0 and later there is code in the renderer that will automatically turn on the UVW coordinates of the base object if UV's are missing (and needed). The base object has to implement two simple methods to make this work: HasUVW() and SetGenUVW(). Developers are encouraged to put these methods in their objects: it makes using the program easier for the user. If they are not implemented, it doesn't cause any real harm: it will just operate as before and put up the missing UVW's message. Here is how the procedural sphere implements these methods:

        BOOL SphereObject::GetGenUVW()
        {
                BOOL genUVs;
                Interval v;
                pblock->GetValue(PB_GENUVS, 0, genUVs, v);
                return genUVs;
        }
        
        void SphereObject::SetGenUVW(BOOL sw)
        {
                if (sw==GetGenUVW()) return;
                pblock->SetValue(PB_GENUVS,0, sw);
        }

Important Note: The pblock->SetValue() will cause a call to NotifyDependents(FOREVER, PART_TEXMAP, REFMSG_CHANGE), which will invalidate the UVW cache. It is essential that this call be made, so if the 'generate UVW' boolean is not handled by a parameter block, then NotifyDependents() needs to be called explicitly. Also Note: For "modifiable objects" that pass up the pipeline getting modified, such as TriObject, EditTriObject, etc., which cannot generate their own UVWs, but can carry them in their data structures, only this HasUVW() method needs to be implemented. For example, here is the implementation for TriObject: BOOL TriObject::HasUVW() { return mesh.tvFace?1:0; }

Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.

{ return delegate->HasUVW(); }
void SetGenUVW ( BOOL  sw ) [inline, virtual]

This method is called to change the state of its Generate UVW boolean.

If the state changes, the object must send a REFMSG_CHANGE up the pipeline by calling NotifyDependents(). This applies to map channel 1.

Parameters:
sw The new state for the generate UVW flag.

Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.

{ delegate->SetGenUVW(sw); }
IOResult Save ( ISave isave ) [inline, virtual]

Reimplemented from MSPluginShape.

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

Reimplemented from MSPluginShape.

{  MSPlugin::Load(iload); return ShapeObject::Load(iload); }
Class_ID PreferredCollapseType ( ) [inline, virtual]

Implemented by the System.

This is an implementation of the Object method. It simply returns splineShapeClassID.

Reimplemented from MSPluginShape.

BOOL GetExtendedProperties ( TimeValue  t,
MSTR prop1Label,
MSTR prop1Data,
MSTR prop2Label,
MSTR prop2Data 
) [inline, virtual]

Implemented by the System.

This is an implementation of the Object method. It fills in the property fields with the number of vertices and curves in the shape.

Reimplemented from MSPluginShape.

                                                { return delegate->GetExtendedProperties(t, prop1Label, prop1Data, prop2Label, prop2Data); }
void RescaleWorldUnits ( float  f ) [inline, virtual]

Implemented by the System.

Objects derived from this class which have RescaleWorldUnits methods implemented need to call this method. The following example is the SplineShape implementation of this method from core.

        void SplineShape::RescaleWorldUnits(float f)
        {
                if (TestAFlag(A_WORK1))
                        return;
        // Call the base class's rescale (this sets the A_WORK1 flag)
                ShapeObject::RescaleWorldUnits(f);
        // Now rescale stuff inside our data structures
                Matrix3 stm = ScaleMatrix(Point3(f, f, f));
                shape.Transform(stm);
        }

Note that the A_WORK1 flags is tested first to be sure it isn't processing the rescale twice. The code then calls ShapeObject::RescaleWorldUnits, which sets the A_WORK1 flag and performs the necessary rescale methods for all references for the object, and scales the renderable thickness value.

Parameters:
f The parameter to scale.

Reimplemented from MSPluginShape.

Object* MakeShallowCopy ( ChannelMask  channels ) [inline, virtual]

This method must make a copy of its "shell" and then shallow copy (see below) only the specified channels.

It must also copy the validity intervals of the copied channels, and invalidate the other intervals.

Parameters:
channels The channels to copy.
Returns:
A pointer to the shallow copy of the object.

Reimplemented from Object.

{ return delegate->MakeShallowCopy(channels); }
void ShallowCopy ( Object fromOb,
ChannelMask  channels 
) [inline, virtual]

This method copies the specified channels from the fromOb to this and copies the validity intervals.

A plug-in needs to copy the specified channels from the specified object fromOb to itself by just copying pointers (not actually copying the data). No new memory is typically allocated, this method is just copying the pointers.

Parameters:
fromOb Object to copy the channels from.
channels Channels to copy.

Reimplemented from Object.

{ delegate->ShallowCopy(fromOb, channels); }
ObjectState Eval ( TimeValue  t ) [inline, virtual]

This method is called to evaluate the object and return the result as an ObjectState.

When the system has a pointer to an object it doesn't know if it's a procedural object or a derived object. So it calls Eval() on it and gets back an ObjectState. A derived object managed by the system may have to call Eval() on its input for example. A plug-in (like a procedural object) typically just returns itself. A plug-in that does not just return itself is the Morph Object (/MAXSDK/SAMPLES/OBJECTS/MORPHOBJ.CPP). This object uses a morph controller to compute a new object and fill in an ObjectState which it returns.

Parameters:
t Specifies the time to evaluate the object.
Returns:
The result of evaluating the object as an ObjectState.
Sample Code:
Typically this method is implemented as follows:
        { return ObjectState(this); }

Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.

{ delegate->Eval(time); return ObjectState(this); }