added screne render auto creator

This commit is contained in:
Jakub Trllo 2023-02-15 12:23:24 +01:00
parent 6097a96276
commit d727ec1f5f
3 changed files with 146 additions and 115 deletions

View file

@ -32,6 +32,7 @@ Todos:
import collections
from openpype.client import get_asset_by_name
from openpype.lib import (
prepare_template_data,
EnumDef,
@ -42,7 +43,10 @@ from openpype.pipeline.create import (
CreatedInstance,
CreatorError,
)
from openpype.hosts.tvpaint.api.plugin import TVPaintCreator
from openpype.hosts.tvpaint.api.plugin import (
TVPaintCreator,
TVPaintAutoCreator,
)
from openpype.hosts.tvpaint.api.lib import (
get_layers_data,
get_groups_data,
@ -480,3 +484,122 @@ class CreateRenderPass(TVPaintCreator):
def get_instance_attr_defs(self):
return self.get_pre_create_attr_defs()
class TVPaintSceneRenderCreator(TVPaintAutoCreator):
family = "render"
subset_template_family_filter = "renderScene"
identifier = "render.scene"
label = "Scene Render"
# Settings
default_variant = "Main"
default_pass_name = "beauty"
mark_for_review = True
def get_dynamic_data(self, variant, *args, **kwargs):
dynamic_data = super().get_dynamic_data(variant, *args, **kwargs)
dynamic_data["renderpass"] = "{renderpass}"
dynamic_data["renderlayer"] = variant
return dynamic_data
def _create_new_instance(self):
context = self.host.get_current_context()
host_name = self.host.name
project_name = context["project_name"]
asset_name = context["asset_name"]
task_name = context["task_name"]
asset_doc = get_asset_by_name(project_name, asset_name)
subset_name = self.get_subset_name(
self.default_variant,
task_name,
asset_doc,
project_name,
host_name
)
data = {
"asset": asset_name,
"task": task_name,
"variant": self.default_variant,
"creator_attributes": {
"render_pass_name": self.default_pass_name,
"mark_for_review": True
},
"label": self._get_label(
subset_name,
self.default_pass_name
)
}
new_instance = CreatedInstance(
self.family, subset_name, data, self
)
instances_data = self.host.list_instances()
instances_data.append(new_instance.data_to_store())
self.host.write_instances(instances_data)
self._add_instance_to_context(new_instance)
return new_instance
def create(self):
existing_instance = None
for instance in self.create_context.instances:
if instance.creator_identifier == self.identifier:
existing_instance = instance
break
if existing_instance is None:
return self._create_new_instance()
context = self.host.get_current_context()
host_name = self.host.name
project_name = context["project_name"]
asset_name = context["asset_name"]
task_name = context["task_name"]
if (
existing_instance["asset"] != asset_name
or existing_instance["task"] != task_name
):
asset_doc = get_asset_by_name(project_name, asset_name)
subset_name = self.get_subset_name(
existing_instance["variant"],
task_name,
asset_doc,
project_name,
host_name,
existing_instance
)
existing_instance["asset"] = asset_name
existing_instance["task"] = task_name
existing_instance["subset"] = subset_name
existing_instance["label"] = self._get_label(
existing_instance["subset"],
existing_instance["creator_attributes"]["render_pass_name"]
)
def _get_label(self, subset_name, render_layer_name):
return subset_name.format(**prepare_template_data({
"renderlayer": render_layer_name
}))
def get_instance_attr_defs(self):
return [
TextDef(
"render_pass_name",
label="Pass Name",
default=self.default_pass_name,
tooltip=(
"Value is calculated during publishing and UI will update"
" label after refresh."
)
),
BoolDef(
"mark_for_review",
label="Review",
default=self.mark_for_review
)
]

View file

@ -18,6 +18,9 @@ class CollectRenderInstances(pyblish.api.InstancePlugin):
elif creator_identifier == "render.pass":
self._collect_data_for_render_pass(instance)
elif creator_identifier == "render.scene":
self._collect_data_for_render_scene(instance)
else:
if creator_identifier == "scene.review":
self._collect_data_for_review(instance)
@ -81,6 +84,25 @@ class CollectRenderInstances(pyblish.api.InstancePlugin):
**prepare_template_data({"renderlayer": render_layer_name})
)
def _collect_data_for_render_scene(self, instance):
instance.data["families"].append("renderScene")
creator_attributes = instance.data["creator_attributes"]
if creator_attributes["mark_for_review"]:
instance.data["families"].append("review")
instance.data["layers"] = copy.deepcopy(
instance.context.data["layersData"]
)
render_pass_name = (
instance.data["creator_attributes"]["render_pass_name"]
)
subset_name = instance.data["subset"]
instance.data["subset"] = subset_name.format(
**prepare_template_data({"renderpass": render_pass_name})
)
def _collect_data_for_review(self, instance):
instance.data["layers"] = copy.deepcopy(
instance.context.data["layersData"]

View file

@ -1,114 +0,0 @@
import json
import copy
import pyblish.api
from openpype.client import get_asset_by_name
from openpype.pipeline.create import get_subset_name
class CollectRenderScene(pyblish.api.ContextPlugin):
"""Collect instance which renders whole scene in PNG.
Creates instance with family 'renderScene' which will have all layers
to render which will be composite into one result. The instance is not
collected from scene.
Scene will be rendered with all visible layers similar way like review is.
Instance is disabled if there are any created instances of 'renderLayer'
or 'renderPass'. That is because it is expected that this instance is
used as lazy publish of TVPaint file.
Subset name is created similar way like 'renderLayer' family. It can use
`renderPass` and `renderLayer` keys which can be set using settings and
`variant` is filled using `renderPass` value.
"""
label = "Collect Render Scene"
order = pyblish.api.CollectorOrder - 0.39
hosts = ["tvpaint"]
# Value of 'render_pass' in subset name template
render_pass = "beauty"
# Settings attributes
enabled = False
# Value of 'render_layer' and 'variant' in subset name template
render_layer = "Main"
def process(self, context):
# Check if there are created instances of renderPass and renderLayer
# - that will define if renderScene instance is enabled after
# collection
any_created_instance = False
for instance in context:
family = instance.data["family"]
if family in ("renderPass", "renderLayer"):
any_created_instance = True
break
# Global instance data modifications
# Fill families
family = "renderScene"
# Add `review` family for thumbnail integration
families = [family, "review"]
# Collect asset doc to get asset id
# - not sure if it's good idea to require asset id in
# get_subset_name?
workfile_context = context.data["workfile_context"]
# Project name from workfile context
project_name = context.data["workfile_context"]["project"]
asset_name = workfile_context["asset"]
asset_doc = get_asset_by_name(project_name, asset_name)
# Host name from environment variable
host_name = context.data["hostName"]
# Variant is using render pass name
variant = self.render_layer
dynamic_data = {
"renderlayer": self.render_layer,
"renderpass": self.render_pass,
}
# TODO remove - Backwards compatibility for old subset name templates
# - added 2022/04/28
dynamic_data["render_layer"] = dynamic_data["renderlayer"]
dynamic_data["render_pass"] = dynamic_data["renderpass"]
task_name = workfile_context["task"]
subset_name = get_subset_name(
"render",
variant,
task_name,
asset_doc,
project_name,
host_name,
dynamic_data=dynamic_data,
project_settings=context.data["project_settings"]
)
instance_data = {
"family": family,
"families": families,
"fps": context.data["sceneFps"],
"subset": subset_name,
"name": subset_name,
"label": "{} [{}-{}]".format(
subset_name,
context.data["sceneMarkIn"] + 1,
context.data["sceneMarkOut"] + 1
),
"active": not any_created_instance,
"publish": not any_created_instance,
"representations": [],
"layers": copy.deepcopy(context.data["layersData"]),
"asset": asset_name,
"task": task_name,
# Add render layer to instance data
"renderlayer": self.render_layer
}
instance = context.create_instance(**instance_data)
self.log.debug("Created instance: {}\n{}".format(
instance, json.dumps(instance.data, indent=4)
))