From abc2e3efd161240476e60ca72e4d1b9e73023241 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Fri, 5 Aug 2011 00:51:44 +0000 Subject: [PATCH] Added a button to the UI of "Distance from Camera" color/alpha/thickness modifiers to fill the Range Min/Max entries by the min/max distance between selected mesh objects and the active camera. --- .../scripts/startup/bl_operators/__init__.py | 1 + .../scripts/startup/bl_operators/freestyle.py | 62 +++++++++++++++++++ .../startup/bl_ui/properties_render.py | 9 +++ 3 files changed, 72 insertions(+) create mode 100644 release/scripts/startup/bl_operators/freestyle.py diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py index d5f7a63366a..53991526844 100644 --- a/release/scripts/startup/bl_operators/__init__.py +++ b/release/scripts/startup/bl_operators/__init__.py @@ -25,6 +25,7 @@ if "bpy" in locals(): _modules = ( "add_mesh_torus", "animsys_update", + "freestyle", "image", "mesh", "nla", diff --git a/release/scripts/startup/bl_operators/freestyle.py b/release/scripts/startup/bl_operators/freestyle.py new file mode 100644 index 00000000000..ba9ace685b8 --- /dev/null +++ b/release/scripts/startup/bl_operators/freestyle.py @@ -0,0 +1,62 @@ +# ##### 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 LICENSE BLOCK ##### + +import bpy + +from bpy.props import (EnumProperty, StringProperty) + + +class SCENE_OT_freestyle_fill_range_by_selection(bpy.types.Operator): + '''Fill the Range Min/Max entries by the min/max distance between selected mesh objects and the active camera.''' + bl_idname = "scene.freestyle_fill_range_by_selection" + bl_label = "Fill Range by Selection" + + type = EnumProperty(name="Type", description="Type of the modifier to work on.", + items=[("COLOR", "Color", "Color modifier type."), + ("ALPHA", "Alpha", "Alpha modifier type."), + ("THICKNESS", "Thickness", "Thickness modifier type.")]) + name = StringProperty(name="Name", description="Name of the modifier to work on.") + + def execute(self, context): + rl = context.scene.render.layers.active + lineset = rl.freestyle_settings.linesets.active + linestyle = lineset.linestyle + # Find the modifier to work on + if self.type == 'COLOR': + m = linestyle.color_modifiers[self.name] + elif self.type == 'ALPHA': + m = linestyle.alpha_modifiers[self.name] + else: + m = linestyle.thickness_modifiers[self.name] + # Find the active camera + camera = context.scene.camera + # Find selected mesh objects + selection = [ob for ob in context.scene.objects if ob.select and ob.type == 'MESH'] + if len(selection) > 0: + # Compute the min/max distance between selected mesh objects and the camera + min_dist = float('inf') + max_dist = -min_dist + for ob in selection: + for vert in ob.data.vertices: + dist = (ob.matrix_world * vert.co - camera.location).length + min_dist = min(dist, min_dist) + max_dist = max(dist, max_dist) + # Fill the Range Min/Max entries with the computed distances + m.range_min = min_dist + m.range_max = max_dist + return {'FINISHED'} diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 4cff04c72b5..68806b3b126 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -366,6 +366,9 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, bpy.types.Panel): elif modifier.type == "DISTANCE_FROM_CAMERA": self.draw_modifier_color_ramp_common(box, modifier, True) + prop = box.operator("scene.freestyle_fill_range_by_selection") + prop.type = 'COLOR' + prop.name = modifier.name elif modifier.type == "MATERIAL": row = box.row() @@ -399,6 +402,9 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, bpy.types.Panel): elif modifier.type == "DISTANCE_FROM_CAMERA": self.draw_modifier_curve_common(box, modifier, True, False) + prop = box.operator("scene.freestyle_fill_range_by_selection") + prop.type = 'ALPHA' + prop.name = modifier.name elif modifier.type == "MATERIAL": box.prop(modifier, "material_attr", text="") @@ -422,6 +428,9 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, bpy.types.Panel): elif modifier.type == "DISTANCE_FROM_CAMERA": self.draw_modifier_curve_common(box, modifier, True, True) + prop = box.operator("scene.freestyle_fill_range_by_selection") + prop.type = 'THICKNESS' + prop.name = modifier.name elif modifier.type == "MATERIAL": box.prop(modifier, "material_attr", text="")