MRS Makers Workshop – Running Dev Blog

This will be an updated dev blog post during the first workshop as we work through and bugs that come up or workflow improvements. Nothing hones a workflow like figuring out how to teach it to others.

Current Focus

  • MRS Makers Workshop
  • Branches
    • unityToon
    • MRS

For Workshop

  • Class Content
    • Intro
      • Welcome
      • Outline
      • Setup
      • What is MRS
      • First Assignments
      • Vids
      • Transferred to class site
    • Core Docs – Will probably be adding more
      • Building Profiles
      • Pushing States
      • MetaData
      • Post Processes
      • Proxy Rigs
      • RigBlocks
      • Shape Helpers
      • Shared Settings
      • Space Pivots
      • States
      • Terminology
    • Working from Base
      • Written
        • Making some workflow improvements from this pass before doing vid
      • Vid
    • RigBlock docs
      • Master
      • Segment
      • Limb
      • Head
      • Handle
    • Quad
    • Advanced concepts
      • Common Tools in cgmToolbox  | 10:50
      • Puppet Mesh | 11:00
      • Skin Cage | 11:10
      • Skin Transferring | 11:20
      • Implementing Asset Props | 11:30
      • Using core calls for other work | 11:40
  • mrsBuilder
    • Add template toggle
    • Bug –  doing contextual stuff, selection is cleared
      • This was actually a code issue. Need to add the flag 'uiUpdate':0
    • BUG – reset call using old version not accounting for world IK stuff
  • BlockDat
    • Define dat – Look into storing define dat keyed to handle tag rather than ordered list
  • Lights
    • Add simple setup
      • cgmLightStudio – alpha
  • General
    • Add direct space switching as an option – per Brad
      • Segment
      • Limb
      • Head
    • Deleting rigBlock should
      • Skeleton delete
      • Rig delete
    • Square shape loft still messed up
    • Center create getting confused with multiple points at same location
      • Add cull for duplicates
  • Master
    • See why scale is getting blockScale attribute alias
      • Changed to rigScale
    • Bug – when no spacePivots. Bails on deleting rig looking for dynParentGroup
    • Bug – control layer not being created balking  builds at times.
      • Re-verifys those layers at master control creation
    • Add
      • proxyGeoRoot setup
      • spaceSwitch_direct setup
    • See why the define data isn’t loading properly
    • Deleting rig
      • is deleting template handles for some reason
    • Deleting
      • Isn’t getting skeleton
      • Isn’t getting rig
  • LIMB
    • Benn
      • Visible rotate plane
      • Mirroring on thumb block doesn’t work if you have ‘hasLeverJoint’ on
      • Finger block naming doesn’t apply to nameList
      • Starting from the “master block” and choosing your push context to “below”. And then changing state to <joint> this can loose the prefix _sknJnt on some of the joints ( be sure to double check, as my legs were left out ).
      • You can get around this by choosing the block that was missed and loading this block to be active. And re-running the <joint> state again
      • Saving a BlockDat under the Block Dat -Active section will not save the block Please use the save function in Utilities – Contextual
        • Can’t verify…?
    •  Add
      • proxyGeoRoot setup
      • spaceSwitch_direct setup
    • The lever still isn’t feeling quite right in the def>template setup
    • Blockdat isn’t loading right on subshapers – issue with mDrakes template being old or a problem in code?
    • Load state not working right
    • Benn- thumb not mirroring
  • HEAD
    • Bug – saving block dat is scaling head geo… o
    •  Add
      • proxyGeoRoot setup
      • spaceSwitch_direct setup
    • Need call to add head geo
    • Need call to easily select head geo
    • Remove shaders on head geo file. getting mental ray errors
    • Neck ribbon handles
      • Even with even counts we need the end ribbon joint to control the angle going into the neck
    • Neck mid ik when scaled down is off
  • cgmUpdateTool
    • Not seeing all the branches
      • Updated cgmUpdate and cgmUpdateTool to see MRSWORKSHOP branches
  • Puppetmesh
    • Benn –
      • Not creating from master
      • Shaders weird
      • not deleting
  • mrsAnimate
    • When mDrake and the horse are referenced together there’s an issue.
      • loaded horse, ref in mdrake
      • pick horse leg, push mirror and get this error
      • works in ctrl context but just the ctrls picked but not in puppet mode


