#include <mxsPlugin.h>
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. |
MSShapeXtnd | ( | MSPluginClass * | pc, |
BOOL | loading | ||
) |
~MSShapeXtnd | ( | ) | [inline] |
{ DeleteAllRefsFromMe(); }
RefTargetHandle Clone | ( | RemapDir & | remap | ) | [virtual] |
This method is used by 3ds Max to clone an object.
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
remap | - A RemapDir instance used for remapping references during a Clone. |
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.
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.)
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. |
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.
s | The default name of the node is stored here. |
Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.
{ delegate->InitNodeName(s); }
SClass_ID SuperClassID | ( | ) | [inline, virtual] |
Retrieves a constant representing the type of the plugin.
Reimplemented from MSPluginShape.
{ return delegate ? delegate->SuperClassID() : MSPluginShape::SuperClassID(); }
Computes the intersection point of the ray passed and the shape.
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. |
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.
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.
t | The time to check. |
curve | The index of the curve to check. |
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().
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. |
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().
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. |
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(); }
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.
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.
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. |
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.
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. |
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.
Reimplemented from MSPluginShape.
{ return delegate->CanMakeBezier(); }
void MakeBezier | ( | TimeValue | t, |
BezierShape & | shape | ||
) | [inline, virtual] |
Creates the bezier representation of the shape.
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.
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.
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.
t | The time to create the cap info. |
capInfo | The cap info to update. |
capType | See Shape Capping Types. |
Reimplemented from MSPluginShape.
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.
t | The time to create the cap info. |
capInfo | The cap info to update. |
Reimplemented from MSPluginShape.
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.
t | The time at which to clone the selected sub-object components. |
Reimplemented from BaseObject.
{ delegate->CloneSelSubComponents( t); }
void AcceptCloneSelSubComponents | ( | TimeValue | t | ) | [inline, virtual] |
This method is called when the user mouses up after shift-cloning a sub-object selection.
t | The time at which the clone of the selected components is being done. |
Reimplemented from BaseObject.
{ delegate->AcceptCloneSelSubComponents( t); }
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.
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.
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.
selLevel | Specifies the selection level to select. |
Reimplemented from BaseObject.
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.
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.
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. |
Reimplemented from BaseObject.
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.
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. |
Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.
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.
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 |
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); }
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.
Reimplemented from BaseObject.
{return delegate->SupportsNamedSubSels();}
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.
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.
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.
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.
{ delegate->SetupNamedSelDropDown(); }
int NumNamedSelSets | ( | ) | [inline, virtual] |
To support the Edit Named Selections dialog, plug-ins must implement this method.
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.
i | The index of the selection set whose name is returned. |
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.
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); }
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
t | The current time when this method is called. |
Reimplemented from BaseObject.
{ delegate->TransformStart( t); }
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.
t | The current time when this method is called. |
Reimplemented from BaseObject.
{ delegate->TransformHoldingStart( t); }
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.
t | The current time when this method is called. |
Reimplemented from BaseObject.
{ delegate->TransformHoldingFinish( t); }
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.
t | The current time when this method is called. |
Reimplemented from BaseObject.
{ delegate->TransformFinish( t); }
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.
t | The current time when this method is called. |
Reimplemented from BaseObject.
{ delegate->TransformCancel( t); }
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;
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.
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 >.
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.
sw | The new state for the generate UVW flag. |
Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.
Reimplemented from MSPluginShape.
{ MSPlugin::Save(isave); return ShapeObject::Save(isave); }
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.
{ return delegate->PreferredCollapseType(); }
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.
f | The parameter to scale. |
Reimplemented from MSPluginShape.
{ delegate->RescaleWorldUnits(f); }
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.
channels | The channels to copy. |
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.
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.
t | Specifies the time to evaluate the object. |
{ return ObjectState(this); }
Reimplemented from MSObjectXtnd< ShapeObject, MSPluginShape >.
{ delegate->Eval(time); return ObjectState(this); }