diff options
8 files changed, 118 insertions, 26 deletions
diff --git a/release/scripts/freestyle/style_modules/parameter_editor.py b/release/scripts/freestyle/style_modules/parameter_editor.py index 7d602d4e79e..d8ac2a54c29 100644 --- a/release/scripts/freestyle/style_modules/parameter_editor.py +++ b/release/scripts/freestyle/style_modules/parameter_editor.py @@ -18,6 +18,7 @@ import Freestyle import math +import mathutils import time from freestyle_init import * @@ -38,24 +39,12 @@ class ColorRampModifier(StrokeShader): def blend_ramp(self, a, b): return Freestyle.blendRamp(self.__blend, a, self.__influence, b) -class CurveMappingModifier(StrokeShader): - def __init__(self, blend, influence, mapping, invert, curve): +class ScalarBlendModifier(StrokeShader): + def __init__(self, blend, influence): StrokeShader.__init__(self) self.__blend = blend self.__influence = influence - assert mapping in ("LINEAR", "CURVE") - self.__mapping = getattr(self, mapping) - self.__invert = invert - self.__curve = curve - def LINEAR(self, t): - if self.__invert: - return 1.0 - t - return t - def CURVE(self, t): - return Freestyle.evaluateCurveMappingF(self.__curve, 0, t) - def evaluate(self, t): - return self.__mapping(t) - def blend_curve(self, v1, v2): + def blend(self, v1, v2): fac = self.__influence facm = 1.0 - fac if self.__blend == "MIX": @@ -83,6 +72,22 @@ class CurveMappingModifier(StrokeShader): raise ValueError("unknown curve blend type: " + self.__blend) return v1 +class CurveMappingModifier(ScalarBlendModifier): + def __init__(self, blend, influence, mapping, invert, curve): + ScalarBlendModifier.__init__(self, blend, influence) + assert mapping in ("LINEAR", "CURVE") + self.__mapping = getattr(self, mapping) + self.__invert = invert + self.__curve = curve + def LINEAR(self, t): + if self.__invert: + return 1.0 - t + return t + def CURVE(self, t): + return Freestyle.evaluateCurveMappingF(self.__curve, 0, t) + def evaluate(self, t): + return self.__mapping(t) + # Along Stroke modifiers def iter_t2d_along_stroke(stroke): @@ -117,7 +122,7 @@ class AlphaAlongStrokeShader(CurveMappingModifier): attr = it.getObject().attribute() a = attr.getAlpha() b = self.evaluate(t) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setAlpha(c) class ThicknessAlongStrokeShader(CurveMappingModifier): @@ -133,7 +138,7 @@ class ThicknessAlongStrokeShader(CurveMappingModifier): a = attr.getThicknessRL() a = a[0] + a[1] b = self.__value_min + self.evaluate(t) * (self.__value_max - self.__value_min) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setThickness(c/2, c/2) # Distance from Camera modifiers @@ -180,7 +185,7 @@ class AlphaDistanceFromCameraShader(CurveMappingModifier): attr = it.getObject().attribute() a = attr.getAlpha() b = self.evaluate(t) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setAlpha(c) class ThicknessDistanceFromCameraShader(CurveMappingModifier): @@ -198,7 +203,7 @@ class ThicknessDistanceFromCameraShader(CurveMappingModifier): a = attr.getThicknessRL() a = a[0] + a[1] b = self.__value_min + self.evaluate(t) * (self.__value_max - self.__value_min) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setThickness(c/2, c/2) # Distance from Object modifiers @@ -255,7 +260,7 @@ class AlphaDistanceFromObjectShader(CurveMappingModifier): attr = it.getObject().attribute() a = attr.getAlpha() b = self.evaluate(t) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setAlpha(c) class ThicknessDistanceFromObjectShader(CurveMappingModifier): @@ -276,7 +281,7 @@ class ThicknessDistanceFromObjectShader(CurveMappingModifier): a = attr.getThicknessRL() a = a[0] + a[1] b = self.__value_min + self.evaluate(t) * (self.__value_max - self.__value_min) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setThickness(c/2, c/2) # Material modifiers @@ -368,7 +373,7 @@ class AlphaMaterialShader(CurveMappingModifier): attr = it.getObject().attribute() a = attr.getAlpha() b = self.evaluate(t) - c = self.blend_curve(a, b) + c = self.blend(a, b) attr.setAlpha(c) class ThicknessMaterialShader(CurveMappingModifier): @@ -385,8 +390,34 @@ class ThicknessMaterialShader(CurveMappingModifier): a = attr.getThicknessRL() a = a[0] + a[1] b = self.__value_min + self.evaluate(t) * (self.__value_max - self.__value_min) - c = self.blend_curve(a, b) + c = self.blend(a, b) + attr.setThickness(c/2, c/2) + +# Calligraphic thickness modifier + +class CalligraphicThicknessShader(ScalarBlendModifier): + def __init__(self, blend, influence, orientation, min_thickness, max_thickness): + ScalarBlendModifier.__init__(self, blend, influence) + rad = orientation / 180.0 * math.pi + self.__orientation = mathutils.Vector((math.cos(rad), math.sin(rad))) + self.__min_thickness = min_thickness + self.__max_thickness = max_thickness + def shade(self, stroke): + func = VertexOrientation2DF0D() + it = stroke.strokeVerticesBegin() + while not it.isEnd(): + dir = func(it.castToInterface0DIterator()) + orthDir = mathutils.Vector((-dir.y, dir.x)) + orthDir.normalize() + fac = abs(orthDir * self.__orientation) + attr = it.getObject().attribute() + a = attr.getThicknessRL() + a = a[0] + a[1] + b = self.__min_thickness + fac * (self.__max_thickness - self.__min_thickness) + b = max(b, 0.0) + c = self.blend(a, b) attr.setThickness(c/2, c/2) + it.increment() # Geometry modifiers @@ -945,6 +976,10 @@ def process(layer_name, lineset_name): shaders_list.append(ThicknessMaterialShader( m.blend, m.influence, m.mapping, m.invert, m.curve, m.material_attr, m.value_min, m.value_max)) + elif m.type == "CALLIGRAPHY": + shaders_list.append(CalligraphicThicknessShader( + m.blend, m.influence, + m.orientation, m.min_thickness, m.max_thickness)) if linestyle.caps == "ROUND": shaders_list.append(RoundCapShader()) elif linestyle.caps == "SQUARE": diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 5a1ddb4b9df..b024a6588be 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -446,6 +446,12 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, Panel): box.prop(modifier, "material_attr", text="") self.draw_modifier_curve_common(box, modifier, False, True) + elif modifier.type == "CALLIGRAPHY": + col = box.column() + col.prop(modifier, "orientation") + col.prop(modifier, "min_thickness") + col.prop(modifier, "max_thickness") + def draw_geometry_modifier(self, context, modifier): layout = self.layout diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c index f36bdaf487f..88584633a49 100644 --- a/source/blender/blenkernel/intern/linestyle.c +++ b/source/blender/blenkernel/intern/linestyle.c @@ -60,7 +60,8 @@ static char *modifier_name[LS_MODIFIER_NUM] = { "Perlin Noise 1D", "Perlin Noise 2D", "Backbone Stretcher", - "Tip Remover"}; + "Tip Remover", + "Calligraphy"}; static void default_linestyle_settings(FreestyleLineStyle *linestyle) { @@ -286,6 +287,9 @@ int FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type case LS_MODIFIER_MATERIAL: size = sizeof(LineStyleThicknessModifier_Material); break; + case LS_MODIFIER_CALLIGRAPHY: + size = sizeof(LineStyleThicknessModifier_Calligraphy); + break; default: return -1; /* unknown modifier type */ } @@ -320,6 +324,11 @@ int FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type ((LineStyleThicknessModifier_Material *)m)->value_min = 0.0f; ((LineStyleThicknessModifier_Material *)m)->value_max = 1.0f; break; + case LS_MODIFIER_CALLIGRAPHY: + ((LineStyleThicknessModifier_Calligraphy *)m)->min_thickness = 1.0f; + ((LineStyleThicknessModifier_Calligraphy *)m)->max_thickness = 10.0f; + ((LineStyleThicknessModifier_Calligraphy *)m)->orientation = 60.0f; + break; } add_to_modifier_list(&linestyle->thickness_modifiers, m); @@ -341,6 +350,8 @@ void FRS_remove_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, Line case LS_MODIFIER_MATERIAL: curvemapping_free(((LineStyleThicknessModifier_Material *)m)->curve); break; + case LS_MODIFIER_CALLIGRAPHY: + break; } BLI_freelinkN(&linestyle->thickness_modifiers, m); } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index f87492d39a2..1e09063c74f 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -2621,6 +2621,9 @@ static void write_linestyle_thickness_modifiers(WriteData *wd, ListBase *modifie case LS_MODIFIER_MATERIAL: struct_name = "LineStyleThicknessModifier_Material"; break; + case LS_MODIFIER_CALLIGRAPHY: + struct_name = "LineStyleThicknessModifier_Calligraphy"; + break; default: struct_name = "LineStyleThicknessModifier"; // this should not happen } diff --git a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp index 05f8d1299de..bb77d0ba5be 100644 --- a/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp +++ b/source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp @@ -21,7 +21,7 @@ static char CalligraphicShader___doc__[] = " Builds a CalligraphicShader object.\n" "\n" " :arg iMinThickness: The minimum thickness in the direction\n" -" perpandicular to the main direction.\n" +" perpendicular to the main direction.\n" " :type iMinThickness: float\n" " :arg iMaxThickness: The maximum thickness in the main direction.\n" " :type iMaxThickness: float\n" diff --git a/source/blender/makesdna/DNA_linestyle_types.h b/source/blender/makesdna/DNA_linestyle_types.h index 94d2d4bb723..8b3b5a60181 100644 --- a/source/blender/makesdna/DNA_linestyle_types.h +++ b/source/blender/makesdna/DNA_linestyle_types.h @@ -61,7 +61,8 @@ typedef struct LineStyleModifier { #define LS_MODIFIER_PERLIN_NOISE_2D 10 #define LS_MODIFIER_BACKBONE_STRETCHER 11 #define LS_MODIFIER_TIP_REMOVER 12 -#define LS_MODIFIER_NUM 13 +#define LS_MODIFIER_CALLIGRAPHY 13 +#define LS_MODIFIER_NUM 14 /* LineStyleModifier::flags */ #define LS_MODIFIER_ENABLED 1 @@ -294,6 +295,17 @@ typedef struct LineStyleGeometryModifier_TipRemover { } LineStyleGeometryModifier_TipRemover; +/* Calligraphic thickness modifier */ + +typedef struct LineStyleThicknessModifier_Calligraphy { + struct LineStyleModifier modifier; + + float min_thickness, max_thickness; + float orientation; + int pad; + +} LineStyleThicknessModifier_Calligraphy; + /* FreestyleLineStyle::panel */ #define LS_PANEL_STROKES 1 #define LS_PANEL_COLOR 2 diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h index 48c5422b453..6bf5d33998d 100644 --- a/source/blender/makesrna/RNA_access.h +++ b/source/blender/makesrna/RNA_access.h @@ -303,6 +303,7 @@ extern StructRNA RNA_LineStyleGeometryModifier_TipRemover; extern StructRNA RNA_LineStyleModifier; extern StructRNA RNA_LineStyleThicknessModifier; extern StructRNA RNA_LineStyleThicknessModifier_AlongStroke; +extern StructRNA RNA_LineStyleThicknessModifier_Calligraphy; extern StructRNA RNA_LineStyleThicknessModifier_DistanceFromCamera; extern StructRNA RNA_LineStyleThicknessModifier_DistanceFromObject; extern StructRNA RNA_LineStyleThicknessModifier_Material; diff --git a/source/blender/makesrna/intern/rna_linestyle.c b/source/blender/makesrna/intern/rna_linestyle.c index fc12477b1ae..e5b5aee5541 100644 --- a/source/blender/makesrna/intern/rna_linestyle.c +++ b/source/blender/makesrna/intern/rna_linestyle.c @@ -55,6 +55,7 @@ EnumPropertyItem linestyle_thickness_modifier_type_items[] ={ {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""}, {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""}, {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""}, + {LS_MODIFIER_CALLIGRAPHY, "CALLIGRAPHY", ICON_MODIFIER, "Calligraphy", ""}, {0, NULL, 0, NULL, NULL}}; EnumPropertyItem linestyle_geometry_modifier_type_items[] ={ @@ -119,6 +120,8 @@ static StructRNA *rna_LineStyle_thickness_modifier_refine(struct PointerRNA *ptr return &RNA_LineStyleThicknessModifier_DistanceFromObject; case LS_MODIFIER_MATERIAL: return &RNA_LineStyleThicknessModifier_Material; + case LS_MODIFIER_CALLIGRAPHY: + return &RNA_LineStyleThicknessModifier_Calligraphy; default: return &RNA_LineStyleThicknessModifier; } @@ -485,6 +488,27 @@ static void rna_def_linestyle_modifiers(BlenderRNA *brna) rna_def_modifier_material_common(srna); rna_def_modifier_curve_common(srna, 0, 1); + srna= RNA_def_struct(brna, "LineStyleThicknessModifier_Calligraphy", "LineStyleThicknessModifier"); + RNA_def_struct_ui_text(srna, "Calligraphy", "Change line thickness so that stroke looks like made with a calligraphic pen."); + rna_def_thickness_modifier(srna); + + prop= RNA_def_property(srna, "orientation", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "orientation"); + RNA_def_property_ui_text(prop, "Orientation", "Angle of the main direction."); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "min_thickness", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "min_thickness"); + RNA_def_property_range(prop, 0.0f, 10000.0f); + RNA_def_property_ui_text(prop, "Min Thickness", "Minimum thickness in the direction perpendicular to the main direction."); + RNA_def_property_update(prop, NC_SCENE, NULL); + + prop= RNA_def_property(srna, "max_thickness", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "max_thickness"); + RNA_def_property_range(prop, 0.0f, 10000.0f); + RNA_def_property_ui_text(prop, "Max Thickness", "Maximum thickness in the main direction."); + RNA_def_property_update(prop, NC_SCENE, NULL); + /* geometry modifiers */ srna= RNA_def_struct(brna, "LineStyleGeometryModifier", "LineStyleModifier"); |