Skip to content

create_render

Creator plugin for creating camera.

CreateRender

Bases: MaxCreator

Creator plugin for Renders.

Source code in client/ayon_max/plugins/create/create_render.py
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
class CreateRender(MaxCreator):
    """Creator plugin for Renders."""
    identifier = "io.ayon.creators.max.render"
    label = "Render"
    product_base_type = "maxrender"
    product_type = product_base_type
    icon = "gear"

    render_target = "farm"

    def create(self, product_name, instance_data, pre_create_data):
        file = rt.maxFileName
        host = registered_host()
        current_file = host.get_current_workfile()
        if not current_file or not file:
            raise CreatorError(
                "Please save the scene before creating render instance"
            )
        filename, _ = os.path.splitext(file)
        instance_data["AssetName"] = filename
        instance_data["multiCamera"] = pre_create_data.get("multi_cam")
        num_of_renderlayer = rt.batchRenderMgr.numViews
        if num_of_renderlayer > 0:
            rt.batchRenderMgr.DeleteView(num_of_renderlayer)

        container = rt.getNodeByName(product_name)
        product_base_type = instance_data["productBaseType"]
        # check if there is existing render instance
        if container and product_name.startswith(product_base_type):
            raise CreatorError("Render instance already exists")

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

        container_name = instance.data.get("instance_node")
        # set output paths for rendering(mandatory for deadline)
        RenderSettings().render_output(container_name)
        # TODO: create multiple camera options
        if self.selected_nodes:
            selected_nodes_name = []
            for sel in self.selected_nodes:
                name = sel.name
                selected_nodes_name.append(name)
            output_dir = os.path.dirname(rt.rendOutputFilename)
            RenderSettings().batch_render_layers_by_multi_camera(
                container_name, output_dir, selected_nodes_name
            )

    def get_instance_attr_defs(self):
        render_target_items: dict[str, str] = {
            "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(CreateRender, self).get_pre_create_attr_defs()
        return attrs + [
            BoolDef("multi_cam",
                    label="Multiple Cameras Submission",
                    default=False),
        ]