forked from bartvdbraak/blender
Added new options for splitting chains of feature edges by a minimum
and maximum 2D angle.
This commit is contained in:
parent
43c74f768b
commit
99f7f3ac81
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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 */
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user