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