Skip to content

create_review

Creator plugin for creating openGL reviews.

CreateReview

Bases: HoudiniCreator

Review with OpenGL ROP

Source code in client/ayon_houdini/plugins/create/create_review.py
 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
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
class CreateReview(plugin.HoudiniCreator):
    """Review with OpenGL ROP"""

    identifier = "io.openpype.creators.houdini.review"
    label = "Review"
    product_type = "review"
    icon = "video-camera"
    review_color_space = ""
    node_type = "opengl"

    # Default render target
    render_target = "local"

    # TODO: Publish families should reflect the node type,
    # such as `rop.flipbook` for flipbook nodes
    # and `rop.opengl` for OpenGL nodes.
    def get_publish_families(self):
        return ["review", "rop.opengl"]

    def apply_settings(self, project_settings):
        super(CreateReview, self).apply_settings(project_settings)
        # workfile settings added in '0.2.13'
        color_settings = project_settings["houdini"]["imageio"].get(
            "workfile", {}
        )
        if color_settings.get("enabled"):
            self.review_color_space = color_settings.get("review_color_space")

    def create(self, product_name, instance_data, pre_create_data):
        self.node_type = pre_create_data.get("node_type")
        creator_attributes = instance_data.setdefault(
            "creator_attributes", dict())
        creator_attributes["render_target"] = pre_create_data["render_target"]

        instance_data.update({"node_type": self.node_type})
        instance_data["imageFormat"] = pre_create_data.get("imageFormat")
        instance_data["keepImages"] = pre_create_data.get("keepImages")

        instance = super(CreateReview, self).create(
            product_name,
            instance_data,
            pre_create_data)

        instance_node = hou.node(instance.get("instance_node"))

        frame_range = hou.playbar.frameRange()

        filepath = "{root}/{product_name}/{product_name}.$F4.{ext}".format(
            root=hou.text.expandString("$HIP/pyblish"),
            # keep dynamic link to product name
            product_name="`chs(\"AYON_productName\")`",
            ext=pre_create_data.get("image_format") or "png"
        )

        parms = {
            "picture": filepath,

            "trange": 1,

            # Unlike many other ROP nodes the opengl node does not default
            # to expression of $FSTART and $FEND so we preserve that behavior
            # but do set the range to the frame range of the playbar
            "f1": frame_range[0],
            "f2": frame_range[1],
        }

        override_resolution = pre_create_data.get("override_resolution")
        if override_resolution:
            parms.update({
                "tres": override_resolution,
                "res1": pre_create_data.get("resx"),
                "res2": pre_create_data.get("resy"),
                "aspect": pre_create_data.get("aspect"),
            })

        if self.selected_nodes:
            # The first camera found in selection we will use as camera
            # Other node types we set in force objects
            camera = None
            force_objects = []
            for node in self.selected_nodes:
                path = node.path()
                if node.type().name() == "cam":
                    if camera:
                        continue
                    camera = path
                else:
                    force_objects.append(path)

            if not camera:
                self.log.warning("No camera found in selection.")

            parms.update({
                "camera": camera or "",
                "scenepath": "/obj",
                "forceobjects": " ".join(force_objects),
                "vobjects": ""  # clear candidate objects from '*' value
            })

        instance_node.setParms(parms)

        # Set OCIO Colorspace to the default colorspace
        #  if there's OCIO
        if os.getenv("OCIO"):
            # Fall to the default value if cls.review_color_space is empty.
            if not self.review_color_space:
                # cls.review_color_space is an empty string
                #  when the imageio/workfile setting is disabled or
                #  when the Review colorspace setting is empty.
                from ayon_houdini.api.colorspace import get_default_display_view_colorspace  # noqa
                self.review_color_space = get_default_display_view_colorspace()

            lib.set_review_color_space(instance_node,
                                       self.review_color_space,
                                       self.log)

        to_lock = ["id", "productType"]

        self.lock_parameters(instance_node, to_lock)

    def get_instance_attr_defs(self):
        render_target_items = {
            "local": "Local machine rendering",
            "local_no_render": "Use existing frames (local)",
            "farm": "Farm Rendering",
        }

        return [
            EnumDef("render_target",
                    items=render_target_items,
                    label="Render target",
                    default=self.render_target)
        ]

    def get_pre_create_attr_defs(self):
        attrs = super().get_pre_create_attr_defs()

        image_format_enum = [
            "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png",
            "rad", "rat", "rta", "sgi", "tga", "tif",
        ]
        node_type_enum = ["opengl"]
        if hou.applicationVersion() >= (20, 5, 0):
            node_type_enum.append("flipbook")

        return attrs + [
            EnumDef("node_type",
                    node_type_enum,
                    default=self.node_type,
                    label="Node Type"),
            BoolDef("keepImages",
                    label="Keep Image Sequences",
                    default=False),
            EnumDef("imageFormat",
                    image_format_enum,
                    default="png",
                    label="Image Format Options"),
            BoolDef("override_resolution",
                    label="Override resolution",
                    tooltip="When disabled the resolution set on the camera "
                            "is used instead.",
                    default=True),
            NumberDef("resx",
                      label="Resolution Width",
                      default=1280,
                      minimum=2,
                      decimals=0),
            NumberDef("resy",
                      label="Resolution Height",
                      default=720,
                      minimum=2,
                      decimals=0),
            NumberDef("aspect",
                      label="Aspect Ratio",
                      default=1.0,
                      minimum=0.0001,
                      decimals=3)
        ] + self.get_instance_attr_defs()