Will be sprinkling these in


  • We’re thinking about switching to github as they have a free option now. Thoughts?
  • Maybe rather than have so many profile options in the add menu. maybe instead it would make sense for it to pop up menu to say how many neck controls, etc you want?
  •  Currently our second state is called template. Is that confusing with the idea of a rig template? Wondering if shaping would make more sense?

Week – 02.11

    • Builder Stepped
      • Added rig step buffer setup to ui
  • Segment

    • RP
      • Working but pretty useless
    • Spline
      • Working
      • Fixes
        • remove spin group
        • Need measure node
    • Ribbon
      • Handle aiming
      • Factor out, try different aim mode
      • Mid follow – new method
  • PuppetMesh
    • Can now get mesh at template state
    • Worked on the linear/cubic setup more

Week – 02.04

  • Workshop
    • Finishing up all material this week
  • BUGS
    • rigBlock.blockScale stopped working via meta at some point. Have bug report in with red9 as aliased attributes aren’t setting
  • ATTR
    • datList – added enum attribute support
      _node = 'null1'
      ATTR.datList_connect(_node,'testList',[0,1,1,0],mode='enum',enum = 'false:true')
  • CURVES – Needed some new curve shapes
    • cylinder
    • New loft shapes
  • RigBlocks
    • General
      • Working on blockProfile settings
    • LIMB
      • Define
        • new rot handles
        • factored out rotatePlane creation
        • visRotatePlane attr
      • Template
        • loftList implemented
        • Added loftShapeStart/End for changable lever/foot shapes
        • NEW – loftShapeStart/End for clav and pivot/feet
    • Segment
      • Define
        • new rot handles
        • Added rotatePlane
        • visRotatePlane attr
      • Template
        • Using new factored out template_segment call
        • Added loftList
    • HEAD
      • neck define handles always build now. Just hidden in group connected to neckBuild option
      • New define handles
    • HANDLE
      • Added loft shapes as an option
    • Improvements
      • New define state setup
        • HANDLE
  • MotionBuilder Support
    • Make puppet mesh work at skeleton
  • Puppet Mesh
    • Made it work without rigging
    • Made skeleton state set a rotateOrder at Brad’s request
  • Builder
    • Testing new stepped builder for dev work


Week – 01.28

  • Workshop
    • Horse – All written material up on Kajabi
    • Will redo vids after you all work through material and we find all the hang ups
    • Starting to work through the advanced stuff
    • DOCS
  • RigBlocks
    • General
      • Working on blockProfile settings
    • HANDLE – started bringing original prototype block back up to snuff
      • Add ability to change the rotatePivot Target
    • LIMB
      • hasQuadSetup changed to buildLeverEnd to make it more agnostic
      • Lever define handle always builds now, is just hidden. This is so you don’t have to go back to define state to add a lever
    • HEAD
      • Added the head aim a twist driver for neck
      • Fixed some issues with out the neck was working. You’ll probably wanna update  any assets you’re using.
  • Puppet Mesh
    • Unified skin method is much better than before for use as a skin cage
  • Builder
    • Added focus support on Alexander’s prompting



Been wanting to implement splineIK properly a while now. Time to do it.


  • Global scaling isn’t working
    • Add measure node
    • fixed
  • Continue refactor
  • Added to end shape to better differentiate



First pass kinda working.





After playing with a test file with Bo, there are a few issues I want to hit

Segment mid IK

Has a weird fall off.

Have a solution.

  • Created an aim target at the first ik joint rather than the base, parent that to the base
  • Added a mid aim back to the that target with the track follicle being the up vector




  • NEW CONCEPT  – Been wanting to play with a different loft setup for a while so doing that here.
    • ATTR.datList – added enum support for this
    • Added define handle setup
    • New up handle – the size of this handle now is driven by the baseSize width,height
    • Adding loft setup
    • Initial testing pass for loftList
    • Reworked how base shape creation works
    • Added proxy geo group
    • Connected via msgList now to offer multiple pieces of proxy geo
    • New uiMenu for adding/replacing/removing geo
    • Accounting for ‘shapers’ setup
  • RIG
    • Tweaked aim setup
    • New shapes for shapers setup
    • Implement space switch direct
  • GEN
    • Added support to block stuff for loading a loftList from profile
    • Added singleCurve support to the curve shape casting


Been wanting to play with a different loft setup for a while so doing that here.



  • Started bringing original prototype block back up to snuff for a gig for Bo
  • Add ability to change the rotatePivot Target

Puppet Mesh



