Skip to content

Publish apex animation - #376

Open
MustafaJafar wants to merge 4 commits into
developfrom
enhancement/365-aypn-publish-apex-animation
Open

Publish apex animation#376
MustafaJafar wants to merge 4 commits into
developfrom
enhancement/365-aypn-publish-apex-animation

Conversation

@MustafaJafar

@MustafaJafar MustafaJafar commented Mar 23, 2026

Copy link
Copy Markdown
Member

Changelog Description

This PR is for publishing animation data from packed APEX assets. it was built on top of #371

  • Add animation creator
  • Add APEX animation validator

A word on APEX Animation

Typically, this PR allows publishing the animation data only so that we can apply them later in different scenes instead of republishing the whole rig asset again OR publishing baked animation.

As long as artists are using APEX Scene Copy Animation node, then everything will be cool.

image

However, when they add a scene animate node, as soon as they go through animation mode in the scene view, the node will stash the animation data. which means the copy animation nodes can be removed and the animation will just be persistent. this is a result of Houdini using stashing. and, in this sense, I'm afraid loading different animations won't have any effect. and it can be confusing for artists. and this is something not related to AYON/saving animation data as Bgeo.
image

Additional review information

I made this PR while exploring APEX and AYON, mainly in #366 .
Then to make things cleaner, any needed fixes for publishing APEX were moved to #371 as well as the original requirement for AYON APEX Rigging USD workflow while moving the animation part to this PR.

Demo

Turret Example AYON APEX Workflow.zip

2026-03-04.14-03-56.mp4

Testing notes:

  1. Add characters and props
  2. Create APEX Animation
  3. Publish

Resolve #365

@MustafaJafar
MustafaJafar requested a review from BigRoy March 23, 2026 21:47
@MustafaJafar MustafaJafar self-assigned this Mar 23, 2026
@MustafaJafar MustafaJafar added the type: enhancement Improvement of existing functionality or minor addition label Mar 23, 2026
@MustafaJafar MustafaJafar linked an issue Mar 23, 2026 that may be closed by this pull request
@classmethod
def get_invalid(cls, instance):
node, _ = cls.get_invalid_with_message(instance)
return [node]

@moonyuet moonyuet Mar 30, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EDIT: ignore me my previous comment. Maybe it is more explicit to use tuple instead of list like (node, error) instead of [node, error]?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tbh, I don't know I just followed what we already have in

"""

output_node = instance.data.get("output_node")
if cls.get_invalid(instance) != [output_node]:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe it does the same thing?

Suggested change
if cls.get_invalid(instance) != [output_node]:
if output_node not in cls.get_invalid(instance):

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does the same thing I believe.
I picked this way, because this is always a list with one item.
Also, it's the same as here

if cls.get_invalid(instance) != [output_node]:

@moonyuet moonyuet left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I published animation successfully. Enclosed with the publish report.

publish-report-260417-17-10.json

Maybe for separate issue. When I tested with the validator(by bypassing the packed folder), it blocks the validation for sure with the sop_node validator. But if I hit select invalid It would give the error below

Action: SelectInvalidAction (094d16b0-5f55-4fff-88bf-a9ff5018a32b)

Error: Action failed.

Traceback (most recent call last):
  File "D:\ayon-addon_template\ayon-houdini\client\ayon_houdini\plugins\publish\validate_sop_output_node.py", line 80, in get_invalid
    output_node.cook()
  File "C:\PROGRA~1/SIDEEF~1/HOUDIN~1.512/houdini/python3.11libs\hou.py", line 19175, in cook
    return _hou.OpNode_cook(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
hou.OperationFailed: The attempted operation failed.
Error while cooking.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Kayla\AppData\Local\Ynput\AYON\dependency_packages\ayon_2603121036_windows.zip\dependencies\pyblish\plugin.py", line 528, in __explicit_process
    runner(*args)
  File "D:\ayon-addon_template\ayon-houdini\client\ayon_houdini\api\action.py", line 30, in process
    invalid_nodes = plugin.get_invalid(instance)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ayon-addon_template\ayon-houdini\client\ayon_houdini\plugins\publish\validate_sop_output_node.py", line 82, in get_invalid
    raise PublishValidationError(
ayon_core.pipeline.publish.publish_plugins.PublishValidationError: Failed to cook node: /obj/apex_rig/turret_asset.

Base automatically changed from 351-yn-0439-houdini-contribute-a-rig-publish-to-usd-layer-directly to develop May 8, 2026 07:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: enhancement Improvement of existing functionality or minor addition

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AYON APEX Animation Workflow

3 participants