A SimpleObject is a kind of geometry primitive that is defined by a tri-mesh such as, a box, sphere, cone, and so on. In other words, a simpleObject plugin is similar to all the Standard and Extended primitives in 3ds Max.
In scripting a SimpleObject plug-in, you need to supply a handler for building this mesh and 3ds Max automatically handles the scene display, hit-testing, ray intersection, rendering, modifier applicability, and others.
A scripted SimpleObject plug-in is declared by specifying the <superclass> as simpleObject .
Scripted SimpleObject plug-ins require a create tool.
A SimpleObject plug-in must not perform any scene related actions such as, creating scene nodes or building modifier stacks. It must only adjust its parameters in the mouse tool handlers and construct a mesh in the buildMesh handler. Attempting to create scene nodes or applying modifiers in a SimpleObject plug-in will cause all kinds off strange interactions with the in-progress scene node creation.
A SimpleObject plug-in has a predefined local variable mesh . This variable contains the underlying mesh of the object being created. The mesh local variable is accessible in any of the plug-in's handlers, but is typically only built in the buildMesh handler. You can either modify the existing TriMesh value in place using the TriMesh methods, or construct a new TriMesh value and assign it to the mesh plug-in local variable. The TriMesh methods and properties are described in Editable Mesh.
In this script a new primitive called Tower is defined. It constructs a very simple tower form; the first drag sets the base and the second drag sets the height. It contains three animatable rollout parameters: height , width , and depth , which set the object's basic bounds. The key components here are the create tool and the on buildMesh handler, and they work together in a simple way. The create tool sets the values of the parameters and the on buildMesh handler constructs a mesh based on the parameter values.
The create tool can also access and set the position of the node that is being created to contain the new object through the Matrix3 value in the pre-defined mouse tool local variable nodeTM . In this case, the position portion of the node's TM is set to the initial mouse down world position. The on mouseMove handler sets the width and depth during click 2 and the height during click 3.
The on buildMesh handler constructs the desired mesh in the TriMesh value in the pre-defined plug-in local variable mesh . Typically, it does this by building the mesh from scratch each time the handler is called. In the above example, the mesh is initially set to a simple two-face rectangular plane (using setMesh() ), and then the two faces are extruded up and scaled-down twice to get the simple tower.
The mesh plug-in local variable is accessible in any of the plug-in's handlers, but is typically built only in the on buildMesh handler. You can either modify the existing TriMesh value in place using the TriMesh methods, or construct a new TriMesh value and assign it to the mesh plug-in local variable. The TriMesh created must be valid or a 3ds Max crash might occur. All face, vertex, material ID, and texture vertex arrays allocated must be filled in the handler.
There are three additional event handlers that might be implemented for a scripted SimpleObject:
If the OKtoDisplay event handler is implemented, <boolean_expr> must return true or false depending on whether it is OK to display the current mesh. This is useful in situations where a mesh might be in some degenerate state for certain parameter settings and must not be displayed in the viewports. The default implementation is true . Note that empty meshes are OK to display.
If the hasUVW event handler is implemented, <boolean_expr> must return true or false depending on whether UVW coordinates are present on the mesh. In many primitive objects, a Generate Mapping Coords checkbox is provided for the user to control UVW coordinate generation and the hasUVW handler expression returns the state of this checkbox. The default implementation returns true or false depending on whether the mesh has texture vertices or not. At present, only a single map channel is supported.
The setGenUVW event handler is called when 3ds Max wants the plug-in to automatically generate mapping coordinates. This happens when you first render an object that has a material applied, but not mapping coordinates. It is called with a switch argument <onOff> , which is true or false to turn on or turn off the mapping coordinates. If your plug-in is managing mapping coordinates, it must implement this handler and generate mapping coordinates when called with a true argument.
Here is another example that creates a mesh by first building other temporary objects and using mesh booleans to build the final mesh:
In this example, the parameters and rollouts are handled in a similar manner to the first example, but the buildMesh handler generates the mesh in an indirect way. The final object is in the form of a rectangular pipe, a box with a box hole through the middle. Two plug-in locals ( box1 and box2 ) are made to contain Box base objects whose size parameters are set according to the plug-in's parameters ( box2 is the outer box and box1 is the hole). The final mesh is made by boolean subtraction of box1 from box2 . In this case, a separate new mesh is created and assigned to the mesh plug-in local variable, in contrast to the first example that modified the object's original mesh directly. Either method is okay.
The createInstance() method is used to directly create the box base objects. This method creates the geometry associated with the specified object, but does not create a node. This method is used since SimpleObject plug-in must not perform any scene related actions such as, creating scene nodes or building modifier stacks.