Friday, December 21, 2012

Red9 Studio Pack v1.27 released!

Well I've finally finished the Red9 Studio Pack v1.27 release so Happy Christmas to you all!

See details here:

Download either follow the link of the Red9 blog or grab it at CreativeCrash:

Have a great Christmas, any questions or feedback just nag me!


Wednesday, December 12, 2012

Animation Binder integrated to Red9

With the next build of Red9 Studio Pack (v1.27) I've integrated my AnimationBinder MasterClass toolkit into the setup, means I can expand it a little and make use of the rest of the pack. I added a small fix to the bake calls too, it now runs Euler filters and delete static for curves after the bake to try and clean up the resulting rig data.



Saturday, December 8, 2012

Red9 Studio Pack!

Red9 Studio Pack : 
Well time to come clean, as some of you already know I've been writing my own Studio Tools setup for Maya and thought it about time I actually put my name to it! Whats in it, god where do I start, lots of tools for Animators, Rig management, MetaData API, Pose Library and it's expanding daily as it's gradually battered more and more at work. For more details check the Red9 Blog in my links, at some point I'll merge both Vimeo channels and maybe blogs, either that or I'll leave the Red9 blog just for the pack.

They'll be a big update in the next week or two and I'm starting to do a ton of new demo videos. For those of you who've been testing the build thankyou, if anybody wants more info drop me a mail.



Monday, November 26, 2012

Eurocom - Sad news...

Pretty sure everybody in the industry knows about this now but if not, Eurocom laid off 150+ staff on Friday, lots of very talented people back on the jobs market in tough times. End of an era as the whole Art Pipeline team were amongst the lay-offs so the pipeline I started 10years ago now lies dead and unloved :(
oh well, on-wards and upwards.

Good luck guys, we were all gutted about the news and wish you all well


Monday, November 12, 2012

Maya string attr - 32k limit

Just thought I'd spread this in case anybody else is thinking of using a json string to dump data to an attribute in Maya.

Discovered last week that you can happily set a string attr to any length BUT, and it's a big but, if you subsequently select the textfield (you don't even have to edit it, just select it) then Maya runs a change callback and the string is now clamped to 16bit = 32,767 characters. It was driving me mad last week as I kept getting errors in the json decoder when I tried to read a pose back that I'd serialized to a string on our characterNode. I want to store a zero pose on the Character Node along with some extra data that I'm pushing to a dict, json.dumps is a really nice way to that push that dict to a string and store it and then retrieve it back in it's original form with json.load()

Try it for yourself!
import pymel.core as pCore
Cone.addAttr('json_test', dt='string')
data= "x" * 40000

len(Cone.json_test.get()) #>>40000
Now just open the Attribute Editor and just select the json_test textfield - don't edit it, just select it
len(Cone.json_test.get()) #>>32767
Only thing you can do to stop this truncation is to lock the attr, that way it gets stored correctly and doesn't get truncated.


Monday, October 1, 2012

MasterClass - I missed this one off!

Not sure how I missed off this button in the UI but I obviously did. Just updated the MasterClass module so that the MakeStabilizer button is in the UI. This is the call I used to make the stabilized wires that extract the animation data from the raw point cloud data in the MasterClass



Wednesday, September 26, 2012

Maya 2013 Extension Pack and SP2

Well the Extension Pack to 2013 is out and available for download from the Subscription centre here:

Autodesk Extension Pack 2013

Something to be aware with this release is that its NOT binary compatible with 2013 which means all your plugins will need recompiling for it, see this post by Cyrille:

Around The Corner

Something you have to ask is....why, why have an extension pack AND an SP2 pack?? What's the difference? Well the SP2 has all the bug fixes but none of the extras like the Scene Assembly (the reason this version isn't binary compatible) so there are very different builds, but my question who needs the SP2 pack. Bear with me. So you've bought Maya within the last year which means you get support for the year so have access to the Extension pack. If you've not bought within the last year but are on support then you have access to the Extension pack. If you bought Maya last year and didn't renew your support then you wouldn't have 2013 in the first place, so who needs the SP2 pack???


Thursday, September 6, 2012

Lost Animation - Part2!

God how many times have I been asked for this since posting the 'Lost Animation' thread nearly a year ago now. So here's a complete and utter dirty hack for those who have requested it. Unlike the other fix code this is completely blind. You select the controllers that are no longer connected to the animation data that they should be, and this, in an ideal world, will reconnect the required animCurves for you.

There are a few HUGE expectations here, mainly that the scene is clean and that the animCurves are still consistently named against the channel they were keyed against. As I said, this is a hack but it seems to be what a lot of people are in need of.

