From 99f7f3ac81c3854e131562c660183bdf5279dc38 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Sun, 13 Nov 2011 20:20:50 +0000 Subject: [PATCH] Added new options for splitting chains of feature edges by a minimum and maximum 2D angle. --- .../style_modules/parameter_editor.py | 21 ++++++++++++++++ .../startup/bl_ui/properties_render.py | 13 +++++++++- source/blender/makesdna/DNA_linestyle_types.h | 3 +++ .../blender/makesrna/intern/rna_linestyle.c | 24 ++++++++++++++++++- 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/release/scripts/freestyle/style_modules/parameter_editor.py b/release/scripts/freestyle/style_modules/parameter_editor.py index 6da3e509e86..882e40ced3f 100644 --- a/release/scripts/freestyle/style_modules/parameter_editor.py +++ b/release/scripts/freestyle/style_modules/parameter_editor.py @@ -802,6 +802,23 @@ class MaterialBoundaryUP0D(UnaryPredicate0D): idx2 = fe.materialIndex() if fe.isSmooth() else fe.bMaterialIndex() return idx1 != idx2 +class Curvature2DAngleThresholdUP0D(UnaryPredicate0D): + def __init__(self, min_angle=None, max_angle=None): + UnaryPredicate0D.__init__(self) + print(min_angle, max_angle) + self._min_angle = min_angle + self._max_angle = max_angle + self._func = Curvature2DAngleF0D() + def getName(self): + return "Curvature2DAngleThresholdUP0D" + def __call__(self, inter): + angle = math.pi - self._func(inter) + if self._min_angle is not None and angle < self._min_angle: + return True + if self._max_angle is not None and angle > self._max_angle: + return True + return False + # Seed for random number generation class Seed: @@ -926,6 +943,10 @@ def process(layer_name, lineset_name): # split chains if linestyle.material_boundary: Operators.sequentialSplit(MaterialBoundaryUP0D()) + if linestyle.use_min_angle or linestyle.use_max_angle: + min_angle = linestyle.min_angle if linestyle.use_min_angle else None + max_angle = linestyle.max_angle if linestyle.use_max_angle else None + Operators.sequentialSplit(Curvature2DAngleThresholdUP0D(min_angle, max_angle)) # select chains if linestyle.use_min_length or linestyle.use_max_length: min_length = linestyle.min_length if linestyle.use_min_length else None diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 1aa3df152a7..868287b5fa0 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -588,7 +588,18 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, Panel): # Splitting col = layout.column() col.label(text="Splitting:") - row = col.row(align=True) + sub = col.row() + subcol = sub.column() + subcol.prop(linestyle, "use_min_angle", text="Min Angle") + subsub = subcol.split() + subsub.prop(linestyle, "min_angle", text="") + subsub.enabled = linestyle.use_min_angle + subcol = sub.column() + subcol.prop(linestyle, "use_max_angle", text="Max Angle") + subsub = subcol.split() + subsub.prop(linestyle, "max_angle", text="") + subsub.enabled = linestyle.use_max_angle + row = col.row() row.prop(linestyle, "material_boundary") # Selection col = layout.column() diff --git a/source/blender/makesdna/DNA_linestyle_types.h b/source/blender/makesdna/DNA_linestyle_types.h index a73dd707caa..aa28ecac77d 100644 --- a/source/blender/makesdna/DNA_linestyle_types.h +++ b/source/blender/makesdna/DNA_linestyle_types.h @@ -358,6 +358,8 @@ typedef struct LineStyleThicknessModifier_Calligraphy { #define LS_MIN_2D_LENGTH 16 #define LS_MAX_2D_LENGTH 32 #define LS_NO_CHAINING 64 +#define LS_MIN_2D_ANGLE 128 +#define LS_MAX_2D_ANGLE 256 /* FreestyleLineStyle::chaining */ #define LS_CHAINING_PLAIN 1 @@ -377,6 +379,7 @@ typedef struct FreestyleLineStyle { int flag, caps; int chaining; unsigned int rounds; + float min_angle, max_angle; /* for splitting */ float min_length, max_length; unsigned short dash1, gap1, dash2, gap2, dash3, gap3; int panel; /* for UI */ diff --git a/source/blender/makesrna/intern/rna_linestyle.c b/source/blender/makesrna/intern/rna_linestyle.c index 736bc67a6ab..407566ea09c 100644 --- a/source/blender/makesrna/intern/rna_linestyle.c +++ b/source/blender/makesrna/intern/rna_linestyle.c @@ -184,7 +184,7 @@ static char *rna_LineStyle_geometry_modifier_path(PointerRNA *ptr) #else -#include "DNA_material_types.h" +#include "BLI_math.h" static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modifier_type_items, int blend, int color) { @@ -823,6 +823,28 @@ static void rna_def_linestyle(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Same Object", "If true, only feature edges of the same object are joined"); RNA_def_property_update(prop, NC_SCENE, NULL); + prop= RNA_def_property(srna, "use_min_angle", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MIN_2D_ANGLE); + RNA_def_property_ui_text(prop, "Use Min 2D Angle", "Split chains at points with angles smaller than the minimum 2D angle"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "min_angle", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_float_sdna(prop, NULL, "min_angle"); + RNA_def_property_range(prop, 0.0f, (float)M_PI); + RNA_def_property_ui_text(prop, "Min 2D Angle", "Minimum 2D angle for splitting chains"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "use_max_angle", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MAX_2D_ANGLE); + RNA_def_property_ui_text(prop, "Use Max 2D Angle", "Split chains at points with angles larger than the maximum 2D angle"); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "max_angle", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_float_sdna(prop, NULL, "max_angle"); + RNA_def_property_range(prop, 0.0f, (float)M_PI); + RNA_def_property_ui_text(prop, "Max 2D Angle", "Maximum 2D angle for splitting chains"); + RNA_def_property_update(prop, NC_SCENE, NULL); + prop= RNA_def_property(srna, "use_min_length", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MIN_2D_LENGTH); RNA_def_property_ui_text(prop, "Use Min 2D Length", "Enable the selection of chains by a minimum 2D length");