Updating MtoA 1.2.7.3 with Arnold 4.2.14.0


MtoA 1.2.7.3 ships with Arnold 4.2.13.

If you want to take advantage of the improvements in Arnold 4.2.14.0 (like the increase  in the maximum number of threads from 128 to 256), here’s what you need to do:

  • Download  Arnold 4.2.14.0 and extract the archive
  • Replace Arnold (libai.so, ai.dll, libai.dylib), kick, and maketx in the MtoA bin folder with the versions from the Arnold 4.2.14.0 download
  • Replace the Arnold Python bindings in  the MtoA scripts/arnold folder with the Python bindings from the Arnold python/arnold folder. For example, replace this folder:
       C:\solidangle\mtoadeploy\2016-1.2.7.3\scripts\arnold

    with the python\arnold folder from the Arnold 4.2.14.0 download. For example:

       C:\solidangle\arnold\Arnold-4.2.14.0-windows\python\arnold

You must update the Arnold Python bindings, otherwise MtoA won’t load. That’s because Arnold 4.2.14.0 included a number of API changes, including the removal of some API (like AiLicenseSetServer). The older Python bindings still refer to the removed API, so there will be Python errors that prevent MtoA from loading.

[Arnold] Loading plugins when you edit ASS files


If you’re using the Arnold API to update ASS files (for example, to change paths), you need to load all the plugins (aka shaders) that are referenced by the ASS file. Otherwise, the unknown nodes are skipped on load, and therefore won’t be in any ASS file you write.

For example, if you set ARNOLD_PLUGIN_PATH to point to the locations of the MtoA shaders and any custom shaders you use, then you could do something like this:

from arnold import *
import os

AiBegin()
AiMsgSetConsoleFlags(AI_LOG_ALL)
AiLoadPlugins( os.getenv( 'ARNOLD_PLUGIN_PATH' ) )
AiASSLoad("original.1001.ass", AI_NODE_ALL)

#
# Do your edits here
#

AiASSWrite("edited.1001.ass", AI_NODE_ALL, False)
AiEnd()

[MtoA] [Scripting] Setting the output image format


Settings like the image format and compression come from the defaultArnoldDriver node, so to set them through scripting, you need to set defaultArnoldDriver attributes.
ImageFormat_ai_translator

The image format corresponds to the ai_translator attribute.

# Python
import maya.cmds as cmds
cmds.setAttr( 'defaultArnoldDriver.ai_translator', 'exr', type='string' )
# PyMel
import pymel.core as pm
d = pm.PyNode( 'defaultArnoldDriver' )
d.ai_translator.set( 'exr )
// Mel
setAttr "defaultArnoldDriver.ai_translator" -type "string" "jpeg";

The rest of the attributes are named a little… better 😉 Here’s a Python snippet to list the driver attributes and their values:



from maya.cmds import *
sn = cmds.attributeInfo( inherited=False, short=True, type="aiAOVDriver" )
for s in sn:
    print "defaultArnoldDriver.%s = %s" %( s, cmds.getAttr( "defaultArnoldDriver.%s" % s ) )

[SItoA] Getting user parameters in the render tree


Arnold nodes can have user-defined parameters, like MyColor in this ASS snippet:

polymesh
{
 name grid3.SItoA.1000
#
# ...
#
 declare MyColor constant RGBA
 MyColor 0.703999996 0 0.526000023 1
}

In Softimage, there are a number of ways you can assign data like MyColor to a polygon mesh. You could use ICE:
userparam_ice_attribute
Or you could use the Arnold User Options property:
userparam_user_options
To access MyColor in the render tree, use the Color Attribute shader:
MyColor_render_tree
If you used ICE, MyColor will appear automatically in the Attribute list. But if you used the User Options property, you’ll have to use a script one-liner to set the Attribute value. That’s because Softimage doesn’t know about the user parameters on Arnold nodes: those come into existence only when SItoA translates the scene to Arnold.

Application.SetValue("Sources.Materials.DefaultLib.Material.Color_Attribute.attribute", "MyColor", "")

On a related note, the MtoA shader userDataColor does the same thing as the SItoA Color Attribute shader: it uses AiUDataGetRGBA() to get a color from a user parameter on the object being shaded. With SItoA 3.0, the Arnold > DLL Shaders menu makes it pretty easy to use an MtoA shader in Softimage.
mtoa_userDataColor

[SItoA] More about particle shapes


For the Point, and Sphere particles shapes, you get a single Arnold points node. For example, for the Sphere shape, you’d get a points node that looked something like this:

points
{
 name pointcloud.SItoA.Sphere.5000
 points 54 1 b85POINT
8LLwt8;`)381]^28S`W`8:l)EadWuf8[iB>89m7taW>aAaX=rn8...
 radius 54 1 b85FLOAT
!8Fcb9$$$$Z
 mode "sphere"
 visibility 255
 sidedness 255
 matrix
 1 0 0 0
 0 1 0 0
 0 0 1 0
 0 0 0 1
 shader "Sources.Materials.DefaultLib.Material.standard.SItoA.5000.2.sta_shading_group"
 id 832
}

This particular node is for 54 points in sphere mode. For each point, you get the center position (the points.points parameter) and a radius (the points.radius parameter). If there’s any scaling applied to the particle in ICE, the radius is multiplied by the X scaling of the particle.

For the Point shape, you get an Arnold points node in “disk” mode, with radius = size * X scaling.
points_disc_mode

For the other supported shapes, you get the corresponding Arnold shape.

[SItoA] Arnold, ICE, and Shapes


particle_shape
SItoA translates ICE particle shapes to native Arnold shapes. The supported particle shapes are already documented here, but here’s a little more information about how they are translated.

ICE Shape Arnold Shape
Point points (mode “disk”)
Disc disk
Rectangle box (with 0 height)
Box box
Sphere points (mode “sphere”)
Cylinder cylinder
Cone cone
Instance Shape ginstance

The Segment, Capsule, and Blob shapes are not supported. SItoA skips them and they are not translated into the Arnold scene source.

[SItoA] Subdivision settings for polygon meshes


To show you where the polygon mesh subdivision settings are in Softimage, I’m going to start in Arnold and work back into Softimage via SItoA.

So, let’s start with an Arnold polymesh shape, which has a number of subdivision parameters:

C:\solidangle\Arnold-4.1.3.3\bin>kick -info polymesh | find "subdiv"
ENUM          subdiv_type                       none
BYTE          subdiv_iterations                 1
FLOAT         subdiv_pixel_error                0
NODE          subdiv_dicing_camera              (null)
ENUM          subdiv_adaptive_metric            auto
ENUM          subdiv_uv_smoothing               pin_corners
BOOL          subdiv_smooth_derivs              false

In Softimage, you access most of these subdivison parameters by adding an Arnold Parameters property to a polygon mesh (you can’t add new parameters to Softimage built-in objects like a PolygonMesh, so we have to use a custom property).

  • subdiv_iterations
  • subdiv_pixel_error
  • subdiv_adaptive_metric
  • subdiv_smooth_derivs (Shape group)

Other Arnold subdiv parameters are mapped to existing Softimage parameters:

  • subdiv_uv_smoothing is mapped to Smooth when subdividing in the
    Texture Projection Property Editor. If Smooth when subdividing is enabled, then subdiv_uv_smoothing is set to pin_corners; otherwise, it’s set to linear.
  • subdiv_type is mapped to the Subdivision Rule list in the Polygon Mesh property editor. Linear goes to linear, and anything else (XSI-Doo-Sabin, Catmull-Clark) goes to catclark.

Finally, subdiv_dicing_camera is on the Subdivision tab of the global Render Settings.