So the expectation is that an attr on a controller called NameSpace:L_Foot.translateX should be connected to NameSpace:L_Foot_translateX, or L_Foot_translateX depending on the flag stripNamespace thats in the code.

As I said, this is a really quick hack, but I figured what the hell. Oh and if the data went through AnimLayers....sorry, you're stuffed!


import maya.cmds as cmds,l=True)

#Change this to False if the curves are not in the rootNamespace but
#in the sameNamespace as the controllers.

#build up the main lists'animCurve',s=True)
[chns.extend(cmds.listAnimatable(node)) for node in nodes]    
for chn in chns:
    if stripNamespace:
    if animCurveExpected in animCurves:
        if not cmds.isConnected('%s.output' % animCurveExpected,chn):
            print '%s >> %s' % (animCurveExpected,chn)
            cmds.connectAttr('%s.output' % animCurveExpected,chn,force=True)

Saturday, August 18, 2012

Autodesk Masters!!!!!

Didn't realize till Friday I was on the shortlist of the Autodesk Masters Nominees, thanks to those who put me forward, now come on, VOTE!!



Thursday, July 19, 2012

Well it's official, off to pastures new after 11 good years at Eurocom. I'm off to Crytek UK in a few months to be their Technical Animation Director, new start, new pipelines and a big challenge, bring it on!

Friday, June 29, 2012

BUG: Just to confirm!!!

2013 SAP rotate Order, here you go! Not good, do NOT INSTALL for animations as you're going to be in a world of pain with this release. Confirmed as a bug with AD.

MAYA 2013SAP : BUG: rotateOrders from Mark Jackson on Vimeo.

Thursday, June 28, 2012

BUG 2013 - Huge Bug for Animation

WARNING: we've, or rather Brad's just found a kick ass bug in 2013 SAP release. The rotation orders are broken, doesn't matter what you change them too, gimbal still happens as if it were set to xyz order. Kind of a major bug me thinks, see what AD have to say about it. It's fine in the initial 2013 release.

Wednesday, May 30, 2012

MasterClass Binder Module updated

Thought I'd share an update to the MasterClass as requested by a friend who was having problems binding up a Quadruped. In the original file that I shipped with the MasterClass there was a call for making the AimBinder node that I show in the class but I never added it to UI call. So this new file has a button, "AimBinder" that builds the complex AimBind for you in one go.

This button call expects 3 nodes selected. The first is the node that you want the bind to aim at, the second is the Controller on the rig you want to drive and the third becomes the parent to the bindNode itself as well as being used to parent an UpVector locator to stop the aim from spinning. Its basically the node as I build manually in the video.




Monday, May 14, 2012

Bug: listCameras

Never noticed this bug before, you look in the Camera drop down to select a camera for a panel and some of the cameras show the shape name not the transform, so we did a bit of digging. Turns out the code that builds the Panels>Perspective menu is buggy.

From the code reference: listCameras  
Command to list all cameras. If no flags are given, both perspective and orthographic cameras will be displayed. This command returns an array of camera names. When the transform name uniquely identifies the camera it is used, otherwise the shape name will be returned.

Which is wrong as if you simply parent a cube under a camera transform all of a sudden in the camera menu you'll get perspShape not persp. So who cares right? Well in our case I'm using cmds.modelPanel(self.Panel,q=True,cam=True), which must use the same code under the hood and thus returns the CameraShape node and not the Transform depending on if you have something parented to the camera or not.


Thursday, April 12, 2012

Autodesk 2013 - Released

Just seen that the Autodesk 2013 product drop has finally happened, all now available on the Subscription center!

Tuesday, April 10, 2012

Taking Animations from 2012 back to 2011

AutoTangent type:

  This is something we discovered last week, to be honest I should have figured it before but as a lot of the data passing between 2012 and 2011 at the studio is baked MoCap nobody spotted this issue. 

The problem is the new 'AutoTangent' type in Maya 2012. So lets say you start animating in 2012 but need to pass that data back to somebody running 2011. We already know Maya binaries between the two are incompatible, so you save and an Ascii file and that works. The issue is that by default in Maya2012 the tangent type is set in the prefs as the new 'AutoTangent'. Now this is great and to be honest a big improvement over the standard spline tangents. BUT.... Maya 2011 doesn't know anything about it. The key data still loads up, but the tangent types of each keyframe in2011 remain unset which means any interpolation between keys you did in 2012 is now screwed! 

 If you intend to do this, go from 2012 back to 2011 DO NOT use AutoTangent when keying.

Monday, April 2, 2012

Maya2013 - Announced

Cory's finally posted up a rundown of Maya2013 features...full post here:

Friday, March 23, 2012

Trax Blending, finally the Tech Preview is out

At last, Cory's just posted the Trax Blending tech preview up here, something I've been working with the Maya dev team on for the last 6 months or so.

