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.
This commit is contained in:
Tamito Kajiyama 2011-08-05 00:51:44 +00:00
parent 9a0b816416
commit abc2e3efd1
3 changed files with 72 additions and 0 deletions

@ -25,6 +25,7 @@ if "bpy" in locals():
_modules = (
"add_mesh_torus",
"animsys_update",
"freestyle",
"image",
"mesh",
"nla",

@ -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'}

@ -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="")