From b6d28a4d912b1b03c718a4bd29ba936d0417b0cc Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 29 Jan 2022 22:32:01 -0500 Subject: [PATCH] Expose preview enums as configurable properties. Exposes realtime lightfield preview options as overlappable and configurable properties for improved realtime rendering performance options. --- lightfield_viewport.py | 76 +++++++++++++++++++----------------------- ui.py | 68 ++++++++++++++++++++++++++++++------- 2 files changed, 90 insertions(+), 54 deletions(-) diff --git a/lightfield_viewport.py b/lightfield_viewport.py index 5396903..39970fb 100644 --- a/lightfield_viewport.py +++ b/lightfield_viewport.py @@ -78,7 +78,8 @@ class LOOKINGGLASS_OT_render_viewport(bpy.types.Operator): modal_redraw = True depsgraph_update_time = 0 skip_views = 1 - restricted_viewcone_limit = 0 + restricted_viewcone_lower_limit = 0 + restricted_viewcone_upper_limit = 0 # DEBUGING VARIABLES start_multi_view = 0 @@ -324,7 +325,8 @@ def modal(self, context, event): # dont skip any views self.skip_views = 1 - self.restricted_viewcone_limit = 0 + self.restricted_viewcone_lower_limit = 0 + self.restricted_viewcone_upper_limit = 0 # set to redraw self.modal_redraw = True @@ -354,39 +356,41 @@ def trackDepsgraphUpdates(self, scene, depsgraph): # allow an update of the Looking Glass viewport self.modal_redraw = True - # if the "no preview" is activated - if self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '0': + # preview mode is enabled + if self.addon_settings.viewport_use_preview_mode: - # don't allow an update of the Looking Glass viewport - self.modal_redraw = False + # at least one preview type is activated + if self.addon_settings.lightfield_preview_mode_low_res or self.addon_settings.lightfield_preview_mode_skip_views or self.addon_settings.lightfield_preview_mode_restricted_viewcone: + + # if the "low resolution preview" is activated + if self.addon_settings.lightfield_preview_mode_low_res: - # we don't redraw, because changes are only updated after the user interaction finished - pass - - # if the "low resolution preview" is activated - elif self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '1': + # activate them + self.preset = int(list(pylio.LookingGlassQuilt.formats.get().keys())[-1]) - # activate them - self.preset = int(list(pylio.LookingGlassQuilt.formats.get().keys())[-1]) + # if the "skip views preview" is activated + if self.addon_settings.lightfield_preview_mode_skip_views: - # if the "skip views preview I" is activated - elif self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '2': + # skip every second view during rendering + self.skip_views = self.addon_settings.lightfield_preview_mode_skip_views_factor - # skip every second view during rendering - self.skip_views = 2 + # if the "restricted viewcone preview" is activated + if self.addon_settings.lightfield_preview_mode_restricted_viewcone: - # if the "skip views preview II" is activated - elif self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '3': + # only show the selected range of all views + self.restricted_viewcone_lower_limit = int(self.qs[self.preset]["total_views"] * ((self.addon_settings.lightfield_preview_mode_restricted_viewcone_centre - self.addon_settings.lightfield_preview_mode_restricted_viewcone_coverage / 2) / 100)) + self.restricted_viewcone_upper_limit = self.qs[self.preset]["total_views"] - int(self.qs[self.preset]["total_views"] * ((self.addon_settings.lightfield_preview_mode_restricted_viewcone_centre + self.addon_settings.lightfield_preview_mode_restricted_viewcone_coverage / 2) / 100)) - # skip every third view during rendering - self.skip_views = 3 + # otherwise, no preview type is activated + else: - # if the "restricted viewcone preview" is activated - elif self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '4': + # don't allow an update of the Looking Glass viewport + self.modal_redraw = False - # only show the center 33% of all views - self.restricted_viewcone_limit = int(self.qs[self.preset]["total_views"] / 3) + # we don't redraw, because changes are only updated after the user interaction finished + pass + # otherwise, preview mode is toggled off else: # set to the currently chosen quality @@ -714,7 +718,7 @@ def render_view(self, context): LookingGlassAddonLogger.debug(" [#] View dimensions: %i x %i" % (self.qs[self.preset]["view_width"], self.qs[self.preset]["view_height"])) LookingGlassAddonLogger.debug(" [#] LightfieldImage views: %i" % len(self.lightfield_image.get_view_data())) LookingGlassAddonLogger.debug(" [#] Using quilt preset: %i (%s, %i x %i)" % (self.preset, self.qs[self.preset]['description'], self.lightfield_image.metadata['quilt_width'], self.lightfield_image.metadata['quilt_height'])) - LookingGlassAddonLogger.debug(" [#] Preview mode: %s (selected: %s)" % (self.addon_settings.viewport_use_preview_mode, self.addon_settings.lightfield_preview_mode)) + LookingGlassAddonLogger.debug(" [#] Preview mode: %s (Low-res: %s, Skip-view: %s [%s], Restricted viewcone: %s [%s, %s])" % (self.addon_settings.viewport_use_preview_mode, self.addon_settings.lightfield_preview_mode_low_res, self.addon_settings.lightfield_preview_mode_skip_views, self.addon_settings.lightfield_preview_mode_skip_views_factor, self.addon_settings.lightfield_preview_mode_restricted_viewcone, self.addon_settings.lightfield_preview_mode_restricted_viewcone_centre, self.addon_settings.lightfield_preview_mode_restricted_viewcone_coverage)) # PREPARE VIEW & PROJECTION MATRIX @@ -765,16 +769,8 @@ def render_view(self, context): LookingGlassAddonLogger.debug(" [#] [%i] Setting up view camera took %.3f ms" % (view, (time.time() - start_test) * 1000)) start_test = time.time() - # if the "skip views preview" is activated AND this view shall be skipped - if (self.addon_settings.viewport_use_preview_mode and (self.addon_settings.lightfield_preview_mode == '2' or self.addon_settings.lightfield_preview_mode == '3')) and view % self.skip_views: - - # clear LightfieldView array's color data (so it appears black) - self.lightfield_image.views[view]['view'].data[:] = 0 - - LookingGlassAddonLogger.debug(" [#] [%i] Clearing skipped view's numpy array took %.3f ms" % (view, (time.time() - start_test) * 1000)) - - # if the "Restricted viewcone preview" is activated AND this view shall be skipped - elif (self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '4') and (view < self.restricted_viewcone_limit or view > self.qs[self.preset]["total_views"] - self.restricted_viewcone_limit): + # if the "skip views preview" or "Restricted viewcone preview" is activated AND this view shall be skipped + if self.addon_settings.viewport_use_preview_mode and ((self.addon_settings.lightfield_preview_mode_restricted_viewcone and (view < self.restricted_viewcone_lower_limit or view > self.qs[self.preset]["total_views"] - self.restricted_viewcone_upper_limit or self.restricted_viewcone_lower_limit == self.qs[self.preset]["total_views"] - self.restricted_viewcone_upper_limit)) or (self.addon_settings.lightfield_preview_mode_skip_views and view % self.skip_views)): # clear LightfieldView array's color data (so it appears black) self.lightfield_image.views[view]['view'].data[:] = 0 @@ -815,12 +811,8 @@ def render_view(self, context): # loop through all required views for view in range(0, self.qs[self.preset]["total_views"]): - # if the "skip views preview" is activated AND this view shall be skipped - if (self.addon_settings.viewport_use_preview_mode and (self.addon_settings.lightfield_preview_mode == '2' or self.addon_settings.lightfield_preview_mode == '3')) and view % self.skip_views: - - continue - # if the "Restricted viewcone preview" is activated AND this view shall be skipped - elif (self.addon_settings.viewport_use_preview_mode and self.addon_settings.lightfield_preview_mode == '4') and (view < self.restricted_viewcone_limit or view > self.qs[self.preset]["total_views"] - self.restricted_viewcone_limit): + # if the "skip views preview" or "Restricted viewcone preview" is activated AND this view shall be skipped + if self.addon_settings.viewport_use_preview_mode and ((self.addon_settings.lightfield_preview_mode_restricted_viewcone and (view < self.restricted_viewcone_lower_limit or view > self.qs[self.preset]["total_views"] - self.restricted_viewcone_upper_limit or self.restricted_viewcone_lower_limit == self.qs[self.preset]["total_views"] - self.restricted_viewcone_upper_limit)) or (self.addon_settings.lightfield_preview_mode_skip_views and view % self.skip_views)): continue else: diff --git a/ui.py b/ui.py index dc3005f..f0bdd4f 100644 --- a/ui.py +++ b/ui.py @@ -707,16 +707,50 @@ class LookingGlassAddonSettings(bpy.types.PropertyGroup): ) # Lightfield Preview Resolution in Auto lightfield mode - lightfield_preview_mode: bpy.props.EnumProperty( - items = [('0', 'No Preview', 'Lightfield window updates are performed after (not during) user interactions.'), - ('1', 'Low-resolution Preview', '1024x1024 quilt, 32 views'), - ('2', 'Skipped-views Preview I', 'Skip every second view'), - ('3', 'Skipped-views Preview II', 'Skip every third view'), - ('4', 'Restricted Viewcone Preview', 'Render only a restricted view cone'), - ], - default='0', - name="Lightfield Preview Mode", - update=LookingGlassAddonUI.update_lightfield_window_settings, + lightfield_preview_mode_low_res: bpy.props.BoolProperty( + name = "Low-resolution Preview", + description = "1024x1024 quilt, 32 views", + default = False, + update = LookingGlassAddonUI.update_lightfield_window_settings, + ) + lightfield_preview_mode_skip_views: bpy.props.BoolProperty( + name = "Skipped-views Preview", + description = "Only render every nth view as set below", + default = False, + update = LookingGlassAddonUI.update_lightfield_window_settings, + ) + lightfield_preview_mode_skip_views_factor: bpy.props.IntProperty( + name = "Factor", + description = "Only render views evenly divisible by this number when Skipped-views Preview is enabled", + min = 2, + soft_max = 4, + max = 10, + default = 2, + update = LookingGlassAddonUI.update_lightfield_window_settings, + ) + lightfield_preview_mode_restricted_viewcone: bpy.props.BoolProperty( + name = "Restricted Viewcone Preview", + description = "Render only a restricted viewcone with the parameters set below", + default = False, + update = LookingGlassAddonUI.update_lightfield_window_settings, + ) + lightfield_preview_mode_restricted_viewcone_centre: bpy.props.FloatProperty( + name = "Centre", + description = "Render only within the range centered around this perspective when Restricted Viewcone Preview is enabled", + subtype = 'PERCENTAGE', + min = 0, + max = 100, + default = 50, + update = LookingGlassAddonUI.update_lightfield_window_settings, + ) + lightfield_preview_mode_restricted_viewcone_coverage: bpy.props.FloatProperty( + name = "Coverage", + description = "Render only within this range about its centre when Restricted Viewcone Preview is enabled", + subtype = 'PERCENTAGE', + min = 0, + max = 100, + default = 33.333333, + update = LookingGlassAddonUI.update_lightfield_window_settings, ) # pointer property that can be used to load a pre-rendered quilt image @@ -730,7 +764,7 @@ class LookingGlassAddonSettings(bpy.types.PropertyGroup): viewport_use_preview_mode: bpy.props.BoolProperty( name="Use Preview Mode", - description="If enabled, a simplified lightfield is rendered during scene changes (for higher render speed)", + description="If enabled, a simplified lightfield is rendered during scene changes (for higher render speed). If no preview modes are selected below, then lightfield window updates are performed after (not during) user interactions.", default = True, ) @@ -1358,9 +1392,19 @@ def draw(self, context): # Preview settings row_output = column.row(align = True) - row_output.prop(context.scene.addon_settings, "lightfield_preview_mode", text="") + row_output.prop(context.scene.addon_settings, "lightfield_preview_mode_low_res") row_output.separator() row_output.prop(context.scene.addon_settings, "viewport_use_preview_mode", text="", icon='IMAGE_ZDEPTH') + row_output = column.row(align = True) + row_output.prop(context.scene.addon_settings, "lightfield_preview_mode_skip_views") + row_output = column.row(align = True) + row_output.prop(context.scene.addon_settings, "lightfield_preview_mode_skip_views_factor") + row_output = column.row(align = True) + row_output.prop(context.scene.addon_settings, "lightfield_preview_mode_restricted_viewcone") + row_output = column.row(align = True) + row_output.prop(context.scene.addon_settings, "lightfield_preview_mode_restricted_viewcone_centre") + row_output = column.row(align = True) + row_output.prop(context.scene.addon_settings, "lightfield_preview_mode_restricted_viewcone_coverage") # if the lightfield window is in quilt viewer mode