diff options
author | lijenstina <lijenstina@gmail.com> | 2017-09-28 15:32:15 +0300 |
---|---|---|
committer | lijenstina <lijenstina@gmail.com> | 2017-09-28 15:32:15 +0300 |
commit | 88f0d4f89e03da4b6972c1b17569f668d98b06ea (patch) | |
tree | ae6c33b5610cc1e2482a2f7c3f13bc0f0c5b6d63 | |
parent | 7c0dd68b60184e2ff4265b98e120d503a32acfa0 (diff) |
Display Tools: Fix particles issues with Fast Navigation
Bump version to 1.6.4
Fix several issues related to drawing particles:
- Particles not restored on exit
- Needless modal looping through them
- Hook the InitialParticles property properly
Fix not restoring the viewport shading on exit
Fix crash with changing Screens
Some UI fixes
Improve the tooltip for Fast Navigate
-rw-r--r-- | space_view3d_display_tools/__init__.py | 24 | ||||
-rw-r--r-- | space_view3d_display_tools/fast_navigate.py | 123 |
2 files changed, 103 insertions, 44 deletions
diff --git a/space_view3d_display_tools/__init__.py b/space_view3d_display_tools/__init__.py index 03df6a32..58699f98 100644 --- a/space_view3d_display_tools/__init__.py +++ b/space_view3d_display_tools/__init__.py @@ -25,7 +25,7 @@ bl_info = { "name": "Display Tools", "author": "Jordi Vall-llovera Medina, Jhon Wallace", - "version": (1, 6, 3), + "version": (1, 6, 4), "blender": (2, 7, 0), "location": "Toolshelf", "description": "Display tools for fast navigation/interaction with the viewport", @@ -446,13 +446,20 @@ class DisplayToolsPanel(Panel): layout.prop(display_tools, "OriginalMode") layout.prop(display_tools, "FastMode") layout.prop(display_tools, "EditActive", "Edit mode") + layout.prop(display_tools, "Delay") - layout.prop(display_tools, "DelayTimeGlobal", "Delay time") + col = layout.column(align=True) + col.active = display_tools.Delay + col.prop(display_tools, "DelayTimeGlobal", "Delay time") + layout.prop(display_tools, "ShowParticles") - layout.prop(display_tools, "ParticlesPercentageDisplay") - layout.separator() + col = layout.column(align=True) + col.active = display_tools.ShowParticles + col.prop(display_tools, "InitialParticles") + col.prop(display_tools, "ParticlesPercentageDisplay") col = layout.column(align=True) + col.label("Screen Active Area:") col.prop(display_tools, "ScreenStart") col.prop(display_tools, "ScreenEnd") @@ -517,8 +524,8 @@ class display_tools_scene_props(PropertyGroup): default=True ) ParticlesPercentageDisplay = IntProperty( - name="Display", - description="Display only a percentage of particles", + name="Fast Display", + description="Display only a percentage of particles when active", default=25, min=0, max=100, @@ -527,8 +534,9 @@ class display_tools_scene_props(PropertyGroup): subtype='FACTOR' ) InitialParticles = IntProperty( - name="Count for initial particle setting before entering fast navigate", - description="Display a percentage value of particles", + name="Normal Display", + description="When idle, how much particles are displayed\n" + "Overrides the Particles settings", default=100, min=0, max=100, diff --git a/space_view3d_display_tools/fast_navigate.py b/space_view3d_display_tools/fast_navigate.py index 5551bd32..269aec2c 100644 --- a/space_view3d_display_tools/fast_navigate.py +++ b/space_view3d_display_tools/fast_navigate.py @@ -1,7 +1,7 @@ # space_view_3d_display_tools.py Copyright (C) 2014, Jordi Vall-llovera # Multiple display tools for fast navigate/interact with the viewport -# ***** BEGIN GPL LICENSE BLOCK ***** +# ##### BEGIN GPL LICENSE BLOCK ##### # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License @@ -17,7 +17,7 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # -# ***** END GPL LICENCE BLOCK ***** +# ##### END GPL LICENCE BLOCK ##### """ Additional links: @@ -27,6 +27,7 @@ Additional links: import bpy from bpy.types import Operator from bpy.props import BoolProperty +from collections import defaultdict # Fast Navigate toggle function @@ -37,25 +38,21 @@ def trigger_fast_navigate(trigger): # Control how to display particles during fast navigate -def display_particles(mode): +def display_particles(mode, dis_particles): scene = bpy.context.scene.display_tools - if mode is True: - for particles in bpy.data.particles: + for particles in bpy.data.particles: + if scene.ShowParticles is False: + particles.draw_method = 'NONE' + else: if particles.type == 'EMITTER': particles.draw_method = 'DOT' particles.draw_percentage = 100 else: particles.draw_method = 'RENDER' - particles.draw_percentage = 100 - else: - for particles in bpy.data.particles: - if particles.type == 'EMITTER': - particles.draw_method = 'DOT' - particles.draw_percentage = scene.ParticlesPercentageDisplay - else: - particles.draw_method = 'RENDER' - particles.draw_percentage = scene.ParticlesPercentageDisplay + particles.draw_percentage = dis_particles + + return dis_particles # Fast Navigate operator @@ -63,18 +60,27 @@ class FastNavigate(Operator): bl_idname = "view3d.fast_navigate_operator" bl_label = "Fast Navigate" bl_description = ("Limit the objects drawing in the 3D view for faster navigation\n" - "Runs in modal mode until Stop is pressed") + "Runs in modal mode until Stop is pressed or Esc, Return, Space") trigger = BoolProperty(default=False) mode = BoolProperty(default=False) screen_width = [0, 0] + store_fail = False + store_init_particles = {} + store_viewport_shade = None + check_particles_draw = False + fast_particles_draw = 0 def modal(self, context, event): context.area.tag_redraw() scene = context.scene.display_tools if scene.FastNavigateStop is True: - self.cancel(context) + self.execute(context) + return {'FINISHED'} + + if context.area.type != 'VIEW_3D': + self.execute(context) return {'FINISHED'} if scene.EditActive is True: @@ -92,20 +98,69 @@ class FastNavigate(Operator): self.fast_navigate_stuff(context, event) return {'PASS_THROUGH'} - def execute(self, context): + return {'RUNNING_MODAL'} + + def invoke(self, context, event): + if context.area.type != 'VIEW_3D': + self.report({'WARNING'}, + "Fast Navigate: View3D not found. Operation Cancelled") + return {'CANCELLED'} + + self.store_init_particles = defaultdict(list) + self.store_fail = False + context.window_manager.modal_handler_add(self) trigger_fast_navigate(self.trigger) scene = context.scene.display_tools scene.DelayTime = scene.DelayTimeGlobal self.get_screen_size(context, scene) + self.start_settings_store(context, store=False) + self.check_particles_draw = True + return {'RUNNING_MODAL'} + def execute(self, context): + scene = context.scene.display_tools + scene.FastNavigateStop = True + + self.start_settings_store(context, store=True) + + mess, mess_txt = ('WARNING', "Fast Navigate: Some Settings could not be restored") if \ + self.store_fail else ('INFO', "Exited the Fast Navigate mode") + + self.report({mess}, mess_txt) + + return {'FINISHED'} + @staticmethod def calc_delay(scene): if scene.Delay is True: if scene.DelayTime < scene.DelayTimeGlobal: scene.DelayTime += 1 + def start_settings_store(self, context, store=False): + try: + view = context.space_data + shade = view.viewport_shade if view.type == 'VIEW_3D' else None + if store is False: + if not shade: + self.store_fail = True + else: + self.store_viewport_shade = shade + for particle in bpy.data.particles: + self.store_init_particles[particle.name] = \ + [particle.draw_method, particle.draw_percentage] + else: + if not shade: + self.store_fail = True + else: + shade = self.store_viewport_shade or 'SOLID' + for particle in bpy.data.particles: + particle.draw_method = self.store_init_particles[particle.name][0] + particle.draw_percentage = self.store_init_particles[particle.name][1] + except: + self.store_fail = True + def get_screen_size(self, context, scene): if context.area.type == 'VIEW_3D': coord_x = context.area.x + scene.ScreenStart @@ -117,16 +172,15 @@ class FastNavigate(Operator): scene = context.scene.display_tools view = context.space_data + if scene.FastNavigateStop is True: + return {'FINISHED'} + if context.area.type != 'VIEW_3D': - self.cancel(context) - return {'CANCELLED'} + scene.FastNavigateStop = True + return {'FINISHED'} if event.type in {'ESC', 'RET', 'SPACE'}: - self.cancel(context) - return {'CANCELLED'} - - if scene.FastNavigateStop is True: - self.cancel(context) + scene.FastNavigateStop = True return {'CANCELLED'} # limit the active area @@ -182,19 +236,15 @@ class FastNavigate(Operator): scene.DelayTime = scene.DelayTimeGlobal self.mode = True - if scene.ShowParticles is False: - for particles in bpy.data.particles: - if particles.type == 'EMITTER': - particles.draw_method = 'NONE' - else: - particles.draw_method = 'NONE' - else: - display_particles(self.mode) + # update particles draw (only update call when the fast draw or the percentage are changed) + self.check_particles_draw = not self.mode + dis_particles = scene.InitialParticles if self.mode else scene.ParticlesPercentageDisplay - def cancel(self, context): - scene = context.scene.display_tools - for particles in bpy.data.particles: - particles.draw_percentage = scene.InitialParticles + if self.check_particles_draw is True: + self.fast_particles_draw = display_particles(self.mode, dis_particles) + else: + if self.fast_particles_draw != dis_particles: + self.fast_particles_draw = display_particles(self.mode, dis_particles) # Fast Navigate Stop @@ -211,6 +261,7 @@ class FastNavigateStop(Operator): def execute(self, context): fast_navigate_stop(context) + return {'FINISHED'} |