Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 34 additions & 42 deletions lightfield_viewport.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down
68 changes: 56 additions & 12 deletions ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
)

Expand Down Expand Up @@ -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
Expand Down