Took a pass on cleaning this up for the class.

  • Made it not only work with an active block but works contextually like other calls
  • Learned about a call a couple of months back to make skinning better. polyUniteSkinned rather than just polyUnite which lets us skin each section and unify them at the end rather than skinning the whole mesh
  • The head still wasn’t skinning right, fix…
    • Move the special skin handling to the blockModule create_simpleMesh call when it exists.
  • Skinning doesn’t resolve well when we have roll joints because of the split. Trying reparent part of the skinning process
    • Works much better
  • Had some issues when combining and then reparenting. The easiest answer was just to unlock the skin mesh dag which locks when you skin.


Assisting in focusing


A user said they were having a hard time working with one block at a time.

Added a new focus setup to assist.

  • Added general focus call to blockUtils
  • Coupled that with contextual calling via the ui
  • Creates a mask of selected blocks and processes all the other rigBlocks sharing that root

Updating progress bar interaction


Working through the material for horse and adding more progress bar interaction.

  • BlockDat calls
    • Progress bars are finicky. Having to force it to start every iteration when the bar is passed around. Not sure why.

Call back with progress bar


Added a callback with progress bar ability for a user request on gather blocks

Adding a progress bar to the main ui


Took a quick pass on adding a progress bar. It will work for now and be iterated on later.

Reorganizing Contextual buttons


Was getting user reports of the Utilities Contextual section getting too heavy. So we’re trying something new. Moved the rarely used functions to a top contextual menu. All of the sections are tear offable there so you can have easy access to those items you need. Same functionality as before.

Reworking Post Process


The post process workflow had been finicky and we wanted to make it less so. To that end,  we mocked up a simple ui and did a first pass on that.

  • New UI
    • Needs a puppet on call to work properly
    • Check which options you want
    • Process – goes through and processes your options
  • Progress bars – tedium – Took a stab at better ui progress bar work as it can be hard to know stuff is still happening at times.
    • Use progress rather than iter
  • Bugs
    • rigBlock wire is getting overwritten at some point during the rig or a post process
      • This came from a change I made to rigNode storage. I was overwriting a connection with the connect back option. Change to a new unused tag. cgmOwner is wired back to the module.



This is kind of a hard concept to see because they’re string attributes and thus you have to go to the attribute editor to see/edit them.

Wanted more user Control

Section for manipulating the nameList which is rather hidden from the user normally as they are string attributes.

  • Reset to Profile | Reset the nameList to the data found either in the blockProfile dict or the base blockModule defaults.
    • If lists already match, does nothing.
    • If lists lengths match but values differ, fix
    • If neither match…
      • if Prerig or above – throws error
      • Else – resets
  • Iter from base name | Set the nameList of the rigBlock from the name. For example if the name is ‘index’, it would fill the nameList with that such – [‘index_1’,’index_2’….].

cgmLightThingy(Name TBD)

Really early pass on a tool idea we’ve been thinking about a long time. Setups up a stored lighting setup for when you just want something quick.

How it works.

I’ve been doing this constaint light setup to the perspective cam with a set of lights a while. So I set up a framework to:

  • Have a profile of lights
  • They can be setup to the world or constrained to perspective (via ui), anything via calls
  • They’re tagged for clean deletion

Rough pass. Been talking to our buddy Matt about it for a bit. Maybe this’ll get the ball rolling. Took about 2 hours to do.


Visiting with Matt about where we want to take this.

  • He’s working on the roadmap
  • Started a new metaClass for maya lights. Very early.

Direct Space


Brad requested to get the option to get space switching per joint. So we did.

if mBlock.spaceSwitch_direct:
    log.debug("|{0}| >>  Direct...".format(_str_func))                
    for i,mObj in enumerate(mRigNull.msgList_get('rigJoints')):
       log.debug("|{0}| >>  Direct: {1}".format(_str_func,mObj))                        
       ml_targetDynParents = copy.copy(ml_baseDynParents)
       ml_targetDynParents.extend(mObj.msgList_get('spacePivots',asMeta=True) or [])
       mParent = mObj.masterGroup.getParent(asMeta=True)
       if not mParent.hasAttr('cgmAlias'):
       mDynGroup = cgmRigMeta.cgmDynParentGroup(dynChild=mObj.mNode,dynMode=0)
       for mTar in ml_targetDynParents:

Option off by default.


Differential off


