* projection paint options in the toolbar
[blender.git] / source / blender / makesrna / intern / rna_sculpt_paint.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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * Contributor(s): Campbell Barton
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <stdlib.h>
26
27 #include "RNA_define.h"
28 #include "RNA_types.h"
29
30 #include "rna_internal.h"
31
32 #include "DNA_scene_types.h"
33
34 #ifdef RNA_RUNTIME
35
36 static PointerRNA rna_ParticleEdit_brush_get(PointerRNA *ptr)
37 {
38         ParticleEditSettings *pset= (ParticleEditSettings*)ptr->data;
39         ParticleBrushData *brush= NULL;;
40
41         if(pset->brushtype != PE_BRUSH_NONE)
42                 brush= &pset->brush[pset->brushtype];
43
44         return rna_pointer_inherit_refine(ptr, &RNA_ParticleBrush, brush);
45 }
46
47 static PointerRNA rna_ParticleBrush_curve_get(PointerRNA *ptr)
48 {
49         return rna_pointer_inherit_refine(ptr, &RNA_CurveMapping, NULL);
50 }
51
52 #else
53
54 static void rna_def_sculpt(BlenderRNA  *brna)
55 {
56         StructRNA *srna;
57         PropertyRNA *prop;
58
59         srna= RNA_def_struct(brna, "Sculpt", NULL);
60         RNA_def_struct_ui_text(srna, "Sculpt", "");
61         
62         prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
63         RNA_def_property_struct_type(prop, "Brush");
64         RNA_def_property_ui_text(prop, "Brush", "");
65
66         prop= RNA_def_property(srna, "symmetry_x", PROP_BOOLEAN, PROP_NONE);
67         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_X);
68         RNA_def_property_ui_text(prop, "Symmetry X", "Mirror brush across the X axis.");
69
70         prop= RNA_def_property(srna, "symmetry_y", PROP_BOOLEAN, PROP_NONE);
71         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Y);
72         RNA_def_property_ui_text(prop, "Symmetry Y", "Mirror brush across the Y axis.");
73
74         prop= RNA_def_property(srna, "symmetry_z", PROP_BOOLEAN, PROP_NONE);
75         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_SYMM_Z);
76         RNA_def_property_ui_text(prop, "Symmetry Z", "Mirror brush across the Z axis.");
77
78         prop= RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE);
79         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_X);
80         RNA_def_property_ui_text(prop, "Lock X", "Disallow changes to the X axis of vertices.");
81
82         prop= RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE);
83         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Y);
84         RNA_def_property_ui_text(prop, "Lock Y", "Disallow changes to the Y axis of vertices.");
85
86         prop= RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE);
87         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_LOCK_Z);
88         RNA_def_property_ui_text(prop, "Lock Z", "Disallow changes to the Z axis of vertices.");
89
90         prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
91         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_BRUSH);
92         RNA_def_property_ui_text(prop, "Show Brush", "");
93
94         prop= RNA_def_property(srna, "partial_redraw", PROP_BOOLEAN, PROP_NONE);
95         RNA_def_property_boolean_sdna(prop, NULL, "flags", SCULPT_DRAW_FAST);
96         RNA_def_property_ui_text(prop, "Partial Redraw", "Optimize sculpting by only refreshing modified faces.");
97 }
98
99 static void rna_def_vertex_paint(BlenderRNA *brna)
100 {
101         StructRNA *srna;
102         PropertyRNA *prop;
103         static EnumPropertyItem prop_mode_items[] = {
104                 {0, "MIX", 0, "Mix", "Use mix blending mode while painting."},
105                 {1, "ADD", 0, "Add", "Use add blending mode while painting."},
106                 {2, "SUB", 0, "Subtract", "Use subtract blending mode while painting."},
107                 {3, "MUL", 0, "Multiply", "Use multiply blending mode while painting."},
108                 {4, "BLUR", 0, "Blur", "Blur the color with surrounding values"},
109                 {5, "LIGHTEN", 0, "Lighten", "Use lighten blending mode while painting."},
110                 {6, "DARKEN", 0, "Darken", "Use darken blending mode while painting."},
111                 {0, NULL, 0, NULL, NULL}};
112         
113         srna= RNA_def_struct(brna, "VertexPaint", NULL);
114         RNA_def_struct_sdna(srna, "VPaint");
115         RNA_def_struct_ui_text(srna, "Vertex Paint", "Properties of vertex and weight paint mode.");
116     
117         prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
118         RNA_def_property_struct_type(prop, "Brush");
119         RNA_def_property_ui_text(prop, "Brush", "");
120
121         prop= RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
122         RNA_def_property_enum_items(prop, prop_mode_items);
123         RNA_def_property_ui_text(prop, "Brush Mode", "Mode in which color is painted.");
124         
125         prop= RNA_def_property(srna, "all_faces", PROP_BOOLEAN, PROP_NONE);
126         RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_AREA);
127         RNA_def_property_ui_text(prop, "All Faces", "Paint on all faces inside brush.");
128         
129         prop= RNA_def_property(srna, "vertex_dist", PROP_BOOLEAN, PROP_NONE);
130         RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SOFT);
131         RNA_def_property_ui_text(prop, "Vertex Dist", "Use distances to vertices (instead of paint entire faces).");
132         
133         prop= RNA_def_property(srna, "normals", PROP_BOOLEAN, PROP_NONE);
134         RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_NORMALS);
135         RNA_def_property_ui_text(prop, "Normals", "Applies the vertex normal before painting.");
136         
137         prop= RNA_def_property(srna, "spray", PROP_BOOLEAN, PROP_NONE);
138         RNA_def_property_boolean_sdna(prop, NULL, "flag", VP_SPRAY);
139         RNA_def_property_ui_text(prop, "Spray", "Keep applying paint effect while holding mouse.");
140         
141         prop= RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE);
142         RNA_def_property_range(prop, 0.1f, 5.0f);
143         RNA_def_property_ui_text(prop, "Gamma", "Vertex paint Gamma.");
144         
145         prop= RNA_def_property(srna, "mul", PROP_FLOAT, PROP_NONE);
146         RNA_def_property_range(prop, 0.1f, 50.0f);
147         RNA_def_property_ui_text(prop, "Mul", "Vertex paint Mul.");
148 }
149
150 static void rna_def_image_paint(BlenderRNA *brna)
151 {
152         StructRNA *srna;
153         PropertyRNA *prop;
154
155         static EnumPropertyItem tool_items[] = {
156                 {PAINT_TOOL_DRAW, "DRAW", 0, "Draw", ""},
157                 {PAINT_TOOL_SOFTEN, "SOFTEN", 0, "Soften", ""},
158                 {PAINT_TOOL_SMEAR, "SMEAR", 0, "Smear", ""},
159                 {PAINT_TOOL_CLONE, "CLONE", 0, "Clone", ""},
160                 {0, NULL, 0, NULL, NULL}};
161         
162         srna= RNA_def_struct(brna, "ImagePaint", NULL);
163         RNA_def_struct_sdna(srna, "ImagePaintSettings");
164         RNA_def_struct_ui_text(srna, "Image Paint", "Properties of image and texture painting mode.");
165  
166         prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
167         RNA_def_property_struct_type(prop, "Brush");
168         RNA_def_property_ui_text(prop, "Brush", "");
169    
170         prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE);
171         RNA_def_property_enum_items(prop, tool_items);
172         RNA_def_property_ui_text(prop, "Tool", "");
173
174         /* booleans */
175
176         prop= RNA_def_property(srna, "show_brush_draw", PROP_BOOLEAN, PROP_NONE);
177         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL);
178         RNA_def_property_ui_text(prop, "Show Brush Draw", "Enables brush shape while drawing.");
179
180         prop= RNA_def_property(srna, "show_brush", PROP_BOOLEAN, PROP_NONE);
181         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_DRAW_TOOL_DRAWING);
182         RNA_def_property_ui_text(prop, "Show Brush", "Enables brush shape while not drawing.");
183                 
184         prop= RNA_def_property(srna, "use_projection", PROP_BOOLEAN, PROP_NONE);
185         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_DISABLE);
186         RNA_def_property_ui_text(prop, "Project Paint", "Use projection painting for improved consistency in the brush strokes.");
187         
188         prop= RNA_def_property(srna, "use_occlude", PROP_BOOLEAN, PROP_NONE);
189         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_XRAY);
190         RNA_def_property_ui_text(prop, "Occlude", "Only paint onto the faces directly under the brush (slower)");
191         
192         prop= RNA_def_property(srna, "use_backface_cull", PROP_BOOLEAN, PROP_NONE);
193         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_BACKFACE);
194         RNA_def_property_ui_text(prop, "Cull", "Ignore faces pointing away from the view (faster)");
195         
196         prop= RNA_def_property(srna, "use_normal_falloff", PROP_BOOLEAN, PROP_NONE);
197         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_FLAT);
198         RNA_def_property_ui_text(prop, "Normal", "Paint most on faces pointing towards the view");
199         
200         prop= RNA_def_property(srna, "use_stencil_layer", PROP_BOOLEAN, PROP_NONE);
201         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK);
202         RNA_def_property_ui_text(prop, "Stencil Layer", "Set the mask layer from the UV layer buttons");
203         
204         prop= RNA_def_property(srna, "invert_stencil", PROP_BOOLEAN, PROP_NONE);
205         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK_INV);
206         RNA_def_property_ui_text(prop, "Invert", "Invert the stencil layer");
207         
208         prop= RNA_def_property(srna, "use_clone_layer", PROP_BOOLEAN, PROP_NONE);
209         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_CLONE);
210         RNA_def_property_ui_text(prop, "Clone Layer", "Use another UV layer as clone source, otherwise use 3D the cursor as the source");
211         
212         /* integers */
213         
214         prop= RNA_def_property(srna, "seam_bleed", PROP_INT, PROP_UNSIGNED);
215         RNA_def_property_ui_range(prop, 0, 8, 0, 0);
216         RNA_def_property_ui_text(prop, "Bleed", "Extend paint beyond the faces UVs to reduce seams (in pixels, slower).");
217
218         prop= RNA_def_property(srna, "normal_angle", PROP_INT, PROP_UNSIGNED);
219         RNA_def_property_range(prop, 0, 90);
220         RNA_def_property_ui_text(prop, "Angle", "Paint most on faces pointing towards the view acording to this angle.");
221 }
222
223 static void rna_def_particle_edit(BlenderRNA *brna)
224 {
225         StructRNA *srna;
226         PropertyRNA *prop;
227
228         static EnumPropertyItem tool_items[] = {
229                 {PE_BRUSH_NONE, "NONE", 0, "None", "Don't use any brush."},
230                 {PE_BRUSH_COMB, "COMB", 0, "Comb", "Comb hairs."},
231                 {PE_BRUSH_SMOOTH, "SMOOTH", 0, "Smooth", "Smooth hairs."},
232                 {PE_BRUSH_WEIGHT, "WEIGHT", 0, "Weight", "Assign weight to hairs."},
233                 {PE_BRUSH_ADD, "ADD", 0, "Add", "Add hairs."},
234                 {PE_BRUSH_LENGTH, "LENGTH", 0, "Length", "Make hairs longer or shorter."},
235                 {PE_BRUSH_PUFF, "PUFF", 0, "Puff", "Make hairs stand up."},
236                 {PE_BRUSH_CUT, "CUT", 0, "Cut", "Cut hairs."},
237                 {0, NULL, 0, NULL, NULL}};
238
239         static EnumPropertyItem select_mode_items[] = {
240                 {SCE_SELECT_PATH, "PATH", ICON_EDGESEL, "Path", ""}, // XXX icon
241                 {SCE_SELECT_POINT, "POINT", ICON_VERTEXSEL, "Point", ""}, // XXX icon
242                 {SCE_SELECT_END, "END", ICON_FACESEL, "End", "E"}, // XXX icon
243                 {0, NULL, 0, NULL, NULL}};
244
245         static EnumPropertyItem puff_mode[] = {
246                 {0, "ADD", 0, "Add", "Make hairs more puffy."},
247                 {1, "SUB", 0, "Sub", "Make hairs less puffy."},
248                 {0, NULL, 0, NULL, NULL}};
249
250         static EnumPropertyItem length_mode[] = {
251                 {0, "GROW", 0, "Grow", "Make hairs longer."},
252                 {1, "SHRINK", 0, "Shrink", "Make hairs shorter."},
253                 {0, NULL, 0, NULL, NULL}};
254
255         /* edit */
256
257         srna= RNA_def_struct(brna, "ParticleEdit", NULL);
258         RNA_def_struct_sdna(srna, "ParticleEditSettings");
259         RNA_def_struct_ui_text(srna, "Particle Edit", "Properties of particle editing mode.");
260
261         prop= RNA_def_property(srna, "tool", PROP_ENUM, PROP_NONE);
262         RNA_def_property_enum_sdna(prop, NULL, "brushtype");
263         RNA_def_property_enum_items(prop, tool_items);
264         RNA_def_property_ui_text(prop, "Tool", "");
265
266         prop= RNA_def_property(srna, "selection_mode", PROP_ENUM, PROP_NONE);
267         RNA_def_property_enum_bitflag_sdna(prop, NULL, "selectmode");
268         RNA_def_property_enum_items(prop, select_mode_items);
269         RNA_def_property_ui_text(prop, "Selection Mode", "Particle select and display mode.");
270
271         prop= RNA_def_property(srna, "keep_lengths", PROP_BOOLEAN, PROP_NONE);
272         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_KEEP_LENGTHS);
273         RNA_def_property_ui_text(prop, "Keep Lengths", "Keep path lengths constant.");
274
275         prop= RNA_def_property(srna, "keep_root", PROP_BOOLEAN, PROP_NONE);
276         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_LOCK_FIRST);
277         RNA_def_property_ui_text(prop, "Keep Root", "Keep root keys unmodified.");
278
279         prop= RNA_def_property(srna, "emitter_deflect", PROP_BOOLEAN, PROP_NONE);
280         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_DEFLECT_EMITTER);
281         RNA_def_property_ui_text(prop, "Deflect Emitter", "Keep paths from intersecting the emitter.");
282
283         prop= RNA_def_property(srna, "emitter_distance", PROP_FLOAT, PROP_UNSIGNED);
284         RNA_def_property_float_sdna(prop, NULL, "emitterdist");
285         RNA_def_property_ui_range(prop, 0.0f, 10.0f, 10, 3);
286         RNA_def_property_ui_text(prop, "Emitter Distance", "Distance to keep particles away from the emitter.");
287
288         prop= RNA_def_property(srna, "show_time", PROP_BOOLEAN, PROP_NONE);
289         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_SHOW_TIME);
290         RNA_def_property_ui_text(prop, "Show Time", "Show time values of the baked keys.");
291
292         prop= RNA_def_property(srna, "show_children", PROP_BOOLEAN, PROP_NONE);
293         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_SHOW_CHILD);
294         RNA_def_property_ui_text(prop, "Show Children", "Show child particles.");
295
296         prop= RNA_def_property(srna, "mirror_x", PROP_BOOLEAN, PROP_NONE);
297         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_X_MIRROR);
298         RNA_def_property_ui_text(prop, "X-Axis Mirror", "Mirror operations over the X axis while editing.");
299
300         prop= RNA_def_property(srna, "add_interpolate", PROP_BOOLEAN, PROP_NONE);
301         RNA_def_property_boolean_sdna(prop, NULL, "flag", PE_INTERPOLATE_ADDED);
302         RNA_def_property_ui_text(prop, "Interpolate", "Interpolate new particles from the existing ones.");
303
304         prop= RNA_def_property(srna, "add_keys", PROP_INT, PROP_NONE);
305         RNA_def_property_int_sdna(prop, NULL, "totaddkey");
306         RNA_def_property_range(prop, 2, INT_MAX);
307         RNA_def_property_ui_range(prop, 2, 20, 10, 3);
308         RNA_def_property_ui_text(prop, "Keys", "How many keys to make new particles with.");
309
310         prop= RNA_def_property(srna, "brush", PROP_POINTER, PROP_NONE);
311         RNA_def_property_struct_type(prop, "ParticleBrush");
312         RNA_def_property_pointer_funcs(prop, "rna_ParticleEdit_brush_get", NULL, NULL);
313         RNA_def_property_ui_text(prop, "Brush", "");
314
315         /* brush */
316
317         srna= RNA_def_struct(brna, "ParticleBrush", NULL);
318         RNA_def_struct_sdna(srna, "ParticleBrushData");
319         RNA_def_struct_ui_text(srna, "Particle Brush", "Particle editing brush.");
320
321         prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE);
322         RNA_def_property_range(prop, 1, INT_MAX);
323         RNA_def_property_ui_range(prop, 1, 100, 10, 3);
324         RNA_def_property_ui_text(prop, "Size", "Brush size.");
325
326         prop= RNA_def_property(srna, "strength", PROP_INT, PROP_NONE);
327         RNA_def_property_range(prop, 1, INT_MAX);
328         RNA_def_property_ui_range(prop, 1, 100, 10, 3);
329         RNA_def_property_ui_text(prop, "Strength", "Brush strength.");
330
331         prop= RNA_def_property(srna, "steps", PROP_INT, PROP_NONE);
332         RNA_def_property_int_sdna(prop, NULL, "step");
333         RNA_def_property_range(prop, 1, INT_MAX);
334         RNA_def_property_ui_range(prop, 1, 50, 10, 3);
335         RNA_def_property_ui_text(prop, "Steps", "Brush steps.");
336
337         prop= RNA_def_property(srna, "puff_mode", PROP_ENUM, PROP_NONE);
338         RNA_def_property_enum_sdna(prop, NULL, "invert");
339         RNA_def_property_enum_items(prop, puff_mode);
340         RNA_def_property_ui_text(prop, "Puff Mode", "");
341
342         prop= RNA_def_property(srna, "length_mode", PROP_ENUM, PROP_NONE);
343         RNA_def_property_enum_sdna(prop, NULL, "invert");
344         RNA_def_property_enum_items(prop, length_mode);
345         RNA_def_property_ui_text(prop, "Length Mode", "");
346
347         /* dummy */
348         prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
349         RNA_def_property_struct_type(prop, "CurveMapping");
350         RNA_def_property_pointer_funcs(prop, "rna_ParticleBrush_curve_get", NULL, NULL);
351         RNA_def_property_ui_text(prop, "Curve", "");
352 }
353
354 void RNA_def_sculpt_paint(BlenderRNA *brna)
355 {
356         rna_def_sculpt(brna);
357         rna_def_vertex_paint(brna);
358         rna_def_image_paint(brna);
359         rna_def_particle_edit(brna);
360 }
361
362 #endif
363