Skip to content

validate_camera_tracks

ValidateCameraTracks

Bases: InstancePlugin

Ensure that the camera tracks existing in the selected level sequence for publishing

Source code in client/ayon_unreal/plugins/publish/validate_camera_tracks.py
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class ValidateCameraTracks(pyblish.api.InstancePlugin):
    """Ensure that the camera tracks existing
    in the selected level sequence for publishing

    """

    order = pyblish.api.ValidatorOrder
    label = "Validate Camera Tracks"
    hosts = ['unreal']
    families = ["camera"]
    actions = [RepairAction]

    def get_invalid(self, instance):
        invalid = []
        ar = unreal.AssetRegistryHelpers.get_asset_registry()
        members = instance.data.get("members", {})
        if not members:
            invalid.append("No assets selected for publishing.")
            return invalid
        for member in members:
            data = ar.get_asset_by_object_path(member)
            is_level_sequence = (
                data.asset_class_path.asset_name == "LevelSequence")
            if not is_level_sequence:
                invalid.append(
                    "The published assets must be Level Sequence")
            sequence = data.get_asset()
            seq_name = sequence.get_name()
            all_tracks = get_tracks(sequence)
            if not all_tracks:
                message = (
                    f"No tracks found in Level Sequence {seq_name}. You can perform\n "
                    "repair action to add camera track into the sequence\n "
                    "and assign the camera to the track you want to publish\n"
                )
                invalid.append(message)
            has_movie_tracks = False
            for track in all_tracks:
                if str(track).count("MovieSceneCameraCutTrack"):
                    has_movie_tracks = True
                    break
            if not has_movie_tracks:
                message = (
                    f"The level sequence {seq_name} does not include any Movie\n "
                    " Scene Camera Cut Track. Please make sure the published level\n "
                    "sequence must include Movie Scene Camera Cut Track."
                )
                invalid.append(message)
        return invalid

    def process(self, instance):
        invalid = self.get_invalid(instance)
        if invalid:
            report = "{}".format(err for err in invalid)
            raise PublishValidationError(report, title="Invalid Camera Tracks")

    @classmethod
    def repair(cls, instance):
        ar = unreal.AssetRegistryHelpers.get_asset_registry()
        members = instance.data.get("members", {})
        for member in members:
            data = ar.get_asset_by_object_path(member)
            is_level_sequence = (
                data.asset_class_path.asset_name == "LevelSequence")
            if is_level_sequence:
                sequence = data.get_asset()
                add_track(sequence, unreal.MovieSceneCameraCutTrack)