Icon for LineStyle
[blender.git] / source / blender / makesrna / intern / rna_linestyle.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008).
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_linestyle.c
24  *  \ingroup RNA
25  */
26
27 #include <stdio.h>
28 #include <stdlib.h>
29
30 #include "RNA_define.h"
31 #include "RNA_enum_types.h"
32
33 #include "rna_internal.h"
34
35 #include "DNA_linestyle_types.h"
36 #include "DNA_material_types.h"
37 #include "DNA_texture_types.h"
38
39 #include "WM_types.h"
40 #include "WM_api.h"
41
42 EnumPropertyItem linestyle_color_modifier_type_items[] = {
43         {LS_MODIFIER_ALONG_STROKE, "ALONG_STROKE", ICON_MODIFIER, "Along Stroke", ""},
44         {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""},
45         {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""},
46         {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
47         {0, NULL, 0, NULL, NULL}
48 };
49
50 EnumPropertyItem linestyle_alpha_modifier_type_items[] = {
51         {LS_MODIFIER_ALONG_STROKE, "ALONG_STROKE", ICON_MODIFIER, "Along Stroke", ""},
52         {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""},
53         {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""},
54         {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
55         {0, NULL, 0, NULL, NULL}
56 };
57
58 EnumPropertyItem linestyle_thickness_modifier_type_items[] = {
59         {LS_MODIFIER_ALONG_STROKE, "ALONG_STROKE", ICON_MODIFIER, "Along Stroke", ""},
60         {LS_MODIFIER_CALLIGRAPHY, "CALLIGRAPHY", ICON_MODIFIER, "Calligraphy", ""},
61         {LS_MODIFIER_DISTANCE_FROM_CAMERA, "DISTANCE_FROM_CAMERA", ICON_MODIFIER, "Distance from Camera", ""},
62         {LS_MODIFIER_DISTANCE_FROM_OBJECT, "DISTANCE_FROM_OBJECT", ICON_MODIFIER, "Distance from Object", ""},
63         {LS_MODIFIER_MATERIAL, "MATERIAL", ICON_MODIFIER, "Material", ""},
64         {0, NULL, 0, NULL, NULL}
65 };
66
67 EnumPropertyItem linestyle_geometry_modifier_type_items[] = {
68         {LS_MODIFIER_2D_OFFSET, "2D_OFFSET", ICON_MODIFIER, "2D Offset", ""},
69         {LS_MODIFIER_2D_TRANSFORM, "2D_TRANSFORM", ICON_MODIFIER, "2D Transform", ""},
70         {LS_MODIFIER_BACKBONE_STRETCHER, "BACKBONE_STRETCHER", ICON_MODIFIER, "Backbone Stretcher", ""},
71         {LS_MODIFIER_BEZIER_CURVE, "BEZIER_CURVE", ICON_MODIFIER, "Bezier Curve", ""},
72         {LS_MODIFIER_BLUEPRINT, "BLUEPRINT", ICON_MODIFIER, "Blueprint", ""},
73         {LS_MODIFIER_GUIDING_LINES, "GUIDING_LINES", ICON_MODIFIER, "Guiding Lines", ""},
74         {LS_MODIFIER_PERLIN_NOISE_1D, "PERLIN_NOISE_1D", ICON_MODIFIER, "Perlin Noise 1D", ""},
75         {LS_MODIFIER_PERLIN_NOISE_2D, "PERLIN_NOISE_2D", ICON_MODIFIER, "Perlin Noise 2D", ""},
76         {LS_MODIFIER_POLYGONIZATION, "POLYGONIZATION", ICON_MODIFIER, "Polygonization", ""},
77         {LS_MODIFIER_SAMPLING, "SAMPLING", ICON_MODIFIER, "Sampling", ""},
78         {LS_MODIFIER_SINUS_DISPLACEMENT, "SINUS_DISPLACEMENT", ICON_MODIFIER, "Sinus Displacement", ""},
79         {LS_MODIFIER_SPATIAL_NOISE, "SPATIAL_NOISE", ICON_MODIFIER, "Spatial Noise", ""},
80         {LS_MODIFIER_TIP_REMOVER, "TIP_REMOVER", ICON_MODIFIER, "Tip Remover", ""},
81         {0, NULL, 0, NULL, NULL}
82 };
83
84 #ifdef RNA_RUNTIME
85
86 #include "BKE_linestyle.h"
87
88 static StructRNA *rna_LineStyle_color_modifier_refine(struct PointerRNA *ptr)
89 {
90         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
91
92         switch (m->type) {
93                 case LS_MODIFIER_ALONG_STROKE:
94                         return &RNA_LineStyleColorModifier_AlongStroke;
95                 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
96                         return &RNA_LineStyleColorModifier_DistanceFromCamera;
97                 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
98                         return &RNA_LineStyleColorModifier_DistanceFromObject;
99                 case LS_MODIFIER_MATERIAL:
100                         return &RNA_LineStyleColorModifier_Material;
101                 default:
102                         return &RNA_LineStyleColorModifier;
103         }
104 }
105
106 static StructRNA *rna_LineStyle_alpha_modifier_refine(struct PointerRNA *ptr)
107 {
108         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
109
110         switch (m->type) {
111                 case LS_MODIFIER_ALONG_STROKE:
112                         return &RNA_LineStyleAlphaModifier_AlongStroke;
113                 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
114                         return &RNA_LineStyleAlphaModifier_DistanceFromCamera;
115                 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
116                         return &RNA_LineStyleAlphaModifier_DistanceFromObject;
117                 case LS_MODIFIER_MATERIAL:
118                         return &RNA_LineStyleAlphaModifier_Material;
119                 default:
120                         return &RNA_LineStyleAlphaModifier;
121         }
122 }
123
124 static StructRNA *rna_LineStyle_thickness_modifier_refine(struct PointerRNA *ptr)
125 {
126         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
127
128         switch (m->type) {
129                 case LS_MODIFIER_ALONG_STROKE:
130                         return &RNA_LineStyleThicknessModifier_AlongStroke;
131                 case LS_MODIFIER_DISTANCE_FROM_CAMERA:
132                         return &RNA_LineStyleThicknessModifier_DistanceFromCamera;
133                 case LS_MODIFIER_DISTANCE_FROM_OBJECT:
134                         return &RNA_LineStyleThicknessModifier_DistanceFromObject;
135                 case LS_MODIFIER_MATERIAL:
136                         return &RNA_LineStyleThicknessModifier_Material;
137                 case LS_MODIFIER_CALLIGRAPHY:
138                         return &RNA_LineStyleThicknessModifier_Calligraphy;
139                 default:
140                         return &RNA_LineStyleThicknessModifier;
141         }
142 }
143
144 static StructRNA *rna_LineStyle_geometry_modifier_refine(struct PointerRNA *ptr)
145 {
146         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
147
148         switch (m->type) {
149                 case LS_MODIFIER_SAMPLING:
150                         return &RNA_LineStyleGeometryModifier_Sampling;
151                 case LS_MODIFIER_BEZIER_CURVE:
152                         return &RNA_LineStyleGeometryModifier_BezierCurve;
153                 case LS_MODIFIER_SINUS_DISPLACEMENT:
154                         return &RNA_LineStyleGeometryModifier_SinusDisplacement;
155                 case LS_MODIFIER_SPATIAL_NOISE:
156                         return &RNA_LineStyleGeometryModifier_SpatialNoise;
157                 case LS_MODIFIER_PERLIN_NOISE_1D:
158                         return &RNA_LineStyleGeometryModifier_PerlinNoise1D;
159                 case LS_MODIFIER_PERLIN_NOISE_2D:
160                         return &RNA_LineStyleGeometryModifier_PerlinNoise2D;
161                 case LS_MODIFIER_BACKBONE_STRETCHER:
162                         return &RNA_LineStyleGeometryModifier_BackboneStretcher;
163                 case LS_MODIFIER_TIP_REMOVER:
164                         return &RNA_LineStyleGeometryModifier_TipRemover;
165                 case LS_MODIFIER_POLYGONIZATION:
166                         return &RNA_LineStyleGeometryModifier_Polygonalization;
167                 case LS_MODIFIER_GUIDING_LINES:
168                         return &RNA_LineStyleGeometryModifier_GuidingLines;
169                 case LS_MODIFIER_BLUEPRINT:
170                         return &RNA_LineStyleGeometryModifier_Blueprint;
171                 case LS_MODIFIER_2D_OFFSET:
172                         return &RNA_LineStyleGeometryModifier_2DOffset;
173                 case LS_MODIFIER_2D_TRANSFORM:
174                         return &RNA_LineStyleGeometryModifier_2DTransform;
175                 default:
176                         return &RNA_LineStyleGeometryModifier;
177         }
178 }
179
180 static char *rna_LineStyle_color_modifier_path(PointerRNA *ptr)
181 {
182         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
183         char name_esc[sizeof(m->name) * 2];
184         BLI_strescape(name_esc, m->name, sizeof(name_esc));
185         return BLI_sprintfN("color_modifiers[\"%s\"]", name_esc);
186 }
187
188 static char *rna_LineStyle_alpha_modifier_path(PointerRNA *ptr)
189 {
190         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
191         char name_esc[sizeof(m->name) * 2];
192         BLI_strescape(name_esc, m->name, sizeof(name_esc));
193         return BLI_sprintfN("alpha_modifiers[\"%s\"]", name_esc);
194 }
195
196 static char *rna_LineStyle_thickness_modifier_path(PointerRNA *ptr)
197 {
198         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
199         char name_esc[sizeof(m->name) * 2];
200         BLI_strescape(name_esc, m->name, sizeof(name_esc));
201         return BLI_sprintfN("thickness_modifiers[\"%s\"]", name_esc);
202 }
203
204 static char *rna_LineStyle_geometry_modifier_path(PointerRNA *ptr)
205 {
206         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
207         char name_esc[sizeof(m->name) * 2];
208         BLI_strescape(name_esc, m->name, sizeof(name_esc));
209         return BLI_sprintfN("geometry_modifiers[\"%s\"]", name_esc);
210 }
211
212 static void rna_LineStyleColorModifier_name_set(PointerRNA *ptr, const char *value)
213 {
214         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
215         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
216
217         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
218         BLI_uniquename(&linestyle->color_modifiers, m, "ColorModifier", '.',
219                        offsetof(LineStyleModifier, name), sizeof(m->name));
220 }
221
222 static void rna_LineStyleAlphaModifier_name_set(PointerRNA *ptr, const char *value)
223 {
224         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
225         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
226
227         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
228         BLI_uniquename(&linestyle->alpha_modifiers, m, "AlphaModifier", '.',
229                        offsetof(LineStyleModifier, name), sizeof(m->name));
230 }
231
232 static void rna_LineStyleThicknessModifier_name_set(PointerRNA *ptr, const char *value)
233 {
234         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
235         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
236
237         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
238         BLI_uniquename(&linestyle->thickness_modifiers, m, "ThicknessModifier", '.',
239                        offsetof(LineStyleModifier, name), sizeof(m->name));
240 }
241
242 static void rna_LineStyleGeometryModifier_name_set(PointerRNA *ptr, const char *value)
243 {
244         FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->id.data;
245         LineStyleModifier *m = (LineStyleModifier *)ptr->data;
246
247         BLI_strncpy_utf8(m->name, value, sizeof(m->name));
248         BLI_uniquename(&linestyle->geometry_modifiers, m, "GeometryModifier", '.',
249                        offsetof(LineStyleModifier, name), sizeof(m->name));
250 }
251
252 #else
253
254 #include "BLI_math.h"
255
256 static void rna_def_modifier_type_common(StructRNA *srna, EnumPropertyItem *modifier_type_items,
257                                          const char *set_name_func, const bool blend, const bool color)
258 {
259         PropertyRNA *prop;
260
261         /* TODO: Check this is not already defined somewhere else, e.g. in nodes... */
262         static EnumPropertyItem value_blend_items[] = {
263                 {LS_VALUE_BLEND, "MIX", 0, "Mix", ""},
264                 {LS_VALUE_ADD, "ADD", 0, "Add", ""},
265                 {LS_VALUE_SUB, "SUBTRACT", 0, "Subtract", ""},
266                 {LS_VALUE_MULT, "MULTIPLY", 0, "Multiply", ""},
267                 {LS_VALUE_DIV, "DIVIDE", 0, "Divide", ""},
268                 {LS_VALUE_DIFF, "DIFFERENCE", 0, "Difference", ""},
269                 {LS_VALUE_MIN, "MININUM", 0, "Minimum", ""}, 
270                 {LS_VALUE_MAX, "MAXIMUM", 0, "Maximum", ""}, 
271                 {0, NULL, 0, NULL, NULL}
272         };
273
274         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
275         RNA_def_property_enum_sdna(prop, NULL, "modifier.type");
276         RNA_def_property_enum_items(prop, modifier_type_items);
277         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
278         RNA_def_property_ui_text(prop, "Modifier Type", "Type of the modifier");
279
280         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
281         RNA_def_property_string_sdna(prop, NULL, "modifier.name");
282         RNA_def_property_string_funcs(prop, NULL, NULL, set_name_func);
283         RNA_def_property_ui_text(prop, "Modifier Name", "Name of the modifier");
284         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
285         RNA_def_struct_name_property(srna, prop);
286
287         if (blend) {
288                 prop = RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
289                 RNA_def_property_enum_sdna(prop, NULL, "modifier.blend");
290                 RNA_def_property_enum_items(prop, (color) ? ramp_blend_items : value_blend_items);
291                 RNA_def_property_ui_text(prop, "Blend", "Specify how the modifier value is blended into the base value");
292                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
293
294                 prop = RNA_def_property(srna, "influence", PROP_FLOAT, PROP_FACTOR);
295                 RNA_def_property_float_sdna(prop, NULL, "modifier.influence");
296                 RNA_def_property_range(prop, 0.0f, 1.0f);
297                 RNA_def_property_ui_text(prop, "Influence", "Influence factor by which the modifier changes the property");
298                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
299         }
300
301         prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE);
302         RNA_def_property_boolean_sdna(prop, NULL, "modifier.flags", LS_MODIFIER_ENABLED);
303         RNA_def_property_ui_text(prop, "Use", "Enable or disable this modifier during stroke rendering");
304
305         prop = RNA_def_property(srna, "expanded", PROP_BOOLEAN, PROP_NONE);
306         RNA_def_property_boolean_sdna(prop, NULL, "modifier.flags", LS_MODIFIER_EXPANDED);
307         RNA_def_property_ui_text(prop, "Expanded", "True if the modifier tab is expanded");
308 }
309
310 static void rna_def_color_modifier(StructRNA *srna)
311 {
312         rna_def_modifier_type_common(srna, linestyle_color_modifier_type_items,
313                                      "rna_LineStyleColorModifier_name_set", TRUE, TRUE);
314 }
315
316 static void rna_def_alpha_modifier(StructRNA *srna)
317 {
318         rna_def_modifier_type_common(srna, linestyle_alpha_modifier_type_items,
319                                      "rna_LineStyleAlphaModifier_name_set", TRUE, FALSE);
320 }
321
322 static void rna_def_thickness_modifier(StructRNA *srna)
323 {
324         rna_def_modifier_type_common(srna, linestyle_thickness_modifier_type_items,
325                                      "rna_LineStyleThicknessModifier_name_set", TRUE, FALSE);
326 }
327
328 static void rna_def_geometry_modifier(StructRNA *srna)
329 {
330         rna_def_modifier_type_common(srna, linestyle_geometry_modifier_type_items,
331                                      "rna_LineStyleGeometryModifier_name_set", FALSE, FALSE);
332 }
333
334 static void rna_def_modifier_color_ramp_common(StructRNA *srna, int range)
335 {
336         PropertyRNA *prop;
337
338         prop = RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NONE);
339         RNA_def_property_pointer_sdna(prop, NULL, "color_ramp");
340         RNA_def_property_struct_type(prop, "ColorRamp");
341         RNA_def_property_ui_text(prop, "Color Ramp", "Color ramp used to change line color");
342         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
343
344         if (range) {
345                 prop = RNA_def_property(srna, "range_min", PROP_FLOAT, PROP_DISTANCE);
346                 RNA_def_property_float_sdna(prop, NULL, "range_min");
347                 RNA_def_property_ui_text(prop, "Range Min", "Lower bound of the input range the mapping is applied");
348                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
349
350                 prop = RNA_def_property(srna, "range_max", PROP_FLOAT, PROP_DISTANCE);
351                 RNA_def_property_float_sdna(prop, NULL, "range_max");
352                 RNA_def_property_ui_text(prop, "Range Max", "Upper bound of the input range the mapping is applied");
353                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
354         }
355 }
356
357 static void rna_def_modifier_curve_common(StructRNA *srna, int range, int value)
358 {
359         PropertyRNA *prop;
360
361         static EnumPropertyItem mapping_items[] = {
362                 {0, "LINEAR", 0, "Linear", "Use linear mapping"},
363                 {LS_MODIFIER_USE_CURVE, "CURVE", 0, "Curve", "Use curve mapping"},
364                 {0, NULL, 0, NULL, NULL}
365         };
366
367         prop = RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
368         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
369         RNA_def_property_enum_items(prop, mapping_items);
370         RNA_def_property_ui_text(prop, "Mapping", "Select the mapping type");
371         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
372
373         prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
374         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_INVERT);
375         RNA_def_property_ui_text(prop, "Invert", "Invert the fade-out direction of the linear mapping");
376         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
377
378         prop = RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
379         RNA_def_property_pointer_sdna(prop, NULL, "curve");
380         RNA_def_property_struct_type(prop, "CurveMapping");
381         RNA_def_property_ui_text(prop, "Curve", "Curve used for the curve mapping");
382         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
383
384         if (range) {
385                 prop = RNA_def_property(srna, "range_min", PROP_FLOAT, PROP_DISTANCE);
386                 RNA_def_property_float_sdna(prop, NULL, "range_min");
387                 RNA_def_property_ui_text(prop, "Range Min", "Lower bound of the input range the mapping is applied");
388                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
389
390                 prop = RNA_def_property(srna, "range_max", PROP_FLOAT, PROP_DISTANCE);
391                 RNA_def_property_float_sdna(prop, NULL, "range_max");
392                 RNA_def_property_ui_text(prop, "Range Max", "Upper bound of the input range the mapping is applied");
393                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
394         }
395
396         if (value) {
397                 prop = RNA_def_property(srna, "value_min", PROP_FLOAT, PROP_NONE);
398                 RNA_def_property_float_sdna(prop, NULL, "value_min");
399                 RNA_def_property_ui_text(prop, "Value Min", "Minimum output value of the mapping");
400                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
401
402                 prop = RNA_def_property(srna, "value_max", PROP_FLOAT, PROP_NONE);
403                 RNA_def_property_float_sdna(prop, NULL, "value_max");
404                 RNA_def_property_ui_text(prop, "Value Max", "Maximum output value of the mapping");
405                 RNA_def_property_update(prop, NC_LINESTYLE, NULL);
406         }
407 }
408
409 static void rna_def_modifier_material_common(StructRNA *srna)
410 {
411         PropertyRNA *prop;
412
413         static EnumPropertyItem mat_attr_items[] = {
414                 {LS_MODIFIER_MATERIAL_DIFF, "DIFF", 0, "Diffuse", ""},
415                 {LS_MODIFIER_MATERIAL_DIFF_R, "DIFF_R", 0, "Diffuse Red", ""},
416                 {LS_MODIFIER_MATERIAL_DIFF_G, "DIFF_G", 0, "Diffuse Green", ""},
417                 {LS_MODIFIER_MATERIAL_DIFF_B, "DIFF_B", 0, "Diffuse Blue", ""},
418                 {LS_MODIFIER_MATERIAL_SPEC, "SPEC", 0, "Specular", ""},
419                 {LS_MODIFIER_MATERIAL_SPEC_R, "SPEC_R", 0, "Specular Red", ""},
420                 {LS_MODIFIER_MATERIAL_SPEC_G, "SPEC_G", 0, "Specular Green", ""},
421                 {LS_MODIFIER_MATERIAL_SPEC_B, "SPEC_B", 0, "Specular Blue", ""},
422                 {LS_MODIFIER_MATERIAL_SPEC_HARD, "SPEC_HARD", 0, "Specular Hardness", ""},
423                 {LS_MODIFIER_MATERIAL_ALPHA, "ALPHA", 0, "Alpha", ""},
424                 {0, NULL, 0, NULL, NULL}
425         };
426
427         prop = RNA_def_property(srna, "material_attribute", PROP_ENUM, PROP_NONE);
428         RNA_def_property_enum_sdna(prop, NULL, "mat_attr");
429         RNA_def_property_enum_items(prop, mat_attr_items);
430         RNA_def_property_ui_text(prop, "Material Attribute", "Specify which material attribute is used");
431         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
432
433 }
434
435 static void rna_def_linestyle_modifiers(BlenderRNA *brna)
436 {
437         StructRNA *srna;
438         PropertyRNA *prop;
439
440         static EnumPropertyItem blueprint_shape_items[] = {
441                 {LS_MODIFIER_BLUEPRINT_CIRCLES, "CIRCLES", 0, "Circles", "Draw a blueprint using circular contour strokes"},
442                 {LS_MODIFIER_BLUEPRINT_ELLIPSES, "ELLIPSES", 0, "Ellipses", "Draw a blueprint using elliptic contour strokes"},
443                 {LS_MODIFIER_BLUEPRINT_SQUARES, "SQUARES", 0, "Squares", "Draw a blueprint using square contour strokes"},
444                 {0, NULL, 0, NULL, NULL}
445         };
446
447         static EnumPropertyItem transform_pivot_items[] = {
448                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_CENTER, "CENTER", 0, "Stroke Center", ""},
449                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_START, "START", 0, "Stroke Start", ""},
450                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_END, "END", 0, "Stroke End", ""},
451                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_PARAM, "PARAM", 0, "Stroke Point Parameter", ""},
452                 {LS_MODIFIER_2D_TRANSFORM_PIVOT_ABSOLUTE, "ABSOLUTE", 0, "Absolute 2D Point", ""},
453                 {0, NULL, 0, NULL, NULL}
454         };
455
456         srna = RNA_def_struct(brna, "LineStyleModifier", NULL);
457         RNA_def_struct_ui_text(srna, "Line Style Modifier", "Base type to define modifiers");
458
459         /* line color modifiers */
460
461         srna = RNA_def_struct(brna, "LineStyleColorModifier", "LineStyleModifier");
462         RNA_def_struct_sdna(srna, "LineStyleModifier");
463         RNA_def_struct_refine_func(srna, "rna_LineStyle_color_modifier_refine");
464         RNA_def_struct_path_func(srna, "rna_LineStyle_color_modifier_path");
465         RNA_def_struct_ui_text(srna, "Line Style Color Modifier", "Base type to define line color modifiers");
466
467         srna = RNA_def_struct(brna, "LineStyleColorModifier_AlongStroke", "LineStyleColorModifier");
468         RNA_def_struct_ui_text(srna, "Along Stroke", "Change line color along stroke");
469         rna_def_color_modifier(srna);
470         rna_def_modifier_color_ramp_common(srna, FALSE);
471
472         srna = RNA_def_struct(brna, "LineStyleColorModifier_DistanceFromCamera", "LineStyleColorModifier");
473         RNA_def_struct_ui_text(srna, "Distance from Camera", "Change line color based on the distance from the camera");
474         rna_def_color_modifier(srna);
475         rna_def_modifier_color_ramp_common(srna, TRUE);
476
477         srna = RNA_def_struct(brna, "LineStyleColorModifier_DistanceFromObject", "LineStyleColorModifier");
478         RNA_def_struct_ui_text(srna, "Distance from Object", "Change line color based on the distance from an object");
479         rna_def_color_modifier(srna);
480         rna_def_modifier_color_ramp_common(srna, TRUE);
481
482         prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
483         RNA_def_property_pointer_sdna(prop, NULL, "target");
484         RNA_def_property_struct_type(prop, "Object");
485         RNA_def_property_flag(prop, PROP_EDITABLE);
486         RNA_def_property_ui_text(prop, "Target", "Target object from which the distance is measured");
487         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
488
489         srna = RNA_def_struct(brna, "LineStyleColorModifier_Material", "LineStyleColorModifier");
490         RNA_def_struct_ui_text(srna, "Material", "Change line color based on a material attribute");
491         rna_def_color_modifier(srna);
492         rna_def_modifier_material_common(srna);
493         rna_def_modifier_color_ramp_common(srna, FALSE);
494
495         prop = RNA_def_property(srna, "use_ramp", PROP_BOOLEAN, PROP_NONE);
496         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_USE_RAMP);
497         RNA_def_property_ui_text(prop, "Ramp", "Use color ramp to map the BW average into an RGB color");
498         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
499
500         /* alpha transparency modifiers */
501
502         srna = RNA_def_struct(brna, "LineStyleAlphaModifier", "LineStyleModifier");
503         RNA_def_struct_sdna(srna, "LineStyleModifier");
504         RNA_def_struct_refine_func(srna, "rna_LineStyle_alpha_modifier_refine");
505         RNA_def_struct_path_func(srna, "rna_LineStyle_alpha_modifier_path");
506         RNA_def_struct_ui_text(srna, "Line Style Alpha Modifier", "Base type to define alpha transparency modifiers");
507
508         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_AlongStroke", "LineStyleAlphaModifier");
509         RNA_def_struct_ui_text(srna, "Along Stroke", "Change alpha transparency along stroke");
510         rna_def_alpha_modifier(srna);
511         rna_def_modifier_curve_common(srna, FALSE, FALSE);
512
513         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_DistanceFromCamera", "LineStyleAlphaModifier");
514         RNA_def_struct_ui_text(srna, "Distance from Camera",
515                                "Change alpha transparency based on the distance from the camera");
516         rna_def_alpha_modifier(srna);
517         rna_def_modifier_curve_common(srna, TRUE, FALSE);
518
519         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_DistanceFromObject", "LineStyleAlphaModifier");
520         RNA_def_struct_ui_text(srna, "Distance from Object",
521                                "Change alpha transparency based on the distance from an object");
522         rna_def_alpha_modifier(srna);
523         rna_def_modifier_curve_common(srna, TRUE, FALSE);
524
525         prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
526         RNA_def_property_pointer_sdna(prop, NULL, "target");
527         RNA_def_property_struct_type(prop, "Object");
528         RNA_def_property_flag(prop, PROP_EDITABLE);
529         RNA_def_property_ui_text(prop, "Target", "Target object from which the distance is measured");
530         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
531
532         srna = RNA_def_struct(brna, "LineStyleAlphaModifier_Material", "LineStyleAlphaModifier");
533         RNA_def_struct_ui_text(srna, "Material", "Change alpha transparency based on a material attribute");
534         rna_def_alpha_modifier(srna);
535         rna_def_modifier_material_common(srna);
536         rna_def_modifier_curve_common(srna, FALSE, FALSE);
537
538         /* line thickness modifiers */
539
540         srna = RNA_def_struct(brna, "LineStyleThicknessModifier", "LineStyleModifier");
541         RNA_def_struct_sdna(srna, "LineStyleModifier");
542         RNA_def_struct_refine_func(srna, "rna_LineStyle_thickness_modifier_refine");
543         RNA_def_struct_path_func(srna, "rna_LineStyle_thickness_modifier_path");
544         RNA_def_struct_ui_text(srna, "Line Style Thickness Modifier", "Base type to define line thickness modifiers");
545
546         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_AlongStroke", "LineStyleThicknessModifier");
547         RNA_def_struct_ui_text(srna, "Along Stroke", "Change line thickness along stroke");
548         rna_def_thickness_modifier(srna);
549         rna_def_modifier_curve_common(srna, FALSE, TRUE);
550
551         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_DistanceFromCamera", "LineStyleThicknessModifier");
552         RNA_def_struct_ui_text(srna, "Distance from Camera", "Change line thickness based on the distance from the camera");
553         rna_def_thickness_modifier(srna);
554         rna_def_modifier_curve_common(srna, TRUE, TRUE);
555
556         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_DistanceFromObject", "LineStyleThicknessModifier");
557         RNA_def_struct_ui_text(srna, "Distance from Object", "Change line thickness based on the distance from an object");
558         rna_def_thickness_modifier(srna);
559         rna_def_modifier_curve_common(srna, TRUE, TRUE);
560
561         prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
562         RNA_def_property_pointer_sdna(prop, NULL, "target");
563         RNA_def_property_struct_type(prop, "Object");
564         RNA_def_property_flag(prop, PROP_EDITABLE);
565         RNA_def_property_ui_text(prop, "Target", "Target object from which the distance is measured");
566         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
567
568         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Material", "LineStyleThicknessModifier");
569         RNA_def_struct_ui_text(srna, "Material", "Change line thickness based on a material attribute");
570         rna_def_thickness_modifier(srna);
571         rna_def_modifier_material_common(srna);
572         rna_def_modifier_curve_common(srna, FALSE, TRUE);
573
574         srna = RNA_def_struct(brna, "LineStyleThicknessModifier_Calligraphy", "LineStyleThicknessModifier");
575         RNA_def_struct_ui_text(srna, "Calligraphy",
576                                "Change line thickness so that stroke looks like made with a calligraphic pen");
577         rna_def_thickness_modifier(srna);
578
579         prop = RNA_def_property(srna, "orientation", PROP_FLOAT, PROP_ANGLE);
580         RNA_def_property_float_sdna(prop, NULL, "orientation");
581         RNA_def_property_ui_text(prop, "Orientation", "Angle of the main direction");
582         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
583
584         prop = RNA_def_property(srna, "thickness_min", PROP_FLOAT, PROP_NONE);
585         RNA_def_property_float_sdna(prop, NULL, "min_thickness");
586         RNA_def_property_range(prop, 0.0f, 10000.0f);
587         RNA_def_property_ui_text(prop, "Min Thickness",
588                                  "Minimum thickness in the direction perpendicular to the main direction");
589         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
590
591         prop = RNA_def_property(srna, "thickness_max", PROP_FLOAT, PROP_NONE);
592         RNA_def_property_float_sdna(prop, NULL, "max_thickness");
593         RNA_def_property_range(prop, 0.0f, 10000.0f);
594         RNA_def_property_ui_text(prop, "Max Thickness", "Maximum thickness in the main direction");
595         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
596
597         /* geometry modifiers */
598
599         srna = RNA_def_struct(brna, "LineStyleGeometryModifier", "LineStyleModifier");
600         RNA_def_struct_sdna(srna, "LineStyleModifier");
601         RNA_def_struct_refine_func(srna, "rna_LineStyle_geometry_modifier_refine");
602         RNA_def_struct_path_func(srna, "rna_LineStyle_geometry_modifier_path");
603         RNA_def_struct_ui_text(srna, "Line Style Geometry Modifier", "Base type to define stroke geometry modifiers");
604
605         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Sampling", "LineStyleGeometryModifier");
606         RNA_def_struct_ui_text(srna, "Sampling",
607                                "Specify a new sampling value that determines the resolution of stroke polylines");
608         rna_def_geometry_modifier(srna);
609
610         prop = RNA_def_property(srna, "sampling", PROP_FLOAT, PROP_NONE);
611         RNA_def_property_float_sdna(prop, NULL, "sampling");
612         RNA_def_property_range(prop, 0.0f, 10000.0f);
613         RNA_def_property_ui_text(prop, "Sampling", "New sampling value to be used for subsequent modifiers");
614         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
615
616         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_BezierCurve", "LineStyleGeometryModifier");
617         RNA_def_struct_ui_text(srna, "Bezier Curve",
618                                "Replace stroke backbone geometry by a Bezier curve approximation of the "
619                                "original backbone geometry");
620         rna_def_geometry_modifier(srna);
621
622         prop = RNA_def_property(srna, "error", PROP_FLOAT, PROP_NONE);
623         RNA_def_property_float_sdna(prop, NULL, "error");
624         RNA_def_property_ui_text(prop, "Error",
625                                  "Maximum distance allowed between the new Bezier curve and the "
626                                  "original backbone geometry");
627         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
628
629         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_SinusDisplacement", "LineStyleGeometryModifier");
630         RNA_def_struct_ui_text(srna, "Sinus Displacement", "Add sinus displacement to stroke backbone geometry");
631         rna_def_geometry_modifier(srna);
632
633         prop = RNA_def_property(srna, "wavelength", PROP_FLOAT, PROP_NONE);
634         RNA_def_property_float_sdna(prop, NULL, "wavelength");
635         RNA_def_property_ui_text(prop, "Wavelength", "Wavelength of the sinus displacement");
636         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
637
638         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
639         RNA_def_property_float_sdna(prop, NULL, "amplitude");
640         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the sinus displacement");
641         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
642
643         prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
644         RNA_def_property_float_sdna(prop, NULL, "phase");
645         RNA_def_property_ui_text(prop, "Phase", "Phase of the sinus displacement");
646         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
647
648         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_SpatialNoise", "LineStyleGeometryModifier");
649         RNA_def_struct_ui_text(srna, "Spatial Noise", "Add spatial noise to stroke backbone geometry");
650         rna_def_geometry_modifier(srna);
651
652         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
653         RNA_def_property_float_sdna(prop, NULL, "amplitude");
654         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the spatial noise");
655         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
656
657         prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
658         RNA_def_property_float_sdna(prop, NULL, "scale");
659         RNA_def_property_ui_text(prop, "Scale", "Scale of the spatial noise");
660         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
661
662         prop = RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
663         RNA_def_property_int_sdna(prop, NULL, "octaves");
664         RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the spatial noise)");
665         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
666
667         prop = RNA_def_property(srna, "smooth", PROP_BOOLEAN, PROP_NONE);
668         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_SPATIAL_NOISE_SMOOTH);
669         RNA_def_property_ui_text(prop, "Smooth", "If true, the spatial noise is smooth");
670         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
671
672         prop = RNA_def_property(srna, "use_pure_random", PROP_BOOLEAN, PROP_NONE);
673         RNA_def_property_boolean_sdna(prop, NULL, "flags", LS_MODIFIER_SPATIAL_NOISE_PURERANDOM);
674         RNA_def_property_ui_text(prop, "Pure Random", "If true, the spatial noise does not show any coherence");
675         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
676
677         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_PerlinNoise1D", "LineStyleGeometryModifier");
678         RNA_def_struct_ui_text(srna, "Perlin Noise 1D", "Add one-dimensional Perlin noise to stroke backbone geometry");
679         rna_def_geometry_modifier(srna);
680
681         prop = RNA_def_property(srna, "frequency", PROP_FLOAT, PROP_NONE);
682         RNA_def_property_float_sdna(prop, NULL, "frequency");
683         RNA_def_property_ui_text(prop, "Frequency", "Frequency of the Perlin noise");
684         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
685
686         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
687         RNA_def_property_float_sdna(prop, NULL, "amplitude");
688         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the Perlin noise");
689         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
690
691         prop = RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
692         RNA_def_property_int_sdna(prop, NULL, "octaves");
693         RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise)");
694         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
695
696         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
697         RNA_def_property_float_sdna(prop, NULL, "angle");
698         RNA_def_property_ui_text(prop, "Angle", "Displacement direction");
699         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
700
701         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
702         RNA_def_property_int_sdna(prop, NULL, "seed");
703         RNA_def_property_ui_text(prop, "Seed",
704                                  "Seed for random number generation (if negative, time is used as a seed instead)");
705         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
706
707         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_PerlinNoise2D", "LineStyleGeometryModifier");
708         RNA_def_struct_ui_text(srna, "Perlin Noise 2D", "Add two-dimensional Perlin noise to stroke backbone geometry");
709         rna_def_geometry_modifier(srna);
710
711         prop = RNA_def_property(srna, "frequency", PROP_FLOAT, PROP_NONE);
712         RNA_def_property_float_sdna(prop, NULL, "frequency");
713         RNA_def_property_ui_text(prop, "Frequency", "Frequency of the Perlin noise");
714         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
715
716         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
717         RNA_def_property_float_sdna(prop, NULL, "amplitude");
718         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of the Perlin noise");
719         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
720
721         prop = RNA_def_property(srna, "octaves", PROP_INT, PROP_UNSIGNED);
722         RNA_def_property_int_sdna(prop, NULL, "octaves");
723         RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise)");
724         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
725
726         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
727         RNA_def_property_float_sdna(prop, NULL, "angle");
728         RNA_def_property_ui_text(prop, "Angle", "Displacement direction");
729         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
730
731         prop = RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
732         RNA_def_property_int_sdna(prop, NULL, "seed");
733         RNA_def_property_ui_text(prop, "Seed",
734                                  "Seed for random number generation (if negative, time is used as a seed instead)");
735         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
736
737         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_BackboneStretcher", "LineStyleGeometryModifier");
738         RNA_def_struct_ui_text(srna, "Backbone Stretcher", "Stretch the beginning and the end of stroke backbone");
739         rna_def_geometry_modifier(srna);
740
741         prop = RNA_def_property(srna, "backbone_length", PROP_FLOAT, PROP_NONE);
742         RNA_def_property_float_sdna(prop, NULL, "backbone_length");
743         RNA_def_property_ui_text(prop, "Backbone Length", "Amount of backbone stretching");
744         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
745
746         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_TipRemover", "LineStyleGeometryModifier");
747         RNA_def_struct_ui_text(srna, "Tip Remover",
748                                "Remove a piece of stroke at the beginning and the end of stroke backbone");
749         rna_def_geometry_modifier(srna);
750
751         prop = RNA_def_property(srna, "tip_length", PROP_FLOAT, PROP_NONE);
752         RNA_def_property_float_sdna(prop, NULL, "tip_length");
753         RNA_def_property_ui_text(prop, "Tip Length", "Length of tips to be removed");
754         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
755
756         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Polygonalization", "LineStyleGeometryModifier");
757         RNA_def_struct_ui_text(srna, "Polygonalization", "Modify the stroke geometry so that it looks more 'polygonal'");
758         rna_def_geometry_modifier(srna);
759
760         prop = RNA_def_property(srna, "error", PROP_FLOAT, PROP_NONE);
761         RNA_def_property_float_sdna(prop, NULL, "error");
762         RNA_def_property_ui_text(prop, "Error",
763                                  "Maximum distance between the original stroke and its polygonal approximation");
764         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
765
766         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_GuidingLines", "LineStyleGeometryModifier");
767         RNA_def_struct_ui_text(srna, "Guiding Lines",
768                                "Modify the stroke geometry so that it corresponds to its main direction line");
769         rna_def_geometry_modifier(srna);
770
771         prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_NONE);
772         RNA_def_property_float_sdna(prop, NULL, "offset");
773         RNA_def_property_ui_text(prop, "Offset",
774                                  "Displacement that is applied to the main direction line along its normal");
775         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
776
777         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_Blueprint", "LineStyleGeometryModifier");
778         RNA_def_struct_ui_text(srna, "Blueprint",
779                                "Produce a blueprint using circular, elliptic, and square contour strokes");
780         rna_def_geometry_modifier(srna);
781
782         prop = RNA_def_property(srna, "shape", PROP_ENUM, PROP_NONE);
783         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
784         RNA_def_property_enum_items(prop, blueprint_shape_items);
785         RNA_def_property_ui_text(prop, "Shape", "Select the shape of blueprint contour strokes");
786         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
787
788         prop = RNA_def_property(srna, "rounds", PROP_INT, PROP_UNSIGNED);
789         RNA_def_property_int_sdna(prop, NULL, "rounds");
790         RNA_def_property_range(prop, 1, 1000);
791         RNA_def_property_ui_text(prop, "Rounds", "Number of rounds in contour strokes");
792         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
793
794         prop = RNA_def_property(srna, "backbone_length", PROP_FLOAT, PROP_NONE);
795         RNA_def_property_float_sdna(prop, NULL, "backbone_length");
796         RNA_def_property_ui_text(prop, "Backbone Length", "Amount of backbone stretching");
797         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
798
799         prop = RNA_def_property(srna, "random_radius", PROP_INT, PROP_UNSIGNED);
800         RNA_def_property_int_sdna(prop, NULL, "random_radius");
801         RNA_def_property_ui_text(prop, "Random Radius", "Randomness of the radius");
802         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
803
804         prop = RNA_def_property(srna, "random_center", PROP_INT, PROP_UNSIGNED);
805         RNA_def_property_int_sdna(prop, NULL, "random_center");
806         RNA_def_property_ui_text(prop, "Random Center", "Randomness of the center");
807         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
808
809         prop = RNA_def_property(srna, "random_backbone", PROP_INT, PROP_UNSIGNED);
810         RNA_def_property_int_sdna(prop, NULL, "random_backbone");
811         RNA_def_property_ui_text(prop, "Random Backbone", "Randomness of the backbone stretching");
812         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
813
814         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_2DOffset", "LineStyleGeometryModifier");
815         RNA_def_struct_ui_text(srna, "2D Offset", "Add two-dimensional offsets to stroke backbone geometry");
816         rna_def_geometry_modifier(srna);
817
818         prop = RNA_def_property(srna, "start", PROP_FLOAT, PROP_NONE);
819         RNA_def_property_float_sdna(prop, NULL, "start");
820         RNA_def_property_ui_text(prop, "Start", "Displacement that is applied from the beginning of the stroke");
821         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
822
823         prop = RNA_def_property(srna, "end", PROP_FLOAT, PROP_NONE);
824         RNA_def_property_float_sdna(prop, NULL, "end");
825         RNA_def_property_ui_text(prop, "End", "Displacement that is applied from the end of the stroke");
826         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
827
828         prop = RNA_def_property(srna, "x", PROP_FLOAT, PROP_NONE);
829         RNA_def_property_float_sdna(prop, NULL, "x");
830         RNA_def_property_ui_text(prop, "X", "Displacement that is applied to the X coordinates of stroke vertices");
831         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
832
833         prop = RNA_def_property(srna, "y", PROP_FLOAT, PROP_NONE);
834         RNA_def_property_float_sdna(prop, NULL, "y");
835         RNA_def_property_ui_text(prop, "Y", "Displacement that is applied to the Y coordinates of stroke vertices");
836         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
837
838         srna = RNA_def_struct(brna, "LineStyleGeometryModifier_2DTransform", "LineStyleGeometryModifier");
839         RNA_def_struct_ui_text(srna, "2D Transform",
840                                "Apply two-dimensional scaling and rotation to stroke backbone geometry");
841         rna_def_geometry_modifier(srna);
842
843         prop = RNA_def_property(srna, "pivot", PROP_ENUM, PROP_NONE);
844         RNA_def_property_enum_sdna(prop, NULL, "pivot");
845         RNA_def_property_enum_items(prop, transform_pivot_items);
846         RNA_def_property_ui_text(prop, "Pivot", "Pivot of scaling and rotation operations");
847         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
848
849         prop = RNA_def_property(srna, "scale_x", PROP_FLOAT, PROP_NONE);
850         RNA_def_property_float_sdna(prop, NULL, "scale_x");
851         RNA_def_property_flag(prop, PROP_PROPORTIONAL);
852         RNA_def_property_ui_text(prop, "Scale X", "Scaling factor that is applied along the X axis");
853         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
854
855         prop = RNA_def_property(srna, "scale_y", PROP_FLOAT, PROP_NONE);
856         RNA_def_property_float_sdna(prop, NULL, "scale_y");
857         RNA_def_property_flag(prop, PROP_PROPORTIONAL);
858         RNA_def_property_ui_text(prop, "Scale Y", "Scaling factor that is applied along the Y axis");
859         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
860
861         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
862         RNA_def_property_float_sdna(prop, NULL, "angle");
863         RNA_def_property_ui_text(prop, "Rotation Angle", "Rotation angle");
864         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
865
866         prop = RNA_def_property(srna, "pivot_u", PROP_FLOAT, PROP_FACTOR);
867         RNA_def_property_float_sdna(prop, NULL, "pivot_u");
868         RNA_def_property_range(prop, 0.f, 1.f);
869         RNA_def_property_ui_text(prop, "Stroke Point Parameter",
870                                  "Pivot in terms of the stroke point parameter u (0 <= u <= 1)");
871         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
872
873         prop = RNA_def_property(srna, "pivot_x", PROP_FLOAT, PROP_NONE);
874         RNA_def_property_float_sdna(prop, NULL, "pivot_x");
875         RNA_def_property_ui_text(prop, "Pivot X", "2D X coordinate of the absolute pivot");
876         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
877
878         prop = RNA_def_property(srna, "pivot_y", PROP_FLOAT, PROP_NONE);
879         RNA_def_property_float_sdna(prop, NULL, "pivot_y");
880         RNA_def_property_ui_text(prop, "Pivot Y", "2D Y coordinate of the absolute pivot");
881         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
882 }
883
884 static void rna_def_linestyle(BlenderRNA *brna)
885 {
886         StructRNA *srna;
887         PropertyRNA *prop;
888
889         static EnumPropertyItem panel_items[] = {
890                 {LS_PANEL_STROKES, "STROKES", 0, "Strokes", "Show the panel for stroke construction"},
891                 {LS_PANEL_COLOR, "COLOR", 0, "Color", "Show the panel for line color options"},
892                 {LS_PANEL_ALPHA, "ALPHA", 0, "Alpha", "Show the panel for alpha transparency options"},
893                 {LS_PANEL_THICKNESS, "THICKNESS", 0, "Thickness", "Show the panel for line thickness options"},
894                 {LS_PANEL_GEOMETRY, "GEOMETRY", 0, "Geometry", "Show the panel for stroke geometry options"},
895 #if 0 /* hidden for now */
896                 {LS_PANEL_MISC, "MISC", 0, "Misc", "Show the panel for miscellaneous options"},
897 #endif
898                 {0, NULL, 0, NULL, NULL}
899         };
900         static EnumPropertyItem chaining_items[] = {
901                 {LS_CHAINING_PLAIN, "PLAIN", 0, "Plain", "Plain chaining"},
902                 {LS_CHAINING_SKETCHY, "SKETCHY", 0, "Sketchy", "Sketchy chaining with a multiple touch"},
903                 {0, NULL, 0, NULL, NULL}
904         };
905         static EnumPropertyItem cap_items[] = {
906                 {LS_CAPS_BUTT, "BUTT", 0, "Butt", "Butt cap (flat)"},
907                 {LS_CAPS_ROUND, "ROUND", 0, "Round", "Round cap (half-circle)"},
908                 {LS_CAPS_SQUARE, "SQUARE", 0, "Square", "Square cap (flat and extended)"},
909                 {0, NULL, 0, NULL, NULL}
910         };
911         static EnumPropertyItem thickness_position_items[] = {
912                 {LS_THICKNESS_CENTER, "CENTER", 0, "Center", "Stroke is centered along stroke geometry"},
913                 {LS_THICKNESS_INSIDE, "INSIDE", 0, "Inside", "Stroke is drawn inside stroke geometry"},
914                 {LS_THICKNESS_OUTSIDE, "OUTSIDE", 0, "Outside", "Stroke is drawn outside stroke geometry"},
915                 {LS_THICKNESS_RELATIVE, "RELATIVE", 0, "Relative", "Stroke thickness is split by a user-defined ratio"},
916                 {0, NULL, 0, NULL, NULL}
917         };
918
919         srna = RNA_def_struct(brna, "FreestyleLineStyle", "ID");
920         RNA_def_struct_ui_text(srna, "Freestyle Line Style", "Freestyle line style, reusable by multiple line sets");
921         RNA_def_struct_ui_icon(srna, ICON_LINE_DATA);
922
923         prop = RNA_def_property(srna, "panel", PROP_ENUM, PROP_NONE);
924         RNA_def_property_enum_bitflag_sdna(prop, NULL, "panel");
925         RNA_def_property_enum_items(prop, panel_items);
926         RNA_def_property_ui_text(prop, "Panel", "Select the property panel to be shown");
927         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
928
929         prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
930         RNA_def_property_float_sdna(prop, NULL, "r");
931         RNA_def_property_array(prop, 3);
932         RNA_def_property_ui_text(prop, "Color", "Base line color, possibly modified by line color modifiers");
933         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
934
935         prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_FACTOR);
936         RNA_def_property_float_sdna(prop, NULL, "alpha");
937         RNA_def_property_range(prop, 0.0f, 1.0f);
938         RNA_def_property_ui_text(prop, "Alpha",
939                                  "Base alpha transparency, possibly modified by alpha transparency modifiers");
940         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
941
942         prop = RNA_def_property(srna, "thickness", PROP_FLOAT, PROP_NONE);
943         RNA_def_property_float_sdna(prop, NULL, "thickness");
944         RNA_def_property_range(prop, 0.0f, 10000.0f);
945         RNA_def_property_ui_text(prop, "Thickness", "Base line thickness, possibly modified by line thickness modifiers");
946         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
947
948         prop = RNA_def_property(srna, "thickness_position", PROP_ENUM, PROP_NONE);
949         RNA_def_property_enum_bitflag_sdna(prop, NULL, "thickness_position");
950         RNA_def_property_enum_items(prop, thickness_position_items);
951         RNA_def_property_ui_text(prop, "Thickness Position", "Select the position of stroke thickness");
952         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
953
954         prop = RNA_def_property(srna, "thickness_ratio", PROP_FLOAT, PROP_FACTOR);
955         RNA_def_property_float_sdna(prop, NULL, "thickness_ratio");
956         RNA_def_property_range(prop, 0.f, 1.f);
957         RNA_def_property_ui_text(prop, "Thickness Ratio",
958                                  "A number between 0 (inside) and 1 (outside) specifying the relative position of "
959                                  "stroke thickness");
960         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
961
962         prop = RNA_def_property(srna, "color_modifiers", PROP_COLLECTION, PROP_NONE);
963         RNA_def_property_collection_sdna(prop, NULL, "color_modifiers", NULL);
964         RNA_def_property_struct_type(prop, "LineStyleColorModifier");
965         RNA_def_property_ui_text(prop, "Color Modifiers", "List of line color modifiers");
966
967         prop = RNA_def_property(srna, "alpha_modifiers", PROP_COLLECTION, PROP_NONE);
968         RNA_def_property_collection_sdna(prop, NULL, "alpha_modifiers", NULL);
969         RNA_def_property_struct_type(prop, "LineStyleAlphaModifier");
970         RNA_def_property_ui_text(prop, "Alpha Modifiers", "List of alpha transparency modifiers");
971
972         prop = RNA_def_property(srna, "thickness_modifiers", PROP_COLLECTION, PROP_NONE);
973         RNA_def_property_collection_sdna(prop, NULL, "thickness_modifiers", NULL);
974         RNA_def_property_struct_type(prop, "LineStyleThicknessModifier");
975         RNA_def_property_ui_text(prop, "Thickness Modifiers", "List of line thickness modifiers");
976
977         prop = RNA_def_property(srna, "use_chaining", PROP_BOOLEAN, PROP_NONE);
978         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", LS_NO_CHAINING);
979         RNA_def_property_ui_text(prop, "Chaining", "Enable chaining of feature edges");
980         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
981
982         prop = RNA_def_property(srna, "chaining", PROP_ENUM, PROP_NONE);
983         RNA_def_property_enum_sdna(prop, NULL, "chaining");
984         RNA_def_property_enum_items(prop, chaining_items);
985         RNA_def_property_ui_text(prop, "Chaining", "Select the way how feature edges are jointed to form chains");
986         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
987
988         prop = RNA_def_property(srna, "rounds", PROP_INT, PROP_UNSIGNED);
989         RNA_def_property_int_sdna(prop, NULL, "rounds");
990         RNA_def_property_range(prop, 1, 1000);
991         RNA_def_property_ui_text(prop, "Rounds", "Number of rounds in a sketchy multiple touch");
992         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
993
994         prop = RNA_def_property(srna, "geometry_modifiers", PROP_COLLECTION, PROP_NONE);
995         RNA_def_property_collection_sdna(prop, NULL, "geometry_modifiers", NULL);
996         RNA_def_property_struct_type(prop, "LineStyleGeometryModifier");
997         RNA_def_property_ui_text(prop, "Geometry Modifiers", "List of stroke geometry modifiers");
998
999         prop = RNA_def_property(srna, "use_same_object", PROP_BOOLEAN, PROP_NONE);
1000         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SAME_OBJECT);
1001         RNA_def_property_ui_text(prop, "Same Object", "If true, only feature edges of the same object are joined");
1002         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1003
1004         prop = RNA_def_property(srna, "use_split_length", PROP_BOOLEAN, PROP_NONE);
1005         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SPLIT_LENGTH);
1006         RNA_def_property_ui_text(prop, "Use Split Length", "Enable chain splitting by curvilinear 2D length");
1007         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1008
1009         prop = RNA_def_property(srna, "split_length", PROP_FLOAT, PROP_NONE);
1010         RNA_def_property_float_sdna(prop, NULL, "split_length");
1011         RNA_def_property_range(prop, 0.0f, 10000.0f);
1012         RNA_def_property_ui_text(prop, "Split Length", "Curvilinear 2D length for chain splitting");
1013         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1014
1015         prop = RNA_def_property(srna, "use_angle_min", PROP_BOOLEAN, PROP_NONE);
1016         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MIN_2D_ANGLE);
1017         RNA_def_property_ui_text(prop, "Use Min 2D Angle",
1018                                  "Split chains at points with angles smaller than the minimum 2D angle");
1019         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1020
1021         prop = RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
1022         RNA_def_property_float_sdna(prop, NULL, "min_angle");
1023         RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
1024         RNA_def_property_ui_text(prop, "Min 2D Angle", "Minimum 2D angle for splitting chains");
1025         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1026
1027         prop = RNA_def_property(srna, "use_angle_max", PROP_BOOLEAN, PROP_NONE);
1028         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MAX_2D_ANGLE);
1029         RNA_def_property_ui_text(prop, "Use Max 2D Angle",
1030                                  "Split chains at points with angles larger than the maximum 2D angle");
1031         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1032
1033         prop = RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
1034         RNA_def_property_float_sdna(prop, NULL, "max_angle");
1035         RNA_def_property_range(prop, 0.0f, DEG2RADF(180.0f));
1036         RNA_def_property_ui_text(prop, "Max 2D Angle", "Maximum 2D angle for splitting chains");
1037         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1038
1039         prop = RNA_def_property(srna, "use_length_min", PROP_BOOLEAN, PROP_NONE);
1040         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MIN_2D_LENGTH);
1041         RNA_def_property_ui_text(prop, "Use Min 2D Length", "Enable the selection of chains by a minimum 2D length");
1042         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1043
1044         prop = RNA_def_property(srna, "length_min", PROP_FLOAT, PROP_NONE);
1045         RNA_def_property_float_sdna(prop, NULL, "min_length");
1046         RNA_def_property_range(prop, 0.0f, 10000.0f);
1047         RNA_def_property_ui_text(prop, "Min 2D Length", "Minimum curvilinear 2D length for the selection of chains");
1048         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1049
1050         prop = RNA_def_property(srna, "use_length_max", PROP_BOOLEAN, PROP_NONE);
1051         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MAX_2D_LENGTH);
1052         RNA_def_property_ui_text(prop, "Use Max 2D Length", "Enable the selection of chains by a maximum 2D length");
1053         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1054
1055         prop = RNA_def_property(srna, "length_max", PROP_FLOAT, PROP_NONE);
1056         RNA_def_property_float_sdna(prop, NULL, "max_length");
1057         RNA_def_property_range(prop, 0.0f, 10000.0f);
1058         RNA_def_property_ui_text(prop, "Max 2D Length", "Maximum curvilinear 2D length for the selection of chains");
1059         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1060
1061         prop = RNA_def_property(srna, "use_split_pattern", PROP_BOOLEAN, PROP_NONE);
1062         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_SPLIT_PATTERN);
1063         RNA_def_property_ui_text(prop, "Use Split Pattern", "Enable chain splitting by dashed line patterns");
1064         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1065
1066         prop = RNA_def_property(srna, "split_dash1", PROP_INT, PROP_UNSIGNED);
1067         RNA_def_property_int_sdna(prop, NULL, "split_dash1");
1068         RNA_def_property_range(prop, 0, USHRT_MAX);
1069         RNA_def_property_ui_text(prop, "Split Dash 1", "Length of the 1st dash for splitting");
1070         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1071
1072         prop = RNA_def_property(srna, "split_gap1", PROP_INT, PROP_UNSIGNED);
1073         RNA_def_property_int_sdna(prop, NULL, "split_gap1");
1074         RNA_def_property_range(prop, 0, USHRT_MAX);
1075         RNA_def_property_ui_text(prop, "Split Gap 1", "Length of the 1st gap for splitting");
1076         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1077
1078         prop = RNA_def_property(srna, "split_dash2", PROP_INT, PROP_UNSIGNED);
1079         RNA_def_property_int_sdna(prop, NULL, "split_dash2");
1080         RNA_def_property_range(prop, 0, USHRT_MAX);
1081         RNA_def_property_ui_text(prop, "Split Dash 2", "Length of the 2nd dash for splitting");
1082         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1083
1084         prop = RNA_def_property(srna, "split_gap2", PROP_INT, PROP_UNSIGNED);
1085         RNA_def_property_int_sdna(prop, NULL, "split_gap2");
1086         RNA_def_property_range(prop, 0, USHRT_MAX);
1087         RNA_def_property_ui_text(prop, "Split Gap 2", "Length of the 2nd gap for splitting");
1088         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1089
1090         prop = RNA_def_property(srna, "split_dash3", PROP_INT, PROP_UNSIGNED);
1091         RNA_def_property_int_sdna(prop, NULL, "split_dash3");
1092         RNA_def_property_range(prop, 0, USHRT_MAX);
1093         RNA_def_property_ui_text(prop, "Split Dash 3", "Length of the 3rd dash for splitting");
1094         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1095
1096         prop = RNA_def_property(srna, "split_gap3", PROP_INT, PROP_UNSIGNED);
1097         RNA_def_property_int_sdna(prop, NULL, "split_gap3");
1098         RNA_def_property_range(prop, 0, USHRT_MAX);
1099         RNA_def_property_ui_text(prop, "Split Gap 3", "Length of the 3rd gap for splitting");
1100         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1101
1102         prop = RNA_def_property(srna, "material_boundary", PROP_BOOLEAN, PROP_NONE);
1103         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_MATERIAL_BOUNDARY);
1104         RNA_def_property_ui_text(prop, "Material Boundary", "If true, chains of feature edges are split at material boundaries");
1105         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1106
1107         prop = RNA_def_property(srna, "use_dashed_line", PROP_BOOLEAN, PROP_NONE);
1108         RNA_def_property_boolean_sdna(prop, NULL, "flag", LS_DASHED_LINE);
1109         RNA_def_property_ui_text(prop, "Dashed Line", "Enable or disable dashed line");
1110         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1111
1112         prop = RNA_def_property(srna, "caps", PROP_ENUM, PROP_NONE);
1113         RNA_def_property_enum_bitflag_sdna(prop, NULL, "caps");
1114         RNA_def_property_enum_items(prop, cap_items);
1115         RNA_def_property_ui_text(prop, "Cap", "Select the shape of both ends of strokes");
1116         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1117
1118         prop = RNA_def_property(srna, "dash1", PROP_INT, PROP_UNSIGNED);
1119         RNA_def_property_int_sdna(prop, NULL, "dash1");
1120         RNA_def_property_range(prop, 0, USHRT_MAX);
1121         RNA_def_property_ui_text(prop, "Dash 1", "Length of the 1st dash for dashed lines");
1122         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1123
1124         prop = RNA_def_property(srna, "gap1", PROP_INT, PROP_UNSIGNED);
1125         RNA_def_property_int_sdna(prop, NULL, "gap1");
1126         RNA_def_property_range(prop, 0, USHRT_MAX);
1127         RNA_def_property_ui_text(prop, "Gap 1", "Length of the 1st gap for dashed lines");
1128         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1129
1130         prop = RNA_def_property(srna, "dash2", PROP_INT, PROP_UNSIGNED);
1131         RNA_def_property_int_sdna(prop, NULL, "dash2");
1132         RNA_def_property_range(prop, 0, USHRT_MAX);
1133         RNA_def_property_ui_text(prop, "Dash 2", "Length of the 2nd dash for dashed lines");
1134         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1135
1136         prop = RNA_def_property(srna, "gap2", PROP_INT, PROP_UNSIGNED);
1137         RNA_def_property_int_sdna(prop, NULL, "gap2");
1138         RNA_def_property_range(prop, 0, USHRT_MAX);
1139         RNA_def_property_ui_text(prop, "Gap 2", "Length of the 2nd gap for dashed lines");
1140         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1141
1142         prop = RNA_def_property(srna, "dash3", PROP_INT, PROP_UNSIGNED);
1143         RNA_def_property_int_sdna(prop, NULL, "dash3");
1144         RNA_def_property_range(prop, 0, USHRT_MAX);
1145         RNA_def_property_ui_text(prop, "Dash 3", "Length of the 3rd dash for dashed lines");
1146         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1147
1148         prop = RNA_def_property(srna, "gap3", PROP_INT, PROP_UNSIGNED);
1149         RNA_def_property_int_sdna(prop, NULL, "gap3");
1150         RNA_def_property_range(prop, 0, USHRT_MAX);
1151         RNA_def_property_ui_text(prop, "Gap 3", "Length of the 3rd gap for dashed lines");
1152         RNA_def_property_update(prop, NC_LINESTYLE, NULL);
1153 }
1154
1155 void RNA_def_linestyle(BlenderRNA *brna)
1156 {
1157         rna_def_linestyle_modifiers(brna);
1158         rna_def_linestyle(brna);
1159 }
1160
1161 #endif