diff options
-rw-r--r-- | release/scripts/freestyle/style_modules/parameter_editor.py | 88 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_render.py | 145 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_linestyle.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/linestyle.c | 223 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 7 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 39 | ||||
-rw-r--r-- | source/blender/editors/render/render_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/render/render_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/render/render_shading.c | 47 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_linestyle_types.h | 121 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_access.h | 9 | ||||
-rw-r--r-- | source/blender/makesrna/RNA_enum_types.h | 1 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_linestyle.c | 226 |
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."); |