multiple render camera supports for 3dsmax

This commit is contained in:
Kayla Man 2023-06-09 17:51:54 +08:00
parent d231558d90
commit 058fcb97a3
4 changed files with 34 additions and 15 deletions

View file

@ -35,15 +35,8 @@ class RenderSettings(object):
)
def set_render_camera(self, selection):
for sel in selection:
# to avoid Attribute Error from pymxs wrapper
found = False
if rt.classOf(sel) in rt.Camera.classes:
found = True
rt.viewport.setCamera(sel)
break
if not found:
raise RuntimeError("Camera not found")
# to avoid Attribute Error from pymxs wrapper
return rt.viewport.setCamera(selection[0])
def render_output(self, container):
folder = rt.maxFilePath

View file

@ -14,7 +14,10 @@ class CreateRender(plugin.MaxCreator):
def create(self, subset_name, instance_data, pre_create_data):
from pymxs import runtime as rt
sel_obj = list(rt.selection)
sel_obj = [
c for c in rt.Objects
if rt.classOf(c) in rt.Camera.classes]
file = rt.maxFileName
filename, _ = os.path.splitext(file)
instance_data["AssetName"] = filename
@ -24,11 +27,20 @@ class CreateRender(plugin.MaxCreator):
instance_data,
pre_create_data) # type: CreatedInstance
container_name = instance.data.get("instance_node")
container = rt.getNodeByName(container_name)
# TODO: Disable "Add to Containers?" Panel
# parent the selected cameras into the container
for obj in sel_obj:
obj.parent = container
if self.selected_nodes:
# set viewport camera for
# rendering(mandatory for deadline)
sel_obj = [
c for c in rt.getCurrentSelection()
if rt.classOf(c) in rt.Camera.classes]
if not sel_obj:
raise RuntimeError("Please add at least one camera to the scene "
"before creating the render instance")
RenderSettings().set_render_camera(sel_obj)
# for additional work on the node:
# instance_node = rt.getNodeByName(instance.get("instance_node"))
@ -37,7 +49,5 @@ class CreateRender(plugin.MaxCreator):
# Changing the Render Setup dialog settings should be done
# with the actual Render Setup dialog in a closed state.
# set viewport camera for rendering(mandatory for deadline)
RenderSettings().set_render_camera(sel_obj)
# set output paths for rendering(mandatory for deadline)
RenderSettings().render_output(container_name)

View file

@ -48,6 +48,10 @@ class CollectRender(pyblish.api.InstancePlugin):
instance.name,
asset_id)
self.log.debug("version_doc: {0}".format(version_doc))
sel_obj = [
c for c in rt.Objects
if rt.classOf(c) in rt.Camera.classes]
version_int = 1
if version_doc:
version_int += int(version_doc["name"])
@ -78,6 +82,7 @@ class CollectRender(pyblish.api.InstancePlugin):
"renderer": renderer,
"source": filepath,
"plugin": "3dsmax",
"cameras": sel_obj,
"frameStart": int(rt.rendStart),
"frameEnd": int(rt.rendEnd),
"version": version_int,

View file

@ -212,6 +212,17 @@ class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
plugin_data["RenderOutput"] = beauty_name
# as 3dsmax has version with different languages
plugin_data["Language"] = "ENU"
render_cameras = instance.data["cameras"]
if render_cameras:
for i, camera in enumerate(render_cameras):
cam_name = "Camera%s" % (i + 1)
plugin_data[cam_name] = camera.name
# set the default camera
plugin_data["Camera"] = render_cameras[0].name
# set empty camera of Camera 0 for the '
# correct parameter submission
plugin_data["Camera0"] = None
renderer_class = get_current_renderer()
renderer = str(renderer_class).split(":")[0]