SOLVED Priority Delay on Stacking Skin Deformers

Hi,

This has been the bane of my rigging in C4D, which does not exist in Maya.
Normally, you have Skin Deformer being driven by joints.
In complex set-ups, it is desirable to have the Skin Deformer as a driver.
In C4D, it is somewhat impossible without getting a priority delay.

The priorities are set-up properly. The initial skin_grp has Generator -10 and the secondary skin_grp has Generator -5

I move the joint, hit undo and the secondary skin has delay.
You can check the video illustration here:
https://www.dropbox.com/s/445v51535b1z3dj/c4d307_python_skin_deformer_delay.mp4?dl=0

You can check the file illustration here: https://www.dropbox.com/s/hlswduxe52kjp5l/c4d307_python_skin_deformer_delay.c4d?dl=0

Initial skin is connected to the secondary skin using the python tag below. (Check file above for more details)

import c4d
#Welcome to the world of Python


def main():
    jnt = doc.SearchObject("sec01_jnt")
    node = doc.SearchObject("skin01")
    cache = node.GetDeformCache()
    points = cache.GetAllPoints()

    jnt_mat = jnt.GetMg()
    jnt_mat.off = points[83]

    jnt.SetMg(jnt_mat)

Regards,
Ben

P.S. Actually, the priority delay doesn't happen only on Skin Deformer x Skin Deformer but also (Other Deformers) x Skin Deformer.

hi,

first, you don't have to change all priorities to "fixe" priorities issue. The undo command often make obvious an already existing priority issue.
In your document, if you change the position of your joint in the position palette (without dragging the object) you will see that your object isn't following.

As you can see, your second join isn't updating correctly.
That said, even after correcting the priorities (the join move as expected) the second skin deformer doesn't take the position of this joint into account.
I've asked our specialist and it's seem to be a limitation. You can't add an expression based operator between two skindeformer.
I've tried to create some sort of generator but failed until now.

I'm not sure if there's a solution for this one. That's interesting and would require more investigation or test.

Cheers,
Manuel

RE: I've asked our specialist and it's seem to be a limitation
Yes, this is what I am afraid of 😞

RE: You can add an expression based operator between two skindeformer.
I'm not sure I understand, isn't the Python Tag I used already the expression based operator between two skindeformer

==============

Hypothetically speaking, can I instance the default skin deformer and create a new one with a hardcoded generator priority? Currently, it is set to Generator -1. How about I hard code it as Generator -10 on creation.

Will that work? I believe it involves C++ so I haven't tried it yet.

@bentraje said in Priority Delay on Stacking Skin Deformers:

RE: You can add an expression based operator between two skindeformer.
I'm not sure I understand, isn't the Python Tag I used already the expression based operator between two skindeformer

Sorry i mean "you can't add" the negation is important on that case.

cheers,
Manuel

@m_magalhaes
Ah gotcha. I guess there is no way around this, yet.

Thanks for the confirmation.

Hi,

Any update on this one on the latest release (S24)?

hi,
it's still a limitation.

Cheers,
Manuel

Gotcha.
Thanks for the response. Will close this thread for now.

@m_magalhaes Hello! I just want to add to this and say that this limitation is REALLY holding back C4D for rigging and thereby character animation. I would very much hope that the developers will allow the Skin Deformer's Priority to be set. It is my understanding that the Neutron node-based version of C4D will not have Priorities (THANK GOD!) but I don't know how long we will have to wait to be able to use it for character rigging.

Hi, @m_magalhaes & the rest,
Joints & skins work a bit differently than setting priorities in the usual way..
Basically, only the first line changes @ the "declaration" of pd.

Hope this helps, Jochem

for item in items: # .. a list with objects or tags..
	# prioGeneric
	pd = item[c4d.EXPRESSION_PRIORITY]
	pd.SetPriorityValue(c4d.PRIORITYVALUE_MODE, 4) # 4 = Generators (as an example..)
	pd.SetPriorityValue(c4d.PRIORITYVALUE_PRIORITY, 412)
	item[c4d.EXPRESSION_PRIORITY] = pd

for j in joints: # .. a list with joints..
	# prioJoints
	pd = j[c4d.ID_CA_JOINT_OBJECT_PRIORITY]
	pd.SetPriorityValue(c4d.PRIORITYVALUE_MODE, 4)
	pd.SetPriorityValue(c4d.PRIORITYVALUE_PRIORITY, 413)
	j[c4d.ID_CA_JOINT_OBJECT_PRIORITY] = pd

for s in skins: # .. a list with skins..
	# prioSkins
	pd = s[c4d.ID_CA_SKIN_OBJECT_PRIORITY]
	pd.SetPriorityValue(c4d.PRIORITYVALUE_MODE, 4)
	pd.SetPriorityValue(c4d.PRIORITYVALUE_PRIORITY, 414)
	s[c4d.ID_CA_SKIN_OBJECT_PRIORITY] = pd

Hmmm… some extra notes: Although it’s possible to change the priority of skin deformers - it’s of no use.
The documentation states that priorities only will be applied if the “Force” option under “Include” is turned on.
But that’s not for polygon objects.

So in my case, I wanted to set skin deformers after dynamics had been applied, but that’s a no-go.
The only alternative I found was to add an extra pythonTag (Gen.412), which updated all meshes.
This means that on render time all works well, but in the viewport it will still lag 1 frame 😞

Hello @jochemdk,

thank you for reaching out to us. I am not sure if your postings are questions, please remember to open a new thread for questions of your own. @m_magalhaes is also currently on vacation, so he will not respond here any time soon.

Thank you for your understanding,
Ferdinand

Hi @ferdinand, I was working on a similar topic, trying to change the prio of skin deformers to "after dynamics"... (didn't want to start a new thread, thx for replying anyway:)

Hi,

for me you still have the issue of priority. Does it solve the problem?

Cheers,
Manuel

Hi @m_magalhaes,

No there's still a problem, but for now it seams to be unsolvable.. It would be nice if C4D would allow for priority changes on the skin deformer - for polygon objects.