The dag method doesn’t work as it misses a lot of stuff. Instead, trying a new method. Rather than matching node names, we’re trying to prestore uuids. The problem here is that uuids came in 2016 so it will cause some issues with pre versions unless we account for it. Not sure if it’s worth that time yet.

Need to test this further. Going with this for now.


The node differential isn’t working right. Investigating. Maybe need to just do mObj wraps to ensure?

Trying a new list method.

Had just been using:  return

Trying: return,dag=True)

Seems to be holding up so far.


To make a ball or not make a ball


Mentioned this concept before but rather than have a series of only turning on for some blockProfiles and not others. It makes more sense to expose it to the user.

There’s a new attribute called proxyGeoRoot with the following options: none:loft:ball.

Will flesh out in docs. Previous blocks will need to be verified to get the attribute.


Thumb issues (Benn)


User pretesting ran into issue with thumb mirroring. My guess it’s something from my work over the last few days.

Digging in.

  • Replicate
  • Easy fix – make sure the buildLeverBase and hasLeverJoint are off
  • Longer fix  – The problem stems from a change in how the define dat was being loaded/stored. The new default for a thumb was building with the lever joint on

Adding to list of things to look at for blockDat


More Arrange



  • Cubic Even – Even distribution along a curved defined by the selection set
  • Arc Even/Spaced – Take the first, mid and end points and make an arc.  Distribute along that.
  • Rebuild 2/3 Even/Spaced – Take that cubic curve setup and rebuild it to simplify the curve by a span number



Made it work at with components.

Learned something new. You can teach an old dog…

…for keeping component order.

Ideas for next round:

  • Add support for going along a curve


Not loading at template correctly

When loading my blockDat data at template state. Some of the handles aren’t placing properly.

  • Check that the data is being stored properly
    • Looks like it’s there’s no data going in to the 2 index…
    • That wasn’t it. Data storing as currently intended
  • If it is, look at what the problem would be
  • Looks like it was on the load. For some reason I was doing position loading rather than translate . I’m not sure why I was doing this but for now I’ve undone it.


Load State not working right

Order of operations issue. Resolved


Hitting a couple of items on this pass

hasQuadSetup –

  1. This attr name is confusing
  2. Want to bring back the full ik rather than the simple aim back from the tipCombo setup

Attribute name

Changing hasQuadSetup to

Full IK setup

Writing docs pass


  • Insect leg? – Took a quick pass on it. Need to loop back to implement the full ik setup on the quad rather than the aim back
  • Quad setup rp resolve – not accounting for proper indices
    • fix
  • lever base – previously the lever base only build the define handle when the option was on. This caused issues when you decided you needed later.
    • Make the handle always create but connect visibility to the buildLeverBase attribute

Lever loft curves


They’re a bit screwy when the directions are very different. Need to resolve

Working through it….

  • When we subsplit when we have a lever
  • First pair – dup our loft end curve and aim back with the up vector of the base
  • Second pair- dup the start loft curve and aim forward with limb’s up vector

BUG – FK shapes casting off


Benn reported this one. Dug in

  • So his wrist ik prerig handle was rotated in a way I’d not anticipated. I had been using the prerig handles as the casters for the fk shapes.
  • Rather than requiring users to use certain rotations on the prerig handles

I need another solution…

  • Need good cast targets
  • Things get finicky as we allow options to not have endjoints and have lever setups without joints there
  • Options
    • FK joints – no good as we don’t always have end joints
    • Generate a new target using the orient of the second to last joint.
      • This seem to be holding up.

Better way to see RP handle position


It can be un-intuitive just seeing the rp plane. It would probably be helpful to see where the system is thinking your rp will be.

This was a good exercise. Caught an issue where LIMB wasn’t using the rp handle properly for the calculation for placing the rp handle. It was using the old orient handle method rather than the newer rp vector helper.

  • Updated LIMB’s call
  • Added button to mrsBuider to access

Changed shape from the locator after some play…

LIMB Skeleton naming isn’t always adding _sknJnt



Mirroring finger block doesn’t honor namelist


This is from an old issue of when we want to replace the nameList. Finger are different because the generally we just want index_01,index_02, etc where on an arm we’d have shoulder,elbow,wrist.

So…how do we best account for this

  • Changed the name catch for duplication on finger/thumb block types with a frame to add new ones
  • Changed the nameList fill on LIMB at the prerig state.

Think it’s fixed.

Rotate Plane


One of my early testers said the rotate plane stuff wasn’t as clear as it could be. At one point I had this but I’m adding it back.

