With Arnold, it’s all in the ICE tree. SItoA looks for attribute names like ArnoldLight_intensity and automatically uses those attributes to set the corresponding parameter values on the point_light nodes it exports to Arnold.

Category Archives: ICE
Integer division in ICE
Dividing an integer N by itself doesn’t always give you 1.

I think it’s a problem in the Divide by Scalar node (the division is probably returning a scalar like 0.99999999, and then that is truncated to zero when it is converted to an integer).
A workaround is to do all your division with scalars, and then use modulo to determine whether you Round or Floor the result. Here’s an example compound by Guillaume Laforge:

Missing ICE nodes in the preset manager
I’ve noticed this a handful of times, where a node like Get Data isn’t found in the preset manager. Clicking the Update button always fixes it for me.

The last time this happened, instead of clicking Update, I started Process Monitor and did a few more searches in the preset manager. In my case, Softimage searching only the compounds, not the presets in %XSI_HOME%\Data\DSPresets\ICENodes. That’s why nodes like Get Data weren’t found.
Clicking Update forced Softimage to search both the compounds and presets.
Context matters: Using weightmaps with point clouds
A weightmap is per-point, but it’s per-point on the emitting geometry, not the point cloud. So you can’t just do a plain “get weights” if you want to use the weightmap to control particle values like Velocity or Speed.

Instead, you use get a location, like the particle emit location, and then get the weightmap value at that location. Then you’ll have a particle per-point context to work with.

When you get the weight at a location, you get an interpolated weight value.
ICE: Deleting Polygons
Emitting strands from a polygon cluster
Here’s a simple ICE tree that emits strands from a polygon cluster.

A general technique for these kinds of filtered emissions is to delete the points you don’t want. In this case, we check Cluster.IsElement. The tricky part is that Cluster.IsElement is a bool-per-polygon attribute, so we need to get into a per-point context. To do that, we get the emit location, which is per-point, and then at that location, the value of Cluster.IsElement. Now we’re in a per-point context, and we can use those per-point boolean values to delete points.
Note the use of Not instead of an If. We know IsElement is False for points that were not emitted from the polygon cluster, so we can logically negate it with Not to get True and feed that into Delete Point.
In pseudocode, we do this:
if not( IsElement ) delete point
instead of
if (IsElement == False) then delete point
Of course, for filtering we could just drill down into Emit Strands and set the filter on the Generate Sample Set nodes.

Using geometry queries to find and update points
ICE: Removing every Nth element from an array
Copying vertex attributes to polygons
Here’s a question that came up on si-community awhile ago. How do I copy vertex attributes to the corresponding polygons?
This answer is the companion to this polygon-to-vertices post. I basically do the same thing, but in the opposite direction.
Screenshots of the week
Rendering Vector
by olivier jeannel

Curve Retopo
by Land-Y

More fur additions
Compression Matting on fur controlled by texture map
Athens Tech Demo Siggraph 2013
Rigging Technical Reel made using Softimage at One Animation