I might follow this up with a few more examples over the next few weeks. Basically it allows you to properly redirect animation data and complex rigs in the Trax, lining motion up using the ghosts, kind of taken tech from MotionBuilder. We've been testing this on raw MoCap data and Rigged data, only been begging for the guys to do this for 7years! :)  Theres also an automated match function, you select the offset node from the data and hit the match, it'll take the first and last frames from 2 clips and line the general motion up based on those.

Friday, March 2, 2012

MasterClass download links

I've just moved the MasterClass modules into a sub-folder in Google Docs as it's really confusing now linking to Python modules, it just looks like the files don't exist when you click on them. Thanks to Jaewon Song for pointing this out.

Download link : MasterClass Python Module (Pymel and Cmds versions)

Thursday, January 26, 2012

Maya 2012 SP2

Maya 2012 Service Pack 2 has just gone up for download.

As usual the Bug Fix list is completely useless for anybody in serious development. I still to this day don't understand why the AD bug database isn't opened up more so developers can actually track what the bug was and what it's effect is. Saying :

MAYA‐6772: Referencing in an object causes crash

Is completely meaningless except for the guy who submitted the bug in the first place. I want to know what the actual details of the crash were so we can test our pipeline and maybe remove wrapper code that we added to deal with it.

ReferenceQuery Madness!

If you're managing references in Maya and coding functions around it you'll know that the reference commands and query commands available to you are very limited. But here's a kicker that I found yesterday that to me, makes absolutely no sense what-so-ever!
So we all know how flaky the referenceEdit list is, but here's a bit of logic for you that we didn't realize until one of our tools started playing around.

Simple test, make a sphere in a fresh scene and save it, then reference it back into a new scene. Now make a cube and parentConstraint the referenced sphere to it. Now look at the referenceEdits, you should see this:

All well and good. So you'd think that if you queried the refEdits that's exactly what you'd get right? No
cmds.referenceQuery('SphereRN', successfulEdits=True, failedEdits=False, es=True) 
[u'parent -s -r "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1" "|Sphere:pSphere1"',
 u'connectAttr "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintTranslateX" "|Sphere:pSphere1.translateX"',
 u'connectAttr "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintTranslateY" "|Sphere:pSphere1.translateY"',
 u'connectAttr "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintTranslateZ" "|Sphere:pSphere1.translateZ"',
 u'connectAttr "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintRotateX" "|Sphere:pSphere1.rotateX"',
 u'connectAttr "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintRotateY" "|Sphere:pSphere1.rotateY"',
 u'connectAttr "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintRotateZ" "|Sphere:pSphere1.rotateZ"',
 u'connectAttr "|Sphere:pSphere1.rotateOrder" "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintRotateOrder"',
 u'connectAttr "|Sphere:pSphere1.parentInverseMatrix" "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintParentInverseMatrix"',
 u'connectAttr "|Sphere:pSphere1.rotatePivot" "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintRotatePivot"',
 u'connectAttr "|Sphere:pSphere1.rotatePivotTranslate" "|SphereRNfosterParent1|Sphere:pSphere1_parentConstraint1.constraintRotateTranslate"']
So when you use the default query calls you actually get the edits back as if the refNode was in an unloaded state, note the connections to the fosterParent which would get created if I actually did unload the reference! Why, why the hell would you want the default option to return the data in an format that was currently invalid.

So there is a way round it, you use the 'liveEdits' flag. All good right, NO, the liveEdit flag returns the data WITHOUT THE DAG PATH! Short names, who the hell returns short names in any code blocks.
cmds.referenceQuery('SphereRN', successfulEdits=True, failedEdits=False, es=True, le=True)
Rant over, gotta go find a way round this now!


Tuesday, January 10, 2012

fileDialog2 in Maya2012

Just thought I'd point out a change in the Maya fileDialog2 command return in 2012. So lets say you run the following and in the dialogue you type in a filename 'BloodyGreat' but don't add any file extension
import maya.cmds as cmds
print cmds.fileDialog2(fm=0)[0]
In Maya2011 the return would be what ever the path you browsed to + 'BloodyGreat' but in 2012 the return now handles filenames without extensions by adding .* to the path, so the return would now be 'BloodyGreat.*' This has broken a number of our old UI's as we expect to be able to strip the extension off inorder to force the correct one. Easy fix, but a bugger to find the bug in the first place!

Our issue was that we were using `substitute $ext $filepath ""` so now that the $ext is .* you're substituting a wildcard for nothing, which returns, NOTHING!

One last thing to point out with this, if you'd passed in any fileType filters to the command then the return will pick the current type and return that extension, which I guess is a good thing. This .* is only when the dialog is set to 'All Files' Mark