Making FACS flexes with DMX

Hi all so a bit of a wierd situation, I need to make FACS flex shapes (the old style non hwm ones) My pipeline uses maya so I cant make a vta, I need to use dmxs im a bit confused on exactly how the FACS system works, the facerules qci does the same job as the lua for HWM models but this is where I get confused in the l4d source models the survivor facerules are listed as AUXX while on the source dev wiki it has proper names, this is what ive made.

http://puu.sh/sGfPR.png

This is the l4d facerules qci


// add the editable flex controllers
flexcontroller eyelid right_lid_raiser left_lid_raiser 
flexcontroller eyelid right_lid_tightener left_lid_tightener
flexcontroller eyelid right_lid_droop left_lid_droop
flexcontroller eyelid right_lid_closer left_lid_closer
flexcontroller eyelid half_closed
flexcontroller eyelid blink
flexcontroller eyelid right_lid_squinter left_lid_squinter
flexcontroller brow right_inner_raiser left_inner_raiser
flexcontroller brow right_outer_raiser left_outer_raiser 
flexcontroller brow right_lowerer left_lowerer
flexcontroller nose right_cheek_raiser left_cheek_raiser
flexcontroller nose right_wrinkler left_wrinkler dilator
flexcontroller mouth right_upper_raiser left_upper_raiser 
flexcontroller mouth right_corner_puller left_corner_puller
flexcontroller mouth right_corner_depressor left_corner_depressor
flexcontroller mouth chin_raiser
flexcontroller phoneme right_part left_part 
flexcontroller phoneme right_puckerer left_puckerer 
flexcontroller phoneme range 0 2 right_funneler left_funneler 
flexcontroller phoneme right_stretcher left_stretcher
flexcontroller phoneme bite presser tightener jaw_clencher
flexcontroller phoneme range 0 2.0 jaw_drop
flexcontroller phoneme right_mouth_drop left_mouth_drop

flexcontroller mouth right_cheek_puffer left_cheek_puffer
flexcontroller mouth range -1 1 mouth_sideways
flexcontroller mouth range -1 1 jaw_sideways

flexcontroller mouth lower_lip

localvar biter
%biter = bite

// eyelids tend toward 0 as center of vision
// FIXME: add a control to set how close to the COV the lids should match (blink == 0, normal == 1)
%upper_right_raiser = right_lid_raiser * (1 - right_lid_droop * 0.8) * (1 - right_lid_closer) * (1 - blink)
%upper_right_neutral = (1 - right_lid_droop * 0.8) * (1 - right_lid_raiser) * (1 - right_lid_closer) * (1 - blink)
%upper_right_lowerer = right_lid_closer + blink * (1 - right_lid_closer)
%upper_left_raiser = left_lid_raiser * (1 - left_lid_droop * 0.8) * (1 - left_lid_closer) * (1 - blink)
%upper_left_neutral = (1 - left_lid_droop * 0.8) * (1 - left_lid_raiser) * (1 - left_lid_closer) * (1 - blink)
%upper_left_lowerer = left_lid_closer + blink * (1 - left_lid_closer)

%lower_right_raiser = right_lid_closer
%lower_right_neutral = (1 - right_lid_closer) * (1 - right_lid_tightener * 0.5) * (1 - right_cheek_raiser * 0.25)
%lower_right_lowerer = 0
%lower_left_raiser = left_lid_closer
%lower_left_neutral = (1 - left_lid_closer) * (1 - left_lid_tightener * 0.5) * (1 - left_cheek_raiser * 0.25)
%lower_left_lowerer = 0

%F04R = right_lid_squinter * (1 - blink) * (1 - right_lid_closer) 
%F04L = left_lid_squinter * (1 - blink) * (1 - left_lid_closer)

%AU1R = right_inner_raiser * (1 - right_outer_raiser) * (1 - right_lowerer)
%AU1L = left_inner_raiser * (1 - left_outer_raiser) * (1 - left_lowerer)
%AU2R = right_outer_raiser * (1 - right_inner_raiser) * (1 - right_lowerer)
%AU2L = left_outer_raiser * (1 - left_inner_raiser) * (1 - left_lowerer)
%AU4R = right_lowerer * (1 - right_inner_raiser) * (1 - right_outer_raiser)
%AU4L = left_lowerer * (1 - left_inner_raiser) * (1 - left_outer_raiser)

localvar AU1AU2AU4R AU1AU2AU4L
%AU1AU2AU4R = right_inner_raiser * right_outer_raiser * right_lowerer
%AU1AU2AU4L = left_inner_raiser * left_outer_raiser * left_lowerer
%AU1AU2R = right_inner_raiser * right_outer_raiser * (1 - right_lowerer) + %AU1AU2AU4R / 2
%AU1AU2L = left_inner_raiser * left_outer_raiser * (1 - left_lowerer) + %AU1AU2AU4L / 2
%AU1AU4R = right_inner_raiser * (1 - right_outer_raiser) * right_lowerer + %AU1AU2AU4R / 2
%AU1AU4L = left_inner_raiser * (1 - left_outer_raiser) * left_lowerer + %AU1AU2AU4L / 2
%AU2AU4R = right_outer_raiser * (1 - right_inner_raiser) * right_lowerer + %AU1AU2AU4R / 2
%AU2AU4L = left_outer_raiser * (1 - left_inner_raiser) * left_lowerer + %AU1AU2AU4L / 2

