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.py88
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py145
-rw-r--r--source/blender/blenkernel/BKE_linestyle.h4
-rw-r--r--source/blender/blenkernel/intern/linestyle.c223
-rw-r--r--source/blender/blenloader/intern/readfile.c7
-rw-r--r--source/blender/blenloader/intern/writefile.c39
-rw-r--r--source/blender/editors/render/render_intern.h1
-rw-r--r--source/blender/editors/render/render_ops.c1
-rw-r--r--source/blender/editors/render/render_shading.c47
-rw-r--r--source/blender/makesdna/DNA_linestyle_types.h121
-rw-r--r--source/blender/makesrna/RNA_access.h9
-rw-r--r--source/blender/makesrna/RNA_enum_types.h1
-rw-r--r--source/blender/makesrna/intern/rna_linestyle.c226
13 files changed, 768 insertions, 144 deletions
diff --git a/release/scripts/freestyle/style_modules/parameter_editor.py b/release/scripts/freestyle/style_modules/parameter_editor.py
index c86ed2fab33..ef53f363b10 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 time
from freestyle_init import *
from logical_operators import *
@@ -387,6 +388,37 @@ class ThicknessMaterialShader(CurveMappingModifier):
c = self.blend_curve(a, b)
attr.setThickness(c/2, c/2)
+# Geometry modifiers
+
+def iter_distance_along_stroke(stroke):
+ distance = 0.0
+ it = stroke.strokeVerticesBegin()
+ while not it.isEnd():
+ p = it.getObject().getPoint()
+ if not it.isBegin():
+ distance += (prev - p).length
+ prev = p
+ yield it, distance
+ it.increment()
+
+class SinusDisplacementShader(StrokeShader):
+ def __init__(self, wavelength, amplitude, phase):
+ StrokeShader.__init__(self)
+ self._wavelength = wavelength
+ self._amplitude = amplitude
+ self._phase = phase / wavelength * 2 * math.pi
+ self._getNormal = Normal2DF0D()
+ def getName(self):
+ return "SinusDisplacementShader"
+ def shade(self, stroke):
+ for it, distance in iter_distance_along_stroke(stroke):
+ v = it.getObject()
+ n = self._getNormal(it.castToInterface0DIterator())
+ p = v.getPoint()
+ u = v.u()
+ n = n * self._amplitude * math.cos(distance / self._wavelength * 2 * math.pi + self._phase)
+ v.setPoint(p + n)
+
# Predicates and helper functions
class QuantitativeInvisibilityRangeUP1D(UnaryPredicate1D):
@@ -653,6 +685,20 @@ class MaterialBoundaryUP0D(UnaryPredicate0D):
idx2 = fe.materialIndex() if fe.isSmooth() else fe.bMaterialIndex()
return idx1 != idx2
+# Seed for random number generation
+
+class Seed:
+ def __init__(self):
+ self.t_max = 2 ** 15
+ self.t = int(time.time()) % self.t_max
+ def get(self, seed):
+ if seed < 0:
+ self.t = (self.t + 1) % self.t_max
+ return self.t
+ return seed
+
+_seed = Seed()
+
# main function for parameter processing
def process(layer_name, lineset_name):
@@ -773,11 +819,41 @@ def process(layer_name, lineset_name):
if linestyle.material_boundary:
Operators.sequentialSplit(MaterialBoundaryUP0D())
# prepare a list of stroke shaders
+ shaders_list = []
+ for m in linestyle.geometry_modifiers:
+ if not m.use:
+ continue
+ if m.type == "SAMPLING":
+ shaders_list.append(SamplingShader(
+ m.sampling))
+ elif m.type == "BEZIER_CURVE":
+ shaders_list.append(BezierCurveShader(
+ m.error))
+ elif m.type == "SINUS_DISPLACEMENT":
+ shaders_list.append(SinusDisplacementShader(
+ m.wavelength, m.amplitude, m.phase))
+ elif m.type == "SPATIAL_NOISE":
+ shaders_list.append(SpatialNoiseShader(
+ m.amplitude, m.scale, m.octaves, m.smooth, m.pure_random))
+ elif m.type == "PERLIN_NOISE_1D":
+ shaders_list.append(pyPerlinNoise1DShader(
+ m.frequency, m.amplitude, m.octaves, _seed.get(m.seed)))
+ elif m.type == "PERLIN_NOISE_2D":
+ shaders_list.append(pyPerlinNoise2DShader(
+ m.frequency, m.amplitude, m.octaves, _seed.get(m.seed)))
+ elif m.type == "BACKBONE_STRETCHER":
+ shaders_list.append(BackboneStretcherShader(
+ m.amount))
+ elif m.type == "TIP_REMOVER":
+ shaders_list.append(TipRemoverShader(
+ m.tip_length))
+ if linestyle.caps == "ROUND":
+ shaders_list.append(RoundCapShader())
+ elif linestyle.caps == "SQUARE":
+ shaders_list.append(SquareCapShader())
color = linestyle.color
- shaders_list = [
- SamplingShader(5.0),
- ConstantThicknessShader(linestyle.thickness),
- ConstantColorShader(color.r, color.g, color.b, linestyle.alpha)]
+ shaders_list.append(ConstantColorShader(color.r, color.g, color.b, linestyle.alpha))
+ shaders_list.append(ConstantThicknessShader(linestyle.thickness))
for m in linestyle.color_modifiers:
if not m.use:
continue
@@ -833,9 +909,5 @@ 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))
- if linestyle.caps == "ROUND":
- shaders_list.append(RoundCapShader())
- elif linestyle.caps == "SQUARE":
- shaders_list.append(SquareCapShader())
# create strokes using the shaders list
Operators.create(TrueUP1D(), shaders_list)
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 647455af03c..2c0ded20672 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -437,6 +437,51 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, Panel):
box.prop(modifier, "material_attr", text="")
self.draw_modifier_curve_common(box, modifier, False, True)
+ def draw_geometry_modifier(self, context, modifier):
+ layout = self.layout
+
+ col = layout.column(align=True)
+ self.draw_modifier_box_header(col.box(), modifier)
+ if modifier.expanded:
+ box = col.box()
+
+ if modifier.type == "SAMPLING":
+ box.prop(modifier, "sampling")
+
+ elif modifier.type == "BEZIER_CURVE":
+ box.prop(modifier, "error")
+
+ elif modifier.type == "SINUS_DISPLACEMENT":
+ box.prop(modifier, "wavelength")
+ box.prop(modifier, "amplitude")
+ box.prop(modifier, "phase")
+
+ elif modifier.type == "SPATIAL_NOISE":
+ box.prop(modifier, "amplitude")
+ box.prop(modifier, "scale")
+ box.prop(modifier, "octaves")
+ sub = box.row()
+ sub.prop(modifier, "smooth")
+ sub.prop(modifier, "pure_random")
+
+ elif modifier.type == "PERLIN_NOISE_1D":
+ box.prop(modifier, "frequency")
+ box.prop(modifier, "amplitude")
+ box.prop(modifier, "octaves")
+ box.prop(modifier, "seed")
+
+ elif modifier.type == "PERLIN_NOISE_2D":
+ box.prop(modifier, "frequency")
+ box.prop(modifier, "amplitude")
+ box.prop(modifier, "octaves")
+ box.prop(modifier, "seed")
+
+ elif modifier.type == "BACKBONE_STRETCHER":
+ box.prop(modifier, "amount")
+
+ elif modifier.type == "TIP_REMOVER":
+ box.prop(modifier, "tip_length")
+
def draw(self, context):
layout = self.layout
@@ -445,70 +490,76 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, Panel):
lineset = rl.freestyle_settings.linesets.active
linestyle = lineset.linestyle
- split = layout.split()
- col = split.column()
- col.template_ID(lineset, "linestyle", new="scene.freestyle_linestyle_new")
-
- col.separator()
- sub = col.row(align=True)
- sub.prop(linestyle, "panel", expand=True)
-
- if linestyle.panel == "COLOR":
+ layout.template_ID(lineset, "linestyle", new="scene.freestyle_linestyle_new")
+ row = layout.row(align=True)
+ row.prop(linestyle, "panel", expand=True)
+ if linestyle.panel == "STROKES":
+ col = layout.column()
+ col.label(text="Chaining:")
+ col.prop(linestyle, "same_object")
+ col = layout.column()
+ col.label(text="Splitting:")
+ row = col.row(align=True)
+ row.prop(linestyle, "material_boundary")
+ col = layout.column()
+ col.label(text="Caps:")
+ row = col.row(align=True)
+ row.prop(linestyle, "caps", expand=True)
+ col = layout.column()
+ col.prop(linestyle, "use_dashed_line")
+ split = col.split()
+ split.enabled = linestyle.use_dashed_line
+ sub = split.column()
+ sub.label(text="Dash")
+ sub.prop(linestyle, "dash1", text="")
+ sub = split.column()
+ sub.label(text="Gap")
+ sub.prop(linestyle, "gap1", text="")
+ sub = split.column()
+ sub.label(text="Dash")
+ sub.prop(linestyle, "dash2", text="")
+ sub = split.column()
+ sub.label(text="Gap")
+ sub.prop(linestyle, "gap2", text="")
+ sub = split.column()
+ sub.label(text="Dash")
+ sub.prop(linestyle, "dash3", text="")
+ sub = split.column()
+ sub.label(text="Gap")
+ sub.prop(linestyle, "gap3", text="")
+ elif linestyle.panel == "COLOR":
+ col = layout.column()
col.label(text="Base Color:")
col.prop(linestyle, "color", text="")
+ col = layout.column()
col.label(text="Modifiers:")
- layout.operator_menu_enum("scene.freestyle_color_modifier_add", "type", text="Add Modifier")
+ col.operator_menu_enum("scene.freestyle_color_modifier_add", "type", text="Add Modifier")
for modifier in linestyle.color_modifiers:
self.draw_color_modifier(context, modifier)
elif linestyle.panel == "ALPHA":
+ col = layout.column()
col.label(text="Base Transparency:")
col.prop(linestyle, "alpha")
+ col = layout.column()
col.label(text="Modifiers:")
- layout.operator_menu_enum("scene.freestyle_alpha_modifier_add", "type", text="Add Modifier")
+ col.operator_menu_enum("scene.freestyle_alpha_modifier_add", "type", text="Add Modifier")
for modifier in linestyle.alpha_modifiers:
self.draw_alpha_modifier(context, modifier)
elif linestyle.panel == "THICKNESS":
+ col = layout.column()
col.label(text="Base Thickness:")
col.prop(linestyle, "thickness")
+ col = layout.column()
col.label(text="Modifiers:")
- layout.operator_menu_enum("scene.freestyle_thickness_modifier_add", "type", text="Add Modifier")
+ col.operator_menu_enum("scene.freestyle_thickness_modifier_add", "type", text="Add Modifier")
for modifier in linestyle.thickness_modifiers:
self.draw_thickness_modifier(context, modifier)
- elif linestyle.panel == "STROKES":
- col.label(text="Chaining:")
- col.prop(linestyle, "same_object")
- col.separator()
- col.label(text="Splitting:")
- sub = col.row(align=True)
- sub.prop(linestyle, "material_boundary")
- col.separator()
- col.label(text="Caps:")
- sub = col.row(align=True)
- sub.prop(linestyle, "caps", expand=True)
- col.separator()
- col.prop(linestyle, "use_dashed_line")
- sub = col.row()
- sub.enabled = linestyle.use_dashed_line
- subsub = sub.column()
- subsub.label(text="Dash")
- subsub.prop(linestyle, "dash1", text="")
- subsub = sub.column()
- subsub.label(text="Gap")
- subsub.prop(linestyle, "gap1", text="")
- subsub = sub.column()
- subsub.label(text="Dash")
- subsub.prop(linestyle, "dash2", text="")
- subsub = sub.column()
- subsub.label(text="Gap")
- subsub.prop(linestyle, "gap2", text="")
- subsub = sub.column()
- subsub.label(text="Dash")
- subsub.prop(linestyle, "dash3", text="")
- subsub = sub.column()
- subsub.label(text="Gap")
- subsub.prop(linestyle, "gap3", text="")
- elif linestyle.panel == "DISTORT":
- pass
+ elif linestyle.panel == "GEOMETRY":
+ col = layout.column()
+ col.label(text="Modifiers:")
+ col.operator_menu_enum("scene.freestyle_geometry_modifier_add", "type", text="Add Modifier")
+ for modifier in linestyle.geometry_modifiers:
+ self.draw_geometry_modifier(context, modifier)
elif linestyle.panel == "MISC":
pass
diff --git a/source/blender/blenkernel/BKE_linestyle.h b/source/blender/blenkernel/BKE_linestyle.h
index ebbfe7c5559..ccf8e1c6b30 100644
--- a/source/blender/blenkernel/BKE_linestyle.h
+++ b/source/blender/blenkernel/BKE_linestyle.h
@@ -37,6 +37,7 @@
#define LS_MODIFIER_TYPE_COLOR 1
#define LS_MODIFIER_TYPE_ALPHA 2
#define LS_MODIFIER_TYPE_THICKNESS 3
+#define LS_MODIFIER_TYPE_GEOMETRY 4
struct Main;
struct Object;
@@ -47,14 +48,17 @@ void FRS_free_linestyle(FreestyleLineStyle *linestyle);
int FRS_add_linestyle_color_modifier(FreestyleLineStyle *linestyle, int type);
int FRS_add_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, int type);
int FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type);
+int FRS_add_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, int type);
void FRS_remove_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier);
void FRS_remove_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier);
void FRS_remove_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier);
+void FRS_remove_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier);
void FRS_move_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction);
void FRS_move_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction);
void FRS_move_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction);
+void FRS_move_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction);
void FRS_list_modifier_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase);
char *FRS_path_from_ID_to_color_ramp(FreestyleLineStyle *linestyle, ColorBand *color_ramp);
diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c
index 76371af3b8f..90b35e1f220 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -52,11 +52,19 @@ static char *modifier_name[LS_MODIFIER_NUM] = {
"Along Stroke",
"Distance from Camera",
"Distance from Object",
- "Material"};
+ "Material",
+ "Sampling",
+ "Bezier Curve",
+ "Sinus Displacement",
+ "Spatial Noise",
+ "Perlin Noise 1D",
+ "Perlin Noise 2D",
+ "Backbone Stretcher",
+ "Tip Remover"};
static void default_linestyle_settings(FreestyleLineStyle *linestyle)
{
- linestyle->panel = LS_PANEL_COLOR;
+ linestyle->panel = LS_PANEL_STROKES;
linestyle->r = linestyle->g = linestyle->b = 0.0;
linestyle->alpha = 1.0;
linestyle->thickness = 1.0;
@@ -64,6 +72,9 @@ static void default_linestyle_settings(FreestyleLineStyle *linestyle)
linestyle->color_modifiers.first = linestyle->color_modifiers.last = NULL;
linestyle->alpha_modifiers.first = linestyle->alpha_modifiers.last = NULL;
linestyle->thickness_modifiers.first = linestyle->thickness_modifiers.last = NULL;
+ linestyle->geometry_modifiers.first = linestyle->geometry_modifiers.last = NULL;
+
+ FRS_add_linestyle_geometry_modifier(linestyle, LS_MODIFIER_SAMPLING);
linestyle->caps = LS_CAPS_BUTT;
}
@@ -93,6 +104,8 @@ void FRS_free_linestyle(FreestyleLineStyle *linestyle)
FRS_remove_linestyle_alpha_modifier(linestyle, m);
while ((m = (LineStyleModifier *)linestyle->thickness_modifiers.first))
FRS_remove_linestyle_thickness_modifier(linestyle, m);
+ while ((m = (LineStyleModifier *)linestyle->geometry_modifiers.first))
+ FRS_remove_linestyle_geometry_modifier(linestyle, m);
}
static LineStyleModifier *new_modifier(int type, size_t size)
@@ -117,40 +130,45 @@ static void add_to_modifier_list(ListBase *lb, LineStyleModifier *m)
int FRS_add_linestyle_color_modifier(FreestyleLineStyle *linestyle, int type)
{
- static size_t modifier_size[LS_MODIFIER_NUM] = {
- 0,
- sizeof(LineStyleColorModifier_AlongStroke),
- sizeof(LineStyleColorModifier_DistanceFromCamera),
- sizeof(LineStyleColorModifier_DistanceFromObject),
- sizeof(LineStyleColorModifier_Material)
- };
+ size_t size;
LineStyleModifier *m;
- if (type <= 0 || type >= LS_MODIFIER_NUM || modifier_size[type] == 0)
- return -1;
- m = new_modifier(type, modifier_size[type]);
+ switch (type) {
+ case LS_MODIFIER_ALONG_STROKE:
+ size = sizeof(LineStyleColorModifier_AlongStroke);
+ break;
+ case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+ size = sizeof(LineStyleColorModifier_DistanceFromCamera);
+ break;
+ case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+ size = sizeof(LineStyleColorModifier_DistanceFromObject);
+ break;
+ case LS_MODIFIER_MATERIAL:
+ size = sizeof(LineStyleColorModifier_Material);
+ break;
+ default:
+ return -1; /* unknown modifier type */
+ }
+ m = new_modifier(type, size);
if (!m)
return -1;
+ m->blend = MA_RAMP_BLEND;
switch (type) {
case LS_MODIFIER_ALONG_STROKE:
((LineStyleColorModifier_AlongStroke *)m)->color_ramp = add_colorband(1);
- ((LineStyleColorModifier_AlongStroke *)m)->blend = MA_RAMP_BLEND;
break;
case LS_MODIFIER_DISTANCE_FROM_CAMERA:
((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp = add_colorband(1);
- ((LineStyleColorModifier_DistanceFromCamera *)m)->blend = MA_RAMP_BLEND;
((LineStyleColorModifier_DistanceFromCamera *)m)->range_min = 0.0f;
((LineStyleColorModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
break;
case LS_MODIFIER_DISTANCE_FROM_OBJECT:
((LineStyleColorModifier_DistanceFromObject *)m)->target = NULL;
((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp = add_colorband(1);
- ((LineStyleColorModifier_DistanceFromObject *)m)->blend = MA_RAMP_BLEND;
((LineStyleColorModifier_DistanceFromObject *)m)->range_min = 0.0f;
((LineStyleColorModifier_DistanceFromObject *)m)->range_max = 10000.0f;
break;
case LS_MODIFIER_MATERIAL:
- ((LineStyleColorModifier_Material *)m)->blend = MA_RAMP_BLEND;
((LineStyleColorModifier_Material *)m)->color_ramp = add_colorband(1);
((LineStyleColorModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
break;
@@ -183,45 +201,48 @@ void FRS_remove_linestyle_color_modifier(FreestyleLineStyle *linestyle, LineStyl
int FRS_add_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, int type)
{
- static size_t modifier_size[LS_MODIFIER_NUM] = {
- 0,
- sizeof(LineStyleAlphaModifier_AlongStroke),
- sizeof(LineStyleAlphaModifier_DistanceFromCamera),
- sizeof(LineStyleAlphaModifier_DistanceFromObject),
- sizeof(LineStyleAlphaModifier_Material)
- };
+ size_t size;
LineStyleModifier *m;
- if (type <= 0 || type >= LS_MODIFIER_NUM || modifier_size[type] == 0)
- return -1;
- m = new_modifier(type, modifier_size[type]);
+ switch (type) {
+ case LS_MODIFIER_ALONG_STROKE:
+ size = sizeof(LineStyleAlphaModifier_AlongStroke);
+ break;
+ case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+ size = sizeof(LineStyleAlphaModifier_DistanceFromCamera);
+ break;
+ case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+ size = sizeof(LineStyleAlphaModifier_DistanceFromObject);
+ break;
+ case LS_MODIFIER_MATERIAL:
+ size = sizeof(LineStyleAlphaModifier_Material);
+ break;
+ default:
+ return -1; /* unknown modifier type */
+ }
+ m = new_modifier(type, size);
if (!m)
return -1;
+ m->blend = LS_VALUE_BLEND;
switch (type) {
case LS_MODIFIER_ALONG_STROKE:
((LineStyleAlphaModifier_AlongStroke *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleAlphaModifier_AlongStroke *)m)->blend = LS_VALUE_BLEND;
break;
case LS_MODIFIER_DISTANCE_FROM_CAMERA:
((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleAlphaModifier_DistanceFromCamera *)m)->blend = LS_VALUE_BLEND;
((LineStyleAlphaModifier_DistanceFromCamera *)m)->range_min = 0.0f;
((LineStyleAlphaModifier_DistanceFromCamera *)m)->range_max = 10000.0f;
break;
case LS_MODIFIER_DISTANCE_FROM_OBJECT:
((LineStyleAlphaModifier_DistanceFromObject *)m)->target = NULL;
((LineStyleAlphaModifier_DistanceFromObject *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleAlphaModifier_DistanceFromObject *)m)->blend = LS_VALUE_BLEND;
((LineStyleAlphaModifier_DistanceFromObject *)m)->range_min = 0.0f;
((LineStyleAlphaModifier_DistanceFromObject *)m)->range_max = 10000.0f;
break;
case LS_MODIFIER_MATERIAL:
((LineStyleAlphaModifier_Material *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleAlphaModifier_Material *)m)->blend = LS_VALUE_BLEND;
((LineStyleAlphaModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
break;
- default:
- return -1; /* unknown modifier type */
}
add_to_modifier_list(&linestyle->alpha_modifiers, m);
@@ -249,30 +270,37 @@ void FRS_remove_linestyle_alpha_modifier(FreestyleLineStyle *linestyle, LineStyl
int FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type)
{
- static size_t modifier_size[LS_MODIFIER_NUM] = {
- 0,
- sizeof(LineStyleThicknessModifier_AlongStroke),
- sizeof(LineStyleThicknessModifier_DistanceFromCamera),
- sizeof(LineStyleThicknessModifier_DistanceFromObject),
- sizeof(LineStyleThicknessModifier_Material)
- };
+ size_t size;
LineStyleModifier *m;
- if (type <= 0 || type >= LS_MODIFIER_NUM || modifier_size[type] == 0)
- return -1;
- m = new_modifier(type, modifier_size[type]);
+ switch (type) {
+ case LS_MODIFIER_ALONG_STROKE:
+ size = sizeof(LineStyleThicknessModifier_AlongStroke);
+ break;
+ case LS_MODIFIER_DISTANCE_FROM_CAMERA:
+ size = sizeof(LineStyleThicknessModifier_DistanceFromCamera);
+ break;
+ case LS_MODIFIER_DISTANCE_FROM_OBJECT:
+ size = sizeof(LineStyleThicknessModifier_DistanceFromObject);
+ break;
+ case LS_MODIFIER_MATERIAL:
+ size = sizeof(LineStyleThicknessModifier_Material);
+ break;
+ default:
+ return -1; /* unknown modifier type */
+ }
+ m = new_modifier(type, size);
if (!m)
return -1;
+ m->blend = LS_VALUE_BLEND;
switch (type) {
case LS_MODIFIER_ALONG_STROKE:
((LineStyleThicknessModifier_AlongStroke *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleThicknessModifier_AlongStroke *)m)->blend = LS_VALUE_BLEND;
((LineStyleThicknessModifier_AlongStroke *)m)->value_min = 0.0f;
((LineStyleThicknessModifier_AlongStroke *)m)->value_max = 1.0f;
break;
case LS_MODIFIER_DISTANCE_FROM_CAMERA:
((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleThicknessModifier_DistanceFromCamera *)m)->blend = LS_VALUE_BLEND;
((LineStyleThicknessModifier_DistanceFromCamera *)m)->range_min = 0.0f;
((LineStyleThicknessModifier_DistanceFromCamera *)m)->range_max = 1000.0f;
((LineStyleThicknessModifier_DistanceFromCamera *)m)->value_min = 0.0f;
@@ -281,7 +309,6 @@ int FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type
case LS_MODIFIER_DISTANCE_FROM_OBJECT:
((LineStyleThicknessModifier_DistanceFromObject *)m)->target = NULL;
((LineStyleThicknessModifier_DistanceFromObject *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleThicknessModifier_DistanceFromObject *)m)->blend = LS_VALUE_BLEND;
((LineStyleThicknessModifier_DistanceFromObject *)m)->range_min = 0.0f;
((LineStyleThicknessModifier_DistanceFromObject *)m)->range_max = 1000.0f;
((LineStyleThicknessModifier_DistanceFromObject *)m)->value_min = 0.0f;
@@ -289,13 +316,10 @@ int FRS_add_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, int type
break;
case LS_MODIFIER_MATERIAL:
((LineStyleThicknessModifier_Material *)m)->curve = curvemapping_add(1, 0.0f, 0.0f, 1.0f, 1.0f);
- ((LineStyleThicknessModifier_Material *)m)->blend = LS_VALUE_BLEND;
((LineStyleThicknessModifier_Material *)m)->mat_attr = LS_MODIFIER_MATERIAL_DIFF;
((LineStyleThicknessModifier_Material *)m)->value_min = 0.0f;
((LineStyleThicknessModifier_Material *)m)->value_max = 1.0f;
break;
- default:
- return -1; /* unknown modifier type */
}
add_to_modifier_list(&linestyle->thickness_modifiers, m);
@@ -321,6 +345,104 @@ void FRS_remove_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, Line
BLI_freelinkN(&linestyle->thickness_modifiers, m);
}
+int FRS_add_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, int type)
+{
+ size_t size;
+ LineStyleModifier *m;
+
+ switch (type) {
+ case LS_MODIFIER_SAMPLING:
+ size = sizeof(LineStyleGeometryModifier_Sampling);
+ break;
+ case LS_MODIFIER_BEZIER_CURVE:
+ size = sizeof(LineStyleGeometryModifier_BezierCurve);
+ break;
+ case LS_MODIFIER_SINUS_DISPLACEMENT:
+ size = sizeof(LineStyleGeometryModifier_SinusDisplacement);
+ break;
+ case LS_MODIFIER_SPATIAL_NOISE:
+ size = sizeof(LineStyleGeometryModifier_SpatialNoise);
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_1D:
+ size = sizeof(LineStyleGeometryModifier_PerlinNoise1D);
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_2D:
+ size = sizeof(LineStyleGeometryModifier_PerlinNoise2D);
+ break;
+ case LS_MODIFIER_BACKBONE_STRETCHER:
+ size = sizeof(LineStyleGeometryModifier_BackboneStretcher);
+ break;
+ case LS_MODIFIER_TIP_REMOVER:
+ size = sizeof(LineStyleGeometryModifier_TipRemover);
+ break;
+ default:
+ return -1; /* unknown modifier type */
+ }
+ m = new_modifier(type, size);
+ if (!m)
+ return -1;
+ switch (type) {
+ case LS_MODIFIER_SAMPLING:
+ ((LineStyleGeometryModifier_Sampling *)m)->sampling = 10.0;
+ break;
+ case LS_MODIFIER_BEZIER_CURVE:
+ ((LineStyleGeometryModifier_BezierCurve *)m)->error = 10.0;
+ break;
+ case LS_MODIFIER_SINUS_DISPLACEMENT:
+ ((LineStyleGeometryModifier_SinusDisplacement *)m)->wavelength = 20.0;
+ ((LineStyleGeometryModifier_SinusDisplacement *)m)->amplitude = 5.0;
+ ((LineStyleGeometryModifier_SinusDisplacement *)m)->phase = 0.0;
+ break;
+ case LS_MODIFIER_SPATIAL_NOISE:
+ ((LineStyleGeometryModifier_SpatialNoise *)m)->amplitude = 5.0;
+ ((LineStyleGeometryModifier_SpatialNoise *)m)->scale = 20.0;
+ ((LineStyleGeometryModifier_SpatialNoise *)m)->octaves = 4;
+ ((LineStyleGeometryModifier_SpatialNoise *)m)->flags = LS_MODIFIER_SPATIAL_NOISE_SMOOTH | LS_MODIFIER_SPATIAL_NOISE_PURERANDOM;
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_1D:
+ ((LineStyleGeometryModifier_PerlinNoise1D *)m)->frequency = 10.0;
+ ((LineStyleGeometryModifier_PerlinNoise1D *)m)->amplitude = 10.0;
+ ((LineStyleGeometryModifier_PerlinNoise1D *)m)->octaves = 4;
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_2D:
+ ((LineStyleGeometryModifier_PerlinNoise2D *)m)->frequency = 10.0;
+ ((LineStyleGeometryModifier_PerlinNoise2D *)m)->amplitude = 10.0;
+ ((LineStyleGeometryModifier_PerlinNoise2D *)m)->octaves = 4;
+ break;
+ case LS_MODIFIER_BACKBONE_STRETCHER:
+ ((LineStyleGeometryModifier_BackboneStretcher *)m)->amount = 10.0;
+ break;
+ case LS_MODIFIER_TIP_REMOVER:
+ ((LineStyleGeometryModifier_TipRemover *)m)->tip_length = 10.0;
+ break;
+ }
+ add_to_modifier_list(&linestyle->geometry_modifiers, m);
+ return 0;
+}
+
+void FRS_remove_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *m)
+{
+ switch (m->type) {
+ case LS_MODIFIER_SAMPLING:
+ break;
+ case LS_MODIFIER_BEZIER_CURVE:
+ break;
+ case LS_MODIFIER_SINUS_DISPLACEMENT:
+ break;
+ case LS_MODIFIER_SPATIAL_NOISE:
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_1D:
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_2D:
+ break;
+ case LS_MODIFIER_BACKBONE_STRETCHER:
+ break;
+ case LS_MODIFIER_TIP_REMOVER:
+ break;
+ }
+ BLI_freelinkN(&linestyle->geometry_modifiers, m);
+}
+
static void move_modifier(ListBase *lb, LineStyleModifier *modifier, int direction)
{
BLI_remlink(lb, modifier);
@@ -345,6 +467,11 @@ void FRS_move_linestyle_thickness_modifier(FreestyleLineStyle *linestyle, LineSt
move_modifier(&linestyle->thickness_modifiers, modifier, direction);
}
+void FRS_move_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, LineStyleModifier *modifier, int direction)
+{
+ move_modifier(&linestyle->geometry_modifiers, modifier, direction);
+}
+
void FRS_list_modifier_color_ramps(FreestyleLineStyle *linestyle, ListBase *listbase)
{
LineStyleModifier *m;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index c4e067953f9..456ef5bf513 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5799,6 +5799,10 @@ static void direct_link_linestyle_thickness_modifier(FileData *fd, LineStyleModi
}
}
+static void direct_link_linestyle_geometry_modifier(FileData *fd, LineStyleModifier *modifier)
+{
+}
+
static void direct_link_linestyle(FileData *fd, FreestyleLineStyle *linestyle)
{
LineStyleModifier *modifier;
@@ -5814,6 +5818,9 @@ static void direct_link_linestyle(FileData *fd, FreestyleLineStyle *linestyle)
link_list(fd, &linestyle->thickness_modifiers);
for(modifier=linestyle->thickness_modifiers.first; modifier; modifier= modifier->next)
direct_link_linestyle_thickness_modifier(fd, modifier);
+ link_list(fd, &linestyle->geometry_modifiers);
+ for(modifier=linestyle->geometry_modifiers.first; modifier; modifier= modifier->next)
+ direct_link_linestyle_geometry_modifier(fd, modifier);
}
/* ************** GENERAL & MAIN ******************** */
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 91f39e2cfe7..4bf2c70df2b 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2572,6 +2572,44 @@ static void write_linestyle_thickness_modifiers(WriteData *wd, ListBase *modifie
}
}
+static void write_linestyle_geometry_modifiers(WriteData *wd, ListBase *modifiers)
+{
+ LineStyleModifier *m;
+ char *struct_name;
+
+ for (m = modifiers->first; m; m = m->next) {
+ switch (m->type) {
+ case LS_MODIFIER_SAMPLING:
+ struct_name = "LineStyleGeometryModifier_Sampling";
+ break;
+ case LS_MODIFIER_BEZIER_CURVE:
+ struct_name = "LineStyleGeometryModifier_BezierCurve";
+ break;
+ case LS_MODIFIER_SINUS_DISPLACEMENT:
+ struct_name = "LineStyleGeometryModifier_SinusDisplacement";
+ break;
+ case LS_MODIFIER_SPATIAL_NOISE:
+ struct_name = "LineStyleGeometryModifier_SpatialNoise";
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_1D:
+ struct_name = "LineStyleGeometryModifier_PerlinNoise1D";
+ break;
+ case LS_MODIFIER_PERLIN_NOISE_2D:
+ struct_name = "LineStyleGeometryModifier_PerlinNoise2D";
+ break;
+ case LS_MODIFIER_BACKBONE_STRETCHER:
+ struct_name = "LineStyleGeometryModifier_BackboneStretcher";
+ break;
+ case LS_MODIFIER_TIP_REMOVER:
+ struct_name = "LineStyleGeometryModifier_TipRemover";
+ break;
+ default:
+ struct_name = "LineStyleGeometryModifier"; // this should not happen
+ }
+ writestruct(wd, DATA, struct_name, 1, m);
+ }
+}
+
static void write_linestyles(WriteData *wd, ListBase *idbase)
{
FreestyleLineStyle *linestyle;
@@ -2584,6 +2622,7 @@ static void write_linestyles(WriteData *wd, ListBase *idbase)
write_linestyle_color_modifiers(wd, &linestyle->color_modifiers);
write_linestyle_alpha_modifiers(wd, &linestyle->alpha_modifiers);
write_linestyle_thickness_modifiers(wd, &linestyle->thickness_modifiers);
+ write_linestyle_geometry_modifiers(wd, &linestyle->geometry_modifiers);
}
}
}
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h
index a2167eb95ad..f2fb0f13f26 100644
--- a/source/blender/editors/render/render_intern.h
+++ b/source/blender/editors/render/render_intern.h
@@ -65,6 +65,7 @@ void SCENE_OT_freestyle_linestyle_new(struct wmOperatorType *ot);
void SCENE_OT_freestyle_color_modifier_add(struct wmOperatorType *ot);
void SCENE_OT_freestyle_alpha_modifier_add(struct wmOperatorType *ot);
void SCENE_OT_freestyle_thickness_modifier_add(struct wmOperatorType *ot);
+void SCENE_OT_freestyle_geometry_modifier_add(struct wmOperatorType *ot);
void SCENE_OT_freestyle_modifier_remove(struct wmOperatorType *ot);
void SCENE_OT_freestyle_modifier_move(struct wmOperatorType *ot);
diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c
index 56621096303..945b452a8d2 100644
--- a/source/blender/editors/render/render_ops.c
+++ b/source/blender/editors/render/render_ops.c
@@ -74,6 +74,7 @@ void ED_operatortypes_render(void)
WM_operatortype_append(SCENE_OT_freestyle_color_modifier_add);
WM_operatortype_append(SCENE_OT_freestyle_alpha_modifier_add);
WM_operatortype_append(SCENE_OT_freestyle_thickness_modifier_add);
+ WM_operatortype_append(SCENE_OT_freestyle_geometry_modifier_add);
WM_operatortype_append(SCENE_OT_freestyle_modifier_remove);
WM_operatortype_append(SCENE_OT_freestyle_modifier_move);
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index f121b23b11f..0484df56a0e 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -921,6 +921,45 @@ void SCENE_OT_freestyle_thickness_modifier_add(wmOperatorType *ot)
ot->prop= RNA_def_enum(ot->srna, "type", linestyle_thickness_modifier_type_items, 0, "Type", "");
}
+static int freestyle_geometry_modifier_add_exec(bContext *C, wmOperator *op)
+{
+ Scene *scene= CTX_data_scene(C);
+ SceneRenderLayer *srl = (SceneRenderLayer*) BLI_findlink(&scene->r.layers, scene->r.actlay);
+ FreestyleLineSet *lineset = FRS_get_active_lineset(&srl->freestyleConfig);
+ int type= RNA_enum_get(op->ptr, "type");
+
+ if (!lineset) {
+ BKE_report(op->reports, RPT_ERROR, "No active lineset and associated line style to add the modifier to.");
+ return OPERATOR_CANCELLED;
+ }
+ if (FRS_add_linestyle_geometry_modifier(lineset->linestyle, type) < 0) {
+ BKE_report(op->reports, RPT_ERROR, "Unknown stroke geometry modifier type.");
+ return OPERATOR_CANCELLED;
+ }
+ WM_event_add_notifier(C, NC_SCENE|ND_RENDER_OPTIONS, scene);
+
+ return OPERATOR_FINISHED;
+}
+
+void SCENE_OT_freestyle_geometry_modifier_add(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Add Stroke Geometry Modifier";
+ ot->idname= "SCENE_OT_freestyle_geometry_modifier_add";
+ ot->description = "Add a stroke geometry modifier to the line style associated with the active lineset.";
+
+ /* api callbacks */
+ ot->invoke= WM_menu_invoke;
+ ot->exec= freestyle_geometry_modifier_add_exec;
+ ot->poll= freestyle_active_lineset_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ ot->prop= RNA_def_enum(ot->srna, "type", linestyle_geometry_modifier_type_items, 0, "Type", "");
+}
+
static int freestyle_get_modifier_type(PointerRNA *ptr)
{
if (RNA_struct_is_a(ptr->type, &RNA_LineStyleColorModifier))
@@ -929,6 +968,8 @@ static int freestyle_get_modifier_type(PointerRNA *ptr)
return LS_MODIFIER_TYPE_ALPHA;
else if (RNA_struct_is_a(ptr->type, &RNA_LineStyleThicknessModifier))
return LS_MODIFIER_TYPE_THICKNESS;
+ else if (RNA_struct_is_a(ptr->type, &RNA_LineStyleGeometryModifier))
+ return LS_MODIFIER_TYPE_GEOMETRY;
return -1;
}
@@ -954,6 +995,9 @@ static int freestyle_modifier_remove_exec(bContext *C, wmOperator *op)
case LS_MODIFIER_TYPE_THICKNESS:
FRS_remove_linestyle_thickness_modifier(lineset->linestyle, modifier);
break;
+ case LS_MODIFIER_TYPE_GEOMETRY:
+ FRS_remove_linestyle_geometry_modifier(lineset->linestyle, modifier);
+ break;
default:
BKE_report(op->reports, RPT_ERROR, "The object the data pointer refers to is not a valid modifier.");
return OPERATOR_CANCELLED;
@@ -1001,6 +1045,9 @@ static int freestyle_modifier_move_exec(bContext *C, wmOperator *op)
case LS_MODIFIER_TYPE_THICKNESS:
FRS_move_linestyle_thickness_modifier(lineset->linestyle, modifier, dir);
break;
+ case LS_MODIFIER_TYPE_GEOMETRY:
+ FRS_move_linestyle_geometry_modifier(lineset->linestyle, modifier, dir);
+ break;
default:
BKE_report(op->reports, RPT_ERROR, "The object the data pointer refers to is not a valid modifier.");
return OPERATOR_CANCELLED;
diff --git a/source/blender/makesdna/DNA_linestyle_types.h b/source/blender/makesdna/DNA_linestyle_types.h
index fc6ce430446..936f01e0ab2 100644
--- a/source/blender/makesdna/DNA_linestyle_types.h
+++ b/source/blender/makesdna/DNA_linestyle_types.h
@@ -44,7 +44,8 @@ typedef struct LineStyleModifier {
int type;
float influence;
int flags;
- int pad;
+ int blend;
+
} LineStyleModifier;
/* LineStyleModifier::type */
@@ -52,7 +53,15 @@ typedef struct LineStyleModifier {
#define LS_MODIFIER_DISTANCE_FROM_CAMERA 2
#define LS_MODIFIER_DISTANCE_FROM_OBJECT 3
#define LS_MODIFIER_MATERIAL 4
-#define LS_MODIFIER_NUM 5
+#define LS_MODIFIER_SAMPLING 5
+#define LS_MODIFIER_BEZIER_CURVE 6
+#define LS_MODIFIER_SINUS_DISPLACEMENT 7
+#define LS_MODIFIER_SPATIAL_NOISE 8
+#define LS_MODIFIER_PERLIN_NOISE_1D 9
+#define LS_MODIFIER_PERLIN_NOISE_2D 10
+#define LS_MODIFIER_BACKBONE_STRETCHER 11
+#define LS_MODIFIER_TIP_REMOVER 12
+#define LS_MODIFIER_NUM 13
/* LineStyleModifier::flags */
#define LS_MODIFIER_ENABLED 1
@@ -81,8 +90,6 @@ typedef struct LineStyleColorModifier_AlongStroke {
struct LineStyleModifier modifier;
struct ColorBand *color_ramp;
- int blend;
- int pad;
} LineStyleColorModifier_AlongStroke;
@@ -90,8 +97,8 @@ typedef struct LineStyleAlphaModifier_AlongStroke {
struct LineStyleModifier modifier;
struct CurveMapping *curve;
- int blend;
int flags;
+ int pad;
} LineStyleAlphaModifier_AlongStroke;
@@ -99,9 +106,9 @@ typedef struct LineStyleThicknessModifier_AlongStroke {
struct LineStyleModifier modifier;
struct CurveMapping *curve;
- int blend;
int flags;
float value_min, value_max;
+ int pad;
} LineStyleThicknessModifier_AlongStroke;
@@ -111,9 +118,7 @@ typedef struct LineStyleColorModifier_DistanceFromCamera {
struct LineStyleModifier modifier;
struct ColorBand *color_ramp;
- int blend;
float range_min, range_max;
- int pad;
} LineStyleColorModifier_DistanceFromCamera;
@@ -121,9 +126,9 @@ typedef struct LineStyleAlphaModifier_DistanceFromCamera {
struct LineStyleModifier modifier;
struct CurveMapping *curve;
- int blend;
int flags;
float range_min, range_max;
+ int pad;
} LineStyleAlphaModifier_DistanceFromCamera;
@@ -131,10 +136,10 @@ typedef struct LineStyleThicknessModifier_DistanceFromCamera {
struct LineStyleModifier modifier;
struct CurveMapping *curve;
- int blend;
int flags;
float range_min, range_max;
float value_min, value_max;
+ int pad;
} LineStyleThicknessModifier_DistanceFromCamera;
@@ -145,9 +150,7 @@ typedef struct LineStyleColorModifier_DistanceFromObject {
struct Object *target;
struct ColorBand *color_ramp;
- int blend;
float range_min, range_max;
- int pad;
} LineStyleColorModifier_DistanceFromObject;
@@ -156,9 +159,9 @@ typedef struct LineStyleAlphaModifier_DistanceFromObject {
struct Object *target;
struct CurveMapping *curve;
- int blend;
int flags;
float range_min, range_max;
+ int pad;
} LineStyleAlphaModifier_DistanceFromObject;
@@ -167,10 +170,10 @@ typedef struct LineStyleThicknessModifier_DistanceFromObject {
struct Object *target;
struct CurveMapping *curve;
- int blend;
int flags;
float range_min, range_max;
float value_min, value_max;
+ int pad;
} LineStyleThicknessModifier_DistanceFromObject;
@@ -192,10 +195,8 @@ typedef struct LineStyleColorModifier_Material {
struct LineStyleModifier modifier;
struct ColorBand *color_ramp;
- int blend;
int flags;
int mat_attr;
- int pad;
} LineStyleColorModifier_Material;
@@ -203,10 +204,8 @@ typedef struct LineStyleAlphaModifier_Material {
struct LineStyleModifier modifier;
struct CurveMapping *curve;
- int blend;
int flags;
int mat_attr;
- int pad;
} LineStyleAlphaModifier_Material;
@@ -214,20 +213,91 @@ typedef struct LineStyleThicknessModifier_Material {
struct LineStyleModifier modifier;
struct CurveMapping *curve;
- int blend;
int flags;
float value_min, value_max;
int mat_attr;
- int pad;
} LineStyleThicknessModifier_Material;
+/* Geometry modifiers */
+
+typedef struct LineStyleGeometryModifier_Sampling {
+ struct LineStyleModifier modifier;
+
+ float sampling;
+ int pad;
+
+} LineStyleGeometryModifier_Sampling;
+
+typedef struct LineStyleGeometryModifier_BezierCurve {
+ struct LineStyleModifier modifier;
+
+ float error;
+ int pad;
+
+} LineStyleGeometryModifier_BezierCurve;
+
+typedef struct LineStyleGeometryModifier_SinusDisplacement {
+ struct LineStyleModifier modifier;
+
+ float wavelength, amplitude, phase;
+ int pad;
+
+} LineStyleGeometryModifier_SinusDisplacement;
+
+/* LineStyleGeometryModifier_SpatialNoise::flags */
+#define LS_MODIFIER_SPATIAL_NOISE_SMOOTH 1
+#define LS_MODIFIER_SPATIAL_NOISE_PURERANDOM 2
+
+typedef struct LineStyleGeometryModifier_SpatialNoise {
+ struct LineStyleModifier modifier;
+
+ float amplitude, scale;
+ unsigned int octaves;
+ int flags;
+
+} LineStyleGeometryModifier_SpatialNoise;
+
+typedef struct LineStyleGeometryModifier_PerlinNoise1D {
+ struct LineStyleModifier modifier;
+
+ float frequency, amplitude;
+ unsigned int octaves;
+ int seed;
+
+} LineStyleGeometryModifier_PerlinNoise1D;
+
+typedef struct LineStyleGeometryModifier_PerlinNoise2D {
+ struct LineStyleModifier modifier;
+
+ float frequency, amplitude;
+ unsigned int octaves;
+ int seed;
+
+} LineStyleGeometryModifier_PerlinNoise2D;
+
+typedef struct LineStyleGeometryModifier_BackboneStretcher {
+ struct LineStyleModifier modifier;
+
+ float amount;
+ int pad;
+
+} LineStyleGeometryModifier_BackboneStretcher;
+
+typedef struct LineStyleGeometryModifier_TipRemover {
+ struct LineStyleModifier modifier;
+
+ float tip_length;
+ int pad;
+
+} LineStyleGeometryModifier_TipRemover;
+
/* FreestyleLineStyle::panel */
-#define LS_PANEL_COLOR 1
-#define LS_PANEL_ALPHA 2
-#define LS_PANEL_THICKNESS 3
-#define LS_PANEL_STROKES 4
-#define LS_PANEL_DISTORT 5
+#define LS_PANEL_STROKES 1
+#define LS_PANEL_COLOR 2
+#define LS_PANEL_ALPHA 3
+#define LS_PANEL_THICKNESS 4
+#define LS_PANEL_GEOMETRY 5
#define LS_PANEL_MISC 6
/* FreestyleLineStyle::flag */
@@ -255,6 +325,7 @@ typedef struct FreestyleLineStyle {
ListBase color_modifiers;
ListBase alpha_modifiers;
ListBase thickness_modifiers;
+ ListBase geometry_modifiers;
} FreestyleLineStyle;
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index cc8bf41a941..b605b1f29a9 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -291,6 +291,15 @@ extern StructRNA RNA_LineStyleColorModifier_AlongStroke;
extern StructRNA RNA_LineStyleColorModifier_DistanceFromCamera;
extern StructRNA RNA_LineStyleColorModifier_DistanceFromObject;
extern StructRNA RNA_LineStyleColorModifier_Material;
+extern StructRNA RNA_LineStyleGeometryModifier;
+extern StructRNA RNA_LineStyleGeometryModifier_BackboneStretcher;
+extern StructRNA RNA_LineStyleGeometryModifier_BezierCurve;
+extern StructRNA RNA_LineStyleGeometryModifier_PerlinNoise1D;
+extern StructRNA RNA_LineStyleGeometryModifier_PerlinNoise2D;
+extern StructRNA RNA_LineStyleGeometryModifier_Sampling;
+extern StructRNA RNA_LineStyleGeometryModifier_SinusDisplacement;
+extern StructRNA RNA_LineStyleGeometryModifier_SpatialNoise;
+extern StructRNA RNA_LineStyleGeometryModifier_TipRemover;
extern StructRNA RNA_LineStyleModifier;
extern StructRNA RNA_LineStyleThicknessModifier;
extern StructRNA RNA_LineStyleThicknessModifier_AlongStroke;
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index 867c49ebe45..1168042a26c 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -113,6 +113,7 @@ extern EnumPropertyItem ramp_blend_items[];
extern EnumPropertyItem linestyle_color_modifier_type_items[];
extern EnumPropertyItem linestyle_alpha_modifier_type_items[];
extern EnumPropertyItem linestyle_thickness_modifier_type_items[];
+extern EnumPropertyItem linestyle_geometry_modifier_type_items[];
struct bContext;
struct PointerRNA;
diff --git a/source/blender/makesrna/intern/rna_linestyle.c b/source/blender/makesrna/intern/rna_linestyle.c
index a948f0032db..eb3245de2c9 100644
--- a/source/blender/makesrna/intern/rna_linestyle.c
+++ b/source/blender/makesrna/intern/rna_linestyle.c
@@ -57,6 +57,17 @@ EnumPropertyItem linestyle_thickness_modifier_type_items[] ={
{LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem linestyle_geometry_modifier_type_items[] ={
+ {LS_MODIFIER_SAMPLING, "SAMPLING", ICON_MODIFIER, "Sampling", ""},
+ {LS_MODIFIER_BEZIER_CURVE, "BEZIER_CURVE", ICON_MODIFIER, "Bezier Curve", ""},
+ {LS_MODIFIER_SINUS_DISPLACEMENT, "SINUS_DISPLACEMENT", ICON_MODIFIER, "Sinus Displacement", ""},
+ {LS_MODIFIER_SPATIAL_NOISE, "SPATIAL_NOISE", ICON_MODIFIER, "Spatial Noise", ""},
+ {LS_MODIFIER_PERLIN_NOISE_1D, "PERLIN_NOISE_1D", ICON_MODIFIER, "Perlin Noise 1D", ""},
+ {LS_MODIFIER_PERLIN_NOISE_2D, "PERLIN_NOISE_2D", ICON_MODIFIER, "Perlin Noise 2D", ""},
+ {LS_MODIFIER_BACKBONE_STRETCHER, "BACKBONE_STRETCHER", ICON_MODIFIER, "Backbone Stretcher", ""},
+ {LS_MODIFIER_TIP_REMOVER, "TIP_REMOVER", ICON_MODIFIER, "Tip Remover", ""},
+ {0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
static StructRNA *rna_LineStyle_color_modifier_refine(struct PointerRNA *ptr)
@@ -113,6 +124,32 @@ static StructRNA *rna_LineStyle_thickness_modifier_refine(struct PointerRNA *ptr
}
}
+static StructRNA *rna_LineStyle_geometry_modifier_refine(struct PointerRNA *ptr)
+{
+ LineStyleModifier *m = (LineStyleModifier *)ptr->data;
+
+ switch(m->type) {
+ case LS_MODIFIER_SAMPLING:
+ return &RNA_LineStyleGeometryModifier_Sampling;
+ case LS_MODIFIER_BEZIER_CURVE:
+ return &RNA_LineStyleGeometryModifier_BezierCurve;
+ case LS_MODIFIER_SINUS_DISPLACEMENT:
+ return &RNA_LineStyleGeometryModifier_SinusDisplacement;
+ case LS_MODIFIER_SPATIAL_NOISE:
+ return &RNA_LineStyleGeometryModifier_SpatialNoise;
+ case LS_MODIFIER_PERLIN_NOISE_1D:
+ return &RNA_LineStyleGeometryModifier_PerlinNoise1D;
+ case LS_MODIFIER_PERLIN_NOISE_2D:
+ return &RNA_LineStyleGeometryModifier_PerlinNoise2D;
+ case LS_MODIFIER_BACKBONE_STRETCHER:
+ return &RNA_LineStyleGeometryModifier_BackboneStretcher;
+ case LS_MODIFIER_TIP_REMOVER:
+ return &RNA_LineStyleGeometryModifier_TipRemover;
+ default:
+ return &RNA_LineStyleGeometryModifier;
+ }
+}
+
static char *rna_LineStyle_color_modifier_path(PointerRNA *ptr)
{
return BLI_sprintfN("color_modifiers[\"%s\"]", ((LineStyleModifier*)ptr->data)->name);
@@ -128,11 +165,16 @@ static char *rna_LineStyle_thickness_modifier_path(PointerRNA *ptr)
return BLI_sprintfN("thickness_modifiers[\"%s\"]", ((LineStyleModifier*)ptr->data)->name);
}
+static char *rna_LineStyle_geometry_modifier_path(PointerRNA *ptr)
+{
+ return BLI_sprintfN("geometry_modifiers[\"%s\"]", ((LineStyleModifier*)ptr->data)->name);
+}
+
#else
#include "DNA_material_types.h"
-static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modifier_type_items, int color)
+static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modifier_type_items, int blend, int color)
{
PropertyRNA *prop;
@@ -180,17 +222,19 @@ static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modi
RNA_def_property_update(prop, NC_SCENE, NULL);
RNA_def_struct_name_property(srna, prop);
- prop= RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "blend");
- RNA_def_property_enum_items(prop, (color) ? color_blend_items : value_blend_items);
- RNA_def_property_ui_text(prop, "Blend", "Specify how the modifier value is blended into the base value.");
- RNA_def_property_update(prop, NC_SCENE, NULL);
+ if (blend) {
+ prop= RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "modifier.blend");
+ RNA_def_property_enum_items(prop, (color) ? color_blend_items : value_blend_items);
+ RNA_def_property_ui_text(prop, "Blend", "Specify how the modifier value is blended into the base value.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
- prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR);
- RNA_def_property_float_sdna(prop, NULL, "modifier.influence");
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Influence", "Influence factor by which the modifier changes the property.");
- RNA_def_property_update(prop, NC_SCENE, NULL);
+ prop= RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR);
+ RNA_def_property_float_sdna(prop, NULL, "modifier.influence");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Influence", "Influence factor by which the modifier changes the property.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+ }
prop= RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "modifier.flags", LS_MODIFIER_ENABLED);
@@ -203,17 +247,22 @@ static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modi
static void rna_def_color_modifier(StructRNA *srna)
{
- rna_def_modifier_type_common(srna, linestyle_color_modifier_type_items, 1);
+ rna_def_modifier_type_common(srna, linestyle_color_modifier_type_items, 1, 1);
}
static void rna_def_alpha_modifier(StructRNA *srna)
{
- rna_def_modifier_type_common(srna, linestyle_alpha_modifier_type_items, 0);
+ rna_def_modifier_type_common(srna, linestyle_alpha_modifier_type_items, 1, 0);
}
static void rna_def_thickness_modifier(StructRNA *srna)
{
- rna_def_modifier_type_common(srna, linestyle_thickness_modifier_type_items, 0);
+ rna_def_modifier_type_common(srna, linestyle_thickness_modifier_type_items, 1, 0);
+}
+
+static void rna_def_geometry_modifier(StructRNA *srna)
+{
+ rna_def_modifier_type_common(srna, linestyle_geometry_modifier_type_items, 0, 0);
}
static void rna_def_modifier_color_ramp_common(StructRNA *srna, int range)
@@ -436,6 +485,146 @@ static void rna_def_linestyle_modifiers(BlenderRNA *brna)
rna_def_modifier_material_common(srna);
rna_def_modifier_curve_common(srna, 0, 1);
+ /* geometry modifiers */
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier", "LineStyleModifier");
+ RNA_def_struct_sdna(srna, "LineStyleModifier");
+ RNA_def_struct_refine_func(srna, "rna_LineStyle_geometry_modifier_refine");
+ RNA_def_struct_path_func(srna, "rna_LineStyle_geometry_modifier_path");
+ RNA_def_struct_ui_text(srna, "Line Style Geometry Modifier", "Base type to define stroke geometry modifiers.");
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_Sampling", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Sampling", "Specify a new sampling value that determines the resolution of stroke polylines.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "sampling", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "sampling");
+ RNA_def_property_ui_text(prop, "Sampling", "New sampling value to be used for subsequent modifiers.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_BezierCurve", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Bezier Curve", "Replace stroke backbone geometry by a Bezier curve approximation of the original backbone geometry.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "error", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "error");
+ RNA_def_property_ui_text(prop, "Error", "Maximum distance allowed between the new Bezier curve and the original backbone geometry).");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_SinusDisplacement", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Sinus Displacement", "Add sinus displacement to stroke backbone geometry.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "wavelength", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "wavelength");
+ RNA_def_property_ui_text(prop, "Wavelength", "Wavelength of the sinus displacement.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "amplitude");
+ RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the sinus displacement.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "phase");
+ RNA_def_property_ui_text(prop, "Phase", "Phase of the sinus displacement.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_SpatialNoise", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Spatial Noise", "Add spatial noise to stroke backbone geometry.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "amplitude");
+ RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the spatial noise.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_ui_text(prop, "Scale", "Scale of the spatial noise.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "octaves");
+ RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the spatial noise).");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_SPATIAL_NOISE_SMOOTH);
+ RNA_def_property_ui_text(prop, "Smooth", "If true, the spatial noise is smooth.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "pure_random", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_SPATIAL_NOISE_PURERANDOM);
+ RNA_def_property_ui_text(prop, "Pure Random", "If true, the spatial noise does not show any coherence.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_PerlinNoise1D", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Perlin Noise 1D", "Add one-dimensional Perlin noise to stroke backbone geometry.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "frequency", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "frequency");
+ RNA_def_property_ui_text(prop, "Frequency", "Frequency of the Perlin noise.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "amplitude");
+ RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the Perlin noise.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "octaves");
+ RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise).");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "seed");
+ RNA_def_property_ui_text(prop, "Seed", "Seed for random number generation. If negative, time is used as a seed instead.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_PerlinNoise2D", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Perlin Noise 2D", "Add two-dimensional Perlin noise to stroke backbone geometry.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "frequency", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "frequency");
+ RNA_def_property_ui_text(prop, "Frequency", "Frequency of the Perlin noise.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "amplitude");
+ RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the Perlin noise.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "octaves");
+ RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise).");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "seed");
+ RNA_def_property_ui_text(prop, "Seed", "Seed for random number generation. If negative, time is used as a seed instead.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_BackboneStretcher", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Backbone Stretcher", "Stretch the beginning and the end of stroke backbone.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "amount", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "amount");
+ RNA_def_property_ui_text(prop, "Amount", "Amount of stretching.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
+ srna= RNA_def_struct(brna, "LineStyleGeometryModifier_TipRemover", "LineStyleGeometryModifier");
+ RNA_def_struct_ui_text(srna, "Tip Remover", "Remove a piece of stroke at the beginning and the end of stroke backbone.");
+ rna_def_geometry_modifier(srna);
+
+ prop= RNA_def_property(srna, "tip_length", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "tip_length");
+ RNA_def_property_ui_text(prop, "Tip Length", "Length of tips to be removed.");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
}
static void rna_def_linestyle(BlenderRNA *brna)
@@ -444,11 +633,11 @@ static void rna_def_linestyle(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem panel_items[] = {
+ {LS_PANEL_STROKES, "STROKES", 0, "Strokes", "Show the panel for stroke construction."},
{LS_PANEL_COLOR, "COLOR", 0, "Color", "Show the panel for line color options."},
{LS_PANEL_ALPHA, "ALPHA", 0, "Alpha", "Show the panel for alpha transparency options."},
{LS_PANEL_THICKNESS, "THICKNESS", 0, "Thickness", "Show the panel for line thickness options."},
- {LS_PANEL_STROKES, "STROKES", 0, "Strokes", "Show the panel for stroke construction."},
- {LS_PANEL_DISTORT, "DISTORT", 0, "Distort", "Show the panel for stroke distortion."},
+ {LS_PANEL_GEOMETRY, "GEOMETRY", 0, "Geometry", "Show the panel for stroke geometry options."},
{LS_PANEL_MISC, "MISC", 0, "Misc", "Show the panel for miscellaneous options."},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem cap_items[] = {
@@ -500,6 +689,11 @@ static void rna_def_linestyle(BlenderRNA *brna)
RNA_def_property_struct_type(prop, "LineStyleThicknessModifier");
RNA_def_property_ui_text(prop, "Thickness Modifiers", "List of line thickness modifiers.");
+ prop= RNA_def_property(srna, "geometry_modifiers", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "geometry_modifiers", NULL);
+ RNA_def_property_struct_type(prop, "LineStyleGeometryModifier");
+ RNA_def_property_ui_text(prop, "Geometry Modifiers", "List of stroke geometry modifiers.");
+
prop= RNA_def_property(srna, "same_object", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SAME_OBJECT);
RNA_def_property_ui_text(prop, "Same Object", "If true, only feature edges of the same object are joined.");