/blender/makesrna: Removed final points in UI strings and messages.
[blender-staging.git] / source / blender / makesrna / intern / rna_meta.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), Juho Vepsalainen, Jiri Hnidek
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/makesrna/intern/rna_meta.c
26  *  \ingroup RNA
27  */
28
29
30 #include <stdlib.h>
31
32 #include "RNA_define.h"
33 #include "RNA_enum_types.h"
34
35 #include "rna_internal.h"
36
37 #include "DNA_mesh_types.h"
38 #include "DNA_meta_types.h"
39
40 #ifdef RNA_RUNTIME
41
42 #include "BLI_math.h"
43
44 #include "MEM_guardedalloc.h"
45
46 #include "DNA_scene_types.h"
47 #include "DNA_object_types.h"
48
49 #include "BKE_mball.h"
50 #include "BKE_depsgraph.h"
51 #include "BKE_main.h"
52
53 #include "WM_types.h"
54 #include "WM_api.h"
55
56 static int rna_Meta_texspace_editable(PointerRNA *ptr)
57 {
58         MetaBall *mb= (MetaBall*)ptr->data;
59         return (mb->texflag & MB_AUTOSPACE)? 0: PROP_EDITABLE;
60 }
61
62 static void rna_Meta_texspace_loc_get(PointerRNA *ptr, float *values)
63 {
64         MetaBall *mb= (MetaBall*)ptr->data;
65         
66         /* tex_space_mball() needs object.. ugh */
67         
68         copy_v3_v3(values, mb->loc);
69 }
70
71 static void rna_Meta_texspace_loc_set(PointerRNA *ptr, const float *values)
72 {
73         MetaBall *mb= (MetaBall*)ptr->data;
74         
75         copy_v3_v3(mb->loc, values);
76 }
77
78 static void rna_Meta_texspace_size_get(PointerRNA *ptr, float *values)
79 {
80         MetaBall *mb= (MetaBall*)ptr->data;
81         
82         /* tex_space_mball() needs object.. ugh */
83         
84         copy_v3_v3(values, mb->size);
85 }
86
87 static void rna_Meta_texspace_size_set(PointerRNA *ptr, const float *values)
88 {
89         MetaBall *mb= (MetaBall*)ptr->data;
90         
91         copy_v3_v3(mb->size, values);
92 }
93
94
95 static void rna_MetaBall_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
96 {
97         MetaBall *mb= ptr->id.data;
98         Object *ob;
99
100         /* cheating way for importers to avoid slow updates */
101         if(mb->id.us > 0) {
102                 for(ob=bmain->object.first; ob; ob= ob->id.next)
103                         if(ob->data == mb)
104                                 copy_mball_properties(scene, ob);
105         
106                 DAG_id_tag_update(&mb->id, 0);
107                 WM_main_add_notifier(NC_GEOM|ND_DATA, mb);
108         }
109 }
110
111 static void rna_MetaBall_update_rotation(Main *bmain, Scene *scene, PointerRNA *ptr)
112 {
113         MetaElem *ml= ptr->data;
114         normalize_qt(ml->quat);
115         rna_MetaBall_update_data(bmain, scene, ptr);
116 }
117
118 static MetaElem *rna_MetaBall_elements_new(MetaBall *mb, int type)
119 {
120         MetaElem *ml= add_metaball_element(mb, type);
121
122         /* cheating way for importers to avoid slow updates */
123         if(mb->id.us > 0) {
124                 DAG_id_tag_update(&mb->id, 0);
125                 WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
126         }
127
128         return ml;
129 }
130
131 static void rna_MetaBall_elements_remove(MetaBall *mb, ReportList *reports, MetaElem *ml)
132 {
133         int found= 0;
134
135         found= BLI_remlink_safe(&mb->elems, ml);
136
137         if(!found) {
138                 BKE_reportf(reports, RPT_ERROR, "MetaBall \"%s\" does not contain spline given", mb->id.name+2);
139                 return;
140         }
141
142         MEM_freeN(ml);
143         /* invalidate pointer!, no can do */
144
145         /* cheating way for importers to avoid slow updates */
146         if(mb->id.us > 0) {
147                 DAG_id_tag_update(&mb->id, 0);
148                 WM_main_add_notifier(NC_GEOM|ND_DATA, &mb->id);
149         }
150 }
151
152 #else
153
154 static void rna_def_metaelement(BlenderRNA *brna)
155 {
156         StructRNA *srna;
157         PropertyRNA *prop;
158
159         srna= RNA_def_struct(brna, "MetaElement", NULL);
160         RNA_def_struct_sdna(srna, "MetaElem");
161         RNA_def_struct_ui_text(srna, "Meta Element", "Blobby element in a MetaBall datablock");
162         RNA_def_struct_ui_icon(srna, ICON_OUTLINER_DATA_META);
163
164         /* enums */
165         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
166         RNA_def_property_enum_items(prop, metaelem_type_items);
167         RNA_def_property_ui_text(prop, "Type", "Metaball types");
168         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
169         
170         /* number values */
171         prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
172         RNA_def_property_float_sdna(prop, NULL, "x");
173         RNA_def_property_array(prop, 3);
174         RNA_def_property_ui_text(prop, "Location", "");
175         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
176
177         prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
178         RNA_def_property_float_sdna(prop, NULL, "quat");
179         RNA_def_property_ui_text(prop, "Rotation", "Normalized quaternion rotation");
180         RNA_def_property_update(prop, 0, "rna_MetaBall_update_rotation");
181
182         prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_UNSIGNED|PROP_UNIT_LENGTH);
183         RNA_def_property_float_sdna(prop, NULL, "rad");
184         RNA_def_property_ui_text(prop, "Radius", "");
185         RNA_def_property_range(prop, 0.0f, FLT_MAX);
186         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
187
188         prop= RNA_def_property(srna, "size_x", PROP_FLOAT, PROP_DISTANCE);
189         RNA_def_property_float_sdna(prop, NULL, "expx");
190         RNA_def_property_range(prop, 0.0f, 20.0f);
191         RNA_def_property_ui_text(prop, "Size X", "Size of element, use of components depends on element type");
192         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
193
194         prop= RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_DISTANCE);
195         RNA_def_property_float_sdna(prop, NULL, "expy");
196         RNA_def_property_range(prop, 0.0f, 20.0f);
197         RNA_def_property_ui_text(prop, "Size Y", "Size of element, use of components depends on element type");
198         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
199
200         prop= RNA_def_property(srna, "size_z", PROP_FLOAT, PROP_DISTANCE);
201         RNA_def_property_float_sdna(prop, NULL, "expz");
202         RNA_def_property_range(prop, 0.0f, 20.0f);
203         RNA_def_property_ui_text(prop, "Size Z", "Size of element, use of components depends on element type");
204         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
205         
206         prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE);
207         RNA_def_property_float_sdna(prop, NULL, "s");
208         RNA_def_property_range(prop, 0.0f, 10.0f);
209         RNA_def_property_ui_text(prop, "Stiffness", "Stiffness defines how much of the element to fill");
210         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
211         
212         /* flags */
213         prop= RNA_def_property(srna, "use_negative", PROP_BOOLEAN, PROP_NONE);
214         RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_NEGATIVE);
215         RNA_def_property_ui_text(prop, "Negative", "Set metaball as negative one");
216         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
217         
218         prop= RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
219         RNA_def_property_boolean_sdna(prop, NULL, "flag", MB_HIDE);
220         RNA_def_property_ui_text(prop, "Hide", "Hide element");
221         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
222 }
223
224 /* mball.elements */
225 static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
226 {
227         StructRNA *srna;
228         PropertyRNA *prop;
229
230         FunctionRNA *func;
231         PropertyRNA *parm;
232
233         RNA_def_property_srna(cprop, "MetaBallElements");
234         srna= RNA_def_struct(brna, "MetaBallElements", NULL);
235         RNA_def_struct_sdna(srna, "MetaBall");
236         RNA_def_struct_ui_text(srna, "Meta Elements", "Collection of metaball elements");
237
238         func= RNA_def_function(srna, "new", "rna_MetaBall_elements_new");
239         RNA_def_function_ui_description(func, "Add a new spline to the curve");
240         RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta-element");
241         parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created meta-element");
242         RNA_def_function_return(func, parm);
243
244         func= RNA_def_function(srna, "remove", "rna_MetaBall_elements_remove");
245         RNA_def_function_ui_description(func, "Remove a spline from a curve");
246         RNA_def_function_flag(func, FUNC_USE_REPORTS);
247         parm= RNA_def_pointer(func, "element", "MetaElement", "", "The element to remove");
248         RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
249
250         prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
251         RNA_def_property_pointer_sdna(prop, NULL, "lastelem");
252         RNA_def_property_ui_text(prop, "Active Element", "Last selected element");
253 }
254
255 static void rna_def_metaball(BlenderRNA *brna)
256 {
257         StructRNA *srna;
258         PropertyRNA *prop;
259         static EnumPropertyItem prop_update_items[] = {
260                 {MB_UPDATE_ALWAYS, "UPDATE_ALWAYS", 0, "Always", "While editing, update metaball always"},
261                 {MB_UPDATE_HALFRES, "HALFRES", 0, "Half", "While editing, update metaball in half resolution"},
262                 {MB_UPDATE_FAST, "FAST", 0, "Fast", "While editing, update metaball without polygonization"},
263                 {MB_UPDATE_NEVER, "NEVER", 0, "Never", "While editing, don't update metaball at all"},
264                 {0, NULL, 0, NULL, NULL}};
265         
266         srna= RNA_def_struct(brna, "MetaBall", "ID");
267         RNA_def_struct_ui_text(srna, "MetaBall", "Metaball datablock to defined blobby surfaces");
268         RNA_def_struct_ui_icon(srna, ICON_META_DATA);
269
270         prop= RNA_def_property(srna, "elements", PROP_COLLECTION, PROP_NONE);
271         RNA_def_property_collection_sdna(prop, NULL, "elems", NULL);
272         RNA_def_property_struct_type(prop, "MetaElement");
273         RNA_def_property_ui_text(prop, "Elements", "Meta elements");
274         rna_def_metaball_elements(brna, prop);
275
276         /* enums */
277         prop= RNA_def_property(srna, "update_method", PROP_ENUM, PROP_NONE);
278         RNA_def_property_enum_sdna(prop, NULL, "flag");
279         RNA_def_property_enum_items(prop, prop_update_items);
280         RNA_def_property_ui_text(prop, "Update", "Metaball edit update behavior");
281         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
282         
283         /* number values */
284         prop= RNA_def_property(srna, "resolution", PROP_FLOAT, PROP_DISTANCE);
285         RNA_def_property_float_sdna(prop, NULL, "wiresize");
286         RNA_def_property_range(prop, 0.050f, 1.0f);
287         RNA_def_property_ui_text(prop, "Wire Size", "Polygonization resolution in the 3D viewport");
288         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
289         
290         prop= RNA_def_property(srna, "render_resolution", PROP_FLOAT, PROP_DISTANCE);
291         RNA_def_property_float_sdna(prop, NULL, "rendersize");
292         RNA_def_property_range(prop, 0.050f, 1.0f);
293         RNA_def_property_ui_text(prop, "Render Size", "Polygonization resolution in rendering");
294         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
295         
296         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
297         RNA_def_property_float_sdna(prop, NULL, "thresh");
298         RNA_def_property_range(prop, 0.0f, 5.0f);
299         RNA_def_property_ui_text(prop, "Threshold", "Influence of meta elements");
300         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
301
302         /* texture space */
303         prop= RNA_def_property(srna, "use_auto_texspace", PROP_BOOLEAN, PROP_NONE);
304         RNA_def_property_boolean_sdna(prop, NULL, "texflag", MB_AUTOSPACE);
305         RNA_def_property_ui_text(prop, "Auto Texture Space", "Adjusts active object's texture space automatically when transforming object");
306         
307         prop= RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
308         RNA_def_property_array(prop, 3);
309         RNA_def_property_ui_text(prop, "Texture Space Location", "Texture space location");
310         RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable");
311         RNA_def_property_float_funcs(prop, "rna_Meta_texspace_loc_get", "rna_Meta_texspace_loc_set", NULL);     
312         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
313         
314         prop= RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
315         RNA_def_property_array(prop, 3);
316         RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
317         RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable");
318         RNA_def_property_float_funcs(prop, "rna_Meta_texspace_size_get", "rna_Meta_texspace_size_set", NULL);
319         RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");
320         
321         /* not supported yet
322          prop= RNA_def_property(srna, "texspace_rot", PROP_FLOAT, PROP_EULER);
323          RNA_def_property_float(prop, NULL, "rot");
324          RNA_def_property_ui_text(prop, "Texture Space Rotation", "Texture space rotation");
325          RNA_def_property_editable_func(prop, "rna_Meta_texspace_editable");
326          RNA_def_property_update(prop, 0, "rna_MetaBall_update_data");*/
327         
328         /* materials */
329         prop= RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE);
330         RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol");
331         RNA_def_property_struct_type(prop, "Material");
332         RNA_def_property_ui_text(prop, "Materials", "");
333         RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */  
334         
335         /* anim */
336         rna_def_animdata_common(srna);
337 }
338
339 void RNA_def_meta(BlenderRNA *brna)
340 {
341         rna_def_metaelement(brna);
342         rna_def_metaball(brna);
343 }
344
345 #endif