add multi camera options for render creator

This commit is contained in:
Kayla Man 2023-07-14 20:25:49 +08:00
parent 9f90e3a1f1
commit c81818d095
3 changed files with 47 additions and 24 deletions

View file

@ -177,8 +177,8 @@ class RenderSettings(object):
render_element_list.append(aov_name)
return render_element_list
def create_batch_render_layer(self, container,
output_dir, cameras):
def batch_render_layer(self, container,
output_dir, cameras):
outputs = list()
output = os.path.join(output_dir, container)
img_fmt = self._project_settings["max"]["RenderSettings"]["image_format"] # noqa
@ -186,7 +186,7 @@ class RenderSettings(object):
camera = rt.getNodeByName(cam)
layer_no = rt.batchRenderMgr.FindView(cam)
renderlayer = None
if layer_no is None:
if layer_no == 0:
renderlayer = rt.batchRenderMgr.CreateView(camera)
else:
renderlayer = rt.batchRenderMgr.GetView(layer_no)

View file

@ -2,6 +2,7 @@
"""Creator plugin for creating camera."""
import os
from openpype.hosts.max.api import plugin
from openpype.lib import BoolDef
from openpype.hosts.max.api.lib_rendersettings import RenderSettings
@ -17,6 +18,7 @@ class CreateRender(plugin.MaxCreator):
file = rt.maxFileName
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)
@ -29,3 +31,20 @@ class CreateRender(plugin.MaxCreator):
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)
RenderSettings().batch_render_layer(
container_name, filename,
selected_nodes_name)
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),
]

View file

@ -26,22 +26,7 @@ class CollectRender(pyblish.api.InstancePlugin):
file = rt.maxFileName
current_file = os.path.join(folder, file)
filepath = current_file.replace("\\", "/")
container_name = instance.data.get("instance_node")
context.data['currentFile'] = current_file
cameras = instance.data.get("members")
sel_cam = [
c.name for c in cameras
if rt.classOf(c) in rt.Camera.classes]
render_dir = os.path.dirname(rt.rendOutputFilename)
outputs = RenderSettings().create_batch_render_layer(
container_name, render_dir, sel_cam
)
aov_outputs = RenderSettings().get_batch_render_elements(
container_name, render_dir, sel_cam
)
files_aov = RenderProducts().get_multiple_beauty(outputs, cameras)
aovs = RenderProducts().get_multiple_aovs(outputs, cameras)
files_aov.update(aovs)
asset = get_current_asset_name()
files_by_aov = RenderProducts().get_beauty(instance.name)
@ -49,11 +34,33 @@ class CollectRender(pyblish.api.InstancePlugin):
aovs = RenderProducts().get_aovs(instance.name)
files_by_aov.update(aovs)
if instance.data.get("multiCamera"):
cameras = instance.data.get("members")
if not cameras:
raise RuntimeError("There should be at least"
" one renderable camera in container")
sel_cam = [
c.name for c in cameras
if rt.classOf(c) in rt.Camera.classes]
container_name = instance.data.get("instance_node")
render_dir = os.path.dirname(rt.rendOutputFilename)
outputs = RenderSettings().batch_render_layer(
container_name, render_dir, sel_cam
)
instance.data["cameras"] = sel_cam
files_by_aov = RenderProducts().get_multiple_beauty(
outputs, sel_cam)
aovs = RenderProducts().get_multiple_aovs(
outputs, sel_cam)
files_by_aov.update(aovs)
if "expectedFiles" not in instance.data:
instance.data["expectedFiles"] = list()
instance.data["files"] = list()
instance.data["expectedFiles"].append(files_aov)
instance.data["files"].append(files_aov)
instance.data["expectedFiles"].append(files_by_aov)
instance.data["files"].append(files_by_aov)
img_format = RenderProducts().image_format()
project_name = context.data["projectName"]
@ -94,13 +101,10 @@ class CollectRender(pyblish.api.InstancePlugin):
"renderer": renderer,
"source": filepath,
"plugin": "3dsmax",
"cameras": sel_cam,
"frameStart": int(rt.rendStart),
"frameEnd": int(rt.rendEnd),
"version": version_int,
"farm": True,
"renderoutput": outputs,
"aovoutput": aov_outputs
"farm": True
}
instance.data.update(data)