add use selection back to the creator option & cleanup the viewport setting code

This commit is contained in:
Kayla Man 2023-10-18 19:20:31 +08:00
parent 1ffd1f2fed
commit c49289bb8a
4 changed files with 98 additions and 76 deletions

View file

@ -323,7 +323,7 @@ def is_headless():
@contextlib.contextmanager
def viewport_setup_updated(camera):
def viewport_camera(camera):
"""Function to set viewport camera during context
***For 3dsMax 2024+
Args:
@ -346,64 +346,55 @@ def viewport_setup_updated(camera):
@contextlib.contextmanager
def viewport_setup(instance, viewport_setting, camera):
"""Function to set camera and other viewport options
during context
****For Max Version < 2024
Args:
instance (str): instance
viewport_setting (str): active viewport setting
camera (str): viewport camera
"""
original = rt.viewport.getCamera()
has_vp_btn = rt.ViewportButtonMgr.EnableButtons
has_autoplay = rt.preferences.playPreviewWhenDone
if not original:
def viewport_preference_setting(camera,
general_viewport,
nitrous_viewport,
vp_button_mgr,
preview_preferences):
original_camera = rt.viewport.getCamera()
if not original_camera:
# if there is no original camera
# use the current camera as original
original = rt.getNodeByName(camera)
original_camera = rt.getNodeByName(camera)
review_camera = rt.getNodeByName(camera)
current_visualStyle = viewport_setting.VisualStyleMode
current_visualPreset = viewport_setting.ViewportPreset
current_useTexture = viewport_setting.UseTextureEnabled
orig_vp_grid = rt.viewport.getGridVisibility(1)
orig_vp_bkg = rt.viewport.IsSolidBackgroundColorMode()
visualStyle = instance.data.get("visualStyleMode")
viewportPreset = instance.data.get("viewportPreset")
useTexture = instance.data.get("vpTexture")
has_grid_viewport = instance.data.get("dspGrid")
bkg_color_viewport = instance.data.get("dspBkg")
nitrousGraphicMgr = rt.NitrousGraphicsManager
viewport_setting = nitrousGraphicMgr.GetActiveViewportSetting()
vp_button_mgr_original = {
key: getattr(rt.ViewportButtonMgr, key) for key in vp_button_mgr
}
nitrous_viewport_original = {
key: getattr(viewport_setting, key) for key in nitrous_viewport
}
preview_preferences_original = {
key: getattr(rt.preferences, key) for key in preview_preferences
}
try:
rt.viewport.setCamera(review_camera)
rt.viewport.setGridVisibility(1, has_grid_viewport)
rt.preferences.playPreviewWhenDone = False
rt.ViewportButtonMgr.EnableButtons = False
rt.viewport.EnableSolidBackgroundColorMode(
bkg_color_viewport)
if visualStyle != current_visualStyle:
viewport_setting.VisualStyleMode = rt.Name(
visualStyle)
elif viewportPreset != current_visualPreset:
viewport_setting.ViewportPreset = rt.Name(
viewportPreset)
elif useTexture != current_useTexture:
viewport_setting.UseTextureEnabled = useTexture
rt.viewport.setGridVisibility(1, general_viewport["dspGrid"])
rt.viewport.EnableSolidBackgroundColorMode(general_viewport["dspBkg"])
for key, value in vp_button_mgr.items():
setattr(rt.ViewportButtonMgr, key, value)
for key, value in nitrous_viewport.items():
if nitrous_viewport[key] != nitrous_viewport_original[key]:
setattr(viewport_setting, key, value)
for key, value in preview_preferences.items():
setattr(rt.preferences, key, value)
yield
finally:
rt.viewport.setCamera(original)
rt.viewport.setCamera(review_camera)
rt.viewport.setGridVisibility(1, orig_vp_grid)
rt.viewport.EnableSolidBackgroundColorMode(orig_vp_bkg)
viewport_setting.VisualStyleMode = current_visualStyle
viewport_setting.ViewportPreset = current_visualPreset
viewport_setting.UseTextureEnabled = current_useTexture
rt.ViewportButtonMgr.EnableButtons = has_vp_btn
rt.preferences.playPreviewWhenDone = has_autoplay
for key, value in vp_button_mgr_original.items():
setattr(rt.ViewportButtonMgr, key, value)
for key, value in nitrous_viewport_original.items():
setattr(viewport_setting, key, value)
for key, value in preview_preferences_original.items():
setattr(rt.preferences, key, value)
rt.completeRedraw()
def set_timeline(frameStart, frameEnd):
@ -630,7 +621,8 @@ def publish_review_animation(instance, filepath,
def publish_preview_sequences(staging_dir, filename,
startFrame, endFrame, ext):
startFrame, endFrame,
percentSize, ext):
"""publish preview animation by creating bitmaps
***For 3dsMax Version <2024
@ -639,13 +631,15 @@ def publish_preview_sequences(staging_dir, filename,
filename (str): filename
startFrame (int): start frame
endFrame (int): end frame
percentSize (int): percentage of the resolution
ext (str): image extension
"""
# get the screenshot
rt.forceCompleteRedraw()
rt.enableSceneRedraw()
res_width = rt.renderWidth
res_height = rt.renderHeight
resolution_percentage = float(percentSize) / 100
res_width = rt.renderWidth * resolution_percentage
res_height = rt.renderHeight * resolution_percentage
viewportRatio = float(res_width / res_height)
@ -684,4 +678,4 @@ def publish_preview_sequences(staging_dir, filename,
if rt.keyboard.escPressed:
rt.exit()
# clean up the cache
rt.gc()
rt.gc(delayed=True)

View file

@ -75,4 +75,5 @@ class CreateReview(plugin.MaxCreator):
def get_pre_create_attr_defs(self):
# Use same attributes as for instance attributes
return self.get_instance_attr_defs()
attrs = super().get_pre_create_attr_defs()
return attrs + self.get_instance_attr_defs()

View file

@ -27,28 +27,15 @@ class CollectReview(pyblish.api.InstancePlugin,
focal_length = node.fov
creator_attrs = instance.data["creator_attributes"]
attr_values = self.get_attr_values_from_data(instance.data)
data = {
general_preview_data = {
"review_camera": camera_name,
"imageFormat": creator_attrs["imageFormat"],
"keepImages": creator_attrs["keepImages"],
"percentSize": creator_attrs["percentSize"],
"visualStyleMode": creator_attrs["visualStyleMode"],
"viewportPreset": creator_attrs["viewportPreset"],
"vpTexture": creator_attrs["vpTexture"],
"frameStart": instance.context.data["frameStart"],
"frameEnd": instance.context.data["frameEnd"],
"fps": instance.context.data["fps"],
"dspGeometry": attr_values.get("dspGeometry"),
"dspShapes": attr_values.get("dspShapes"),
"dspLights": attr_values.get("dspLights"),
"dspCameras": attr_values.get("dspCameras"),
"dspHelpers": attr_values.get("dspHelpers"),
"dspParticles": attr_values.get("dspParticles"),
"dspBones": attr_values.get("dspBones"),
"dspBkg": attr_values.get("dspBkg"),
"dspGrid": attr_values.get("dspGrid"),
"dspSafeFrame": attr_values.get("dspSafeFrame"),
"dspFrameNums": attr_values.get("dspFrameNums")
}
if int(get_max_version()) >= 2024:
@ -61,14 +48,50 @@ class CollectReview(pyblish.api.InstancePlugin,
instance.data["colorspaceDisplay"] = display
instance.data["colorspaceView"] = view_transform
preview_data = {
"visualStyleMode": creator_attrs["visualStyleMode"],
"viewportPreset": creator_attrs["viewportPreset"],
"vpTexture": creator_attrs["vpTexture"],
"dspGeometry": attr_values.get("dspGeometry"),
"dspShapes": attr_values.get("dspShapes"),
"dspLights": attr_values.get("dspLights"),
"dspCameras": attr_values.get("dspCameras"),
"dspHelpers": attr_values.get("dspHelpers"),
"dspParticles": attr_values.get("dspParticles"),
"dspBones": attr_values.get("dspBones"),
"dspBkg": attr_values.get("dspBkg"),
"dspGrid": attr_values.get("dspGrid"),
"dspSafeFrame": attr_values.get("dspSafeFrame"),
"dspFrameNums": attr_values.get("dspFrameNums")
}
else:
preview_data = {}
general_viewport = {
"dspBkg": attr_values.get("dspBkg"),
"dspGrid": attr_values.get("dspGrid")
}
nitrous_viewport = {
"VisualStyleMode": creator_attrs["visualStyleMode"],
"ViewportPreset": creator_attrs["viewportPreset"],
"UseTextureEnabled": creator_attrs["vpTexture"]
}
preview_data["general_viewport"] = general_viewport
preview_data["nitrous_viewport"] = nitrous_viewport
preview_data["vp_button_manager"] = {
"EnableButtons" : False
}
preview_data["preferences"] = {
"playPreviewWhenDone": False
}
# Enable ftrack functionality
instance.data.setdefault("families", []).append('ftrack')
burnin_members = instance.data.setdefault("burninDataMembers", {})
burnin_members["focalLength"] = focal_length
instance.data.update(data)
self.log.debug(f"data:{data}")
instance.data.update(general_preview_data)
instance.data.update(preview_data)
@classmethod
def get_attribute_defs(cls):

View file

@ -3,8 +3,8 @@ import pyblish.api
from pymxs import runtime as rt
from openpype.pipeline import publish
from openpype.hosts.max.api.lib import (
viewport_setup_updated,
viewport_setup,
viewport_camera,
viewport_preference_setting,
get_max_version,
publish_review_animation,
publish_preview_sequences
@ -39,13 +39,17 @@ class ExtractReviewAnimation(publish.Extractor):
review_camera = instance.data["review_camera"]
if int(get_max_version()) < 2024:
nitrousGraphicMgr = rt.NitrousGraphicsManager
viewport_setting = nitrousGraphicMgr.GetActiveViewportSetting()
with viewport_setup(instance, viewport_setting, review_camera):
with viewport_preference_setting(review_camera,
instance.data["general_viewport"],
instance.data["nitrous_viewport"],
instance.data["vp_button_manager"],
instance.data["preferences"]):
percentSize = instance.data.get("percentSize")
publish_preview_sequences(
staging_dir, instance.name, start, end, ext)
staging_dir, instance.name,
start, end, percentSize, ext)
else:
with viewport_setup_updated(review_camera):
with viewport_camera(review_camera):
preview_arg = publish_review_animation(
instance, filepath, start, end, fps)
rt.execute(preview_arg)