VFB+ v2.4 Has Arrived

Fashionably late (well, at least according to my initial plans :)), I’m proud to present an all new release of VFB+. A lot of effort has gone into this release, both in terms of new features added, and the number of bugs fixes.
The image processing engine has been completely rewritten to better leverage SIMD optimizations.
New features like image filters, composition guides, view-dependent CC settings and overall stability improvements make sure that you get the most out of the tool, and the greatest improvement to your workflow.

Needless to say, the upgrade is free for existing users!

Be sure to check out the full change log for a comprehensive list.

Thanks to everyone for the continuous feedback and the overall support!

version 2.41 Update!

An update has been released fixing the following bugs:

  • ‘Send To’ was broken for command-line based applications.
  • Opening the preferences panel would reset the last used ‘Send To’ application.
  • If ‘Output Folder’ was set to ‘Permanent’ in output preferences, and annoying message would pop up whenever a user opens the preferences dialog.
  • Using ‘Sent to Photoshop’ could result in a MAXScript exception being raised.

A big thanks to Shawn Olson for letting me know about all of these bugs, and my sincere apology to those who have already taken the time to download v2.4.

mmMaxControls : .NET Controls with a 3dsmax Style

Lately I’ve seen several posts on the CGTalk MAXScript forum asking how one could make the standard .Net WinForms controls look like the standard 3dsmax UI elements.

Towards this end, I’ve written a collection of some commonly used controls that imitate the 3dsmax look and feel to the pixel, thus maintaining uniformity in your scripted or compiled interface, but giving you the high level of control that DotNet offers.

The package is called mmMaxControls, and is freely available for personal or commercial use. It targets version 2.0 of the DotNet framework, which should make is backwards compatible many versions (the earliest I’ve tested is 3dsmax 2009, theoretically it may work on as far back as 3dsmax 9).

General Features:

  • Look exactly like 3dsmax controls.
  • Control colors update when 3dsmax colors update.
  • No keyboard focus issues that plague standard DotNet controls in 3dsmax (EnableAccelerators is automatically managed by the library).
  • All the customization options of DotNet controls.
  • Can be used in any DotNet language. e.g. if you are developing a 3dsmax plugin in c# without referencing the 3dsmax SDK (for example, for versions earlier than 3dsmax 2012SAP), this is your best bet for native-looking 3dsmax controls.
  • Can be used in both a MAXScript Rollout as a DotNetControl or in a WinForms Form.

Download mmMaxControls v1.02 (12k)

The library is fully documented: Online | Zipped HTML.

Below is the code used for creating the MAXScript rollout at the top of this post.