Lever up


Ran into an issue with lever up. I had been using the define handle rotation.

  • That may not be super intuitive using that handle
  • Root was the old one but again not fantastic
  • Maybe just need a lever up handle?

Made a few changes

  • Define handles are snapped to the root now
  • Added transformed vectors from root for better initial casts

After playing a bit the simplest solution seems to be to use the lever handle after all but to add an up arrow shape on that handle to show that that vector is important.

Made some changes to lever in general

  • Aim setup during template
  • Parent contsraining the lever define handle now to keep the orient
  • Changed Lever base loft shape to squareRoundTop

Loft shape

I’ve not been thrilled with the loft cross section for fingers still. I added square last week which will be great for some setups (Morphy Kid’s style) for one but I wanted to try a couple of more. So I’m adding squareRoundUp and squareRoundDown. If it proves good, I’ll add the pos/neg setup.

  • To Curve Lib
  • To enum on limb

Those worked decent. However I also added another just called ‘digit’ that I’ll be tweaking till we get how we want it targeted for fingers.

Here’s the square versus the circle on the arms/legs.


Neck issues


  • Head aim doesn’t affect neck twist
    • Added the head aimer as a twist driver
  • One Neck Control | 3 roll | No mid
    • The base isn’t following the segment
    • Feels a little funky with the top not staying aimed back to the base
  • One Neck Control | 3 roll | mid
    • mid isn’t getting setup
      • wasn’t getting to because of if layer

Working through docs


  • Template head helper not aiming along define vector
  • BlockDat not saving/loading right
    • Came from template handles being connected to neck controls rather than shapers
  • Reworked head/neck template setup to standard segment look.
    • added neckSubShapers attr

Working with head geo

There’s a couple of items for usability I want to hit for the class.

Need a few calls to cover the bases here.

  • Setup new menu to add to the right click menu
    • Accessed via right clicking a head block in the scroll list
  • Proxy geo null hasn’t been wired. need to do that.
    • Fixed
  • Head Geo selectable
  • Head Geo lock
  • Add head geo
  • Replace head geo

The way I’ve been locking geo has been to override the shapes. However, I think it would be better to just do the geo group.

Basesize issue

Issues – Saving blockDat on the head changes the size of the head geo

Turns out this was just because I had an old head block on mDrake


Register nodeTypes

Had a good chat with Mark and hope to have a code change in red9 that will help some deep stuff that most of you will probably never see but is a reoccurring bug.

Thanks, Mark!

Bugs from update

RigBlock master finder no longer works

Because we’re not registering transforms anymore, they’re not being hit

Needed to change our call.

r9Meta.getMetaNodes(mTypes = 'cgmRigBlock')


r9Meta.getMetaNodes(mTypes = 'cgmRigBlock',nTypes=['transform','network'])

Currently all our cgmRigBlocks are transforms however adding network to be safe for potential future block setups.

Simple find and replace.



  • Some forum sections not visible
    • Josh forgot to publish a sub forum
  • Email notifications on thread updates aren’t sending
    • Did some digging. Hit wall. Emailed Michael for assist.

mDrake Template


  • New loft shapes – digit
  • Update fingers to new lever setup
  • Change out spine for new setup – 4 handle, 2 sub shapers
  • Rebuilt with new blocks
  • Make sure it’s building
    • Master
    • Spine
    • arm
      • Bug from new rp pos 
    • leg
    • finger
      • Proxy vector looks off
        • Bug fix and tweaked loft setup
    • head
  • Add the head geo properly




  • Bo having issues with the tool loading.
    • It was looking for an attribute that didn’t exist yet as the dynParentGroup hadn’t been built
    • Added a check so that error doesn’t make the UI not load
    • Added a check in LIMB so that when we build a single chain mode it builds the lever fk control a dynparent group
  • He needs the query for getting the dynParents of a given control
mGrp = cgmMeta.asMeta('cog_anim_dynParentGroup')



Good bug. So, this setup was for a lantern which we tried using a lever for the handle. This worked well.


Josh Burton

[MRS Project Lead | CG Monks] Josh is an animator turned TD who hails from Oklahoma, pre-undergrad in the Marine Corps, animation basics at Savannah College of Art and Design, cut his teeth in gaming and commercials before co-founding CG Monks and more recently the CG Monastery. The Morpheus Rigging System is a culmination of years of R&D and he is now thrilled to see what users can create, collaborate and expand on with this open source MRS platform.