All Posts By

Patrick Macdonald

Soft Instancing and expressions

By | Hints and Tips, Maxscript, Mission Control | No Comments

In advance of more detailed documentation being added to the website, I thought I would share a walkthrough that demonstrates some of the more novel features of Mission Control that I hope some of  you will find to be a huge time-saver. By following these instructions, you will be able to:

  • Quickly ‘instance’ individual parameters between objects (so called soft-instancing)
  • Perform calculations in-cell using values and/or object parameters.
  • Create expression controllers on the fly.


Before you start, please bear in mind that the “Enter” key does not work for ending the editing of cells. You need  to click on another cell or double tap the “tab” key to finish the edit.

  • Create two omni lights; omni001 and omni002.
  • Add the multiplier parameter column to the spreadsheet.
  • Select a float value.
  • Click to start editing the value.
  • Type “=2+2” and click on another cell to end the data entry (double tapping tab also works).
  • The value should now reflect the calculation.
  • You can also submit object parameters eg “$omni002.multiplier” as part of the calculation.
  • In the multiplier for omni001, type “=(omni002.multiplier *2) + 0.5)”
  • You should now see a value that reflects this calculation.
This approach is for single hit operations; eg there is no linking.
Lets try something else :-
  • In the multiplier for omni001, type “==omni002.multiplier” (Notice the double equals sign).
  • Now if you middle-click and adjust the multiplier of omni002, the multiplier for omni001 should also update.
  • You will also notice a blue indicator on the cell. This indicates that the cell now has an animation controller.
  • What has happened is that when entering “==” you are creating a scripted controller with the script entered following this prefix.
  • You can edit this expression in two ways.
    • double click the cell to open the expression editor.
  • or
    • click the status-bar to open the util bar.
    • Select the “Animation” tab.
    • Select the animated cell.
    • you should now see the expression in the ‘Expression’ box below.
    • You can also add notes to the “Notes box” which will be stored in the script controller.
    • You can now copy and paste this scripted cell to other cells as instances to quickly link the multipliers of many lights.

Mission Control : Lighting with VRay RT

By | Uncategorized | No Comments

Mission Control provides an easy way to adjust complex lighting in your scenes, especially when combined with a realtime renderer such as VRay RT. Make adjustments on multiple lights with the drag of a mouse. Apply absolute or relative adjustments (stepping up or down for example). Apply relative or absolute randomisations.

There are a number of ways to edit values.

1. Direct entry. You can click the cell and enter a new value.

2. Copy/Paste. You can copy and paste a value; both as a copy and as an instance. This is a very powerful feature as it allows you to very quickly make soft-instances of objects where only a small number of parameters are instanced, rather than the entire object.

3. Spinner. You can click single or multiple values and whilst holding the middle mouse button down, drag to raise or lower the value. Dragging left and right provides fine adjustment, whilst dragging up and down makes large adjustments.

4. Mass editing. Beyond these standard methods, there are a selection of more powerful tools in the util panel that allow mass editing of values in a number of ways.

Absolute :
You can apply a single value to all the selected cells.

Relative :
You can add, subtract, multiply or divide by the specified value all the selected values. This provides a nice way to adjust values by specific amounts or proportions.

Random relative :
You can set a minimum and maximum of a random value to add to the values of your current selection.

Random absolute :
You can apply a random value to the selected cells between the minimum and maximum values specified.

Stepped :
This allows you to apply a number sequence to the selected cells with the specified step size. Useful for quickly applying material IDs, or for placing objects a set distance apart for example.

Spaced :
This applies a number sequence to the selected cells equally spaced between the minimum and maximum values specified.

All of these operations can be applied to all the selected cells, or using a conditional operator allowing you to only affect values that are equal to, not equal to, greater than or less than a specified value.

Mission Control vs Light-lister : An update

By | Blog, Mission Control, News | No Comments

It has been quite some time since I released a performance comparison between Mission Control and the ‘light-lister’ that ships with 3ds Max.

Since there have been some big performance gains since then so I thought it would be interesting to see how the latest version of Mission Control stacks up.

I’ll leave it to you to draw your own conclusions!


Coke Buildings Making Of

By | Advertising | No Comments
I was lucky enough to work on this great spot at Nexus Productions last year, and I recently came across this making-of that shows a glimpse of the hard work that was involved.
It was a amazing to see, up-close, the incredible attention to detail that the model makers put in to their 1/10th scale that our CG characters were to inhabit.