dotnet.loadAssembly @"C:\mmMaxControls.dll"
try(destroyDialog mmMaxControls)catch()
rollout mmMaxControls "mmMaxControls" width:235
	groupBox grpBtn "Button" width:225 height:55 pos:[5,5]
	dotNetControl mmBtn1 "mmMaxControls.Button" width:62 height:25 pos:[15,25]
	dotNetControl mmBtn2 "mmMaxControls.Button" width:60 height:25 pos:[80,25]
	dotNetControl mmBtn3 "mmMaxControls.Button" width:25 height:25 pos:[143,25]
	dotNetControl mmBtn4 "mmMaxControls.Button" width:50 height:25 pos:[171,25]
	groupBox grpChk "CheckButton" width:225 height:55 pos:[5,65]
	dotNetControl mmChk1 "mmMaxControls.CheckButton" width:25 height:25 pos:[15,85]
	dotNetControl mmChk2 "mmMaxControls.CheckButton" width:70 height:25 pos:[45,85]
	dotNetControl mmChk3 "mmMaxControls.CheckButton" width:72 height:25 pos:[120,85]
	dotNetControl mmChk4 "mmMaxControls.CheckButton" width:25 height:25 pos:[195,85]
	groupBox grpFlyBtn "FlyoutButton" width:110 height:60 pos:[5,125]
	dotNetControl mmFlyBtn "mmMaxControls.FlyoutButton" width:32 height:32 pos:[43,145]
	groupBox grpFlyChk "FlyoutCheckButton" width:110 height:60 pos:[120,125]
	dotNetControl mmFlyChk "mmMaxControls.FlyoutCheckButton" width:32 height:32 pos:[157,145]
	groupBox grpDrop "DropDownList" width:225 height:50 pos:[5,190]
	dotNetControl mmDrop "mmMaxControls.DropDownList" width:200 height:21 pos:[15,210]
	groupBox grpTxt "TextBox" width:225 height:120 pos:[5,245]
	dotNetControl mmText1 "mmMaxControls.TextBox" width:200 height:21 pos:[15,265]
	dotNetControl mmText2 "mmMaxControls.TextBox" width:200 height:63 pos:[15,290]
	groupBox grpSpn "Spinner" width:225 height:65 pos:[5,370]
	label mmSpn1Lab "That's draggable" pos:[15,390]
	dotNetControl mmSpn1 "mmMaxControls.Spinner" width:80 height:16 pos:[140,390]
	label mmSpn2Lab "And screen-wrapping" pos:[15,412]
	dotNetControl mmSpn2 "mmMaxControls.Spinner" width:80 height:16 pos:[140,412]
	on mmMaxControls open do
		local logoImg = dotnetObject "System.Drawing.Bitmap" @"C:\logo.png"
		local blueImg = dotnetObject "System.Drawing.Bitmap" @"C:\logoBlue.png"
		local flyoutStrip = dotnetObject "System.Drawing.Bitmap" @"C:\imageStrip.png"
		mmBtn1.text = "DotNet"
		mmBtn1.image = logoImg
		mmBtn1.imageAlign = mmBtn1.imageAlign.MiddleLeft
		mmBtn1.TextAlign = mmBtn1.textAlign.MiddleRight
		mmBtn2.text = "Controls"
		mmBtn3.image = logoImg
		mmBtn3.ShowFocusFrame = off
		mmBtn4.text = "With"
		mmBtn4.FrameOnMouseOverOnly = on
		mmChk1.text = "A"
		mmChk2.text = "3dsmax"
		mmChk2.image = blueImg
		mmChk2.imageAlign = mmChk1.imageAlign.MiddleLeft
		mmChk2.TextAlign = mmChk1.textAlign.MiddleRight
		mmChk2.ShowFocusFrame = off
		mmChk3.text = "Look"
		mmChk3.ShowFocusFrame = off
		mmChk3.FrameOnMouseOverOnly = on
		mmChk4.image = blueImg
		mmChk4.ShowFocusFrame = off
		mmChk4.FrameOnMouseOverOnly = on
		mmText2.multiLine = on
		mmSpn1.minimum = 0.1
		mmSpn1.maximum = 1
		mmSpn1.increment = .001
		mmspn1.value = mmspn1.defaultValue = 0.5
		mmSpn1.decimalPlaces = 3
		mmSpn2.increment = 1
		mmSpn2.maximum = 10000
		mmSpn2.value = mmSpn2.defaultValue = 100
		mmSpn2.decimalPlaces = 0
		mmDrop.items.addRange #("A", "DropDownList", "control", "that", "inherits", "from", "Combobox")
		mmDrop.selectedIndex = 0
		mmFlyBtn.setImageStrip flyoutStrip 4
		mmFlyBtn.toolTips = #("Easily", "Set", "Button", "Tooltips")
		mmFlyChk.setImageStrip flyoutStrip 4
		mmFlyChk.toolTips = #("Same", "Thing", "But", "Checkable")
		mmFlyChk.flyoutTime = 100
createDialog mmMaxControls

These are the bitmaps used in the example code:

Update: v1.01

