Tuesday, January 06, 2009

float2 and float3 in Maya Python API

Staying true to form, Autodesk sure has made a mess of the Maya Python API. Something I ran into recently was dealing with float2:s (for MFnMesh::getUVAtPoint()). Turns out you need to go through MScriptUtil like so:
import maya.OpenMaya as om
# this creates the float2
pArray = [0,0]
x1 = om.MScriptUtil()
x1.createFromList( pArray, 2 )
uvPoint = x1.asFloat2Ptr()
# (call to OpenMaya.MFnMesh.getUVAtPoint( ..., uvPoint, ... ) 
# goes here)
# retrieve results
uv0 = om.MScriptUtil.getFloat2ArrayItem( uvPoint, 0, 0 )
uv1 = om.MScriptUtil.getFloat2ArrayItem( uvPoint, 0, 1 )

Curiously enough the '2' in float2ptr and float2array refers to 2-dimensional arrays, hence the extra 0 in the call to the latter. We're only dealing with float2& (which typedefs to float[2]) in our getUVAtPoint call, but frankly: did you expect anything else than a hackfest when you popped that Maya 2009 box open?

Python stack trace

Outputting the stack trace can be immensely useful in certain situations.


import traceback, sys

def bar():
raise Exception('Booboo')

def foo():
bar()

try:
foo()
except:
traceback.print_exc()
print 'Got here.'


Result:

Traceback (most recent call last):
File "./foo.py", line 14, in
foo()
File "./foo.py", line 11, in foo
bar()
File "./foo.py", line 8, in bar
raise Exception('Booboo')
Exception: Booboo
Got here.

Saturday, December 15, 2007

std::transform

I've heard people talking about the std::transform functions for ages, but I didn't really get around to exploring them until recently. What they bring to the table is a compact yet powerful way of performing a batch operations on stl containers, much like matlab's matrix math routines but with way more potential. You can perform common vector arithmetic such as addition, subtraction etc. but also select certain components of a container, such as the routine below that in one single line prints all the hash values of a std::map. Furthermore, by writing your code in std::transform notation you're very likely unleashing a higher degree of optimization potential in your compilers, both current and future ones. For example, the Intel compiler (I'm running 9.1 atm) immediately starts spewing out "LOOP WAS AUTO-PARALLELIZED" all over the place, which generally hasn't been too common a sight for me in the past.

Now for a couple examples, copied straight from http://www.sgi.com/tech/stl/ :

Print all of a map's keys.
int main()
{
map M;
M[1] = 0.3;
M[47] = 0.8;
M[33] = 0.1;

transform(M.begin(), M.end(), ostream_iterator(cout, " "),
select1st<map::value_type>());
// The output is 1 33 47.
}
Each element in V3 will be the difference of the corresponding elements in V1 and V2
const int N = 1000;
vector V1(N);
vector V2(N);
vector V3(N);

iota(V1.begin(), V1.end(), 1);
fill(V2.begin(), V2.end(), 75);

assert(V2.size() >= V1.size() && V3.size() >= V1.size());
transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),
minus());

Friday, December 14, 2007

The stuff of legend

So I haven't posted anything in the longest of times but today I just have to break this unintentional silence; my co-worker Nafees (bin Zafar) just walked into our cubicle with the biggest smile on his face, eyes gleaming. In his hand was a letter from the Academy of Motion Picture Arts and Sciences. It turns out he, Doug Roble and Ryo Sakaguchi have scored a Scientific & Technical Achievement Award for our internal fluid simulator FSIM! For those of you who don't know, it was one of the first fluid simulators ever to be used in a feature film - check out the flooding of Bruinen in "The Lord of the Rings: The Fellowship of the Ring" (it's the one where the ringwraiths get their asses wooped out in the river). While FSIM has seen substantial improvements over the years it remains based on their original work, and this award serves to emphasize how groundbreaking that was. So although many of these guys seldom or never turn to alcohol for comfort or joy, I just might have to get hammered tonight in their honor. Celebration!

Tuesday, September 04, 2007

readelf

Yet again abusing my blog to store random software development notes,
readelf is a linux command that dumps information about ELF-format object files (e.g. .so libraries). Just pipe it into a temp file using e.g.

readelf ~/maya/2008.cg/plugins/HairDynamics.so > out

and search for the unfiltered symbol you want to examine using your favorite text editor/grepper. This will produce a line similar to:

r19: 00000000 0 NOTYPE GLOBAL DEFAULT UND _ZN2My5Library10FileWriter4

which in this case means the particular My::Library::FileWriter is UNDefined. Highly useful when messing around with link/runtime shared object errors.