You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1360 lines
43 KiB
1360 lines
43 KiB
# space_view_3d_display_tools.py Copyright (C) 2012, Jordi Vall-llovera |
|
# |
|
# Multiple display tools for fast navigate/interact with the viewport |
|
# |
|
# ***** 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 |
|
# as published by the Free Software Foundation; either version 2 |
|
# of the License, or (at your option) any later version. |
|
# |
|
# This program is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# 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 ***** |
|
|
|
bl_info = { |
|
"name": "Display Tools", |
|
"author": "Jordi Vall-llovera Medina", |
|
"version": (1, 2, 6), |
|
"blender": (2, 6, 4), |
|
"location": "Toolshelf", |
|
"description": "Display tools for fast navigate/interact with the viewport", |
|
"warning": "", |
|
"wiki_url": "http://jordiart3d.blogspot.com.es/", |
|
"tracker_url": "", |
|
"category": "3D View"} |
|
|
|
""" |
|
Additional links: |
|
Author Site: http://jordiart3d.blogspot.com.es/ |
|
""" |
|
|
|
import bpy |
|
|
|
from bpy.props import IntProperty, BoolProperty, FloatProperty, EnumProperty |
|
|
|
# init delay variables |
|
bpy.types.Scene.Delay = bpy.props.BoolProperty( |
|
default = False, |
|
description = "Activate delay return to normal viewport mode") |
|
|
|
bpy.types.Scene.DelayTime = bpy.props.IntProperty( |
|
default = 30, |
|
min = 1, |
|
max = 500, |
|
soft_min = 10, |
|
soft_max = 250, |
|
description = "Delay time to return to normal viewport\ |
|
mode after move your mouse cursor") |
|
|
|
bpy.types.Scene.DelayTimeGlobal = bpy.props.IntProperty( |
|
default = 30, |
|
min = 1, |
|
max = 500, |
|
soft_min = 10, |
|
soft_max = 250, |
|
description = "Delay time to return to normal viewport\ |
|
mode after move your mouse cursor") |
|
|
|
#init variable for fast navigate |
|
bpy.types.Scene.EditActive = bpy.props.BoolProperty( |
|
default = True, |
|
description = "Activate for fast navigate in edit mode too") |
|
|
|
#Fast Navigate toggle function |
|
def trigger_fast_navigate(trigger): |
|
scene = bpy.context.scene |
|
scene.FastNavigateStop = False |
|
|
|
if trigger == True: |
|
trigger = False |
|
else: |
|
trigger = True |
|
|
|
#Control how to display particles during fast navigate |
|
def display_particles(mode): |
|
scene = bpy.context.scene |
|
|
|
if mode == True: |
|
for particles in bpy.data.particles: |
|
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 |
|
|
|
#Do repetitive fast navigate related stuff |
|
def fast_navigate_stuff(self, context, event): |
|
scene = bpy.context.scene |
|
view = context.space_data |
|
|
|
if bpy.context.area.type != 'VIEW_3D': |
|
return self.cancel(context) |
|
|
|
if event.type == 'ESC' or event.type == 'RET' or event.type == 'SPACE': |
|
return self.cancel(context) |
|
|
|
if scene.FastNavigateStop == True: |
|
return self.cancel(context) |
|
|
|
#fast navigate while orbit/panning |
|
if event.type == 'MIDDLEMOUSE': |
|
if scene.Delay == True: |
|
if scene.DelayTime < scene.DelayTimeGlobal: |
|
scene.DelayTime += 1 |
|
view.viewport_shade = scene.FastMode |
|
self.mode = False |
|
|
|
#fast navigate while transform operations |
|
if event.type == 'G' or event.type == 'R' or event.type == 'S': |
|
if scene.Delay == True: |
|
if scene.DelayTime < scene.DelayTimeGlobal: |
|
scene.DelayTime += 1 |
|
view.viewport_shade = scene.FastMode |
|
self.mode = False |
|
|
|
#fast navigate while menu popups or duplicates |
|
if event.type == 'W' or event.type == 'D' or event.type == 'L'\ |
|
or event.type == 'U' or event.type == 'I' or event.type == 'M'\ |
|
or event.type == 'A' or event.type == 'B': |
|
if scene.Delay == True: |
|
if scene.DelayTime < scene.DelayTimeGlobal: |
|
scene.DelayTime += 1 |
|
view.viewport_shade = scene.FastMode |
|
self.mode = False |
|
|
|
#fast navigate while numpad navigation |
|
if event.type == 'NUMPAD_PERIOD' or event.type == 'NUMPAD_1'\ |
|
or event.type == 'NUMPAD_2' or event.type == 'NUMPAD_3'\ |
|
or event.type == 'NUMPAD_4' or event.type == 'NUMPAD_5'\ |
|
or event.type == 'NUMPAD_6' or event.type == 'NUMPAD_7'\ |
|
or event.type == 'NUMPAD_8' or event.type == 'NUMPAD_9': |
|
if scene.Delay == True: |
|
if scene.DelayTime < scene.DelayTimeGlobal: |
|
scene.DelayTime += 1 |
|
view.viewport_shade = scene.FastMode |
|
self.mode = False |
|
|
|
#fast navigate while zooming with mousewheel too |
|
if event.type == 'WHEELUPMOUSE' or event.type == 'WHEELDOWNMOUSE': |
|
scene.DelayTime = scene.DelayTimeGlobal |
|
view.viewport_shade = scene.FastMode |
|
self.mode = False |
|
|
|
if event.type == 'MOUSEMOVE': |
|
if scene.Delay == True: |
|
if scene.DelayTime == 0: |
|
scene.DelayTime = scene.DelayTimeGlobal |
|
view.viewport_shade = scene.OriginalMode |
|
self.mode = True |
|
else: |
|
view.viewport_shade = scene.OriginalMode |
|
self.mode = True |
|
|
|
if scene.Delay == True: |
|
scene.DelayTime -= 1 |
|
if scene.DelayTime == 0: |
|
scene.DelayTime = scene.DelayTimeGlobal |
|
view.viewport_shade = scene.OriginalMode |
|
self.mode = True |
|
|
|
if scene.ShowParticles == 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) |
|
|
|
#Fast Navigate operator |
|
class FastNavigate(bpy.types.Operator): |
|
"""Operator that runs Fast navigate in modal mode""" |
|
bl_idname = "view3d.fast_navigate_operator" |
|
bl_label = "Fast Navigate" |
|
trigger = BoolProperty(default = False) |
|
mode = BoolProperty(default = False) |
|
scene = bpy.context.scene |
|
scene.DelayTime = scene.DelayTimeGlobal |
|
|
|
def modal(self, context, event): |
|
scene = bpy.context.scene |
|
view = context.space_data |
|
|
|
if scene.EditActive == True: |
|
fast_navigate_stuff(self, context ,event) |
|
return {'PASS_THROUGH'} |
|
else: |
|
obj = context.active_object |
|
if obj: |
|
if obj.mode != 'EDIT': |
|
fast_navigate_stuff(self, context ,event) |
|
return {'PASS_THROUGH'} |
|
else: |
|
return {'PASS_THROUGH'} |
|
else: |
|
fast_navigate_stuff(self, context ,event) |
|
return {'PASS_THROUGH'} |
|
|
|
def execute(self, context): |
|
context.window_manager.modal_handler_add(self) |
|
trigger_fast_navigate(self.trigger) |
|
return {'RUNNING_MODAL'} |
|
|
|
def cancel(self, context): |
|
scene = context.scene |
|
for particles in bpy.data.particles: |
|
particles.draw_percentage = scene.InitialParticles |
|
return {'CANCELLED'} |
|
|
|
#Fast Navigate Stop |
|
def fast_navigate_stop(context): |
|
scene = bpy.context.scene |
|
scene.FastNavigateStop = True |
|
|
|
#Fast Navigate Stop Operator |
|
class FastNavigateStop(bpy.types.Operator): |
|
'''Stop Fast Navigate Operator''' |
|
bl_idname = "view3d.fast_navigate_stop" |
|
bl_label = "Stop" |
|
FastNavigateStop = IntProperty(name = "FastNavigateStop", |
|
description = "Stop fast navigate mode", |
|
default = 0) |
|
|
|
def execute(self,context): |
|
fast_navigate_stop(context) |
|
return {'FINISHED'} |
|
|
|
#Drawtype textured |
|
def draw_textured(context): |
|
view = context.space_data |
|
view.viewport_shade = 'TEXTURED' |
|
bpy.context.scene.game_settings.material_mode = 'GLSL' |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.draw_type = 'TEXTURED' |
|
else: |
|
for obj in selection: |
|
obj.draw_type = 'TEXTURED' |
|
|
|
class DisplayTextured(bpy.types.Operator): |
|
'''Display objects in textured mode''' |
|
bl_idname = "view3d.display_textured" |
|
bl_label = "Textured" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
draw_textured(context) |
|
return {'FINISHED'} |
|
|
|
#Drawtype solid |
|
def draw_solid(context): |
|
view = context.space_data |
|
view.viewport_shade = 'TEXTURED' |
|
bpy.context.scene.game_settings.material_mode = 'GLSL' |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.draw_type = 'SOLID' |
|
else: |
|
for obj in selection: |
|
obj.draw_type = 'SOLID' |
|
|
|
class DisplaySolid(bpy.types.Operator): |
|
'''Display objects in solid mode''' |
|
bl_idname = "view3d.display_solid" |
|
bl_label = "Solid" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
draw_solid(context) |
|
return {'FINISHED'} |
|
|
|
#Drawtype wire |
|
def draw_wire(context): |
|
view = context.space_data |
|
view.viewport_shade = 'TEXTURED' |
|
bpy.context.scene.game_settings.material_mode = 'GLSL' |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.draw_type = 'WIRE' |
|
else: |
|
for obj in selection: |
|
obj.draw_type = 'WIRE' |
|
|
|
class DisplayWire(bpy.types.Operator): |
|
'''Display objects in wireframe mode''' |
|
bl_idname = "view3d.display_wire" |
|
bl_label = "Wire" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
draw_wire(context) |
|
return {'FINISHED'} |
|
|
|
#Drawtype bounds |
|
def draw_bounds(context): |
|
view = context.space_data |
|
view.viewport_shade = 'TEXTURED' |
|
bpy.context.scene.game_settings.material_mode = 'GLSL' |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.draw_type = 'BOUNDS' |
|
else: |
|
for obj in selection: |
|
obj.draw_type = 'BOUNDS' |
|
|
|
class DisplayBounds(bpy.types.Operator): |
|
'''Display objects in bounds mode''' |
|
bl_idname = "view3d.display_bounds" |
|
bl_label = "Bounds" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
draw_bounds(context) |
|
return {'FINISHED'} |
|
|
|
#Shade smooth |
|
def shade_smooth(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
bpy.ops.object.select_all(action = 'TOGGLE') |
|
bpy.ops.object.shade_smooth() |
|
bpy.ops.object.select_all(action = 'TOGGLE') |
|
else: |
|
obj = context.active_object |
|
if obj.mode == 'OBJECT': |
|
for obj in selection: |
|
bpy.ops.object.shade_smooth() |
|
else: |
|
bpy.ops.mesh.faces_shade_smooth() |
|
|
|
class DisplayShadeSmooth(bpy.types.Operator): |
|
'''Display shade smooth meshes''' |
|
bl_idname = "view3d.display_shade_smooth" |
|
bl_label = "Smooth" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
shade_smooth(context) |
|
return {'FINISHED'} |
|
|
|
#Shade flat |
|
def shade_flat(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
bpy.ops.object.select_all(action = 'TOGGLE') |
|
bpy.ops.object.shade_flat() |
|
bpy.ops.object.select_all(action = 'TOGGLE') |
|
else: |
|
obj = context.active_object |
|
if obj.mode == 'OBJECT': |
|
for obj in selection: |
|
bpy.ops.object.shade_flat() |
|
else: |
|
bpy.ops.mesh.faces_shade_flat() |
|
|
|
class DisplayShadeFlat(bpy.types.Operator): |
|
'''Display shade flat meshes''' |
|
bl_idname = "view3d.display_shade_flat" |
|
bl_label = "Flat" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
shade_flat(context) |
|
return {'FINISHED'} |
|
|
|
#Shadeless on |
|
def shadeless_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.materials: |
|
obj.use_shadeless = True |
|
else: |
|
for sel in selection: |
|
if sel.type == 'MESH': |
|
materials = sel.data.materials |
|
for mat in materials: |
|
mat.use_shadeless = True |
|
|
|
class DisplayShadelessOn(bpy.types.Operator): |
|
'''Display shadeless material''' |
|
bl_idname = "view3d.display_shadeless_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
shadeless_on(context) |
|
return {'FINISHED'} |
|
|
|
#Shadeless off |
|
def shadeless_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.materials: |
|
obj.use_shadeless = False |
|
else: |
|
for sel in selection: |
|
if sel.type == 'MESH': |
|
materials = sel.data.materials |
|
for mat in materials: |
|
mat.use_shadeless = False |
|
|
|
class DisplayShadelessOff(bpy.types.Operator): |
|
'''Display shaded material''' |
|
bl_idname = "view3d.display_shadeless_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
shadeless_off(context) |
|
return {'FINISHED'} |
|
|
|
#Wireframe on |
|
def wire_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.show_wire = True |
|
|
|
for mesh in bpy.data.meshes: |
|
mesh.show_all_edges = True |
|
else: |
|
for obj in selection: |
|
obj.show_wire = True |
|
|
|
for sel in selection: |
|
if sel.type == 'MESH': |
|
mesh = sel.data |
|
mesh.show_all_edges = True |
|
|
|
class DisplayWireframeOn(bpy.types.Operator): |
|
'''Display wireframe overlay on''' |
|
bl_idname = "view3d.display_wire_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
wire_on(context) |
|
return {'FINISHED'} |
|
|
|
#Wireframe off |
|
def wire_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.show_wire = False |
|
|
|
for mesh in bpy.data.meshes: |
|
mesh.show_all_edges = False |
|
else: |
|
for obj in selection: |
|
obj.show_wire = False |
|
|
|
for sel in selection: |
|
if sel.type == 'MESH': |
|
mesh = sel.data |
|
mesh.show_all_edges = False |
|
|
|
class DisplayWireframeOff(bpy.types.Operator): |
|
'''Display wireframe overlay off''' |
|
bl_idname = "view3d.display_wire_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
wire_off(context) |
|
return {'FINISHED'} |
|
|
|
#Bounds on |
|
def bounds_on(context): |
|
scene = context.scene |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.show_bounds = True |
|
obj.draw_bounds_type = scene.BoundingMode |
|
else: |
|
for obj in selection: |
|
obj.show_bounds = True |
|
obj.draw_bounds_type = scene.BoundingMode |
|
|
|
class DisplayBoundsOn(bpy.types.Operator): |
|
'''Display Bounding box overlay on''' |
|
bl_idname = "view3d.display_bounds_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
bounds_on(context) |
|
return {'FINISHED'} |
|
|
|
#Wireframe off |
|
def bounds_off(context): |
|
scene = context.scene |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.show_bounds = False |
|
else: |
|
for obj in selection: |
|
obj.show_bounds = False |
|
|
|
class DisplayBoundsOff(bpy.types.Operator): |
|
'''Display Bounding box overlay off''' |
|
bl_idname = "view3d.display_bounds_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
bounds_off(context) |
|
return {'FINISHED'} |
|
|
|
#Double Sided on |
|
def double_sided_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for mesh in bpy.data.meshes: |
|
mesh.show_double_sided = True |
|
else: |
|
for sel in selection: |
|
if sel.type == 'MESH': |
|
mesh = sel.data |
|
mesh.show_double_sided = True |
|
|
|
class DisplayDoubleSidedOn(bpy.types.Operator): |
|
'''Turn on face double shaded mode''' |
|
bl_idname = "view3d.display_double_sided_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
double_sided_on(context) |
|
return {'FINISHED'} |
|
|
|
#Double Sided off |
|
def double_sided_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for mesh in bpy.data.meshes: |
|
mesh.show_double_sided = False |
|
else: |
|
for sel in selection: |
|
if sel.type == 'MESH': |
|
mesh = sel.data |
|
mesh.show_double_sided = False |
|
|
|
class DisplayDoubleSidedOff(bpy.types.Operator): |
|
'''Turn off face double sided shade mode''' |
|
bl_idname = "view3d.display_double_sided_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
double_sided_off(context) |
|
return {'FINISHED'} |
|
|
|
#XRay on |
|
def x_ray_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.show_x_ray = True |
|
else: |
|
for obj in selection: |
|
obj.show_x_ray = True |
|
|
|
class DisplayXRayOn(bpy.types.Operator): |
|
'''X-Ray display on''' |
|
bl_idname = "view3d.display_x_ray_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
x_ray_on(context) |
|
return {'FINISHED'} |
|
|
|
#XRay off |
|
def x_ray_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
obj.show_x_ray = False |
|
else: |
|
for obj in selection: |
|
obj.show_x_ray = False |
|
|
|
class DisplayXRayOff(bpy.types.Operator): |
|
'''X-Ray display off''' |
|
bl_idname = "view3d.display_x_ray_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
x_ray_off(context) |
|
return {'FINISHED'} |
|
|
|
#Init properties for scene |
|
bpy.types.Scene.FastNavigateStop = bpy.props.BoolProperty( |
|
name = "Fast Navigate Stop", |
|
description = "Stop fast navigate mode", |
|
default = False) |
|
|
|
bpy.types.Scene.OriginalMode = bpy.props.EnumProperty( |
|
items = [('TEXTURED', 'Texture', 'Texture display mode'), |
|
('SOLID', 'Solid', 'Solid display mode')], |
|
name = "Normal", |
|
default = 'SOLID') |
|
|
|
bpy.types.Scene.BoundingMode = bpy.props.EnumProperty( |
|
items = [('BOX', 'Box', 'Box shape'), |
|
('SPHERE', 'Sphere', 'Sphere shape'), |
|
('CYLINDER', 'Cylinder', 'Cylinder shape'), |
|
('CONE', 'Cone', 'Cone shape')], |
|
name = "BB Mode") |
|
|
|
bpy.types.Scene.FastMode = bpy.props.EnumProperty( |
|
items = [('WIREFRAME', 'Wireframe', 'Wireframe display'), |
|
('BOUNDBOX', 'Bounding Box', 'Bounding Box display')], |
|
name = "Fast") |
|
|
|
bpy.types.Scene.ShowParticles = bpy.props.BoolProperty( |
|
name = "Show Particles", |
|
description = "Show or hide particles on fast navigate mode", |
|
default = True) |
|
|
|
bpy.types.Scene.ParticlesPercentageDisplay = bpy.props.IntProperty( |
|
name = "Display", |
|
description = "Display only a percentage of particles", |
|
default = 25, |
|
min = 0, |
|
max = 100, |
|
soft_min = 0, |
|
soft_max = 100, |
|
subtype = 'FACTOR') |
|
|
|
bpy.types.Scene.InitialParticles = bpy.props.IntProperty( |
|
name = "Count for initial particle setting before enter fast navigate", |
|
description = "Display a percentage value of particles", |
|
default = 100, |
|
min = 0, |
|
max = 100, |
|
soft_min = 0, |
|
soft_max = 100) |
|
|
|
#Set Render Settings |
|
def set_render_settings(conext): |
|
scene = bpy.context.scene |
|
render = bpy.context.scene.render |
|
view = bpy.context.space_data |
|
render.simplify_subdivision = 0 |
|
render.simplify_shadow_samples = 0 |
|
render.simplify_child_particles = 0 |
|
render.simplify_ao_sss = 0 |
|
|
|
class DisplaySimplify(bpy.types.Operator): |
|
'''Display scene simplified''' |
|
bl_idname = "view3d.display_simplify" |
|
bl_label = "Reset" |
|
|
|
Mode = EnumProperty( |
|
items = [('WIREFRAME', 'Wireframe', ''), |
|
('BOUNDBOX', 'Bounding Box', '')], |
|
name = "Mode") |
|
|
|
ShowParticles = BoolProperty( |
|
name = "ShowParticles", |
|
description = "Show or hide particles on fast navigate mode", |
|
default = True) |
|
|
|
ParticlesPercentageDisplay = IntProperty( |
|
name = "Display", |
|
description = "Display a percentage value of particles", |
|
default = 25, |
|
min = 0, |
|
max = 100, |
|
soft_min = 0, |
|
soft_max = 100, |
|
subtype = 'FACTOR') |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
set_render_settings(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Render on |
|
def modifiers_render_on(context): |
|
scene = bpy.context.scene |
|
bpy.types.Scene.Symplify = IntProperty( |
|
name = "Integer",description = "Enter an integer") |
|
scene['Simplify'] = 1 |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_render = True |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_render = True |
|
|
|
class DisplayModifiersRenderOn(bpy.types.Operator): |
|
'''Display modifiers in render''' |
|
bl_idname = "view3d.display_modifiers_render_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_render_on(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Render off |
|
def modifiers_render_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_render = False |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_render = False |
|
|
|
class DisplayModifiersRenderOff(bpy.types.Operator): |
|
'''Hide modifiers in render''' |
|
bl_idname = "view3d.display_modifiers_render_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_render_off(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Viewport on |
|
def modifiers_viewport_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_viewport = True |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_viewport = True |
|
|
|
class DisplayModifiersViewportOn(bpy.types.Operator): |
|
'''Display modifiers in viewport''' |
|
bl_idname = "view3d.display_modifiers_viewport_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_viewport_on(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Viewport off |
|
def modifiers_viewport_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_viewport = False |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_viewport = False |
|
|
|
class DisplayModifiersViewportOff(bpy.types.Operator): |
|
'''Hide modifiers in viewport''' |
|
bl_idname = "view3d.display_modifiers_viewport_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_viewport_off(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Edit on |
|
def modifiers_edit_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_in_editmode = True |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_in_editmode = True |
|
|
|
class DisplayModifiersEditOn(bpy.types.Operator): |
|
'''Display modifiers during edit mode''' |
|
bl_idname = "view3d.display_modifiers_edit_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_edit_on(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Edit off |
|
def modifiers_edit_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_in_editmode = False |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_in_editmode = False |
|
|
|
class DisplayModifiersEditOff(bpy.types.Operator): |
|
'''Hide modifiers during edit mode''' |
|
bl_idname = "view3d.display_modifiers_edit_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_edit_off(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Cage on |
|
def modifiers_cage_on(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_on_cage = True |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_on_cage = True |
|
|
|
class DisplayModifiersCageOn(bpy.types.Operator): |
|
'''Display modifiers editing cage during edit mode''' |
|
bl_idname = "view3d.display_modifiers_cage_on" |
|
bl_label = "On" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_cage_on(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Cage off |
|
def modifiers_cage_off(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_on_cage = False |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_on_cage = False |
|
|
|
class DisplayModifiersCageOff(bpy.types.Operator): |
|
'''Hide modifiers editing cage during edit mode''' |
|
bl_idname = "view3d.display_modifiers_cage_off" |
|
bl_label = "Off" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_cage_off(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Expand |
|
def modifiers_expand(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_expanded = True |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_expanded = True |
|
|
|
class DisplayModifiersExpand(bpy.types.Operator): |
|
'''Expand all modifiers on modifier stack''' |
|
bl_idname = "view3d.display_modifiers_expand" |
|
bl_label = "Expand" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_expand(context) |
|
return {'FINISHED'} |
|
|
|
#Display Modifiers Collapse |
|
def modifiers_collapse(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
mod.show_expanded = False |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
mod.show_expanded = False |
|
|
|
class DisplayModifiersCollapse(bpy.types.Operator): |
|
'''Collapse all modifiers on modifier stack''' |
|
bl_idname = "view3d.display_modifiers_collapse" |
|
bl_label = "Collapse" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_collapse(context) |
|
return {'FINISHED'} |
|
|
|
#Apply modifiers |
|
def modifiers_apply(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
bpy.ops.object.select_all(action = 'TOGGLE') |
|
bpy.ops.object.convert(target = 'MESH', keep_original = False) |
|
bpy.ops.object.select_all(action = 'TOGGLE') |
|
else: |
|
for mesh in selection: |
|
if mesh.type == "MESH": |
|
bpy.ops.object.convert(target='MESH', keep_original = False) |
|
|
|
class DisplayModifiersApply(bpy.types.Operator): |
|
'''Apply modifiers''' |
|
bl_idname = "view3d.display_modifiers_apply" |
|
bl_label = "Apply All" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_apply(context) |
|
return {'FINISHED'} |
|
|
|
#Delete modifiers |
|
def modifiers_delete(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
for obj in bpy.data.objects: |
|
for mod in obj.modifiers: |
|
bpy.context.scene.objects.active = obj |
|
bpy.ops.object.modifier_remove(modifier = mod.name) |
|
else: |
|
for obj in selection: |
|
for mod in obj.modifiers: |
|
bpy.context.scene.objects.active = obj |
|
bpy.ops.object.modifier_remove(modifier = mod.name) |
|
|
|
class DisplayModifiersDelete(bpy.types.Operator): |
|
'''Delete modifiers''' |
|
bl_idname = "view3d.display_modifiers_delete" |
|
bl_label = "Delete All" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_delete(context) |
|
return {'FINISHED'} |
|
|
|
#Put dummy modifier for boost subsurf |
|
def modifiers_set_dummy(context): |
|
selection = bpy.context.selected_objects |
|
|
|
if not(selection): |
|
print("funciona") |
|
for object in bpy.data.objects: |
|
if object.type == "MESH": |
|
mod = object.modifiers.new(type = 'SIMPLE_DEFORM',\ |
|
name = "Dummy") |
|
mod.factor = 0 |
|
else: |
|
for object in selection: |
|
if object.type == "MESH": |
|
mod = object.modifiers.new(type = 'SIMPLE_DEFORM',\ |
|
name = "Dummy") |
|
mod.factor = 0 |
|
|
|
class DisplayAddDummy(bpy.types.Operator): |
|
'''Add a dummy simple deform modifier to boost\ |
|
subsurf modifier viewport performance''' |
|
bl_idname = "view3d.display_modifiers_set_dummy" |
|
bl_label = "Put Dummy" |
|
|
|
@classmethod |
|
def poll(cls, context): |
|
return True |
|
|
|
def execute(self, context): |
|
modifiers_set_dummy(context) |
|
return {'FINISHED'} |
|
|
|
# main class for Fast Navigate |
|
class VIEW3D_PT_FastNavigate(bpy.types.Panel): |
|
bl_space_type = "VIEW_3D" |
|
bl_region_type = "TOOLS" |
|
bl_label = "Fast Navigate" |
|
bl_options = {"DEFAULT_CLOSED"} |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
|
|
# Tools |
|
scene = context.scene |
|
row = layout.row(align=True) |
|
row.alignment = 'LEFT' |
|
row.operator("view3d.fast_navigate_operator") |
|
row.operator("view3d.fast_navigate_stop") |
|
layout.label("Settings :") |
|
row = layout.row() |
|
box = row.box() |
|
box.prop(scene,"OriginalMode") |
|
box.prop(scene,"FastMode") |
|
box.prop(scene, "EditActive", "Edit mode") |
|
box.prop(scene, "Delay") |
|
box.prop(scene, "DelayTimeGlobal", "Delay time") |
|
box.alignment = 'LEFT' |
|
box.prop(scene,"ShowParticles") |
|
box.prop(scene,"ParticlesPercentageDisplay") |
|
|
|
# main class for Display Mode |
|
class VIEW3D_PT_DisplayMode(bpy.types.Panel): |
|
bl_space_type = "VIEW_3D" |
|
bl_region_type = "TOOLS" |
|
bl_label = "Display Mode" |
|
bl_options = {"DEFAULT_CLOSED"} |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
|
|
# Tools |
|
col = layout.column() |
|
col.alignment = 'EXPAND' |
|
row = col.row() |
|
row.operator("view3d.display_textured" , icon ='TEXTURE_SHADED') |
|
row.operator("view3d.display_solid" , icon ='SOLID') |
|
col = layout.column() |
|
col.alignment = 'EXPAND' |
|
row = col.row() |
|
row.operator("view3d.display_wire" , icon = 'WIRE') |
|
row.operator("view3d.display_bounds" , icon = 'BBOX') |
|
|
|
# main class for Shading Setup |
|
class VIEW3D_PT_ShadingSetup(bpy.types.Panel): |
|
bl_space_type = "VIEW_3D" |
|
bl_region_type = "TOOLS" |
|
bl_label = "Shading Setup" |
|
bl_options = {"DEFAULT_CLOSED"} |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
|
|
# Tools |
|
col = layout.column(align=True) |
|
row = col.row() |
|
row.operator("view3d.display_shade_smooth") |
|
row.operator("view3d.display_shade_flat") |
|
row = col.row() |
|
row.operator("view3d.display_shadeless_on", "Shadeless On",\ |
|
icon = 'SOLID') |
|
row.operator("view3d.display_shadeless_off",\ |
|
"Shadeless Off", icon = 'SOLID') |
|
row = col.row() |
|
row.operator("view3d.display_wire_on", "Wire On", icon = 'WIRE') |
|
row.operator("view3d.display_wire_off", "Wire Off", icon = 'WIRE') |
|
row = col.row() |
|
row.operator("view3d.display_bounds_on", "Bounds On", icon = 'BBOX') |
|
row.operator("view3d.display_bounds_off", "Bounds Off", icon = 'BBOX') |
|
row = col.row() |
|
row.operator("view3d.display_double_sided_on",\ |
|
"DSided On", icon = 'MESH_DATA') |
|
row.operator("view3d.display_double_sided_off",\ |
|
"DSided Off", icon = 'MESH_DATA') |
|
row = col.row() |
|
row.operator("view3d.display_x_ray_on",\ |
|
"XRay On", icon = 'GHOST_ENABLED') |
|
row.operator("view3d.display_x_ray_off",\ |
|
"XRay Off", icon = 'GHOST_ENABLED') |
|
row = col.row() |
|
row.separator() |
|
row = col.row() |
|
|
|
scene = context.scene |
|
row.prop(scene, "BoundingMode") |
|
|
|
# main class for Scene Visualization |
|
class VIEW3D_PT_SceneVisualization(bpy.types.Panel): |
|
bl_space_type = "VIEW_3D" |
|
bl_region_type = "TOOLS" |
|
bl_label = "Scene Visualization" |
|
bl_options = {"DEFAULT_CLOSED"} |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
|
|
# Tools |
|
scene = context.scene |
|
render = scene.render |
|
space = context.space_data |
|
layout.prop(space, "show_manipulator") |
|
layout.prop(space, "show_outline_selected") |
|
layout.prop(space, "show_only_render") |
|
layout.prop(space, "show_textured_solid") |
|
layout.prop(space, "show_backface_culling") |
|
layout.prop(space, "show_all_objects_origin") |
|
layout.prop(render,"use_simplify", "Simplify") |
|
if scene.render.use_simplify == True: |
|
layout.label("Settings :") |
|
row = layout.row() |
|
box = row.box() |
|
box.prop(render, "simplify_subdivision", "Subdivision") |
|
box.prop(render, "simplify_shadow_samples", "Shadow Samples") |
|
box.prop(render, "simplify_child_particles", "Child Particles") |
|
box.prop(render, "simplify_ao_sss", "AO and SSS") |
|
layout.operator("view3d.display_simplify") |
|
|
|
# main class for Modifier Tools |
|
class VIEW3D_PT_ModifierTools(bpy.types.Panel): |
|
bl_space_type = "VIEW_3D" |
|
bl_region_type = "TOOLS" |
|
bl_label = "Modifier Tools" |
|
bl_options = {"DEFAULT_CLOSED"} |
|
|
|
def draw(self, context): |
|
layout = self.layout |
|
|
|
# Tools |
|
layout.label("Modifiers", icon = 'MODIFIER') |
|
col = layout.column(align=True) |
|
col.alignment = 'EXPAND' |
|
row = col.row() |
|
row.operator("view3d.display_modifiers_render_on",\ |
|
icon = 'RENDER_STILL') |
|
row.operator("view3d.display_modifiers_render_off") |
|
row.operator("view3d.display_modifiers_viewport_on", |
|
icon = 'RESTRICT_VIEW_OFF') |
|
row.operator("view3d.display_modifiers_viewport_off") |
|
col = layout.column(align=True) |
|
col.alignment = 'EXPAND' |
|
row = col.row() |
|
row.operator("view3d.display_modifiers_edit_on", icon = 'EDITMODE_HLT') |
|
row.operator("view3d.display_modifiers_edit_off") |
|
row.operator("view3d.display_modifiers_cage_on",\ |
|
icon = 'EDITMODE_DEHLT') |
|
row.operator("view3d.display_modifiers_cage_off") |
|
row = layout.row(align=True) |
|
row.operator("view3d.display_modifiers_expand", icon = 'TRIA_DOWN') |
|
row.operator("view3d.display_modifiers_collapse", icon = 'TRIA_RIGHT') |
|
row = layout.row(align=True) |
|
row.operator("view3d.display_modifiers_apply", icon = 'MODIFIER') |
|
row.operator("view3d.display_modifiers_delete", icon = 'X') |
|
row = layout.row(align=True) |
|
row.operator("view3d.display_modifiers_set_dummy",\ |
|
icon = 'OUTLINER_OB_ARMATURE') |
|
|
|
# register the classes |
|
def register(): |
|
bpy.utils.register_class(FastNavigate) |
|
bpy.utils.register_class(DisplayTextured) |
|
bpy.utils.register_class(DisplaySolid) |
|
bpy.utils.register_class(DisplayWire) |
|
bpy.utils.register_class(DisplayBounds) |
|
bpy.utils.register_class(DisplayWireframeOn) |
|
bpy.utils.register_class(DisplayWireframeOff) |
|
bpy.utils.register_class(DisplayBoundsOn) |
|
bpy.utils.register_class(DisplayBoundsOff) |
|
bpy.utils.register_class(DisplayShadeSmooth) |
|
bpy.utils.register_class(DisplayShadeFlat) |
|
bpy.utils.register_class(DisplayShadelessOn) |
|
bpy.utils.register_class(DisplayShadelessOff) |
|
bpy.utils.register_class(DisplayDoubleSidedOn) |
|
bpy.utils.register_class(DisplayDoubleSidedOff) |
|
bpy.utils.register_class(DisplayXRayOn) |
|
bpy.utils.register_class(DisplayXRayOff) |
|
bpy.utils.register_class(DisplayModifiersRenderOn) |
|
bpy.utils.register_class(DisplayModifiersRenderOff) |
|
bpy.utils.register_class(DisplayModifiersViewportOn) |
|
bpy.utils.register_class(DisplayModifiersViewportOff) |
|
bpy.utils.register_class(DisplayModifiersEditOn) |
|
bpy.utils.register_class(DisplayModifiersEditOff) |
|
bpy.utils.register_class(DisplayModifiersCageOn) |
|
bpy.utils.register_class(DisplayModifiersCageOff) |
|
bpy.utils.register_class(DisplayModifiersExpand) |
|
bpy.utils.register_class(DisplayModifiersCollapse) |
|
bpy.utils.register_class(DisplayModifiersApply) |
|
bpy.utils.register_class(DisplayModifiersDelete) |
|
bpy.utils.register_class(DisplayAddDummy) |
|
bpy.utils.register_class(DisplaySimplify) |
|
bpy.utils.register_module(__name__) |
|
pass |
|
|
|
def unregister(): |
|
bpy.utils.unregister_class(FastNavigate) |
|
bpy.utils.unregister_class(DisplayTextured) |
|
bpy.utils.unregister_class(DisplaySolid) |
|
bpy.utils.unregister_class(DisplayWire) |
|
bpy.utils.unregister_class(DisplayBounds) |
|
bpy.utils.unregister_class(DisplayShadeSmooth) |
|
bpy.utils.unregister_class(DisplayShadeFlat) |
|
bpy.utils.unregister_class(DisplayShadelessOn) |
|
bpy.utils.unregister_class(DisplayShadelessOff) |
|
bpy.utils.unregister_class(DisplayWireframeOn) |
|
bpy.utils.unregister_class(DisplayWireframeOff) |
|
bpy.utils.unregister_class(DisplayBoundsOn) |
|
bpy.utils.unregister_class(DisplayBoundsOff) |
|
bpy.utils.unregister_class(DisplayDoubleSidedOn) |
|
bpy.utils.unregister_class(DisplayDoubleSidedOff) |
|
bpy.utils.unregister_class(DisplayXRayOn) |
|
bpy.utils.unregister_class(DisplayXRayOff) |
|
bpy.utils.unregister_class(DisplayModifiersRenderOn) |
|
bpy.utils.unregister_class(DisplayModifiersRenderOff) |
|
bpy.utils.unregister_class(DisplayModifiersViewportOn) |
|
bpy.utils.unregister_class(DisplayModifiersViewportOff) |
|
bpy.utils.unregister_class(DisplayModifiersEditOn) |
|
bpy.utils.unregister_class(DisplayModifiersEditOff) |
|
bpy.utils.unregister_class(DisplayModifiersCageOn) |
|
bpy.utils.unregister_class(DisplayModifiersCageOff) |
|
bpy.utils.unregister_class(DisplayModifiersExpand) |
|
bpy.utils.unregister_class(DisplayModifiersCollapse) |
|
bpy.utils.unregister_class(DisplayModifiersApply) |
|
bpy.utils.unregister_class(DisplayModifiersDelete) |
|
bpy.utils.unregister_class(DisplayAddDummy) |
|
bpy.utils.unregister_class(DisplaySimplify) |
|
bpy.utils.unregister_module(__name__) |
|
pass |
|
|
|
if __name__ == "__main__": |
|
register() |