I’ve updated the library to v1.01, fixing a few bugs and adding a few small methods.

  • Spinner: Backspace key was not working.
  • Spinner: now behaves correctly for resetting and cancelling a spin operation.
  • Spinner: now goes faster/slower with control/alt buttons pressed, as native 3dsmax spinner.
  • Spinner: text area would not accept the enter key when used as a DotNetControl.
  • Spinner: now shows the correct mouse cursor when dragging.
  • Spinner: ‘dragging’ behavior now only begins when the mouse has left the control area.
  • Spinner: Added .Clear() method for setting the control in an indeterminate state.
  • Spinner: Added events for ButtonDown and ButtonUp, similar to the native 3dsmax events.
  • Button: Contents are now corrently moved 1 pixel to the right and down when pressed.
  • CheckButtons: Frame is now always shown when button is checked, even if FrameOnMouseOverOnly is on.
  • Flyout controls: Opening the flyout no longer steals focus from the host dialog.
  • Flyout controls: Added .ShowFlyout() method for programmatically opening the flyout, e.g. – when you want another button to open the flyout.

Thanks to DenisT from CGTalk for catching most of these bugs.

Another Update: v1.02

I’ve fixed some more bugs and inaccuracies:

  • Spinner: Very minor change of point of transitioning from click to drag behavior, now completely matches 3dsmax.
  • CheckButton: Now shows checked background on mouse down, instead of mouse up.
  • FlyoutButton and FlyoutCheckButton: Flyout items are now correctly shifted 1 pixel right and down on mouse over.
  • FlyoutButton: ItemSelected is now also triggered when the button is clicked without the flyout opening.

mmTransformTypein: A hotkey-compatible TTI launcher

VFB+ user and architect Maxim Borisov has recently suggested a script to help make his transform-intensive work easier:

“Very often I have to move, rotate or scale my objects for some exact numbers of units, and I hate to move mouse pointer to Transform Type-in window, select the slot were to put numbers and move mouse back to objects on other side of my second screen… Idea is to get the Offset part of Transform Type-In dialog near by the mouse pointer or by hitting 4th or 5th button on mouse, or by some keyboard shortcut.”

This tiny MacroScript does exactly this. When executed, it opens the 3dsmax Transform Type-In dialog exactly where the mouse cursor is and sets keyboard focus to spinners. This allows rapid manipulation of scene objects for those users who rely on a fast-paced scene workflow.

edit (01/19/15) – the tool now takes the current axis constraints into consideration and focuses the relevant text field in the dialog.

mmRegions: A Handly Little Script for Render Region Management

Lately I’ve been seeing several requests on forums for a way to easily ‘save’ coordinates of regions in a 3dsmax scene. mmRegions is a small free script which does just that. It can store the current render region, restore previously saved regions, and even batch render several regions with one button.

All coordinates are saved as percentages, so they scale linearly with the image size. The regions can also be given a descriptive name are are visualized inside the tool. They are saved automatically inside the scene.

To use it:

  • Install the script by dragging mmRegions.mcr into a viewport.
  • Assign it to a toolbar or a keyboard shortcut from the Customize User Interface dialog. It will be found under the Monotone Minimal category.
  • Open the tool.
  • Set a render region as you normally would.
  • Press the Store Region button (first button from the left) to save the coordinates of the region.
  • Press the Restore Region button (third button from the left) to restore the saved region to the current render region of 3dsmax.
  • To batch-render several regions, use the Batch Render button (last button from the left).

UPDATE: Fixed a bug which would cause the Mental Ray VFB controls window to go blank after batch-rendering multiple regions. Thanks to Spacefrog for the report!

UPDATE #2: Updated to v1.1! New features:

  • Preview window now correctly matches render aspect
  • Now works with V-Ray Frame Buffer regions. If the V-Ray VFB region mode is enabled, creating a new region, restoring a region or batch-rendering will affect that instead of the standard 3dsmax render region.
  • Added spinners for editing the dimensions of the currently selected region.
  • Added option to export/import region data. Data can be exported either as plain text, or as Adobe After Effects keyframe data.
  • Added a confirmation window when ‘delete region’ is pressed.

Download mmRegions