I was tasked with taking the reference photography and spherical HDRs and generating light rigs for each scene. Ben Cowell went the extra mile to make this process as painless as possible by providing some very cute 3d-printed maquettes of some characters which were placed into reference photography to help us achieve a good match in CG.

This is the first time I had seen 3d printing used in this kind of situation and it is definitely something I would try to do again in the future. You can’t do much better than having your CG characters shot for real in your plates!

Quick Script Controllers

By | Uncategorized | No Comments

I came across a request by Shimakaze on the V-Ray forums for a way to quickly connect many objects on the modifier level without completely instancing them.  Given how long it would take to do this manually; either by wiring parameters, or copying controllers, another approach was required. This is precisely the kind of task that Mission Control aims to simplify.

Mission Control allows you to enter scripts directly in to any float value cell. You can use this to easily instance values between object, modifier, or material values; or you can enter complex scripts that will evaluate on every tick.

Here’s a short clip showing how easy it is to link the radius of a sphere to a slider manipulator.

  • Select the source controller (in this case the slider value cell), and click “copy” in the context menu. This causes MC to hold a reference pointer to this cell.
  • Navigate to the sphere’s class to list the spheres in the scene.
  • In the radius cell of a sphere, click to start editing the value, and then enter the script “=target”. Starting an edit with a “=” symbol tells MC that an expression is being entered. The “target” token is used to grab the controller from the previously copied cell (slider.value.controller). This is then placed within a variable in a script_float controller called “target” and ensures the script remains functional if the object gets renamed.
  • Once the expression has been added, you can edit it by double clicking on the cell which brings up the dialog for the controller.

Quick Script Controllers

Cameramap Gemini for 3dsmax 2015 released

By | Blog, News | No Comments

A quick heads-up for everyone out there suffering the limited function of the built in camera mapping tools in 3ds max.

Marcus Boos launched an Indigogo campaign to have his “Camera Map Gemini” plugin recompiled for 3ds Max 2015 which was quickly funded.  The latest version is now available to download for free from his website.

Here are some of the key features :


  • supports up to 10 individual projections ( = camera & map channel ) within 1 modifier, good for complex projection setups
  • custom projection resolution settings and not tied to render resolution, more flexibility for aspect ratios that diverge from rendered output image
  • all projections can be toggled on and off individually within the modifier
  • projection camera names clearly visible in separate scrolling text field
  • projection cameras directly selectable in the modifier panel
  • acts like a WorldSpace Camera Map modifier, takes object and camera transformation into account (this means if an object is moving through the projection it will update every frame), projections will always stay “live” and recalculate on the fly if the camera or the projected object is animated
  • is in fact a regular ObjectSpace modifier, so other modifiers still can go on top
  • more stable than 3ds max’s default Camera Map object space and world space modifiers, no more lost connections to cameras or mapping channel numbers when cloning, no reassignment necessary
  • works properly as instanced modifier, many objects can share the same projection setup
  • all parameters exposed and controllable via MAXScript
  • since it is a modifier that projection results can be seen in viewport by turning on map
  • option to act as an object space modifier so that projections are frozen at a certain frame
  • custom resolution per projection channel, each projection can have its own map size now
  • per pixel rendering supported by custom CameraMapGeminiMap. It works like the CameraMapPerPixel map but reads out modifier’s settings so projections only need to be set up once (in modifier).
  • CameraMapGeminiMap has additional controls for projection angle threshold, toggles for projecting on back faces and faces behind the camera
  • fully backwards compatible from MAX 2012. If scenes are saved out from MAX 2012 in the MAX 2010 or MAX 2011 file format, plugin data will load properly in those earlier MAX versions


DataGridView Sorting Sorted!

By | Blog, Maxscript | No Comments

I encountered this issue whilst developing my plugin Mission Control; if the dotNet dataGridView has been sorted using the column headers, it seems that the indexes returned by (dgv.selectedRows()).item[#].rowindex or the tags returned by (dgv.selectedRows()).item[#].tag.value all point to the non-sorted rows of the dgv.

This would be a big problem for my plugin as being able to sort the spreadsheet is a key functionality of the tool and the only alternative method I could think of was to put all my data through a dataTable… not something I was keen to implement at this stage of the development.

Thankfully, after a little experimentation I realised that dgv.selectedRows() wasn’t the only way to obtain the current selection of a sorted dgv; I could have used dgv.selectedCells() and then collected the unique rowindex’s or row pointers from my tags. Although this is slightly heavier in terms of processing more data (especially with large selections of many columns), a solution that works slowly is better than no solution at all!

Problem solved!

…thanks due to DenisT (cgtalk forums) for the encouragement!

Skip to toolbar