Freestyle: new stroke modifiers
[blender.git] / source / blender / makesrna / intern / rna_linestyle.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008).
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_linestyle.c
24  *  \ingroup RNA
25  */
26
27 #include <stdio.h>
28 #include <stdlib.h>
29
30 #include "RNA_define.h"
31 #include "RNA_enum_types.h"
32
33 #include "rna_internal.h"
34
35 #include "DNA_linestyle_types.h"
36 #include "DNA_material_types.h"
37 #include "DNA_texture_types.h"
38
39 #include "WM_types.h"
40 #include "WM_api.h"
41
42 EnumPropertyItem linestyle_color_modifier_type_items[] = {
43         {LS_MODIFIER_ALONG_STROKE, "ALONG_STROKE", ICON_MODIFIER, "Along Stroke", ""},
44         {LS_MODIFIER_CREASE_ANGLE, "CREASE_ANGLE", ICON_MODIFIER, "Crease Angle", ""},
45         {LS_MODIFIER_CURVATURE_3D, "CURVATURE_3D", ICON_MODIFIER, "Curvature 3D", ""},
46         {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""},
47         {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""},
48         {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
49         {LS_MODIFIER_NOISE, "NOISE", ICON_MODIFIER, "Noise", ""},
50         {LS_MODIFIER_TANGENT, "TANGENT", ICON_MODIFIER, "Tangent", ""},
51         {0, NULL, 0, NULL, NULL}
52 };
53
54 EnumPropertyItem linestyle_alpha_modifier_type_items[] = {
55         {LS_MODIFIER_ALONG_STROKE, "ALONG_STROKE", ICON_MODIFIER, "Along Stroke", ""},
56         {LS_MODIFIER_CREASE_ANGLE, "CREASE_ANGLE", ICON_MODIFIER, "Crease Angle", ""},
57         {LS_MODIFIER_CURVATURE_3D, "CURVATURE_3D", ICON_MODIFIER, "Curvature 3D", ""},
58         {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""},
59         {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""},
60         {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
61         {LS_MODIFIER_NOISE, "NOISE", ICON_MODIFIER, "Noise", ""},
62         {LS_MODIFIER_TANGENT, "TANGENT", ICON_MODIFIER, "Tangent", ""},
63         {0, NULL, 0, NULL, NULL}
64 };
65
66 EnumPropertyItem linestyle_thickness_modifier_type_items[] = {
67         {LS_MODIFIER_ALONG_STROKE, "ALONG_STROKE", ICON_MODIFIER, "Along Stroke", ""},
68         {LS_MODIFIER_CALLIGRAPHY, "CALLIGRAPHY", ICON_MODIFIER, "Calligraphy", ""},
69         {LS_MODIFIER_CREASE_ANGLE, "CREASE_ANGLE", ICON_MODIFIER, "Crease Angle", ""},
70         {LS_MODIFIER_CURVATURE_3D, "CURVATURE_3D", ICON_MODIFIER, "Curvature 3D", ""},
71         {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""},
72         {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""},
73         {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
74         {LS_MODIFIER_NOISE, "NOISE", ICON_MODIFIER, "Noise", ""},
75         {LS_MODIFIER_TANGENT, "TANGENT", ICON_MODIFIER, "Tangent", ""},
76         {0, NULL, 0, NULL, NULL}
77 };
78
79 EnumPropertyItem linestyle_geometry_modifier_type_items[] = {
80         {LS_MODIFIER_2D_OFFSET, "2D_OFFSET", ICON_MODIFIER, "2D Offset", ""},
81         {LS_MODIFIER_2D_TRANSFORM, "2D_TRANSFORM", ICON_MODIFIER, "2D Transform", ""},
82         {LS_MODIFIER_BACKBONE_STRETCHER, "BACKBONE_STRETCHER", ICON_MODIFIER, "Backbone Stretcher", ""},
83         {LS_MODIFIER_BEZIER_CURVE, "BEZIER_CURVE", ICON_MODIFIER, "Bezier Curve", ""},
84         {LS_MODIFIER_BLUEPRINT, "BLUEPRINT", ICON_MODIFIER, "Blueprint", ""},
85         {LS_MODIFIER_GUIDING_LINES, "GUIDING_LINES", ICON_MODIFIER, "Guiding Lines", ""},
86         {LS_MODIFIER_PERLIN_NOISE_1D, "PERLIN_NOISE_1D", ICON_MODIFIER, "Perlin Noise 1D", ""},
87         {LS_MODIFIER_PERLIN_NOISE_2D, "PERLIN_NOISE_2D", ICON_MODIFIER, "Perlin Noise 2D", ""},
88         {LS_MODIFIER_POLYGONIZATION, "POLYGONIZATION", ICON_MODIFIER, "Polygonization", ""},
89         {LS_MODIFIER_SAMPLING, "SAMPLING", ICON_MODIFIER, "Sampling", ""},
90         {LS_MODIFIER_SIMPLIFICATION, "SIMPLIFICATION", ICON_MODIFIER, "Simplification", ""},
91         {LS_MODIFIER_SINUS_DISPLACEMENT, "SINUS_DISPLACEMENT", ICON_MODIFIER, "Sinus Displacement", ""},
92         {LS_MODIFIER_SPATIAL_NOISE, "SPATIAL_NOISE", ICON_MODIFIER, "Spatial Noise", ""},
93         {LS_MODIFIER_TIP_REMOVER, "TIP_REMOVER", ICON_MODIFIER, "Tip Remover", ""},
94         {0, NULL, 0, NULL, NULL}
95 };
96
97 #ifdef RNA_RUNTIME
98
99 #include "BKE_linestyle.h"
100 #include "BKE_texture.h"
101 #include "BKE_depsgraph.h"
102
103 #include "ED_node.h"
104
105 #include "RNA_access.h"
106
107 static StructRNA *rna_LineStyle_color_modifier_refine(struct PointerRNA *ptr)
108 {
109         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
110
111         switch (m->type) {
112                 case LS_MODIFIER_ALONG_STROKE:
113                         return &RNA_LineStyleColorModifier_AlongStroke;
114                 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
115                         return &RNA_LineStyleColorModifier_DistanceFromCamera;
116                 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
117                         return &RNA_LineStyleColorModifier_DistanceFromObject;
118                 case LS_MODIFIER_MATERIAL:
119                         return &RNA_LineStyleColorModifier_Material;
120                 case LS_MODIFIER_TANGENT:
121                         return &RNA_LineStyleColorModifier_Tangent;
122                 case LS_MODIFIER_NOISE:
123                         return &RNA_LineStyleColorModifier_Noise;
124                 case LS_MODIFIER_CREASE_ANGLE:
125                         return &RNA_LineStyleColorModifier_CreaseAngle;
126                 case LS_MODIFIER_CURVATURE_3D:
127                         return &RNA_LineStyleColorModifier_Curvature_3D;
128                 default:
129                         return &RNA_LineStyleColorModifier;
130         }
131 }
132
133 static StructRNA *rna_LineStyle_alpha_modifier_refine(struct PointerRNA *ptr)
134 {
135         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
136
137         switch (m->type) {
138                 case LS_MODIFIER_ALONG_STROKE:
139                         return &RNA_LineStyleAlphaModifier_AlongStroke;
140                 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
141                         return &RNA_LineStyleAlphaModifier_DistanceFromCamera;
142                 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
143                         return &RNA_LineStyleAlphaModifier_DistanceFromObject;
144                 case LS_MODIFIER_MATERIAL:
145                         return &RNA_LineStyleAlphaModifier_Material;
146                 case LS_MODIFIER_TANGENT:
147                         return &RNA_LineStyleAlphaModifier_Tangent;
148                 case LS_MODIFIER_NOISE:
149                         return &RNA_LineStyleAlphaModifier_Noise;
150                 case LS_MODIFIER_CREASE_ANGLE:
151                         return &RNA_LineStyleAlphaModifier_CreaseAngle;
152                 case LS_MODIFIER_CURVATURE_3D:
153                         return &RNA_LineStyleAlphaModifier_Curvature_3D;
154                 default:
155                         return &RNA_LineStyleAlphaModifier;
156         }
157 }
158
159 static StructRNA *rna_LineStyle_thickness_modifier_refine(struct PointerRNA *ptr)
160 {
161         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
162
163         switch (m->type) {
164                 case LS_MODIFIER_ALONG_STROKE:
165                         return &RNA_LineStyleThicknessModifier_AlongStroke;
166                 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
167                         return &RNA_LineStyleThicknessModifier_DistanceFromCamera;
168                 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
169                         return &RNA_LineStyleThicknessModifier_DistanceFromObject;
170                 case LS_MODIFIER_MATERIAL:
171                         return &RNA_LineStyleThicknessModifier_Material;
172                 case LS_MODIFIER_CALLIGRAPHY:
173                         return &RNA_LineStyleThicknessModifier_Calligraphy;
174                 case LS_MODIFIER_TANGENT:
175                         return &RNA_LineStyleThicknessModifier_Tangent;
176                 case LS_MODIFIER_NOISE:
177                         return &RNA_LineStyleThicknessModifier_Noise;
178                 case LS_MODIFIER_CREASE_ANGLE:
179                         return &RNA_LineStyleThicknessModifier_CreaseAngle;
180                 case LS_MODIFIER_CURVATURE_3D:
181                         return &RNA_LineStyleThicknessModifier_Curvature_3D;
182                 default:
183                         return &RNA_LineStyleThicknessModifier;
184         }
185 }
186
187 static StructRNA *rna_LineStyle_geometry_modifier_refine(struct PointerRNA *ptr)
188 {
189         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
190
191         switch (m->type) {
192                 case LS_MODIFIER_SAMPLING:
193                         return &RNA_LineStyleGeometryModifier_Sampling;
194                 case LS_MODIFIER_BEZIER_CURVE:
195                         return &RNA_LineStyleGeometryModifier_BezierCurve;
196                 case LS_MODIFIER_SINUS_DISPLACEMENT:
197                         return &RNA_LineStyleGeometryModifier_SinusDisplacement;
198                 case LS_MODIFIER_SPATIAL_NOISE:
199                         return &RNA_LineStyleGeometryModifier_SpatialNoise;
200                 case LS_MODIFIER_PERLIN_NOISE_1D:
201                         return &RNA_LineStyleGeometryModifier_PerlinNoise1D;
202                 case LS_MODIFIER_PERLIN_NOISE_2D:
203                         return &RNA_LineStyleGeometryModifier_PerlinNoise2D;
204                 case LS_MODIFIER_BACKBONE_STRETCHER:
205                         return &RNA_LineStyleGeometryModifier_BackboneStretcher;
206                 case LS_MODIFIER_TIP_REMOVER:
207                         return &RNA_LineStyleGeometryModifier_TipRemover;
208                 case LS_MODIFIER_POLYGONIZATION:
209                         return &RNA_LineStyleGeometryModifier_Polygonalization;
210                 case LS_MODIFIER_GUIDING_LINES:
211                         return &RNA_LineStyleGeometryModifier_GuidingLines;
212                 case LS_MODIFIER_BLUEPRINT:
213                         return &RNA_LineStyleGeometryModifier_Blueprint;
214                 case LS_MODIFIER_2D_OFFSET:
215                         return &RNA_LineStyleGeometryModifier_2DOffset;
216                 case LS_MODIFIER_2D_TRANSFORM:
217                         return &RNA_LineStyleGeometryModifier_2DTransform;
218                 case LS_MODIFIER_SIMPLIFICATION:
219                         return &RNA_LineStyleGeometryModifier_Simplification;
220                 default:
221                         return &RNA_LineStyleGeometryModifier;
222         }
223 }
224
225 static char *rna_LineStyle_color_modifier_path(PointerRNA *ptr)
226 {
227         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
228         char name_esc[sizeof(m->name) * 2];
229         BLI_strescape(name_esc, m->name, sizeof(name_esc));
230         return BLI_sprintfN("color_modifiers[\"%s\"]", name_esc);
231 }
232
233 static char *rna_LineStyle_alpha_modifier_path(PointerRNA *ptr)
234 {
235         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
236         char name_esc[sizeof(m->name) * 2];
237         BLI_strescape(name_esc, m->name, sizeof(name_esc));
238         return BLI_sprintfN("alpha_modifiers[\"%s\"]", name_esc);
239 }
240
241 static char *rna_LineStyle_thickness_modifier_path(PointerRNA *ptr)
242 {
243         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
244         char name_esc[sizeof(m->name) * 2];
245         BLI_strescape(name_esc, m->name, sizeof(name_esc));
246         return BLI_sprintfN("thickness_modifiers[\"%s\"]", name_esc);
247 }
248
249 static char *rna_LineStyle_geometry_modifier_path(PointerRNA *ptr)
250 {
251         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
252         char name_esc[sizeof(m->name) * 2];
253         BLI_strescape(name_esc, m->name, sizeof(name_esc));
254         return BLI_sprintfN("geometry_modifiers[\"%s\"]", name_esc);
255 }
256
257 static void rna_LineStyleColorModifier_name_set(PointerRNA *ptr, const char *value)
258 {
259         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
260         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
261
262         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
263         BLI_uniquename(&linestyle->color_modifiers, m, "ColorModifier", '.',
264                        offsetof(LineStyleModifier, name), sizeof(m->name));
265 }
266
267 static void rna_LineStyleAlphaModifier_name_set(PointerRNA *ptr, const char *value)
268 {
269         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
270         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
271
272         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
273         BLI_uniquename(&linestyle->alpha_modifiers, m, "AlphaModifier", '.',
274                        offsetof(LineStyleModifier, name), sizeof(m->name));
275 }
276
277 static void rna_LineStyleThicknessModifier_name_set(PointerRNA *ptr, const char *value)
278 {
279         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
280         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
281
282         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
283         BLI_uniquename(&linestyle->thickness_modifiers, m, "ThicknessModifier", '.',
284                        offsetof(LineStyleModifier, name), sizeof(m->name));
285 }
286
287 static void rna_LineStyleGeometryModifier_name_set(PointerRNA *ptr, const char *value)
288 {
289         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
290         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
291
292         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
293         BLI_uniquename(&linestyle->geometry_modifiers, m, "GeometryModifier", '.',
294                        offsetof(LineStyleModifier, name), sizeof(m->name));
295 }
296
297 static void rna_LineStyle_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
298 {
299         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
300         rna_iterator_array_begin(iter, (void *)linestyle->mtex, sizeof(MTex *), MAX_MTEX, 0, NULL);
301 }
302
303 static PointerRNA rna_LineStyle_active_texture_get(PointerRNA *ptr)
304 {
305         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
306         Tex *tex;
307
308         tex = give_current_linestyle_texture(linestyle);
309         return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
310 }
311
312 static void rna_LineStyle_active_texture_set(PointerRNA *ptr, PointerRNA value)
313 {
314         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
315
316         set_current_linestyle_texture(linestyle, value.data);
317 }
318
319 static void rna_LineStyle_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
320 {
321         FreestyleLineStyle *linestyle = ptr->id.data;
322
323         DAG_id_tag_update(&linestyle->id, 0);
324         WM_main_add_notifier(NC_LINESTYLE, linestyle);
325 }
326
327 static void rna_LineStyle_use_nodes_update(bContext *C, PointerRNA *ptr)
328 {
329         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->data;
330
331         if (linestyle->use_nodes && linestyle->nodetree == NULL)
332                 BKE_linestyle_default_shader(C, linestyle);
333
334         rna_LineStyle_update(CTX_data_main(C), CTX_data_scene(C), ptr);
335 }
336
337 static LineStyleModifier *rna_LineStyle_color_modifier_add(FreestyleLineStyle *linestyle, ReportList *reports,
338                                                            const char *name, int type)
339 {
340         LineStyleModifier *modifier = BKE_linestyle_color_modifier_add(linestyle, name, type);
341
342         if (!modifier) {
343                 BKE_report(reports, RPT_ERROR, "Failed to add the color modifier");
344                 return NULL;
345         }
346
347         DAG_id_tag_update(&linestyle->id, 0);
348         WM_main_add_notifier(NC_LINESTYLE, linestyle);
349
350         return modifier;
351 }
352
353 static void rna_LineStyle_color_modifier_remove(FreestyleLineStyle *linestyle, ReportList *reports,
354                                                 PointerRNA *modifier_ptr)
355 {
356         LineStyleModifier *modifier = modifier_ptr->data;
357
358         if (BKE_linestyle_color_modifier_remove(linestyle, modifier) == -1) {
359                 BKE_reportf(reports, RPT_ERROR, "Color modifier '%s' could not be removed", modifier->name);
360                 return;
361         }
362
363         RNA_POINTER_INVALIDATE(modifier_ptr);
364
365         DAG_id_tag_update(&linestyle->id, 0);
366         WM_main_add_notifier(NC_LINESTYLE, linestyle);
367 }
368
369 static LineStyleModifier *rna_LineStyle_alpha_modifier_add(FreestyleLineStyle *linestyle, ReportList *reports,
370                                                            const char *name, int type)
371 {
372         LineStyleModifier *modifier = BKE_linestyle_alpha_modifier_add(linestyle, name, type);
373
374         if (!modifier) {
375                 BKE_report(reports, RPT_ERROR, "Failed to add the alpha modifier");
376                 return NULL;
377         }
378
379         DAG_id_tag_update(&linestyle->id, 0);
380         WM_main_add_notifier(NC_LINESTYLE, linestyle);
381
382         return modifier;
383 }
384
385 static void rna_LineStyle_alpha_modifier_remove(FreestyleLineStyle *linestyle, ReportList *reports,
386                                                 PointerRNA *modifier_ptr)
387 {
388         LineStyleModifier *modifier = modifier_ptr->data;
389
390         if (BKE_linestyle_alpha_modifier_remove(linestyle, modifier) == -1) {
391                 BKE_reportf(reports, RPT_ERROR, "Alpha modifier '%s' could not be removed", modifier->name);
392                 return;
393         }
394
395         RNA_POINTER_INVALIDATE(modifier_ptr);
396
397         DAG_id_tag_update(&linestyle->id, 0);
398         WM_main_add_notifier(NC_LINESTYLE, linestyle);
399 }
400
401 static LineStyleModifier *rna_LineStyle_thickness_modifier_add(FreestyleLineStyle *linestyle, ReportList *reports,
402                                                                const char *name, int type)
403 {
404         LineStyleModifier *modifier = BKE_linestyle_thickness_modifier_add(linestyle, name, type);
405
406         if (!modifier) {
407                 BKE_report(reports, RPT_ERROR, "Failed to add the thickness modifier");
408                 return NULL;
409         }
410
411         DAG_id_tag_update(&linestyle->id, 0);
412         WM_main_add_notifier(NC_LINESTYLE, linestyle);
413
414         return modifier;
415 }
416
417 static void rna_LineStyle_thickness_modifier_remove(FreestyleLineStyle *linestyle, ReportList *reports,
418                                                     PointerRNA *modifier_ptr)
419 {
420         LineStyleModifier *modifier = modifier_ptr->data;
421
422         if (BKE_linestyle_thickness_modifier_remove(linestyle, modifier) == -1) {
423                 BKE_reportf(reports, RPT_ERROR, "Thickness modifier '%s' could not be removed", modifier->name);
424                 return;
425         }
426
427         RNA_POINTER_INVALIDATE(modifier_ptr);
428
429         DAG_id_tag_update(&linestyle->id, 0);
430         WM_main_add_notifier(NC_LINESTYLE, linestyle);
431 }
432
433 static LineStyleModifier *rna_LineStyle_geometry_modifier_add(FreestyleLineStyle *linestyle, ReportList *reports,
434                                                               const char *name, int type)
435 {
436         LineStyleModifier *modifier = BKE_linestyle_geometry_modifier_add(linestyle, name, type);
437
438         if (!modifier) {
439                 BKE_report(reports, RPT_ERROR, "Failed to add the geometry modifier");
440                 return NULL;
441         }
442
443         DAG_id_tag_update(&linestyle->id, 0);
444         WM_main_add_notifier(NC_LINESTYLE, linestyle);
445
446         return modifier;
447 }
448
449 static void rna_LineStyle_geometry_modifier_remove(FreestyleLineStyle *linestyle, ReportList *reports,
450                                                    PointerRNA *modifier_ptr)
451 {
452         LineStyleModifier *modifier = modifier_ptr->data;
453
454         if (BKE_linestyle_geometry_modifier_remove(linestyle, modifier) == -1) {
455                 BKE_reportf(reports, RPT_ERROR, "Geometry modifier '%s' could not be removed", modifier->name);
456                 return;
457         }
458
459         RNA_POINTER_INVALIDATE(modifier_ptr);
460
461         DAG_id_tag_update(&linestyle->id, 0);
462         WM_main_add_notifier(NC_LINESTYLE, linestyle);
463 }
464
465 #else
466
467 #include "BLI_math.h"
468
469 static void rna_def_linestyle_mtex(BlenderRNA *brna)
470 {
471         StructRNA *srna;
472         PropertyRNA *prop;
473
474         static EnumPropertyItem texco_items[] = {
475                 {TEXCO_WINDOW, "WINDOW", 0, "Window", "Use screen coordinates as texture coordinates"},
476                 {TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates"},
477                 {TEXCO_STROKE, "ALONG_STROKE", 0, "Along stroke", "Use stroke length for texture coordinates"},
478                 {TEXCO_ORCO, "ORCO", 0, "Generated", "Use the original undeformed coordinates of the object"},
479                 {0, NULL, 0, NULL, NULL}
480         };
481
482         static EnumPropertyItem prop_mapping_items[] = {
483                 {MTEX_FLAT, "FLAT", 0, "Flat", "Map X and Y coordinates directly"},
484                 {MTEX_CUBE, "CUBE", 0, "Cube", "Map using the normal vector"},
485                 {MTEX_TUBE, "TUBE", 0, "Tube", "Map with Z as central axis"},
486                 {MTEX_SPHERE, "SPHERE", 0, "Sphere", "Map with Z as central axis"},
487                 {0, NULL, 0, NULL, NULL}
488         };
489
490         static EnumPropertyItem prop_x_mapping_items[] = {
491                 {0, "NONE", 0, "None", ""},
492                 {1, "X", 0, "X", ""},
493                 {2, "Y", 0, "Y", ""},
494                 {3, "Z", 0, "Z", ""},
495                 {0, NULL, 0, NULL, NULL}
496         };
497
498         static EnumPropertyItem prop_y_mapping_items[] = {
499                 {0, "NONE", 0, "None", ""},
500                 {1, "X", 0, "X", ""},
501                 {2, "Y", 0, "Y", ""},
502                 {3, "Z", 0, "Z", ""},
503                 {0, NULL, 0, NULL, NULL}
504         };
505
506         static EnumPropertyItem prop_z_mapping_items[] = {
507                 {0, "NONE", 0, "None", ""},
508                 {1, "X", 0, "X", ""},
509                 {2, "Y", 0, "Y", ""},
510                 {3, "Z", 0, "Z", ""},
511                 {0, NULL, 0, NULL, NULL}
512         };
513
514         srna = RNA_def_struct(brna, "LineStyleTextureSlot", "TextureSlot");
515         RNA_def_struct_sdna(srna, "MTex");
516         RNA_def_struct_ui_text(srna, "LineStyle Texture Slot", "Texture slot for textures in a LineStyle datablock");
517
518         prop = RNA_def_property(srna, "mapping_x", PROP_ENUM, PROP_NONE);
519         RNA_def_property_enum_sdna(prop, NULL, "projx");
520         RNA_def_property_enum_items(prop, prop_x_mapping_items);
521         RNA_def_property_ui_text(prop, "X Mapping", "");
522         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
523
524         prop = RNA_def_property(srna, "mapping_y", PROP_ENUM, PROP_NONE);
525         RNA_def_property_enum_sdna(prop, NULL, "projy");
526         RNA_def_property_enum_items(prop, prop_y_mapping_items);
527         RNA_def_property_ui_text(prop, "Y Mapping", "");
528         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
529
530         prop = RNA_def_property(srna, "mapping_z", PROP_ENUM, PROP_NONE);
531         RNA_def_property_enum_sdna(prop, NULL, "projz");
532         RNA_def_property_enum_items(prop, prop_z_mapping_items);
533         RNA_def_property_ui_text(prop, "Z Mapping", "");
534         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
535
536         prop = RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
537         RNA_def_property_enum_items(prop, prop_mapping_items);
538         RNA_def_property_ui_text(prop, "Mapping", "");
539         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
540
541         /* map to */
542         prop = RNA_def_property(srna, "use_map_color_diffuse", PROP_BOOLEAN, PROP_NONE);
543         RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_COL);
544         RNA_def_property_ui_text(prop, "Diffuse Color", "The texture affects basic color of the stroke");
545         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
546
547         prop = RNA_def_property(srna, "use_map_alpha", PROP_BOOLEAN, PROP_NONE);
548         RNA_def_property_boolean_sdna(prop, NULL, "mapto", MAP_ALPHA);
549         RNA_def_property_ui_text(prop, "Alpha", "The texture affects the alpha value");
550         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
551
552         prop = RNA_def_property(srna, "use_tips", PROP_BOOLEAN, PROP_NONE);
553         RNA_def_property_boolean_sdna(prop, NULL, "texflag", MTEX_TIPS);
554         RNA_def_property_ui_text(prop, "Use Tips", "Lower half of the texture is for tips of the stroke");
555         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
556
557         prop = RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
558         RNA_def_property_enum_sdna(prop, NULL, "texco");
559         RNA_def_property_enum_items(prop, texco_items);
560         RNA_def_property_ui_text(prop, "Texture Coordinates",
561                                  "Texture coordinates used to map the texture onto the background");
562         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
563
564         prop = RNA_def_property(srna, "alpha_factor", PROP_FLOAT, PROP_NONE);
565         RNA_def_property_float_sdna(prop, NULL, "alphafac");
566         RNA_def_property_ui_range(prop, -1, 1, 10, 3);
567         RNA_def_property_ui_text(prop, "Alpha Factor", "Amount texture affects alpha");
568         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
569
570         prop = RNA_def_property(srna, "diffuse_color_factor", PROP_FLOAT, PROP_NONE);
571         RNA_def_property_float_sdna(prop, NULL, "colfac");
572         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
573         RNA_def_property_ui_text(prop, "Diffuse Color Factor", "Amount texture affects diffuse color");
574         RNA_def_property_update(prop, 0, "rna_LineStyle_update");
575 }
576
577 static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modifier_type_items,
578                                          const char *set_name_func, const bool blend, const bool color)
579 {
580         PropertyRNA *prop;
581
582         /* TODO: Check this is not already defined somewhere else, e.g. in nodes... */
583         static EnumPropertyItem value_blend_items[] = {
584                 {LS_VALUE_BLEND, "MIX", 0, "Mix", ""},
585                 {LS_VALUE_ADD, "ADD", 0, "Add", ""},
586                 {LS_VALUE_SUB, "SUBTRACT", 0, "Subtract", ""},
587                 {LS_VALUE_MULT, "MULTIPLY", 0, "Multiply", ""},
588                 {LS_VALUE_DIV, "DIVIDE", 0, "Divide", ""},
589                 {LS_VALUE_DIFF, "DIFFERENCE", 0, "Difference", ""},
590                 {LS_VALUE_MIN, "MININUM", 0, "Minimum", ""}, 
591                 {LS_VALUE_MAX, "MAXIMUM", 0, "Maximum", ""}, 
592                 {0, NULL, 0, NULL, NULL}
593         };
594
595         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
596         RNA_def_property_enum_sdna(prop, NULL, "modifier.type");
597         RNA_def_property_enum_items(prop, modifier_type_items);
598         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
599         RNA_def_property_ui_text(prop, "Modifier Type", "Type of the modifier");
600
601         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
602         RNA_def_property_string_sdna(prop, NULL, "modifier.name");
603         RNA_def_property_string_funcs(prop, NULL, NULL, set_name_func);
604         RNA_def_property_ui_text(prop, "Modifier Name", "Name of the modifier");
605         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
606         RNA_def_struct_name_property(srna, prop);
607
608         if (blend) {
609                 prop = RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
610                 RNA_def_property_enum_sdna(prop, NULL, "modifier.blend");
611                 RNA_def_property_enum_items(prop, (color) ? ramp_blend_items : value_blend_items);
612                 RNA_def_property_ui_text(prop, "Blend", "Specify how the modifier value is blended into the base value");
613                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
614
615                 prop = RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR);
616                 RNA_def_property_float_sdna(prop, NULL, "modifier.influence");
617                 RNA_def_property_range(prop, 0.0f, 1.0f);
618                 RNA_def_property_ui_text(prop, "Influence", "Influence factor by which the modifier changes the property");
619                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
620         }
621
622         prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
623         RNA_def_property_boolean_sdna(prop, NULL, "modifier.flags", LS_MODIFIER_ENABLED);
624         RNA_def_property_ui_text(prop, "Use", "Enable or disable this modifier during stroke rendering");
625         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
626
627         prop = RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
628         RNA_def_property_boolean_sdna(prop, NULL, "modifier.flags", LS_MODIFIER_EXPANDED);
629         RNA_def_property_ui_text(prop, "Expanded", "True if the modifier tab is expanded");
630 }
631
632 static void rna_def_color_modifier(StructRNA *srna)
633 {
634         rna_def_modifier_type_common(srna, linestyle_color_modifier_type_items,
635                                      "rna_LineStyleColorModifier_name_set", true, true);
636 }
637
638 static void rna_def_alpha_modifier(StructRNA *srna)
639 {
640         rna_def_modifier_type_common(srna, linestyle_alpha_modifier_type_items,
641                                      "rna_LineStyleAlphaModifier_name_set", true, false);
642 }
643
644 static void rna_def_thickness_modifier(StructRNA *srna)
645 {
646         rna_def_modifier_type_common(srna, linestyle_thickness_modifier_type_items,
647                                      "rna_LineStyleThicknessModifier_name_set", true, false);
648 }
649
650 static void rna_def_geometry_modifier(StructRNA *srna)
651 {
652         rna_def_modifier_type_common(srna, linestyle_geometry_modifier_type_items,
653                                      "rna_LineStyleGeometryModifier_name_set", false, false);
654 }
655
656 static void rna_def_modifier_color_ramp_common(StructRNA *srna, int range)
657 {
658         PropertyRNA *prop;
659
660         prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NONE);
661         RNA_def_property_pointer_sdna(prop, NULL, "color_ramp");
662         RNA_def_property_struct_type(prop, "ColorRamp");
663         RNA_def_property_ui_text(prop, "Color Ramp", "Color ramp used to change line color");
664         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
665
666         if (range) {
667                 prop = RNA_def_property(srna, "range_min", PROP_FLOAT, PROP_DISTANCE);
668                 RNA_def_property_float_sdna(prop, NULL, "range_min");
669                 RNA_def_property_ui_text(prop, "Range Min", "Lower bound of the input range the mapping is applied");
670                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
671
672                 prop = RNA_def_property(srna, "range_max", PROP_FLOAT, PROP_DISTANCE);
673                 RNA_def_property_float_sdna(prop, NULL, "range_max");
674                 RNA_def_property_ui_text(prop, "Range Max", "Upper bound of the input range the mapping is applied");
675                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
676         }
677 }
678
679 static void rna_def_modifier_curve_common(StructRNA *srna, bool range, bool value)
680 {
681         PropertyRNA *prop;
682
683         static EnumPropertyItem mapping_items[] = {
684                 {0, "LINEAR", 0, "Linear", "Use linear mapping"},
685                 {LS_MODIFIER_USE_CURVE, "CURVE", 0, "Curve", "Use curve mapping"},
686                 {0, NULL, 0, NULL, NULL}
687         };
688
689         prop = RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
690         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
691         RNA_def_property_enum_items(prop, mapping_items);
692         RNA_def_property_ui_text(prop, "Mapping", "Select the mapping type");
693         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
694
695         prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
696         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_INVERT);
697         RNA_def_property_ui_text(prop, "Invert", "Invert the fade-out direction of the linear mapping");
698         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
699
700         prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
701         RNA_def_property_pointer_sdna(prop, NULL, "curve");
702         RNA_def_property_struct_type(prop, "CurveMapping");
703         RNA_def_property_ui_text(prop, "Curve", "Curve used for the curve mapping");
704         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
705
706         if (range) {
707                 prop = RNA_def_property(srna, "range_min", PROP_FLOAT, PROP_DISTANCE);
708                 RNA_def_property_float_sdna(prop, NULL, "range_min");
709                 RNA_def_property_ui_text(prop, "Range Min", "Lower bound of the input range the mapping is applied");
710                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
711
712                 prop = RNA_def_property(srna, "range_max", PROP_FLOAT, PROP_DISTANCE);
713                 RNA_def_property_float_sdna(prop, NULL, "range_max");
714                 RNA_def_property_ui_text(prop, "Range Max", "Upper bound of the input range the mapping is applied");
715                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
716         }
717
718         if (value) {
719                 prop = RNA_def_property(srna, "value_min", PROP_FLOAT, PROP_NONE);
720                 RNA_def_property_float_sdna(prop, NULL, "value_min");
721                 RNA_def_property_ui_text(prop, "Value Min", "Minimum output value of the mapping");
722                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
723
724                 prop = RNA_def_property(srna, "value_max", PROP_FLOAT, PROP_NONE);
725                 RNA_def_property_float_sdna(prop, NULL, "value_max");
726                 RNA_def_property_ui_text(prop, "Value Max", "Maximum output value of the mapping");
727                 RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
728         }
729 }
730
731 static void rna_def_modifier_material_common(StructRNA *srna)
732 {
733         PropertyRNA *prop;
734
735         static EnumPropertyItem mat_attr_items[] = {
736                 {LS_MODIFIER_MATERIAL_LINE, "LINE", 0, "Line Color", ""},
737                 {LS_MODIFIER_MATERIAL_LINE_R, "LINE_R", 0, "Line Color Red", ""},
738                 {LS_MODIFIER_MATERIAL_LINE_G, "LINE_G", 0, "Line Color Green", ""},
739                 {LS_MODIFIER_MATERIAL_LINE_B, "LINE_B", 0, "Line Color Blue", ""},
740                 {LS_MODIFIER_MATERIAL_LINE_A, "LINE_A", 0, "Line Color Alpha", ""},
741                 {LS_MODIFIER_MATERIAL_DIFF, "DIFF", 0, "Diffuse Color", ""},
742                 {LS_MODIFIER_MATERIAL_DIFF_R, "DIFF_R", 0, "Diffuse Color Red", ""},
743                 {LS_MODIFIER_MATERIAL_DIFF_G, "DIFF_G", 0, "Diffuse Color Green", ""},
744                 {LS_MODIFIER_MATERIAL_DIFF_B, "DIFF_B", 0, "Diffuse Color Blue", ""},
745                 {LS_MODIFIER_MATERIAL_SPEC, "SPEC", 0, "Specular Color", ""},
746                 {LS_MODIFIER_MATERIAL_SPEC_R, "SPEC_R", 0, "Specular Color Red", ""},
747                 {LS_MODIFIER_MATERIAL_SPEC_G, "SPEC_G", 0, "Specular Color Green", ""},
748                 {LS_MODIFIER_MATERIAL_SPEC_B, "SPEC_B", 0, "Specular Color Blue", ""},
749                 {LS_MODIFIER_MATERIAL_SPEC_HARD, "SPEC_HARD", 0, "Specular Hardness", ""},
750                 {LS_MODIFIER_MATERIAL_ALPHA, "ALPHA", 0, "Alpha Transparency", ""},
751                 {0, NULL, 0, NULL, NULL}
752         };
753
754         prop = RNA_def_property(srna, "material_attribute", PROP_ENUM, PROP_NONE);
755         RNA_def_property_enum_sdna(prop, NULL, "mat_attr");
756         RNA_def_property_enum_items(prop, mat_attr_items);
757         RNA_def_property_ui_text(prop, "Material Attribute", "Specify which material attribute is used");
758         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
759
760 }
761
762 static void rna_def_linestyle_modifiers(BlenderRNA *brna)
763 {
764         StructRNA *srna;
765         PropertyRNA *prop;
766
767         static EnumPropertyItem blueprint_shape_items[] = {
768                 {LS_MODIFIER_BLUEPRINT_CIRCLES, "CIRCLES", 0, "Circles", "Draw a blueprint using circular contour strokes"},
769                 {LS_MODIFIER_BLUEPRINT_ELLIPSES, "ELLIPSES", 0, "Ellipses", "Draw a blueprint using elliptic contour strokes"},
770                 {LS_MODIFIER_BLUEPRINT_SQUARES, "SQUARES", 0, "Squares", "Draw a blueprint using square contour strokes"},
771                 {0, NULL, 0, NULL, NULL}
772         };
773
774         static EnumPropertyItem transform_pivot_items[] = {
775                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER, "CENTER", 0, "Stroke Center", ""},
776                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_START, "START", 0, "Stroke Start", ""},
777                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_END, "END", 0, "Stroke End", ""},
778                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_PARAM, "PARAM", 0, "Stroke Point Parameter", ""},
779                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_ABSOLUTE, "ABSOLUTE", 0, "Absolute 2D Point", ""},
780                 {0, NULL, 0, NULL, NULL}
781         };
782
783         srna = RNA_def_struct(brna, "LineStyleModifier", NULL);
784         RNA_def_struct_ui_text(srna, "Line Style Modifier", "Base type to define modifiers");
785
786         /* line color modifiers */
787
788         srna = RNA_def_struct(brna, "LineStyleColorModifier", "LineStyleModifier");
789         RNA_def_struct_sdna(srna, "LineStyleModifier");
790         RNA_def_struct_refine_func(srna, "rna_LineStyle_color_modifier_refine");
791         RNA_def_struct_path_func(srna, "rna_LineStyle_color_modifier_path");
792         RNA_def_struct_ui_text(srna, "Line Style Color Modifier", "Base type to define line color modifiers");
793
794         srna = RNA_def_struct(brna, "LineStyleColorModifier_AlongStroke", "LineStyleColorModifier");
795         RNA_def_struct_ui_text(srna, "Along Stroke", "Change line color along stroke");
796         rna_def_color_modifier(srna);
797         rna_def_modifier_color_ramp_common(srna, false);
798
799         srna = RNA_def_struct(brna, "LineStyleColorModifier_DistanceFromCamera", "LineStyleColorModifier");
800         RNA_def_struct_ui_text(srna, "Distance from Camera", "Change line color based on the distance from the camera");
801         rna_def_color_modifier(srna);
802         rna_def_modifier_color_ramp_common(srna, true);
803
804         srna = RNA_def_struct(brna, "LineStyleColorModifier_DistanceFromObject", "LineStyleColorModifier");
805         RNA_def_struct_ui_text(srna, "Distance from Object", "Change line color based on the distance from an object");
806         rna_def_color_modifier(srna);
807         rna_def_modifier_color_ramp_common(srna, true);
808
809         prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
810         RNA_def_property_pointer_sdna(prop, NULL, "target");
811         RNA_def_property_struct_type(prop, "Object");
812         RNA_def_property_flag(prop, PROP_EDITABLE);
813         RNA_def_property_ui_text(prop, "Target", "Target object from which the distance is measured");
814         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
815
816         srna = RNA_def_struct(brna, "LineStyleColorModifier_Material", "LineStyleColorModifier");
817         RNA_def_struct_ui_text(srna, "Material", "Change line color based on a material attribute");
818         rna_def_color_modifier(srna);
819         rna_def_modifier_material_common(srna);
820         rna_def_modifier_color_ramp_common(srna, false);
821
822         prop = RNA_def_property(srna, "use_ramp", PROP_BOOLEAN, PROP_NONE);
823         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_USE_RAMP);
824         RNA_def_property_ui_text(prop, "Ramp", "Use color ramp to map the BW average into an RGB color");
825         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
826
827         srna = RNA_def_struct(brna, "LineStyleColorModifier_Tangent", "LineStyleColorModifier");
828         RNA_def_struct_ui_text(srna, "Tangent", "Change line color based on the direction of a stroke");
829         rna_def_color_modifier(srna);
830         rna_def_modifier_color_ramp_common(srna, false);
831
832         srna = RNA_def_struct(brna, "LineStyleColorModifier_Noise", "LineStyleColorModifier");
833         RNA_def_struct_ui_text(srna, "Noise", "Change line color based on random noise");
834         rna_def_color_modifier(srna);
835         rna_def_modifier_color_ramp_common(srna, false);
836
837         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
838         RNA_def_property_float_sdna(prop, NULL, "amplitude");
839         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the noise");
840         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
841
842         prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
843         RNA_def_property_float_sdna(prop, NULL, "period");
844         RNA_def_property_ui_text(prop, "Period", "Period of the noise");
845         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
846
847         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
848         RNA_def_property_int_sdna(prop, NULL, "seed");
849         RNA_def_property_ui_text(prop, "Seed", "Seed for the noise generation");
850         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
851
852         srna = RNA_def_struct(brna, "LineStyleColorModifier_CreaseAngle", "LineStyleColorModifier");
853         RNA_def_struct_ui_text(srna, "Crease Angle", "Change line color based on the underlying crease angle");
854         rna_def_color_modifier(srna);
855         rna_def_modifier_color_ramp_common(srna, false);
856
857         prop = RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
858         RNA_def_property_float_sdna(prop, NULL, "min_angle");
859         RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle to modify thickness");
860         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
861
862         prop = RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
863         RNA_def_property_float_sdna(prop, NULL, "max_angle");
864         RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle to modify thickness");
865         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
866
867         srna = RNA_def_struct(brna, "LineStyleColorModifier_Curvature_3D", "LineStyleColorModifier");
868         RNA_def_struct_ui_text(srna, "Curvature 3D",
869                                                    "Change line color based on the radial curvature of 3D mesh surfaces");
870         rna_def_color_modifier(srna);
871         rna_def_modifier_color_ramp_common(srna, false);
872
873         prop = RNA_def_property(srna, "curvature_min", PROP_FLOAT, PROP_NONE);
874         RNA_def_property_float_sdna(prop, NULL, "min_curvature");
875         RNA_def_property_ui_text(prop, "Min Curvature", "Minimum Curvature");
876         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
877
878         prop = RNA_def_property(srna, "curvature_max", PROP_FLOAT, PROP_NONE);
879         RNA_def_property_float_sdna(prop, NULL, "max_curvature");
880         RNA_def_property_ui_text(prop, "Max Curvature", "Maximum Curvature");
881         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
882
883         /* alpha transparency modifiers */
884
885         srna = RNA_def_struct(brna, "LineStyleAlphaModifier", "LineStyleModifier");
886         RNA_def_struct_sdna(srna, "LineStyleModifier");
887         RNA_def_struct_refine_func(srna, "rna_LineStyle_alpha_modifier_refine");
888         RNA_def_struct_path_func(srna, "rna_LineStyle_alpha_modifier_path");
889         RNA_def_struct_ui_text(srna, "Line Style Alpha Modifier", "Base type to define alpha transparency modifiers");
890
891         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_AlongStroke", "LineStyleAlphaModifier");
892         RNA_def_struct_ui_text(srna, "Along Stroke", "Change alpha transparency along stroke");
893         rna_def_alpha_modifier(srna);
894         rna_def_modifier_curve_common(srna, false, false);
895
896         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_DistanceFromCamera", "LineStyleAlphaModifier");
897         RNA_def_struct_ui_text(srna, "Distance from Camera",
898                                "Change alpha transparency based on the distance from the camera");
899         rna_def_alpha_modifier(srna);
900         rna_def_modifier_curve_common(srna, true, false);
901
902         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_DistanceFromObject", "LineStyleAlphaModifier");
903         RNA_def_struct_ui_text(srna, "Distance from Object",
904                                "Change alpha transparency based on the distance from an object");
905         rna_def_alpha_modifier(srna);
906         rna_def_modifier_curve_common(srna, true, false);
907
908         prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
909         RNA_def_property_pointer_sdna(prop, NULL, "target");
910         RNA_def_property_struct_type(prop, "Object");
911         RNA_def_property_flag(prop, PROP_EDITABLE);
912         RNA_def_property_ui_text(prop, "Target", "Target object from which the distance is measured");
913         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
914
915         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_Material", "LineStyleAlphaModifier");
916         RNA_def_struct_ui_text(srna, "Material", "Change alpha transparency based on a material attribute");
917         rna_def_alpha_modifier(srna);
918         rna_def_modifier_material_common(srna);
919         rna_def_modifier_curve_common(srna, false, false);
920
921         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_Tangent", "LineStyleAlphaModifier");
922         RNA_def_struct_ui_text(srna, "Tangent", "Alpha transparency based on the direction of the stroke");
923         rna_def_alpha_modifier(srna);
924         rna_def_modifier_curve_common(srna, false, false);
925
926         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_Noise", "LineStyleAlphaModifier");
927         RNA_def_struct_ui_text(srna, "Noise", "Alpha transparency based on random noise");
928         rna_def_alpha_modifier(srna);
929         rna_def_modifier_curve_common(srna, false, false);
930
931         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
932         RNA_def_property_float_sdna(prop, NULL, "amplitude");
933         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the noise");
934         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
935
936         prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
937         RNA_def_property_float_sdna(prop, NULL, "period");
938         RNA_def_property_ui_text(prop, "Period", "Period of the noise");
939         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
940
941         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
942         RNA_def_property_int_sdna(prop, NULL, "seed");
943         RNA_def_property_ui_text(prop, "Seed", "Seed for the noise generation");
944         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
945
946         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_CreaseAngle", "LineStyleAlphaModifier");
947         RNA_def_struct_ui_text(srna, "Crease Angle",
948                                                    "Alpha transparency based on the angle between two adjacent faces");
949         rna_def_alpha_modifier(srna);
950         rna_def_modifier_curve_common(srna, false, false);
951
952         prop = RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
953         RNA_def_property_float_sdna(prop, NULL, "min_angle");
954         RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle to modify thickness");
955         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
956
957         prop = RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
958         RNA_def_property_float_sdna(prop, NULL, "max_angle");
959         RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle to modify thickness");
960         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
961
962         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_Curvature_3D", "LineStyleAlphaModifier");
963         RNA_def_struct_ui_text(srna, "Curvature 3D",
964                                                    "Alpha transparency based on the radial curvature of 3D mesh surfaces");
965         rna_def_alpha_modifier(srna);
966         rna_def_modifier_curve_common(srna, false, false);
967
968         prop = RNA_def_property(srna, "curvature_min", PROP_FLOAT, PROP_NONE);
969         RNA_def_property_float_sdna(prop, NULL, "min_curvature");
970         RNA_def_property_range(prop, 0.0f, 10000.0f);
971         RNA_def_property_ui_text(prop, "Min Curvature", "Minimum Curvature");
972         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
973
974         prop = RNA_def_property(srna, "curvature_max", PROP_FLOAT, PROP_NONE);
975         RNA_def_property_float_sdna(prop, NULL, "max_curvature");
976         RNA_def_property_range(prop, 0.0f, 10000.0f);
977         RNA_def_property_ui_text(prop, "Max Curvature", "Maximum Curvature");
978         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
979
980         /* line thickness modifiers */
981         srna = RNA_def_struct(brna, "LineStyleThicknessModifier", "LineStyleModifier");
982         RNA_def_struct_sdna(srna, "LineStyleModifier");
983         RNA_def_struct_refine_func(srna, "rna_LineStyle_thickness_modifier_refine");
984         RNA_def_struct_path_func(srna, "rna_LineStyle_thickness_modifier_path");
985         RNA_def_struct_ui_text(srna, "Line Style Thickness Modifier", "Base type to define line thickness modifiers");
986
987         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Tangent", "LineStyleThicknessModifier");
988         RNA_def_struct_ui_text(srna, "Tangent", "Thickness based on the direction of the stroke");
989         rna_def_thickness_modifier(srna);
990         rna_def_modifier_curve_common(srna, false, false);
991
992         prop = RNA_def_property(srna, "thickness_min", PROP_FLOAT, PROP_NONE);
993         RNA_def_property_float_sdna(prop, NULL, "min_thickness");
994         RNA_def_property_range(prop, 0.0f, 10000.0f);
995         RNA_def_property_ui_text(prop, "Min Thickness",
996                                  "Minimum thickness");
997         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
998
999         prop = RNA_def_property(srna, "thickness_max", PROP_FLOAT, PROP_NONE);
1000         RNA_def_property_float_sdna(prop, NULL, "max_thickness");
1001         RNA_def_property_range(prop, 0.0f, 10000.0f);
1002         RNA_def_property_ui_text(prop, "Max Thickness", "Maximum thickness");
1003         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1004
1005         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_AlongStroke", "LineStyleThicknessModifier");
1006         RNA_def_struct_ui_text(srna, "Along Stroke", "Change line thickness along stroke");
1007         rna_def_thickness_modifier(srna);
1008         rna_def_modifier_curve_common(srna, false, true);
1009
1010         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_DistanceFromCamera", "LineStyleThicknessModifier");
1011         RNA_def_struct_ui_text(srna, "Distance from Camera", "Change line thickness based on the distance from the camera");
1012         rna_def_thickness_modifier(srna);
1013         rna_def_modifier_curve_common(srna, true, true);
1014
1015         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_DistanceFromObject", "LineStyleThicknessModifier");
1016         RNA_def_struct_ui_text(srna, "Distance from Object", "Change line thickness based on the distance from an object");
1017         rna_def_thickness_modifier(srna);
1018         rna_def_modifier_curve_common(srna, true, true);
1019
1020         prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
1021         RNA_def_property_pointer_sdna(prop, NULL, "target");
1022         RNA_def_property_struct_type(prop, "Object");
1023         RNA_def_property_flag(prop, PROP_EDITABLE);
1024         RNA_def_property_ui_text(prop, "Target", "Target object from which the distance is measured");
1025         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1026
1027         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Material", "LineStyleThicknessModifier");
1028         RNA_def_struct_ui_text(srna, "Material", "Change line thickness based on a material attribute");
1029         rna_def_thickness_modifier(srna);
1030         rna_def_modifier_material_common(srna);
1031         rna_def_modifier_curve_common(srna, false, true);
1032
1033         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Calligraphy", "LineStyleThicknessModifier");
1034         RNA_def_struct_ui_text(srna, "Calligraphy",
1035                                "Change line thickness so that stroke looks like made with a calligraphic pen");
1036         rna_def_thickness_modifier(srna);
1037
1038         prop = RNA_def_property(srna, "orientation", PROP_FLOAT, PROP_ANGLE);
1039         RNA_def_property_float_sdna(prop, NULL, "orientation");
1040         RNA_def_property_ui_text(prop, "Orientation", "Angle of the main direction");
1041         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1042
1043         prop = RNA_def_property(srna, "thickness_min", PROP_FLOAT, PROP_NONE);
1044         RNA_def_property_float_sdna(prop, NULL, "min_thickness");
1045         RNA_def_property_range(prop, 0.0f, 10000.0f);
1046         RNA_def_property_ui_text(prop, "Min Thickness",
1047                                  "Minimum thickness in the direction perpendicular to the main direction");
1048         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1049
1050         prop = RNA_def_property(srna, "thickness_max", PROP_FLOAT, PROP_NONE);
1051         RNA_def_property_float_sdna(prop, NULL, "max_thickness");
1052         RNA_def_property_range(prop, 0.0f, 10000.0f);
1053         RNA_def_property_ui_text(prop, "Max Thickness", "Maximum thickness in the main direction");
1054         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1055
1056         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Noise", "LineStyleThicknessModifier");
1057         RNA_def_struct_ui_text(srna, "Noise", "Line thickness based on random noise");
1058         rna_def_thickness_modifier(srna);
1059
1060         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
1061         RNA_def_property_float_sdna(prop, NULL, "amplitude");
1062         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the noise");
1063         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1064
1065         prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
1066         RNA_def_property_float_sdna(prop, NULL, "period");
1067         RNA_def_property_ui_text(prop, "Period", "Period of the noise");
1068         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1069
1070         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
1071         RNA_def_property_int_sdna(prop, NULL, "seed");
1072         RNA_def_property_ui_text(prop, "Seed", "Seed for the noise generation");
1073         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1074
1075         prop = RNA_def_property(srna, "use_asymmetric", PROP_BOOLEAN, PROP_NONE);
1076         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_THICKNESS_ASYMMETRIC);
1077         RNA_def_property_ui_text(prop, "Asymmetric", "Allow thickness to be assigned asymmetrically");
1078         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1079
1080         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Curvature_3D", "LineStyleThicknessModifier");
1081         RNA_def_struct_ui_text(srna, "Curvature 3D",
1082                                                    "Line thickness based on the radial curvature of 3D mesh surfaces");
1083         rna_def_thickness_modifier(srna);
1084         rna_def_modifier_curve_common(srna, false, false);
1085
1086         prop = RNA_def_property(srna, "thickness_min", PROP_FLOAT, PROP_NONE);
1087         RNA_def_property_float_sdna(prop, NULL, "min_thickness");
1088         RNA_def_property_range(prop, 0.0f, 10000.0f);
1089         RNA_def_property_ui_text(prop, "Min Thickness", "Minimum thickness");
1090         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1091
1092         prop = RNA_def_property(srna, "thickness_max", PROP_FLOAT, PROP_NONE);
1093         RNA_def_property_float_sdna(prop, NULL, "max_thickness");
1094         RNA_def_property_range(prop, 0.0f, 10000.0f);
1095         RNA_def_property_ui_text(prop, "Max Thickness", "Maximum thickness");
1096         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1097
1098         prop = RNA_def_property(srna, "curvature_min", PROP_FLOAT, PROP_NONE);
1099         RNA_def_property_float_sdna(prop, NULL, "min_curvature");
1100         RNA_def_property_range(prop, 0.0f, 10000.0f);
1101         RNA_def_property_ui_text(prop, "Min Curvature", "Minimum Curvature");
1102         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1103
1104         prop = RNA_def_property(srna, "curvature_max", PROP_FLOAT, PROP_NONE);
1105         RNA_def_property_float_sdna(prop, NULL, "max_curvature");
1106         RNA_def_property_range(prop, 0.0f, 10000.0f);
1107         RNA_def_property_ui_text(prop, "Max Curvature", "Maximum Curvature");
1108         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1109
1110         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_CreaseAngle", "LineStyleThicknessModifier");
1111         RNA_def_struct_ui_text(srna, "Crease Angle",
1112                                "Line thickness based on the angle between two adjacent faces");
1113         rna_def_thickness_modifier(srna);
1114         rna_def_modifier_curve_common(srna, false, false);
1115
1116         prop = RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
1117         RNA_def_property_float_sdna(prop, NULL, "min_angle");
1118         RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle to modify thickness");
1119         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1120
1121         prop = RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
1122         RNA_def_property_float_sdna(prop, NULL, "max_angle");
1123         RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle to modify thickness");
1124         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1125
1126         prop = RNA_def_property(srna, "thickness_min", PROP_FLOAT, PROP_NONE);
1127         RNA_def_property_float_sdna(prop, NULL, "min_thickness");
1128         RNA_def_property_range(prop, 0.0f, 10000.0f);
1129         RNA_def_property_ui_text(prop, "Min Thickness", "Minimum thickness");
1130         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1131
1132         prop = RNA_def_property(srna, "thickness_max", PROP_FLOAT, PROP_NONE);
1133         RNA_def_property_float_sdna(prop, NULL, "max_thickness");
1134         RNA_def_property_range(prop, 0.0f, 10000.0f);
1135         RNA_def_property_ui_text(prop, "Max Thickness", "Maximum thickness");
1136         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1137
1138         /* geometry modifiers */
1139
1140         srna = RNA_def_struct(brna, "LineStyleGeometryModifier", "LineStyleModifier");
1141         RNA_def_struct_sdna(srna, "LineStyleModifier");
1142         RNA_def_struct_refine_func(srna, "rna_LineStyle_geometry_modifier_refine");
1143         RNA_def_struct_path_func(srna, "rna_LineStyle_geometry_modifier_path");
1144         RNA_def_struct_ui_text(srna, "Line Style Geometry Modifier", "Base type to define stroke geometry modifiers");
1145
1146         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Sampling", "LineStyleGeometryModifier");
1147         RNA_def_struct_ui_text(srna, "Sampling",
1148                                "Specify a new sampling value that determines the resolution of stroke polylines");
1149         rna_def_geometry_modifier(srna);
1150
1151         prop = RNA_def_property(srna, "sampling", PROP_FLOAT, PROP_NONE);
1152         RNA_def_property_float_sdna(prop, NULL, "sampling");
1153         RNA_def_property_range(prop, 0.0f, 10000.0f);
1154         RNA_def_property_ui_text(prop, "Sampling", "New sampling value to be used for subsequent modifiers");
1155         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1156
1157         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_BezierCurve", "LineStyleGeometryModifier");
1158         RNA_def_struct_ui_text(srna, "Bezier Curve",
1159                                "Replace stroke backbone geometry by a Bezier curve approximation of the "
1160                                "original backbone geometry");
1161         rna_def_geometry_modifier(srna);
1162
1163         prop = RNA_def_property(srna, "error", PROP_FLOAT, PROP_NONE);
1164         RNA_def_property_float_sdna(prop, NULL, "error");
1165         RNA_def_property_ui_text(prop, "Error",
1166                                  "Maximum distance allowed between the new Bezier curve and the "
1167                                  "original backbone geometry");
1168         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1169
1170         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_SinusDisplacement", "LineStyleGeometryModifier");
1171         RNA_def_struct_ui_text(srna, "Sinus Displacement", "Add sinus displacement to stroke backbone geometry");
1172         rna_def_geometry_modifier(srna);
1173
1174         prop = RNA_def_property(srna, "wavelength", PROP_FLOAT, PROP_NONE);
1175         RNA_def_property_float_sdna(prop, NULL, "wavelength");
1176         RNA_def_property_ui_text(prop, "Wavelength", "Wavelength of the sinus displacement");
1177         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1178
1179         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
1180         RNA_def_property_float_sdna(prop, NULL, "amplitude");
1181         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the sinus displacement");
1182         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1183
1184         prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
1185         RNA_def_property_float_sdna(prop, NULL, "phase");
1186         RNA_def_property_ui_text(prop, "Phase", "Phase of the sinus displacement");
1187         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1188
1189         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_SpatialNoise", "LineStyleGeometryModifier");
1190         RNA_def_struct_ui_text(srna, "Spatial Noise", "Add spatial noise to stroke backbone geometry");
1191         rna_def_geometry_modifier(srna);
1192
1193         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
1194         RNA_def_property_float_sdna(prop, NULL, "amplitude");
1195         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the spatial noise");
1196         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1197
1198         prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
1199         RNA_def_property_float_sdna(prop, NULL, "scale");
1200         RNA_def_property_ui_text(prop, "Scale", "Scale of the spatial noise");
1201         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1202
1203         prop = RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
1204         RNA_def_property_int_sdna(prop, NULL, "octaves");
1205         RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the spatial noise)");
1206         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1207
1208         prop = RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
1209         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_SPATIAL_NOISE_SMOOTH);
1210         RNA_def_property_ui_text(prop, "Smooth", "If true, the spatial noise is smooth");
1211         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1212
1213         prop = RNA_def_property(srna, "use_pure_random", PROP_BOOLEAN, PROP_NONE);
1214         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_SPATIAL_NOISE_PURERANDOM);
1215         RNA_def_property_ui_text(prop, "Pure Random", "If true, the spatial noise does not show any coherence");
1216         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1217
1218         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_PerlinNoise1D", "LineStyleGeometryModifier");
1219         RNA_def_struct_ui_text(srna, "Perlin Noise 1D", "Add one-dimensional Perlin noise to stroke backbone geometry");
1220         rna_def_geometry_modifier(srna);
1221
1222         prop = RNA_def_property(srna, "frequency", PROP_FLOAT, PROP_NONE);
1223         RNA_def_property_float_sdna(prop, NULL, "frequency");
1224         RNA_def_property_ui_text(prop, "Frequency", "Frequency of the Perlin noise");
1225         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1226
1227         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
1228         RNA_def_property_float_sdna(prop, NULL, "amplitude");
1229         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the Perlin noise");
1230         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1231
1232         prop = RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
1233         RNA_def_property_int_sdna(prop, NULL, "octaves");
1234         RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise)");
1235         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1236
1237         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
1238         RNA_def_property_float_sdna(prop, NULL, "angle");
1239         RNA_def_property_ui_text(prop, "Angle", "Displacement direction");
1240         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1241
1242         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
1243         RNA_def_property_int_sdna(prop, NULL, "seed");
1244         RNA_def_property_ui_text(prop, "Seed",
1245                                  "Seed for random number generation (if negative, time is used as a seed instead)");
1246         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1247
1248         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_PerlinNoise2D", "LineStyleGeometryModifier");
1249         RNA_def_struct_ui_text(srna, "Perlin Noise 2D", "Add two-dimensional Perlin noise to stroke backbone geometry");
1250         rna_def_geometry_modifier(srna);
1251
1252         prop = RNA_def_property(srna, "frequency", PROP_FLOAT, PROP_NONE);
1253         RNA_def_property_float_sdna(prop, NULL, "frequency");
1254         RNA_def_property_ui_text(prop, "Frequency", "Frequency of the Perlin noise");
1255         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1256
1257         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
1258         RNA_def_property_float_sdna(prop, NULL, "amplitude");
1259         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the Perlin noise");
1260         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1261
1262         prop = RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
1263         RNA_def_property_int_sdna(prop, NULL, "octaves");
1264         RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise)");
1265         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1266
1267         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
1268         RNA_def_property_float_sdna(prop, NULL, "angle");
1269         RNA_def_property_ui_text(prop, "Angle", "Displacement direction");
1270         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1271
1272         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
1273         RNA_def_property_int_sdna(prop, NULL, "seed");
1274         RNA_def_property_ui_text(prop, "Seed",
1275                                  "Seed for random number generation (if negative, time is used as a seed instead)");
1276         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1277
1278         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_BackboneStretcher", "LineStyleGeometryModifier");
1279         RNA_def_struct_ui_text(srna, "Backbone Stretcher", "Stretch the beginning and the end of stroke backbone");
1280         rna_def_geometry_modifier(srna);
1281
1282         prop = RNA_def_property(srna, "backbone_length", PROP_FLOAT, PROP_NONE);
1283         RNA_def_property_float_sdna(prop, NULL, "backbone_length");
1284         RNA_def_property_ui_text(prop, "Backbone Length", "Amount of backbone stretching");
1285         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1286
1287         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_TipRemover", "LineStyleGeometryModifier");
1288         RNA_def_struct_ui_text(srna, "Tip Remover",
1289                                "Remove a piece of stroke at the beginning and the end of stroke backbone");
1290         rna_def_geometry_modifier(srna);
1291
1292         prop = RNA_def_property(srna, "tip_length", PROP_FLOAT, PROP_NONE);
1293         RNA_def_property_float_sdna(prop, NULL, "tip_length");
1294         RNA_def_property_ui_text(prop, "Tip Length", "Length of tips to be removed");
1295         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1296
1297         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Polygonalization", "LineStyleGeometryModifier");
1298         RNA_def_struct_ui_text(srna, "Polygonalization", "Modify the stroke geometry so that it looks more 'polygonal'");
1299         rna_def_geometry_modifier(srna);
1300
1301         prop = RNA_def_property(srna, "error", PROP_FLOAT, PROP_NONE);
1302         RNA_def_property_float_sdna(prop, NULL, "error");
1303         RNA_def_property_ui_text(prop, "Error",
1304                                  "Maximum distance between the original stroke and its polygonal approximation");
1305         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1306
1307         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_GuidingLines", "LineStyleGeometryModifier");
1308         RNA_def_struct_ui_text(srna, "Guiding Lines",
1309                                "Modify the stroke geometry so that it corresponds to its main direction line");
1310         rna_def_geometry_modifier(srna);
1311
1312         prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
1313         RNA_def_property_float_sdna(prop, NULL, "offset");
1314         RNA_def_property_ui_text(prop, "Offset",
1315                                  "Displacement that is applied to the main direction line along its normal");
1316         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1317
1318         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Blueprint", "LineStyleGeometryModifier");
1319         RNA_def_struct_ui_text(srna, "Blueprint",
1320                                "Produce a blueprint using circular, elliptic, and square contour strokes");
1321         rna_def_geometry_modifier(srna);
1322
1323         prop = RNA_def_property(srna, "shape", PROP_ENUM, PROP_NONE);
1324         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
1325         RNA_def_property_enum_items(prop, blueprint_shape_items);
1326         RNA_def_property_ui_text(prop, "Shape", "Select the shape of blueprint contour strokes");
1327         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1328
1329         prop = RNA_def_property(srna, "rounds", PROP_INT, PROP_UNSIGNED);
1330         RNA_def_property_int_sdna(prop, NULL, "rounds");
1331         RNA_def_property_range(prop, 1, 1000);
1332         RNA_def_property_ui_text(prop, "Rounds", "Number of rounds in contour strokes");
1333         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1334
1335         prop = RNA_def_property(srna, "backbone_length", PROP_FLOAT, PROP_NONE);
1336         RNA_def_property_float_sdna(prop, NULL, "backbone_length");
1337         RNA_def_property_ui_text(prop, "Backbone Length", "Amount of backbone stretching");
1338         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1339
1340         prop = RNA_def_property(srna, "random_radius", PROP_INT, PROP_UNSIGNED);
1341         RNA_def_property_int_sdna(prop, NULL, "random_radius");
1342         RNA_def_property_ui_text(prop, "Random Radius", "Randomness of the radius");
1343         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1344
1345         prop = RNA_def_property(srna, "random_center", PROP_INT, PROP_UNSIGNED);
1346         RNA_def_property_int_sdna(prop, NULL, "random_center");
1347         RNA_def_property_ui_text(prop, "Random Center", "Randomness of the center");
1348         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1349
1350         prop = RNA_def_property(srna, "random_backbone", PROP_INT, PROP_UNSIGNED);
1351         RNA_def_property_int_sdna(prop, NULL, "random_backbone");
1352         RNA_def_property_ui_text(prop, "Random Backbone", "Randomness of the backbone stretching");
1353         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1354
1355         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_2DOffset", "LineStyleGeometryModifier");
1356         RNA_def_struct_ui_text(srna, "2D Offset", "Add two-dimensional offsets to stroke backbone geometry");
1357         rna_def_geometry_modifier(srna);
1358
1359         prop = RNA_def_property(srna, "start", PROP_FLOAT, PROP_NONE);
1360         RNA_def_property_float_sdna(prop, NULL, "start");
1361         RNA_def_property_ui_text(prop, "Start", "Displacement that is applied from the beginning of the stroke");
1362         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1363
1364         prop = RNA_def_property(srna, "end", PROP_FLOAT, PROP_NONE);
1365         RNA_def_property_float_sdna(prop, NULL, "end");
1366         RNA_def_property_ui_text(prop, "End", "Displacement that is applied from the end of the stroke");
1367         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1368
1369         prop = RNA_def_property(srna, "x", PROP_FLOAT, PROP_NONE);
1370         RNA_def_property_float_sdna(prop, NULL, "x");
1371         RNA_def_property_ui_text(prop, "X", "Displacement that is applied to the X coordinates of stroke vertices");
1372         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1373
1374         prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE);
1375         RNA_def_property_float_sdna(prop, NULL, "y");
1376         RNA_def_property_ui_text(prop, "Y", "Displacement that is applied to the Y coordinates of stroke vertices");
1377         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1378
1379         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_2DTransform", "LineStyleGeometryModifier");
1380         RNA_def_struct_ui_text(srna, "2D Transform",
1381                                "Apply two-dimensional scaling and rotation to stroke backbone geometry");
1382         rna_def_geometry_modifier(srna);
1383
1384         prop = RNA_def_property(srna, "pivot", PROP_ENUM, PROP_NONE);
1385         RNA_def_property_enum_sdna(prop, NULL, "pivot");
1386         RNA_def_property_enum_items(prop, transform_pivot_items);
1387         RNA_def_property_ui_text(prop, "Pivot", "Pivot of scaling and rotation operations");
1388         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1389
1390         prop = RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_NONE);
1391         RNA_def_property_float_sdna(prop, NULL, "scale_x");
1392         RNA_def_property_flag(prop, PROP_PROPORTIONAL);
1393         RNA_def_property_ui_text(prop, "Scale X", "Scaling factor that is applied along the X axis");
1394         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1395
1396         prop = RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_NONE);
1397         RNA_def_property_float_sdna(prop, NULL, "scale_y");
1398         RNA_def_property_flag(prop, PROP_PROPORTIONAL);
1399         RNA_def_property_ui_text(prop, "Scale Y", "Scaling factor that is applied along the Y axis");
1400         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1401
1402         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
1403         RNA_def_property_float_sdna(prop, NULL, "angle");
1404         RNA_def_property_ui_text(prop, "Rotation Angle", "Rotation angle");
1405         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1406
1407         prop = RNA_def_property(srna, "pivot_u", PROP_FLOAT, PROP_FACTOR);
1408         RNA_def_property_float_sdna(prop, NULL, "pivot_u");
1409         RNA_def_property_range(prop, 0.f, 1.f);
1410         RNA_def_property_ui_text(prop, "Stroke Point Parameter",
1411                                  "Pivot in terms of the stroke point parameter u (0 <= u <= 1)");
1412         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1413
1414         prop = RNA_def_property(srna, "pivot_x", PROP_FLOAT, PROP_NONE);
1415         RNA_def_property_float_sdna(prop, NULL, "pivot_x");
1416         RNA_def_property_ui_text(prop, "Pivot X", "2D X coordinate of the absolute pivot");
1417         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1418
1419         prop = RNA_def_property(srna, "pivot_y", PROP_FLOAT, PROP_NONE);
1420         RNA_def_property_float_sdna(prop, NULL, "pivot_y");
1421         RNA_def_property_ui_text(prop, "Pivot Y", "2D Y coordinate of the absolute pivot");
1422         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1423
1424         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Simplification", "LineStyleGeometryModifier");
1425         RNA_def_struct_ui_text(srna, "Simplification", "Simplify the stroke set");
1426         rna_def_geometry_modifier(srna);
1427
1428         prop = RNA_def_property(srna, "tolerance", PROP_FLOAT, PROP_NONE);
1429         RNA_def_property_float_sdna(prop, NULL, "tolerance");
1430         RNA_def_property_ui_text(prop, "Tolerance", "Distance below which segments will be merged");
1431         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1432 }
1433
1434 static void rna_def_freestyle_color_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
1435 {
1436         StructRNA *srna;
1437         FunctionRNA *func;
1438         PropertyRNA *parm;
1439
1440         RNA_def_property_srna(cprop, "LineStyleColorModifiers");
1441         srna = RNA_def_struct(brna, "LineStyleColorModifiers", NULL);
1442         RNA_def_struct_sdna(srna, "FreestyleLineStyle");
1443         RNA_def_struct_ui_text(srna, "Color Modifiers", "Color modifiers for changing line colors");
1444
1445         func = RNA_def_function(srna, "new", "rna_LineStyle_color_modifier_add");
1446         RNA_def_function_ui_description(func, "Add a color modifier to line style");
1447         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1448         parm = RNA_def_string(func, "name", "ColorModifier", 0, "", "New name for the color modifier (not unique)");
1449         RNA_def_property_flag(parm, PROP_REQUIRED);
1450         parm = RNA_def_enum(func, "type", linestyle_color_modifier_type_items, 0, "", "Color modifier type to add");
1451         RNA_def_property_flag(parm, PROP_REQUIRED);
1452         parm = RNA_def_pointer(func, "modifier", "LineStyleColorModifier", "", "Newly added color modifier");
1453         RNA_def_function_return(func, parm);
1454
1455         func = RNA_def_function(srna, "remove", "rna_LineStyle_color_modifier_remove");
1456         RNA_def_function_ui_description(func, "Remove a color modifier from line style");
1457         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1458         parm = RNA_def_pointer(func, "modifier", "LineStyleColorModifier", "", "Color modifier to remove");
1459         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1460         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1461 }
1462
1463 static void rna_def_freestyle_alpha_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
1464 {
1465         StructRNA *srna;
1466         FunctionRNA *func;
1467         PropertyRNA *parm;
1468
1469         RNA_def_property_srna(cprop, "LineStyleAlphaModifiers");
1470         srna = RNA_def_struct(brna, "LineStyleAlphaModifiers", NULL);
1471         RNA_def_struct_sdna(srna, "FreestyleLineStyle");
1472         RNA_def_struct_ui_text(srna, "Alpha Modifiers", "Alpha modifiers for changing line alphas");
1473
1474         func = RNA_def_function(srna, "new", "rna_LineStyle_alpha_modifier_add");
1475         RNA_def_function_ui_description(func, "Add a alpha modifier to line style");
1476         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1477         parm = RNA_def_string(func, "name", "AlphaModifier", 0, "", "New name for the alpha modifier (not unique)");
1478         RNA_def_property_flag(parm, PROP_REQUIRED);
1479         parm = RNA_def_enum(func, "type", linestyle_alpha_modifier_type_items, 0, "", "Alpha modifier type to add");
1480         RNA_def_property_flag(parm, PROP_REQUIRED);
1481         parm = RNA_def_pointer(func, "modifier", "LineStyleAlphaModifier", "", "Newly added alpha modifier");
1482         RNA_def_function_return(func, parm);
1483
1484         func = RNA_def_function(srna, "remove", "rna_LineStyle_alpha_modifier_remove");
1485         RNA_def_function_ui_description(func, "Remove a alpha modifier from line style");
1486         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1487         parm = RNA_def_pointer(func, "modifier", "LineStyleAlphaModifier", "", "Alpha modifier to remove");
1488         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1489         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1490 }
1491
1492 static void rna_def_freestyle_thickness_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
1493 {
1494         StructRNA *srna;
1495         FunctionRNA *func;
1496         PropertyRNA *parm;
1497
1498         RNA_def_property_srna(cprop, "LineStyleThicknessModifiers");
1499         srna = RNA_def_struct(brna, "LineStyleThicknessModifiers", NULL);
1500         RNA_def_struct_sdna(srna, "FreestyleLineStyle");
1501         RNA_def_struct_ui_text(srna, "Thickness Modifiers", "Thickness modifiers for changing line thicknesss");
1502
1503         func = RNA_def_function(srna, "new", "rna_LineStyle_thickness_modifier_add");
1504         RNA_def_function_ui_description(func, "Add a thickness modifier to line style");
1505         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1506         parm = RNA_def_string(func, "name", "ThicknessModifier", 0, "", "New name for the thickness modifier (not unique)");
1507         RNA_def_property_flag(parm, PROP_REQUIRED);
1508         parm = RNA_def_enum(func, "type", linestyle_thickness_modifier_type_items, 0, "", "Thickness modifier type to add");
1509         RNA_def_property_flag(parm, PROP_REQUIRED);
1510         parm = RNA_def_pointer(func, "modifier", "LineStyleThicknessModifier", "", "Newly added thickness modifier");
1511         RNA_def_function_return(func, parm);
1512
1513         func = RNA_def_function(srna, "remove", "rna_LineStyle_thickness_modifier_remove");
1514         RNA_def_function_ui_description(func, "Remove a thickness modifier from line style");
1515         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1516         parm = RNA_def_pointer(func, "modifier", "LineStyleThicknessModifier", "", "Thickness modifier to remove");
1517         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1518         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1519 }
1520
1521 static void rna_def_freestyle_geometry_modifiers(BlenderRNA *brna, PropertyRNA *cprop)
1522 {
1523         StructRNA *srna;
1524         FunctionRNA *func;
1525         PropertyRNA *parm;
1526
1527         RNA_def_property_srna(cprop, "LineStyleGeometryModifiers");
1528         srna = RNA_def_struct(brna, "LineStyleGeometryModifiers", NULL);
1529         RNA_def_struct_sdna(srna, "FreestyleLineStyle");
1530         RNA_def_struct_ui_text(srna, "Geometry Modifiers", "Geometry modifiers for changing line geometrys");
1531
1532         func = RNA_def_function(srna, "new", "rna_LineStyle_geometry_modifier_add");
1533         RNA_def_function_ui_description(func, "Add a geometry modifier to line style");
1534         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1535         parm = RNA_def_string(func, "name", "GeometryModifier", 0, "", "New name for the geometry modifier (not unique)");
1536         RNA_def_property_flag(parm, PROP_REQUIRED);
1537         parm = RNA_def_enum(func, "type", linestyle_geometry_modifier_type_items, 0, "", "Geometry modifier type to add");
1538         RNA_def_property_flag(parm, PROP_REQUIRED);
1539         parm = RNA_def_pointer(func, "modifier", "LineStyleGeometryModifier", "", "Newly added geometry modifier");
1540         RNA_def_function_return(func, parm);
1541
1542         func = RNA_def_function(srna, "remove", "rna_LineStyle_geometry_modifier_remove");
1543         RNA_def_function_ui_description(func, "Remove a geometry modifier from line style");
1544         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1545         parm = RNA_def_pointer(func, "modifier", "LineStyleGeometryModifier", "", "Geometry modifier to remove");
1546         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1547         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1548 }
1549
1550 static void rna_def_linestyle(BlenderRNA *brna)
1551 {
1552         StructRNA *srna;
1553         PropertyRNA *prop;
1554
1555         static EnumPropertyItem panel_items[] = {
1556                 {LS_PANEL_STROKES, "STROKES", 0, "Strokes", "Show the panel for stroke construction"},
1557                 {LS_PANEL_COLOR, "COLOR", 0, "Color", "Show the panel for line color options"},
1558                 {LS_PANEL_ALPHA, "ALPHA", 0, "Alpha", "Show the panel for alpha transparency options"},
1559                 {LS_PANEL_THICKNESS, "THICKNESS", 0, "Thickness", "Show the panel for line thickness options"},
1560                 {LS_PANEL_GEOMETRY, "GEOMETRY", 0, "Geometry", "Show the panel for stroke geometry options"},
1561                 {LS_PANEL_TEXTURE, "TEXTURE", 0, "Texture", "Show the panel for stroke texture options"},
1562 #if 0 /* hidden for now */
1563                 {LS_PANEL_MISC, "MISC", 0, "Misc", "Show the panel for miscellaneous options"},
1564 #endif
1565                 {0, NULL, 0, NULL, NULL}
1566         };
1567         static EnumPropertyItem chaining_items[] = {
1568                 {LS_CHAINING_PLAIN, "PLAIN", 0, "Plain", "Plain chaining"},
1569                 {LS_CHAINING_SKETCHY, "SKETCHY", 0, "Sketchy", "Sketchy chaining with a multiple touch"},
1570                 {0, NULL, 0, NULL, NULL}
1571         };
1572         static EnumPropertyItem cap_items[] = {
1573                 {LS_CAPS_BUTT, "BUTT", 0, "Butt", "Butt cap (flat)"},
1574                 {LS_CAPS_ROUND, "ROUND", 0, "Round", "Round cap (half-circle)"},
1575                 {LS_CAPS_SQUARE, "SQUARE", 0, "Square", "Square cap (flat and extended)"},
1576                 {0, NULL, 0, NULL, NULL}
1577         };
1578         static EnumPropertyItem thickness_position_items[] = {
1579                 {LS_THICKNESS_CENTER, "CENTER", 0, "Center", "Silhouettes and border edges are centered along stroke geometry"},
1580                 {LS_THICKNESS_INSIDE, "INSIDE", 0, "Inside", "Silhouettes and border edges are drawn inside of stroke geometry"},
1581                 {LS_THICKNESS_OUTSIDE, "OUTSIDE", 0, "Outside", "Silhouettes and border edges are drawn outside of stroke geometry"},
1582                 {LS_THICKNESS_RELATIVE, "RELATIVE", 0, "Relative", "Silhouettes and border edges are shifted by a user-defined ratio"},
1583                 {0, NULL, 0, NULL, NULL}
1584         };
1585         static EnumPropertyItem sort_key_items[] = {
1586                 {LS_SORT_KEY_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", 0, "Distance from Camera", "Sort by distance from camera (closer lines lie on top of further lines)"},
1587                 {LS_SORT_KEY_2D_LENGTH, "2D_LENGTH", 0, "2D Length", "Sort by curvilinear 2D length (longer lines lie on top of shorter lines)"},
1588                 {LS_SORT_KEY_PROJECTED_X, "PROJECTED_X", 0, "Projected X", "Sort by the projected X value in the image coordinate system"},
1589                 {LS_SORT_KEY_PROJECTED_Y, "PROJECTED_Y", 0, "Projected Y", "Sort by the projected Y value in the image coordinate system"},
1590                 {0, NULL, 0, NULL, NULL}
1591         };
1592         static EnumPropertyItem sort_order_items[] = {
1593                 {0, "DEFAULT", 0, "Default", "Default order of the sort key"},
1594                 {LS_REVERSE_ORDER, "REVERSE", 0, "Reverse", "Reverse order"},
1595                 {0, NULL, 0, NULL, NULL}
1596         };
1597         static EnumPropertyItem integration_type_items[] = {
1598                 {LS_INTEGRATION_MEAN, "MEAN", 0, "Mean", "The value computed for the chain is the mean of the values obtained for chain vertices"},
1599                 {LS_INTEGRATION_MIN, "MIN", 0, "Min", "The value computed for the chain is the minimum of the values obtained for chain vertices"},
1600                 {LS_INTEGRATION_MAX, "MAX", 0, "Max", "The value computed for the chain is the maximum of the values obtained for chain vertices"},
1601                 {LS_INTEGRATION_FIRST, "FIRST", 0, "First", "The value computed for the chain is the value obtained for the first chain vertex"},
1602                 {LS_INTEGRATION_LAST, "LAST", 0, "Last", "The value computed for the chain is the value obtained for the last chain vertex"},
1603                 {0, NULL, 0, NULL, NULL}
1604         };
1605
1606         srna = RNA_def_struct(brna, "FreestyleLineStyle", "ID");
1607         RNA_def_struct_ui_text(srna, "Freestyle Line Style", "Freestyle line style, reusable by multiple line sets");
1608         RNA_def_struct_ui_icon(srna, ICON_LINE_DATA);
1609
1610         rna_def_mtex_common(brna, srna, "rna_LineStyle_mtex_begin", "rna_LineStyle_active_texture_get",
1611                             "rna_LineStyle_active_texture_set", NULL, "LineStyleTextureSlot", "LineStyleTextureSlots",
1612                             "rna_LineStyle_update", "rna_LineStyle_update");
1613
1614         prop = RNA_def_property(srna, "panel", PROP_ENUM, PROP_NONE);
1615         RNA_def_property_enum_bitflag_sdna(prop, NULL, "panel");
1616         RNA_def_property_enum_items(prop, panel_items);
1617         RNA_def_property_ui_text(prop, "Panel", "Select the property panel to be shown");
1618
1619         prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
1620         RNA_def_property_float_sdna(prop, NULL, "r");
1621         RNA_def_property_array(prop, 3);
1622         RNA_def_property_ui_text(prop, "Color", "Base line color, possibly modified by line color modifiers");
1623         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1624
1625         prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_FACTOR);
1626         RNA_def_property_float_sdna(prop, NULL, "alpha");
1627         RNA_def_property_range(prop, 0.0f, 1.0f);
1628         RNA_def_property_ui_text(prop, "Alpha Transparency",
1629                                  "Base alpha transparency, possibly modified by alpha transparency modifiers");
1630         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1631
1632         prop = RNA_def_property(srna, "thickness", PROP_FLOAT, PROP_NONE);
1633         RNA_def_property_float_sdna(prop, NULL, "thickness");
1634         RNA_def_property_range(prop, 0.0f, 10000.0f);
1635         RNA_def_property_ui_text(prop, "Thickness", "Base line thickness, possibly modified by line thickness modifiers");
1636         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1637
1638         prop = RNA_def_property(srna, "thickness_position", PROP_ENUM, PROP_NONE);
1639         RNA_def_property_enum_bitflag_sdna(prop, NULL, "thickness_position");
1640         RNA_def_property_enum_items(prop, thickness_position_items);
1641         RNA_def_property_ui_text(prop, "Thickness Position",
1642                                        "Thickness position of silhouettes and border edges (applicable when plain chaining is used with the Same Object option)");
1643         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1644
1645         prop = RNA_def_property(srna, "thickness_ratio", PROP_FLOAT, PROP_FACTOR);
1646         RNA_def_property_float_sdna(prop, NULL, "thickness_ratio");
1647         RNA_def_property_range(prop, 0.f, 1.f);
1648         RNA_def_property_ui_text(prop, "Thickness Ratio",
1649                                  "A number between 0 (inside) and 1 (outside) specifying the relative position of "
1650                                  "stroke thickness");
1651         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1652
1653         prop = RNA_def_property(srna, "color_modifiers", PROP_COLLECTION, PROP_NONE);
1654         RNA_def_property_collection_sdna(prop, NULL, "color_modifiers", NULL);
1655         RNA_def_property_struct_type(prop, "LineStyleColorModifier");
1656         RNA_def_property_ui_text(prop, "Color Modifiers", "List of line color modifiers");
1657         rna_def_freestyle_color_modifiers(brna, prop);
1658
1659         prop = RNA_def_property(srna, "alpha_modifiers", PROP_COLLECTION, PROP_NONE);
1660         RNA_def_property_collection_sdna(prop, NULL, "alpha_modifiers", NULL);
1661         RNA_def_property_struct_type(prop, "LineStyleAlphaModifier");
1662         RNA_def_property_ui_text(prop, "Alpha Modifiers", "List of alpha transparency modifiers");
1663         rna_def_freestyle_alpha_modifiers(brna, prop);
1664
1665         prop = RNA_def_property(srna, "thickness_modifiers", PROP_COLLECTION, PROP_NONE);
1666         RNA_def_property_collection_sdna(prop, NULL, "thickness_modifiers", NULL);
1667         RNA_def_property_struct_type(prop, "LineStyleThicknessModifier");
1668         RNA_def_property_ui_text(prop, "Thickness Modifiers", "List of line thickness modifiers");
1669         rna_def_freestyle_thickness_modifiers(brna, prop);
1670
1671         prop = RNA_def_property(srna, "geometry_modifiers", PROP_COLLECTION, PROP_NONE);
1672         RNA_def_property_collection_sdna(prop, NULL, "geometry_modifiers", NULL);
1673         RNA_def_property_struct_type(prop, "LineStyleGeometryModifier");
1674         RNA_def_property_ui_text(prop, "Geometry Modifiers", "List of stroke geometry modifiers");
1675         rna_def_freestyle_geometry_modifiers(brna, prop);
1676
1677         prop = RNA_def_property(srna, "use_chaining", PROP_BOOLEAN, PROP_NONE);
1678         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", LS_NO_CHAINING);
1679         RNA_def_property_ui_text(prop, "Chaining", "Enable chaining of feature edges");
1680         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1681
1682         prop = RNA_def_property(srna, "chaining", PROP_ENUM, PROP_NONE);
1683         RNA_def_property_enum_sdna(prop, NULL, "chaining");
1684         RNA_def_property_enum_items(prop, chaining_items);
1685         RNA_def_property_ui_text(prop, "Chaining Method", "Select the way how feature edges are jointed to form chains");
1686         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1687
1688         prop = RNA_def_property(srna, "rounds", PROP_INT, PROP_UNSIGNED);
1689         RNA_def_property_int_sdna(prop, NULL, "rounds");
1690         RNA_def_property_range(prop, 1, 1000);
1691         RNA_def_property_ui_text(prop, "Rounds", "Number of rounds in a sketchy multiple touch");
1692         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1693
1694         prop = RNA_def_property(srna, "use_same_object", PROP_BOOLEAN, PROP_NONE);
1695         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SAME_OBJECT);
1696         RNA_def_property_ui_text(prop, "Same Object", "If true, only feature edges of the same object are joined");
1697         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1698
1699         prop = RNA_def_property(srna, "use_split_length", PROP_BOOLEAN, PROP_NONE);
1700         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SPLIT_LENGTH);
1701         RNA_def_property_ui_text(prop, "Use Split Length", "Enable chain splitting by curvilinear 2D length");
1702         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1703
1704         prop = RNA_def_property(srna, "split_length", PROP_FLOAT, PROP_NONE);
1705         RNA_def_property_float_sdna(prop, NULL, "split_length");
1706         RNA_def_property_range(prop, 0.0f, 10000.0f);
1707         RNA_def_property_ui_text(prop, "Split Length", "Curvilinear 2D length for chain splitting");
1708         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1709
1710         prop = RNA_def_property(srna, "use_angle_min", PROP_BOOLEAN, PROP_NONE);
1711         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MIN_2D_ANGLE);
1712         RNA_def_property_ui_text(prop, "Use Min 2D Angle",
1713                                  "Split chains at points with angles smaller than the minimum 2D angle");
1714         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1715
1716         prop = RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
1717         RNA_def_property_float_sdna(prop, NULL, "min_angle");
1718         RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
1719         RNA_def_property_ui_text(prop, "Min 2D Angle", "Minimum 2D angle for splitting chains");
1720         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1721
1722         prop = RNA_def_property(srna, "use_angle_max", PROP_BOOLEAN, PROP_NONE);
1723         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MAX_2D_ANGLE);
1724         RNA_def_property_ui_text(prop, "Use Max 2D Angle",
1725                                  "Split chains at points with angles larger than the maximum 2D angle");
1726         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1727
1728         prop = RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
1729         RNA_def_property_float_sdna(prop, NULL, "max_angle");
1730         RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
1731         RNA_def_property_ui_text(prop, "Max 2D Angle", "Maximum 2D angle for splitting chains");
1732         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1733
1734         prop = RNA_def_property(srna, "use_length_min", PROP_BOOLEAN, PROP_NONE);
1735         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MIN_2D_LENGTH);
1736         RNA_def_property_ui_text(prop, "Use Min 2D Length", "Enable the selection of chains by a minimum 2D length");
1737         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1738
1739         prop = RNA_def_property(srna, "length_min", PROP_FLOAT, PROP_NONE);
1740         RNA_def_property_float_sdna(prop, NULL, "min_length");
1741         RNA_def_property_range(prop, 0.0f, 10000.0f);
1742         RNA_def_property_ui_text(prop, "Min 2D Length", "Minimum curvilinear 2D length for the selection of chains");
1743         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1744
1745         prop = RNA_def_property(srna, "use_length_max", PROP_BOOLEAN, PROP_NONE);
1746         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MAX_2D_LENGTH);
1747         RNA_def_property_ui_text(prop, "Use Max 2D Length", "Enable the selection of chains by a maximum 2D length");
1748         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1749
1750         prop = RNA_def_property(srna, "length_max", PROP_FLOAT, PROP_NONE);
1751         RNA_def_property_float_sdna(prop, NULL, "max_length");
1752         RNA_def_property_range(prop, 0.0f, 10000.0f);
1753         RNA_def_property_ui_text(prop, "Max 2D Length", "Maximum curvilinear 2D length for the selection of chains");
1754         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1755
1756         prop = RNA_def_property(srna, "use_chain_count", PROP_BOOLEAN, PROP_NONE);
1757         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_CHAIN_COUNT);
1758         RNA_def_property_ui_text(prop, "Use Chain Count", "Enable the selection of first N chains");
1759         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1760
1761         prop = RNA_def_property(srna, "chain_count", PROP_INT, PROP_UNSIGNED);
1762         RNA_def_property_int_sdna(prop, NULL, "chain_count");
1763         RNA_def_property_ui_text(prop, "Chain Count", "Chain count for the selection of first N chains");
1764         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1765
1766         prop = RNA_def_property(srna, "use_split_pattern", PROP_BOOLEAN, PROP_NONE);
1767         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SPLIT_PATTERN);
1768         RNA_def_property_ui_text(prop, "Use Split Pattern", "Enable chain splitting by dashed line patterns");
1769         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1770
1771         prop = RNA_def_property(srna, "split_dash1", PROP_INT, PROP_UNSIGNED);
1772         RNA_def_property_int_sdna(prop, NULL, "split_dash1");
1773         RNA_def_property_range(prop, 0, USHRT_MAX);
1774         RNA_def_property_ui_text(prop, "Split Dash 1", "Length of the 1st dash for splitting");
1775         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1776
1777         prop = RNA_def_property(srna, "split_gap1", PROP_INT, PROP_UNSIGNED);
1778         RNA_def_property_int_sdna(prop, NULL, "split_gap1");
1779         RNA_def_property_range(prop, 0, USHRT_MAX);
1780         RNA_def_property_ui_text(prop, "Split Gap 1", "Length of the 1st gap for splitting");
1781         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1782
1783         prop = RNA_def_property(srna, "split_dash2", PROP_INT, PROP_UNSIGNED);
1784         RNA_def_property_int_sdna(prop, NULL, "split_dash2");
1785         RNA_def_property_range(prop, 0, USHRT_MAX);
1786         RNA_def_property_ui_text(prop, "Split Dash 2", "Length of the 2nd dash for splitting");
1787         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1788
1789         prop = RNA_def_property(srna, "split_gap2", PROP_INT, PROP_UNSIGNED);
1790         RNA_def_property_int_sdna(prop, NULL, "split_gap2");
1791         RNA_def_property_range(prop, 0, USHRT_MAX);
1792         RNA_def_property_ui_text(prop, "Split Gap 2", "Length of the 2nd gap for splitting");
1793         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1794
1795         prop = RNA_def_property(srna, "split_dash3", PROP_INT, PROP_UNSIGNED);
1796         RNA_def_property_int_sdna(prop, NULL, "split_dash3");
1797         RNA_def_property_range(prop, 0, USHRT_MAX);
1798         RNA_def_property_ui_text(prop, "Split Dash 3", "Length of the 3rd dash for splitting");
1799         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1800
1801         prop = RNA_def_property(srna, "split_gap3", PROP_INT, PROP_UNSIGNED);
1802         RNA_def_property_int_sdna(prop, NULL, "split_gap3");
1803         RNA_def_property_range(prop, 0, USHRT_MAX);
1804         RNA_def_property_ui_text(prop, "Split Gap 3", "Length of the 3rd gap for splitting");
1805         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1806
1807         prop = RNA_def_property(srna, "material_boundary", PROP_BOOLEAN, PROP_NONE);
1808         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MATERIAL_BOUNDARY);
1809         RNA_def_property_ui_text(prop, "Material Boundary", "If true, chains of feature edges are split at material boundaries");
1810         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1811
1812         prop = RNA_def_property(srna, "use_sorting", PROP_BOOLEAN, PROP_NONE);
1813         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", LS_NO_SORTING);
1814         RNA_def_property_ui_text(prop, "Sorting", "Arrange the stacking order of strokes");
1815         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1816
1817         prop = RNA_def_property(srna, "sort_key", PROP_ENUM, PROP_NONE);
1818         RNA_def_property_enum_sdna(prop, NULL, "sort_key");
1819         RNA_def_property_enum_items(prop, sort_key_items);
1820         RNA_def_property_ui_text(prop, "Sort Key", "Select the sort key to determine the stacking order of chains");
1821         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1822
1823         prop = RNA_def_property(srna, "sort_order", PROP_ENUM, PROP_NONE);
1824         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
1825         RNA_def_property_enum_items(prop, sort_order_items);
1826         RNA_def_property_ui_text(prop, "Sort Order", "Select the sort order");
1827         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1828
1829         prop = RNA_def_property(srna, "integration_type", PROP_ENUM, PROP_NONE);
1830         RNA_def_property_enum_sdna(prop, NULL, "integration_type");
1831         RNA_def_property_enum_items(prop, integration_type_items);
1832         RNA_def_property_ui_text(prop, "Integration Type", "Select the way how the sort key is computed for each chain");
1833         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1834
1835         prop = RNA_def_property(srna, "use_dashed_line", PROP_BOOLEAN, PROP_NONE);
1836         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_DASHED_LINE);
1837         RNA_def_property_ui_text(prop, "Dashed Line", "Enable or disable dashed line");
1838         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1839
1840         prop = RNA_def_property(srna, "caps", PROP_ENUM, PROP_NONE);
1841         RNA_def_property_enum_bitflag_sdna(prop, NULL, "caps");
1842         RNA_def_property_enum_items(prop, cap_items);
1843         RNA_def_property_ui_text(prop, "Caps", "Select the shape of both ends of strokes");
1844         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1845
1846         prop = RNA_def_property(srna, "dash1", PROP_INT, PROP_UNSIGNED);
1847         RNA_def_property_int_sdna(prop, NULL, "dash1");
1848         RNA_def_property_range(prop, 0, USHRT_MAX);
1849         RNA_def_property_ui_text(prop, "Dash 1", "Length of the 1st dash for dashed lines");
1850         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1851
1852         prop = RNA_def_property(srna, "gap1", PROP_INT, PROP_UNSIGNED);
1853         RNA_def_property_int_sdna(prop, NULL, "gap1");
1854         RNA_def_property_range(prop, 0, USHRT_MAX);
1855         RNA_def_property_ui_text(prop, "Gap 1", "Length of the 1st gap for dashed lines");
1856         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1857
1858         prop = RNA_def_property(srna, "dash2", PROP_INT, PROP_UNSIGNED);
1859         RNA_def_property_int_sdna(prop, NULL, "dash2");
1860         RNA_def_property_range(prop, 0, USHRT_MAX);
1861         RNA_def_property_ui_text(prop, "Dash 2", "Length of the 2nd dash for dashed lines");
1862         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1863
1864         prop = RNA_def_property(srna, "gap2", PROP_INT, PROP_UNSIGNED);
1865         RNA_def_property_int_sdna(prop, NULL, "gap2");
1866         RNA_def_property_range(prop, 0, USHRT_MAX);
1867         RNA_def_property_ui_text(prop, "Gap 2", "Length of the 2nd gap for dashed lines");
1868         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1869
1870         prop = RNA_def_property(srna, "dash3", PROP_INT, PROP_UNSIGNED);
1871         RNA_def_property_int_sdna(prop, NULL, "dash3");
1872         RNA_def_property_range(prop, 0, USHRT_MAX);
1873         RNA_def_property_ui_text(prop, "Dash 3", "Length of the 3rd dash for dashed lines");
1874         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1875
1876         prop = RNA_def_property(srna, "gap3", PROP_INT, PROP_UNSIGNED);
1877         RNA_def_property_int_sdna(prop, NULL, "gap3");
1878         RNA_def_property_range(prop, 0, USHRT_MAX);
1879         RNA_def_property_ui_text(prop, "Gap 3", "Length of the 3rd gap for dashed lines");
1880         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1881
1882         prop = RNA_def_property(srna, "use_texture", PROP_BOOLEAN, PROP_NONE);
1883         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_TEXTURE);
1884         RNA_def_property_ui_text(prop, "Use Textures", "Enable or disable textured strokes");
1885         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1886
1887         prop = RNA_def_property(srna, "texture_spacing", PROP_FLOAT, PROP_FACTOR);
1888         RNA_def_property_float_sdna(prop, NULL, "texstep");
1889         RNA_def_property_range(prop, 0.01f, 100.0f);
1890         RNA_def_property_ui_text(prop, "Texture spacing", "Spacing for textures along stroke length");
1891         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_update");
1892
1893         /* nodes */
1894         prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
1895         RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
1896         RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node-based shaders");
1897
1898         prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
1899         RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
1900         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1901         RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
1902         RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes for the line style");
1903         RNA_def_property_update(prop, NC_LINESTYLE, "rna_LineStyle_use_nodes_update");
1904 }
1905
1906 void RNA_def_linestyle(BlenderRNA *brna)
1907 {
1908         rna_def_linestyle_modifiers(brna);
1909         rna_def_linestyle(brna);
1910         rna_def_linestyle_mtex(brna);
1911 }
1912
1913 #endif