- tweak Object.create_render_mesh params
[blender-staging.git] / source / blender / makesrna / intern / rna_object_api.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdlib.h>
30 #include <stdio.h>
31
32 #include "RNA_define.h"
33 #include "RNA_types.h"
34
35 #ifdef RNA_RUNTIME
36
37 #include "BKE_customdata.h"
38 #include "BKE_DerivedMesh.h"
39 #include "BKE_anim.h"
40 #include "BKE_report.h"
41
42 #include "DNA_mesh_types.h"
43 #include "DNA_scene_types.h"
44 #include "DNA_object_types.h"
45
46 #define OBJECT_API_PROP_DUPLILIST "dupli_list"
47
48 /* copied from init_render_mesh (render code) */
49 Mesh *rna_Object_create_render_mesh(Object *ob, bContext *C, ReportList *reports)
50 {
51         CustomDataMask mask = CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL;
52         DerivedMesh *dm;
53         Mesh *me;
54         Scene *sce;
55
56         sce= CTX_data_scene(C);
57         
58         /* TODO: other types */
59         if(ob->type != OB_MESH) {
60                 BKE_report(reports, RPT_ERROR, "Object should be of type MESH.");
61                 return NULL;
62         }
63         
64         dm= mesh_create_derived_render(sce, ob, mask);
65
66         if(!dm) {
67                 /* TODO: report */
68                 return NULL;
69         }
70
71         me= add_mesh("tmp_render_mesh");
72         me->id.us--; /* we don't assign it to anything */
73         DM_to_mesh(dm, me);
74         dm->release(dm);
75
76         return me;
77 }
78
79 /* When no longer needed, duplilist should be freed with Object.free_duplilist */
80 void rna_Object_create_duplilist(Object *ob, bContext *C, ReportList *reports)
81 {
82         PointerRNA obptr;
83         PointerRNA dobptr;
84         Scene *sce;
85         DupliObject *dob;
86         PropertyRNA *prop;
87
88         if (!(ob->transflag & OB_DUPLI)) {
89                 BKE_report(reports, RPT_ERROR, "Object does not have duplis.");
90                 return;
91         }
92
93         sce= CTX_data_scene(C);
94
95         RNA_id_pointer_create(&ob->id, &obptr);
96
97         if (!(prop= RNA_struct_find_property(&obptr, OBJECT_API_PROP_DUPLILIST))) {
98                 // hint: all Objects will now have this property defined
99                 prop= RNA_def_collection_runtime(obptr.type, OBJECT_API_PROP_DUPLILIST, "DupliObject", "Dupli list", "List of object's duplis");
100         }
101
102         RNA_property_collection_clear(&obptr, prop);
103         ob->duplilist= object_duplilist(sce, ob);
104
105         for(dob= (DupliObject*)ob->duplilist->first; dob; dob= dob->next) {
106                 RNA_pointer_create(NULL, &RNA_Object, dob, &dobptr);
107                 RNA_property_collection_add(&obptr, prop, &dobptr);
108                 dob = dob->next;
109         }
110
111         /* ob->duplilist should now be freed with Object.free_duplilist */
112
113         return *((CollectionPropertyRNA*)prop);
114 }
115
116 void rna_Object_free_duplilist(Object *ob, ReportList *reports)
117 {
118         PointerRNA obptr;
119         PropertyRNA *prop;
120
121         RNA_id_pointer_create(&ob->id, &obptr);
122
123         if (!(prop= RNA_struct_find_property(&obptr, OBJECT_API_PROP_DUPLILIST))) {
124                 BKE_report(reports, RPT_ERROR, "Object has no duplilist property.");
125                 return;
126         }
127
128         RNA_property_collection_clear(&obptr, prop);
129
130         free_object_duplilist(ob->duplilist);
131         ob->duplilist= NULL;
132 }
133
134 #else
135
136 void RNA_api_object(StructRNA *srna)
137 {
138         FunctionRNA *func;
139         PropertyRNA *parm;
140
141         func= RNA_def_function(srna, "create_render_mesh", "rna_Object_create_render_mesh");
142         RNA_def_function_ui_description(func, "Create a Mesh datablock with all modifiers applied.");
143         RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
144         parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh created from object, remove it if it is only used for export.");
145         RNA_def_function_return(func, parm);
146         
147         func= RNA_def_function(srna, "create_dupli_list", "rna_Object_create_duplilist");
148         RNA_def_function_ui_description(func, "Create a list of dupli objects for this object. When no longer needed, it should be freed with free_dupli_list.");
149         RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
150
151         func= RNA_def_function(srna, "free_dupli_list", "rna_Object_free_duplilist");
152         RNA_def_function_ui_description(func, "Free the list of dupli objects.");
153         RNA_def_function_flag(func, FUNC_USE_REPORTS);
154 }
155
156 #endif
157