At last I've had time to sit down and do a full run through of the Red9 Studio Pack. Many more demos to come so watch out.
thanks
Mark
Red9 StudioTools have been born out of frustration at Autodesks reluctancy to add some of these core features and workflows into Maya itself. Why OpenSource, well I want to give something back to the industry as I feel damn sorry for studios without the benefit of a large R&D department to craft pipelines around them. The Studio Pack is designed to speed up a modern animation pipeline. All comments and suggestions are welcomed. For more info mail me :)
Saturday, 29 December 2012
Friday, 21 December 2012
It's DONE!! Happy Christmas all!
Red9 Studio Pack v1.27
Well Happy Christmas all, as you may know I've been beavering away really hard on the Studio Pack and have finally nailed down a build that I'm happy with, I've just updated the download link with Studio Pack v1.27 final. What's changed, well if you're running metaData then you may want to check the __setattr__ and addAttr changes as I've modified the way that I handle attrs, specifically enums and message links. Thanks to Josh Burton and a few others for pushing things ahead and nagging me!
PoseSaver has had more work done on it and YES videos will be done over Christmas, after the beer and whisky has worn off that is. The PoseSaver module also now has a compare class for verifying that one pose matches another. This is designed initially for me to run in the unittests, but also a very useful production tool, being able to say that this pose == that pose with a tolerance for checking float data.
Anyway, Happy Christmas all, nag me for more info or just keep checking for the Vimeo posts over the new year.
Download from CreativeCrash
Download from Google Drive
Mark
Well Happy Christmas all, as you may know I've been beavering away really hard on the Studio Pack and have finally nailed down a build that I'm happy with, I've just updated the download link with Studio Pack v1.27 final. What's changed, well if you're running metaData then you may want to check the __setattr__ and addAttr changes as I've modified the way that I handle attrs, specifically enums and message links. Thanks to Josh Burton and a few others for pushing things ahead and nagging me!
PoseSaver has had more work done on it and YES videos will be done over Christmas, after the beer and whisky has worn off that is. The PoseSaver module also now has a compare class for verifying that one pose matches another. This is designed initially for me to run in the unittests, but also a very useful production tool, being able to say that this pose == that pose with a tolerance for checking float data.
Anyway, Happy Christmas all, nag me for more info or just keep checking for the Vimeo posts over the new year.
Download from CreativeCrash
Download from Google Drive
Mark
Wednesday, 12 December 2012
More MetaData goodness
I've just been adding to the MetaClass addAttr() call such that it now supports 2 important new features:
Firstly I've wrapped it so you can pass in any of the standard cmds.addAttr keywords which means you can set min, max values etc whilst adding, something that's been requested a few times now.
I've also added double3/float3 support to the call so in one go you can do this:
Still thinking if there's maybe a neater way to pass the value data but we'll see. It's all pretty well documented in the code anyway.
cheers
Mark
Firstly I've wrapped it so you can pass in any of the standard cmds.addAttr keywords which means you can set min, max values etc whilst adding, something that's been requested a few times now.
I've also added double3/float3 support to the call so in one go you can do this:
self.addAttr(attr='attrName',type='double3',value=((subAttr1,subAttr2,subAttr3),(value1,value2,value3)),hidden=False, min=0,max=10)Which will add a new compound double3 attribute 'attrName' with chuild attributes subAttr1 2,3, set their values to value1,2,3. It'll also push the min and max to these subAttrs and set the whole lot keyable and exposed to the channel box :)
Still thinking if there's maybe a neater way to pass the value data but we'll see. It's all pretty well documented in the code anyway.
cheers
Mark
Sunday, 9 December 2012
Uncovered ;)
Well as you may have seen, I've finally come clean, see my other blog here for details!
Mark Jackson Blog
Mark Jackson Blog
Thursday, 29 November 2012
The power of the FilterSettings class
One of the guys from work asked me about this today and I thought I'd post it up here to show you just how you can use the power of the settings object to filter and organize nodes in Maya. In this example we have 2 rigs in the scene and I want to run a function that will scan both hierarchies for nurbsCurves who's name contains 'Ctrl' and match the nodes, then process the matches in pairs. filterSettings is a class designed specifically just to hold a set of args to be passed into the main filters, it's what the presets in the Hierarchy tab use and store for you.
Here we have the 2 Top nodes of both hierarchies selected. This is the CORE FUNCTION of the entire AnimationUI, it's how it processes matched pairs into something usable for the code:
cheers
Red
Here we have the 2 Top nodes of both hierarchies selected. This is the CORE FUNCTION of the entire AnimationUI, it's how it processes matched pairs into something usable for the code:
import Red9.core.Red9_CoreUtils as r9Core #make a settings object and set the internal filter types filter=r9Core.FilterNode_Settings() filter.nodeTypes='nurbsCurve' filter.searchPattern='Ctrl' #use the processMatchedNodes call to do all the work for you! matched=r9Core.processMatchedNodes(cmds.ls(sl=True),filterSettings=filter) #matched is an object which contains MatchedPairs, a list of tuples in #the form [(source, destination)] This in turn lets us unpack the #data in one go for processing for source,dest in matched.MatchedPairs: print source print destThe same filter can be passed into most of the Red9 functions and is used extensively across all the code. For example the above code is filtering hierarchies, so if we just wanted to search a single hierarchy we can pass the same filter to the FilterNode class:
filterNode=r9Core.FilterNode(cmds.ls(sl=True),filterSettings=fSet) filterNode.ProcessFilter()This is again a key concept in the entire pack so worth looking at if you're intending to use the code.
cheers
Red
Monday, 26 November 2012
Red9 Studio Pack v1.27 - RC candidate :)
Well after a LOT of work v1.27 is pretty much nailed down. Huge list of upgrades both to MetaData systems, PoseLibs and in general across the board. I'm going to be doing a full video sweep of all the toolsets in the next few days and once done I'll push the build out.
A few last minute fixes are still going in but I'm really excited as this build has huge potential. MetaRig is now in full production at work and being battered, hence all the changes at the moment. I really want to nail down the api before shipping this one in case people start to use it internally like we're now doing.
Brief outline of changes:
Still looking for more testers and feedback, particularly those on Linux/mac as I've tried to make this buils os independent but have no way of checking myself.
cheers
Red
A few last minute fixes are still going in but I'm really excited as this build has huge potential. MetaRig is now in full production at work and being battered, hence all the changes at the moment. I really want to nail down the api before shipping this one in case people start to use it internally like we're now doing.
Brief outline of changes:
- MetaData has multiple expansions and fixes to MetaClass and MetaRig. Too many to write so it's easier to just look through both the unittests and the example files. Some of these calls are to make it easier for you to subclass the code for your own use, particularly the 'getChildren' and '__bindData__' funcs.
- PoseSaver now fully supports relative pose loading, ie, loading the stored data relative to a given node. This supports projected and absolute modes. Projected is the pose offset relative to the current ground plane, with projected direction and translation, absolute is just that.
- PoseSaver now supports a PosePointCloud system to allow you to manipulate a rig in world space with geo reference.
- PoseSaver UI has had a ton of upgrades to make it more user friendly, mainly in the RMB menu's
- FilterNode hierarchy filtering now supports an '=' and 'NOT:' operator so you can specify you want all nodes with x attribute where x=6. Or NOT:thisAttr which will exclude all nodes with the given attr. Again, take a look at the unittests
- Hierarchy tab in the AnimUI now has a RMB bound to the filterPriorities scroll to let you set these yourself and modify the order.
- SceneReview upgraded
- AttrMap now capable of storing the attrMap internally on a given node so a rig can have it stored as an attr on itself for re-loading any time you need.
- MetaNodeUI now supports a double click = select all children from selected system. Expanded RMB menu too.
- Mirror systems tweaked and finalized in code for mirroring animation and poses. This needs a UI to allow you to set it!
Still looking for more testers and feedback, particularly those on Linux/mac as I've tried to make this buils os independent but have no way of checking myself.
cheers
Red
Friday, 9 November 2012
Using MetaClass in your own classes
So in Red9 you have the power of a full MetaData api but how do you then expand and use that outside of the Red9 package? This came up recently with somebody inheriting from r9Meta.MetaClass in their own module outside of Red9. So I thought I give you a few pointers.
The first thing to note is that Red9_Meta builds up a global list of registered classes which inherit from MetaClass. Basically I need to know, when a node is passed into the MetaClass.__new__(), whether it's mClass attr (the string pointer that holds what class to instantiate on create) is in the known inheritance mapping. Think about it, I initialize the correct class object for you but the code needs to know if that class is available and registered in Python, otherwise I can't instantiate it for you.
This data is stored in global RED9_META_REGISTERY and in the Red9 pack that's setup in the Red9.core.__init__ by calling registerMClassInheritanceMapping()
All following!
Ok so Red9 is up and Meta knows about classes which have MetaClass as a base. By the way, this is found using the cls.__subclasses__(). But now you have a class outside of Red9 which is also using MetaClass and inorder for it to work correctly, you need to get that little bugger picked up and inside the RED9_META_REGISTERY!
This is all down to the order in which the modules are initialized. Lets say that you've booted Maya and Red9 is up. But you have a module in scripts which imports and uses Red9_Meta and it's not showing up in the meta registry. This is because until you import that module it won't show up in the subclasses cmd, and when you do import it, Red9 won't have it in the registry as it was imported after Red9 booted. So you need to first import your module, then force it into the RED9_META_REGISTERY by doing the following:
The first thing to note is that Red9_Meta builds up a global list of registered classes which inherit from MetaClass. Basically I need to know, when a node is passed into the MetaClass.__new__(), whether it's mClass attr (the string pointer that holds what class to instantiate on create) is in the known inheritance mapping. Think about it, I initialize the correct class object for you but the code needs to know if that class is available and registered in Python, otherwise I can't instantiate it for you.
This data is stored in global RED9_META_REGISTERY and in the Red9 pack that's setup in the Red9.core.__init__ by calling registerMClassInheritanceMapping()
All following!
Ok so Red9 is up and Meta knows about classes which have MetaClass as a base. By the way, this is found using the cls.__subclasses__(). But now you have a class outside of Red9 which is also using MetaClass and inorder for it to work correctly, you need to get that little bugger picked up and inside the RED9_META_REGISTERY!
This is all down to the order in which the modules are initialized. Lets say that you've booted Maya and Red9 is up. But you have a module in scripts which imports and uses Red9_Meta and it's not showing up in the meta registry. This is because until you import that module it won't show up in the subclasses cmd, and when you do import it, Red9 won't have it in the registry as it was imported after Red9 booted. So you need to first import your module, then force it into the RED9_META_REGISTERY by doing the following:
#=========================================================================
# Because we're now inheriting from Red9_Meta any reload on any module that
# is instantiated from Meta will invalidate the RED9_META_REGISTERY. Here
# we force the update on the Red9 internal registry
#=========================================================================
from Red9.core import Red9_Meta as r9Meta
r9Meta.registerMClassInheritanceMapping()
print '============================================='
r9Meta.printSubClassRegistry()
print '============================================='
Hope that makes sense, if not drop me a mail and I'll point you in the right direction!
Red
Subscribe to:
Comments (Atom)