%AU38 = dilator

localvar right_open left_open
localvar right_lip_suppressor left_lip_suppressor

localvar lower_lip_active
%lower_lip_active = lower_lip * (1 - min( jaw_drop / 2, 1 ) 


%right_open = right_part + right_puckerer + right_funneler + right_upper_raiser * 0.5 + %lower_lip_active
%left_open = left_part + left_puckerer + left_funneler + left_upper_raiser * 0.5 + %lower_lip_active
%right_lip_suppressor = (1 - presser) * (1 - %biter)
%left_lip_suppressor = (1 - presser) * (1 - %biter)

localvar right_scaled_part left_scaled_part

%AU6R = right_cheek_raiser
%AU6L = left_cheek_raiser


// blend between part and smile

%right_scaled_part = right_part*(1-right_puckerer*((1/2)-right_funneler*(1/6))-right_funneler*(1/4))*%right_lip_suppressor
%left_scaled_part = left_part*(1-left_puckerer*((1/2)-left_funneler*(1/6))-left_funneler*(1/4))*%left_lip_suppressor
%AU25R = %right_scaled_part * (1 - right_corner_puller) 
%AU25L = %left_scaled_part * (1 - left_corner_puller)
%AU12AU25R = %right_scaled_part * right_corner_puller
%AU12AU25L = %left_scaled_part * left_corner_puller

// puckerer

%AU18R = right_puckerer*(1-right_part*((1/2)-right_funneler*(1/6))-right_funneler*(1/4))*%right_lip_suppressor
%AU18L = left_puckerer*(1-left_part*((1/2)-left_funneler*(1/6))-left_funneler*(1/4))*%left_lip_suppressor

// funneler

%AU22R = right_funneler*(1-right_part*((1/2)-right_puckerer*(1/3))-right_puckerer*(1/2))*%right_lip_suppressor
%AU22L = left_funneler*(1-left_part*((1/2)-left_puckerer*(1/3))-left_puckerer*(1/2))*%left_lip_suppressor

// pick the upper raiser based on the lips being parted or not

localvar right_raiser_suppressor left_raiser_suppressor
%right_raiser_suppressor = (1 - 0.3 * %AU22R) * (1 - 0.5 * %AU18R) * (1 - presser) * (1 - %biter) * (1 - right_corner_puller) * (1 - 0.5 * jaw_drop)
%left_raiser_suppressor = (1 - 0.3 * %AU22L) * (1 - 0.5 * %AU18L) * (1 - presser) * (1 - %biter) * (1 - left_corner_puller) * (1 - 0.5 * jaw_drop)

localvar left_nose right_nose

%AU9R = right_wrinkler * %right_raiser_suppressor * (1 - right_upper_raiser)
%AU9L = left_wrinkler * %left_raiser_suppressor * (1 - left_upper_raiser)
%AU10R = right_upper_raiser * %right_raiser_suppressor
%AU10L = left_upper_raiser * %left_raiser_suppressor
%AU25R = %AU25R * (1 - %AU10R) * (1 - %AU9R)
%AU25L = %AU25L * (1 - %AU10L) * (1 - %AU9L)

// chain raiser

%AU17R = chin_raiser * (1 - jaw_drop * 0.5) * (1 - %biter) * max( 0, (1 - 2 * (%AU25R + %AU12AU25R + %AU18R + %AU22R + %AU10R )))
%AU17L = chin_raiser * (1 - jaw_drop * 0.5) * (1 - %biter) * max( 0, (1 - 2 * (%AU25L + %AU12AU25L + %AU18L + %AU22L + %AU10L )))


localvar right_depressor_suppressor left_depressor_suppressor

%right_depressor_suppressor = (1 / (%AU18R * 0.8 + %AU22R * 0.8 + %AU17R + %biter + right_corner_puller + right_stretcher + right_corner_depressor))
%left_depressor_suppressor = (1 / (%AU18L * 0.8 + %AU22L * 0.8 + %AU17L + %biter + left_corner_puller + left_stretcher + left_corner_depressor))

%AU15R = right_corner_depressor * (right_corner_depressor * %right_depressor_suppressor)
%AU15L = left_corner_depressor * (left_corner_depressor * %left_depressor_suppressor)

localvar right_corner_suppressor left_corner_suppressor

%right_corner_suppressor = (1 / (%AU18R * 0.8 + %AU22R * 0.8 + %AU17R + %biter + right_corner_puller + right_stretcher + right_corner_depressor)) * (1 - jaw_drop * 0.25) 
%left_corner_suppressor = (1 / (%AU18L * 0.8 + %AU22L * 0.8 + %AU17L + %biter + left_corner_puller + left_stretcher + left_corner_depressor)) * (1 - jaw_drop * 0.25) 

%AU12R = right_corner_puller * (right_corner_puller * %right_corner_suppressor) * (1 - right_part)
%AU12L = left_corner_puller * (left_corner_puller * %left_corner_suppressor) * (1 - left_part)
%AU20R = right_stretcher * (right_stretcher * %right_corner_suppressor)
%AU20L = left_stretcher * (left_stretcher * %left_corner_suppressor)


localvar right_drop_suppressor left_drop_suppressor
localvar right_drop left_drop

%right_drop_suppressor = (1 / (0.5 * %right_open + right_mouth_drop)) * (1 - presser) * (1 - %biter)
%left_drop_suppressor = (1 / (0.5 * %left_open + left_mouth_drop )) * (1 - presser) * (1 - %biter)

%right_drop = right_mouth_drop * (right_mouth_drop * %right_drop_suppressor)
%left_drop = left_mouth_drop * (left_mouth_drop * %left_drop_suppressor)


localvar right_au_open left_au_open

%right_au_open = min( %AU18R + %AU25R + %AU12AU25R + 0.5 * %AU22R + %AU20R + %AU12R, 1 )
%left_au_open = min( %AU18L + %AU25L + %AU12AU25L + 0.5 * %AU22L + %AU20L + %AU12L, 1 )

%AU32 = bite
%AU24 = presser + (1 - presser) * tightener
%AU31 = jaw_clencher * (jaw_clencher / (jaw_clencher + min( jaw_drop, 1 )))
%AD96L = max( -mouth_sideways, 0 ) * (1 - 0.5 * %right_au_open) * (1 - %right_drop * jaw_drop * 0.25) * (1 - 0.5 * %biter)
%AD96R = max(  mouth_sideways, 0 ) * (1 - 0.5 * %left_au_open) * (1 - %right_drop * jaw_drop * 0.25) * (1 - 0.5 * %biter)
%AD30L = max( -jaw_sideways, 0 )
%AD30R = max( jaw_sideways, 0 )


localvar jaw_overage jaw_underage jaw_blend

// 0..1..2 -> 0..0..1
%jaw_overage = max( 0, (jaw_drop - 1 ) * (1 - presser) * (1 - %biter) * (1 - 0.5 * max( %right_au_open, %left_au_open ) ) )
// 0..1..2 -> 0..1..0
%jaw_underage = min( jaw_drop, 1 ) - %jaw_overage
%jaw_blend = (jaw_drop / (jaw_clencher + jaw_drop))

%AU26R = %jaw_underage * (1 - %right_drop ) * %jaw_blend
%AU26L = %jaw_underage * (1 - %left_drop ) * %jaw_blend
%AU27R = %jaw_underage * %right_drop * %jaw_blend
%AU27L = %jaw_underage * %left_drop * %jaw_blend
%AU26ZR = %jaw_overage * (1 - %right_drop ) * %jaw_blend
%AU26ZL = %jaw_overage * (1 - %left_drop ) * %jaw_blend
%AU27ZR = %jaw_overage * %right_drop * %jaw_blend
%AU27ZL = %jaw_overage * %left_drop * %jaw_blend

// fixup funneler overage
%AU22ZR = max( 0, %AU22R - 1 )
%AU22ZL = max( 0, %AU22L - 1 )
%AU22R = min( %AU22R, 1 ) - %AU22ZR
%AU22L = min( %AU22L, 1 ) - %AU22ZL

//%AU42 = half_closed

// lower lip, suppress with jaw open
%AU16L = %lower_lip_active * %left_lip_suppressor
%AU16R = %lower_lip_active * %right_lip_suppressor


// set the mouth shader illumination to roughly how far the mouth is open
%mouth		= %AU27R * 0.5 + %AU27L * 0.5 + %AU27ZR * 0.5 + %AU27ZL * 0.5 + %AU26ZR * 0.35 + %AU26ZL * 0.35 \\
			+ %AU22R * 0.35 + %AU22L * 0.35 \\
			+ %AU18R * 0.25 + %AU18L * 0.25 + %AU25R * 0.35 + %AU25L * 0.35 + %AU32 * 0.5 \\
			+ %AU12AU25R * 0.5 + %AU12AU25L * 0.5 + %AU16L * 0.30 + %AU16R * 0.30 \\
			+ %AU10R * 0.5 + %AU10L * 0.5

%AU13R = right_cheek_puffer * max( 0, 1 - %mouth * 3 )
%AU13L = left_cheek_puffer * max( 0, 1 - %mouth * 3 )



And this is what zoey_face.ma looks like

http://puu.sh/sGgJU.png

Any guidance on how to proceed would be appreciated thanks!

Found the old vta export options hidden away on vtxSmdIOs command line.

FACS flex controllers must be stored inside of dmx. Either include them from any existing model source which have it (ex. survivors from L4D2 Starter Kit) (I dunno if Maya/Max have this option, but Blender does). Or, if you already made HWM model, then you’re awesome and you can simply convert HWM to FACS without re-making all shapes: http://forum.facepunch.com/showthread.php?t=1492117