Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--release/scripts/freestyle/style_modules/parameter_editor.py81
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py6
-rw-r--r--source/blender/blenkernel/intern/linestyle.c13
-rw-r--r--source/blender/blenloader/intern/writefile.c3
-rw-r--r--source/blender/freestyle/intern/python/StrokeShader/BPy_CalligraphicShader.cpp2
-rw-r--r--source/blender/makesdna/DNA_linestyle_types.h14
-rw-r--r--source/blender/makesrna/RNA_access.h1
-rw-r--r--source/blender/makesrna/intern/rna_linestyle.c24
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");