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