Fix for another deadlock with py-drivers: BlendData.scene.remove()
[blender.git] / source / blender / makesrna / intern / rna_main_api.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2009 Blender Foundation.
19  * All rights reserved.
20  *
21  *
22  * Contributor(s): Blender Foundation
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/makesrna/intern/rna_main_api.c
28  *  \ingroup RNA
29  */
30
31
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include <errno.h>
35
36 #include "DNA_ID.h"
37 #include "DNA_modifier_types.h"
38
39 #include "BLI_utildefines.h"
40 #include "BLI_path_util.h"
41
42 #include "RNA_define.h"
43 #include "RNA_access.h"
44 #include "RNA_enum_types.h"
45
46 #include "rna_internal.h"
47
48 #ifdef RNA_RUNTIME
49
50 #include "BKE_main.h"
51 #include "BKE_camera.h"
52 #include "BKE_curve.h"
53 #include "BKE_DerivedMesh.h"
54 #include "BKE_displist.h"
55 #include "BKE_mesh.h"
56 #include "BKE_armature.h"
57 #include "BKE_lamp.h"
58 #include "BKE_library.h"
59 #include "BKE_object.h"
60 #include "BKE_material.h"
61 #include "BKE_image.h"
62 #include "BKE_texture.h"
63 #include "BKE_scene.h"
64 #include "BKE_text.h"
65 #include "BKE_action.h"
66 #include "BKE_group.h"
67 #include "BKE_brush.h"
68 #include "BKE_lattice.h"
69 #include "BKE_mball.h"
70 #include "BKE_world.h"
71 #include "BKE_particle.h"
72 #include "BKE_font.h"
73 #include "BKE_node.h"
74 #include "BKE_depsgraph.h"
75 #include "BKE_speaker.h"
76 #include "BKE_movieclip.h"
77 #include "BKE_mask.h"
78 #include "BKE_gpencil.h"
79 #include "BKE_linestyle.h"
80
81 #include "DNA_armature_types.h"
82 #include "DNA_camera_types.h"
83 #include "DNA_curve_types.h"
84 #include "DNA_lamp_types.h"
85 #include "DNA_material_types.h"
86 #include "DNA_mesh_types.h"
87 #include "DNA_object_types.h"
88 #include "DNA_speaker_types.h"
89 #include "DNA_text_types.h"
90 #include "DNA_texture_types.h"
91 #include "DNA_group_types.h"
92 #include "DNA_brush_types.h"
93 #include "DNA_lattice_types.h"
94 #include "DNA_meta_types.h"
95 #include "DNA_world_types.h"
96 #include "DNA_particle_types.h"
97 #include "DNA_vfont_types.h"
98 #include "DNA_node_types.h"
99 #include "DNA_movieclip_types.h"
100 #include "DNA_mask_types.h"
101 #include "DNA_gpencil_types.h"
102
103 #include "ED_screen.h"
104
105 #include "BLF_translation.h"
106
107 #ifdef WITH_PYTHON
108 #  include "BPY_extern.h"
109 #endif
110
111 static Camera *rna_Main_cameras_new(Main *bmain, const char *name)
112 {
113         ID *id = BKE_camera_add(bmain, name);
114         id_us_min(id);
115         return (Camera *)id;
116 }
117 static void rna_Main_cameras_remove(Main *bmain, ReportList *reports, PointerRNA *camera_ptr)
118 {
119         Camera *camera = camera_ptr->data;
120         if (ID_REAL_USERS(camera) <= 0) {
121                 BKE_libblock_free(bmain, camera);
122                 RNA_POINTER_INVALIDATE(camera_ptr);
123         }
124         else {
125                 BKE_reportf(reports, RPT_ERROR, "Camera '%s' must have zero users to be removed, found %d",
126                             camera->id.name + 2, ID_REAL_USERS(camera));
127         }
128 }
129
130 static Scene *rna_Main_scenes_new(Main *bmain, const char *name)
131 {
132         return BKE_scene_add(bmain, name);
133 }
134 static void rna_Main_scenes_remove(Main *bmain, bContext *C, ReportList *reports, PointerRNA *scene_ptr)
135 {
136         /* don't call BKE_libblock_free(...) directly */
137         Scene *scene = scene_ptr->data;
138         Scene *scene_new;
139
140         if ((scene_new = scene->id.prev) ||
141             (scene_new = scene->id.next))
142         {
143                 bScreen *sc = CTX_wm_screen(C);
144                 if (sc->scene == scene) {
145
146 #ifdef WITH_PYTHON
147                         BPy_BEGIN_ALLOW_THREADS;
148 #endif
149
150                         ED_screen_set_scene(C, sc, scene_new);
151
152 #ifdef WITH_PYTHON
153                         BPy_END_ALLOW_THREADS;
154 #endif
155
156                 }
157
158                 BKE_scene_unlink(bmain, scene, scene_new);
159                 RNA_POINTER_INVALIDATE(scene_ptr);
160         }
161         else {
162                 BKE_reportf(reports, RPT_ERROR, "Scene '%s' is the last, cannot be removed", scene->id.name + 2);
163         }
164 }
165
166 static Object *rna_Main_objects_new(Main *bmain, ReportList *reports, const char *name, ID *data)
167 {
168         Object *ob;
169         int type = OB_EMPTY;
170         if (data) {
171                 /* keep in sync with OB_DATA_SUPPORT_ID() macro */
172                 switch (GS(data->name)) {
173                         case ID_ME:
174                                 type = OB_MESH;
175                                 break;
176                         case ID_CU:
177                                 type = BKE_curve_type_get((Curve *)data);
178                                 break;
179                         case ID_MB:
180                                 type = OB_MBALL;
181                                 break;
182                         case ID_LA:
183                                 type = OB_LAMP;
184                                 break;
185                         case ID_SPK:
186                                 type = OB_SPEAKER;
187                                 break;
188                         case ID_CA:
189                                 type = OB_CAMERA;
190                                 break;
191                         case ID_LT:
192                                 type = OB_LATTICE;
193                                 break;
194                         case ID_AR:
195                                 type = OB_ARMATURE;
196                                 break;
197                         default:
198                         {
199                                 const char *idname;
200                                 if (RNA_enum_id_from_value(id_type_items, GS(data->name), &idname) == 0)
201                                         idname = "UNKNOWN";
202
203                                 BKE_reportf(reports, RPT_ERROR, "ID type '%s' is not valid for an object", idname);
204                                 return NULL;
205                         }
206                 }
207
208                 id_us_plus(data);
209         }
210
211         ob = BKE_object_add_only_object(bmain, type, name);
212         id_us_min(&ob->id);
213
214         ob->data = data;
215         test_object_materials(bmain, ob->data);
216         
217         return ob;
218 }
219
220 static void rna_Main_objects_remove(Main *bmain, ReportList *reports, PointerRNA *object_ptr)
221 {
222         Object *object = object_ptr->data;
223         if (ID_REAL_USERS(object) <= 0) {
224                 BKE_object_unlink(object); /* needed or ID pointers to this are not cleared */
225                 BKE_libblock_free(bmain, object);
226                 RNA_POINTER_INVALIDATE(object_ptr);
227         }
228         else {
229                 BKE_reportf(reports, RPT_ERROR, "Object '%s' must have zero users to be removed, found %d",
230                             object->id.name + 2, ID_REAL_USERS(object));
231         }
232 }
233
234 static Material *rna_Main_materials_new(Main *bmain, const char *name)
235 {
236         ID *id = (ID *)BKE_material_add(bmain, name);
237         id_us_min(id);
238         return (Material *)id;
239 }
240 static void rna_Main_materials_remove(Main *bmain, ReportList *reports, PointerRNA *material_ptr)
241 {
242         Material *material = material_ptr->data;
243         if (ID_REAL_USERS(material) <= 0) {
244                 BKE_libblock_free(bmain, material);
245                 RNA_POINTER_INVALIDATE(material_ptr);
246         }
247         else {
248                 BKE_reportf(reports, RPT_ERROR, "Material '%s' must have zero users to be removed, found %d",
249                             material->id.name + 2, ID_REAL_USERS(material));
250         }
251 }
252
253 static EnumPropertyItem *rna_Main_nodetree_type_itemf(bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
254 {
255         return rna_node_tree_type_itemf(NULL, NULL, r_free);
256 }
257 static struct bNodeTree *rna_Main_nodetree_new(Main *bmain, const char *name, int type)
258 {
259         bNodeTreeType *typeinfo = rna_node_tree_type_from_enum(type);
260         if (typeinfo) {
261                 bNodeTree *ntree = ntreeAddTree(bmain, name, typeinfo->idname);
262                 
263                 id_us_min(&ntree->id);
264                 return ntree;
265         }
266         else
267                 return NULL;
268 }
269 static void rna_Main_nodetree_remove(Main *bmain, ReportList *reports, PointerRNA *ntree_ptr)
270 {
271         bNodeTree *ntree = ntree_ptr->data;
272         if (ID_REAL_USERS(ntree) <= 0) {
273                 BKE_libblock_free(bmain, ntree);
274                 RNA_POINTER_INVALIDATE(ntree_ptr);
275         }
276         else {
277                 BKE_reportf(reports, RPT_ERROR, "Node tree '%s' must have zero users to be removed, found %d",
278                             ntree->id.name + 2, ID_REAL_USERS(ntree));
279         }
280 }
281
282 static Mesh *rna_Main_meshes_new(Main *bmain, const char *name)
283 {
284         Mesh *me = BKE_mesh_add(bmain, name);
285         id_us_min(&me->id);
286         return me;
287 }
288
289 /* copied from Mesh_getFromObject and adapted to RNA interface */
290 /* settings: 1 - preview, 2 - render */
291 Mesh *rna_Main_meshes_new_from_object(
292         Main *bmain, ReportList *reports, Scene *sce,
293         Object *ob, int apply_modifiers, int settings, int calc_tessface, int calc_undeformed)
294 {
295         Mesh *tmpmesh;
296         Curve *tmpcu = NULL, *copycu;
297         Object *tmpobj = NULL;
298         int render = settings == eModifierMode_Render, i;
299         int cage = !apply_modifiers;
300
301         /* perform the mesh extraction based on type */
302         switch (ob->type) {
303                 case OB_FONT:
304                 case OB_CURVE:
305                 case OB_SURF:
306                 {
307                         ListBase dispbase = {NULL, NULL};
308                         DerivedMesh *derivedFinal = NULL;
309                         int uv_from_orco;
310
311                         /* copies object and modifiers (but not the data) */
312                         tmpobj = BKE_object_copy_ex(bmain, ob, TRUE);
313                         tmpcu = (Curve *)tmpobj->data;
314                         tmpcu->id.us--;
315
316                         /* if getting the original caged mesh, delete object modifiers */
317                         if (cage)
318                                 BKE_object_free_modifiers(tmpobj);
319
320                         /* copies the data */
321                         copycu = tmpobj->data = BKE_curve_copy((Curve *) ob->data);
322
323                         /* temporarily set edit so we get updates from edit mode, but
324                          * also because for text datablocks copying it while in edit
325                          * mode gives invalid data structures */
326                         copycu->editfont = tmpcu->editfont;
327                         copycu->editnurb = tmpcu->editnurb;
328
329                         /* get updated display list, and convert to a mesh */
330                         BKE_displist_make_curveTypes_forRender(sce, tmpobj, &dispbase, &derivedFinal, FALSE, render);
331
332                         copycu->editfont = NULL;
333                         copycu->editnurb = NULL;
334
335                         tmpobj->derivedFinal = derivedFinal;
336
337                         /* convert object type to mesh */
338                         uv_from_orco = (tmpcu->flag & CU_UV_ORCO) != 0;
339                         BKE_mesh_from_nurbs_displist(tmpobj, &dispbase, uv_from_orco);
340
341                         tmpmesh = tmpobj->data;
342
343                         BKE_displist_free(&dispbase);
344
345                         /* BKE_mesh_from_nurbs changes the type to a mesh, check it worked.
346                          * if it didn't the curve did not have any segments or otherwise 
347                          * would have generated an empty mesh */
348                         if (tmpobj->type != OB_MESH) {
349                                 BKE_libblock_free_us(G.main, tmpobj);
350                                 return NULL;
351                         }
352
353                         BKE_mesh_texspace_copy_from_object(tmpmesh, ob);
354
355                         BKE_libblock_free_us(bmain, tmpobj);
356                         break;
357                 }
358
359                 case OB_MBALL:
360                 {
361                         /* metaballs don't have modifiers, so just convert to mesh */
362                         Object *basis_ob = BKE_mball_basis_find(sce, ob);
363                         /* todo, re-generatre for render-res */
364                         /* metaball_polygonize(scene, ob) */
365
366                         if (ob != basis_ob)
367                                 return NULL;  /* only do basis metaball */
368
369                         tmpmesh = BKE_mesh_add(bmain, "Mesh");
370                         /* BKE_mesh_add gives us a user count we don't need */
371                         tmpmesh->id.us--;
372
373                         if (render) {
374                                 ListBase disp = {NULL, NULL};
375                                 /* TODO(sergey): This is gonna to work for until EvaluationContext
376                                  *               only contains for_render flag. As soon as CoW is
377                                  *               implemented, this is to be rethinked.
378                                  */
379                                 EvaluationContext eval_ctx = {0};
380                                 eval_ctx.for_render = render;
381                                 BKE_displist_make_mball_forRender(&eval_ctx, sce, ob, &disp);
382                                 BKE_mesh_from_metaball(&disp, tmpmesh);
383                                 BKE_displist_free(&disp);
384                         }
385                         else {
386                                 ListBase disp = {NULL, NULL};
387                                 if (ob->curve_cache) {
388                                         disp = ob->curve_cache->disp;
389                                 }
390                                 BKE_mesh_from_metaball(&disp, tmpmesh);
391                         }
392
393                         BKE_mesh_texspace_copy_from_object(tmpmesh, ob);
394
395                         break;
396
397                 }
398                 case OB_MESH:
399                         /* copies object and modifiers (but not the data) */
400                         if (cage) {
401                                 /* copies the data */
402                                 tmpmesh = BKE_mesh_copy_ex(bmain, ob->data);
403                                 /* if not getting the original caged mesh, get final derived mesh */
404                         }
405                         else {
406                                 /* Make a dummy mesh, saves copying */
407                                 DerivedMesh *dm;
408                                 /* CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL; */
409                                 CustomDataMask mask = CD_MASK_MESH; /* this seems more suitable, exporter,
410                                                                  * for example, needs CD_MASK_MDEFORMVERT */
411
412                                 if (calc_undeformed)
413                                         mask |= CD_MASK_ORCO;
414
415                                 /* Write the display mesh into the dummy mesh */
416                                 if (render)
417                                         dm = mesh_create_derived_render(sce, ob, mask);
418                                 else
419                                         dm = mesh_create_derived_view(sce, ob, mask);
420
421                                 tmpmesh = BKE_mesh_add(bmain, "Mesh");
422                                 DM_to_mesh(dm, tmpmesh, ob, mask);
423                                 dm->release(dm);
424                         }
425
426                         /* BKE_mesh_add/copy gives us a user count we don't need */
427                         tmpmesh->id.us--;
428
429                         break;
430                 default:
431                         BKE_report(reports, RPT_ERROR, "Object does not have geometry data");
432                         return NULL;
433         }
434
435         /* Copy materials to new mesh */
436         switch (ob->type) {
437                 case OB_SURF:
438                 case OB_FONT:
439                 case OB_CURVE:
440                         tmpmesh->totcol = tmpcu->totcol;
441
442                         /* free old material list (if it exists) and adjust user counts */
443                         if (tmpcu->mat) {
444                                 for (i = tmpcu->totcol; i-- > 0; ) {
445                                         /* are we an object material or data based? */
446
447                                         tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i];
448
449                                         if (tmpmesh->mat[i]) {
450                                                 tmpmesh->mat[i]->id.us++;
451                                         }
452                                 }
453                         }
454                         break;
455
456 #if 0
457                 /* Crashes when assigning the new material, not sure why */
458                 case OB_MBALL:
459                         tmpmb = (MetaBall *)ob->data;
460                         tmpmesh->totcol = tmpmb->totcol;
461
462                         /* free old material list (if it exists) and adjust user counts */
463                         if (tmpmb->mat) {
464                                 for (i = tmpmb->totcol; i-- > 0; ) {
465                                         tmpmesh->mat[i] = tmpmb->mat[i]; /* CRASH HERE ??? */
466                                         if (tmpmesh->mat[i]) {
467                                                 tmpmb->mat[i]->id.us++;
468                                         }
469                                 }
470                         }
471                         break;
472 #endif
473
474                 case OB_MESH:
475                         if (!cage) {
476                                 Mesh *origmesh = ob->data;
477                                 tmpmesh->flag = origmesh->flag;
478                                 tmpmesh->mat = MEM_dupallocN(origmesh->mat);
479                                 tmpmesh->totcol = origmesh->totcol;
480                                 tmpmesh->smoothresh = origmesh->smoothresh;
481                                 if (origmesh->mat) {
482                                         for (i = origmesh->totcol; i-- > 0; ) {
483                                                 /* are we an object material or data based? */
484                                                 tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i];
485
486                                                 if (tmpmesh->mat[i]) {
487                                                         tmpmesh->mat[i]->id.us++;
488                                                 }
489                                         }
490                                 }
491                         }
492                         break;
493         } /* end copy materials */
494
495         if (calc_tessface) {
496                 /* cycles and exporters rely on this still */
497                 BKE_mesh_tessface_ensure(tmpmesh);
498         }
499
500         /* make sure materials get updated in objects */
501         test_object_materials(bmain, &tmpmesh->id);
502
503         return tmpmesh;
504 }
505
506 static void rna_Main_meshes_remove(Main *bmain, ReportList *reports, PointerRNA *mesh_ptr)
507 {
508         Mesh *mesh = mesh_ptr->data;
509         if (ID_REAL_USERS(mesh) <= 0) {
510                 BKE_libblock_free(bmain, mesh);
511                 RNA_POINTER_INVALIDATE(mesh_ptr);
512         }
513         else {
514                 BKE_reportf(reports, RPT_ERROR, "Mesh '%s' must have zero users to be removed, found %d",
515                             mesh->id.name + 2, ID_REAL_USERS(mesh));
516         }
517 }
518
519 static Lamp *rna_Main_lamps_new(Main *bmain, const char *name, int type)
520 {
521         Lamp *lamp = BKE_lamp_add(bmain, name);
522         lamp->type = type;
523         id_us_min(&lamp->id);
524         return lamp;
525 }
526 static void rna_Main_lamps_remove(Main *bmain, ReportList *reports, PointerRNA *lamp_ptr)
527 {
528         Lamp *lamp = lamp_ptr->data;
529         if (ID_REAL_USERS(lamp) <= 0) {
530                 BKE_libblock_free(bmain, lamp);
531                 RNA_POINTER_INVALIDATE(lamp_ptr);
532         }
533         else {
534                 BKE_reportf(reports, RPT_ERROR, "Lamp '%s' must have zero users to be removed, found %d",
535                             lamp->id.name + 2, ID_REAL_USERS(lamp));
536         }
537 }
538
539 static Image *rna_Main_images_new(Main *bmain, const char *name, int width, int height, int alpha, int float_buffer)
540 {
541         float color[4] = {0.0, 0.0, 0.0, 1.0};
542         Image *image = BKE_image_add_generated(bmain, width, height, name, alpha ? 32 : 24, float_buffer, 0, color);
543         id_us_min(&image->id);
544         return image;
545 }
546 static Image *rna_Main_images_load(Main *bmain, ReportList *reports, const char *filepath)
547 {
548         Image *ima;
549
550         errno = 0;
551         ima = BKE_image_load(bmain, filepath);
552
553         if (!ima) {
554                 BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
555                             errno ? strerror(errno) : TIP_("unsupported image format"));
556         }
557
558         return ima;
559 }
560 static void rna_Main_images_remove(Main *bmain, ReportList *reports, PointerRNA *image_ptr)
561 {
562         Image *image = image_ptr->data;
563         if (ID_REAL_USERS(image) <= 0) {
564                 BKE_libblock_free(bmain, image);
565                 RNA_POINTER_INVALIDATE(image_ptr);
566         }
567         else {
568                 BKE_reportf(reports, RPT_ERROR, "Image '%s' must have zero users to be removed, found %d",
569                             image->id.name + 2, ID_REAL_USERS(image));
570         }
571 }
572
573 static Lattice *rna_Main_lattices_new(Main *bmain, const char *name)
574 {
575         Lattice *lt = BKE_lattice_add(bmain, name);
576         id_us_min(&lt->id);
577         return lt;
578 }
579 static void rna_Main_lattices_remove(Main *bmain, ReportList *reports, PointerRNA *lt_ptr)
580 {
581         Lattice *lt = lt_ptr->data;
582         if (ID_REAL_USERS(lt) <= 0) {
583                 BKE_libblock_free(bmain, lt);
584                 RNA_POINTER_INVALIDATE(lt_ptr);
585         }
586         else {
587                 BKE_reportf(reports, RPT_ERROR, "Lattice '%s' must have zero users to be removed, found %d",
588                             lt->id.name + 2, ID_REAL_USERS(lt));
589         }
590 }
591
592 static Curve *rna_Main_curves_new(Main *bmain, const char *name, int type)
593 {
594         Curve *cu = BKE_curve_add(bmain, name, type);
595         id_us_min(&cu->id);
596         return cu;
597 }
598 static void rna_Main_curves_remove(Main *bmain, ReportList *reports, PointerRNA *cu_ptr)
599 {
600         Curve *cu = cu_ptr->data;
601         if (ID_REAL_USERS(cu) <= 0) {
602                 BKE_libblock_free(bmain, cu);
603                 RNA_POINTER_INVALIDATE(cu_ptr);
604         }
605         else {
606                 BKE_reportf(reports, RPT_ERROR, "Curve '%s' must have zero users to be removed, found %d",
607                             cu->id.name + 2, ID_REAL_USERS(cu));
608         }
609 }
610
611 static MetaBall *rna_Main_metaballs_new(Main *bmain, const char *name)
612 {
613         MetaBall *mb = BKE_mball_add(bmain, name);
614         id_us_min(&mb->id);
615         return mb;
616 }
617 static void rna_Main_metaballs_remove(Main *bmain, ReportList *reports, PointerRNA *mb_ptr)
618 {
619         MetaBall *mb = mb_ptr->data;
620         if (ID_REAL_USERS(mb) <= 0) {
621                 BKE_libblock_free(bmain, mb);
622                 RNA_POINTER_INVALIDATE(mb_ptr);
623         }
624         else {
625                 BKE_reportf(reports, RPT_ERROR, "Metaball '%s' must have zero users to be removed, found %d",
626                             mb->id.name + 2, ID_REAL_USERS(mb));
627         }
628 }
629
630 static VFont *rna_Main_fonts_load(Main *bmain, ReportList *reports, const char *filepath)
631 {
632         VFont *font;
633
634         errno = 0;
635         font = BKE_vfont_load(bmain, filepath);
636
637         if (!font)
638                 BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
639                             errno ? strerror(errno) : TIP_("unsupported font format"));
640
641         return font;
642
643 }
644 static void rna_Main_fonts_remove(Main *bmain, ReportList *reports, PointerRNA *vfont_ptr)
645 {
646         VFont *vfont = vfont_ptr->data;
647         if (ID_REAL_USERS(vfont) <= 0) {
648                 BKE_libblock_free(bmain, vfont);
649                 RNA_POINTER_INVALIDATE(vfont_ptr);
650         }
651         else {
652                 BKE_reportf(reports, RPT_ERROR, "Font '%s' must have zero users to be removed, found %d",
653                             vfont->id.name + 2, ID_REAL_USERS(vfont));
654         }
655 }
656
657 static Tex *rna_Main_textures_new(Main *bmain, const char *name, int type)
658 {
659         Tex *tex = add_texture(bmain, name);
660         tex_set_type(tex, type);
661         id_us_min(&tex->id);
662         return tex;
663 }
664 static void rna_Main_textures_remove(Main *bmain, ReportList *reports, PointerRNA *tex_ptr)
665 {
666         Tex *tex = tex_ptr->data;
667         if (ID_REAL_USERS(tex) <= 0) {
668                 BKE_libblock_free(bmain, tex);
669                 RNA_POINTER_INVALIDATE(tex_ptr);
670         }
671         else {
672                 BKE_reportf(reports, RPT_ERROR, "Texture '%s' must have zero users to be removed, found %d",
673                             tex->id.name + 2, ID_REAL_USERS(tex));
674         }
675 }
676
677 static Brush *rna_Main_brushes_new(Main *bmain, const char *name)
678 {
679         Brush *brush = BKE_brush_add(bmain, name);
680         id_us_min(&brush->id);
681         return brush;
682 }
683 static void rna_Main_brushes_remove(Main *bmain, ReportList *reports, PointerRNA *brush_ptr)
684 {
685         Brush *brush = brush_ptr->data;
686         if (ID_REAL_USERS(brush) <= 0) {
687                 BKE_libblock_free(bmain, brush);
688                 RNA_POINTER_INVALIDATE(brush_ptr);
689         }
690         else {
691                 BKE_reportf(reports, RPT_ERROR, "Brush '%s' must have zero users to be removed, found %d",
692                             brush->id.name + 2, ID_REAL_USERS(brush));
693         }
694 }
695
696 static World *rna_Main_worlds_new(Main *bmain, const char *name)
697 {
698         World *world = add_world(bmain, name);
699         id_us_min(&world->id);
700         return world;
701 }
702 static void rna_Main_worlds_remove(Main *bmain, ReportList *reports, PointerRNA *world_ptr)
703 {
704         Group *world = world_ptr->data;
705         if (ID_REAL_USERS(world) <= 0) {
706                 BKE_libblock_free(bmain, world);
707                 RNA_POINTER_INVALIDATE(world_ptr);
708         }
709         else {
710                 BKE_reportf(reports, RPT_ERROR, "World '%s' must have zero users to be removed, found %d",
711                             world->id.name + 2, ID_REAL_USERS(world));
712         }
713 }
714
715 static Group *rna_Main_groups_new(Main *bmain, const char *name)
716 {
717         return BKE_group_add(bmain, name);
718 }
719 static void rna_Main_groups_remove(Main *bmain, PointerRNA *group_ptr)
720 {
721         Group *group = group_ptr->data;
722         BKE_group_unlink(group);
723         BKE_libblock_free(bmain, group);
724         RNA_POINTER_INVALIDATE(group_ptr);
725 }
726
727 static Speaker *rna_Main_speakers_new(Main *bmain, const char *name)
728 {
729         Speaker *speaker = BKE_speaker_add(bmain, name);
730         id_us_min(&speaker->id);
731         return speaker;
732 }
733 static void rna_Main_speakers_remove(Main *bmain, ReportList *reports, PointerRNA *speaker_ptr)
734 {
735         Speaker *speaker = speaker_ptr->data;
736         if (ID_REAL_USERS(speaker) <= 0) {
737                 BKE_libblock_free(bmain, speaker);
738                 RNA_POINTER_INVALIDATE(speaker_ptr);
739         }
740         else {
741                 BKE_reportf(reports, RPT_ERROR, "Speaker '%s' must have zero users to be removed, found %d",
742                             speaker->id.name + 2, ID_REAL_USERS(speaker));
743         }
744 }
745
746 static Text *rna_Main_texts_new(Main *bmain, const char *name)
747 {
748         return BKE_text_add(bmain, name);
749 }
750 static void rna_Main_texts_remove(Main *bmain, PointerRNA *text_ptr)
751 {
752         Text *text = text_ptr->data;
753         BKE_text_unlink(bmain, text);
754         BKE_libblock_free(bmain, text);
755         RNA_POINTER_INVALIDATE(text_ptr);
756 }
757
758 static Text *rna_Main_texts_load(Main *bmain, ReportList *reports, const char *filepath, int is_internal)
759 {
760         Text *txt;
761
762         errno = 0;
763         txt = BKE_text_load_ex(bmain, filepath, bmain->name, is_internal);
764
765         if (!txt)
766                 BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
767                             errno ? strerror(errno) : TIP_("unable to load text"));
768
769         return txt;
770 }
771
772 static bArmature *rna_Main_armatures_new(Main *bmain, const char *name)
773 {
774         bArmature *arm = BKE_armature_add(bmain, name);
775         id_us_min(&arm->id);
776         return arm;
777 }
778 static void rna_Main_armatures_remove(Main *bmain, ReportList *reports, PointerRNA *arm_ptr)
779 {
780         bArmature *arm = arm_ptr->data;
781         if (ID_REAL_USERS(arm) <= 0) {
782                 BKE_libblock_free(bmain, arm);
783                 RNA_POINTER_INVALIDATE(arm_ptr);
784         }
785         else {
786                 BKE_reportf(reports, RPT_ERROR, "Armature '%s' must have zero users to be removed, found %d",
787                             arm->id.name + 2, ID_REAL_USERS(arm));
788         }
789 }
790
791 static bAction *rna_Main_actions_new(Main *bmain, const char *name)
792 {
793         bAction *act = add_empty_action(bmain, name);
794         id_us_min(&act->id);
795         act->id.flag &= ~LIB_FAKEUSER;
796         return act;
797 }
798 static void rna_Main_actions_remove(Main *bmain, ReportList *reports, PointerRNA *act_ptr)
799 {
800         bAction *act = act_ptr->data;
801         if (ID_REAL_USERS(act) <= 0) {
802                 BKE_libblock_free(bmain, act);
803                 RNA_POINTER_INVALIDATE(act_ptr);
804         }
805         else {
806                 BKE_reportf(reports, RPT_ERROR, "Action '%s' must have zero users to be removed, found %d",
807                             act->id.name + 2, ID_REAL_USERS(act));
808         }
809 }
810
811 static ParticleSettings *rna_Main_particles_new(Main *bmain, const char *name)
812 {
813         ParticleSettings *part = psys_new_settings(name, bmain);
814         id_us_min(&part->id);
815         return part;
816 }
817 static void rna_Main_particles_remove(Main *bmain, ReportList *reports, PointerRNA *part_ptr)
818 {
819         ParticleSettings *part = part_ptr->data;
820         if (ID_REAL_USERS(part) <= 0) {
821                 BKE_libblock_free(bmain, part);
822                 RNA_POINTER_INVALIDATE(part_ptr);
823         }
824         else {
825                 BKE_reportf(reports, RPT_ERROR, "Particle settings '%s' must have zero users to be removed, found %d",
826                             part->id.name + 2, ID_REAL_USERS(part));
827         }
828 }
829
830 static MovieClip *rna_Main_movieclip_load(Main *bmain, ReportList *reports, const char *filepath)
831 {
832         MovieClip *clip;
833
834         errno = 0;
835         clip = BKE_movieclip_file_add(bmain, filepath);
836
837         if (!clip)
838                 BKE_reportf(reports, RPT_ERROR, "Cannot read '%s': %s", filepath,
839                             errno ? strerror(errno) : TIP_("unable to load movie clip"));
840
841         return clip;
842 }
843
844 static void rna_Main_movieclips_remove(Main *bmain, PointerRNA *clip_ptr)
845 {
846         MovieClip *clip = clip_ptr->data;
847         BKE_movieclip_unlink(bmain, clip);
848         BKE_libblock_free(bmain, clip);
849         RNA_POINTER_INVALIDATE(clip_ptr);
850 }
851
852 static Mask *rna_Main_mask_new(Main *bmain, const char *name)
853 {
854         Mask *mask;
855
856         mask = BKE_mask_new(bmain, name);
857
858         return mask;
859 }
860
861 static void rna_Main_masks_remove(Main *bmain, PointerRNA *mask_ptr)
862 {
863         Mask *mask = mask_ptr->data;
864         BKE_mask_free(bmain, mask);
865         BKE_libblock_free(bmain, mask);
866         RNA_POINTER_INVALIDATE(mask_ptr);
867 }
868
869 static void rna_Main_grease_pencil_remove(Main *bmain, ReportList *reports, PointerRNA *gpd_ptr)
870 {
871         bGPdata *gpd = gpd_ptr->data;
872         if (ID_REAL_USERS(gpd) <= 0) {
873                 BKE_gpencil_free(gpd);
874                 BKE_libblock_free(bmain, gpd);
875                 RNA_POINTER_INVALIDATE(gpd_ptr);
876         }
877         else
878                 BKE_reportf(reports, RPT_ERROR, "Grease pencil '%s' must have zero users to be removed, found %d",
879                             gpd->id.name + 2, ID_REAL_USERS(gpd));
880 }
881
882 FreestyleLineStyle *rna_Main_linestyles_new(Main *bmain, const char *name)
883 {
884         FreestyleLineStyle *linestyle = BKE_new_linestyle(name, bmain);
885         id_us_min(&linestyle->id);
886         return linestyle;
887 }
888
889 void rna_Main_linestyles_remove(Main *bmain, ReportList *reports, FreestyleLineStyle *linestyle)
890 {
891         if (ID_REAL_USERS(linestyle) <= 0)
892                 BKE_libblock_free(bmain, linestyle);
893         else
894                 BKE_reportf(reports, RPT_ERROR, "Line style '%s' must have zero users to be removed, found %d",
895                             linestyle->id.name + 2, ID_REAL_USERS(linestyle));
896
897         /* XXX python now has invalid pointer? */
898 }
899
900 /* tag functions, all the same */
901 static void rna_Main_cameras_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->camera, value); }
902 static void rna_Main_scenes_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->scene, value); }
903 static void rna_Main_objects_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->object, value); }
904 static void rna_Main_materials_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->mat, value); }
905 static void rna_Main_node_groups_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->nodetree, value); }
906 static void rna_Main_meshes_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->mesh, value); }
907 static void rna_Main_lamps_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->lamp, value); }
908 static void rna_Main_libraries_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->library, value); }
909 static void rna_Main_screens_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->screen, value); }
910 static void rna_Main_window_managers_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->wm, value); }
911 static void rna_Main_images_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->image, value); }
912 static void rna_Main_lattices_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->latt, value); }
913 static void rna_Main_curves_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->curve, value); }
914 static void rna_Main_metaballs_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->mball, value); }
915 static void rna_Main_fonts_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->vfont, value); }
916 static void rna_Main_textures_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->tex, value); }
917 static void rna_Main_brushes_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->brush, value); }
918 static void rna_Main_worlds_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->world, value); }
919 static void rna_Main_groups_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->group, value); }
920 // static void rna_Main_shape_keys_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->key, value); }
921 // static void rna_Main_scripts_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->script, value); }
922 static void rna_Main_texts_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->text, value); }
923 static void rna_Main_speakers_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->speaker, value); }
924 static void rna_Main_sounds_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->sound, value); }
925 static void rna_Main_armatures_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->armature, value); }
926 static void rna_Main_actions_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->action, value); }
927 static void rna_Main_particles_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->particle, value); }
928 static void rna_Main_gpencil_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->gpencil, value); }
929 static void rna_Main_movieclips_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->movieclip, value); }
930 static void rna_Main_masks_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->mask, value); }
931 static void rna_Main_linestyle_tag(Main *bmain, int value) { BKE_main_id_tag_listbase(&bmain->linestyle, value); }
932
933 static int rna_Main_cameras_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CA); }
934 static int rna_Main_scenes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCE); }
935 static int rna_Main_objects_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_OB); }
936 static int rna_Main_materials_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_MA); }
937 static int rna_Main_node_groups_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_NT); }
938 static int rna_Main_meshes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_ME); }
939 static int rna_Main_lamps_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LA); }
940 static int rna_Main_libraries_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LI); }
941 static int rna_Main_screens_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SCR); }
942 static int rna_Main_window_managers_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_WM); }
943 static int rna_Main_images_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_IM); }
944 static int rna_Main_lattices_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_LT); }
945 static int rna_Main_curves_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_CU); }
946 static int rna_Main_metaballs_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_MB); }
947 static int rna_Main_fonts_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_VF); }
948 static int rna_Main_textures_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_TE); }
949 static int rna_Main_brushes_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_BR); }
950 static int rna_Main_worlds_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_WO); }
951 static int rna_Main_groups_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_GR); }
952 static int rna_Main_texts_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_TXT); }
953 static int rna_Main_speakers_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SPK); }
954 static int rna_Main_sounds_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_SO); }
955 static int rna_Main_armatures_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_AR); }
956 static int rna_Main_actions_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_AC); }
957 static int rna_Main_particles_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_PA); }
958 static int rna_Main_gpencil_is_updated_get(PointerRNA *ptr) { return DAG_id_type_tagged(ptr->data, ID_GD); }
959
960 #else
961
962 void RNA_api_main(StructRNA *srna)
963 {
964 #if 0
965         FunctionRNA *func;
966         PropertyRNA *parm;
967         /* maybe we want to add functions in 'bpy.data' still?
968          * for now they are all in collections bpy.data.images.new(...) */
969         func = RNA_def_function(srna, "add_image", "rna_Main_add_image");
970         RNA_def_function_ui_description(func, "Add a new image");
971         parm = RNA_def_string_file_path(func, "filepath", NULL, 0, "", "File path to load image from");
972         RNA_def_property_flag(parm, PROP_REQUIRED);
973         parm = RNA_def_pointer(func, "image", "Image", "", "New image");
974         RNA_def_function_return(func, parm);
975 #else
976         (void)srna;
977 #endif
978 }
979
980 void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
981 {
982         StructRNA *srna;
983         FunctionRNA *func;
984         PropertyRNA *parm;
985         PropertyRNA *prop;
986
987         RNA_def_property_srna(cprop, "BlendDataCameras");
988         srna = RNA_def_struct(brna, "BlendDataCameras", NULL);
989         RNA_def_struct_sdna(srna, "Main");
990         RNA_def_struct_ui_text(srna, "Main Cameras", "Collection of cameras");
991
992         func = RNA_def_function(srna, "new", "rna_Main_cameras_new");
993         RNA_def_function_ui_description(func, "Add a new camera to the main database");
994         parm = RNA_def_string(func, "name", "Camera", 0, "", "New name for the datablock");
995         RNA_def_property_flag(parm, PROP_REQUIRED);
996         /* return type */
997         parm = RNA_def_pointer(func, "camera", "Camera", "", "New camera datablock");
998         RNA_def_function_return(func, parm);
999
1000         func = RNA_def_function(srna, "remove", "rna_Main_cameras_remove");
1001         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1002         RNA_def_function_ui_description(func, "Remove a camera from the current blendfile");
1003         parm = RNA_def_pointer(func, "camera", "Camera", "", "Camera to remove");
1004         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1005         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1006
1007         func = RNA_def_function(srna, "tag", "rna_Main_cameras_tag");
1008         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1009         RNA_def_property_flag(parm, PROP_REQUIRED);
1010
1011         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1012         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1013         RNA_def_property_boolean_funcs(prop, "rna_Main_cameras_is_updated_get", NULL);
1014 }
1015
1016 void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
1017 {
1018         StructRNA *srna;
1019         FunctionRNA *func;
1020         PropertyRNA *parm;
1021         PropertyRNA *prop;
1022
1023         RNA_def_property_srna(cprop, "BlendDataScenes");
1024         srna = RNA_def_struct(brna, "BlendDataScenes", NULL);
1025         RNA_def_struct_sdna(srna, "Main");
1026         RNA_def_struct_ui_text(srna, "Main Scenes", "Collection of scenes");
1027
1028         func = RNA_def_function(srna, "new", "rna_Main_scenes_new");
1029         RNA_def_function_ui_description(func, "Add a new scene to the main database");
1030         parm = RNA_def_string(func, "name", "Scene", 0, "", "New name for the datablock");
1031         RNA_def_property_flag(parm, PROP_REQUIRED);
1032         /* return type */
1033         parm = RNA_def_pointer(func, "scene", "Scene", "", "New scene datablock");
1034         RNA_def_function_return(func, parm);
1035
1036         func = RNA_def_function(srna, "remove", "rna_Main_scenes_remove");
1037         RNA_def_function_flag(func, FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
1038         RNA_def_function_ui_description(func, "Remove a scene from the current blendfile");
1039         parm = RNA_def_pointer(func, "scene", "Scene", "", "Scene to remove");
1040         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1041         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1042
1043         func = RNA_def_function(srna, "tag", "rna_Main_scenes_tag");
1044         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1045         RNA_def_property_flag(parm, PROP_REQUIRED);
1046
1047         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1048         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1049         RNA_def_property_boolean_funcs(prop, "rna_Main_scenes_is_updated_get", NULL);
1050 }
1051
1052 void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
1053 {
1054         StructRNA *srna;
1055         FunctionRNA *func;
1056         PropertyRNA *parm;
1057         PropertyRNA *prop;
1058
1059         RNA_def_property_srna(cprop, "BlendDataObjects");
1060         srna = RNA_def_struct(brna, "BlendDataObjects", NULL);
1061         RNA_def_struct_sdna(srna, "Main");
1062         RNA_def_struct_ui_text(srna, "Main Objects", "Collection of objects");
1063
1064         func = RNA_def_function(srna, "new", "rna_Main_objects_new");
1065         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1066         RNA_def_function_ui_description(func, "Add a new object to the main database");
1067         parm = RNA_def_string(func, "name", "Object", 0, "", "New name for the datablock");
1068         RNA_def_property_flag(parm, PROP_REQUIRED);
1069         parm = RNA_def_pointer(func, "object_data", "ID", "", "Object data or None for an empty object");
1070         RNA_def_property_flag(parm, PROP_REQUIRED);
1071
1072         /* return type */
1073         parm = RNA_def_pointer(func, "object", "Object", "", "New object datablock");
1074         RNA_def_function_return(func, parm);
1075
1076         func = RNA_def_function(srna, "remove", "rna_Main_objects_remove");
1077         RNA_def_function_ui_description(func, "Remove a object from the current blendfile");
1078         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1079         parm = RNA_def_pointer(func, "object", "Object", "", "Object to remove");
1080         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1081         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1082
1083         func = RNA_def_function(srna, "tag", "rna_Main_objects_tag");
1084         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1085         RNA_def_property_flag(parm, PROP_REQUIRED);
1086
1087         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1088         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1089         RNA_def_property_boolean_funcs(prop, "rna_Main_objects_is_updated_get", NULL);
1090 }
1091
1092 void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
1093 {
1094         StructRNA *srna;
1095         FunctionRNA *func;
1096         PropertyRNA *parm;
1097         PropertyRNA *prop;
1098
1099         RNA_def_property_srna(cprop, "BlendDataMaterials");
1100         srna = RNA_def_struct(brna, "BlendDataMaterials", NULL);
1101         RNA_def_struct_sdna(srna, "Main");
1102         RNA_def_struct_ui_text(srna, "Main Materials", "Collection of materials");
1103
1104         func = RNA_def_function(srna, "new", "rna_Main_materials_new");
1105         RNA_def_function_ui_description(func, "Add a new material to the main database");
1106         parm = RNA_def_string(func, "name", "Material", 0, "", "New name for the datablock");
1107         RNA_def_property_flag(parm, PROP_REQUIRED);
1108         /* return type */
1109         parm = RNA_def_pointer(func, "material", "Material", "", "New material datablock");
1110         RNA_def_function_return(func, parm);
1111
1112         func = RNA_def_function(srna, "remove", "rna_Main_materials_remove");
1113         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1114         RNA_def_function_ui_description(func, "Remove a material from the current blendfile");
1115         parm = RNA_def_pointer(func, "material", "Material", "", "Material to remove");
1116         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1117         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1118
1119         func = RNA_def_function(srna, "tag", "rna_Main_materials_tag");
1120         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1121         RNA_def_property_flag(parm, PROP_REQUIRED);
1122
1123         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1124         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1125         RNA_def_property_boolean_funcs(prop, "rna_Main_materials_is_updated_get", NULL);
1126 }
1127 void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
1128 {
1129         StructRNA *srna;
1130         FunctionRNA *func;
1131         PropertyRNA *parm;
1132         PropertyRNA *prop;
1133
1134         static EnumPropertyItem dummy_items[] = {
1135                 {0, "DUMMY", 0, "", ""},
1136                 {0, NULL, 0, NULL, NULL}
1137         };
1138
1139         RNA_def_property_srna(cprop, "BlendDataNodeTrees");
1140         srna = RNA_def_struct(brna, "BlendDataNodeTrees", NULL);
1141         RNA_def_struct_sdna(srna, "Main");
1142         RNA_def_struct_ui_text(srna, "Main Node Trees", "Collection of node trees");
1143
1144         func = RNA_def_function(srna, "new", "rna_Main_nodetree_new");
1145         RNA_def_function_ui_description(func, "Add a new node tree to the main database");
1146         parm = RNA_def_string(func, "name", "NodeGroup", 0, "", "New name for the datablock");
1147         RNA_def_property_flag(parm, PROP_REQUIRED);
1148         parm = RNA_def_enum(func, "type", dummy_items, 0, "Type", "The type of node_group to add");
1149         RNA_def_property_enum_funcs(parm, NULL, NULL, "rna_Main_nodetree_type_itemf");
1150         RNA_def_property_flag(parm, PROP_REQUIRED);
1151         /* return type */
1152         parm = RNA_def_pointer(func, "tree", "NodeTree", "", "New node tree datablock");
1153         RNA_def_function_return(func, parm);
1154
1155         func = RNA_def_function(srna, "remove", "rna_Main_nodetree_remove");
1156         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1157         RNA_def_function_ui_description(func, "Remove a node tree from the current blendfile");
1158         parm = RNA_def_pointer(func, "tree", "NodeTree", "", "Node tree to remove");
1159         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1160         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1161
1162         func = RNA_def_function(srna, "tag", "rna_Main_node_groups_tag");
1163         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1164         RNA_def_property_flag(parm, PROP_REQUIRED);
1165
1166         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1167         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1168         RNA_def_property_boolean_funcs(prop, "rna_Main_node_groups_is_updated_get", NULL);
1169 }
1170 void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
1171 {
1172         StructRNA *srna;
1173         FunctionRNA *func;
1174         PropertyRNA *parm;
1175         PropertyRNA *prop;
1176
1177         static EnumPropertyItem mesh_type_items[] = {
1178                 {eModifierMode_Realtime, "PREVIEW", 0, "Preview", "Apply modifier preview settings"},
1179                 {eModifierMode_Render, "RENDER", 0, "Render", "Apply modifier render settings"},
1180                 {0, NULL, 0, NULL, NULL}
1181         };
1182
1183         RNA_def_property_srna(cprop, "BlendDataMeshes");
1184         srna = RNA_def_struct(brna, "BlendDataMeshes", NULL);
1185         RNA_def_struct_sdna(srna, "Main");
1186         RNA_def_struct_ui_text(srna, "Main Meshes", "Collection of meshes");
1187
1188         func = RNA_def_function(srna, "new", "rna_Main_meshes_new");
1189         RNA_def_function_ui_description(func, "Add a new mesh to the main database");
1190         parm = RNA_def_string(func, "name", "Mesh", 0, "", "New name for the datablock");
1191         RNA_def_property_flag(parm, PROP_REQUIRED);
1192         /* return type */
1193         parm = RNA_def_pointer(func, "mesh", "Mesh", "", "New mesh datablock");
1194         RNA_def_function_return(func, parm);
1195
1196         func = RNA_def_function(srna, "new_from_object", "rna_Main_meshes_new_from_object");
1197         RNA_def_function_ui_description(func, "Add a new mesh created from object with modifiers applied");
1198         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1199         parm = RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate modifiers");
1200         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
1201         parm = RNA_def_pointer(func, "object", "Object", "", "Object to create mesh from");
1202         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL);
1203         parm = RNA_def_boolean(func, "apply_modifiers", 0, "", "Apply modifiers");
1204         RNA_def_property_flag(parm, PROP_REQUIRED);
1205         parm = RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply");
1206         RNA_def_property_flag(parm, PROP_REQUIRED);
1207         RNA_def_boolean(func, "calc_tessface", true, "Calculate Tessellation", "Calculate tessellation faces");
1208         RNA_def_boolean(func, "calc_undeformed", false, "Calculate Undeformed", "Calculate undeformed vertex coordinates");
1209         parm = RNA_def_pointer(func, "mesh", "Mesh", "",
1210                                "Mesh created from object, remove it if it is only used for export");
1211         RNA_def_function_return(func, parm);
1212
1213         func = RNA_def_function(srna, "remove", "rna_Main_meshes_remove");
1214         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1215         RNA_def_function_ui_description(func, "Remove a mesh from the current blendfile");
1216         parm = RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove");
1217         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1218         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1219
1220         func = RNA_def_function(srna, "tag", "rna_Main_meshes_tag");
1221         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1222         RNA_def_property_flag(parm, PROP_REQUIRED);
1223
1224         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1225         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1226         RNA_def_property_boolean_funcs(prop, "rna_Main_meshes_is_updated_get", NULL);
1227 }
1228 void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
1229 {
1230         StructRNA *srna;
1231         FunctionRNA *func;
1232         PropertyRNA *parm;
1233         PropertyRNA *prop;
1234
1235         RNA_def_property_srna(cprop, "BlendDataLamps");
1236         srna = RNA_def_struct(brna, "BlendDataLamps", NULL);
1237         RNA_def_struct_sdna(srna, "Main");
1238         RNA_def_struct_ui_text(srna, "Main Lamps", "Collection of lamps");
1239
1240         func = RNA_def_function(srna, "new", "rna_Main_lamps_new");
1241         RNA_def_function_ui_description(func, "Add a new lamp to the main database");
1242         parm = RNA_def_string(func, "name", "Lamp", 0, "", "New name for the datablock");
1243         RNA_def_property_flag(parm, PROP_REQUIRED);
1244         parm = RNA_def_enum(func, "type", lamp_type_items, 0, "Type", "The type of texture to add");
1245         RNA_def_property_flag(parm, PROP_REQUIRED);
1246         /* return type */
1247         parm = RNA_def_pointer(func, "lamp", "Lamp", "", "New lamp datablock");
1248         RNA_def_function_return(func, parm);
1249
1250         func = RNA_def_function(srna, "remove", "rna_Main_lamps_remove");
1251         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1252         RNA_def_function_ui_description(func, "Remove a lamp from the current blendfile");
1253         parm = RNA_def_pointer(func, "lamp", "Lamp", "", "Lamp to remove");
1254         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1255         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1256
1257         func = RNA_def_function(srna, "tag", "rna_Main_lamps_tag");
1258         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1259         RNA_def_property_flag(parm, PROP_REQUIRED);
1260
1261         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1262         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1263         RNA_def_property_boolean_funcs(prop, "rna_Main_lamps_is_updated_get", NULL);
1264 }
1265
1266 void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
1267 {
1268         StructRNA *srna;
1269         FunctionRNA *func;
1270         PropertyRNA *parm;
1271         PropertyRNA *prop;
1272
1273         RNA_def_property_srna(cprop, "BlendDataLibraries");
1274         srna = RNA_def_struct(brna, "BlendDataLibraries", NULL);
1275         RNA_def_struct_sdna(srna, "Main");
1276         RNA_def_struct_ui_text(srna, "Main Libraries", "Collection of libraries");
1277
1278         func = RNA_def_function(srna, "tag", "rna_Main_libraries_tag");
1279         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1280         RNA_def_property_flag(parm, PROP_REQUIRED);
1281
1282         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1283         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1284         RNA_def_property_boolean_funcs(prop, "rna_Main_libraries_is_updated_get", NULL);
1285 }
1286
1287 void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
1288 {
1289         StructRNA *srna;
1290         FunctionRNA *func;
1291         PropertyRNA *parm;
1292         PropertyRNA *prop;
1293
1294         RNA_def_property_srna(cprop, "BlendDataScreens");
1295         srna = RNA_def_struct(brna, "BlendDataScreens", NULL);
1296         RNA_def_struct_sdna(srna, "Main");
1297         RNA_def_struct_ui_text(srna, "Main Screens", "Collection of screens");
1298
1299         func = RNA_def_function(srna, "tag", "rna_Main_screens_tag");
1300         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1301         RNA_def_property_flag(parm, PROP_REQUIRED);
1302
1303         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1304         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1305         RNA_def_property_boolean_funcs(prop, "rna_Main_screens_is_updated_get", NULL);
1306 }
1307
1308 void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
1309 {
1310         StructRNA *srna;
1311         FunctionRNA *func;
1312         PropertyRNA *parm;
1313         PropertyRNA *prop;
1314
1315         RNA_def_property_srna(cprop, "BlendDataWindowManagers");
1316         srna = RNA_def_struct(brna, "BlendDataWindowManagers", NULL);
1317         RNA_def_struct_sdna(srna, "Main");
1318         RNA_def_struct_ui_text(srna, "Main Window Managers", "Collection of window managers");
1319
1320         func = RNA_def_function(srna, "tag", "rna_Main_window_managers_tag");
1321         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1322         RNA_def_property_flag(parm, PROP_REQUIRED);
1323
1324         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1325         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1326         RNA_def_property_boolean_funcs(prop, "rna_Main_window_managers_is_updated_get", NULL);
1327 }
1328 void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
1329 {
1330         StructRNA *srna;
1331         FunctionRNA *func;
1332         PropertyRNA *parm;
1333         PropertyRNA *prop;
1334
1335         RNA_def_property_srna(cprop, "BlendDataImages");
1336         srna = RNA_def_struct(brna, "BlendDataImages", NULL);
1337         RNA_def_struct_sdna(srna, "Main");
1338         RNA_def_struct_ui_text(srna, "Main Images", "Collection of images");
1339
1340         func = RNA_def_function(srna, "new", "rna_Main_images_new");
1341         RNA_def_function_ui_description(func, "Add a new image to the main database");
1342         parm = RNA_def_string(func, "name", "Image", 0, "", "New name for the datablock");
1343         RNA_def_property_flag(parm, PROP_REQUIRED);
1344         parm = RNA_def_int(func, "width", 1024, 1, INT_MAX, "", "Width of the image", 1, INT_MAX);
1345         RNA_def_property_flag(parm, PROP_REQUIRED);
1346         parm = RNA_def_int(func, "height", 1024, 1, INT_MAX, "", "Height of the image", 1, INT_MAX);
1347         RNA_def_property_flag(parm, PROP_REQUIRED);
1348         RNA_def_boolean(func, "alpha", 0, "Alpha", "Use alpha channel");
1349         RNA_def_boolean(func, "float_buffer", 0, "Float Buffer", "Create an image with floating point color");
1350         /* return type */
1351         parm = RNA_def_pointer(func, "image", "Image", "", "New image datablock");
1352         RNA_def_function_return(func, parm);
1353
1354         func = RNA_def_function(srna, "load", "rna_Main_images_load");
1355         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1356         RNA_def_function_ui_description(func, "Load a new image into the main database");
1357         parm = RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the file to load");
1358         RNA_def_property_flag(parm, PROP_REQUIRED);
1359         /* return type */
1360         parm = RNA_def_pointer(func, "image", "Image", "", "New image datablock");
1361         RNA_def_function_return(func, parm);
1362
1363         func = RNA_def_function(srna, "remove", "rna_Main_images_remove");
1364         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1365         RNA_def_function_ui_description(func, "Remove an image from the current blendfile");
1366         parm = RNA_def_pointer(func, "image", "Image", "", "Image to remove");
1367         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1368         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1369
1370         func = RNA_def_function(srna, "tag", "rna_Main_images_tag");
1371         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1372         RNA_def_property_flag(parm, PROP_REQUIRED);
1373
1374         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1375         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1376         RNA_def_property_boolean_funcs(prop, "rna_Main_images_is_updated_get", NULL);
1377 }
1378
1379 void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
1380 {
1381         StructRNA *srna;
1382         FunctionRNA *func;
1383         PropertyRNA *parm;
1384         PropertyRNA *prop;
1385
1386         RNA_def_property_srna(cprop, "BlendDataLattices");
1387         srna = RNA_def_struct(brna, "BlendDataLattices", NULL);
1388         RNA_def_struct_sdna(srna, "Main");
1389         RNA_def_struct_ui_text(srna, "Main Lattices", "Collection of lattices");
1390
1391         func = RNA_def_function(srna, "new", "rna_Main_lattices_new");
1392         RNA_def_function_ui_description(func, "Add a new lattice to the main database");
1393         parm = RNA_def_string(func, "name", "Lattice", 0, "", "New name for the datablock");
1394         RNA_def_property_flag(parm, PROP_REQUIRED);
1395         /* return type */
1396         parm = RNA_def_pointer(func, "lattice", "Lattice", "", "New lattices datablock");
1397         RNA_def_function_return(func, parm);
1398
1399         func = RNA_def_function(srna, "remove", "rna_Main_lattices_remove");
1400         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1401         RNA_def_function_ui_description(func, "Remove a lattice from the current blendfile");
1402         parm = RNA_def_pointer(func, "lattice", "Lattice", "", "Lattice to remove");
1403         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1404         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1405
1406         func = RNA_def_function(srna, "tag", "rna_Main_lattices_tag");
1407         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1408         RNA_def_property_flag(parm, PROP_REQUIRED);
1409
1410         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1411         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1412         RNA_def_property_boolean_funcs(prop, "rna_Main_lattices_is_updated_get", NULL);
1413 }
1414 void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
1415 {
1416         StructRNA *srna;
1417         FunctionRNA *func;
1418         PropertyRNA *parm;
1419         PropertyRNA *prop;
1420
1421         RNA_def_property_srna(cprop, "BlendDataCurves");
1422         srna = RNA_def_struct(brna, "BlendDataCurves", NULL);
1423         RNA_def_struct_sdna(srna, "Main");
1424         RNA_def_struct_ui_text(srna, "Main Curves", "Collection of curves");
1425
1426         func = RNA_def_function(srna, "new", "rna_Main_curves_new");
1427         RNA_def_function_ui_description(func, "Add a new curve to the main database");
1428         parm = RNA_def_string(func, "name", "Curve", 0, "", "New name for the datablock");
1429         RNA_def_property_flag(parm, PROP_REQUIRED);
1430         parm = RNA_def_enum(func, "type", object_type_curve_items, 0, "Type", "The type of curve to add");
1431         RNA_def_property_flag(parm, PROP_REQUIRED);
1432         /* return type */
1433         parm = RNA_def_pointer(func, "curve", "Curve", "", "New curve datablock");
1434         RNA_def_function_return(func, parm);
1435
1436         func = RNA_def_function(srna, "remove", "rna_Main_curves_remove");
1437         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1438         RNA_def_function_ui_description(func, "Remove a curve from the current blendfile");
1439         parm = RNA_def_pointer(func, "curve", "Curve", "", "Curve to remove");
1440         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1441         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1442
1443         func = RNA_def_function(srna, "tag", "rna_Main_curves_tag");
1444         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1445         RNA_def_property_flag(parm, PROP_REQUIRED);
1446
1447         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1448         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1449         RNA_def_property_boolean_funcs(prop, "rna_Main_curves_is_updated_get", NULL);
1450 }
1451 void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
1452 {
1453         StructRNA *srna;
1454         FunctionRNA *func;
1455         PropertyRNA *parm;
1456         PropertyRNA *prop;
1457
1458         RNA_def_property_srna(cprop, "BlendDataMetaBalls");
1459         srna = RNA_def_struct(brna, "BlendDataMetaBalls", NULL);
1460         RNA_def_struct_sdna(srna, "Main");
1461         RNA_def_struct_ui_text(srna, "Main Metaballs", "Collection of metaballs");
1462
1463         func = RNA_def_function(srna, "new", "rna_Main_metaballs_new");
1464         RNA_def_function_ui_description(func, "Add a new metaball to the main database");
1465         parm = RNA_def_string(func, "name", "MetaBall", 0, "", "New name for the datablock");
1466         RNA_def_property_flag(parm, PROP_REQUIRED);
1467         /* return type */
1468         parm = RNA_def_pointer(func, "metaball", "MetaBall", "", "New metaball datablock");
1469         RNA_def_function_return(func, parm);
1470
1471         func = RNA_def_function(srna, "remove", "rna_Main_metaballs_remove");
1472         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1473         RNA_def_function_ui_description(func, "Remove a metaball from the current blendfile");
1474         parm = RNA_def_pointer(func, "metaball", "MetaBall", "", "Metaball to remove");
1475         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1476         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1477
1478         func = RNA_def_function(srna, "tag", "rna_Main_metaballs_tag");
1479         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1480         RNA_def_property_flag(parm, PROP_REQUIRED);
1481
1482         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1483         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1484         RNA_def_property_boolean_funcs(prop, "rna_Main_metaballs_is_updated_get", NULL);
1485 }
1486 void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
1487 {
1488         StructRNA *srna;
1489         FunctionRNA *func;
1490         PropertyRNA *parm;
1491         PropertyRNA *prop;
1492
1493         RNA_def_property_srna(cprop, "BlendDataFonts");
1494         srna = RNA_def_struct(brna, "BlendDataFonts", NULL);
1495         RNA_def_struct_sdna(srna, "Main");
1496         RNA_def_struct_ui_text(srna, "Main Fonts", "Collection of fonts");
1497
1498         func = RNA_def_function(srna, "load", "rna_Main_fonts_load");
1499         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1500         RNA_def_function_ui_description(func, "Load a new font into the main database");
1501         parm = RNA_def_string_file_path(func, "filepath", "File Path", 0, "", "path of the font to load");
1502         RNA_def_property_flag(parm, PROP_REQUIRED);
1503         /* return type */
1504         parm = RNA_def_pointer(func, "vfont", "VectorFont", "", "New font datablock");
1505         RNA_def_function_return(func, parm);
1506
1507         func = RNA_def_function(srna, "remove", "rna_Main_fonts_remove");
1508         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1509         RNA_def_function_ui_description(func, "Remove a font from the current blendfile");
1510         parm = RNA_def_pointer(func, "vfont", "VectorFont", "", "Font to remove");
1511         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1512         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1513
1514         func = RNA_def_function(srna, "tag", "rna_Main_fonts_tag");
1515         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1516         RNA_def_property_flag(parm, PROP_REQUIRED);
1517
1518         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1519         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1520         RNA_def_property_boolean_funcs(prop, "rna_Main_fonts_is_updated_get", NULL);
1521 }
1522 void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
1523 {
1524         StructRNA *srna;
1525         FunctionRNA *func;
1526         PropertyRNA *parm;
1527         PropertyRNA *prop;
1528
1529         RNA_def_property_srna(cprop, "BlendDataTextures");
1530         srna = RNA_def_struct(brna, "BlendDataTextures", NULL);
1531         RNA_def_struct_sdna(srna, "Main");
1532         RNA_def_struct_ui_text(srna, "Main Textures", "Collection of groups");
1533
1534         func = RNA_def_function(srna, "new", "rna_Main_textures_new");
1535         RNA_def_function_ui_description(func, "Add a new texture to the main database");
1536         parm = RNA_def_string(func, "name", "Texture", 0, "", "New name for the datablock");
1537         RNA_def_property_flag(parm, PROP_REQUIRED);
1538         parm = RNA_def_enum(func, "type", texture_type_items, 0, "Type", "The type of texture to add");
1539         RNA_def_property_flag(parm, PROP_REQUIRED);
1540         /* return type */
1541         parm = RNA_def_pointer(func, "texture", "Texture", "", "New texture datablock");
1542         RNA_def_function_return(func, parm);
1543
1544         func = RNA_def_function(srna, "remove", "rna_Main_textures_remove");
1545         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1546         RNA_def_function_ui_description(func, "Remove a texture from the current blendfile");
1547         parm = RNA_def_pointer(func, "texture", "Texture", "", "Texture to remove");
1548         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1549         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1550
1551         func = RNA_def_function(srna, "tag", "rna_Main_textures_tag");
1552         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1553         RNA_def_property_flag(parm, PROP_REQUIRED);
1554
1555         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1556         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1557         RNA_def_property_boolean_funcs(prop, "rna_Main_textures_is_updated_get", NULL);
1558 }
1559 void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
1560 {
1561         StructRNA *srna;
1562         FunctionRNA *func;
1563         PropertyRNA *parm;
1564         PropertyRNA *prop;
1565
1566         RNA_def_property_srna(cprop, "BlendDataBrushes");
1567         srna = RNA_def_struct(brna, "BlendDataBrushes", NULL);
1568         RNA_def_struct_sdna(srna, "Main");
1569         RNA_def_struct_ui_text(srna, "Main Brushes", "Collection of brushes");
1570
1571         func = RNA_def_function(srna, "new", "rna_Main_brushes_new");
1572         RNA_def_function_ui_description(func, "Add a new brush to the main database");
1573         parm = RNA_def_string(func, "name", "Brush", 0, "", "New name for the datablock");
1574         RNA_def_property_flag(parm, PROP_REQUIRED);
1575         /* return type */
1576         parm = RNA_def_pointer(func, "brush", "Brush", "", "New brush datablock");
1577         RNA_def_function_return(func, parm);
1578
1579         func = RNA_def_function(srna, "remove", "rna_Main_brushes_remove");
1580         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1581         RNA_def_function_ui_description(func, "Remove a brush from the current blendfile");
1582         parm = RNA_def_pointer(func, "brush", "Brush", "", "Brush to remove");
1583         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1584         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1585
1586         func = RNA_def_function(srna, "tag", "rna_Main_brushes_tag");
1587         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1588         RNA_def_property_flag(parm, PROP_REQUIRED);
1589
1590         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1591         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1592         RNA_def_property_boolean_funcs(prop, "rna_Main_brushes_is_updated_get", NULL);
1593 }
1594
1595 void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
1596 {
1597         StructRNA *srna;
1598         FunctionRNA *func;
1599         PropertyRNA *parm;
1600         PropertyRNA *prop;
1601
1602         RNA_def_property_srna(cprop, "BlendDataWorlds");
1603         srna = RNA_def_struct(brna, "BlendDataWorlds", NULL);
1604         RNA_def_struct_sdna(srna, "Main");
1605         RNA_def_struct_ui_text(srna, "Main Worlds", "Collection of worlds");
1606
1607         func = RNA_def_function(srna, "new", "rna_Main_worlds_new");
1608         RNA_def_function_ui_description(func, "Add a new world to the main database");
1609         parm = RNA_def_string(func, "name", "World", 0, "", "New name for the datablock");
1610         RNA_def_property_flag(parm, PROP_REQUIRED);
1611         /* return type */
1612         parm = RNA_def_pointer(func, "world", "World", "", "New world datablock");
1613         RNA_def_function_return(func, parm);
1614
1615         func = RNA_def_function(srna, "remove", "rna_Main_worlds_remove");
1616         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1617         RNA_def_function_ui_description(func, "Remove a world from the current blendfile");
1618         parm = RNA_def_pointer(func, "world", "World", "", "World to remove");
1619         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1620         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1621
1622         func = RNA_def_function(srna, "tag", "rna_Main_worlds_tag");
1623         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1624         RNA_def_property_flag(parm, PROP_REQUIRED);
1625
1626         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1627         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1628         RNA_def_property_boolean_funcs(prop, "rna_Main_worlds_is_updated_get", NULL);
1629 }
1630
1631 void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
1632 {
1633         StructRNA *srna;
1634         FunctionRNA *func;
1635         PropertyRNA *parm;
1636         PropertyRNA *prop;
1637
1638         RNA_def_property_srna(cprop, "BlendDataGroups");
1639         srna = RNA_def_struct(brna, "BlendDataGroups", NULL);
1640         RNA_def_struct_sdna(srna, "Main");
1641         RNA_def_struct_ui_text(srna, "Main Groups", "Collection of groups");
1642
1643         func = RNA_def_function(srna, "new", "rna_Main_groups_new");
1644         RNA_def_function_ui_description(func, "Add a new group to the main database");
1645         parm = RNA_def_string(func, "name", "Group", 0, "", "New name for the datablock");
1646         RNA_def_property_flag(parm, PROP_REQUIRED);
1647         /* return type */
1648         parm = RNA_def_pointer(func, "group", "Group", "", "New group datablock");
1649         RNA_def_function_return(func, parm);
1650
1651         func = RNA_def_function(srna, "remove", "rna_Main_groups_remove");
1652         RNA_def_function_ui_description(func, "Remove a group from the current blendfile");
1653         parm = RNA_def_pointer(func, "group", "Group", "", "Group to remove");
1654         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1655         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1656
1657         func = RNA_def_function(srna, "tag", "rna_Main_groups_tag");
1658         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1659         RNA_def_property_flag(parm, PROP_REQUIRED);
1660
1661         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1662         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1663         RNA_def_property_boolean_funcs(prop, "rna_Main_groups_is_updated_get", NULL);
1664 }
1665
1666 void RNA_def_main_speakers(BlenderRNA *brna, PropertyRNA *cprop)
1667 {
1668         StructRNA *srna;
1669         FunctionRNA *func;
1670         PropertyRNA *parm;
1671         PropertyRNA *prop;
1672
1673         RNA_def_property_srna(cprop, "BlendDataSpeakers");
1674         srna = RNA_def_struct(brna, "BlendDataSpeakers", NULL);
1675         RNA_def_struct_sdna(srna, "Main");
1676         RNA_def_struct_ui_text(srna, "Main Speakers", "Collection of speakers");
1677
1678         func = RNA_def_function(srna, "new", "rna_Main_speakers_new");
1679         RNA_def_function_ui_description(func, "Add a new speaker to the main database");
1680         parm = RNA_def_string(func, "name", "Speaker", 0, "", "New name for the datablock");
1681         RNA_def_property_flag(parm, PROP_REQUIRED);
1682         /* return type */
1683         parm = RNA_def_pointer(func, "speaker", "Speaker", "", "New speaker datablock");
1684         RNA_def_function_return(func, parm);
1685
1686         func = RNA_def_function(srna, "remove", "rna_Main_speakers_remove");
1687         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1688         RNA_def_function_ui_description(func, "Remove a speaker from the current blendfile");
1689         parm = RNA_def_pointer(func, "speaker", "Speaker", "", "Speaker to remove");
1690         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1691         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1692
1693         func = RNA_def_function(srna, "tag", "rna_Main_speakers_tag");
1694         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1695         RNA_def_property_flag(parm, PROP_REQUIRED);
1696
1697         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1698         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1699         RNA_def_property_boolean_funcs(prop, "rna_Main_speakers_is_updated_get", NULL);
1700 }
1701
1702 void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
1703 {
1704         StructRNA *srna;
1705         FunctionRNA *func;
1706         PropertyRNA *parm;
1707         PropertyRNA *prop;
1708
1709         RNA_def_property_srna(cprop, "BlendDataTexts");
1710         srna = RNA_def_struct(brna, "BlendDataTexts", NULL);
1711         RNA_def_struct_sdna(srna, "Main");
1712         RNA_def_struct_ui_text(srna, "Main Texts", "Collection of texts");
1713
1714         func = RNA_def_function(srna, "new", "rna_Main_texts_new");
1715         RNA_def_function_ui_description(func, "Add a new text to the main database");
1716         parm = RNA_def_string(func, "name", "Text", 0, "", "New name for the datablock");
1717         RNA_def_property_flag(parm, PROP_REQUIRED);
1718         /* return type */
1719         parm = RNA_def_pointer(func, "text", "Text", "", "New text datablock");
1720         RNA_def_function_return(func, parm);
1721
1722         func = RNA_def_function(srna, "remove", "rna_Main_texts_remove");
1723         RNA_def_function_ui_description(func, "Remove a text from the current blendfile");
1724         parm = RNA_def_pointer(func, "text", "Text", "", "Text to remove");
1725         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1726         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1727
1728         /* load func */
1729         func = RNA_def_function(srna, "load", "rna_Main_texts_load");
1730         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1731         RNA_def_function_ui_description(func, "Add a new text to the main database from a file");
1732         parm = RNA_def_string_file_path(func, "filepath", "Path", FILE_MAX, "", "path for the datablock");
1733         RNA_def_property_flag(parm, PROP_REQUIRED);
1734         parm = RNA_def_boolean(func, "internal", 0, "Make internal", "Make text file internal after loading");
1735         /* return type */
1736         parm = RNA_def_pointer(func, "text", "Text", "", "New text datablock");
1737         RNA_def_function_return(func, parm);
1738
1739         func = RNA_def_function(srna, "tag", "rna_Main_texts_tag");
1740         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1741         RNA_def_property_flag(parm, PROP_REQUIRED);
1742
1743         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1744         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1745         RNA_def_property_boolean_funcs(prop, "rna_Main_texts_is_updated_get", NULL);
1746 }
1747
1748 void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
1749 {
1750         StructRNA *srna;
1751         FunctionRNA *func;
1752         PropertyRNA *parm;
1753         PropertyRNA *prop;
1754
1755         RNA_def_property_srna(cprop, "BlendDataSounds");
1756         srna = RNA_def_struct(brna, "BlendDataSounds", NULL);
1757         RNA_def_struct_sdna(srna, "Main");
1758         RNA_def_struct_ui_text(srna, "Main Sounds", "Collection of sounds");
1759
1760         /* TODO, 'load' */
1761
1762         func = RNA_def_function(srna, "tag", "rna_Main_sounds_tag");
1763         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1764         RNA_def_property_flag(parm, PROP_REQUIRED);
1765
1766         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1767         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1768         RNA_def_property_boolean_funcs(prop, "rna_Main_sounds_is_updated_get", NULL);
1769 }
1770
1771 void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
1772 {
1773         StructRNA *srna;
1774         FunctionRNA *func;
1775         PropertyRNA *parm;
1776         PropertyRNA *prop;
1777
1778         RNA_def_property_srna(cprop, "BlendDataArmatures");
1779         srna = RNA_def_struct(brna, "BlendDataArmatures", NULL);
1780         RNA_def_struct_sdna(srna, "Main");
1781         RNA_def_struct_ui_text(srna, "Main Armatures", "Collection of armatures");
1782
1783         func = RNA_def_function(srna, "new", "rna_Main_armatures_new");
1784         RNA_def_function_ui_description(func, "Add a new armature to the main database");
1785         parm = RNA_def_string(func, "name", "Armature", 0, "", "New name for the datablock");
1786         RNA_def_property_flag(parm, PROP_REQUIRED);
1787         /* return type */
1788         parm = RNA_def_pointer(func, "armature", "Armature", "", "New armature datablock");
1789         RNA_def_function_return(func, parm);
1790
1791         func = RNA_def_function(srna, "remove", "rna_Main_armatures_remove");
1792         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1793         RNA_def_function_ui_description(func, "Remove a armature from the current blendfile");
1794         parm = RNA_def_pointer(func, "armature", "Armature", "", "Armature to remove");
1795         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1796         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1797
1798         func = RNA_def_function(srna, "tag", "rna_Main_armatures_tag");
1799         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1800         RNA_def_property_flag(parm, PROP_REQUIRED);
1801
1802         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1803         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1804         RNA_def_property_boolean_funcs(prop, "rna_Main_armatures_is_updated_get", NULL);
1805 }
1806 void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
1807 {
1808         StructRNA *srna;
1809         FunctionRNA *func;
1810         PropertyRNA *parm;
1811         PropertyRNA *prop;
1812
1813         RNA_def_property_srna(cprop, "BlendDataActions");
1814         srna = RNA_def_struct(brna, "BlendDataActions", NULL);
1815         RNA_def_struct_sdna(srna, "Main");
1816         RNA_def_struct_ui_text(srna, "Main Actions", "Collection of actions");
1817
1818         func = RNA_def_function(srna, "new", "rna_Main_actions_new");
1819         RNA_def_function_ui_description(func, "Add a new action to the main database");
1820         parm = RNA_def_string(func, "name", "Action", 0, "", "New name for the datablock");
1821         RNA_def_property_flag(parm, PROP_REQUIRED);
1822         /* return type */
1823         parm = RNA_def_pointer(func, "action", "Action", "", "New action datablock");
1824         RNA_def_function_return(func, parm);
1825
1826         func = RNA_def_function(srna, "remove", "rna_Main_actions_remove");
1827         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1828         RNA_def_function_ui_description(func, "Remove a action from the current blendfile");
1829         parm = RNA_def_pointer(func, "action", "Action", "", "Action to remove");
1830         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1831         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1832
1833         func = RNA_def_function(srna, "tag", "rna_Main_actions_tag");
1834         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1835         RNA_def_property_flag(parm, PROP_REQUIRED);
1836
1837         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1838         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1839         RNA_def_property_boolean_funcs(prop, "rna_Main_actions_is_updated_get", NULL);
1840 }
1841 void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
1842 {
1843         StructRNA *srna;
1844         FunctionRNA *func;
1845         PropertyRNA *parm;
1846         PropertyRNA *prop;
1847
1848         RNA_def_property_srna(cprop, "BlendDataParticles");
1849         srna = RNA_def_struct(brna, "BlendDataParticles", NULL);
1850         RNA_def_struct_sdna(srna, "Main");
1851         RNA_def_struct_ui_text(srna, "Main Particle Settings", "Collection of particle settings");
1852
1853         func = RNA_def_function(srna, "new", "rna_Main_particles_new");
1854         RNA_def_function_ui_description(func, "Add a new particle settings instance to the main database");
1855         parm = RNA_def_string(func, "name", "ParticleSettings", 0, "", "New name for the datablock");
1856         RNA_def_property_flag(parm, PROP_REQUIRED);
1857         /* return type */
1858         parm = RNA_def_pointer(func, "particle", "ParticleSettings", "", "New particle settings datablock");
1859         RNA_def_function_return(func, parm);
1860
1861         func = RNA_def_function(srna, "remove", "rna_Main_particles_remove");
1862         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1863         RNA_def_function_ui_description(func, "Remove a particle settings instance from the current blendfile");
1864         parm = RNA_def_pointer(func, "particle", "ParticleSettings", "", "Particle Settings to remove");
1865         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1866         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1867
1868         func = RNA_def_function(srna, "tag", "rna_Main_particles_tag");
1869         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1870         RNA_def_property_flag(parm, PROP_REQUIRED);
1871
1872         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1873         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1874         RNA_def_property_boolean_funcs(prop, "rna_Main_particles_is_updated_get", NULL);
1875 }
1876
1877 void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
1878 {
1879         StructRNA *srna;
1880         FunctionRNA *func;
1881         PropertyRNA *parm;
1882         PropertyRNA *prop;
1883
1884         RNA_def_property_srna(cprop, "BlendDataGreasePencils");
1885         srna = RNA_def_struct(brna, "BlendDataGreasePencils", NULL);
1886         RNA_def_struct_sdna(srna, "Main");
1887         RNA_def_struct_ui_text(srna, "Main Grease Pencils", "Collection of grease pencils");
1888
1889         func = RNA_def_function(srna, "tag", "rna_Main_gpencil_tag");
1890         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1891         RNA_def_property_flag(parm, PROP_REQUIRED);
1892
1893         func = RNA_def_function(srna, "new", "gpencil_data_addnew");
1894         RNA_def_function_flag(func, FUNC_NO_SELF);
1895         parm = RNA_def_string(func, "name", "GreasePencil", 0, "", "New name for the datablock");
1896         RNA_def_property_flag(parm, PROP_REQUIRED);
1897         /* return type */
1898         parm = RNA_def_pointer(func, "grease_pencil", "GreasePencil", "", "New grease pencil datablock");
1899         RNA_def_function_return(func, parm);
1900
1901         func = RNA_def_function(srna, "remove", "rna_Main_grease_pencil_remove");
1902         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1903         RNA_def_function_ui_description(func, "Remove a grease pencil instance from the current blendfile");
1904         parm = RNA_def_pointer(func, "grease_pencil", "GreasePencil", "", "Grease Pencil to remove");
1905         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1906         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1907
1908         prop = RNA_def_property(srna, "is_updated", PROP_BOOLEAN, PROP_NONE);
1909         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1910         RNA_def_property_boolean_funcs(prop, "rna_Main_gpencil_is_updated_get", NULL);
1911 }
1912
1913 void RNA_def_main_movieclips(BlenderRNA *brna, PropertyRNA *cprop)
1914 {
1915         StructRNA *srna;
1916         FunctionRNA *func;
1917         PropertyRNA *parm;
1918
1919         RNA_def_property_srna(cprop, "BlendDataMovieClips");
1920         srna = RNA_def_struct(brna, "BlendDataMovieClips", NULL);
1921         RNA_def_struct_sdna(srna, "Main");
1922         RNA_def_struct_ui_text(srna, "Main Movie Clips", "Collection of movie clips");
1923
1924         func = RNA_def_function(srna, "tag", "rna_Main_movieclips_tag");
1925         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1926         RNA_def_property_flag(parm, PROP_REQUIRED);
1927
1928         func = RNA_def_function(srna, "remove", "rna_Main_movieclips_remove");
1929         RNA_def_function_ui_description(func, "Remove a movie clip from the current blendfile.");
1930         parm = RNA_def_pointer(func, "clip", "MovieClip", "", "Movie clip to remove");
1931         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1932         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1933
1934         /* load func */
1935         func = RNA_def_function(srna, "load", "rna_Main_movieclip_load");
1936         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1937         RNA_def_function_ui_description(func, "Add a new movie clip to the main database from a file");
1938         parm = RNA_def_string_file_path(func, "filepath", "Path", FILE_MAX, "", "path for the datablock");
1939         RNA_def_property_flag(parm, PROP_REQUIRED);
1940         /* return type */
1941         parm = RNA_def_pointer(func, "clip", "MovieClip", "", "New movie clip datablock");
1942         RNA_def_function_return(func, parm);
1943 }
1944
1945 void RNA_def_main_masks(BlenderRNA *brna, PropertyRNA *cprop)
1946 {
1947         StructRNA *srna;
1948         FunctionRNA *func;
1949         PropertyRNA *parm;
1950
1951         RNA_def_property_srna(cprop, "BlendDataMasks");
1952         srna = RNA_def_struct(brna, "BlendDataMasks", NULL);
1953         RNA_def_struct_sdna(srna, "Main");
1954         RNA_def_struct_ui_text(srna, "Main Masks", "Collection of masks");
1955
1956         func = RNA_def_function(srna, "tag", "rna_Main_masks_tag");
1957         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1958         RNA_def_property_flag(parm, PROP_REQUIRED);
1959
1960         /* new func */
1961         func = RNA_def_function(srna, "new", "rna_Main_mask_new");
1962         RNA_def_function_ui_description(func, "Add a new mask with a given name to the main database");
1963         RNA_def_string_file_path(func, "name", NULL, MAX_ID_NAME - 2, "Mask", "Name of new mask datablock");
1964         /* return type */
1965         parm = RNA_def_pointer(func, "mask", "Mask", "", "New mask datablock");
1966         RNA_def_function_return(func, parm);
1967
1968         /* remove func */
1969         func = RNA_def_function(srna, "remove", "rna_Main_masks_remove");
1970         RNA_def_function_ui_description(func, "Remove a masks from the current blendfile.");
1971         parm = RNA_def_pointer(func, "mask", "Mask", "", "Mask to remove");
1972         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1973         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
1974 }
1975
1976 void RNA_def_main_linestyles(BlenderRNA *brna, PropertyRNA *cprop)
1977 {
1978         StructRNA *srna;
1979         FunctionRNA *func;
1980         PropertyRNA *parm;
1981
1982         RNA_def_property_srna(cprop, "BlendDataLineStyles");
1983         srna = RNA_def_struct(brna, "BlendDataLineStyles", NULL);
1984         RNA_def_struct_sdna(srna, "Main");
1985         RNA_def_struct_ui_text(srna, "Main Line Styles", "Collection of line styles");
1986
1987         func = RNA_def_function(srna, "tag", "rna_Main_linestyle_tag");
1988         parm = RNA_def_boolean(func, "value", 0, "Value", "");
1989         RNA_def_property_flag(parm, PROP_REQUIRED);
1990
1991         func = RNA_def_function(srna, "new", "rna_Main_linestyles_new");
1992         RNA_def_function_ui_description(func, "Add a new line style instance to the main database");
1993         parm = RNA_def_string(func, "name", "FreestyleLineStyle", 0, "", "New name for the datablock");
1994         RNA_def_property_flag(parm, PROP_REQUIRED);
1995         /* return type */
1996         parm = RNA_def_pointer(func, "linestyle", "FreestyleLineStyle", "", "New line style datablock");
1997         RNA_def_function_return(func, parm);
1998
1999         func = RNA_def_function(srna, "remove", "rna_Main_linestyles_remove");
2000         RNA_def_function_flag(func, FUNC_USE_REPORTS);
2001         RNA_def_function_ui_description(func, "Remove a line style instance from the current blendfile");
2002         parm = RNA_def_pointer(func, "linestyle", "FreestyleLineStyle", "", "Line style to remove");
2003         RNA_def_property_flag(parm, PROP_REQUIRED);
2004 }
2005
2006 #endif