Triggerfish: From Cape Town to the World

Area of a triangle
by Sue Sauer

Timewarp entire scene
by NNois

ICE push particles away from curve
by Vincent Ullmann


Softimage Ice: how to rig a train in five minutes
from Bradley Lewis
Triggerfish: From Cape Town to the World

Area of a triangle
by Sue Sauer

Timewarp entire scene
by NNois

ICE push particles away from curve
by Vincent Ullmann


Softimage Ice: how to rig a train in five minutes
from Bradley Lewis
While it is true that non-zero values are considered True, this applies only to input values. ICE nodes that return a boolean value will always return either 1 or 0.
Based on this, you can do an element-wise logical operation on array by summing up the array elements.
If the sum is greater than zero, then you know there was at least one True value, so a logical OR would return True. And if the sum was less than the array size, then at least one boolean element is False, so a logical AND would return False.
Here’s a little Python snippet that shows how to write to the DataArray of an ICE attribute.
from siutils import si
si = si() # win32com.client.Dispatch('XSI.Application')
from siutils import log # LogMessage
from siutils import disp # win32com.client.Dispatch
from siutils import C # win32com.client.constants
pc = si.GetPrim("PointCloud", "", "", "")
a = pc.ActivePrimitive.AddICEAttribute("MyScalarArray", C.siICENodeDataFloat, C.siICENodeStructureArray, C.siICENodeContextSingleton )
a.DataArray = [[ 0.03, 3.33, 2.22, 3.333 ]]
a = pc.ActivePrimitive.AddICEAttribute("MyLong", C.siICENodeDataLong, C.siICENodeStructureSingle, C.siICENodeContextSingleton )
a.DataArray = [3.1416*1000]
a = pc.ActivePrimitive.AddICEAttribute("MyScalar", C.siICENodeDataFloat, C.siICENodeStructureSingle, C.siICENodeContextSingleton )
a.DataArray = [3.1416]
#
# Add some Attribute Display properties
# to show the attribute values
#
p = pc.AddProperty( "AttributeDisplay", False, "" )
p.Parameters( "attrname" ).Value = "MyScalar"
p = pc.AddProperty( "AttributeDisplay", False, "" )
p.Parameters( "attrname" ).Value = "MyLong"
p.Parameters( "offsety" ).Value = 16
p = pc.AddProperty( "AttributeDisplay", False, "" )
p.Parameters( "attrname" ).Value = "MyScalarArray"
p.Parameters( "offsety" ).Value = 32
I tried to do the same thing in JScript, but I couldn’t get it to work for arrays. Very frustrating.
pc = GetPrim("PointCloud", "", "", "");
a = pc.ActivePrimitive.AddICEAttribute("MyScalarArray", siICENodeDataFloat, siICENodeStructureArray, siICENodeContextSingleton )
a.DataArray = [[ 0.03, 3.33, 2.22, 3.333 ]]
// WARNING : 3390 - This ICEAttribute doesn't refer to a 2D array: <Attribute: MyScalarArray>
//
a.DataArray = [ 0.03, 3.33, 2.22, 3.333 ]
// WARNING : 3392 - Invalid offset specified while extracting data from this attribute: <Attribute: MyScalarArray>
// <Offset: 108384008>
//
// But this does works
a = pc.ActivePrimitive.AddICEAttribute("MyLong", siICENodeDataLong, siICENodeStructureSingle, siICENodeContextSingleton )
a.DataArray = [3000]
PS You can find some usage of DataArray in the CrowdFX plugin (in the Softimage install dir).
Arnold always renders shapes as if they were lofted along the strand. It doesn’t matter whether you clear the Loft Shape along Strand checkbox in the Create Strands PPG, the shape will always be lofted in the render, like this:

If you want your instance shapes to be distributed along the strands, you could use a second point cloud to put the shapes along the StrandPositions:

If you find this slows down your viewport, change the Particle Display to points.
2D arrays are not a native type, so I don’t think you can build a 2D array from a string without using a Repeat. As the docs say: The Array2d compounds mimic an array of subarrays

So, here’s something I whipped out during my break from “real work” 🙂
Q: How can a seemingly empty array create user normals ???

Continue reading

Here’s a modified version of Mr Laforge’s compound that does the extrusion length and inset based on polygon area. Yeah, it uses a Repeat so I don’t think you would use it on a dense mesh and then just leave it in the stack to be reevaluated over and over.

The main idea is that you have to store the polygon indices (and the lengths and insets) before you do the extrude.
See also ICE Modeling – extruding polygons with random lengths