Commit e61900e8 authored by Dalai Felinto's avatar Dalai Felinto
Browse files

Performance boost: option to hide view3d objects

parent 251f63e2
...@@ -53,13 +53,18 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -53,13 +53,18 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
# update the values in def _init_static # update the values in def _init_static
_hmd = None _hmd = None
_timer = None _timer = None
_handle = None _handle_pre = None
_handle_post = None
_handle_pixel = None
_hash_slave = -1 _hash_slave = -1
_hash_master = -1 _hash_master = -1
_slave_status = 0 _slave_status = 0
_slave_window = None _slave_window = None
_slave_area = None _slave_area = None
_is_mac = False _is_mac = False
_visible_master = None
_visible_slave = None
_is_rendering = False
action = bpy.props.EnumProperty( action = bpy.props.EnumProperty(
description="", description="",
...@@ -179,9 +184,17 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -179,9 +184,17 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
wm.event_timer_remove(self._timer) wm.event_timer_remove(self._timer)
self._timer = None self._timer = None
if self._handle: if self._handle_pre:
bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW') bpy.types.SpaceView3D.draw_handler_remove(self._handle_pre, 'WINDOW')
self._handle = None self._handle_pre = None
if self._handle_post:
bpy.types.SpaceView3D.draw_handler_remove(self._handle_post, 'WINDOW')
self._handle_post = None
if self._handle_pixel:
bpy.types.SpaceView3D.draw_handler_remove(self._handle_pixel, 'WINDOW')
self._handle_pixel = None
self._preview.quit() self._preview.quit()
...@@ -201,13 +214,18 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -201,13 +214,18 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
def _init_static(self): def _init_static(self):
self._hmd = None self._hmd = None
self._timer = None self._timer = None
self._handle = None self._handle_pre = None
self._handle_post = None
self._handle_pixel = None
self._hash_slave = -1 self._hash_slave = -1
self._hash_master = -1 self._hash_master = -1
self._slave_status = 0 self._slave_status = 0
self._slave_window = None self._slave_window = None
self._slave_area = None self._slave_area = None
self._is_mac = isMac() self._is_mac = isMac()
self._visible_master = None
self._visible_slave = None
self._is_rendering = False
def init(self, context): def init(self, context):
""" """
...@@ -229,7 +247,9 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -229,7 +247,9 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
# setup modal # setup modal
self._timer = wm.event_timer_add(1.0 / 75.0, context.window) # 75 Hz self._timer = wm.event_timer_add(1.0 / 75.0, context.window) # 75 Hz
self._handle = bpy.types.SpaceView3D.draw_handler_add(self._draw_callback_px, (context,), 'WINDOW', 'POST_PIXEL') self._handle_pre = bpy.types.SpaceView3D.draw_handler_add(self._draw_callback_pre, (context,), 'WINDOW', 'PRE_VIEW')
self._handle_post = bpy.types.SpaceView3D.draw_handler_add(self._draw_callback_post, (context,), 'WINDOW', 'POST_VIEW')
self._handle_pixel = bpy.types.SpaceView3D.draw_handler_add(self._draw_callback_pixel, (context,), 'WINDOW', 'POST_PIXEL')
wm.modal_handler_add(self) wm.modal_handler_add(self)
if self._hmd.is_direct_mode: if self._hmd.is_direct_mode:
...@@ -379,6 +399,7 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -379,6 +399,7 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
""" """
Get fresh tracking data and render into the FBO Get fresh tracking data and render into the FBO
""" """
self._is_rendering = True
self._hmd.loop(context) self._hmd.loop(context)
for i in range(2): for i in range(2):
...@@ -392,6 +413,7 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -392,6 +413,7 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
offscreen_object.draw_view3d(projection_matrix, modelview_matrix) offscreen_object.draw_view3d(projection_matrix, modelview_matrix)
self._hmd.frameReady() self._hmd.frameReady()
self._is_rendering = False
def _drawMaster(self, context): def _drawMaster(self, context):
wm = context.window_manager wm = context.window_manager
...@@ -483,14 +505,73 @@ class VirtualRealityDisplayOperator(bpy.types.Operator): ...@@ -483,14 +505,73 @@ class VirtualRealityDisplayOperator(bpy.types.Operator):
disable(font_id, SHADOW) disable(font_id, SHADOW)
def _draw_callback_px(self, context): def _pre_draw_hide(self, context, visible):
scene = context.scene
for ob in scene.objects:
if not ob.hide:
visible.append(ob)
ob.hide = True
def _post_draw_show(self, context, visible):
for ob in visible:
ob.hide = False
def _hide_master(self, context):
"""
whether to hide the main 3d viewport
"""
vr = context.window_manager.virtual_reality
if vr.use_hmd_only:
return True
if vr.use_preview and vr.preview_scale == 100:
return True
def _draw_callback_pre(self, context):
"""
hide all the scene objects to speed up rendering
"""
if self._is_rendering:
return
area = context.area
hash_area = hash(area)
if hash_area == self._hash_slave:
self._visible_slave = []
self._pre_draw_hide(context, self._visible_slave)
elif hash_area == self._hash_master and self._hide_master(context):
self._visible_master = []
self._pre_draw_hide(context, self._visible_master)
def _draw_callback_post(self, context):
"""
show all the hidden objects
"""
if self._is_rendering:
return
area = context.area
hash_area = hash(area)
if hash_area == self._hash_slave:
self._post_draw_show(context, self._visible_slave)
elif hash_area == self._hash_master and self._hide_master(context):
self._post_draw_show(context, self._visible_master)
def _draw_callback_pixel(self, context):
""" """
callback function, run every time the viewport is refreshed callback function, run every time the viewport is refreshed
""" """
if self._is_rendering:
return
area = context.area area = context.area
hash_area = hash(area) hash_area = hash(area)
if (hash_area == self._hash_slave): if hash_area == self._hash_slave:
self._drawSlave(context) self._drawSlave(context)
elif hash_area == self._hash_master: elif hash_area == self._hash_master:
...@@ -554,6 +635,11 @@ class VirtualRealityInfo(bpy.types.PropertyGroup): ...@@ -554,6 +635,11 @@ class VirtualRealityInfo(bpy.types.PropertyGroup):
default=False, default=False,
) )
use_hmd_only = BoolProperty(
name="HMD Only",
default=False,
)
preview_scale = IntProperty( preview_scale = IntProperty(
name="Preview Scale", name="Preview Scale",
min=0, min=0,
...@@ -598,6 +684,7 @@ class VirtualRealityInfo(bpy.types.PropertyGroup): ...@@ -598,6 +684,7 @@ class VirtualRealityInfo(bpy.types.PropertyGroup):
self.commands.remove(0) self.commands.remove(0)
self.use_preview = False self.use_preview = False
self.use_hmd_only = False
self.error_message = "" self.error_message = ""
self.is_enabled = False self.is_enabled = False
self.is_slave_setup = False self.is_slave_setup = False
......
...@@ -42,6 +42,10 @@ class VirtualRealityPanel(bpy.types.Panel): ...@@ -42,6 +42,10 @@ class VirtualRealityPanel(bpy.types.Panel):
sub.active = vr.use_preview sub.active = vr.use_preview
sub.prop(vr, "preview_scale", text="Scale") sub.prop(vr, "preview_scale", text="Scale")
sub = col.column()
sub.active = vr.preview_scale < 100
sub.prop(vr, "use_hmd_only")
col.operator("view3d.virtual_reality_display", text="Re-Center").action='RECENTER' col.operator("view3d.virtual_reality_display", text="Re-Center").action='RECENTER'
col.label(text="Tracking:") col.label(text="Tracking:")
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment