The following is a description of internal changes and "tweaks" to the MAXScript language in 3ds Max 8. Other than the "What is new..." topic, these changes do not implement new objects, classes, methods or interfaces, but change the way MAXScript works internally. Usually these changes either improve performance or simplify programming.
The MAXScript Debugger allows the main thread of 3ds Max to be suspended, the values of global and local variables to be examined and altered while the 3dsMax thread is not running, MAXScript commands to be executed from a command line, and the execution to be suspended using method calls from inside the MAXScript code. The Debugger also lets you stop or continue the execution of the suspended code.
Saving MaxScript Files on Crash
After attempting to save the scene file, the crash handler now allows MAXScript to attempt to save modified open script windows...
Previously, when assigning a controller to a track, the value of the track was used by the new controller. While this works well when assigning a new controller class to an existing track, it would cause strange results when instancing an existing controller that already has a value. In addition, when assigning scripted controllers to a track, their script string set before the assignemtn was always overwritten by the current value of the track.
This has been fixed in 3ds Max 8. A flag is set internally when a controller is "not new" and the existing data of the controller being instanced will be used instead of the value of the track at frame 0.
The replacement of the script string in scripted controllers with the current value of the track has been fixed thanks to the change in controllers described in the previous paragraph.When the settings of a script or expression controller have been changed, the controller will be marked as "not new" and its existing script / expression will be used instead of the value of the target track.
Weak References To Nodes in the Expression/Script Controller
Expression controller variables that point at nodes now use the new nodeTransformMonitor class to hold the reference to the node. This will speed up scenes where expression controllers with node variables are used.
A new method for copying and pasting selected keys has been added to MAXScript.
Fixed .Checked and .Enabled Properties in RCMenus
Menu items in RCMenus used in dialogs will now update correctly when the menu Item's .enabled and .checked properties change...
Utility and Rollout Properties, Methods, and Event Handlers
A read-only .owner propertyhas been added to rollout values. If the rollout is being displayed by a scripted plugin or CA, the property will contain the scripted plugin or CA instance. This property was added to make it easier to access the variables in a scripted plugin or CA instance when a debugger break occurs in a rollout event handler. In this case, the owner of the event handler is the rollout, so you can access the scripted plugin or CA instance via getVar owner.owner.
The following predefined local variables in scripted plug-ins are now read-only:
All plug-in types: this, loading . version was previously marked as read-only.
Specifying Global Variables As Global Using ::
You can now specify a global variable name by preceeding the name with '::'. Such names are looked for only in the global variable pool, and will be created if they do not currently exist.
When merging or XRef-ing in a file (scene/object XRefs are a special case of merge), when reading in persistent global variables, If the variable being read from the scene file already exists as a persistent global variable, the value of the persistent global is not overwritten.
A new [ using:<maxclass> ]optional keyword argument has been added to the ImportFile() and ExportFile() functions.
It can be used to pass the max class of the exact importer/exporter to be invoked, thus preventing conflicts when the same extension is supported by multiple files.
3ds Max File Loading and Saving
A new [ quiet:<bool> ]optional keyword argument has been added to the SaveMaxFile() and SaveNodes() functions. In addition, instead of returning OK, these methods will now return true on success and false on failure (for example if the target file exists and is write-protected).
A new [ quiet:<bool> ]optional keyword argument has been added to the Save() method for bitmap values. In addition, instead of returning OK, the method will now return true on success and false on failure (for example if the target file exists and is write-protected).
A new [ quiet:<bool> ]optional keyword argument has been added to the fileSaveMatLib() method.It will still return OK as the corresponding SDK method does not return a valid success or failure result.
Standard Open and Save File Dialogs
A new [ initialDir:<pathname> ]optional keyword argument has been added to the getSavePath() method. When specified, the dialog will open at the specified path.
A new optional keyword argument has been added to the existing gw.snapPoint method. It lets the user provide a snapPlane matrix3 value which maps the XY plane to a custom snapping plane.
Scripted render effects now implement the Effect8 interface. Effect8::SupportsBitmap() is implemented to return true in all cases.
This means that scripted Render Effects are considered compatible with all types of bitmaps since they only access bitmaps through the proper GetPixel() method and will automatically support high-dynamic-range images without clipping - unless, of course, the script intentionaly clips the colors or convertes them to integers.
Scripted materials are now supported by mental ray, as long as the delegate material is supported. The delegate material is correctly interpreted by mental ray as the actual material used to render. The "mental ray Connection" rollout of the scripted material is also correctly used and initialized.
Callbacks: Undo System Notifications
#sceneUndo and #sceneRedo callbacks now return the undo/redo name entry in callbacks.notificationparams() .
The methods showProperties, getPropNames, and hasProperty now include FPS interface properties.
New Edit>Clear All command in the Editor menu. This option was previously available only in the Listener. When executed, clears the content of the editor.
Color-coding of large scripts has been made over 30% faster. In addition, a wait cursor will be shown during color-coding.
New context to specify the default action.
New context to specify the current quiet mode.
For default action arguments for render, loadMaxFile, fetchMaxFile, mergeMaxFile , and getMAXFileObjectNames , the option #default has been added. When #default is specified, the current defaultAction context state is used.
If a default action argument is not specified for render, loadMaxFile, fetchMaxFile, mergeMaxFile , and getMAXFileObjectNames , it defaults to the current defaultAction context state.
Modified default for MAXScript render, loadMaxFile, fetchMaxFile, mergeMaxFile, and getMAXFileObjectNames method's 'quiet' keyword argument. Previously, the default was FALSE. Now the default is the current quiet mode.
Added keyword args to MXS mergeMAXFile method. missingExtFilesAction:, missingExtFilesList:, missingXRefsAction: and missingXRefsList:
Addednew unsupportedRenderEffectAction : and unsupportedRenderEffectList : keyword arguments to MAXScript render method.
File Link dialogs now respect the Quiet Mode.All File Link dialogs (those that appear in the course of an Attach, Reload, Detach, or Bind) now respect this setting.
StringStream Associated Methods
A new ignoreStringEscapes: keyword parameter has been added to readValue method.
A new splitEmptyTokens: keyword parameter has been added tot he filterString method.If splitEmptyTokens is false or not specified, sequential tokens are handled as a single token, and tokens at the beginning or end of the string are ignored. If splitEmptyTokens is true , each token found will result in string element in the output, with the string element in the cases ignored above being empty strings.
Instances of the new SafeArrayWrapper Class are creatable by the user and are returned by OLE methods that return SAFEARRAY values.
In previous releases, the MAXScript string / OLE string conversion routines were using stack memory. A particular method was attempting to allocate two times the string size on the stack. For very long strings, this was causing stack overflows. In 3ds Max 8, MAXScript is using much better conversion routines, only using stack memory when actually needed and when stack memory requirements are small.
A new options.showGCStatus global variable has been added. When set to true , the message "MXS GC" will be displayed in the status bar during MAXScript Garbage Collection. When set to false , no message will be displayed. The setting is stored in the 3dsmax.ini file in the [MAXScript] section.
In previous releases, the MacroScript isEnabled handler was called N times when N objects were deleted using MAXScript.This has been fixed. Scene redraw will be disabled while the objects are being deleted, and the MacroScript handlers will be called just once after the scene redraws have been re-enabled.
In previous releases, the documented showHidden optional keyword was broken. Now it works as expected.
In previous releases, only spinner controls could be linked to a controller via the controller: creation parameter. Now the same can be done with Sliders.
New optional arguments have been added to the changed, entered and buttonUp change handlers to allow better manual undo handling.
Setting the value of the .images property for either Button or Checkbutton to undefined will set the control back to displaying its caption rather than images.
A new rightclick event has been added to button, checkButton, mapButton, materialButton, pickButton, and imgTag.
Several new events similar to the ones found in dialogs have been added to imgTag, including lbuttondown, lbuttonup, lbuttondblclk, mbuttondown, mbuttonup, mbuttondblclk, rbuttondown, rbuttonup, rbuttondblclk
This event handler is available to scripted cameras, lights, and helpers and lets the developer specify whether to use the node's wire color when drawing the object in the viewport, or use the UI color for the object type (Dummy Object for helpers, Light Object for lights, and Camera Object for cameras). If this handler returns true, the node's wire color is used, otherwise the UI color for the object type is used. If the event handler is not specified, the wire color is used. This handler is only applicable when a getDisplayMesh handler is supplied.
The getDisplayMesh event handler previously available to scripted cameras and helpers is now available to scripted light plug-ins, too.
The MAXScript Listener can now be toggled on and off using the default F11 key. Previously, it was being opened but not closed using the shortcut.